Files
pdf-odin-llm/font_standard.odin
T
2026-09-25 23:32:29 +02:00

1992 lines
136 KiB
Odin

package pdf
// The standard 14 fonts' metrics, the built-in encodings, and the Adobe Glyph
// List (ISO 32000-2, 9.6.2.2 and Annex D).
//
// A font dictionary is allowed to name Helvetica, Times, Courier, Symbol or
// ZapfDingbats and then supply neither a font program nor a /Widths array: the
// reader is expected to know the metrics already. Getting a width wrong here is
// not a cosmetic problem -- every glyph after it on the line is displaced -- so
// none of the numbers below were typed by hand.
//
// WHERE THE NUMBERS CAME FROM
//
// Widths the Adobe Core 14 AFM files (Adobe Systems, 1997, AFM 4.1),
// taken verbatim from their redistribution in Apache PDFBox.
// Cross-checked glyph by glyph against two independent sources:
// reportlab's built-in width tables (0 differences over the 229
// glyphs it carries) and the URW++ metric-compatible AFMs shipped
// with Ghostscript (0 differences for Courier, Symbol and
// ZapfDingbats; the handful for Helvetica and Times -- fraction,
// summation, Delta, lessequal, greaterequal, lozenge, dcaron,
// lcaron -- are URW drawing those glyphs differently, and Adobe's
// value is the one PDF means).
// Encodings ISO 32000-2 Annex D, via reportlab's tables, checked against
// pdf.js's encodings.js and, for StandardEncoding and the two
// built-in symbol encodings, against the C column of the AFMs
// themselves.
// Glyph names Adobe Glyph List 2.0 (glyphlist.txt), Adobe Glyph List For New
// Fonts 1.7 (aglfn.txt, used for the Unicode -> name direction)
// and Adobe's zapfdingbats.txt.
//
// All fourteen are 1000 units per em, so a width here is already in the glyph
// space the rest of the font code expects.
// ---------------------------------------------------------------------------
// The fourteen fonts
// ---------------------------------------------------------------------------
// Indices into the metric tables, and what std_font_lookup returns. The order
// within a family is regular, bold, italic, bold-italic, so a style can be
// added to a family's base index.
@(private)
STD_COURIER :: 0
@(private)
STD_COURIER_BOLD :: 1
@(private)
STD_COURIER_OBLIQUE :: 2
@(private)
STD_COURIER_BOLD_OBLIQUE :: 3
@(private)
STD_HELVETICA :: 4
@(private)
STD_HELVETICA_BOLD :: 5
@(private)
STD_HELVETICA_OBLIQUE :: 6
@(private)
STD_HELVETICA_BOLD_OBLIQUE :: 7
@(private)
STD_TIMES_ROMAN :: 8
@(private)
STD_TIMES_BOLD :: 9
@(private)
STD_TIMES_ITALIC :: 10
@(private)
STD_TIMES_BOLD_ITALIC :: 11
@(private)
STD_SYMBOL :: 12
@(private)
STD_ZAPF_DINGBATS :: 13
@(private)
STD_FONT_COUNT :: 14
// The canonical PostScript name of each, in index order.
@(private, rodata)
STD_FONT_NAMES := [STD_FONT_COUNT]string{
"Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique",
"Helvetica", "Helvetica-Bold", "Helvetica-Oblique", "Helvetica-BoldOblique",
"Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",
"Symbol", "ZapfDingbats",
}
// ---------------------------------------------------------------------------
// Tables, generated mechanically from the sources named at the top of this file
// -- the AFMs, glyphlist.txt, aglfn.txt and zapfdingbats.txt -- so that no
// number below was typed by a person. Do not hand-edit one: correct the source
// and regenerate, or the next regeneration silently undoes the fix.
// ---------------------------------------------------------------------------
// The 315 glyph names Adobe's AFMs give for every one of the twelve text
// fonts. All twelve carry exactly this set, so one sorted name table serves
// them all and a width lookup is a binary search over it.
@(private, rodata)
STD_TEXT_GLYPHS := [315]string{
"A", "AE", "Aacute", "Abreve", "Acircumflex", "Adieresis",
"Agrave", "Amacron", "Aogonek", "Aring", "Atilde", "B",
"C", "Cacute", "Ccaron", "Ccedilla", "D", "Dcaron",
"Dcroat", "Delta", "E", "Eacute", "Ecaron", "Ecircumflex",
"Edieresis", "Edotaccent", "Egrave", "Emacron", "Eogonek", "Eth",
"Euro", "F", "G", "Gbreve", "Gcommaaccent", "H",
"I", "Iacute", "Icircumflex", "Idieresis", "Idotaccent", "Igrave",
"Imacron", "Iogonek", "J", "K", "Kcommaaccent", "L",
"Lacute", "Lcaron", "Lcommaaccent", "Lslash", "M", "N",
"Nacute", "Ncaron", "Ncommaaccent", "Ntilde", "O", "OE",
"Oacute", "Ocircumflex", "Odieresis", "Ograve", "Ohungarumlaut", "Omacron",
"Oslash", "Otilde", "P", "Q", "R", "Racute",
"Rcaron", "Rcommaaccent", "S", "Sacute", "Scaron", "Scedilla",
"Scommaaccent", "T", "Tcaron", "Tcommaaccent", "Thorn", "U",
"Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Uhungarumlaut", "Umacron",
"Uogonek", "Uring", "V", "W", "X", "Y",
"Yacute", "Ydieresis", "Z", "Zacute", "Zcaron", "Zdotaccent",
"a", "aacute", "abreve", "acircumflex", "acute", "adieresis",
"ae", "agrave", "amacron", "ampersand", "aogonek", "aring",
"asciicircum", "asciitilde", "asterisk", "at", "atilde", "b",
"backslash", "bar", "braceleft", "braceright", "bracketleft", "bracketright",
"breve", "brokenbar", "bullet", "c", "cacute", "caron",
"ccaron", "ccedilla", "cedilla", "cent", "circumflex", "colon",
"comma", "commaaccent", "copyright", "currency", "d", "dagger",
"daggerdbl", "dcaron", "dcroat", "degree", "dieresis", "divide",
"dollar", "dotaccent", "dotlessi", "e", "eacute", "ecaron",
"ecircumflex", "edieresis", "edotaccent", "egrave", "eight", "ellipsis",
"emacron", "emdash", "endash", "eogonek", "equal", "eth",
"exclam", "exclamdown", "f", "fi", "five", "fl",
"florin", "four", "fraction", "g", "gbreve", "gcommaaccent",
"germandbls", "grave", "greater", "greaterequal", "guillemotleft", "guillemotright",
"guilsinglleft", "guilsinglright", "h", "hungarumlaut", "hyphen", "i",
"iacute", "icircumflex", "idieresis", "igrave", "imacron", "iogonek",
"j", "k", "kcommaaccent", "l", "lacute", "lcaron",
"lcommaaccent", "less", "lessequal", "logicalnot", "lozenge", "lslash",
"m", "macron", "minus", "mu", "multiply", "n",
"nacute", "ncaron", "ncommaaccent", "nine", "notequal", "ntilde",
"numbersign", "o", "oacute", "ocircumflex", "odieresis", "oe",
"ogonek", "ograve", "ohungarumlaut", "omacron", "one", "onehalf",
"onequarter", "onesuperior", "ordfeminine", "ordmasculine", "oslash", "otilde",
"p", "paragraph", "parenleft", "parenright", "partialdiff", "percent",
"period", "periodcentered", "perthousand", "plus", "plusminus", "q",
"question", "questiondown", "quotedbl", "quotedblbase", "quotedblleft", "quotedblright",
"quoteleft", "quoteright", "quotesinglbase", "quotesingle", "r", "racute",
"radical", "rcaron", "rcommaaccent", "registered", "ring", "s",
"sacute", "scaron", "scedilla", "scommaaccent", "section", "semicolon",
"seven", "six", "slash", "space", "sterling", "summation",
"t", "tcaron", "tcommaaccent", "thorn", "three", "threequarters",
"threesuperior", "tilde", "trademark", "two", "twosuperior", "u",
"uacute", "ucircumflex", "udieresis", "ugrave", "uhungarumlaut", "umacron",
"underscore", "uogonek", "uring", "v", "w", "x",
"y", "yacute", "ydieresis", "yen", "z", "zacute",
"zcaron", "zdotaccent", "zero",
}
// Widths in glyph space (1/1000 em) for the eight proportional fonts,
// parallel to STD_TEXT_GLYPHS. Courier is not here: all four of its faces
// are 600 for every glyph, which is what std_font_width returns directly.
@(private, rodata)
STD_TEXT_WIDTHS := [8][315]u16{
{ // Helvetica
667, 1000, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 722, 722, 722,
722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 556, 611,
778, 778, 778, 722, 278, 278, 278, 278, 278, 278, 278, 278, 500, 667, 667, 556,
556, 556, 556, 556, 833, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778,
778, 778, 778, 778, 667, 778, 722, 722, 722, 722, 667, 667, 667, 667, 667, 611,
611, 611, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 944, 667, 667,
667, 667, 611, 611, 611, 611, 556, 556, 556, 556, 333, 556, 889, 556, 556, 667,
556, 556, 469, 584, 389, 1015, 556, 556, 278, 260, 334, 334, 278, 278, 333, 260,
350, 500, 500, 333, 500, 500, 333, 556, 333, 278, 278, 250, 737, 556, 556, 556,
556, 643, 556, 400, 333, 584, 556, 333, 278, 556, 556, 556, 556, 556, 556, 556,
556, 1000, 556, 1000, 556, 556, 584, 556, 278, 333, 278, 500, 556, 500, 556, 556,
167, 556, 556, 556, 611, 333, 584, 549, 556, 556, 333, 333, 556, 333, 333, 222,
278, 278, 278, 278, 278, 222, 222, 500, 500, 222, 222, 299, 222, 584, 549, 584,
471, 222, 833, 333, 584, 556, 584, 556, 556, 556, 556, 556, 549, 556, 556, 556,
556, 556, 556, 944, 333, 556, 556, 556, 556, 834, 834, 333, 370, 365, 611, 556,
556, 537, 333, 333, 476, 889, 278, 278, 1000, 584, 584, 556, 556, 611, 355, 333,
333, 333, 222, 222, 222, 191, 333, 333, 453, 333, 333, 737, 333, 500, 500, 500,
500, 500, 556, 278, 556, 556, 278, 278, 556, 600, 278, 317, 278, 556, 556, 834,
333, 333, 1000, 556, 333, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 500,
722, 500, 500, 500, 500, 556, 500, 500, 500, 500, 556,
},
{ // Helvetica-Bold
722, 1000, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722,
722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 556, 611,
778, 778, 778, 722, 278, 278, 278, 278, 278, 278, 278, 278, 556, 722, 722, 611,
611, 611, 611, 611, 833, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778,
778, 778, 778, 778, 667, 778, 722, 722, 722, 722, 667, 667, 667, 667, 667, 611,
611, 611, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 944, 667, 667,
667, 667, 611, 611, 611, 611, 556, 556, 556, 556, 333, 556, 889, 556, 556, 722,
556, 556, 584, 584, 389, 975, 556, 611, 278, 280, 389, 389, 333, 333, 333, 280,
350, 556, 556, 333, 556, 556, 333, 556, 333, 333, 278, 250, 737, 556, 611, 556,
556, 743, 611, 400, 333, 584, 556, 333, 278, 556, 556, 556, 556, 556, 556, 556,
556, 1000, 556, 1000, 556, 556, 584, 611, 333, 333, 333, 611, 556, 611, 556, 556,
167, 611, 611, 611, 611, 333, 584, 549, 556, 556, 333, 333, 611, 333, 333, 278,
278, 278, 278, 278, 278, 278, 278, 556, 556, 278, 278, 400, 278, 584, 549, 584,
494, 278, 889, 333, 584, 611, 584, 611, 611, 611, 611, 556, 549, 611, 556, 611,
611, 611, 611, 944, 333, 611, 611, 611, 556, 834, 834, 333, 370, 365, 611, 611,
611, 556, 333, 333, 494, 889, 278, 278, 1000, 584, 584, 611, 611, 611, 474, 500,
500, 500, 278, 278, 278, 238, 389, 389, 549, 389, 389, 737, 333, 556, 556, 556,
556, 556, 556, 333, 556, 556, 278, 278, 556, 600, 333, 389, 333, 611, 556, 834,
333, 333, 1000, 556, 333, 611, 611, 611, 611, 611, 611, 611, 556, 611, 611, 556,
778, 556, 556, 556, 556, 556, 500, 500, 500, 500, 556,
},
{ // Helvetica-Oblique
667, 1000, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 722, 722, 722,
722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 556, 611,
778, 778, 778, 722, 278, 278, 278, 278, 278, 278, 278, 278, 500, 667, 667, 556,
556, 556, 556, 556, 833, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778,
778, 778, 778, 778, 667, 778, 722, 722, 722, 722, 667, 667, 667, 667, 667, 611,
611, 611, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 944, 667, 667,
667, 667, 611, 611, 611, 611, 556, 556, 556, 556, 333, 556, 889, 556, 556, 667,
556, 556, 469, 584, 389, 1015, 556, 556, 278, 260, 334, 334, 278, 278, 333, 260,
350, 500, 500, 333, 500, 500, 333, 556, 333, 278, 278, 250, 737, 556, 556, 556,
556, 643, 556, 400, 333, 584, 556, 333, 278, 556, 556, 556, 556, 556, 556, 556,
556, 1000, 556, 1000, 556, 556, 584, 556, 278, 333, 278, 500, 556, 500, 556, 556,
167, 556, 556, 556, 611, 333, 584, 549, 556, 556, 333, 333, 556, 333, 333, 222,
278, 278, 278, 278, 278, 222, 222, 500, 500, 222, 222, 299, 222, 584, 549, 584,
471, 222, 833, 333, 584, 556, 584, 556, 556, 556, 556, 556, 549, 556, 556, 556,
556, 556, 556, 944, 333, 556, 556, 556, 556, 834, 834, 333, 370, 365, 611, 556,
556, 537, 333, 333, 476, 889, 278, 278, 1000, 584, 584, 556, 556, 611, 355, 333,
333, 333, 222, 222, 222, 191, 333, 333, 453, 333, 333, 737, 333, 500, 500, 500,
500, 500, 556, 278, 556, 556, 278, 278, 556, 600, 278, 317, 278, 556, 556, 834,
333, 333, 1000, 556, 333, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 500,
722, 500, 500, 500, 500, 556, 500, 500, 500, 500, 556,
},
{ // Helvetica-BoldOblique
722, 1000, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722,
722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 556, 611,
778, 778, 778, 722, 278, 278, 278, 278, 278, 278, 278, 278, 556, 722, 722, 611,
611, 611, 611, 611, 833, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778,
778, 778, 778, 778, 667, 778, 722, 722, 722, 722, 667, 667, 667, 667, 667, 611,
611, 611, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 944, 667, 667,
667, 667, 611, 611, 611, 611, 556, 556, 556, 556, 333, 556, 889, 556, 556, 722,
556, 556, 584, 584, 389, 975, 556, 611, 278, 280, 389, 389, 333, 333, 333, 280,
350, 556, 556, 333, 556, 556, 333, 556, 333, 333, 278, 250, 737, 556, 611, 556,
556, 743, 611, 400, 333, 584, 556, 333, 278, 556, 556, 556, 556, 556, 556, 556,
556, 1000, 556, 1000, 556, 556, 584, 611, 333, 333, 333, 611, 556, 611, 556, 556,
167, 611, 611, 611, 611, 333, 584, 549, 556, 556, 333, 333, 611, 333, 333, 278,
278, 278, 278, 278, 278, 278, 278, 556, 556, 278, 278, 400, 278, 584, 549, 584,
494, 278, 889, 333, 584, 611, 584, 611, 611, 611, 611, 556, 549, 611, 556, 611,
611, 611, 611, 944, 333, 611, 611, 611, 556, 834, 834, 333, 370, 365, 611, 611,
611, 556, 333, 333, 494, 889, 278, 278, 1000, 584, 584, 611, 611, 611, 474, 500,
500, 500, 278, 278, 278, 238, 389, 389, 549, 389, 389, 737, 333, 556, 556, 556,
556, 556, 556, 333, 556, 556, 278, 278, 556, 600, 333, 389, 333, 611, 556, 834,
333, 333, 1000, 556, 333, 611, 611, 611, 611, 611, 611, 611, 556, 611, 611, 556,
778, 556, 556, 556, 556, 556, 500, 500, 500, 500, 556,
},
{ // Times-Roman
722, 889, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 667, 667, 667, 667,
722, 722, 722, 612, 611, 611, 611, 611, 611, 611, 611, 611, 611, 722, 500, 556,
722, 722, 722, 722, 333, 333, 333, 333, 333, 333, 333, 333, 389, 722, 722, 611,
611, 611, 611, 611, 889, 722, 722, 722, 722, 722, 722, 889, 722, 722, 722, 722,
722, 722, 722, 722, 556, 722, 667, 667, 667, 667, 556, 556, 556, 556, 556, 611,
611, 611, 556, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 944, 722, 722,
722, 722, 611, 611, 611, 611, 444, 444, 444, 444, 333, 444, 667, 444, 444, 778,
444, 444, 469, 541, 500, 921, 444, 500, 278, 200, 480, 480, 333, 333, 333, 200,
350, 444, 444, 333, 444, 444, 333, 500, 333, 278, 250, 250, 760, 500, 500, 500,
500, 588, 500, 400, 333, 564, 500, 333, 278, 444, 444, 444, 444, 444, 444, 444,
500, 1000, 444, 1000, 500, 444, 564, 500, 333, 333, 333, 556, 500, 556, 500, 500,
167, 500, 500, 500, 500, 333, 564, 549, 500, 500, 333, 333, 500, 333, 333, 278,
278, 278, 278, 278, 278, 278, 278, 500, 500, 278, 278, 344, 278, 564, 549, 564,
471, 278, 778, 333, 564, 500, 564, 500, 500, 500, 500, 500, 549, 500, 500, 500,
500, 500, 500, 722, 333, 500, 500, 500, 500, 750, 750, 300, 276, 310, 500, 500,
500, 453, 333, 333, 476, 833, 250, 250, 1000, 564, 564, 500, 444, 444, 408, 444,
444, 444, 333, 333, 333, 180, 333, 333, 453, 333, 333, 760, 333, 389, 389, 389,
389, 389, 500, 278, 500, 500, 278, 250, 500, 600, 278, 326, 278, 500, 500, 750,
300, 333, 980, 500, 300, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500,
722, 500, 500, 500, 500, 500, 444, 444, 444, 444, 500,
},
{ // Times-Bold
722, 1000, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 722, 722, 722, 722,
722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 500, 611,
778, 778, 778, 778, 389, 389, 389, 389, 389, 389, 389, 389, 500, 778, 778, 667,
667, 667, 667, 667, 944, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778,
778, 778, 778, 778, 611, 778, 722, 722, 722, 722, 556, 556, 556, 556, 556, 667,
667, 667, 611, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 1000, 722, 722,
722, 722, 667, 667, 667, 667, 500, 500, 500, 500, 333, 500, 722, 500, 500, 833,
500, 500, 581, 520, 500, 930, 500, 556, 278, 220, 394, 394, 333, 333, 333, 220,
350, 444, 444, 333, 444, 444, 333, 500, 333, 333, 250, 250, 747, 500, 556, 500,
500, 672, 556, 400, 333, 570, 500, 333, 278, 444, 444, 444, 444, 444, 444, 444,
500, 1000, 444, 1000, 500, 444, 570, 500, 333, 333, 333, 556, 500, 556, 500, 500,
167, 500, 500, 500, 556, 333, 570, 549, 500, 500, 333, 333, 556, 333, 333, 278,
278, 278, 278, 278, 278, 278, 333, 556, 556, 278, 278, 394, 278, 570, 549, 570,
494, 278, 833, 333, 570, 556, 570, 556, 556, 556, 556, 500, 549, 556, 500, 500,
500, 500, 500, 722, 333, 500, 500, 500, 500, 750, 750, 300, 300, 330, 500, 500,
556, 540, 333, 333, 494, 1000, 250, 250, 1000, 570, 570, 556, 500, 500, 555, 500,
500, 500, 333, 333, 333, 278, 444, 444, 549, 444, 444, 747, 333, 389, 389, 389,
389, 389, 500, 333, 500, 500, 278, 250, 500, 600, 333, 416, 333, 556, 500, 750,
300, 333, 1000, 500, 300, 556, 556, 556, 556, 556, 556, 556, 500, 556, 556, 500,
722, 500, 500, 500, 500, 500, 444, 444, 444, 444, 500,
},
{ // Times-Italic
611, 889, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 667, 667, 667, 667,
722, 722, 722, 612, 611, 611, 611, 611, 611, 611, 611, 611, 611, 722, 500, 611,
722, 722, 722, 722, 333, 333, 333, 333, 333, 333, 333, 333, 444, 667, 667, 556,
556, 611, 556, 556, 833, 667, 667, 667, 667, 667, 722, 944, 722, 722, 722, 722,
722, 722, 722, 722, 611, 722, 611, 611, 611, 611, 500, 500, 500, 500, 500, 556,
556, 556, 611, 722, 722, 722, 722, 722, 722, 722, 722, 722, 611, 833, 611, 556,
556, 556, 556, 556, 556, 556, 500, 500, 500, 500, 333, 500, 667, 500, 500, 778,
500, 500, 422, 541, 500, 920, 500, 500, 278, 275, 400, 400, 389, 389, 333, 275,
350, 444, 444, 333, 444, 444, 333, 500, 333, 333, 250, 250, 760, 500, 500, 500,
500, 544, 500, 400, 333, 675, 500, 333, 278, 444, 444, 444, 444, 444, 444, 444,
500, 889, 444, 889, 500, 444, 675, 500, 333, 389, 278, 500, 500, 500, 500, 500,
167, 500, 500, 500, 500, 333, 675, 549, 500, 500, 333, 333, 500, 333, 333, 278,
278, 278, 278, 278, 278, 278, 278, 444, 444, 278, 278, 300, 278, 675, 549, 675,
471, 278, 722, 333, 675, 500, 675, 500, 500, 500, 500, 500, 549, 500, 500, 500,
500, 500, 500, 667, 333, 500, 500, 500, 500, 750, 750, 300, 276, 310, 500, 500,
500, 523, 333, 333, 476, 833, 250, 250, 1000, 675, 675, 500, 500, 500, 420, 556,
556, 556, 333, 333, 333, 214, 389, 389, 453, 389, 389, 760, 333, 389, 389, 389,
389, 389, 500, 333, 500, 500, 278, 250, 500, 600, 278, 300, 278, 500, 500, 750,
300, 333, 980, 500, 300, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 444,
667, 444, 444, 444, 444, 500, 389, 389, 389, 389, 500,
},
{ // Times-BoldItalic
667, 944, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667,
722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 500, 667,
722, 722, 722, 778, 389, 389, 389, 389, 389, 389, 389, 389, 500, 667, 667, 611,
611, 611, 611, 611, 889, 722, 722, 722, 722, 722, 722, 944, 722, 722, 722, 722,
722, 722, 722, 722, 611, 722, 667, 667, 667, 667, 556, 556, 556, 556, 556, 611,
611, 611, 611, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 889, 667, 611,
611, 611, 611, 611, 611, 611, 500, 500, 500, 500, 333, 500, 722, 500, 500, 778,
500, 500, 570, 570, 500, 832, 500, 500, 278, 220, 348, 348, 333, 333, 333, 220,
350, 444, 444, 333, 444, 444, 333, 500, 333, 333, 250, 250, 747, 500, 500, 500,
500, 608, 500, 400, 333, 570, 500, 333, 278, 444, 444, 444, 444, 444, 444, 444,
500, 1000, 444, 1000, 500, 444, 570, 500, 389, 389, 333, 556, 500, 556, 500, 500,
167, 500, 500, 500, 500, 333, 570, 549, 500, 500, 333, 333, 556, 333, 333, 278,
278, 278, 278, 278, 278, 278, 278, 500, 500, 278, 278, 382, 278, 570, 549, 606,
494, 278, 778, 333, 606, 576, 570, 556, 556, 556, 556, 500, 549, 556, 500, 500,
500, 500, 500, 722, 333, 500, 500, 500, 500, 750, 750, 300, 266, 300, 500, 500,
500, 500, 333, 333, 494, 833, 250, 250, 1000, 570, 570, 500, 500, 500, 555, 500,
500, 500, 333, 333, 333, 278, 389, 389, 549, 389, 389, 747, 333, 389, 389, 389,
389, 389, 500, 333, 500, 500, 278, 250, 500, 600, 278, 366, 278, 500, 500, 750,
300, 333, 1000, 500, 300, 556, 556, 556, 556, 556, 556, 556, 500, 556, 556, 444,
667, 500, 444, 444, 444, 500, 389, 389, 389, 389, 500,
},
}
// Symbol.afm, sorted by glyph name.
@(private, rodata)
STD_SYMBOL_GLYPHS := [190]string{
"Alpha", "Beta", "Chi", "Delta", "Epsilon", "Eta",
"Euro", "Gamma", "Ifraktur", "Iota", "Kappa", "Lambda",
"Mu", "Nu", "Omega", "Omicron", "Phi", "Pi",
"Psi", "Rfraktur", "Rho", "Sigma", "Tau", "Theta",
"Upsilon", "Upsilon1", "Xi", "Zeta", "aleph", "alpha",
"ampersand", "angle", "angleleft", "angleright", "apple", "approxequal",
"arrowboth", "arrowdblboth", "arrowdbldown", "arrowdblleft", "arrowdblright", "arrowdblup",
"arrowdown", "arrowhorizex", "arrowleft", "arrowright", "arrowup", "arrowvertex",
"asteriskmath", "bar", "beta", "braceex", "braceleft", "braceleftbt",
"braceleftmid", "bracelefttp", "braceright", "bracerightbt", "bracerightmid", "bracerighttp",
"bracketleft", "bracketleftbt", "bracketleftex", "bracketlefttp", "bracketright", "bracketrightbt",
"bracketrightex", "bracketrighttp", "bullet", "carriagereturn", "chi", "circlemultiply",
"circleplus", "club", "colon", "comma", "congruent", "copyrightsans",
"copyrightserif", "degree", "delta", "diamond", "divide", "dotmath",
"eight", "element", "ellipsis", "emptyset", "epsilon", "equal",
"equivalence", "eta", "exclam", "existential", "five", "florin",
"four", "fraction", "gamma", "gradient", "greater", "greaterequal",
"heart", "infinity", "integral", "integralbt", "integralex", "integraltp",
"intersection", "iota", "kappa", "lambda", "less", "lessequal",
"logicaland", "logicalnot", "logicalor", "lozenge", "minus", "minute",
"mu", "multiply", "nine", "notelement", "notequal", "notsubset",
"nu", "numbersign", "omega", "omega1", "omicron", "one",
"parenleft", "parenleftbt", "parenleftex", "parenlefttp", "parenright", "parenrightbt",
"parenrightex", "parenrighttp", "partialdiff", "percent", "period", "perpendicular",
"phi", "phi1", "pi", "plus", "plusminus", "product",
"propersubset", "propersuperset", "proportional", "psi", "question", "radical",
"radicalex", "reflexsubset", "reflexsuperset", "registersans", "registerserif", "rho",
"second", "semicolon", "seven", "sigma", "sigma1", "similar",
"six", "slash", "space", "spade", "suchthat", "summation",
"tau", "therefore", "theta", "theta1", "three", "trademarksans",
"trademarkserif", "two", "underscore", "union", "universal", "upsilon",
"weierstrass", "xi", "zero", "zeta",
}
@(private, rodata)
STD_SYMBOL_WIDTHS := [190]u16{
722, 667, 722, 612, 611, 722, 750, 603, 686, 333, 722, 686, 889, 722, 768, 722,
763, 768, 795, 795, 556, 592, 611, 741, 690, 620, 645, 611, 823, 631, 778, 768,
329, 329, 790, 549, 1042, 1042, 603, 987, 987, 603, 603, 1000, 987, 987, 603, 603,
500, 200, 549, 494, 480, 494, 494, 494, 480, 494, 494, 494, 333, 384, 384, 384,
333, 384, 384, 384, 460, 658, 549, 768, 768, 753, 278, 250, 549, 790, 790, 400,
494, 753, 549, 250, 500, 713, 1000, 823, 439, 549, 549, 603, 333, 549, 500, 500,
500, 167, 411, 713, 549, 549, 753, 713, 274, 686, 686, 686, 768, 329, 549, 549,
549, 549, 603, 713, 603, 494, 549, 247, 576, 549, 500, 713, 549, 713, 521, 500,
686, 713, 549, 500, 333, 384, 384, 384, 333, 384, 384, 384, 494, 833, 250, 658,
521, 603, 549, 549, 549, 823, 713, 713, 713, 686, 444, 549, 500, 713, 713, 790,
790, 549, 411, 278, 500, 603, 439, 549, 500, 278, 250, 753, 439, 713, 439, 863,
521, 631, 500, 786, 890, 500, 500, 768, 713, 576, 987, 493, 500, 494,
}
// ZapfDingbats.afm, sorted by glyph name.
@(private, rodata)
STD_ZAPF_GLYPHS := [202]string{
"a1", "a10", "a100", "a101", "a102", "a103",
"a104", "a105", "a106", "a107", "a108", "a109",
"a11", "a110", "a111", "a112", "a117", "a118",
"a119", "a12", "a120", "a121", "a122", "a123",
"a124", "a125", "a126", "a127", "a128", "a129",
"a13", "a130", "a131", "a132", "a133", "a134",
"a135", "a136", "a137", "a138", "a139", "a14",
"a140", "a141", "a142", "a143", "a144", "a145",
"a146", "a147", "a148", "a149", "a15", "a150",
"a151", "a152", "a153", "a154", "a155", "a156",
"a157", "a158", "a159", "a16", "a160", "a161",
"a162", "a163", "a164", "a165", "a166", "a167",
"a168", "a169", "a17", "a170", "a171", "a172",
"a173", "a174", "a175", "a176", "a177", "a178",
"a179", "a18", "a180", "a181", "a182", "a183",
"a184", "a185", "a186", "a187", "a188", "a189",
"a19", "a190", "a191", "a192", "a193", "a194",
"a195", "a196", "a197", "a198", "a199", "a2",
"a20", "a200", "a201", "a202", "a203", "a204",
"a205", "a206", "a21", "a22", "a23", "a24",
"a25", "a26", "a27", "a28", "a29", "a3",
"a30", "a31", "a32", "a33", "a34", "a35",
"a36", "a37", "a38", "a39", "a4", "a40",
"a41", "a42", "a43", "a44", "a45", "a46",
"a47", "a48", "a49", "a5", "a50", "a51",
"a52", "a53", "a54", "a55", "a56", "a57",
"a58", "a59", "a6", "a60", "a61", "a62",
"a63", "a64", "a65", "a66", "a67", "a68",
"a69", "a7", "a70", "a71", "a72", "a73",
"a74", "a75", "a76", "a77", "a78", "a79",
"a8", "a81", "a82", "a83", "a84", "a85",
"a86", "a87", "a88", "a89", "a9", "a90",
"a91", "a92", "a93", "a94", "a95", "a96",
"a97", "a98", "a99", "space",
}
@(private, rodata)
STD_ZAPF_WIDTHS := [202]u16{
974, 692, 668, 732, 544, 544, 910, 911, 667, 760, 760, 626, 960, 694, 595, 776,
690, 791, 790, 939, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 549, 788,
788, 788, 788, 788, 788, 788, 788, 788, 788, 855, 788, 788, 788, 788, 788, 788,
788, 788, 788, 788, 911, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 933,
894, 838, 924, 1016, 458, 924, 918, 927, 928, 928, 945, 834, 873, 828, 924, 917,
930, 931, 463, 883, 836, 974, 867, 696, 874, 760, 946, 865, 967, 831, 873, 927,
755, 970, 918, 748, 836, 771, 888, 748, 771, 888, 867, 961, 846, 696, 874, 974,
762, 759, 509, 410, 762, 761, 571, 677, 763, 760, 759, 754, 786, 980, 788, 788,
790, 793, 794, 816, 823, 789, 841, 823, 719, 833, 816, 831, 923, 744, 723, 749,
790, 792, 695, 789, 776, 768, 792, 759, 707, 708, 682, 701, 826, 815, 494, 789,
789, 707, 687, 696, 689, 786, 787, 713, 791, 552, 785, 791, 873, 761, 762, 759,
892, 892, 788, 784, 537, 438, 138, 277, 415, 509, 410, 234, 234, 390, 577, 390,
276, 276, 317, 317, 334, 334, 392, 392, 668, 278,
}
// StandardEncoding (ISO 32000-2, Annex D.2). Note quoteright at 0x27 and
// quotesingle at 0xA9 -- the reverse of WinAnsi, and the reason a document
// that gets its /Encoding wrong shows curly apostrophes as straight ones.
@(private, rodata)
ENC_STANDARD := [256]string{
32 = "space", 33 = "exclam", 34 = "quotedbl", 35 = "numbersign",
36 = "dollar", 37 = "percent", 38 = "ampersand", 39 = "quoteright",
40 = "parenleft", 41 = "parenright", 42 = "asterisk", 43 = "plus",
44 = "comma", 45 = "hyphen", 46 = "period", 47 = "slash",
48 = "zero", 49 = "one", 50 = "two", 51 = "three",
52 = "four", 53 = "five", 54 = "six", 55 = "seven",
56 = "eight", 57 = "nine", 58 = "colon", 59 = "semicolon",
60 = "less", 61 = "equal", 62 = "greater", 63 = "question",
64 = "at", 65 = "A", 66 = "B", 67 = "C",
68 = "D", 69 = "E", 70 = "F", 71 = "G",
72 = "H", 73 = "I", 74 = "J", 75 = "K",
76 = "L", 77 = "M", 78 = "N", 79 = "O",
80 = "P", 81 = "Q", 82 = "R", 83 = "S",
84 = "T", 85 = "U", 86 = "V", 87 = "W",
88 = "X", 89 = "Y", 90 = "Z", 91 = "bracketleft",
92 = "backslash", 93 = "bracketright", 94 = "asciicircum", 95 = "underscore",
96 = "quoteleft", 97 = "a", 98 = "b", 99 = "c",
100 = "d", 101 = "e", 102 = "f", 103 = "g",
104 = "h", 105 = "i", 106 = "j", 107 = "k",
108 = "l", 109 = "m", 110 = "n", 111 = "o",
112 = "p", 113 = "q", 114 = "r", 115 = "s",
116 = "t", 117 = "u", 118 = "v", 119 = "w",
120 = "x", 121 = "y", 122 = "z", 123 = "braceleft",
124 = "bar", 125 = "braceright", 126 = "asciitilde", 161 = "exclamdown",
162 = "cent", 163 = "sterling", 164 = "fraction", 165 = "yen",
166 = "florin", 167 = "section", 168 = "currency", 169 = "quotesingle",
170 = "quotedblleft", 171 = "guillemotleft", 172 = "guilsinglleft", 173 = "guilsinglright",
174 = "fi", 175 = "fl", 177 = "endash", 178 = "dagger",
179 = "daggerdbl", 180 = "periodcentered", 182 = "paragraph", 183 = "bullet",
184 = "quotesinglbase", 185 = "quotedblbase", 186 = "quotedblright", 187 = "guillemotright",
188 = "ellipsis", 189 = "perthousand", 191 = "questiondown", 193 = "grave",
194 = "acute", 195 = "circumflex", 196 = "tilde", 197 = "macron",
198 = "breve", 199 = "dotaccent", 200 = "dieresis", 202 = "ring",
203 = "cedilla", 205 = "hungarumlaut", 206 = "ogonek", 207 = "caron",
208 = "emdash", 225 = "AE", 227 = "ordfeminine", 232 = "Lslash",
233 = "Oslash", 234 = "OE", 235 = "ordmasculine", 241 = "ae",
245 = "dotlessi", 248 = "lslash", 249 = "oslash", 250 = "oe",
251 = "germandbls",
}
// WinAnsiEncoding (ISO 32000-2, Annex D.2). Latin-1 except for 0x80-0x9F,
// which hold the CP1252 typographic characters; every code above 0x20 that
// CP1252 leaves undefined maps to bullet, as the annex requires. 0xA0 is a
// no-break space and 0xAD a soft hyphen, both drawn as their plain forms.
@(private, rodata)
ENC_WINANSI := [256]string{
32 = "space", 33 = "exclam", 34 = "quotedbl", 35 = "numbersign",
36 = "dollar", 37 = "percent", 38 = "ampersand", 39 = "quotesingle",
40 = "parenleft", 41 = "parenright", 42 = "asterisk", 43 = "plus",
44 = "comma", 45 = "hyphen", 46 = "period", 47 = "slash",
48 = "zero", 49 = "one", 50 = "two", 51 = "three",
52 = "four", 53 = "five", 54 = "six", 55 = "seven",
56 = "eight", 57 = "nine", 58 = "colon", 59 = "semicolon",
60 = "less", 61 = "equal", 62 = "greater", 63 = "question",
64 = "at", 65 = "A", 66 = "B", 67 = "C",
68 = "D", 69 = "E", 70 = "F", 71 = "G",
72 = "H", 73 = "I", 74 = "J", 75 = "K",
76 = "L", 77 = "M", 78 = "N", 79 = "O",
80 = "P", 81 = "Q", 82 = "R", 83 = "S",
84 = "T", 85 = "U", 86 = "V", 87 = "W",
88 = "X", 89 = "Y", 90 = "Z", 91 = "bracketleft",
92 = "backslash", 93 = "bracketright", 94 = "asciicircum", 95 = "underscore",
96 = "grave", 97 = "a", 98 = "b", 99 = "c",
100 = "d", 101 = "e", 102 = "f", 103 = "g",
104 = "h", 105 = "i", 106 = "j", 107 = "k",
108 = "l", 109 = "m", 110 = "n", 111 = "o",
112 = "p", 113 = "q", 114 = "r", 115 = "s",
116 = "t", 117 = "u", 118 = "v", 119 = "w",
120 = "x", 121 = "y", 122 = "z", 123 = "braceleft",
124 = "bar", 125 = "braceright", 126 = "asciitilde", 127 = "bullet",
128 = "Euro", 129 = "bullet", 130 = "quotesinglbase", 131 = "florin",
132 = "quotedblbase", 133 = "ellipsis", 134 = "dagger", 135 = "daggerdbl",
136 = "circumflex", 137 = "perthousand", 138 = "Scaron", 139 = "guilsinglleft",
140 = "OE", 141 = "bullet", 142 = "Zcaron", 143 = "bullet",
144 = "bullet", 145 = "quoteleft", 146 = "quoteright", 147 = "quotedblleft",
148 = "quotedblright", 149 = "bullet", 150 = "endash", 151 = "emdash",
152 = "tilde", 153 = "trademark", 154 = "scaron", 155 = "guilsinglright",
156 = "oe", 157 = "bullet", 158 = "zcaron", 159 = "Ydieresis",
160 = "space", 161 = "exclamdown", 162 = "cent", 163 = "sterling",
164 = "currency", 165 = "yen", 166 = "brokenbar", 167 = "section",
168 = "dieresis", 169 = "copyright", 170 = "ordfeminine", 171 = "guillemotleft",
172 = "logicalnot", 173 = "hyphen", 174 = "registered", 175 = "macron",
176 = "degree", 177 = "plusminus", 178 = "twosuperior", 179 = "threesuperior",
180 = "acute", 181 = "mu", 182 = "paragraph", 183 = "periodcentered",
184 = "cedilla", 185 = "onesuperior", 186 = "ordmasculine", 187 = "guillemotright",
188 = "onequarter", 189 = "onehalf", 190 = "threequarters", 191 = "questiondown",
192 = "Agrave", 193 = "Aacute", 194 = "Acircumflex", 195 = "Atilde",
196 = "Adieresis", 197 = "Aring", 198 = "AE", 199 = "Ccedilla",
200 = "Egrave", 201 = "Eacute", 202 = "Ecircumflex", 203 = "Edieresis",
204 = "Igrave", 205 = "Iacute", 206 = "Icircumflex", 207 = "Idieresis",
208 = "Eth", 209 = "Ntilde", 210 = "Ograve", 211 = "Oacute",
212 = "Ocircumflex", 213 = "Otilde", 214 = "Odieresis", 215 = "multiply",
216 = "Oslash", 217 = "Ugrave", 218 = "Uacute", 219 = "Ucircumflex",
220 = "Udieresis", 221 = "Yacute", 222 = "Thorn", 223 = "germandbls",
224 = "agrave", 225 = "aacute", 226 = "acircumflex", 227 = "atilde",
228 = "adieresis", 229 = "aring", 230 = "ae", 231 = "ccedilla",
232 = "egrave", 233 = "eacute", 234 = "ecircumflex", 235 = "edieresis",
236 = "igrave", 237 = "iacute", 238 = "icircumflex", 239 = "idieresis",
240 = "eth", 241 = "ntilde", 242 = "ograve", 243 = "oacute",
244 = "ocircumflex", 245 = "otilde", 246 = "odieresis", 247 = "divide",
248 = "oslash", 249 = "ugrave", 250 = "uacute", 251 = "ucircumflex",
252 = "udieresis", 253 = "yacute", 254 = "thorn", 255 = "ydieresis",
}
// MacRomanEncoding (ISO 32000-2, Annex D.2), plus the fifteen positions the
// annex leaves blank but Mac OS Roman itself defines (0xAD notequal, 0xB0
// infinity, ... 0xF0 apple). Producers on the Mac emitted those codes, and
// every other reader fills them in the same way; a blank there would drop a
// character that the file plainly meant.
@(private, rodata)
ENC_MACROMAN := [256]string{
32 = "space", 33 = "exclam", 34 = "quotedbl", 35 = "numbersign",
36 = "dollar", 37 = "percent", 38 = "ampersand", 39 = "quotesingle",
40 = "parenleft", 41 = "parenright", 42 = "asterisk", 43 = "plus",
44 = "comma", 45 = "hyphen", 46 = "period", 47 = "slash",
48 = "zero", 49 = "one", 50 = "two", 51 = "three",
52 = "four", 53 = "five", 54 = "six", 55 = "seven",
56 = "eight", 57 = "nine", 58 = "colon", 59 = "semicolon",
60 = "less", 61 = "equal", 62 = "greater", 63 = "question",
64 = "at", 65 = "A", 66 = "B", 67 = "C",
68 = "D", 69 = "E", 70 = "F", 71 = "G",
72 = "H", 73 = "I", 74 = "J", 75 = "K",
76 = "L", 77 = "M", 78 = "N", 79 = "O",
80 = "P", 81 = "Q", 82 = "R", 83 = "S",
84 = "T", 85 = "U", 86 = "V", 87 = "W",
88 = "X", 89 = "Y", 90 = "Z", 91 = "bracketleft",
92 = "backslash", 93 = "bracketright", 94 = "asciicircum", 95 = "underscore",
96 = "grave", 97 = "a", 98 = "b", 99 = "c",
100 = "d", 101 = "e", 102 = "f", 103 = "g",
104 = "h", 105 = "i", 106 = "j", 107 = "k",
108 = "l", 109 = "m", 110 = "n", 111 = "o",
112 = "p", 113 = "q", 114 = "r", 115 = "s",
116 = "t", 117 = "u", 118 = "v", 119 = "w",
120 = "x", 121 = "y", 122 = "z", 123 = "braceleft",
124 = "bar", 125 = "braceright", 126 = "asciitilde", 128 = "Adieresis",
129 = "Aring", 130 = "Ccedilla", 131 = "Eacute", 132 = "Ntilde",
133 = "Odieresis", 134 = "Udieresis", 135 = "aacute", 136 = "agrave",
137 = "acircumflex", 138 = "adieresis", 139 = "atilde", 140 = "aring",
141 = "ccedilla", 142 = "eacute", 143 = "egrave", 144 = "ecircumflex",
145 = "edieresis", 146 = "iacute", 147 = "igrave", 148 = "icircumflex",
149 = "idieresis", 150 = "ntilde", 151 = "oacute", 152 = "ograve",
153 = "ocircumflex", 154 = "odieresis", 155 = "otilde", 156 = "uacute",
157 = "ugrave", 158 = "ucircumflex", 159 = "udieresis", 160 = "dagger",
161 = "degree", 162 = "cent", 163 = "sterling", 164 = "section",
165 = "bullet", 166 = "paragraph", 167 = "germandbls", 168 = "registered",
169 = "copyright", 170 = "trademark", 171 = "acute", 172 = "dieresis",
173 = "notequal", 174 = "AE", 175 = "Oslash", 176 = "infinity",
177 = "plusminus", 178 = "lessequal", 179 = "greaterequal", 180 = "yen",
181 = "mu", 182 = "partialdiff", 183 = "summation", 184 = "product",
185 = "pi", 186 = "integral", 187 = "ordfeminine", 188 = "ordmasculine",
189 = "Omega", 190 = "ae", 191 = "oslash", 192 = "questiondown",
193 = "exclamdown", 194 = "logicalnot", 195 = "radical", 196 = "florin",
197 = "approxequal", 198 = "Delta", 199 = "guillemotleft", 200 = "guillemotright",
201 = "ellipsis", 202 = "space", 203 = "Agrave", 204 = "Atilde",
205 = "Otilde", 206 = "OE", 207 = "oe", 208 = "endash",
209 = "emdash", 210 = "quotedblleft", 211 = "quotedblright", 212 = "quoteleft",
213 = "quoteright", 214 = "divide", 215 = "lozenge", 216 = "ydieresis",
217 = "Ydieresis", 218 = "fraction", 219 = "currency", 220 = "guilsinglleft",
221 = "guilsinglright", 222 = "fi", 223 = "fl", 224 = "daggerdbl",
225 = "periodcentered", 226 = "quotesinglbase", 227 = "quotedblbase", 228 = "perthousand",
229 = "Acircumflex", 230 = "Ecircumflex", 231 = "Aacute", 232 = "Edieresis",
233 = "Egrave", 234 = "Iacute", 235 = "Icircumflex", 236 = "Idieresis",
237 = "Igrave", 238 = "Oacute", 239 = "Ocircumflex", 240 = "apple",
241 = "Ograve", 242 = "Uacute", 243 = "Ucircumflex", 244 = "Ugrave",
245 = "dotlessi", 246 = "circumflex", 247 = "tilde", 248 = "macron",
249 = "breve", 250 = "dotaccent", 251 = "ring", 252 = "cedilla",
253 = "hungarumlaut", 254 = "ogonek", 255 = "caron",
}
// MacExpertEncoding (ISO 32000-2, Annex D.4). None of the standard 14 fonts
// contains these glyphs; it is here for embedded expert fonts.
@(private, rodata)
ENC_MACEXPERT := [256]string{
32 = "space", 33 = "exclamsmall", 34 = "Hungarumlautsmall", 35 = "centoldstyle",
36 = "dollaroldstyle", 37 = "dollarsuperior", 38 = "ampersandsmall", 39 = "Acutesmall",
40 = "parenleftsuperior", 41 = "parenrightsuperior", 42 = "twodotenleader", 43 = "onedotenleader",
44 = "comma", 45 = "hyphen", 46 = "period", 47 = "fraction",
48 = "zerooldstyle", 49 = "oneoldstyle", 50 = "twooldstyle", 51 = "threeoldstyle",
52 = "fouroldstyle", 53 = "fiveoldstyle", 54 = "sixoldstyle", 55 = "sevenoldstyle",
56 = "eightoldstyle", 57 = "nineoldstyle", 58 = "colon", 59 = "semicolon",
61 = "threequartersemdash", 63 = "questionsmall", 68 = "Ethsmall", 71 = "onequarter",
72 = "onehalf", 73 = "threequarters", 74 = "oneeighth", 75 = "threeeighths",
76 = "fiveeighths", 77 = "seveneighths", 78 = "onethird", 79 = "twothirds",
86 = "ff", 87 = "fi", 88 = "fl", 89 = "ffi",
90 = "ffl", 91 = "parenleftinferior", 93 = "parenrightinferior", 94 = "Circumflexsmall",
95 = "hypheninferior", 96 = "Gravesmall", 97 = "Asmall", 98 = "Bsmall",
99 = "Csmall", 100 = "Dsmall", 101 = "Esmall", 102 = "Fsmall",
103 = "Gsmall", 104 = "Hsmall", 105 = "Ismall", 106 = "Jsmall",
107 = "Ksmall", 108 = "Lsmall", 109 = "Msmall", 110 = "Nsmall",
111 = "Osmall", 112 = "Psmall", 113 = "Qsmall", 114 = "Rsmall",
115 = "Ssmall", 116 = "Tsmall", 117 = "Usmall", 118 = "Vsmall",
119 = "Wsmall", 120 = "Xsmall", 121 = "Ysmall", 122 = "Zsmall",
123 = "colonmonetary", 124 = "onefitted", 125 = "rupiah", 126 = "Tildesmall",
129 = "asuperior", 130 = "centsuperior", 135 = "Aacutesmall", 136 = "Agravesmall",
137 = "Acircumflexsmall", 138 = "Adieresissmall", 139 = "Atildesmall", 140 = "Aringsmall",
141 = "Ccedillasmall", 142 = "Eacutesmall", 143 = "Egravesmall", 144 = "Ecircumflexsmall",
145 = "Edieresissmall", 146 = "Iacutesmall", 147 = "Igravesmall", 148 = "Icircumflexsmall",
149 = "Idieresissmall", 150 = "Ntildesmall", 151 = "Oacutesmall", 152 = "Ogravesmall",
153 = "Ocircumflexsmall", 154 = "Odieresissmall", 155 = "Otildesmall", 156 = "Uacutesmall",
157 = "Ugravesmall", 158 = "Ucircumflexsmall", 159 = "Udieresissmall", 161 = "eightsuperior",
162 = "fourinferior", 163 = "threeinferior", 164 = "sixinferior", 165 = "eightinferior",
166 = "seveninferior", 167 = "Scaronsmall", 169 = "centinferior", 170 = "twoinferior",
172 = "Dieresissmall", 174 = "Caronsmall", 175 = "osuperior", 176 = "fiveinferior",
178 = "commainferior", 179 = "periodinferior", 180 = "Yacutesmall", 182 = "dollarinferior",
185 = "Thornsmall", 187 = "nineinferior", 188 = "zeroinferior", 189 = "Zcaronsmall",
190 = "AEsmall", 191 = "Oslashsmall", 192 = "questiondownsmall", 193 = "oneinferior",
194 = "Lslashsmall", 201 = "Cedillasmall", 207 = "OEsmall", 208 = "figuredash",
209 = "hyphensuperior", 214 = "exclamdownsmall", 216 = "Ydieresissmall", 218 = "onesuperior",
219 = "twosuperior", 220 = "threesuperior", 221 = "foursuperior", 222 = "fivesuperior",
223 = "sixsuperior", 224 = "sevensuperior", 225 = "ninesuperior", 226 = "zerosuperior",
228 = "esuperior", 229 = "rsuperior", 230 = "tsuperior", 233 = "isuperior",
234 = "ssuperior", 235 = "dsuperior", 241 = "lsuperior", 242 = "Ogoneksmall",
243 = "Brevesmall", 244 = "Macronsmall", 245 = "bsuperior", 246 = "nsuperior",
247 = "msuperior", 248 = "commasuperior", 249 = "periodsuperior", 250 = "Dotaccentsmall",
251 = "Ringsmall",
}
// Symbol's built-in encoding, taken from the C column of Symbol.afm.
@(private, rodata)
ENC_SYMBOL := [256]string{
32 = "space", 33 = "exclam", 34 = "universal", 35 = "numbersign",
36 = "existential", 37 = "percent", 38 = "ampersand", 39 = "suchthat",
40 = "parenleft", 41 = "parenright", 42 = "asteriskmath", 43 = "plus",
44 = "comma", 45 = "minus", 46 = "period", 47 = "slash",
48 = "zero", 49 = "one", 50 = "two", 51 = "three",
52 = "four", 53 = "five", 54 = "six", 55 = "seven",
56 = "eight", 57 = "nine", 58 = "colon", 59 = "semicolon",
60 = "less", 61 = "equal", 62 = "greater", 63 = "question",
64 = "congruent", 65 = "Alpha", 66 = "Beta", 67 = "Chi",
68 = "Delta", 69 = "Epsilon", 70 = "Phi", 71 = "Gamma",
72 = "Eta", 73 = "Iota", 74 = "theta1", 75 = "Kappa",
76 = "Lambda", 77 = "Mu", 78 = "Nu", 79 = "Omicron",
80 = "Pi", 81 = "Theta", 82 = "Rho", 83 = "Sigma",
84 = "Tau", 85 = "Upsilon", 86 = "sigma1", 87 = "Omega",
88 = "Xi", 89 = "Psi", 90 = "Zeta", 91 = "bracketleft",
92 = "therefore", 93 = "bracketright", 94 = "perpendicular", 95 = "underscore",
96 = "radicalex", 97 = "alpha", 98 = "beta", 99 = "chi",
100 = "delta", 101 = "epsilon", 102 = "phi", 103 = "gamma",
104 = "eta", 105 = "iota", 106 = "phi1", 107 = "kappa",
108 = "lambda", 109 = "mu", 110 = "nu", 111 = "omicron",
112 = "pi", 113 = "theta", 114 = "rho", 115 = "sigma",
116 = "tau", 117 = "upsilon", 118 = "omega1", 119 = "omega",
120 = "xi", 121 = "psi", 122 = "zeta", 123 = "braceleft",
124 = "bar", 125 = "braceright", 126 = "similar", 160 = "Euro",
161 = "Upsilon1", 162 = "minute", 163 = "lessequal", 164 = "fraction",
165 = "infinity", 166 = "florin", 167 = "club", 168 = "diamond",
169 = "heart", 170 = "spade", 171 = "arrowboth", 172 = "arrowleft",
173 = "arrowup", 174 = "arrowright", 175 = "arrowdown", 176 = "degree",
177 = "plusminus", 178 = "second", 179 = "greaterequal", 180 = "multiply",
181 = "proportional", 182 = "partialdiff", 183 = "bullet", 184 = "divide",
185 = "notequal", 186 = "equivalence", 187 = "approxequal", 188 = "ellipsis",
189 = "arrowvertex", 190 = "arrowhorizex", 191 = "carriagereturn", 192 = "aleph",
193 = "Ifraktur", 194 = "Rfraktur", 195 = "weierstrass", 196 = "circlemultiply",
197 = "circleplus", 198 = "emptyset", 199 = "intersection", 200 = "union",
201 = "propersuperset", 202 = "reflexsuperset", 203 = "notsubset", 204 = "propersubset",
205 = "reflexsubset", 206 = "element", 207 = "notelement", 208 = "angle",
209 = "gradient", 210 = "registerserif", 211 = "copyrightserif", 212 = "trademarkserif",
213 = "product", 214 = "radical", 215 = "dotmath", 216 = "logicalnot",
217 = "logicaland", 218 = "logicalor", 219 = "arrowdblboth", 220 = "arrowdblleft",
221 = "arrowdblup", 222 = "arrowdblright", 223 = "arrowdbldown", 224 = "lozenge",
225 = "angleleft", 226 = "registersans", 227 = "copyrightsans", 228 = "trademarksans",
229 = "summation", 230 = "parenlefttp", 231 = "parenleftex", 232 = "parenleftbt",
233 = "bracketlefttp", 234 = "bracketleftex", 235 = "bracketleftbt", 236 = "bracelefttp",
237 = "braceleftmid", 238 = "braceleftbt", 239 = "braceex", 241 = "angleright",
242 = "integral", 243 = "integraltp", 244 = "integralex", 245 = "integralbt",
246 = "parenrighttp", 247 = "parenrightex", 248 = "parenrightbt", 249 = "bracketrighttp",
250 = "bracketrightex", 251 = "bracketrightbt", 252 = "bracerighttp", 253 = "bracerightmid",
254 = "bracerightbt",
}
// ZapfDingbats' built-in encoding, from the C column of ZapfDingbats.afm.
@(private, rodata)
ENC_ZAPF := [256]string{
32 = "space", 33 = "a1", 34 = "a2", 35 = "a202",
36 = "a3", 37 = "a4", 38 = "a5", 39 = "a119",
40 = "a118", 41 = "a117", 42 = "a11", 43 = "a12",
44 = "a13", 45 = "a14", 46 = "a15", 47 = "a16",
48 = "a105", 49 = "a17", 50 = "a18", 51 = "a19",
52 = "a20", 53 = "a21", 54 = "a22", 55 = "a23",
56 = "a24", 57 = "a25", 58 = "a26", 59 = "a27",
60 = "a28", 61 = "a6", 62 = "a7", 63 = "a8",
64 = "a9", 65 = "a10", 66 = "a29", 67 = "a30",
68 = "a31", 69 = "a32", 70 = "a33", 71 = "a34",
72 = "a35", 73 = "a36", 74 = "a37", 75 = "a38",
76 = "a39", 77 = "a40", 78 = "a41", 79 = "a42",
80 = "a43", 81 = "a44", 82 = "a45", 83 = "a46",
84 = "a47", 85 = "a48", 86 = "a49", 87 = "a50",
88 = "a51", 89 = "a52", 90 = "a53", 91 = "a54",
92 = "a55", 93 = "a56", 94 = "a57", 95 = "a58",
96 = "a59", 97 = "a60", 98 = "a61", 99 = "a62",
100 = "a63", 101 = "a64", 102 = "a65", 103 = "a66",
104 = "a67", 105 = "a68", 106 = "a69", 107 = "a70",
108 = "a71", 109 = "a72", 110 = "a73", 111 = "a74",
112 = "a203", 113 = "a75", 114 = "a204", 115 = "a76",
116 = "a77", 117 = "a78", 118 = "a79", 119 = "a81",
120 = "a82", 121 = "a83", 122 = "a84", 123 = "a97",
124 = "a98", 125 = "a99", 126 = "a100", 128 = "a89",
129 = "a90", 130 = "a93", 131 = "a94", 132 = "a91",
133 = "a92", 134 = "a205", 135 = "a85", 136 = "a206",
137 = "a86", 138 = "a87", 139 = "a88", 140 = "a95",
141 = "a96", 161 = "a101", 162 = "a102", 163 = "a103",
164 = "a104", 165 = "a106", 166 = "a107", 167 = "a108",
168 = "a112", 169 = "a111", 170 = "a110", 171 = "a109",
172 = "a120", 173 = "a121", 174 = "a122", 175 = "a123",
176 = "a124", 177 = "a125", 178 = "a126", 179 = "a127",
180 = "a128", 181 = "a129", 182 = "a130", 183 = "a131",
184 = "a132", 185 = "a133", 186 = "a134", 187 = "a135",
188 = "a136", 189 = "a137", 190 = "a138", 191 = "a139",
192 = "a140", 193 = "a141", 194 = "a142", 195 = "a143",
196 = "a144", 197 = "a145", 198 = "a146", 199 = "a147",
200 = "a148", 201 = "a149", 202 = "a150", 203 = "a151",
204 = "a152", 205 = "a153", 206 = "a154", 207 = "a155",
208 = "a156", 209 = "a157", 210 = "a158", 211 = "a159",
212 = "a160", 213 = "a161", 214 = "a163", 215 = "a164",
216 = "a196", 217 = "a165", 218 = "a192", 219 = "a166",
220 = "a167", 221 = "a168", 222 = "a169", 223 = "a170",
224 = "a171", 225 = "a172", 226 = "a173", 227 = "a162",
228 = "a174", 229 = "a175", 230 = "a176", 231 = "a177",
232 = "a178", 233 = "a179", 234 = "a193", 235 = "a180",
236 = "a199", 237 = "a181", 238 = "a200", 239 = "a182",
241 = "a201", 242 = "a183", 243 = "a184", 244 = "a197",
245 = "a185", 246 = "a194", 247 = "a198", 248 = "a186",
249 = "a195", 250 = "a187", 251 = "a188", 252 = "a189",
253 = "a190", 254 = "a191",
}
// The Adobe Glyph List, restricted to the ranges a PDF actually names:
// Latin and its extensions, combining marks, Greek, Cyrillic, punctuation,
// currency, arrows, mathematics, geometric shapes and dingbats, the private
// use area AGL assigns to the expert glyphs, and the f-ligatures. Every name
// used by the standard 14 fonts or by any built-in encoding is present
// whatever its code point. Names standing for a sequence of code points keep
// the first, since a glyph maps to one rune here.
//
// The 201 ZapfDingbats names (a1..a191) come from Adobe's separate
// zapfdingbats.txt. The two lists share no name, so merging them cannot lose
// anything, and it means dingbat text extracts without threading the font's
// identity down to this table.
@(private)
Agl_Entry :: struct {
name: string,
cp: rune,
}
// Sorted by name.
@(private, rodata)
AGL_TABLE := [2435]Agl_Entry{
{"A", 0x0041}, {"AE", 0x00C6}, {"AEacute", 0x01FC}, {"AEmacron", 0x01E2},
{"AEsmall", 0xF7E6}, {"Aacute", 0x00C1}, {"Aacutesmall", 0xF7E1}, {"Abreve", 0x0102},
{"Abreveacute", 0x1EAE}, {"Abrevecyrillic", 0x04D0}, {"Abrevedotbelow", 0x1EB6}, {"Abrevegrave", 0x1EB0},
{"Abrevehookabove", 0x1EB2}, {"Abrevetilde", 0x1EB4}, {"Acaron", 0x01CD}, {"Acircle", 0x24B6},
{"Acircumflex", 0x00C2}, {"Acircumflexacute", 0x1EA4}, {"Acircumflexdotbelow", 0x1EAC}, {"Acircumflexgrave", 0x1EA6},
{"Acircumflexhookabove", 0x1EA8}, {"Acircumflexsmall", 0xF7E2}, {"Acircumflextilde", 0x1EAA}, {"Acute", 0xF6C9},
{"Acutesmall", 0xF7B4}, {"Acyrillic", 0x0410}, {"Adblgrave", 0x0200}, {"Adieresis", 0x00C4},
{"Adieresiscyrillic", 0x04D2}, {"Adieresismacron", 0x01DE}, {"Adieresissmall", 0xF7E4}, {"Adotbelow", 0x1EA0},
{"Adotmacron", 0x01E0}, {"Agrave", 0x00C0}, {"Agravesmall", 0xF7E0}, {"Ahookabove", 0x1EA2},
{"Aiecyrillic", 0x04D4}, {"Ainvertedbreve", 0x0202}, {"Alpha", 0x0391}, {"Alphatonos", 0x0386},
{"Amacron", 0x0100}, {"Aogonek", 0x0104}, {"Aring", 0x00C5}, {"Aringacute", 0x01FA},
{"Aringbelow", 0x1E00}, {"Aringsmall", 0xF7E5}, {"Asmall", 0xF761}, {"Atilde", 0x00C3},
{"Atildesmall", 0xF7E3}, {"B", 0x0042}, {"Bcircle", 0x24B7}, {"Bdotaccent", 0x1E02},
{"Bdotbelow", 0x1E04}, {"Becyrillic", 0x0411}, {"Beta", 0x0392}, {"Bhook", 0x0181},
{"Blinebelow", 0x1E06}, {"Brevesmall", 0xF6F4}, {"Bsmall", 0xF762}, {"Btopbar", 0x0182},
{"C", 0x0043}, {"Cacute", 0x0106}, {"Caron", 0xF6CA}, {"Caronsmall", 0xF6F5},
{"Ccaron", 0x010C}, {"Ccedilla", 0x00C7}, {"Ccedillaacute", 0x1E08}, {"Ccedillasmall", 0xF7E7},
{"Ccircle", 0x24B8}, {"Ccircumflex", 0x0108}, {"Cdot", 0x010A}, {"Cdotaccent", 0x010A},
{"Cedillasmall", 0xF7B8}, {"Cheabkhasiancyrillic", 0x04BC}, {"Checyrillic", 0x0427}, {"Chedescenderabkhasiancyrillic", 0x04BE},
{"Chedescendercyrillic", 0x04B6}, {"Chedieresiscyrillic", 0x04F4}, {"Chekhakassiancyrillic", 0x04CB}, {"Cheverticalstrokecyrillic", 0x04B8},
{"Chi", 0x03A7}, {"Chook", 0x0187}, {"Circumflexsmall", 0xF6F6}, {"Csmall", 0xF763},
{"D", 0x0044}, {"DZ", 0x01F1}, {"DZcaron", 0x01C4}, {"Dafrican", 0x0189},
{"Dcaron", 0x010E}, {"Dcedilla", 0x1E10}, {"Dcircle", 0x24B9}, {"Dcircumflexbelow", 0x1E12},
{"Dcroat", 0x0110}, {"Ddotaccent", 0x1E0A}, {"Ddotbelow", 0x1E0C}, {"Decyrillic", 0x0414},
{"Deicoptic", 0x03EE}, {"Delta", 0x2206}, {"Deltagreek", 0x0394}, {"Dhook", 0x018A},
{"Dieresis", 0xF6CB}, {"DieresisAcute", 0xF6CC}, {"DieresisGrave", 0xF6CD}, {"Dieresissmall", 0xF7A8},
{"Digammagreek", 0x03DC}, {"Djecyrillic", 0x0402}, {"Dlinebelow", 0x1E0E}, {"Dotaccentsmall", 0xF6F7},
{"Dslash", 0x0110}, {"Dsmall", 0xF764}, {"Dtopbar", 0x018B}, {"Dz", 0x01F2},
{"Dzcaron", 0x01C5}, {"Dzeabkhasiancyrillic", 0x04E0}, {"Dzecyrillic", 0x0405}, {"Dzhecyrillic", 0x040F},
{"E", 0x0045}, {"Eacute", 0x00C9}, {"Eacutesmall", 0xF7E9}, {"Ebreve", 0x0114},
{"Ecaron", 0x011A}, {"Ecedillabreve", 0x1E1C}, {"Ecircle", 0x24BA}, {"Ecircumflex", 0x00CA},
{"Ecircumflexacute", 0x1EBE}, {"Ecircumflexbelow", 0x1E18}, {"Ecircumflexdotbelow", 0x1EC6}, {"Ecircumflexgrave", 0x1EC0},
{"Ecircumflexhookabove", 0x1EC2}, {"Ecircumflexsmall", 0xF7EA}, {"Ecircumflextilde", 0x1EC4}, {"Ecyrillic", 0x0404},
{"Edblgrave", 0x0204}, {"Edieresis", 0x00CB}, {"Edieresissmall", 0xF7EB}, {"Edot", 0x0116},
{"Edotaccent", 0x0116}, {"Edotbelow", 0x1EB8}, {"Efcyrillic", 0x0424}, {"Egrave", 0x00C8},
{"Egravesmall", 0xF7E8}, {"Ehookabove", 0x1EBA}, {"Eightroman", 0x2167}, {"Einvertedbreve", 0x0206},
{"Eiotifiedcyrillic", 0x0464}, {"Elcyrillic", 0x041B}, {"Elevenroman", 0x216A}, {"Emacron", 0x0112},
{"Emacronacute", 0x1E16}, {"Emacrongrave", 0x1E14}, {"Emcyrillic", 0x041C}, {"Encyrillic", 0x041D},
{"Endescendercyrillic", 0x04A2}, {"Eng", 0x014A}, {"Enghecyrillic", 0x04A4}, {"Enhookcyrillic", 0x04C7},
{"Eogonek", 0x0118}, {"Eopen", 0x0190}, {"Epsilon", 0x0395}, {"Epsilontonos", 0x0388},
{"Ercyrillic", 0x0420}, {"Ereversed", 0x018E}, {"Ereversedcyrillic", 0x042D}, {"Escyrillic", 0x0421},
{"Esdescendercyrillic", 0x04AA}, {"Esh", 0x01A9}, {"Esmall", 0xF765}, {"Eta", 0x0397},
{"Etatonos", 0x0389}, {"Eth", 0x00D0}, {"Ethsmall", 0xF7F0}, {"Etilde", 0x1EBC},
{"Etildebelow", 0x1E1A}, {"Euro", 0x20AC}, {"Ezh", 0x01B7}, {"Ezhcaron", 0x01EE},
{"Ezhreversed", 0x01B8}, {"F", 0x0046}, {"Fcircle", 0x24BB}, {"Fdotaccent", 0x1E1E},
{"Feicoptic", 0x03E4}, {"Fhook", 0x0191}, {"Fitacyrillic", 0x0472}, {"Fiveroman", 0x2164},
{"Fourroman", 0x2163}, {"Fsmall", 0xF766}, {"G", 0x0047}, {"Gacute", 0x01F4},
{"Gamma", 0x0393}, {"Gammaafrican", 0x0194}, {"Gangiacoptic", 0x03EA}, {"Gbreve", 0x011E},
{"Gcaron", 0x01E6}, {"Gcedilla", 0x0122}, {"Gcircle", 0x24BC}, {"Gcircumflex", 0x011C},
{"Gcommaaccent", 0x0122}, {"Gdot", 0x0120}, {"Gdotaccent", 0x0120}, {"Gecyrillic", 0x0413},
{"Ghemiddlehookcyrillic", 0x0494}, {"Ghestrokecyrillic", 0x0492}, {"Gheupturncyrillic", 0x0490}, {"Ghook", 0x0193},
{"Gjecyrillic", 0x0403}, {"Gmacron", 0x1E20}, {"Grave", 0xF6CE}, {"Gravesmall", 0xF760},
{"Gsmall", 0xF767}, {"Gsmallhook", 0x029B}, {"Gstroke", 0x01E4}, {"H", 0x0048},
{"H18533", 0x25CF}, {"H18543", 0x25AA}, {"H18551", 0x25AB}, {"H22073", 0x25A1},
{"Haabkhasiancyrillic", 0x04A8}, {"Hadescendercyrillic", 0x04B2}, {"Hardsigncyrillic", 0x042A}, {"Hbar", 0x0126},
{"Hbrevebelow", 0x1E2A}, {"Hcedilla", 0x1E28}, {"Hcircle", 0x24BD}, {"Hcircumflex", 0x0124},
{"Hdieresis", 0x1E26}, {"Hdotaccent", 0x1E22}, {"Hdotbelow", 0x1E24}, {"Horicoptic", 0x03E8},
{"Hsmall", 0xF768}, {"Hungarumlaut", 0xF6CF}, {"Hungarumlautsmall", 0xF6F8}, {"I", 0x0049},
{"IAcyrillic", 0x042F}, {"IJ", 0x0132}, {"IUcyrillic", 0x042E}, {"Iacute", 0x00CD},
{"Iacutesmall", 0xF7ED}, {"Ibreve", 0x012C}, {"Icaron", 0x01CF}, {"Icircle", 0x24BE},
{"Icircumflex", 0x00CE}, {"Icircumflexsmall", 0xF7EE}, {"Icyrillic", 0x0406}, {"Idblgrave", 0x0208},
{"Idieresis", 0x00CF}, {"Idieresisacute", 0x1E2E}, {"Idieresiscyrillic", 0x04E4}, {"Idieresissmall", 0xF7EF},
{"Idot", 0x0130}, {"Idotaccent", 0x0130}, {"Idotbelow", 0x1ECA}, {"Iebrevecyrillic", 0x04D6},
{"Iecyrillic", 0x0415}, {"Ifraktur", 0x2111}, {"Igrave", 0x00CC}, {"Igravesmall", 0xF7EC},
{"Ihookabove", 0x1EC8}, {"Iicyrillic", 0x0418}, {"Iinvertedbreve", 0x020A}, {"Iishortcyrillic", 0x0419},
{"Imacron", 0x012A}, {"Imacroncyrillic", 0x04E2}, {"Iocyrillic", 0x0401}, {"Iogonek", 0x012E},
{"Iota", 0x0399}, {"Iotaafrican", 0x0196}, {"Iotadieresis", 0x03AA}, {"Iotatonos", 0x038A},
{"Ismall", 0xF769}, {"Istroke", 0x0197}, {"Itilde", 0x0128}, {"Itildebelow", 0x1E2C},
{"Izhitsacyrillic", 0x0474}, {"Izhitsadblgravecyrillic", 0x0476}, {"J", 0x004A}, {"Jcircle", 0x24BF},
{"Jcircumflex", 0x0134}, {"Jecyrillic", 0x0408}, {"Jsmall", 0xF76A}, {"K", 0x004B},
{"Kabashkircyrillic", 0x04A0}, {"Kacute", 0x1E30}, {"Kacyrillic", 0x041A}, {"Kadescendercyrillic", 0x049A},
{"Kahookcyrillic", 0x04C3}, {"Kappa", 0x039A}, {"Kastrokecyrillic", 0x049E}, {"Kaverticalstrokecyrillic", 0x049C},
{"Kcaron", 0x01E8}, {"Kcedilla", 0x0136}, {"Kcircle", 0x24C0}, {"Kcommaaccent", 0x0136},
{"Kdotbelow", 0x1E32}, {"Khacyrillic", 0x0425}, {"Kheicoptic", 0x03E6}, {"Khook", 0x0198},
{"Kjecyrillic", 0x040C}, {"Klinebelow", 0x1E34}, {"Koppacyrillic", 0x0480}, {"Koppagreek", 0x03DE},
{"Ksicyrillic", 0x046E}, {"Ksmall", 0xF76B}, {"L", 0x004C}, {"LJ", 0x01C7},
{"LL", 0xF6BF}, {"Lacute", 0x0139}, {"Lambda", 0x039B}, {"Lcaron", 0x013D},
{"Lcedilla", 0x013B}, {"Lcircle", 0x24C1}, {"Lcircumflexbelow", 0x1E3C}, {"Lcommaaccent", 0x013B},
{"Ldot", 0x013F}, {"Ldotaccent", 0x013F}, {"Ldotbelow", 0x1E36}, {"Ldotbelowmacron", 0x1E38},
{"Lj", 0x01C8}, {"Ljecyrillic", 0x0409}, {"Llinebelow", 0x1E3A}, {"Lslash", 0x0141},
{"Lslashsmall", 0xF6F9}, {"Lsmall", 0xF76C}, {"M", 0x004D}, {"Macron", 0xF6D0},
{"Macronsmall", 0xF7AF}, {"Macute", 0x1E3E}, {"Mcircle", 0x24C2}, {"Mdotaccent", 0x1E40},
{"Mdotbelow", 0x1E42}, {"Msmall", 0xF76D}, {"Mturned", 0x019C}, {"Mu", 0x039C},
{"N", 0x004E}, {"NJ", 0x01CA}, {"Nacute", 0x0143}, {"Ncaron", 0x0147},
{"Ncedilla", 0x0145}, {"Ncircle", 0x24C3}, {"Ncircumflexbelow", 0x1E4A}, {"Ncommaaccent", 0x0145},
{"Ndotaccent", 0x1E44}, {"Ndotbelow", 0x1E46}, {"Nhookleft", 0x019D}, {"Nineroman", 0x2168},
{"Nj", 0x01CB}, {"Njecyrillic", 0x040A}, {"Nlinebelow", 0x1E48}, {"Nsmall", 0xF76E},
{"Ntilde", 0x00D1}, {"Ntildesmall", 0xF7F1}, {"Nu", 0x039D}, {"O", 0x004F},
{"OE", 0x0152}, {"OEsmall", 0xF6FA}, {"Oacute", 0x00D3}, {"Oacutesmall", 0xF7F3},
{"Obarredcyrillic", 0x04E8}, {"Obarreddieresiscyrillic", 0x04EA}, {"Obreve", 0x014E}, {"Ocaron", 0x01D1},
{"Ocenteredtilde", 0x019F}, {"Ocircle", 0x24C4}, {"Ocircumflex", 0x00D4}, {"Ocircumflexacute", 0x1ED0},
{"Ocircumflexdotbelow", 0x1ED8}, {"Ocircumflexgrave", 0x1ED2}, {"Ocircumflexhookabove", 0x1ED4}, {"Ocircumflexsmall", 0xF7F4},
{"Ocircumflextilde", 0x1ED6}, {"Ocyrillic", 0x041E}, {"Odblacute", 0x0150}, {"Odblgrave", 0x020C},
{"Odieresis", 0x00D6}, {"Odieresiscyrillic", 0x04E6}, {"Odieresissmall", 0xF7F6}, {"Odotbelow", 0x1ECC},
{"Ogoneksmall", 0xF6FB}, {"Ograve", 0x00D2}, {"Ogravesmall", 0xF7F2}, {"Ohm", 0x2126},
{"Ohookabove", 0x1ECE}, {"Ohorn", 0x01A0}, {"Ohornacute", 0x1EDA}, {"Ohorndotbelow", 0x1EE2},
{"Ohorngrave", 0x1EDC}, {"Ohornhookabove", 0x1EDE}, {"Ohorntilde", 0x1EE0}, {"Ohungarumlaut", 0x0150},
{"Oi", 0x01A2}, {"Oinvertedbreve", 0x020E}, {"Omacron", 0x014C}, {"Omacronacute", 0x1E52},
{"Omacrongrave", 0x1E50}, {"Omega", 0x2126}, {"Omegacyrillic", 0x0460}, {"Omegagreek", 0x03A9},
{"Omegaroundcyrillic", 0x047A}, {"Omegatitlocyrillic", 0x047C}, {"Omegatonos", 0x038F}, {"Omicron", 0x039F},
{"Omicrontonos", 0x038C}, {"Oneroman", 0x2160}, {"Oogonek", 0x01EA}, {"Oogonekmacron", 0x01EC},
{"Oopen", 0x0186}, {"Oslash", 0x00D8}, {"Oslashacute", 0x01FE}, {"Oslashsmall", 0xF7F8},
{"Osmall", 0xF76F}, {"Ostrokeacute", 0x01FE}, {"Otcyrillic", 0x047E}, {"Otilde", 0x00D5},
{"Otildeacute", 0x1E4C}, {"Otildedieresis", 0x1E4E}, {"Otildesmall", 0xF7F5}, {"P", 0x0050},
{"Pacute", 0x1E54}, {"Pcircle", 0x24C5}, {"Pdotaccent", 0x1E56}, {"Pecyrillic", 0x041F},
{"Pemiddlehookcyrillic", 0x04A6}, {"Phi", 0x03A6}, {"Phook", 0x01A4}, {"Pi", 0x03A0},
{"Psi", 0x03A8}, {"Psicyrillic", 0x0470}, {"Psmall", 0xF770}, {"Q", 0x0051},
{"Qcircle", 0x24C6}, {"Qsmall", 0xF771}, {"R", 0x0052}, {"Racute", 0x0154},
{"Rcaron", 0x0158}, {"Rcedilla", 0x0156}, {"Rcircle", 0x24C7}, {"Rcommaaccent", 0x0156},
{"Rdblgrave", 0x0210}, {"Rdotaccent", 0x1E58}, {"Rdotbelow", 0x1E5A}, {"Rdotbelowmacron", 0x1E5C},
{"Rfraktur", 0x211C}, {"Rho", 0x03A1}, {"Ringsmall", 0xF6FC}, {"Rinvertedbreve", 0x0212},
{"Rlinebelow", 0x1E5E}, {"Rsmall", 0xF772}, {"Rsmallinverted", 0x0281}, {"Rsmallinvertedsuperior", 0x02B6},
{"S", 0x0053}, {"SF010000", 0x250C}, {"SF020000", 0x2514}, {"SF030000", 0x2510},
{"SF040000", 0x2518}, {"SF050000", 0x253C}, {"SF060000", 0x252C}, {"SF070000", 0x2534},
{"SF080000", 0x251C}, {"SF090000", 0x2524}, {"SF100000", 0x2500}, {"SF110000", 0x2502},
{"SF190000", 0x2561}, {"SF200000", 0x2562}, {"SF210000", 0x2556}, {"SF220000", 0x2555},
{"SF230000", 0x2563}, {"SF240000", 0x2551}, {"SF250000", 0x2557}, {"SF260000", 0x255D},
{"SF270000", 0x255C}, {"SF280000", 0x255B}, {"SF360000", 0x255E}, {"SF370000", 0x255F},
{"SF380000", 0x255A}, {"SF390000", 0x2554}, {"SF400000", 0x2569}, {"SF410000", 0x2566},
{"SF420000", 0x2560}, {"SF430000", 0x2550}, {"SF440000", 0x256C}, {"SF450000", 0x2567},
{"SF460000", 0x2568}, {"SF470000", 0x2564}, {"SF480000", 0x2565}, {"SF490000", 0x2559},
{"SF500000", 0x2558}, {"SF510000", 0x2552}, {"SF520000", 0x2553}, {"SF530000", 0x256B},
{"SF540000", 0x256A}, {"Sacute", 0x015A}, {"Sacutedotaccent", 0x1E64}, {"Sampigreek", 0x03E0},
{"Scaron", 0x0160}, {"Scarondotaccent", 0x1E66}, {"Scaronsmall", 0xF6FD}, {"Scedilla", 0x015E},
{"Schwa", 0x018F}, {"Schwacyrillic", 0x04D8}, {"Schwadieresiscyrillic", 0x04DA}, {"Scircle", 0x24C8},
{"Scircumflex", 0x015C}, {"Scommaaccent", 0x0218}, {"Sdotaccent", 0x1E60}, {"Sdotbelow", 0x1E62},
{"Sdotbelowdotaccent", 0x1E68}, {"Sevenroman", 0x2166}, {"Shacyrillic", 0x0428}, {"Shchacyrillic", 0x0429},
{"Sheicoptic", 0x03E2}, {"Shhacyrillic", 0x04BA}, {"Shimacoptic", 0x03EC}, {"Sigma", 0x03A3},
{"Sixroman", 0x2165}, {"Softsigncyrillic", 0x042C}, {"Ssmall", 0xF773}, {"Stigmagreek", 0x03DA},
{"T", 0x0054}, {"Tau", 0x03A4}, {"Tbar", 0x0166}, {"Tcaron", 0x0164},
{"Tcedilla", 0x0162}, {"Tcircle", 0x24C9}, {"Tcircumflexbelow", 0x1E70}, {"Tcommaaccent", 0x0162},
{"Tdotaccent", 0x1E6A}, {"Tdotbelow", 0x1E6C}, {"Tecyrillic", 0x0422}, {"Tedescendercyrillic", 0x04AC},
{"Tenroman", 0x2169}, {"Tetsecyrillic", 0x04B4}, {"Theta", 0x0398}, {"Thook", 0x01AC},
{"Thorn", 0x00DE}, {"Thornsmall", 0xF7FE}, {"Threeroman", 0x2162}, {"Tildesmall", 0xF6FE},
{"Tlinebelow", 0x1E6E}, {"Tonefive", 0x01BC}, {"Tonesix", 0x0184}, {"Tonetwo", 0x01A7},
{"Tretroflexhook", 0x01AE}, {"Tsecyrillic", 0x0426}, {"Tshecyrillic", 0x040B}, {"Tsmall", 0xF774},
{"Twelveroman", 0x216B}, {"Tworoman", 0x2161}, {"U", 0x0055}, {"Uacute", 0x00DA},
{"Uacutesmall", 0xF7FA}, {"Ubreve", 0x016C}, {"Ucaron", 0x01D3}, {"Ucircle", 0x24CA},
{"Ucircumflex", 0x00DB}, {"Ucircumflexbelow", 0x1E76}, {"Ucircumflexsmall", 0xF7FB}, {"Ucyrillic", 0x0423},
{"Udblacute", 0x0170}, {"Udblgrave", 0x0214}, {"Udieresis", 0x00DC}, {"Udieresisacute", 0x01D7},
{"Udieresisbelow", 0x1E72}, {"Udieresiscaron", 0x01D9}, {"Udieresiscyrillic", 0x04F0}, {"Udieresisgrave", 0x01DB},
{"Udieresismacron", 0x01D5}, {"Udieresissmall", 0xF7FC}, {"Udotbelow", 0x1EE4}, {"Ugrave", 0x00D9},
{"Ugravesmall", 0xF7F9}, {"Uhookabove", 0x1EE6}, {"Uhorn", 0x01AF}, {"Uhornacute", 0x1EE8},
{"Uhorndotbelow", 0x1EF0}, {"Uhorngrave", 0x1EEA}, {"Uhornhookabove", 0x1EEC}, {"Uhorntilde", 0x1EEE},
{"Uhungarumlaut", 0x0170}, {"Uhungarumlautcyrillic", 0x04F2}, {"Uinvertedbreve", 0x0216}, {"Ukcyrillic", 0x0478},
{"Umacron", 0x016A}, {"Umacroncyrillic", 0x04EE}, {"Umacrondieresis", 0x1E7A}, {"Uogonek", 0x0172},
{"Upsilon", 0x03A5}, {"Upsilon1", 0x03D2}, {"Upsilonacutehooksymbolgreek", 0x03D3}, {"Upsilonafrican", 0x01B1},
{"Upsilondieresis", 0x03AB}, {"Upsilondieresishooksymbolgreek", 0x03D4}, {"Upsilonhooksymbol", 0x03D2}, {"Upsilontonos", 0x038E},
{"Uring", 0x016E}, {"Ushortcyrillic", 0x040E}, {"Usmall", 0xF775}, {"Ustraightcyrillic", 0x04AE},
{"Ustraightstrokecyrillic", 0x04B0}, {"Utilde", 0x0168}, {"Utildeacute", 0x1E78}, {"Utildebelow", 0x1E74},
{"V", 0x0056}, {"Vcircle", 0x24CB}, {"Vdotbelow", 0x1E7E}, {"Vecyrillic", 0x0412},
{"Vhook", 0x01B2}, {"Vsmall", 0xF776}, {"Vtilde", 0x1E7C}, {"W", 0x0057},
{"Wacute", 0x1E82}, {"Wcircle", 0x24CC}, {"Wcircumflex", 0x0174}, {"Wdieresis", 0x1E84},
{"Wdotaccent", 0x1E86}, {"Wdotbelow", 0x1E88}, {"Wgrave", 0x1E80}, {"Wsmall", 0xF777},
{"X", 0x0058}, {"Xcircle", 0x24CD}, {"Xdieresis", 0x1E8C}, {"Xdotaccent", 0x1E8A},
{"Xi", 0x039E}, {"Xsmall", 0xF778}, {"Y", 0x0059}, {"Yacute", 0x00DD},
{"Yacutesmall", 0xF7FD}, {"Yatcyrillic", 0x0462}, {"Ycircle", 0x24CE}, {"Ycircumflex", 0x0176},
{"Ydieresis", 0x0178}, {"Ydieresissmall", 0xF7FF}, {"Ydotaccent", 0x1E8E}, {"Ydotbelow", 0x1EF4},
{"Yericyrillic", 0x042B}, {"Yerudieresiscyrillic", 0x04F8}, {"Ygrave", 0x1EF2}, {"Yhook", 0x01B3},
{"Yhookabove", 0x1EF6}, {"Yicyrillic", 0x0407}, {"Ysmall", 0xF779}, {"Ytilde", 0x1EF8},
{"Yusbigcyrillic", 0x046A}, {"Yusbigiotifiedcyrillic", 0x046C}, {"Yuslittlecyrillic", 0x0466}, {"Yuslittleiotifiedcyrillic", 0x0468},
{"Z", 0x005A}, {"Zacute", 0x0179}, {"Zcaron", 0x017D}, {"Zcaronsmall", 0xF6FF},
{"Zcircle", 0x24CF}, {"Zcircumflex", 0x1E90}, {"Zdot", 0x017B}, {"Zdotaccent", 0x017B},
{"Zdotbelow", 0x1E92}, {"Zecyrillic", 0x0417}, {"Zedescendercyrillic", 0x0498}, {"Zedieresiscyrillic", 0x04DE},
{"Zeta", 0x0396}, {"Zhebrevecyrillic", 0x04C1}, {"Zhecyrillic", 0x0416}, {"Zhedescendercyrillic", 0x0496},
{"Zhedieresiscyrillic", 0x04DC}, {"Zlinebelow", 0x1E94}, {"Zsmall", 0xF77A}, {"Zstroke", 0x01B5},
{"a", 0x0061}, {"a1", 0x2701}, {"a10", 0x2721}, {"a100", 0x275E},
{"a101", 0x2761}, {"a102", 0x2762}, {"a103", 0x2763}, {"a104", 0x2764},
{"a105", 0x2710}, {"a106", 0x2765}, {"a107", 0x2766}, {"a108", 0x2767},
{"a109", 0x2660}, {"a11", 0x261B}, {"a110", 0x2665}, {"a111", 0x2666},
{"a112", 0x2663}, {"a117", 0x2709}, {"a118", 0x2708}, {"a119", 0x2707},
{"a12", 0x261E}, {"a120", 0x2460}, {"a121", 0x2461}, {"a122", 0x2462},
{"a123", 0x2463}, {"a124", 0x2464}, {"a125", 0x2465}, {"a126", 0x2466},
{"a127", 0x2467}, {"a128", 0x2468}, {"a129", 0x2469}, {"a13", 0x270C},
{"a130", 0x2776}, {"a131", 0x2777}, {"a132", 0x2778}, {"a133", 0x2779},
{"a134", 0x277A}, {"a135", 0x277B}, {"a136", 0x277C}, {"a137", 0x277D},
{"a138", 0x277E}, {"a139", 0x277F}, {"a14", 0x270D}, {"a140", 0x2780},
{"a141", 0x2781}, {"a142", 0x2782}, {"a143", 0x2783}, {"a144", 0x2784},
{"a145", 0x2785}, {"a146", 0x2786}, {"a147", 0x2787}, {"a148", 0x2788},
{"a149", 0x2789}, {"a15", 0x270E}, {"a150", 0x278A}, {"a151", 0x278B},
{"a152", 0x278C}, {"a153", 0x278D}, {"a154", 0x278E}, {"a155", 0x278F},
{"a156", 0x2790}, {"a157", 0x2791}, {"a158", 0x2792}, {"a159", 0x2793},
{"a16", 0x270F}, {"a160", 0x2794}, {"a161", 0x2192}, {"a162", 0x27A3},
{"a163", 0x2194}, {"a164", 0x2195}, {"a165", 0x2799}, {"a166", 0x279B},
{"a167", 0x279C}, {"a168", 0x279D}, {"a169", 0x279E}, {"a17", 0x2711},
{"a170", 0x279F}, {"a171", 0x27A0}, {"a172", 0x27A1}, {"a173", 0x27A2},
{"a174", 0x27A4}, {"a175", 0x27A5}, {"a176", 0x27A6}, {"a177", 0x27A7},
{"a178", 0x27A8}, {"a179", 0x27A9}, {"a18", 0x2712}, {"a180", 0x27AB},
{"a181", 0x27AD}, {"a182", 0x27AF}, {"a183", 0x27B2}, {"a184", 0x27B3},
{"a185", 0x27B5}, {"a186", 0x27B8}, {"a187", 0x27BA}, {"a188", 0x27BB},
{"a189", 0x27BC}, {"a19", 0x2713}, {"a190", 0x27BD}, {"a191", 0x27BE},
{"a192", 0x279A}, {"a193", 0x27AA}, {"a194", 0x27B6}, {"a195", 0x27B9},
{"a196", 0x2798}, {"a197", 0x27B4}, {"a198", 0x27B7}, {"a199", 0x27AC},
{"a2", 0x2702}, {"a20", 0x2714}, {"a200", 0x27AE}, {"a201", 0x27B1},
{"a202", 0x2703}, {"a203", 0x2750}, {"a204", 0x2752}, {"a205", 0x276E},
{"a206", 0x2770}, {"a21", 0x2715}, {"a22", 0x2716}, {"a23", 0x2717},
{"a24", 0x2718}, {"a25", 0x2719}, {"a26", 0x271A}, {"a27", 0x271B},
{"a28", 0x271C}, {"a29", 0x2722}, {"a3", 0x2704}, {"a30", 0x2723},
{"a31", 0x2724}, {"a32", 0x2725}, {"a33", 0x2726}, {"a34", 0x2727},
{"a35", 0x2605}, {"a36", 0x2729}, {"a37", 0x272A}, {"a38", 0x272B},
{"a39", 0x272C}, {"a4", 0x260E}, {"a40", 0x272D}, {"a41", 0x272E},
{"a42", 0x272F}, {"a43", 0x2730}, {"a44", 0x2731}, {"a45", 0x2732},
{"a46", 0x2733}, {"a47", 0x2734}, {"a48", 0x2735}, {"a49", 0x2736},
{"a5", 0x2706}, {"a50", 0x2737}, {"a51", 0x2738}, {"a52", 0x2739},
{"a53", 0x273A}, {"a54", 0x273B}, {"a55", 0x273C}, {"a56", 0x273D},
{"a57", 0x273E}, {"a58", 0x273F}, {"a59", 0x2740}, {"a6", 0x271D},
{"a60", 0x2741}, {"a61", 0x2742}, {"a62", 0x2743}, {"a63", 0x2744},
{"a64", 0x2745}, {"a65", 0x2746}, {"a66", 0x2747}, {"a67", 0x2748},
{"a68", 0x2749}, {"a69", 0x274A}, {"a7", 0x271E}, {"a70", 0x274B},
{"a71", 0x25CF}, {"a72", 0x274D}, {"a73", 0x25A0}, {"a74", 0x274F},
{"a75", 0x2751}, {"a76", 0x25B2}, {"a77", 0x25BC}, {"a78", 0x25C6},
{"a79", 0x2756}, {"a8", 0x271F}, {"a81", 0x25D7}, {"a82", 0x2758},
{"a83", 0x2759}, {"a84", 0x275A}, {"a85", 0x276F}, {"a86", 0x2771},
{"a87", 0x2772}, {"a88", 0x2773}, {"a89", 0x2768}, {"a9", 0x2720},
{"a90", 0x2769}, {"a91", 0x276C}, {"a92", 0x276D}, {"a93", 0x276A},
{"a94", 0x276B}, {"a95", 0x2774}, {"a96", 0x2775}, {"a97", 0x275B},
{"a98", 0x275C}, {"a99", 0x275D}, {"aacute", 0x00E1}, {"abreve", 0x0103},
{"abreveacute", 0x1EAF}, {"abrevecyrillic", 0x04D1}, {"abrevedotbelow", 0x1EB7}, {"abrevegrave", 0x1EB1},
{"abrevehookabove", 0x1EB3}, {"abrevetilde", 0x1EB5}, {"acaron", 0x01CE}, {"acircle", 0x24D0},
{"acircumflex", 0x00E2}, {"acircumflexacute", 0x1EA5}, {"acircumflexdotbelow", 0x1EAD}, {"acircumflexgrave", 0x1EA7},
{"acircumflexhookabove", 0x1EA9}, {"acircumflextilde", 0x1EAB}, {"acute", 0x00B4}, {"acutebelowcmb", 0x0317},
{"acutecmb", 0x0301}, {"acutecomb", 0x0301}, {"acutelowmod", 0x02CF}, {"acutetonecmb", 0x0341},
{"acyrillic", 0x0430}, {"adblgrave", 0x0201}, {"adieresis", 0x00E4}, {"adieresiscyrillic", 0x04D3},
{"adieresismacron", 0x01DF}, {"adotbelow", 0x1EA1}, {"adotmacron", 0x01E1}, {"ae", 0x00E6},
{"aeacute", 0x01FD}, {"aemacron", 0x01E3}, {"afii00208", 0x2015}, {"afii08941", 0x20A4},
{"afii10017", 0x0410}, {"afii10018", 0x0411}, {"afii10019", 0x0412}, {"afii10020", 0x0413},
{"afii10021", 0x0414}, {"afii10022", 0x0415}, {"afii10023", 0x0401}, {"afii10024", 0x0416},
{"afii10025", 0x0417}, {"afii10026", 0x0418}, {"afii10027", 0x0419}, {"afii10028", 0x041A},
{"afii10029", 0x041B}, {"afii10030", 0x041C}, {"afii10031", 0x041D}, {"afii10032", 0x041E},
{"afii10033", 0x041F}, {"afii10034", 0x0420}, {"afii10035", 0x0421}, {"afii10036", 0x0422},
{"afii10037", 0x0423}, {"afii10038", 0x0424}, {"afii10039", 0x0425}, {"afii10040", 0x0426},
{"afii10041", 0x0427}, {"afii10042", 0x0428}, {"afii10043", 0x0429}, {"afii10044", 0x042A},
{"afii10045", 0x042B}, {"afii10046", 0x042C}, {"afii10047", 0x042D}, {"afii10048", 0x042E},
{"afii10049", 0x042F}, {"afii10050", 0x0490}, {"afii10051", 0x0402}, {"afii10052", 0x0403},
{"afii10053", 0x0404}, {"afii10054", 0x0405}, {"afii10055", 0x0406}, {"afii10056", 0x0407},
{"afii10057", 0x0408}, {"afii10058", 0x0409}, {"afii10059", 0x040A}, {"afii10060", 0x040B},
{"afii10061", 0x040C}, {"afii10062", 0x040E}, {"afii10063", 0xF6C4}, {"afii10064", 0xF6C5},
{"afii10065", 0x0430}, {"afii10066", 0x0431}, {"afii10067", 0x0432}, {"afii10068", 0x0433},
{"afii10069", 0x0434}, {"afii10070", 0x0435}, {"afii10071", 0x0451}, {"afii10072", 0x0436},
{"afii10073", 0x0437}, {"afii10074", 0x0438}, {"afii10075", 0x0439}, {"afii10076", 0x043A},
{"afii10077", 0x043B}, {"afii10078", 0x043C}, {"afii10079", 0x043D}, {"afii10080", 0x043E},
{"afii10081", 0x043F}, {"afii10082", 0x0440}, {"afii10083", 0x0441}, {"afii10084", 0x0442},
{"afii10085", 0x0443}, {"afii10086", 0x0444}, {"afii10087", 0x0445}, {"afii10088", 0x0446},
{"afii10089", 0x0447}, {"afii10090", 0x0448}, {"afii10091", 0x0449}, {"afii10092", 0x044A},
{"afii10093", 0x044B}, {"afii10094", 0x044C}, {"afii10095", 0x044D}, {"afii10096", 0x044E},
{"afii10097", 0x044F}, {"afii10098", 0x0491}, {"afii10099", 0x0452}, {"afii10100", 0x0453},
{"afii10101", 0x0454}, {"afii10102", 0x0455}, {"afii10103", 0x0456}, {"afii10104", 0x0457},
{"afii10105", 0x0458}, {"afii10106", 0x0459}, {"afii10107", 0x045A}, {"afii10108", 0x045B},
{"afii10109", 0x045C}, {"afii10110", 0x045E}, {"afii10145", 0x040F}, {"afii10146", 0x0462},
{"afii10147", 0x0472}, {"afii10148", 0x0474}, {"afii10192", 0xF6C6}, {"afii10193", 0x045F},
{"afii10194", 0x0463}, {"afii10195", 0x0473}, {"afii10196", 0x0475}, {"afii10831", 0xF6C7},
{"afii10832", 0xF6C8}, {"afii10846", 0x04D9}, {"afii299", 0x200E}, {"afii300", 0x200F},
{"afii301", 0x200D}, {"afii57636", 0x20AA}, {"afii57705", 0xFB1F}, {"afii57929", 0x02BC},
{"afii61248", 0x2105}, {"afii61289", 0x2113}, {"afii61352", 0x2116}, {"afii61573", 0x202C},
{"afii61574", 0x202D}, {"afii61575", 0x202E}, {"afii61664", 0x200C}, {"afii64937", 0x02BD},
{"agrave", 0x00E0}, {"ahookabove", 0x1EA3}, {"aiecyrillic", 0x04D5}, {"ainvertedbreve", 0x0203},
{"aleph", 0x2135}, {"allequal", 0x224C}, {"alpha", 0x03B1}, {"alphatonos", 0x03AC},
{"amacron", 0x0101}, {"ampersand", 0x0026}, {"ampersandsmall", 0xF726}, {"angle", 0x2220},
{"angleleft", 0x2329}, {"angleright", 0x232A}, {"angstrom", 0x212B}, {"anoteleia", 0x0387},
{"aogonek", 0x0105}, {"aparen", 0x249C}, {"apostrophemod", 0x02BC}, {"apple", 0xF8FF},
{"approaches", 0x2250}, {"approxequal", 0x2248}, {"approxequalorimage", 0x2252}, {"approximatelyequal", 0x2245},
{"arc", 0x2312}, {"arighthalfring", 0x1E9A}, {"aring", 0x00E5}, {"aringacute", 0x01FB},
{"aringbelow", 0x1E01}, {"arrowboth", 0x2194}, {"arrowdashdown", 0x21E3}, {"arrowdashleft", 0x21E0},
{"arrowdashright", 0x21E2}, {"arrowdashup", 0x21E1}, {"arrowdblboth", 0x21D4}, {"arrowdbldown", 0x21D3},
{"arrowdblleft", 0x21D0}, {"arrowdblright", 0x21D2}, {"arrowdblup", 0x21D1}, {"arrowdown", 0x2193},
{"arrowdownleft", 0x2199}, {"arrowdownright", 0x2198}, {"arrowdownwhite", 0x21E9}, {"arrowheaddownmod", 0x02C5},
{"arrowheadleftmod", 0x02C2}, {"arrowheadrightmod", 0x02C3}, {"arrowheadupmod", 0x02C4}, {"arrowhorizex", 0xF8E7},
{"arrowleft", 0x2190}, {"arrowleftdbl", 0x21D0}, {"arrowleftdblstroke", 0x21CD}, {"arrowleftoverright", 0x21C6},
{"arrowleftwhite", 0x21E6}, {"arrowright", 0x2192}, {"arrowrightdblstroke", 0x21CF}, {"arrowrightheavy", 0x279E},
{"arrowrightoverleft", 0x21C4}, {"arrowrightwhite", 0x21E8}, {"arrowtableft", 0x21E4}, {"arrowtabright", 0x21E5},
{"arrowup", 0x2191}, {"arrowupdn", 0x2195}, {"arrowupdnbse", 0x21A8}, {"arrowupdownbase", 0x21A8},
{"arrowupleft", 0x2196}, {"arrowupleftofdown", 0x21C5}, {"arrowupright", 0x2197}, {"arrowupwhite", 0x21E7},
{"arrowvertex", 0xF8E6}, {"asciicircum", 0x005E}, {"asciitilde", 0x007E}, {"ascript", 0x0251},
{"ascriptturned", 0x0252}, {"asterisk", 0x002A}, {"asteriskmath", 0x2217}, {"asterism", 0x2042},
{"asuperior", 0xF6E9}, {"asymptoticallyequal", 0x2243}, {"at", 0x0040}, {"atilde", 0x00E3},
{"aturned", 0x0250}, {"b", 0x0062}, {"backslash", 0x005C}, {"bar", 0x007C},
{"bcircle", 0x24D1}, {"bdotaccent", 0x1E03}, {"bdotbelow", 0x1E05}, {"beamedsixteenthnotes", 0x266C},
{"because", 0x2235}, {"becyrillic", 0x0431}, {"beta", 0x03B2}, {"betasymbolgreek", 0x03D0},
{"bhook", 0x0253}, {"bilabialclick", 0x0298}, {"blackcircle", 0x25CF}, {"blackdiamond", 0x25C6},
{"blackdownpointingtriangle", 0x25BC}, {"blackleftpointingpointer", 0x25C4}, {"blackleftpointingtriangle", 0x25C0}, {"blacklowerlefttriangle", 0x25E3},
{"blacklowerrighttriangle", 0x25E2}, {"blackrectangle", 0x25AC}, {"blackrightpointingpointer", 0x25BA}, {"blackrightpointingtriangle", 0x25B6},
{"blacksmallsquare", 0x25AA}, {"blacksmilingface", 0x263B}, {"blacksquare", 0x25A0}, {"blackstar", 0x2605},
{"blackupperlefttriangle", 0x25E4}, {"blackupperrighttriangle", 0x25E5}, {"blackuppointingsmalltriangle", 0x25B4}, {"blackuppointingtriangle", 0x25B2},
{"blank", 0x2423}, {"blinebelow", 0x1E07}, {"block", 0x2588}, {"bparen", 0x249D},
{"braceex", 0xF8F4}, {"braceleft", 0x007B}, {"braceleftbt", 0xF8F3}, {"braceleftmid", 0xF8F2},
{"bracelefttp", 0xF8F1}, {"braceright", 0x007D}, {"bracerightbt", 0xF8FE}, {"bracerightmid", 0xF8FD},
{"bracerighttp", 0xF8FC}, {"bracketleft", 0x005B}, {"bracketleftbt", 0xF8F0}, {"bracketleftex", 0xF8EF},
{"bracketlefttp", 0xF8EE}, {"bracketright", 0x005D}, {"bracketrightbt", 0xF8FB}, {"bracketrightex", 0xF8FA},
{"bracketrighttp", 0xF8F9}, {"breve", 0x02D8}, {"brevebelowcmb", 0x032E}, {"brevecmb", 0x0306},
{"breveinvertedbelowcmb", 0x032F}, {"breveinvertedcmb", 0x0311}, {"breveinverteddoublecmb", 0x0361}, {"bridgebelowcmb", 0x032A},
{"bridgeinvertedbelowcmb", 0x033A}, {"brokenbar", 0x00A6}, {"bstroke", 0x0180}, {"bsuperior", 0xF6EA},
{"btopbar", 0x0183}, {"bullet", 0x2022}, {"bulletinverse", 0x25D8}, {"bulletoperator", 0x2219},
{"bullseye", 0x25CE}, {"c", 0x0063}, {"cacute", 0x0107}, {"candrabinducmb", 0x0310},
{"capslock", 0x21EA}, {"careof", 0x2105}, {"caron", 0x02C7}, {"caronbelowcmb", 0x032C},
{"caroncmb", 0x030C}, {"carriagereturn", 0x21B5}, {"ccaron", 0x010D}, {"ccedilla", 0x00E7},
{"ccedillaacute", 0x1E09}, {"ccircle", 0x24D2}, {"ccircumflex", 0x0109}, {"ccurl", 0x0255},
{"cdot", 0x010B}, {"cdotaccent", 0x010B}, {"cedilla", 0x00B8}, {"cedillacmb", 0x0327},
{"cent", 0x00A2}, {"centigrade", 0x2103}, {"centinferior", 0xF6DF}, {"centoldstyle", 0xF7A2},
{"centsuperior", 0xF6E0}, {"cheabkhasiancyrillic", 0x04BD}, {"checkmark", 0x2713}, {"checyrillic", 0x0447},
{"chedescenderabkhasiancyrillic", 0x04BF}, {"chedescendercyrillic", 0x04B7}, {"chedieresiscyrillic", 0x04F5}, {"chekhakassiancyrillic", 0x04CC},
{"cheverticalstrokecyrillic", 0x04B9}, {"chi", 0x03C7}, {"chook", 0x0188}, {"circle", 0x25CB},
{"circlemultiply", 0x2297}, {"circleot", 0x2299}, {"circleplus", 0x2295}, {"circlewithlefthalfblack", 0x25D0},
{"circlewithrighthalfblack", 0x25D1}, {"circumflex", 0x02C6}, {"circumflexbelowcmb", 0x032D}, {"circumflexcmb", 0x0302},
{"clear", 0x2327}, {"clickalveolar", 0x01C2}, {"clickdental", 0x01C0}, {"clicklateral", 0x01C1},
{"clickretroflex", 0x01C3}, {"club", 0x2663}, {"clubsuitblack", 0x2663}, {"clubsuitwhite", 0x2667},
{"colon", 0x003A}, {"colonmonetary", 0x20A1}, {"colonsign", 0x20A1}, {"colontriangularhalfmod", 0x02D1},
{"colontriangularmod", 0x02D0}, {"comma", 0x002C}, {"commaabovecmb", 0x0313}, {"commaaboverightcmb", 0x0315},
{"commaaccent", 0xF6C3}, {"commainferior", 0xF6E1}, {"commareversedabovecmb", 0x0314}, {"commareversedmod", 0x02BD},
{"commasuperior", 0xF6E2}, {"commaturnedabovecmb", 0x0312}, {"commaturnedmod", 0x02BB}, {"compass", 0x263C},
{"congruent", 0x2245}, {"contourintegral", 0x222E}, {"control", 0x2303}, {"controlACK", 0x0006},
{"controlBEL", 0x0007}, {"controlBS", 0x0008}, {"controlCAN", 0x0018}, {"controlCR", 0x000D},
{"controlDC1", 0x0011}, {"controlDC2", 0x0012}, {"controlDC3", 0x0013}, {"controlDC4", 0x0014},
{"controlDEL", 0x007F}, {"controlDLE", 0x0010}, {"controlEM", 0x0019}, {"controlENQ", 0x0005},
{"controlEOT", 0x0004}, {"controlESC", 0x001B}, {"controlETB", 0x0017}, {"controlETX", 0x0003},
{"controlFF", 0x000C}, {"controlFS", 0x001C}, {"controlGS", 0x001D}, {"controlHT", 0x0009},
{"controlLF", 0x000A}, {"controlNAK", 0x0015}, {"controlRS", 0x001E}, {"controlSI", 0x000F},
{"controlSO", 0x000E}, {"controlSOT", 0x0002}, {"controlSTX", 0x0001}, {"controlSUB", 0x001A},
{"controlSYN", 0x0016}, {"controlUS", 0x001F}, {"controlVT", 0x000B}, {"copyright", 0x00A9},
{"copyrightsans", 0xF8E9}, {"copyrightserif", 0xF6D9}, {"cparen", 0x249E}, {"cruzeiro", 0x20A2},
{"cstretched", 0x0297}, {"curlyand", 0x22CF}, {"curlyor", 0x22CE}, {"currency", 0x00A4},
{"cyrBreve", 0xF6D1}, {"cyrFlex", 0xF6D2}, {"cyrbreve", 0xF6D4}, {"cyrflex", 0xF6D5},
{"d", 0x0064}, {"dagger", 0x2020}, {"daggerdbl", 0x2021}, {"dasiapneumatacyrilliccmb", 0x0485},
{"dblGrave", 0xF6D3}, {"dblarchinvertedbelowcmb", 0x032B}, {"dblarrowleft", 0x21D4}, {"dblarrowright", 0x21D2},
{"dblgrave", 0xF6D6}, {"dblgravecmb", 0x030F}, {"dblintegral", 0x222C}, {"dbllowline", 0x2017},
{"dbllowlinecmb", 0x0333}, {"dbloverlinecmb", 0x033F}, {"dblprimemod", 0x02BA}, {"dblverticalbar", 0x2016},
{"dblverticallineabovecmb", 0x030E}, {"dcaron", 0x010F}, {"dcedilla", 0x1E11}, {"dcircle", 0x24D3},
{"dcircumflexbelow", 0x1E13}, {"dcroat", 0x0111}, {"ddotaccent", 0x1E0B}, {"ddotbelow", 0x1E0D},
{"decyrillic", 0x0434}, {"degree", 0x00B0}, {"deicoptic", 0x03EF}, {"deleteleft", 0x232B},
{"deleteright", 0x2326}, {"delta", 0x03B4}, {"deltaturned", 0x018D}, {"dezh", 0x02A4},
{"dhook", 0x0257}, {"dialytikatonos", 0x0385}, {"dialytikatonoscmb", 0x0344}, {"diamond", 0x2666},
{"diamondsuitwhite", 0x2662}, {"dieresis", 0x00A8}, {"dieresisacute", 0xF6D7}, {"dieresisbelowcmb", 0x0324},
{"dieresiscmb", 0x0308}, {"dieresisgrave", 0xF6D8}, {"dieresistonos", 0x0385}, {"divide", 0x00F7},
{"divides", 0x2223}, {"divisionslash", 0x2215}, {"djecyrillic", 0x0452}, {"dkshade", 0x2593},
{"dlinebelow", 0x1E0F}, {"dmacron", 0x0111}, {"dnblock", 0x2584}, {"dollar", 0x0024},
{"dollarinferior", 0xF6E3}, {"dollaroldstyle", 0xF724}, {"dollarsuperior", 0xF6E4}, {"dong", 0x20AB},
{"dotaccent", 0x02D9}, {"dotaccentcmb", 0x0307}, {"dotbelowcmb", 0x0323}, {"dotbelowcomb", 0x0323},
{"dotlessi", 0x0131}, {"dotlessj", 0xF6BE}, {"dotlessjstrokehook", 0x0284}, {"dotmath", 0x22C5},
{"dottedcircle", 0x25CC}, {"doubleyodpatah", 0xFB1F}, {"doubleyodpatahhebrew", 0xFB1F}, {"downtackbelowcmb", 0x031E},
{"downtackmod", 0x02D5}, {"dparen", 0x249F}, {"dsuperior", 0xF6EB}, {"dtail", 0x0256},
{"dtopbar", 0x018C}, {"dz", 0x01F3}, {"dzaltone", 0x02A3}, {"dzcaron", 0x01C6},
{"dzcurl", 0x02A5}, {"dzeabkhasiancyrillic", 0x04E1}, {"dzecyrillic", 0x0455}, {"dzhecyrillic", 0x045F},
{"e", 0x0065}, {"eacute", 0x00E9}, {"earth", 0x2641}, {"ebreve", 0x0115},
{"ecaron", 0x011B}, {"ecedillabreve", 0x1E1D}, {"ecircle", 0x24D4}, {"ecircumflex", 0x00EA},
{"ecircumflexacute", 0x1EBF}, {"ecircumflexbelow", 0x1E19}, {"ecircumflexdotbelow", 0x1EC7}, {"ecircumflexgrave", 0x1EC1},
{"ecircumflexhookabove", 0x1EC3}, {"ecircumflextilde", 0x1EC5}, {"ecyrillic", 0x0454}, {"edblgrave", 0x0205},
{"edieresis", 0x00EB}, {"edot", 0x0117}, {"edotaccent", 0x0117}, {"edotbelow", 0x1EB9},
{"efcyrillic", 0x0444}, {"egrave", 0x00E8}, {"ehookabove", 0x1EBB}, {"eight", 0x0038},
{"eightcircle", 0x2467}, {"eightcircleinversesansserif", 0x2791}, {"eighteencircle", 0x2471}, {"eighteenparen", 0x2485},
{"eighteenperiod", 0x2499}, {"eighthnotebeamed", 0x266B}, {"eightinferior", 0x2088}, {"eightoldstyle", 0xF738},
{"eightparen", 0x247B}, {"eightperiod", 0x248F}, {"eightroman", 0x2177}, {"eightsuperior", 0x2078},
{"einvertedbreve", 0x0207}, {"eiotifiedcyrillic", 0x0465}, {"elcyrillic", 0x043B}, {"element", 0x2208},
{"elevencircle", 0x246A}, {"elevenparen", 0x247E}, {"elevenperiod", 0x2492}, {"elevenroman", 0x217A},
{"ellipsis", 0x2026}, {"ellipsisvertical", 0x22EE}, {"emacron", 0x0113}, {"emacronacute", 0x1E17},
{"emacrongrave", 0x1E15}, {"emcyrillic", 0x043C}, {"emdash", 0x2014}, {"emptyset", 0x2205},
{"encyrillic", 0x043D}, {"endash", 0x2013}, {"endescendercyrillic", 0x04A3}, {"eng", 0x014B},
{"enghecyrillic", 0x04A5}, {"enhookcyrillic", 0x04C8}, {"enspace", 0x2002}, {"eogonek", 0x0119},
{"eopen", 0x025B}, {"eopenclosed", 0x029A}, {"eopenreversed", 0x025C}, {"eopenreversedclosed", 0x025E},
{"eopenreversedhook", 0x025D}, {"eparen", 0x24A0}, {"epsilon", 0x03B5}, {"epsilontonos", 0x03AD},
{"equal", 0x003D}, {"equalsuperior", 0x207C}, {"equivalence", 0x2261}, {"ercyrillic", 0x0440},
{"ereversed", 0x0258}, {"ereversedcyrillic", 0x044D}, {"escyrillic", 0x0441}, {"esdescendercyrillic", 0x04AB},
{"esh", 0x0283}, {"eshcurl", 0x0286}, {"eshreversedloop", 0x01AA}, {"eshsquatreversed", 0x0285},
{"estimated", 0x212E}, {"esuperior", 0xF6EC}, {"eta", 0x03B7}, {"etatonos", 0x03AE},
{"eth", 0x00F0}, {"etilde", 0x1EBD}, {"etildebelow", 0x1E1B}, {"eturned", 0x01DD},
{"euro", 0x20AC}, {"exclam", 0x0021}, {"exclamdbl", 0x203C}, {"exclamdown", 0x00A1},
{"exclamdownsmall", 0xF7A1}, {"exclamsmall", 0xF721}, {"existential", 0x2203}, {"ezh", 0x0292},
{"ezhcaron", 0x01EF}, {"ezhcurl", 0x0293}, {"ezhreversed", 0x01B9}, {"ezhtail", 0x01BA},
{"f", 0x0066}, {"fahrenheit", 0x2109}, {"fcircle", 0x24D5}, {"fdotaccent", 0x1E1F},
{"feicoptic", 0x03E5}, {"female", 0x2640}, {"ff", 0xFB00}, {"ffi", 0xFB03},
{"ffl", 0xFB04}, {"fi", 0xFB01}, {"fifteencircle", 0x246E}, {"fifteenparen", 0x2482},
{"fifteenperiod", 0x2496}, {"figuredash", 0x2012}, {"filledbox", 0x25A0}, {"filledrect", 0x25AC},
{"firsttonechinese", 0x02C9}, {"fisheye", 0x25C9}, {"fitacyrillic", 0x0473}, {"five", 0x0035},
{"fivecircle", 0x2464}, {"fivecircleinversesansserif", 0x278E}, {"fiveeighths", 0x215D}, {"fiveinferior", 0x2085},
{"fiveoldstyle", 0xF735}, {"fiveparen", 0x2478}, {"fiveperiod", 0x248C}, {"fiveroman", 0x2174},
{"fivesuperior", 0x2075}, {"fl", 0xFB02}, {"florin", 0x0192}, {"forall", 0x2200},
{"four", 0x0034}, {"fourcircle", 0x2463}, {"fourcircleinversesansserif", 0x278D}, {"fourinferior", 0x2084},
{"fouroldstyle", 0xF734}, {"fourparen", 0x2477}, {"fourperiod", 0x248B}, {"fourroman", 0x2173},
{"foursuperior", 0x2074}, {"fourteencircle", 0x246D}, {"fourteenparen", 0x2481}, {"fourteenperiod", 0x2495},
{"fourthtonechinese", 0x02CB}, {"fparen", 0x24A1}, {"fraction", 0x2044}, {"franc", 0x20A3},
{"g", 0x0067}, {"gacute", 0x01F5}, {"gamma", 0x03B3}, {"gammalatinsmall", 0x0263},
{"gammasuperior", 0x02E0}, {"gangiacoptic", 0x03EB}, {"gbreve", 0x011F}, {"gcaron", 0x01E7},
{"gcedilla", 0x0123}, {"gcircle", 0x24D6}, {"gcircumflex", 0x011D}, {"gcommaaccent", 0x0123},
{"gdot", 0x0121}, {"gdotaccent", 0x0121}, {"gecyrillic", 0x0433}, {"geometricallyequal", 0x2251},
{"germandbls", 0x00DF}, {"ghemiddlehookcyrillic", 0x0495}, {"ghestrokecyrillic", 0x0493}, {"gheupturncyrillic", 0x0491},
{"ghook", 0x0260}, {"gjecyrillic", 0x0453}, {"glottalinvertedstroke", 0x01BE}, {"glottalstop", 0x0294},
{"glottalstopinverted", 0x0296}, {"glottalstopmod", 0x02C0}, {"glottalstopreversed", 0x0295}, {"glottalstopreversedmod", 0x02C1},
{"glottalstopreversedsuperior", 0x02E4}, {"glottalstopstroke", 0x02A1}, {"glottalstopstrokereversed", 0x02A2}, {"gmacron", 0x1E21},
{"gparen", 0x24A2}, {"gradient", 0x2207}, {"grave", 0x0060}, {"gravebelowcmb", 0x0316},
{"gravecmb", 0x0300}, {"gravecomb", 0x0300}, {"gravelowmod", 0x02CE}, {"gravetonecmb", 0x0340},
{"greater", 0x003E}, {"greaterequal", 0x2265}, {"greaterequalorless", 0x22DB}, {"greaterorequivalent", 0x2273},
{"greaterorless", 0x2277}, {"greateroverequal", 0x2267}, {"gscript", 0x0261}, {"gstroke", 0x01E5},
{"guillemotleft", 0x00AB}, {"guillemotright", 0x00BB}, {"guilsinglleft", 0x2039}, {"guilsinglright", 0x203A},
{"h", 0x0068}, {"haabkhasiancyrillic", 0x04A9}, {"hadescendercyrillic", 0x04B3}, {"hardsigncyrillic", 0x044A},
{"harpoonleftbarbup", 0x21BC}, {"harpoonrightbarbup", 0x21C0}, {"hbar", 0x0127}, {"hbrevebelow", 0x1E2B},
{"hcedilla", 0x1E29}, {"hcircle", 0x24D7}, {"hcircumflex", 0x0125}, {"hdieresis", 0x1E27},
{"hdotaccent", 0x1E23}, {"hdotbelow", 0x1E25}, {"heart", 0x2665}, {"heartsuitblack", 0x2665},
{"heartsuitwhite", 0x2661}, {"henghook", 0x0267}, {"hhook", 0x0266}, {"hhooksuperior", 0x02B1},
{"hlinebelow", 0x1E96}, {"hookabovecomb", 0x0309}, {"hookcmb", 0x0309}, {"hookpalatalizedbelowcmb", 0x0321},
{"hookretroflexbelowcmb", 0x0322}, {"horicoptic", 0x03E9}, {"horizontalbar", 0x2015}, {"horncmb", 0x031B},
{"hotsprings", 0x2668}, {"house", 0x2302}, {"hparen", 0x24A3}, {"hsuperior", 0x02B0},
{"hturned", 0x0265}, {"hungarumlaut", 0x02DD}, {"hungarumlautcmb", 0x030B}, {"hv", 0x0195},
{"hyphen", 0x002D}, {"hypheninferior", 0xF6E5}, {"hyphensuperior", 0xF6E6}, {"hyphentwo", 0x2010},
{"i", 0x0069}, {"iacute", 0x00ED}, {"iacyrillic", 0x044F}, {"ibreve", 0x012D},
{"icaron", 0x01D0}, {"icircle", 0x24D8}, {"icircumflex", 0x00EE}, {"icyrillic", 0x0456},
{"idblgrave", 0x0209}, {"idieresis", 0x00EF}, {"idieresisacute", 0x1E2F}, {"idieresiscyrillic", 0x04E5},
{"idotbelow", 0x1ECB}, {"iebrevecyrillic", 0x04D7}, {"iecyrillic", 0x0435}, {"igrave", 0x00EC},
{"ihookabove", 0x1EC9}, {"iicyrillic", 0x0438}, {"iinvertedbreve", 0x020B}, {"iishortcyrillic", 0x0439},
{"ij", 0x0133}, {"ilde", 0x02DC}, {"imacron", 0x012B}, {"imacroncyrillic", 0x04E3},
{"imageorapproximatelyequal", 0x2253}, {"increment", 0x2206}, {"infinity", 0x221E}, {"integral", 0x222B},
{"integralbottom", 0x2321}, {"integralbt", 0x2321}, {"integralex", 0xF8F5}, {"integraltop", 0x2320},
{"integraltp", 0x2320}, {"intersection", 0x2229}, {"invbullet", 0x25D8}, {"invcircle", 0x25D9},
{"invsmileface", 0x263B}, {"iocyrillic", 0x0451}, {"iogonek", 0x012F}, {"iota", 0x03B9},
{"iotadieresis", 0x03CA}, {"iotadieresistonos", 0x0390}, {"iotalatin", 0x0269}, {"iotatonos", 0x03AF},
{"iparen", 0x24A4}, {"istroke", 0x0268}, {"isuperior", 0xF6ED}, {"itilde", 0x0129},
{"itildebelow", 0x1E2D}, {"iucyrillic", 0x044E}, {"izhitsacyrillic", 0x0475}, {"izhitsadblgravecyrillic", 0x0477},
{"j", 0x006A}, {"jcaron", 0x01F0}, {"jcircle", 0x24D9}, {"jcircumflex", 0x0135},
{"jcrossedtail", 0x029D}, {"jdotlessstroke", 0x025F}, {"jecyrillic", 0x0458}, {"jparen", 0x24A5},
{"jsuperior", 0x02B2}, {"k", 0x006B}, {"kabashkircyrillic", 0x04A1}, {"kacute", 0x1E31},
{"kacyrillic", 0x043A}, {"kadescendercyrillic", 0x049B}, {"kahookcyrillic", 0x04C4}, {"kappa", 0x03BA},
{"kappasymbolgreek", 0x03F0}, {"kastrokecyrillic", 0x049F}, {"kaverticalstrokecyrillic", 0x049D}, {"kcaron", 0x01E9},
{"kcedilla", 0x0137}, {"kcircle", 0x24DA}, {"kcommaaccent", 0x0137}, {"kdotbelow", 0x1E33},
{"kgreenlandic", 0x0138}, {"khacyrillic", 0x0445}, {"kheicoptic", 0x03E7}, {"khook", 0x0199},
{"kjecyrillic", 0x045C}, {"klinebelow", 0x1E35}, {"koppacyrillic", 0x0481}, {"koroniscmb", 0x0343},
{"kparen", 0x24A6}, {"ksicyrillic", 0x046F}, {"kturned", 0x029E}, {"l", 0x006C},
{"lacute", 0x013A}, {"lambda", 0x03BB}, {"lambdastroke", 0x019B}, {"largecircle", 0x25EF},
{"lbar", 0x019A}, {"lbelt", 0x026C}, {"lcaron", 0x013E}, {"lcedilla", 0x013C},
{"lcircle", 0x24DB}, {"lcircumflexbelow", 0x1E3D}, {"lcommaaccent", 0x013C}, {"ldot", 0x0140},
{"ldotaccent", 0x0140}, {"ldotbelow", 0x1E37}, {"ldotbelowmacron", 0x1E39}, {"leftangleabovecmb", 0x031A},
{"lefttackbelowcmb", 0x0318}, {"less", 0x003C}, {"lessequal", 0x2264}, {"lessequalorgreater", 0x22DA},
{"lessorequivalent", 0x2272}, {"lessorgreater", 0x2276}, {"lessoverequal", 0x2266}, {"lezh", 0x026E},
{"lfblock", 0x258C}, {"lhookretroflex", 0x026D}, {"lira", 0x20A4}, {"lj", 0x01C9},
{"ljecyrillic", 0x0459}, {"ll", 0xF6C0}, {"llinebelow", 0x1E3B}, {"lmiddletilde", 0x026B},
{"logicaland", 0x2227}, {"logicalnot", 0x00AC}, {"logicalnotreversed", 0x2310}, {"logicalor", 0x2228},
{"longs", 0x017F}, {"lowlinecmb", 0x0332}, {"lozenge", 0x25CA}, {"lparen", 0x24A7},
{"lslash", 0x0142}, {"lsquare", 0x2113}, {"lsuperior", 0xF6EE}, {"ltshade", 0x2591},
{"m", 0x006D}, {"macron", 0x00AF}, {"macronbelowcmb", 0x0331}, {"macroncmb", 0x0304},
{"macronlowmod", 0x02CD}, {"macute", 0x1E3F}, {"maichattawalowleftthai", 0xF895}, {"maichattawalowrightthai", 0xF894},
{"maichattawaupperleftthai", 0xF893}, {"maieklowleftthai", 0xF88C}, {"maieklowrightthai", 0xF88B}, {"maiekupperleftthai", 0xF88A},
{"maihanakatleftthai", 0xF884}, {"maitaikhuleftthai", 0xF889}, {"maitholowleftthai", 0xF88F}, {"maitholowrightthai", 0xF88E},
{"maithoupperleftthai", 0xF88D}, {"maitrilowleftthai", 0xF892}, {"maitrilowrightthai", 0xF891}, {"maitriupperleftthai", 0xF890},
{"male", 0x2642}, {"mars", 0x2642}, {"mcircle", 0x24DC}, {"mdotaccent", 0x1E41},
{"mdotbelow", 0x1E43}, {"mhook", 0x0271}, {"middot", 0x00B7}, {"minus", 0x2212},
{"minusbelowcmb", 0x0320}, {"minuscircle", 0x2296}, {"minusmod", 0x02D7}, {"minusplus", 0x2213},
{"minute", 0x2032}, {"mlonglegturned", 0x0270}, {"mparen", 0x24A8}, {"msuperior", 0xF6EF},
{"mturned", 0x026F}, {"mu", 0x00B5}, {"mu1", 0x00B5}, {"muchgreater", 0x226B},
{"muchless", 0x226A}, {"mugreek", 0x03BC}, {"multiply", 0x00D7}, {"musicalnote", 0x266A},
{"musicalnotedbl", 0x266B}, {"musicflatsign", 0x266D}, {"musicsharpsign", 0x266F}, {"n", 0x006E},
{"nabla", 0x2207}, {"nacute", 0x0144}, {"napostrophe", 0x0149}, {"nbspace", 0x00A0},
{"ncaron", 0x0148}, {"ncedilla", 0x0146}, {"ncircle", 0x24DD}, {"ncircumflexbelow", 0x1E4B},
{"ncommaaccent", 0x0146}, {"ndotaccent", 0x1E45}, {"ndotbelow", 0x1E47}, {"newsheqelsign", 0x20AA},
{"nhookleft", 0x0272}, {"nhookretroflex", 0x0273}, {"nikhahitleftthai", 0xF899}, {"nine", 0x0039},
{"ninecircle", 0x2468}, {"ninecircleinversesansserif", 0x2792}, {"nineinferior", 0x2089}, {"nineoldstyle", 0xF739},
{"nineparen", 0x247C}, {"nineperiod", 0x2490}, {"nineroman", 0x2178}, {"ninesuperior", 0x2079},
{"nineteencircle", 0x2472}, {"nineteenparen", 0x2486}, {"nineteenperiod", 0x249A}, {"nj", 0x01CC},
{"njecyrillic", 0x045A}, {"nlegrightlong", 0x019E}, {"nlinebelow", 0x1E49}, {"nonbreakingspace", 0x00A0},
{"notcontains", 0x220C}, {"notelement", 0x2209}, {"notelementof", 0x2209}, {"notequal", 0x2260},
{"notgreater", 0x226F}, {"notgreaternorequal", 0x2271}, {"notgreaternorless", 0x2279}, {"notidentical", 0x2262},
{"notless", 0x226E}, {"notlessnorequal", 0x2270}, {"notparallel", 0x2226}, {"notprecedes", 0x2280},
{"notsubset", 0x2284}, {"notsucceeds", 0x2281}, {"notsuperset", 0x2285}, {"nparen", 0x24A9},
{"nsuperior", 0x207F}, {"ntilde", 0x00F1}, {"nu", 0x03BD}, {"numbersign", 0x0023},
{"numeralsigngreek", 0x0374}, {"numeralsignlowergreek", 0x0375}, {"numero", 0x2116}, {"o", 0x006F},
{"oacute", 0x00F3}, {"obarred", 0x0275}, {"obarredcyrillic", 0x04E9}, {"obarreddieresiscyrillic", 0x04EB},
{"obreve", 0x014F}, {"ocaron", 0x01D2}, {"ocircle", 0x24DE}, {"ocircumflex", 0x00F4},
{"ocircumflexacute", 0x1ED1}, {"ocircumflexdotbelow", 0x1ED9}, {"ocircumflexgrave", 0x1ED3}, {"ocircumflexhookabove", 0x1ED5},
{"ocircumflextilde", 0x1ED7}, {"ocyrillic", 0x043E}, {"odblacute", 0x0151}, {"odblgrave", 0x020D},
{"odieresis", 0x00F6}, {"odieresiscyrillic", 0x04E7}, {"odotbelow", 0x1ECD}, {"oe", 0x0153},
{"ogonek", 0x02DB}, {"ogonekcmb", 0x0328}, {"ograve", 0x00F2}, {"ohookabove", 0x1ECF},
{"ohorn", 0x01A1}, {"ohornacute", 0x1EDB}, {"ohorndotbelow", 0x1EE3}, {"ohorngrave", 0x1EDD},
{"ohornhookabove", 0x1EDF}, {"ohorntilde", 0x1EE1}, {"ohungarumlaut", 0x0151}, {"oi", 0x01A3},
{"oinvertedbreve", 0x020F}, {"omacron", 0x014D}, {"omacronacute", 0x1E53}, {"omacrongrave", 0x1E51},
{"omega", 0x03C9}, {"omega1", 0x03D6}, {"omegacyrillic", 0x0461}, {"omegalatinclosed", 0x0277},
{"omegaroundcyrillic", 0x047B}, {"omegatitlocyrillic", 0x047D}, {"omegatonos", 0x03CE}, {"omicron", 0x03BF},
{"omicrontonos", 0x03CC}, {"one", 0x0031}, {"onecircle", 0x2460}, {"onecircleinversesansserif", 0x278A},
{"onedotenleader", 0x2024}, {"oneeighth", 0x215B}, {"onefitted", 0xF6DC}, {"onehalf", 0x00BD},
{"oneinferior", 0x2081}, {"oneoldstyle", 0xF731}, {"oneparen", 0x2474}, {"oneperiod", 0x2488},
{"onequarter", 0x00BC}, {"oneroman", 0x2170}, {"onesuperior", 0x00B9}, {"onethird", 0x2153},
{"oogonek", 0x01EB}, {"oogonekmacron", 0x01ED}, {"oopen", 0x0254}, {"oparen", 0x24AA},
{"openbullet", 0x25E6}, {"option", 0x2325}, {"ordfeminine", 0x00AA}, {"ordmasculine", 0x00BA},
{"orthogonal", 0x221F}, {"oslash", 0x00F8}, {"oslashacute", 0x01FF}, {"ostrokeacute", 0x01FF},
{"osuperior", 0xF6F0}, {"otcyrillic", 0x047F}, {"otilde", 0x00F5}, {"otildeacute", 0x1E4D},
{"otildedieresis", 0x1E4F}, {"overline", 0x203E}, {"overlinecmb", 0x0305}, {"overscore", 0x00AF},
{"p", 0x0070}, {"pacute", 0x1E55}, {"pagedown", 0x21DF}, {"pageup", 0x21DE},
{"palatalizationcyrilliccmb", 0x0484}, {"palochkacyrillic", 0x04C0}, {"paragraph", 0x00B6}, {"parallel", 0x2225},
{"parenleft", 0x0028}, {"parenleftbt", 0xF8ED}, {"parenleftex", 0xF8EC}, {"parenleftinferior", 0x208D},
{"parenleftsuperior", 0x207D}, {"parenlefttp", 0xF8EB}, {"parenright", 0x0029}, {"parenrightbt", 0xF8F8},
{"parenrightex", 0xF8F7}, {"parenrightinferior", 0x208E}, {"parenrightsuperior", 0x207E}, {"parenrighttp", 0xF8F6},
{"partialdiff", 0x2202}, {"pcircle", 0x24DF}, {"pdotaccent", 0x1E57}, {"pecyrillic", 0x043F},
{"pemiddlehookcyrillic", 0x04A7}, {"percent", 0x0025}, {"period", 0x002E}, {"periodcentered", 0x00B7},
{"periodinferior", 0xF6E7}, {"periodsuperior", 0xF6E8}, {"perispomenigreekcmb", 0x0342}, {"perpendicular", 0x22A5},
{"perthousand", 0x2030}, {"peseta", 0x20A7}, {"phi", 0x03C6}, {"phi1", 0x03D5},
{"philatin", 0x0278}, {"phisymbolgreek", 0x03D5}, {"phook", 0x01A5}, {"pi", 0x03C0},
{"pisymbolgreek", 0x03D6}, {"plus", 0x002B}, {"plusbelowcmb", 0x031F}, {"pluscircle", 0x2295},
{"plusminus", 0x00B1}, {"plusmod", 0x02D6}, {"plussuperior", 0x207A}, {"pointingindexdownwhite", 0x261F},
{"pointingindexleftwhite", 0x261C}, {"pointingindexrightwhite", 0x261E}, {"pointingindexupwhite", 0x261D}, {"pparen", 0x24AB},
{"precedes", 0x227A}, {"prescription", 0x211E}, {"primemod", 0x02B9}, {"primereversed", 0x2035},
{"product", 0x220F}, {"projective", 0x2305}, {"propellor", 0x2318}, {"propersubset", 0x2282},
{"propersuperset", 0x2283}, {"proportion", 0x2237}, {"proportional", 0x221D}, {"psi", 0x03C8},
{"psicyrillic", 0x0471}, {"psilipneumatacyrilliccmb", 0x0486}, {"q", 0x0071}, {"qcircle", 0x24E0},
{"qhook", 0x02A0}, {"qparen", 0x24AC}, {"quarternote", 0x2669}, {"question", 0x003F},
{"questiondown", 0x00BF}, {"questiondownsmall", 0xF7BF}, {"questiongreek", 0x037E}, {"questionsmall", 0xF73F},
{"quotedbl", 0x0022}, {"quotedblbase", 0x201E}, {"quotedblleft", 0x201C}, {"quotedblright", 0x201D},
{"quoteleft", 0x2018}, {"quoteleftreversed", 0x201B}, {"quotereversed", 0x201B}, {"quoteright", 0x2019},
{"quoterightn", 0x0149}, {"quotesinglbase", 0x201A}, {"quotesingle", 0x0027}, {"r", 0x0072},
{"racute", 0x0155}, {"radical", 0x221A}, {"radicalex", 0xF8E5}, {"ramshorn", 0x0264},
{"ratio", 0x2236}, {"rcaron", 0x0159}, {"rcedilla", 0x0157}, {"rcircle", 0x24E1},
{"rcommaaccent", 0x0157}, {"rdblgrave", 0x0211}, {"rdotaccent", 0x1E59}, {"rdotbelow", 0x1E5B},
{"rdotbelowmacron", 0x1E5D}, {"referencemark", 0x203B}, {"reflexsubset", 0x2286}, {"reflexsuperset", 0x2287},
{"registered", 0x00AE}, {"registersans", 0xF8E8}, {"registerserif", 0xF6DA}, {"reversedtilde", 0x223D},
{"revlogicalnot", 0x2310}, {"rfishhook", 0x027E}, {"rfishhookreversed", 0x027F}, {"rho", 0x03C1},
{"rhook", 0x027D}, {"rhookturned", 0x027B}, {"rhookturnedsuperior", 0x02B5}, {"rhosymbolgreek", 0x03F1},
{"rhotichookmod", 0x02DE}, {"rightangle", 0x221F}, {"righttackbelowcmb", 0x0319}, {"righttriangle", 0x22BF},
{"ring", 0x02DA}, {"ringbelowcmb", 0x0325}, {"ringcmb", 0x030A}, {"ringhalfleft", 0x02BF},
{"ringhalfleftbelowcmb", 0x031C}, {"ringhalfleftcentered", 0x02D3}, {"ringhalfright", 0x02BE}, {"ringhalfrightbelowcmb", 0x0339},
{"ringhalfrightcentered", 0x02D2}, {"rinvertedbreve", 0x0213}, {"rlinebelow", 0x1E5F}, {"rlongleg", 0x027C},
{"rlonglegturned", 0x027A}, {"rparen", 0x24AD}, {"rsuperior", 0xF6F1}, {"rtblock", 0x2590},
{"rturned", 0x0279}, {"rturnedsuperior", 0x02B4}, {"rupiah", 0xF6DD}, {"s", 0x0073},
{"sacute", 0x015B}, {"sacutedotaccent", 0x1E65}, {"saraiileftthai", 0xF886}, {"saraileftthai", 0xF885},
{"saraueeleftthai", 0xF888}, {"saraueleftthai", 0xF887}, {"scaron", 0x0161}, {"scarondotaccent", 0x1E67},
{"scedilla", 0x015F}, {"schwa", 0x0259}, {"schwacyrillic", 0x04D9}, {"schwadieresiscyrillic", 0x04DB},
{"schwahook", 0x025A}, {"scircle", 0x24E2}, {"scircumflex", 0x015D}, {"scommaaccent", 0x0219},
{"sdotaccent", 0x1E61}, {"sdotbelow", 0x1E63}, {"sdotbelowdotaccent", 0x1E69}, {"seagullbelowcmb", 0x033C},
{"second", 0x2033}, {"secondtonechinese", 0x02CA}, {"section", 0x00A7}, {"semicolon", 0x003B},
{"seven", 0x0037}, {"sevencircle", 0x2466}, {"sevencircleinversesansserif", 0x2790}, {"seveneighths", 0x215E},
{"seveninferior", 0x2087}, {"sevenoldstyle", 0xF737}, {"sevenparen", 0x247A}, {"sevenperiod", 0x248E},
{"sevenroman", 0x2176}, {"sevensuperior", 0x2077}, {"seventeencircle", 0x2470}, {"seventeenparen", 0x2484},
{"seventeenperiod", 0x2498}, {"sfthyphen", 0x00AD}, {"shacyrillic", 0x0448}, {"shade", 0x2592},
{"shadedark", 0x2593}, {"shadelight", 0x2591}, {"shademedium", 0x2592}, {"shchacyrillic", 0x0449},
{"sheicoptic", 0x03E3}, {"sheqel", 0x20AA}, {"sheqelhebrew", 0x20AA}, {"shhacyrillic", 0x04BB},
{"shimacoptic", 0x03ED}, {"shook", 0x0282}, {"sigma", 0x03C3}, {"sigma1", 0x03C2},
{"sigmafinal", 0x03C2}, {"sigmalunatesymbolgreek", 0x03F2}, {"similar", 0x223C}, {"six", 0x0036},
{"sixcircle", 0x2465}, {"sixcircleinversesansserif", 0x278F}, {"sixinferior", 0x2086}, {"sixoldstyle", 0xF736},
{"sixparen", 0x2479}, {"sixperiod", 0x248D}, {"sixroman", 0x2175}, {"sixsuperior", 0x2076},
{"sixteencircle", 0x246F}, {"sixteenparen", 0x2483}, {"sixteenperiod", 0x2497}, {"slash", 0x002F},
{"slong", 0x017F}, {"slongdotaccent", 0x1E9B}, {"smileface", 0x263A}, {"softhyphen", 0x00AD},
{"softsigncyrillic", 0x044C}, {"soliduslongoverlaycmb", 0x0338}, {"solidusshortoverlaycmb", 0x0337}, {"space", 0x0020},
{"spacehackarabic", 0x0020}, {"spade", 0x2660}, {"spadesuitblack", 0x2660}, {"spadesuitwhite", 0x2664},
{"sparen", 0x24AE}, {"squarebelowcmb", 0x033B}, {"squarediagonalcrosshatchfill", 0x25A9}, {"squarehorizontalfill", 0x25A4},
{"squareorthogonalcrosshatchfill", 0x25A6}, {"squareupperlefttolowerrightfill", 0x25A7}, {"squareupperrighttolowerleftfill", 0x25A8}, {"squareverticalfill", 0x25A5},
{"squarewhitewithsmallblack", 0x25A3}, {"ssuperior", 0xF6F2}, {"sterling", 0x00A3}, {"strokelongoverlaycmb", 0x0336},
{"strokeshortoverlaycmb", 0x0335}, {"subset", 0x2282}, {"subsetnotequal", 0x228A}, {"subsetorequal", 0x2286},
{"succeeds", 0x227B}, {"suchthat", 0x220B}, {"summation", 0x2211}, {"sun", 0x263C},
{"superset", 0x2283}, {"supersetnotequal", 0x228B}, {"supersetorequal", 0x2287}, {"t", 0x0074},
{"tackdown", 0x22A4}, {"tackleft", 0x22A3}, {"tau", 0x03C4}, {"tbar", 0x0167},
{"tcaron", 0x0165}, {"tccurl", 0x02A8}, {"tcedilla", 0x0163}, {"tcircle", 0x24E3},
{"tcircumflexbelow", 0x1E71}, {"tcommaaccent", 0x0163}, {"tdieresis", 0x1E97}, {"tdotaccent", 0x1E6B},
{"tdotbelow", 0x1E6D}, {"tecyrillic", 0x0442}, {"tedescendercyrillic", 0x04AD}, {"telephone", 0x2121},
{"telephoneblack", 0x260E}, {"tencircle", 0x2469}, {"tenparen", 0x247D}, {"tenperiod", 0x2491},
{"tenroman", 0x2179}, {"tesh", 0x02A7}, {"tetsecyrillic", 0x04B5}, {"thanthakhatlowleftthai", 0xF898},
{"thanthakhatlowrightthai", 0xF897}, {"thanthakhatupperleftthai", 0xF896}, {"thereexists", 0x2203}, {"therefore", 0x2234},
{"theta", 0x03B8}, {"theta1", 0x03D1}, {"thetasymbolgreek", 0x03D1}, {"thirteencircle", 0x246C},
{"thirteenparen", 0x2480}, {"thirteenperiod", 0x2494}, {"thook", 0x01AD}, {"thorn", 0x00FE},
{"thousandcyrillic", 0x0482}, {"three", 0x0033}, {"threecircle", 0x2462}, {"threecircleinversesansserif", 0x278C},
{"threeeighths", 0x215C}, {"threeinferior", 0x2083}, {"threeoldstyle", 0xF733}, {"threeparen", 0x2476},
{"threeperiod", 0x248A}, {"threequarters", 0x00BE}, {"threequartersemdash", 0xF6DE}, {"threeroman", 0x2172},
{"threesuperior", 0x00B3}, {"tilde", 0x02DC}, {"tildebelowcmb", 0x0330}, {"tildecmb", 0x0303},
{"tildecomb", 0x0303}, {"tildedoublecmb", 0x0360}, {"tildeoperator", 0x223C}, {"tildeoverlaycmb", 0x0334},
{"tildeverticalcmb", 0x033E}, {"timescircle", 0x2297}, {"titlocyrilliccmb", 0x0483}, {"tlinebelow", 0x1E6F},
{"tonebarextrahighmod", 0x02E5}, {"tonebarextralowmod", 0x02E9}, {"tonebarhighmod", 0x02E6}, {"tonebarlowmod", 0x02E8},
{"tonebarmidmod", 0x02E7}, {"tonefive", 0x01BD}, {"tonesix", 0x0185}, {"tonetwo", 0x01A8},
{"tonos", 0x0384}, {"tpalatalhook", 0x01AB}, {"tparen", 0x24AF}, {"trademark", 0x2122},
{"trademarksans", 0xF8EA}, {"trademarkserif", 0xF6DB}, {"tretroflexhook", 0x0288}, {"triagdn", 0x25BC},
{"triaglf", 0x25C4}, {"triagrt", 0x25BA}, {"triagup", 0x25B2}, {"ts", 0x02A6},
{"tsecyrillic", 0x0446}, {"tshecyrillic", 0x045B}, {"tsuperior", 0xF6F3}, {"tturned", 0x0287},
{"twelvecircle", 0x246B}, {"twelveparen", 0x247F}, {"twelveperiod", 0x2493}, {"twelveroman", 0x217B},
{"twentycircle", 0x2473}, {"twentyparen", 0x2487}, {"twentyperiod", 0x249B}, {"two", 0x0032},
{"twocircle", 0x2461}, {"twocircleinversesansserif", 0x278B}, {"twodotenleader", 0x2025}, {"twodotleader", 0x2025},
{"twoinferior", 0x2082}, {"twooldstyle", 0xF732}, {"twoparen", 0x2475}, {"twoperiod", 0x2489},
{"tworoman", 0x2171}, {"twostroke", 0x01BB}, {"twosuperior", 0x00B2}, {"twothirds", 0x2154},
{"u", 0x0075}, {"uacute", 0x00FA}, {"ubar", 0x0289}, {"ubreve", 0x016D},
{"ucaron", 0x01D4}, {"ucircle", 0x24E4}, {"ucircumflex", 0x00FB}, {"ucircumflexbelow", 0x1E77},
{"ucyrillic", 0x0443}, {"udblacute", 0x0171}, {"udblgrave", 0x0215}, {"udieresis", 0x00FC},
{"udieresisacute", 0x01D8}, {"udieresisbelow", 0x1E73}, {"udieresiscaron", 0x01DA}, {"udieresiscyrillic", 0x04F1},
{"udieresisgrave", 0x01DC}, {"udieresismacron", 0x01D6}, {"udotbelow", 0x1EE5}, {"ugrave", 0x00F9},
{"uhookabove", 0x1EE7}, {"uhorn", 0x01B0}, {"uhornacute", 0x1EE9}, {"uhorndotbelow", 0x1EF1},
{"uhorngrave", 0x1EEB}, {"uhornhookabove", 0x1EED}, {"uhorntilde", 0x1EEF}, {"uhungarumlaut", 0x0171},
{"uhungarumlautcyrillic", 0x04F3}, {"uinvertedbreve", 0x0217}, {"ukcyrillic", 0x0479}, {"umacron", 0x016B},
{"umacroncyrillic", 0x04EF}, {"umacrondieresis", 0x1E7B}, {"underscore", 0x005F}, {"underscoredbl", 0x2017},
{"union", 0x222A}, {"universal", 0x2200}, {"uogonek", 0x0173}, {"uparen", 0x24B0},
{"upblock", 0x2580}, {"upsilon", 0x03C5}, {"upsilondieresis", 0x03CB}, {"upsilondieresistonos", 0x03B0},
{"upsilonlatin", 0x028A}, {"upsilontonos", 0x03CD}, {"uptackbelowcmb", 0x031D}, {"uptackmod", 0x02D4},
{"uring", 0x016F}, {"ushortcyrillic", 0x045E}, {"ustraightcyrillic", 0x04AF}, {"ustraightstrokecyrillic", 0x04B1},
{"utilde", 0x0169}, {"utildeacute", 0x1E79}, {"utildebelow", 0x1E75}, {"v", 0x0076},
{"vcircle", 0x24E5}, {"vdotbelow", 0x1E7F}, {"vecyrillic", 0x0432}, {"venus", 0x2640},
{"verticalbar", 0x007C}, {"verticallineabovecmb", 0x030D}, {"verticallinebelowcmb", 0x0329}, {"verticallinelowmod", 0x02CC},
{"verticallinemod", 0x02C8}, {"vhook", 0x028B}, {"vparen", 0x24B1}, {"vtilde", 0x1E7D},
{"vturned", 0x028C}, {"w", 0x0077}, {"wacute", 0x1E83}, {"wcircle", 0x24E6},
{"wcircumflex", 0x0175}, {"wdieresis", 0x1E85}, {"wdotaccent", 0x1E87}, {"wdotbelow", 0x1E89},
{"weierstrass", 0x2118}, {"wgrave", 0x1E81}, {"whitebullet", 0x25E6}, {"whitecircle", 0x25CB},
{"whitecircleinverse", 0x25D9}, {"whitediamond", 0x25C7}, {"whitediamondcontainingblacksmalldiamond", 0x25C8}, {"whitedownpointingsmalltriangle", 0x25BF},
{"whitedownpointingtriangle", 0x25BD}, {"whiteleftpointingsmalltriangle", 0x25C3}, {"whiteleftpointingtriangle", 0x25C1}, {"whiterightpointingsmalltriangle", 0x25B9},
{"whiterightpointingtriangle", 0x25B7}, {"whitesmallsquare", 0x25AB}, {"whitesmilingface", 0x263A}, {"whitesquare", 0x25A1},
{"whitestar", 0x2606}, {"whitetelephone", 0x260F}, {"whiteuppointingsmalltriangle", 0x25B5}, {"whiteuppointingtriangle", 0x25B3},
{"won", 0x20A9}, {"wparen", 0x24B2}, {"wring", 0x1E98}, {"wsuperior", 0x02B7},
{"wturned", 0x028D}, {"wynn", 0x01BF}, {"x", 0x0078}, {"xabovecmb", 0x033D},
{"xcircle", 0x24E7}, {"xdieresis", 0x1E8D}, {"xdotaccent", 0x1E8B}, {"xi", 0x03BE},
{"xparen", 0x24B3}, {"xsuperior", 0x02E3}, {"y", 0x0079}, {"yacute", 0x00FD},
{"yatcyrillic", 0x0463}, {"ycircle", 0x24E8}, {"ycircumflex", 0x0177}, {"ydieresis", 0x00FF},
{"ydotaccent", 0x1E8F}, {"ydotbelow", 0x1EF5}, {"yen", 0x00A5}, {"yericyrillic", 0x044B},
{"yerudieresiscyrillic", 0x04F9}, {"ygrave", 0x1EF3}, {"yhook", 0x01B4}, {"yhookabove", 0x1EF7},
{"yicyrillic", 0x0457}, {"yinyang", 0x262F}, {"yodyodpatahhebrew", 0xFB1F}, {"yotgreek", 0x03F3},
{"yparen", 0x24B4}, {"ypogegrammeni", 0x037A}, {"ypogegrammenigreekcmb", 0x0345}, {"yr", 0x01A6},
{"yring", 0x1E99}, {"ysuperior", 0x02B8}, {"ytilde", 0x1EF9}, {"yturned", 0x028E},
{"yusbigcyrillic", 0x046B}, {"yusbigiotifiedcyrillic", 0x046D}, {"yuslittlecyrillic", 0x0467}, {"yuslittleiotifiedcyrillic", 0x0469},
{"z", 0x007A}, {"zacute", 0x017A}, {"zcaron", 0x017E}, {"zcircle", 0x24E9},
{"zcircumflex", 0x1E91}, {"zcurl", 0x0291}, {"zdot", 0x017C}, {"zdotaccent", 0x017C},
{"zdotbelow", 0x1E93}, {"zecyrillic", 0x0437}, {"zedescendercyrillic", 0x0499}, {"zedieresiscyrillic", 0x04DF},
{"zero", 0x0030}, {"zeroinferior", 0x2080}, {"zerooldstyle", 0xF730}, {"zerosuperior", 0x2070},
{"zerowidthnonjoiner", 0x200C}, {"zerowidthspace", 0x200B}, {"zeta", 0x03B6}, {"zhebrevecyrillic", 0x04C2},
{"zhecyrillic", 0x0436}, {"zhedescendercyrillic", 0x0497}, {"zhedieresiscyrillic", 0x04DD}, {"zlinebelow", 0x1E95},
{"zparen", 0x24B5}, {"zretroflexhook", 0x0290}, {"zstroke", 0x01B6},
}
// One preferred name per code point, as an index into AGL_TABLE, sorted by
// code point. Where several names share a rune the AGLFN name wins, then one
// used by a built-in encoding, then the shortest.
@(private, rodata)
AGL_BY_RUNE := [2179]u16{
1266, 1265, 1255, 1252, 1251, 1239, 1240, 1241, 1259, 1260, 1270, 1256, 1243, 1264, 1263, 1249,
1244, 1245, 1246, 1247, 1261, 1268, 1254, 1242, 1250, 1267, 1253, 1257, 1258, 1262, 1269, 2135,
1453, 1996, 1835, 1335, 1945, 1029, 2006, 1928, 1934, 1093, 1961, 1225, 1600, 1946, 2127, 2420,
1885, 2255, 2201, 1496, 1483, 2115, 2084, 1387, 1799, 1220, 2083, 1709, 1432, 1552, 1991, 1098,
0, 49, 60, 84, 116, 177, 186, 211, 231, 274, 279, 302, 322, 332, 351, 415,
427, 430, 448, 516, 546, 600, 607, 616, 622, 644, 1145, 1102, 1149, 1089, 2302, 1546,
664, 1101, 1169, 1284, 1364, 1464, 1512, 1564, 1604, 1656, 1665, 1691, 1736, 1783, 1839, 1920,
1986, 2007, 2059, 2163, 2268, 2323, 2337, 2370, 2378, 2408, 1137, 1103, 1141, 1090, 1248, 1787,
1455, 1188, 2150, 1279, 2386, 1161, 2082, 1321, 1271, 1906, 1560, 1725, 2097, 2024, 1737, 1309,
1964, 2266, 2212, 882, 1773, 1926, 1947, 1186, 1898, 1907, 1561, 1896, 1891, 2209, 1992, 33,
5, 16, 47, 27, 42, 1, 65, 139, 117, 123, 133, 254, 235, 240, 244, 169,
348, 377, 354, 362, 411, 372, 1778, 405, 567, 547, 552, 558, 623, 532, 1528, 1020,
866, 876, 1099, 890, 1046, 895, 1179, 1385, 1365, 1371, 1380, 1619, 1605, 1610, 1613, 1448,
1833, 1862, 1840, 1847, 1914, 1856, 1327, 1909, 2287, 2269, 2274, 2279, 2379, 2199, 2383, 40,
1028, 7, 867, 41, 1036, 61, 1170, 69, 1182, 71, 1185, 64, 1178, 88, 1301, 92,
1305, 147, 1410, 119, 1367, 136, 1382, 156, 1423, 120, 1368, 195, 1522, 191, 1518, 198,
1525, 193, 1520, 223, 1574, 219, 1570, 270, 1651, 260, 1626, 237, 1607, 263, 1642, 249,
1344, 233, 1624, 276, 1659, 289, 1676, 1680, 305, 1692, 308, 1699, 307, 1698, 312, 1703,
319, 1732, 334, 1785, 336, 1789, 335, 1788, 1786, 153, 1419, 390, 1873, 358, 1844, 387,
1870, 352, 1859, 431, 2008, 433, 2014, 432, 2013, 489, 2060, 500, 2074, 495, 2068, 492,
2066, 520, 2170, 519, 2168, 518, 2167, 597, 2320, 580, 2299, 549, 2271, 592, 2316, 576,
2295, 583, 2306, 610, 2340, 627, 2382, 628, 645, 2409, 651, 2415, 646, 2410, 1728, 1162,
55, 59, 1164, 538, 2230, 404, 81, 1202, 87, 99, 110, 1356, 1314, 161, 496, 157,
181, 1494, 203, 189, 1599, 265, 269, 295, 1683, 1696, 1694, 330, 342, 1813, 360, 381,
1864, 388, 1871, 422, 1958, 2399, 539, 2231, 165, 1442, 2233, 531, 2198, 540, 570, 2289,
587, 604, 635, 2390, 663, 2434, 174, 176, 1462, 1463, 2265, 537, 2229, 1534, 2369, 1214,
1215, 1213, 1216, 86, 112, 1359, 303, 316, 1719, 333, 344, 1811, 14, 874, 238, 1608,
359, 1845, 550, 2272, 564, 2285, 559, 2280, 561, 2282, 563, 2284, 1451, 29, 892, 32,
894, 3, 897, 210, 1559, 192, 1519, 288, 1675, 402, 1900, 403, 1901, 175, 1460, 1657,
85, 111, 1357, 187, 1513, 43, 1047, 2, 896, 406, 1910, 26, 889, 37, 1023, 132,
1379, 143, 1400, 243, 1612, 258, 1622, 371, 1855, 389, 1872, 436, 2017, 443, 2049, 557,
2278, 578, 2297, 501, 2075, 1100, 1091, 1092, 1112, 1902, 1183, 1355, 1316, 1436, 2069, 2072,
1424, 1426, 1428, 1427, 1661, 1532, 1558, 1515, 2011, 1596, 1582, 1581, 1649, 1646, 1723, 1697,
1717, 1715, 1772, 1769, 1761, 1796, 1797, 1841, 1879, 1956, 2056, 2052, 2033, 2051, 2032, 2029,
2030, 446, 2109, 1440, 1346, 1443, 1441, 2247, 2238, 2270, 2312, 2333, 2336, 2368, 2403, 2433,
2413, 1459, 1461, 1535, 1538, 1536, 1276, 1113, 1425, 209, 1660, 1690, 1988, 1541, 1542, 1358,
1315, 1360, 2243, 2185, 2169, 1595, 1583, 1664, 2057, 2034, 447, 2367, 2401, 1974, 1298, 1234,
1011, 1019, 2046, 2043, 1537, 1539, 1064, 1065, 1066, 1063, 1209, 1174, 2332, 1480, 2081, 1508,
2331, 1740, 1550, 886, 1224, 1223, 2048, 2045, 2315, 1352, 1965, 1766, 1153, 1340, 2040, 1860,
2213, 1597, 2036, 1516, 2377, 1540, 2224, 2226, 2228, 2227, 2225, 1549, 885, 1211, 2216, 1739,
1918, 1155, 1341, 1324, 1585, 2042, 1598, 1176, 2329, 1300, 1293, 1171, 1157, 1233, 1226, 1230,
1227, 1547, 883, 1708, 2038, 1707, 1591, 2044, 2314, 1351, 1962, 1764, 1587, 1588, 1343, 1323,
2041, 1187, 1861, 2330, 1159, 1289, 1175, 1210, 1154, 1156, 2214, 1738, 1729, 1296, 2219, 2152,
2151, 2134, 2133, 2047, 1160, 2141, 2079, 2371, 2220, 1297, 1551, 887, 1950, 1687, 1318, 2398,
2217, 1158, 1836, 1837, 2397, 1994, 2232, 1326, 39, 1035, 159, 168, 267, 400, 591, 398,
1645, 38, 54, 188, 98, 158, 656, 167, 530, 264, 285, 306, 331, 350, 620, 399,
423, 441, 511, 517, 584, 421, 80, 424, 395, 266, 588, 1027, 1431, 1447, 1647, 2311,
1026, 1110, 1514, 1313, 1430, 2426, 1446, 2192, 1643, 1671, 1693, 1777, 1834, 2375, 1883, 1959,
2031, 2111, 2110, 2166, 2309, 1954, 1201, 1983, 1876, 1644, 2310, 1884, 2313, 1882, 1111, 2193,
585, 586, 589, 1955, 1877, 515, 104, 299, 491, 508, 2104, 180, 1468, 294, 1682, 227,
1589, 190, 1517, 510, 2108, 96, 1310, 1672, 2035, 2113, 2395, 906, 934, 935, 131, 937,
242, 939, 940, 941, 942, 943, 944, 945, 994, 25, 901, 902, 903, 904, 905, 907,
908, 909, 910, 911, 912, 913, 914, 369, 916, 917, 918, 919, 555, 921, 922, 923,
924, 925, 926, 927, 928, 929, 930, 931, 932, 888, 949, 950, 951, 952, 953, 955,
956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971,
972, 973, 974, 975, 976, 977, 978, 979, 980, 954, 982, 983, 984, 985, 986, 987,
988, 989, 990, 991, 992, 993, 999, 394, 1878, 995, 1000, 144, 1401, 642, 2406, 643,
2407, 640, 2404, 641, 2405, 300, 1689, 425, 1984, 996, 1001, 997, 1002, 273, 1655, 579,
2298, 396, 1880, 397, 1881, 410, 1913, 298, 1686, 2200, 2222, 1924, 1287, 1985, 933, 981,
201, 1530, 200, 1529, 659, 2429, 654, 2418, 283, 1669, 287, 1674, 286, 1673, 280, 1666,
152, 1418, 154, 1420, 420, 1944, 216, 1565, 164, 1439, 527, 2178, 595, 2318, 596, 2319,
217, 1566, 529, 2186, 76, 1197, 79, 1200, 509, 2107, 73, 1193, 75, 1196, 1925, 657,
2427, 284, 1670, 155, 1421, 78, 1199, 9, 869, 28, 891, 36, 1022, 251, 1617, 497,
1005, 498, 2071, 660, 2430, 655, 2419, 113, 1361, 261, 1627, 246, 1615, 373, 1857, 356,
1842, 357, 1843, 581, 2300, 562, 2283, 577, 2296, 77, 1198, 633, 2388, 44, 1048, 51,
1105, 52, 1106, 56, 1133, 66, 1180, 93, 1306, 94, 1307, 106, 1332, 89, 1302, 91,
1304, 149, 1412, 148, 1411, 125, 1373, 172, 1450, 121, 1369, 179, 1467, 205, 1543, 225,
1576, 226, 1577, 224, 1575, 221, 1572, 220, 1571, 271, 1652, 245, 1614, 281, 1667, 292,
1679, 297, 1685, 314, 1705, 315, 1706, 318, 1722, 310, 1701, 325, 1741, 327, 1759, 328,
1760, 340, 1793, 341, 1794, 346, 1814, 338, 1791, 412, 1915, 413, 1916, 392, 1875, 391,
1874, 416, 1921, 418, 1942, 437, 2018, 438, 2019, 439, 2020, 444, 2050, 502, 2076, 503,
2077, 490, 2061, 493, 2067, 504, 2078, 524, 2175, 525, 2176, 536, 2223, 522, 2172, 560,
2281, 599, 2322, 553, 2275, 598, 2321, 582, 2301, 606, 2335, 602, 2325, 614, 2345, 608,
2338, 611, 2341, 612, 2342, 613, 2343, 619, 2374, 618, 2373, 630, 2384, 649, 2412, 652,
2416, 661, 2431, 1584, 2174, 2366, 2400, 1045, 2129, 31, 893, 35, 1021, 17, 877, 19,
879, 20, 880, 22, 881, 18, 878, 8, 868, 11, 871, 12, 872, 13, 873, 10,
870, 137, 1383, 141, 1386, 171, 1449, 124, 1372, 127, 1375, 128, 1376, 130, 1377, 126,
1374, 256, 1620, 250, 1616, 375, 1858, 380, 1863, 363, 1848, 365, 1850, 366, 1851, 368,
1852, 364, 1849, 382, 1865, 384, 1867, 385, 1868, 386, 1869, 383, 1866, 566, 2286, 569,
2288, 571, 2290, 573, 2292, 574, 2293, 575, 2294, 572, 2291, 634, 2389, 631, 2385, 636,
2391, 639, 2402, 1422, 2425, 1018, 1008, 1006, 1007, 1603, 1477, 1417, 1414, 898, 1299, 2303,
2000, 2003, 2005, 2002, 1998, 1999, 1997, 1285, 1286, 1165, 1888, 2258, 1408, 1015, 1016, 1017,
1952, 1768, 2080, 1975, 1562, 1563, 2021, 1454, 1917, 1095, 1510, 2423, 1504, 1492, 2123, 2093,
1399, 1807, 1966, 1433, 1932, 1938, 1832, 2421, 1892, 2260, 2205, 1499, 1487, 2118, 2088, 1394,
1802, 1931, 1937, 1221, 1275, 1511, 1718, 1953, 2364, 2105, 1339, 173, 1189, 1173, 1465, 253,
1733, 1838, 2344, 440, 1973, 2179, 2235, 393, 1034, 1444, 1024, 1899, 2267, 1889, 2204, 1486,
2087, 401, 545, 534, 184, 183, 512, 505, 142, 343, 528, 146, 544, 1897, 2264, 2211,
1503, 1491, 2122, 2092, 1398, 1806, 2184, 1407, 2251, 1068, 1080, 1073, 1059, 1049, 1081, 1084,
1086, 1061, 1060, 1082, 1177, 1568, 1569, 1076, 1085, 1071, 1070, 1074, 1056, 1058, 1057, 1055,
1054, 1923, 1922, 1051, 1053, 1052, 1050, 1078, 1079, 1072, 1087, 1077, 1062, 1172, 2305, 1940,
1458, 1415, 97, 1545, 1403, 1817, 2157, 1816, 1976, 2158, 1763, 1767, 1329, 1094, 1167, 2009,
1982, 1630, 1908, 1031, 1328, 1927, 1826, 1724, 1727, 1637, 2304, 1631, 1294, 1237, 2191, 1108,
2012, 1981, 2114, 2027, 1097, 1236, 1041, 1025, 1040, 1527, 1042, 1628, 1819, 1434, 1823, 1710,
1553, 1714, 1557, 1776, 1775, 1824, 1820, 1825, 1821, 1712, 1555, 1713, 1556, 1822, 1972, 2156,
1827, 1829, 1979, 1980, 1828, 1830, 2022, 2023, 2154, 2161, 1206, 1765, 1204, 1205, 2165, 2164,
1951, 2039, 1347, 1278, 1277, 1711, 1554, 1409, 1593, 1238, 1977, 2028, 1044, 1978, 1636, 1633,
1905, 1312, 1212, 1032, 1033, 1311, 1132, 685, 686, 687, 688, 689, 690, 691, 692, 693,
694, 1404, 2248, 2195, 1505, 1474, 2124, 2094, 1390, 1808, 2252, 1894, 2262, 2207, 1501, 1489,
2120, 2090, 1396, 1804, 2182, 1405, 2249, 2196, 1506, 1475, 2125, 2095, 1391, 1809, 2253, 1895,
2263, 2208, 1502, 1490, 2121, 2091, 1397, 1805, 2183, 1406, 2250, 2197, 1507, 1476, 2126, 2096,
1392, 1810, 2254, 1037, 1135, 1274, 1353, 1429, 1509, 1544, 1594, 1648, 1663, 1688, 1731, 1770,
1831, 1903, 1971, 1989, 2053, 2140, 2234, 2307, 2334, 2365, 2376, 2396, 2432, 15, 50, 68,
90, 122, 178, 194, 222, 239, 275, 290, 309, 326, 337, 361, 417, 428, 434, 499,
521, 551, 601, 609, 617, 626, 648, 875, 1104, 1181, 1303, 1370, 1466, 1521, 1573, 1609,
1658, 1677, 1700, 1758, 1790, 1846, 1941, 1987, 2015, 2073, 2171, 2273, 2324, 2339, 2372, 2381,
2411, 458, 459, 449, 451, 450, 452, 456, 457, 454, 455, 453, 477, 465, 485, 486,
473, 463, 462, 466, 484, 483, 472, 469, 468, 467, 470, 471, 476, 460, 461, 464,
481, 482, 475, 479, 480, 474, 488, 487, 478, 2308, 1334, 1134, 1716, 2055, 1735, 2099,
1331, 1478, 215, 2148, 2143, 2147, 2144, 2145, 2146, 2142, 213, 214, 1479, 2242, 2363, 1130,
2362, 1123, 2356, 2355, 2241, 2239, 2352, 2351, 1118, 2354, 2353, 2240, 843, 2349, 2350, 1481,
1730, 1203, 1348, 1168, 212, 1207, 1208, 846, 1638, 1639, 1120, 1119, 1128, 1129, 1904, 1695,
796, 2360, 801, 2361, 677, 1968, 1970, 684, 1967, 2393, 2130, 1640, 2159, 1469, 1366, 1756,
2137, 1580, 1320, 1217, 2139, 1578, 1319, 1219, 1592, 1990, 1779, 1780, 1107, 1781, 1782, 665,
772, 776, 790, 812, 683, 682, 681, 695, 706, 717, 728, 672, 739, 750, 761, 773,
781, 782, 783, 784, 785, 786, 787, 788, 823, 834, 845, 855, 666, 789, 791, 792,
793, 794, 795, 797, 798, 799, 800, 802, 803, 804, 805, 806, 807, 808, 809, 810,
811, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 824, 825, 826, 827, 828,
829, 830, 831, 832, 833, 835, 837, 839, 777, 840, 778, 844, 847, 848, 849, 863,
864, 865, 667, 668, 669, 670, 671, 673, 674, 675, 854, 856, 859, 860, 857, 858,
779, 850, 780, 851, 852, 853, 861, 862, 696, 697, 698, 699, 700, 701, 702, 703,
704, 705, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 718, 719, 720, 721,
722, 723, 724, 725, 726, 727, 729, 768, 734, 764, 735, 736, 737, 738, 740, 741,
742, 743, 731, 744, 745, 746, 747, 748, 749, 765, 751, 771, 752, 774, 753, 775,
754, 755, 769, 756, 766, 770, 757, 767, 758, 759, 760, 762, 763, 1345, 304, 1721,
1228, 946, 947, 998, 1003, 1004, 23, 62, 100, 101, 102, 206, 229, 323, 1280, 1281,
1288, 1282, 1283, 1292, 1322, 1325, 1273, 2026, 2237, 1890, 2058, 2210, 1190, 1192, 1229, 1232,
1336, 1338, 1601, 1602, 1948, 1949, 1096, 1163, 1354, 1445, 1650, 1734, 1771, 1912, 2054, 2149,
2246, 57, 63, 82, 107, 230, 320, 353, 376, 442, 494, 535, 647, 1457, 1337, 1030,
2422, 1893, 2261, 2206, 1500, 1488, 2119, 2089, 1395, 1803, 1995, 207, 46, 58, 83, 109,
166, 185, 208, 228, 268, 278, 301, 321, 329, 347, 408, 426, 429, 445, 514, 543,
594, 605, 615, 621, 638, 662, 1456, 1191, 103, 324, 24, 72, 1993, 34, 6, 21,
48, 30, 45, 4, 67, 140, 118, 129, 134, 255, 236, 241, 247, 170, 349, 378,
355, 367, 414, 374, 407, 568, 548, 554, 565, 624, 533, 629, 1748, 2063, 2062, 2065,
2064, 1749, 1747, 1746, 1745, 1752, 1751, 1750, 1755, 1754, 1753, 1744, 1743, 1742, 2189, 2188,
2187, 1798, 2010, 1088, 1067, 2025, 1272, 2236, 1933, 1930, 1929, 1148, 1147, 1146, 1140, 1139,
1138, 1136, 1634, 1939, 1936, 1935, 1152, 1151, 1150, 1144, 1143, 1142, 1039, 1470, 1473, 1493,
1471, 1472, 1010,
}
// ---------------------------------------------------------------------------
// Name matching
// ---------------------------------------------------------------------------
// std_strip_subset removes the "ABCDEF+" tag a subsetter puts in front of a
// /BaseFont name (ISO 32000-2, 9.9.2). The format says six uppercase letters,
// but producers emit four, and lowercase, often enough that the check here is
// "letters then a plus, within the first eight bytes" instead. A real font name
// with a '+' that early is not a thing, so nothing legitimate is eaten.
@(private)
std_strip_subset :: proc(name: string) -> string {
limit := min(len(name), 8)
for i in 0 ..< limit {
c := name[i]
if c == '+' {
return i > 0 ? name[i + 1:] : name
}
if !((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
break
}
}
return name
}
// std_normalize lowercases `name` into `buf` and drops everything that is not a
// letter or a digit, so that "Arial-BoldMT", "Arial,Bold" and "ArialBold" all
// compare equal. Returns the prefix of buf that was filled; a name longer than
// buf is truncated, which only loses a style suffix on a name no producer
// writes.
@(private)
std_normalize :: proc(name: string, buf: []u8) -> string {
n := 0
for i in 0 ..< len(name) {
if n >= len(buf) {
break
}
c := name[i]
if c >= 'A' && c <= 'Z' {
c += 'a' - 'A'
}
if (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') {
buf[n] = c
n += 1
}
}
return string(buf[:n])
}
// std_contains is `strings.contains` without the import; it runs over a name
// that came out of a file, so it is written to be obviously bounded.
@(private)
std_contains :: proc(hay, needle: string) -> bool {
if len(needle) == 0 {
return true
}
if len(needle) > len(hay) {
return false
}
for i in 0 ..= len(hay) - len(needle) {
if hay[i:i + len(needle)] == needle {
return true
}
}
return false
}
// std_font_lookup matches a /BaseFont name against the standard 14 and returns
// the index of the metrics to use.
//
// Matching is deliberately loose in one direction and strict in the other: any
// spelling of a standard font resolves (subset tag stripped, case and
// punctuation ignored, the Monotype and URW aliases folded in, style read out of
// the name), but a font that is not one of the fourteen returns false rather
// than being silently substituted. Choosing a substitute for an arbitrary
// missing font is a decision about descriptor flags, and it belongs in
// font.odin, not in a metrics table.
@(private)
std_font_lookup :: proc(base_font: string) -> (index: int, ok: bool) {
buf: [128]u8
n := std_normalize(std_strip_subset(base_font), buf[:])
if len(n) == 0 {
return 0, false
}
// The two symbolic fonts have no styles: "Symbol,Bold" is still Symbol.
if std_contains(n, "zapfdingbat") || std_contains(n, "dingbats") {
return STD_ZAPF_DINGBATS, true
}
if std_contains(n, "symbol") {
return STD_SYMBOL, true
}
family := -1
switch {
case std_contains(n, "courier") || std_contains(n, "nimbusmon") || std_contains(n, "monospac"):
family = STD_COURIER
case std_contains(n, "helvetica") || std_contains(n, "arial") || std_contains(n, "nimbussan"):
family = STD_HELVETICA
case std_contains(n, "times") || std_contains(n, "nimbusrom"):
family = STD_TIMES_ROMAN
}
if family < 0 {
return 0, false
}
style := 0
// "semibold" and "extrabold" both contain "bold"; "black" and "heavy" are
// the other names producers give the bold face of these families.
if std_contains(n, "bold") || std_contains(n, "black") || std_contains(n, "heavy") {
style += 1
}
if std_contains(n, "italic") || std_contains(n, "oblique") {
style += 2
}
return family + style, true
}
// std_font_name is the canonical PostScript name of a standard font, or "" for
// an index that is not one.
@(private)
std_font_name :: proc(index: int) -> string {
if index < 0 || index >= STD_FONT_COUNT {
return ""
}
return STD_FONT_NAMES[index]
}
// std_font_is_symbolic reports whether the font uses a built-in, font-specific
// encoding rather than a Latin text encoding -- true only for Symbol and
// ZapfDingbats, whose descriptors set the Symbolic flag (ISO 32000-2, 9.8.2).
@(private)
std_font_is_symbolic :: proc(index: int) -> bool {
return index == STD_SYMBOL || index == STD_ZAPF_DINGBATS
}
// std_font_builtin_encoding is the encoding a standard font uses when the font
// dictionary gives none. The twelve text fonts are AdobeStandardEncoding, which
// is what their AFMs declare; Symbol and ZapfDingbats each have their own.
// Returns nil for an index that is not a standard font.
@(private)
std_font_builtin_encoding :: proc(index: int) -> ^[256]string {
switch {
case index == STD_SYMBOL:
return &ENC_SYMBOL
case index == STD_ZAPF_DINGBATS:
return &ENC_ZAPF
case index >= 0 && index < STD_FONT_COUNT:
return &ENC_STANDARD
}
return nil
}
// ---------------------------------------------------------------------------
// Widths
// ---------------------------------------------------------------------------
// std_glyph_search is a binary search over a sorted glyph-name table. Odin
// compares strings byte-wise, which is the order the tables were generated in.
@(private)
std_glyph_search :: proc(names: []string, name: string) -> (int, bool) {
lo, hi := 0, len(names)
for lo < hi {
mid := lo + (hi - lo) / 2
if names[mid] < name {
lo = mid + 1
} else {
hi = mid
}
}
if lo < len(names) && names[lo] == name {
return lo, true
}
return 0, false
}
// std_font_width is the advance of one glyph of a standard font, in glyph space
// (1/1000 of the text space unit; all fourteen are 1000 units per em).
//
// ok is false when the font has no such glyph, which is the caller's cue to fall
// back to the descriptor's /MissingWidth. Courier is the exception: it is
// fixed-pitch, so 600 is the answer for any name at all, including one the font
// cannot draw -- a viewer still advances the pen by one cell.
@(private)
std_font_width :: proc(index: int, glyph_name: string) -> (width: f64, ok: bool) {
if len(glyph_name) == 0 {
return 0, false
}
switch {
case index >= STD_COURIER && index <= STD_COURIER_BOLD_OBLIQUE:
return 600, true
case index >= STD_HELVETICA && index <= STD_TIMES_BOLD_ITALIC:
i := std_glyph_search(STD_TEXT_GLYPHS[:], glyph_name) or_return
return f64(STD_TEXT_WIDTHS[index - STD_HELVETICA][i]), true
case index == STD_SYMBOL:
i := std_glyph_search(STD_SYMBOL_GLYPHS[:], glyph_name) or_return
return f64(STD_SYMBOL_WIDTHS[i]), true
case index == STD_ZAPF_DINGBATS:
i := std_glyph_search(STD_ZAPF_GLYPHS[:], glyph_name) or_return
return f64(STD_ZAPF_WIDTHS[i]), true
}
return 0, false
}
// ---------------------------------------------------------------------------
// The built-in encodings
// ---------------------------------------------------------------------------
//
// Each is 256 glyph names, "" where the encoding leaves the code undefined. The
// tables are read-only and live for the life of the program, so handing back a
// pointer costs nothing and lets a font apply /Differences over a copy.
@(private)
encoding_standard :: proc() -> ^[256]string { return &ENC_STANDARD }
@(private)
encoding_winansi :: proc() -> ^[256]string { return &ENC_WINANSI }
@(private)
encoding_macroman :: proc() -> ^[256]string { return &ENC_MACROMAN }
@(private)
encoding_macexpert :: proc() -> ^[256]string { return &ENC_MACEXPERT }
@(private)
encoding_symbol :: proc() -> ^[256]string { return &ENC_SYMBOL }
@(private)
encoding_zapf :: proc() -> ^[256]string { return &ENC_ZAPF }
// encoding_macroman_code is ENC_MACROMAN read the other way round: the code a
// glyph name sits at in MacRomanEncoding, if it sits at one.
//
// ISO 32000-2, 9.6.5.4 needs exactly this to reach a non-symbolic TrueType
// font's (1,0) cmap, which is keyed by Mac Roman codes and not by the codes
// the PDF's own /Encoding uses. Without it a font whose only cmap is (1,0)
// resolves nothing above ASCII.
//
// A linear scan rather than a second sorted table: it runs only for a code the
// other routes could not resolve, and a reverse table would be one more thing
// to keep in step with the forward one for no measurable gain. "space" is the
// one name the encoding repeats (0x20 and 0xCA); the lower code is the one
// meant, and scanning upwards is what returns it.
@(private)
encoding_macroman_code :: proc(name: string) -> (u8, bool) {
if name == "" {
return 0, false
}
for nm, i in ENC_MACROMAN {
if nm == name {
return u8(i), true
}
}
return 0, false
}
// encoding_by_name resolves an /Encoding or /BaseEncoding name. Returns nil for
// anything else, which the caller must read as "keep the font's built-in
// encoding" -- an unknown name is not a reason to reset a font to Standard.
// The bare forms are accepted because they appear in the wild.
@(private)
encoding_by_name :: proc(name: string) -> ^[256]string {
switch name {
case "WinAnsiEncoding", "WinAnsi":
return &ENC_WINANSI
case "MacRomanEncoding", "MacRoman":
return &ENC_MACROMAN
case "MacExpertEncoding", "MacExpert":
return &ENC_MACEXPERT
case "StandardEncoding", "Standard":
return &ENC_STANDARD
case "SymbolEncoding", "Symbol":
return &ENC_SYMBOL
case "ZapfDingbatsEncoding", "ZapfDingbats":
return &ENC_ZAPF
}
return nil
}
// ---------------------------------------------------------------------------
// Glyph names and Unicode
// ---------------------------------------------------------------------------
// agl_search is a binary search over AGL_TABLE, which is sorted by name.
@(private)
agl_search :: proc(name: string) -> (rune, bool) {
lo, hi := 0, len(AGL_TABLE)
for lo < hi {
mid := lo + (hi - lo) / 2
if AGL_TABLE[mid].name < name {
lo = mid + 1
} else {
hi = mid
}
}
if lo < len(AGL_TABLE) && AGL_TABLE[lo].name == name {
return AGL_TABLE[lo].cp, true
}
return -1, false
}
// agl_hex_prefix reads exactly `n` hex digits from the front of s. The AGL says
// uppercase, but "uni00e9" is common enough in real fonts that rejecting it
// would lose characters for no gain.
@(private)
agl_hex_prefix :: proc(s: string, n: int) -> (cp: rune, ok: bool) {
if len(s) < n {
return -1, false
}
v := 0
for i in 0 ..< n {
// hex_value is object.odin's, and is the package's one hex digit
// decoder: a second copy here is a second place to get it wrong.
d, valid := hex_value(s[i])
if !valid {
return -1, false
}
v = v * 16 + int(d)
}
return rune(v), true
}
// agl_valid_rune rejects what cannot be a character: surrogate halves (which a
// glyph name is explicitly not allowed to encode) and anything past the end of
// the code space.
@(private)
agl_valid_rune :: proc(r: rune) -> bool {
return r >= 0 && r <= 0x10FFFF && !(r >= 0xD800 && r <= 0xDFFF)
}
// agl_is_index_name reports whether a name is one of the "this is glyph number
// N" spellings -- gNN, cidNN, indexNN, glyphNN -- that subsetters and broken
// producers emit. They carry no Unicode at all, and reading the digits as a
// character would put arbitrary text into a document that has none.
//
// No AGL name has this shape, so today the fallthrough below would answer -1
// anyway; the rule is written out so that it survives a change to the table, and
// the test asserts the table still has no such name.
@(private)
agl_is_index_name :: proc(name: string) -> bool {
prefixes := [?]string{"g", "cid", "index", "glyph"}
for p in prefixes {
if len(name) > len(p) && name[:len(p)] == p {
all_digits := true
for i in len(p) ..< len(name) {
if name[i] < '0' || name[i] > '9' {
all_digits = false
break
}
}
if all_digits {
return true
}
}
}
return false
}
// glyph_name_to_rune maps a glyph name to Unicode by the Adobe Glyph List
// algorithm ("Unicode and Glyph Names", Adobe technical note), returning -1 when
// the name carries no character.
//
// The algorithm, in order:
//
// 1. drop everything from the first '.', so "a.sc" is "a" and ".notdef" is
// nothing at all;
// 2. split on '_' and take the first component -- "f_i" is a ligature glyph,
// and one rune has to stand for it;
// 3. look the component up in the AGL;
// 4. "uniXXXX" with a multiple of four hex digits, first code point wins;
// 5. "uXXXX" through "uXXXXXX";
// 6. otherwise nothing.
//
// The AGL is consulted before the uni/u forms because a legitimate name can look
// like one: "union" starts with "uni" and would otherwise be searched for hex.
@(private)
glyph_name_to_rune :: proc(name: string) -> rune {
s := name
for i in 0 ..< len(s) {
if s[i] == '.' {
s = s[:i]
break
}
}
for i in 0 ..< len(s) {
if s[i] == '_' {
s = s[:i]
break
}
}
if len(s) == 0 {
return -1
}
if r, ok := agl_search(s); ok {
return r
}
if agl_is_index_name(s) {
return -1
}
if len(s) > 3 && s[:3] == "uni" {
// Four hex digits per code point, and every group has to be whole and in
// range for the name to mean anything -- "uni41" and "uni0041D800" are
// both nothing. Only the first code point survives as a rune.
rest := s[3:]
first := rune(-1)
for i := 0; i < len(rest); i += 4 {
r, ok := agl_hex_prefix(rest[i:], 4)
if !ok || !agl_valid_rune(r) {
return -1
}
if i == 0 {
first = r
}
}
return first
}
if len(s) >= 5 && len(s) <= 7 && s[0] == 'u' {
if r, ok := agl_hex_prefix(s[1:], len(s) - 1); ok && agl_valid_rune(r) {
return r
}
}
return -1
}
// rune_to_glyph_name is the other direction: the name a font is most likely to
// use for a character, or "" when the AGL has none. Where several names share a
// code point the one Adobe's AGLFN list prefers wins, so the ASCII range comes
// back as the plain names ("A", "space", "period") and round-trips through
// glyph_name_to_rune.
@(private)
rune_to_glyph_name :: proc(r: rune) -> string {
lo, hi := 0, len(AGL_BY_RUNE)
for lo < hi {
mid := lo + (hi - lo) / 2
if AGL_TABLE[AGL_BY_RUNE[mid]].cp < r {
lo = mid + 1
} else {
hi = mid
}
}
if lo < len(AGL_BY_RUNE) {
e := AGL_TABLE[AGL_BY_RUNE[lo]]
if e.cp == r {
return e.name
}
}
return ""
}