Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
// Tags for FIX ME!!!: (in order of priority)
// XXX - should be fixed NAO!
// XERROR - with regards to parse errors
// XSCRIPT - with regards to scripting mode
// XENCODING - with regards to encoding (for reparsing tests)
// XDOM - DOM specific code (tagName is explicitly not marked).
// this is not (yet) in helper functions.
class HTML5_TreeBuilder {
public $stack = array();
public $content_model;
private $mode;
private $original_mode;
private $secondary_mode;
private $dom;
// Whether or not normal insertion of nodes should actually foster
// parent (used in one case in spec)
private $foster_parent = false;
private $a_formatting = array();
private $head_pointer = null;
private $form_pointer = null;
private $flag_frameset_ok = true;
private $flag_force_quirks = false;
private $ignored = false;
private $quirks_mode = null;
// this gets to 2 when we want to ignore the next lf character, and
// is decrement at the beginning of each processed token (this way,
// code can check for (bool)$ignore_lf_token, but it phases out
// appropriately)
private $ignore_lf_token = 0;
private $fragment = false;
private $root;
private $scoping = array('applet','button','caption','html','marquee','object','table','td','th', 'svg:foreignObject');
private $formatting = array('a','b','big','code','em','font','i','nobr','s','small','strike','strong','tt','u');
// dl and ds are speculative
private $special = array('address','area','article','aside','base','basefont','bgsound',
'blockquote','body','br','center','col','colgroup','command','dc','dd','details','dir','div','dl','ds',
'dt','embed','fieldset','figure','footer','form','frame','frameset','h1','h2','h3','h4','h5',
'h6','head','header','hgroup','hr','iframe','img','input','isindex','li','link',
'listing','menu','meta','nav','noembed','noframes','noscript','ol',
'p','param','plaintext','pre','script','select','spacer','style',
'tbody','textarea','tfoot','thead','title','tr','ul','wbr');
private $pendingTableCharacters;
private $pendingTableCharactersDirty;
// Tree construction modes
const INITIAL = 0;
const BEFORE_HTML = 1;
const BEFORE_HEAD = 2;
const IN_HEAD = 3;
const IN_HEAD_NOSCRIPT = 4;
const AFTER_HEAD = 5;
const IN_BODY = 6;
const IN_CDATA_RCDATA = 7;
const IN_TABLE = 8;
const IN_TABLE_TEXT = 9;
const IN_CAPTION = 10;
const IN_COLUMN_GROUP = 11;
const IN_TABLE_BODY = 12;
const IN_ROW = 13;
const IN_CELL = 14;
const IN_SELECT = 15;
const IN_SELECT_IN_TABLE= 16;
const IN_FOREIGN_CONTENT= 17;
const AFTER_BODY = 18;
const IN_FRAMESET = 19;
const AFTER_FRAMESET = 20;
const AFTER_AFTER_BODY = 21;
const AFTER_AFTER_FRAMESET = 22;
/**
* Converts a magic number to a readable name. Use for debugging.
*/
private function strConst($number) {
static $lookup;
if (!$lookup) {
$lookup = array();
$r = new ReflectionClass('HTML5_TreeBuilder');
$consts = $r->getConstants();
foreach ($consts as $const => $num) {
if (!is_int($num)) {
continue;
}
$lookup[$num] = $const;
}
}
return $lookup[$number];
}
// The different types of elements.
const SPECIAL = 100;
const SCOPING = 101;
const FORMATTING = 102;
const PHRASING = 103;
// Quirks modes in $quirks_mode
const NO_QUIRKS = 200;
const QUIRKS_MODE = 201;
const LIMITED_QUIRKS_MODE = 202;
// Marker to be placed in $a_formatting
const MARKER = 300;
// Namespaces for foreign content
const NS_HTML = null; // to prevent DOM from requiring NS on everything
const NS_MATHML = 'http://www.w3.org/1998/Math/MathML';
const NS_SVG = 'http://www.w3.org/2000/svg';
const NS_XLINK = 'http://www.w3.org/1999/xlink';
const NS_XML = 'http://www.w3.org/XML/1998/namespace';
const NS_XMLNS = 'http://www.w3.org/2000/xmlns/';
// Different types of scopes to test for elements
const SCOPE = 0;
const SCOPE_LISTITEM = 1;
const SCOPE_TABLE = 2;
/**
* HTML5_TreeBuilder constructor.
*/
public function __construct() {
$this->mode = self::INITIAL;
$this->dom = new DOMDocument;
$this->dom->encoding = 'UTF-8';
$this->dom->preserveWhiteSpace = true;
$this->dom->substituteEntities = true;
$this->dom->strictErrorChecking = false;
}
public function getQuirksMode(){
return $this->quirks_mode;
}
/**
* Process tag tokens
*
* @param $token
* @param null $mode
*/
public function emitToken($token, $mode = null) {
// XXX: ignore parse errors... why are we emitting them, again?
if ($token['type'] === HTML5_Tokenizer::PARSEERROR) {
return;
}
if ($mode === null) {
$mode = $this->mode;
}
/*
$backtrace = debug_backtrace();
if ($backtrace[1]['class'] !== 'HTML5_TreeBuilder') echo "--\n";
echo $this->strConst($mode);
if ($this->original_mode) echo " (originally ".$this->strConst($this->original_mode).")";
echo "\n ";
token_dump($token);
$this->printStack();
$this->printActiveFormattingElements();
if ($this->foster_parent) echo " -> this is a foster parent mode\n";
if ($this->flag_frameset_ok) echo " -> frameset ok\n";
*/
if ($this->ignore_lf_token) {
$this->ignore_lf_token--;
}
$this->ignored = false;
switch ($mode) {
case self::INITIAL:
/* A character token that is one of U+0009 CHARACTER TABULATION,
* U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE */
if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
/* Ignore the token. */
$this->ignored = true;
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
if (
$token['name'] !== 'html' || !empty($token['public']) ||
!empty($token['system']) || $token !== 'about:legacy-compat'
) {
/* If the DOCTYPE token's name is not a case-sensitive match
* for the string "html", or if the token's public identifier
* is not missing, or if the token's system identifier is
* neither missing nor a case-sensitive match for the string
* "about:legacy-compat", then there is a parse error (this
* is the DOCTYPE parse error). */
// DOCTYPE parse error
}
/* Append a DocumentType node to the Document node, with the name
* attribute set to the name given in the DOCTYPE token, or the
* empty string if the name was missing; the publicId attribute
* set to the public identifier given in the DOCTYPE token, or
* the empty string if the public identifier was missing; the
* systemId attribute set to the system identifier given in the
* DOCTYPE token, or the empty string if the system identifier
* was missing; and the other attributes specific to
* DocumentType objects set to null and empty lists as
* appropriate. Associate the DocumentType node with the
* Document object so that it is returned as the value of the
* doctype attribute of the Document object. */
if (!isset($token['public'])) {
$token['public'] = null;
}
if (!isset($token['system'])) {
$token['system'] = null;
}
// XDOM
// Yes this is hacky. I'm kind of annoyed that I can't appendChild
// a doctype to DOMDocument. Maybe I haven't chanted the right
// syllables.
$impl = new DOMImplementation();
// This call can fail for particularly pathological cases (namely,
// the qualifiedName parameter ($token['name']) could be missing.
if ($token['name']) {
$doctype = $impl->createDocumentType($token['name'], $token['public'], $token['system']);
$this->dom->appendChild($doctype);
} else {
// It looks like libxml's not actually *able* to express this case.
// So... don't.
$this->dom->emptyDoctype = true;
}
$public = is_null($token['public']) ? false : strtolower($token['public']);
$system = is_null($token['system']) ? false : strtolower($token['system']);
$publicStartsWithForQuirks = array(
"+//silmaril//dtd html pro v0r11 19970101//",
"-//advasoft ltd//dtd html 3.0 aswedit + extensions//",
"-//as//dtd html 3.0 aswedit + extensions//",
"-//ietf//dtd html 2.0 level 1//",
"-//ietf//dtd html 2.0 level 2//",
"-//ietf//dtd html 2.0 strict level 1//",
"-//ietf//dtd html 2.0 strict level 2//",
"-//ietf//dtd html 2.0 strict//",
"-//ietf//dtd html 2.0//",
"-//ietf//dtd html 2.1e//",
"-//ietf//dtd html 3.0//",
"-//ietf//dtd html 3.2 final//",
"-//ietf//dtd html 3.2//",
"-//ietf//dtd html 3//",
"-//ietf//dtd html level 0//",
"-//ietf//dtd html level 1//",
"-//ietf//dtd html level 2//",
"-//ietf//dtd html level 3//",
"-//ietf//dtd html strict level 0//",
"-//ietf//dtd html strict level 1//",
"-//ietf//dtd html strict level 2//",
"-//ietf//dtd html strict level 3//",
"-//ietf//dtd html strict//",
"-//ietf//dtd html//",
"-//metrius//dtd metrius presentational//",
"-//microsoft//dtd internet explorer 2.0 html strict//",
"-//microsoft//dtd internet explorer 2.0 html//",
"-//microsoft//dtd internet explorer 2.0 tables//",
"-//microsoft//dtd internet explorer 3.0 html strict//",
"-//microsoft//dtd internet explorer 3.0 html//",
"-//microsoft//dtd internet explorer 3.0 tables//",
"-//netscape comm. corp.//dtd html//",
"-//netscape comm. corp.//dtd strict html//",
"-//o'reilly and associates//dtd html 2.0//",
"-//o'reilly and associates//dtd html extended 1.0//",
"-//o'reilly and associates//dtd html extended relaxed 1.0//",
"-//spyglass//dtd html 2.0 extended//",
"-//sq//dtd html 2.0 hotmetal + extensions//",
"-//sun microsystems corp.//dtd hotjava html//",
"-//sun microsystems corp.//dtd hotjava strict html//",
"-//w3c//dtd html 3 1995-03-24//",
"-//w3c//dtd html 3.2 draft//",
"-//w3c//dtd html 3.2 final//",
"-//w3c//dtd html 3.2//",
"-//w3c//dtd html 3.2s draft//",
"-//w3c//dtd html 4.0 frameset//",
"-//w3c//dtd html 4.0 transitional//",
"-//w3c//dtd html experimental 19960712//",
"-//w3c//dtd html experimental 970421//",
"-//w3c//dtd w3 html//",
"-//w3o//dtd w3 html 3.0//",
"-//webtechs//dtd mozilla html 2.0//",
"-//webtechs//dtd mozilla html//",
);
$publicSetToForQuirks = array(
"-//w3o//dtd w3 html strict 3.0//",
"-/w3c/dtd html 4.0 transitional/en",
"html",
);
$publicStartsWithAndSystemForQuirks = array(
"-//w3c//dtd html 4.01 frameset//",
"-//w3c//dtd html 4.01 transitional//",
);
$publicStartsWithForLimitedQuirks = array(
"-//w3c//dtd xhtml 1.0 frameset//",
"-//w3c//dtd xhtml 1.0 transitional//",
);
$publicStartsWithAndSystemForLimitedQuirks = array(
"-//w3c//dtd html 4.01 frameset//",
"-//w3c//dtd html 4.01 transitional//",
);
// first, do easy checks
if (
!empty($token['force-quirks']) ||
strtolower($token['name']) !== 'html'
) {
$this->quirks_mode = self::QUIRKS_MODE;
} else {
do {
if ($system) {
foreach ($publicStartsWithAndSystemForQuirks as $x) {
if (strncmp($public, $x, strlen($x)) === 0) {
$this->quirks_mode = self::QUIRKS_MODE;
break;
}
}
if (!is_null($this->quirks_mode)) {
break;
}
foreach ($publicStartsWithAndSystemForLimitedQuirks as $x) {
if (strncmp($public, $x, strlen($x)) === 0) {
$this->quirks_mode = self::LIMITED_QUIRKS_MODE;
break;
}
}
if (!is_null($this->quirks_mode)) {
break;
}
}
foreach ($publicSetToForQuirks as $x) {
if ($public === $x) {
$this->quirks_mode = self::QUIRKS_MODE;
break;
}
}
if (!is_null($this->quirks_mode)) {
break;
}
foreach ($publicStartsWithForLimitedQuirks as $x) {
if (strncmp($public, $x, strlen($x)) === 0) {
$this->quirks_mode = self::LIMITED_QUIRKS_MODE;
}
}
if (!is_null($this->quirks_mode)) {
break;
}
if ($system === "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") {
$this->quirks_mode = self::QUIRKS_MODE;
break;
}
foreach ($publicStartsWithForQuirks as $x) {
if (strncmp($public, $x, strlen($x)) === 0) {
$this->quirks_mode = self::QUIRKS_MODE;
break;
}
}
if (is_null($this->quirks_mode)) {
$this->quirks_mode = self::NO_QUIRKS;
}
} while (false);
}
$this->mode = self::BEFORE_HTML;
} else {
// parse error
/* Switch the insertion mode to "before html", then reprocess the
* current token. */
$this->mode = self::BEFORE_HTML;
$this->quirks_mode = self::QUIRKS_MODE;
$this->emitToken($token);
}
break;
case self::BEFORE_HTML:
/* A DOCTYPE token */
if ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
// Parse error. Ignore the token.
$this->ignored = true;
/* A comment token */
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the Document object with the data
attribute set to the data given in the comment token. */
// XDOM
$comment = $this->dom->createComment($token['data']);
$this->dom->appendChild($comment);
/* A character token that is one of one of U+0009 CHARACTER TABULATION,
U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
or U+0020 SPACE */
} elseif ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
/* Ignore the token. */
$this->ignored = true;
/* A start tag whose tag name is "html" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] == 'html') {
/* Create an element for the token in the HTML namespace. Append it
* to the Document object. Put this element in the stack of open
* elements. */
// XDOM
$html = $this->insertElement($token, false);
$this->dom->appendChild($html);
$this->stack[] = $html;
$this->mode = self::BEFORE_HEAD;
} else {
/* Create an html element. Append it to the Document object. Put
* this element in the stack of open elements. */
// XDOM
$html = $this->dom->createElementNS(self::NS_HTML, 'html');
$this->dom->appendChild($html);
$this->stack[] = $html;
/* Switch the insertion mode to "before head", then reprocess the
* current token. */
$this->mode = self::BEFORE_HEAD;
$this->emitToken($token);
}
break;
case self::BEFORE_HEAD:
/* A character token that is one of one of U+0009 CHARACTER TABULATION,
U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
or U+0020 SPACE */
if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
/* Ignore the token. */
$this->ignored = true;
/* A comment token */
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the current node with the data attribute
set to the data given in the comment token. */
$this->insertComment($token['data']);
/* A DOCTYPE token */
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
/* Parse error. Ignore the token */
$this->ignored = true;
// parse error
/* A start tag token with the tag name "html" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
/* Process the token using the rules for the "in body"
* insertion mode. */
$this->processWithRulesFor($token, self::IN_BODY);
/* A start tag token with the tag name "head" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'head') {
/* Insert an HTML element for the token. */
$element = $this->insertElement($token);
/* Set the head element pointer to this new element node. */
$this->head_pointer = $element;
/* Change the insertion mode to "in head". */
$this->mode = self::IN_HEAD;
/* An end tag whose tag name is one of: "head", "body", "html", "br" */
} elseif (
$token['type'] === HTML5_Tokenizer::ENDTAG && (
$token['name'] === 'head' || $token['name'] === 'body' ||
$token['name'] === 'html' || $token['name'] === 'br'
)) {
/* Act as if a start tag token with the tag name "head" and no
* attributes had been seen, then reprocess the current token. */
$this->emitToken(array(
'name' => 'head',
'type' => HTML5_Tokenizer::STARTTAG,
'attr' => array()
));
$this->emitToken($token);
/* Any other end tag */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG) {
/* Parse error. Ignore the token. */
$this->ignored = true;
} else {
/* Act as if a start tag token with the tag name "head" and no
* attributes had been seen, then reprocess the current token.
* Note: This will result in an empty head element being
* generated, with the current token being reprocessed in the
* "after head" insertion mode. */
$this->emitToken(array(
'name' => 'head',
'type' => HTML5_Tokenizer::STARTTAG,
'attr' => array()
));
$this->emitToken($token);
}
break;
case self::IN_HEAD:
/* A character token that is one of one of U+0009 CHARACTER TABULATION,
U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
or U+0020 SPACE. */
if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
/* Insert the character into the current node. */
$this->insertText($token['data']);
/* A comment token */
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the current node with the data attribute
set to the data given in the comment token. */
$this->insertComment($token['data']);
/* A DOCTYPE token */
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
/* Parse error. Ignore the token. */
$this->ignored = true;
// parse error
/* A start tag whose tag name is "html" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'html') {
$this->processWithRulesFor($token, self::IN_BODY);
/* A start tag whose tag name is one of: "base", "command", "link" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
($token['name'] === 'base' || $token['name'] === 'command' ||
$token['name'] === 'link')) {
/* Insert an HTML element for the token. Immediately pop the
* current node off the stack of open elements. */
$this->insertElement($token);
array_pop($this->stack);
// YYY: Acknowledge the token's self-closing flag, if it is set.
/* A start tag whose tag name is "meta" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'meta') {
/* Insert an HTML element for the token. Immediately pop the
* current node off the stack of open elements. */
$this->insertElement($token);
array_pop($this->stack);
// XERROR: Acknowledge the token's self-closing flag, if it is set.
// XENCODING: If the element has a charset attribute, and its value is a
// supported encoding, and the confidence is currently tentative,
// then change the encoding to the encoding given by the value of
// the charset attribute.
//
// Otherwise, if the element has a content attribute, and applying
// the algorithm for extracting an encoding from a Content-Type to
// its value returns a supported encoding encoding, and the
// confidence is currently tentative, then change the encoding to
// the encoding encoding.
/* A start tag with the tag name "title" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'title') {
$this->insertRCDATAElement($token);
/* A start tag whose tag name is "noscript", if the scripting flag is enabled, or
* A start tag whose tag name is one of: "noframes", "style" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
($token['name'] === 'noscript' || $token['name'] === 'noframes' || $token['name'] === 'style')) {
// XSCRIPT: Scripting flag not respected
$this->insertCDATAElement($token);
// XSCRIPT: Scripting flag disable not implemented
/* A start tag with the tag name "script" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'script') {
/* 1. Create an element for the token in the HTML namespace. */
$node = $this->insertElement($token, false);
/* 2. Mark the element as being "parser-inserted" */
// Uhhh... XSCRIPT
/* 3. If the parser was originally created for the HTML
* fragment parsing algorithm, then mark the script element as
* "already executed". (fragment case) */
// ditto... XSCRIPT
/* 4. Append the new element to the current node and push it onto
* the stack of open elements. */
end($this->stack)->appendChild($node);
$this->stack[] = $node;
// I guess we could squash these together
/* 6. Let the original insertion mode be the current insertion mode. */
$this->original_mode = $this->mode;
/* 7. Switch the insertion mode to "in CDATA/RCDATA" */
$this->mode = self::IN_CDATA_RCDATA;
/* 5. Switch the tokeniser's content model flag to the CDATA state. */
$this->content_model = HTML5_Tokenizer::CDATA;
/* An end tag with the tag name "head" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'head') {
/* Pop the current node (which will be the head element) off the stack of open elements. */
array_pop($this->stack);
/* Change the insertion mode to "after head". */
$this->mode = self::AFTER_HEAD;
// Slight logic inversion here to minimize duplication
/* A start tag with the tag name "head". */
/* An end tag whose tag name is not one of: "body", "html", "br" */
} elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'head') ||
($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] !== 'html' &&
$token['name'] !== 'body' && $token['name'] !== 'br')) {
// Parse error. Ignore the token.
$this->ignored = true;
/* Anything else */
} else {
/* Act as if an end tag token with the tag name "head" had been
* seen, and reprocess the current token. */
$this->emitToken(array(
'name' => 'head',
'type' => HTML5_Tokenizer::ENDTAG
));
/* Then, reprocess the current token. */
$this->emitToken($token);
}
break;
case self::IN_HEAD_NOSCRIPT:
if ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
// parse error
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
$this->processWithRulesFor($token, self::IN_BODY);
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'noscript') {
/* Pop the current node (which will be a noscript element) from the
* stack of open elements; the new current node will be a head
* element. */
array_pop($this->stack);
$this->mode = self::IN_HEAD;
} elseif (
($token['type'] === HTML5_Tokenizer::SPACECHARACTER) ||
($token['type'] === HTML5_Tokenizer::COMMENT) ||
($token['type'] === HTML5_Tokenizer::STARTTAG && (
$token['name'] === 'link' || $token['name'] === 'meta' ||
$token['name'] === 'noframes' || $token['name'] === 'style'))) {
$this->processWithRulesFor($token, self::IN_HEAD);
// inverted logic
} elseif (
($token['type'] === HTML5_Tokenizer::STARTTAG && (
$token['name'] === 'head' || $token['name'] === 'noscript')) ||
($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] !== 'br')) {
// parse error
} else {
// parse error
$this->emitToken(array(
'type' => HTML5_Tokenizer::ENDTAG,
'name' => 'noscript',
));
$this->emitToken($token);
}
break;
case self::AFTER_HEAD:
/* Handle the token as follows: */
/* A character token that is one of one of U+0009 CHARACTER TABULATION,
U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
or U+0020 SPACE */
if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
/* Append the character to the current node. */
$this->insertText($token['data']);
/* A comment token */
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the current node with the data attribute
set to the data given in the comment token. */
$this->insertComment($token['data']);
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
// parse error
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
$this->processWithRulesFor($token, self::IN_BODY);
/* A start tag token with the tag name "body" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'body') {
$this->insertElement($token);
/* Set the frameset-ok flag to "not ok". */
$this->flag_frameset_ok = false;
/* Change the insertion mode to "in body". */
$this->mode = self::IN_BODY;
/* A start tag token with the tag name "frameset" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'frameset') {
/* Insert a frameset element for the token. */
$this->insertElement($token);
/* Change the insertion mode to "in frameset". */
$this->mode = self::IN_FRAMESET;
/* A start tag token whose tag name is one of: "base", "link", "meta",
"script", "style", "title" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
array('base', 'link', 'meta', 'noframes', 'script', 'style', 'title'))) {
// parse error
/* Push the node pointed to by the head element pointer onto the
* stack of open elements. */
$this->stack[] = $this->head_pointer;
$this->processWithRulesFor($token, self::IN_HEAD);
array_splice($this->stack, array_search($this->head_pointer, $this->stack, true), 1);
// inversion of specification
} elseif (
($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'head') ||
($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] !== 'body' && $token['name'] !== 'html' &&
$token['name'] !== 'br')) {
// parse error
/* Anything else */
} else {
$this->emitToken(array(
'name' => 'body',
'type' => HTML5_Tokenizer::STARTTAG,
'attr' => array()
));
$this->flag_frameset_ok = true;
$this->emitToken($token);
}
break;
case self::IN_BODY:
/* Handle the token as follows: */
switch($token['type']) {
/* A character token */
case HTML5_Tokenizer::CHARACTER:
case HTML5_Tokenizer::SPACECHARACTER:
/* Reconstruct the active formatting elements, if any. */
$this->reconstructActiveFormattingElements();
/* Append the token's character to the current node. */
$this->insertText($token['data']);
/* If the token is not one of U+0009 CHARACTER TABULATION,
* U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020
* SPACE, then set the frameset-ok flag to "not ok". */
// i.e., if any of the characters is not whitespace
if (strlen($token['data']) !== strspn($token['data'], HTML5_Tokenizer::WHITESPACE)) {
$this->flag_frameset_ok = false;
}
break;
/* A comment token */
case HTML5_Tokenizer::COMMENT:
/* Append a Comment node to the current node with the data
attribute set to the data given in the comment token. */
$this->insertComment($token['data']);
break;
case HTML5_Tokenizer::DOCTYPE:
// parse error
break;
case HTML5_Tokenizer::EOF:
// parse error
break;
case HTML5_Tokenizer::STARTTAG:
switch($token['name']) {
case 'html':
// parse error
/* For each attribute on the token, check to see if the
* attribute is already present on the top element of the
* stack of open elements. If it is not, add the attribute
* and its corresponding value to that element. */
foreach($token['attr'] as $attr) {
if (!$this->stack[0]->hasAttribute($attr['name'])) {
$this->stack[0]->setAttribute($attr['name'], $attr['value']);
}
}
break;
case 'base': case 'command': case 'link': case 'meta': case 'noframes':
case 'script': case 'style': case 'title':
/* Process the token as if the insertion mode had been "in
head". */
$this->processWithRulesFor($token, self::IN_HEAD);
break;
/* A start tag token with the tag name "body" */
case 'body':
/* Parse error. If the second element on the stack of open
elements is not a body element, or, if the stack of open
elements has only one node on it, then ignore the token.
(fragment case) */
if (count($this->stack) === 1 || $this->stack[1]->tagName !== 'body') {
$this->ignored = true;
// Ignore
/* Otherwise, for each attribute on the token, check to see
if the attribute is already present on the body element (the
second element) on the stack of open elements. If it is not,
add the attribute and its corresponding value to that
element. */
} else {
foreach($token['attr'] as $attr) {
if (!$this->stack[1]->hasAttribute($attr['name'])) {
$this->stack[1]->setAttribute($attr['name'], $attr['value']);
}
}
}
break;
case 'frameset':
// parse error
/* If the second element on the stack of open elements is
* not a body element, or, if the stack of open elements
* has only one node on it, then ignore the token.
* (fragment case) */
if (count($this->stack) === 1 || $this->stack[1]->tagName !== 'body') {
$this->ignored = true;
// Ignore
} elseif (!$this->flag_frameset_ok) {
$this->ignored = true;
// Ignore
} else {
/* 1. Remove the second element on the stack of open
* elements from its parent node, if it has one. */
if ($this->stack[1]->parentNode) {
$this->stack[1]->parentNode->removeChild($this->stack[1]);
}
/* 2. Pop all the nodes from the bottom of the stack of
* open elements, from the current node up to the root
* html element. */
array_splice($this->stack, 1);
$this->insertElement($token);
$this->mode = self::IN_FRAMESET;
}
break;
// in spec, there is a diversion here
case 'address': case 'article': case 'aside': case 'blockquote':
case 'center': case 'datagrid': case 'details': case 'dir':
case 'div': case 'dl': case 'fieldset': case 'figure': case 'footer':
case 'header': case 'hgroup': case 'menu': case 'nav':
case 'ol': case 'p': case 'section': case 'ul':
/* If the stack of open elements has a p element in scope,
then act as if an end tag with the tag name p had been
seen. */
if ($this->elementInScope('p')) {
$this->emitToken(array(
'name' => 'p',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* Insert an HTML element for the token. */
$this->insertElement($token);
break;
/* A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
"h5", "h6" */
case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':
/* If the stack of open elements has a p element in scope,
then act as if an end tag with the tag name p had been seen. */
if ($this->elementInScope('p')) {
$this->emitToken(array(
'name' => 'p',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* If the current node is an element whose tag name is one
* of "h1", "h2", "h3", "h4", "h5", or "h6", then this is a
* parse error; pop the current node off the stack of open
* elements. */
$peek = array_pop($this->stack);
if (in_array($peek->tagName, array("h1", "h2", "h3", "h4", "h5", "h6"))) {
// parse error
} else {
$this->stack[] = $peek;
}
/* Insert an HTML element for the token. */
$this->insertElement($token);
break;
case 'pre': case 'listing':
/* If the stack of open elements has a p element in scope,
then act as if an end tag with the tag name p had been seen. */
if ($this->elementInScope('p')) {
$this->emitToken(array(
'name' => 'p',
'type' => HTML5_Tokenizer::ENDTAG
));
}
$this->insertElement($token);
/* If the next token is a U+000A LINE FEED (LF) character
* token, then ignore that token and move on to the next
* one. (Newlines at the start of pre blocks are ignored as
* an authoring convenience.) */
$this->ignore_lf_token = 2;
$this->flag_frameset_ok = false;
break;
/* A start tag whose tag name is "form" */
case 'form':
/* If the form element pointer is not null, ignore the
token with a parse error. */
if ($this->form_pointer !== null) {
$this->ignored = true;
// Ignore.
/* Otherwise: */
} else {
/* If the stack of open elements has a p element in
scope, then act as if an end tag with the tag name p
had been seen. */
if ($this->elementInScope('p')) {
$this->emitToken(array(
'name' => 'p',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* Insert an HTML element for the token, and set the
form element pointer to point to the element created. */
$element = $this->insertElement($token);
$this->form_pointer = $element;
}
break;
// condensed specification
case 'li': case 'dc': case 'dd': case 'ds': case 'dt':
/* 1. Set the frameset-ok flag to "not ok". */
$this->flag_frameset_ok = false;
$stack_length = count($this->stack) - 1;
for($n = $stack_length; 0 <= $n; $n--) {
/* 2. Initialise node to be the current node (the
bottommost node of the stack). */
$stop = false;
$node = $this->stack[$n];
$cat = $this->getElementCategory($node);
// for case 'li':
/* 3. If node is an li element, then act as if an end
* tag with the tag name "li" had been seen, then jump
* to the last step. */
// for case 'dc': case 'dd': case 'ds': case 'dt':
/* If node is a dc, dd, ds or dt element, then act as if an end
* tag with the same tag name as node had been seen, then
* jump to the last step. */
if (($token['name'] === 'li' && $node->tagName === 'li') ||
($token['name'] !== 'li' && ($node->tagName == 'dc' || $node->tagName === 'dd' || $node->tagName == 'ds' || $node->tagName === 'dt'))) { // limited conditional
$this->emitToken(array(
'type' => HTML5_Tokenizer::ENDTAG,
'name' => $node->tagName,
));
break;
}
/* 4. If node is not in the formatting category, and is
not in the phrasing category, and is not an address,
div or p element, then stop this algorithm. */
if ($cat !== self::FORMATTING && $cat !== self::PHRASING &&
$node->tagName !== 'address' && $node->tagName !== 'div' &&
$node->tagName !== 'p') {
break;
}
/* 5. Otherwise, set node to the previous entry in the
* stack of open elements and return to step 2. */
}
/* 6. This is the last step. */
/* If the stack of open elements has a p element in scope,
then act as if an end tag with the tag name p had been
seen. */
if ($this->elementInScope('p')) {
$this->emitToken(array(
'name' => 'p',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* Finally, insert an HTML element with the same tag
name as the token's. */
$this->insertElement($token);
break;
/* A start tag token whose tag name is "plaintext" */
case 'plaintext':
/* If the stack of open elements has a p element in scope,
then act as if an end tag with the tag name p had been
seen. */
if ($this->elementInScope('p')) {
$this->emitToken(array(
'name' => 'p',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* Insert an HTML element for the token. */
$this->insertElement($token);
$this->content_model = HTML5_Tokenizer::PLAINTEXT;
break;
// more diversions
/* A start tag whose tag name is "a" */
case 'a':
/* If the list of active formatting elements contains
an element whose tag name is "a" between the end of the
list and the last marker on the list (or the start of
the list if there is no marker on the list), then this
is a parse error; act as if an end tag with the tag name
"a" had been seen, then remove that element from the list
of active formatting elements and the stack of open
elements if the end tag didn't already remove it (it
might not have if the element is not in table scope). */
$leng = count($this->a_formatting);
for ($n = $leng - 1; $n >= 0; $n--) {
if ($this->a_formatting[$n] === self::MARKER) {
break;
} elseif ($this->a_formatting[$n]->tagName === 'a') {
$a = $this->a_formatting[$n];
$this->emitToken(array(
'name' => 'a',
'type' => HTML5_Tokenizer::ENDTAG
));
if (in_array($a, $this->a_formatting)) {
$a_i = array_search($a, $this->a_formatting, true);
if ($a_i !== false) {
array_splice($this->a_formatting, $a_i, 1);
}
}
if (in_array($a, $this->stack)) {
$a_i = array_search($a, $this->stack, true);
if ($a_i !== false) {
array_splice($this->stack, $a_i, 1);
}
}
break;
}
}
/* Reconstruct the active formatting elements, if any. */
$this->reconstructActiveFormattingElements();
/* Insert an HTML element for the token. */
$el = $this->insertElement($token);
/* Add that element to the list of active formatting
elements. */
$this->a_formatting[] = $el;
break;
case 'b': case 'big': case 'code': case 'em': case 'font': case 'i':
case 's': case 'small': case 'strike':
case 'strong': case 'tt': case 'u':
/* Reconstruct the active formatting elements, if any. */
$this->reconstructActiveFormattingElements();
/* Insert an HTML element for the token. */
$el = $this->insertElement($token);
/* Add that element to the list of active formatting
elements. */
$this->a_formatting[] = $el;
break;
case 'nobr':
/* Reconstruct the active formatting elements, if any. */
$this->reconstructActiveFormattingElements();
/* If the stack of open elements has a nobr element in
* scope, then this is a parse error; act as if an end tag
* with the tag name "nobr" had been seen, then once again
* reconstruct the active formatting elements, if any. */
if ($this->elementInScope('nobr')) {
$this->emitToken(array(
'name' => 'nobr',
'type' => HTML5_Tokenizer::ENDTAG,
));
$this->reconstructActiveFormattingElements();
}
/* Insert an HTML element for the token. */
$el = $this->insertElement($token);
/* Add that element to the list of active formatting
elements. */
$this->a_formatting[] = $el;
break;
// another diversion
/* A start tag token whose tag name is "button" */
case 'button':
/* If the stack of open elements has a button element in scope,
then this is a parse error; act as if an end tag with the tag
name "button" had been seen, then reprocess the token. (We don't
do that. Unnecessary.) (I hope you're right! -- ezyang) */
if ($this->elementInScope('button')) {
$this->emitToken(array(
'name' => 'button',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* Reconstruct the active formatting elements, if any. */
$this->reconstructActiveFormattingElements();
/* Insert an HTML element for the token. */
$this->insertElement($token);
/* Insert a marker at the end of the list of active
formatting elements. */
$this->a_formatting[] = self::MARKER;
$this->flag_frameset_ok = false;
break;
case 'applet': case 'marquee': case 'object':
/* Reconstruct the active formatting elements, if any. */
$this->reconstructActiveFormattingElements();
/* Insert an HTML element for the token. */
$this->insertElement($token);
/* Insert a marker at the end of the list of active
formatting elements. */
$this->a_formatting[] = self::MARKER;
$this->flag_frameset_ok = false;
break;
// spec diversion
/* A start tag whose tag name is "table" */
case 'table':
/* If the Document is not set to quirks mode, and the
* stack of open elements has a p element in scope, then
* act as if an end tag with the tag name "p" had been
* seen. */
if ($this->quirks_mode !== self::QUIRKS_MODE &&
$this->elementInScope('p')) {
$this->emitToken(array(
'name' => 'p',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* Insert an HTML element for the token. */
$this->insertElement($token);
$this->flag_frameset_ok = false;
/* Change the insertion mode to "in table". */
$this->mode = self::IN_TABLE;
break;
/* A start tag whose tag name is one of: "area", "basefont",
"bgsound", "br", "embed", "img", "param", "spacer", "wbr" */
case 'area': case 'basefont': case 'bgsound': case 'br':
case 'embed': case 'img': case 'input': case 'keygen': case 'spacer':
case 'wbr':
/* Reconstruct the active formatting elements, if any. */
$this->reconstructActiveFormattingElements();
/* Insert an HTML element for the token. */
$this->insertElement($token);
/* Immediately pop the current node off the stack of open elements. */
array_pop($this->stack);
// YYY: Acknowledge the token's self-closing flag, if it is set.
$this->flag_frameset_ok = false;
break;
case 'param': case 'source':
/* Insert an HTML element for the token. */
$this->insertElement($token);
/* Immediately pop the current node off the stack of open elements. */
array_pop($this->stack);
// YYY: Acknowledge the token's self-closing flag, if it is set.
break;
/* A start tag whose tag name is "hr" */
case 'hr':
/* If the stack of open elements has a p element in scope,
then act as if an end tag with the tag name p had been seen. */
if ($this->elementInScope('p')) {
$this->emitToken(array(
'name' => 'p',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* Insert an HTML element for the token. */
$this->insertElement($token);
/* Immediately pop the current node off the stack of open elements. */
array_pop($this->stack);
// YYY: Acknowledge the token's self-closing flag, if it is set.
$this->flag_frameset_ok = false;
break;
/* A start tag whose tag name is "image" */
case 'image':
/* Parse error. Change the token's tag name to "img" and
reprocess it. (Don't ask.) */
$token['name'] = 'img';
$this->emitToken($token);
break;
/* A start tag whose tag name is "isindex" */
case 'isindex':
/* Parse error. */
/* If the form element pointer is not null,
then ignore the token. */
if ($this->form_pointer === null) {
/* Act as if a start tag token with the tag name "form" had
been seen. */
/* If the token has an attribute called "action", set
* the action attribute on the resulting form
* element to the value of the "action" attribute of
* the token. */
$attr = array();
$action = $this->getAttr($token, 'action');
if ($action !== false) {
$attr[] = array('name' => 'action', 'value' => $action);
}
$this->emitToken(array(
'name' => 'form',
'type' => HTML5_Tokenizer::STARTTAG,
'attr' => $attr
));
/* Act as if a start tag token with the tag name "hr" had
been seen. */
$this->emitToken(array(
'name' => 'hr',
'type' => HTML5_Tokenizer::STARTTAG,
'attr' => array()
));
/* Act as if a start tag token with the tag name "label"
had been seen. */
$this->emitToken(array(
'name' => 'label',
'type' => HTML5_Tokenizer::STARTTAG,
'attr' => array()
));
/* Act as if a stream of character tokens had been seen. */
$prompt = $this->getAttr($token, 'prompt');
if ($prompt === false) {
$prompt = 'This is a searchable index. '.
'Insert your search keywords here: ';
}
$this->emitToken(array(
'data' => $prompt,
'type' => HTML5_Tokenizer::CHARACTER,
));
/* Act as if a start tag token with the tag name "input"
had been seen, with all the attributes from the "isindex"
token, except with the "name" attribute set to the value
"isindex" (ignoring any explicit "name" attribute). */
$attr = array();
foreach ($token['attr'] as $keypair) {
if ($keypair['name'] === 'name' || $keypair['name'] === 'action' ||
$keypair['name'] === 'prompt') {
continue;
}
$attr[] = $keypair;
}
$attr[] = array('name' => 'name', 'value' => 'isindex');
$this->emitToken(array(
'name' => 'input',
'type' => HTML5_Tokenizer::STARTTAG,
'attr' => $attr
));
/* Act as if an end tag token with the tag name "label"
had been seen. */
$this->emitToken(array(
'name' => 'label',
'type' => HTML5_Tokenizer::ENDTAG
));
/* Act as if a start tag token with the tag name "hr" had
been seen. */
$this->emitToken(array(
'name' => 'hr',
'type' => HTML5_Tokenizer::STARTTAG
));
/* Act as if an end tag token with the tag name "form" had
been seen. */
$this->emitToken(array(
'name' => 'form',
'type' => HTML5_Tokenizer::ENDTAG
));
} else {
$this->ignored = true;
}
break;
/* A start tag whose tag name is "textarea" */
case 'textarea':
$this->insertElement($token);
/* If the next token is a U+000A LINE FEED (LF)
* character token, then ignore that token and move on to
* the next one. (Newlines at the start of textarea
* elements are ignored as an authoring convenience.)
* need flag, see also */
$this->ignore_lf_token = 2;
$this->original_mode = $this->mode;
$this->flag_frameset_ok = false;
$this->mode = self::IN_CDATA_RCDATA;
/* Switch the tokeniser's content model flag to the
RCDATA state. */
$this->content_model = HTML5_Tokenizer::RCDATA;
break;
/* A start tag token whose tag name is "xmp" */
case 'xmp':
/* If the stack of open elements has a p element in
scope, then act as if an end tag with the tag name
"p" has been seen. */
if ($this->elementInScope('p')) {
$this->emitToken(array(
'name' => 'p',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* Reconstruct the active formatting elements, if any. */
$this->reconstructActiveFormattingElements();
$this->flag_frameset_ok = false;
$this->insertCDATAElement($token);
break;
case 'iframe':
$this->flag_frameset_ok = false;
$this->insertCDATAElement($token);
break;
case 'noembed': case 'noscript':
// XSCRIPT: should check scripting flag
$this->insertCDATAElement($token);
break;
/* A start tag whose tag name is "select" */
case 'select':
/* Reconstruct the active formatting elements, if any. */
$this->reconstructActiveFormattingElements();
/* Insert an HTML element for the token. */
$this->insertElement($token);
$this->flag_frameset_ok = false;
/* If the insertion mode is one of in table", "in caption",
* "in column group", "in table body", "in row", or "in
* cell", then switch the insertion mode to "in select in
* table". Otherwise, switch the insertion mode to "in
* select". */
if (
$this->mode === self::IN_TABLE || $this->mode === self::IN_CAPTION ||
$this->mode === self::IN_COLUMN_GROUP || $this->mode ==+self::IN_TABLE_BODY ||
$this->mode === self::IN_ROW || $this->mode === self::IN_CELL
) {
$this->mode = self::IN_SELECT_IN_TABLE;
} else {
$this->mode = self::IN_SELECT;
}
break;
case 'option': case 'optgroup':
if ($this->elementInScope('option')) {
$this->emitToken(array(
'name' => 'option',
'type' => HTML5_Tokenizer::ENDTAG,
));
}
$this->reconstructActiveFormattingElements();
$this->insertElement($token);
break;
case 'rp': case 'rt':
/* If the stack of open elements has a ruby element in scope, then generate
* implied end tags. If the current node is not then a ruby element, this is
* a parse error; pop all the nodes from the current node up to the node
* immediately before the bottommost ruby element on the stack of open elements.
*/
if ($this->elementInScope('ruby')) {
$this->generateImpliedEndTags();
}
$peek = false;
do {
/*if ($peek) {
// parse error
}*/
$peek = array_pop($this->stack);
} while ($peek->tagName !== 'ruby');
$this->stack[] = $peek; // we popped one too many
$this->insertElement($token);
break;
// spec diversion
case 'math':
$this->reconstructActiveFormattingElements();
$token = $this->adjustMathMLAttributes($token);
$token = $this->adjustForeignAttributes($token);
$this->insertForeignElement($token, self::NS_MATHML);
if (isset($token['self-closing'])) {
// XERROR: acknowledge the token's self-closing flag
array_pop($this->stack);
}
if ($this->mode !== self::IN_FOREIGN_CONTENT) {
$this->secondary_mode = $this->mode;
$this->mode = self::IN_FOREIGN_CONTENT;
}
break;
case 'svg':
$this->reconstructActiveFormattingElements();
$token = $this->adjustSVGAttributes($token);
$token = $this->adjustForeignAttributes($token);
$this->insertForeignElement($token, self::NS_SVG);
if (isset($token['self-closing'])) {
// XERROR: acknowledge the token's self-closing flag
array_pop($this->stack);
}
if ($this->mode !== self::IN_FOREIGN_CONTENT) {
$this->secondary_mode = $this->mode;
$this->mode = self::IN_FOREIGN_CONTENT;
}
break;
case 'caption': case 'col': case 'colgroup': case 'frame': case 'head':
case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead': case 'tr':
// parse error
break;
/* A start tag token not covered by the previous entries */
default:
/* Reconstruct the active formatting elements, if any. */
$this->reconstructActiveFormattingElements();
$this->insertElement($token);
/* This element will be a phrasing element. */
break;
}
break;
case HTML5_Tokenizer::ENDTAG:
switch ($token['name']) {
/* An end tag with the tag name "body" */
case 'body':
/* If the stack of open elements does not have a body
* element in scope, this is a parse error; ignore the
* token. */
if (!$this->elementInScope('body')) {
$this->ignored = true;
/* Otherwise, if there is a node in the stack of open
* elements that is not either a dc element, a dd element,
* a ds element, a dt element, an li element, an optgroup
* element, an option element, a p element, an rp element,
* an rt element, a tbody element, a td element, a tfoot
* element, a th element, a thead element, a tr element,
* the body element, or the html element, then this is a
* parse error.
*/
} else {
// XERROR: implement this check for parse error
}
/* Change the insertion mode to "after body". */
$this->mode = self::AFTER_BODY;
break;
/* An end tag with the tag name "html" */
case 'html':
/* Act as if an end tag with tag name "body" had been seen,
then, if that token wasn't ignored, reprocess the current
token. */
$this->emitToken(array(
'name' => 'body',
'type' => HTML5_Tokenizer::ENDTAG
));
if (!$this->ignored) {
$this->emitToken($token);
}
break;
case 'address': case 'article': case 'aside': case 'blockquote':
case 'center': case 'datagrid': case 'details': case 'dir':
case 'div': case 'dl': case 'fieldset': case 'footer':
case 'header': case 'hgroup': case 'listing': case 'menu':
case 'nav': case 'ol': case 'pre': case 'section': case 'ul':
/* If the stack of open elements has an element in scope
with the same tag name as that of the token, then generate
implied end tags. */
if ($this->elementInScope($token['name'])) {
$this->generateImpliedEndTags();
/* Now, if the current node is not an element with
the same tag name as that of the token, then this
is a parse error. */
// XERROR: implement parse error logic
/* If the stack of open elements has an element in
scope with the same tag name as that of the token,
then pop elements from this stack until an element
with that tag name has been popped from the stack. */
do {
$node = array_pop($this->stack);
} while ($node->tagName !== $token['name']);
} else {
// parse error
}
break;
/* An end tag whose tag name is "form" */
case 'form':
/* Let node be the element that the form element pointer is set to. */
$node = $this->form_pointer;
/* Set the form element pointer to null. */
$this->form_pointer = null;
/* If node is null or the stack of open elements does not
* have node in scope, then this is a parse error; ignore the token. */
if ($node === null || !in_array($node, $this->stack)) {
// parse error
$this->ignored = true;
} else {
/* 1. Generate implied end tags. */
$this->generateImpliedEndTags();
/* 2. If the current node is not node, then this is a parse error. */
if (end($this->stack) !== $node) {
// parse error
}
/* 3. Remove node from the stack of open elements. */
array_splice($this->stack, array_search($node, $this->stack, true), 1);
}
break;
/* An end tag whose tag name is "p" */
case 'p':
/* If the stack of open elements has a p element in scope,
then generate implied end tags, except for p elements. */
if ($this->elementInScope('p')) {
/* Generate implied end tags, except for elements with
* the same tag name as the token. */
$this->generateImpliedEndTags(array('p'));
/* If the current node is not a p element, then this is
a parse error. */
// XERROR: implement
/* Pop elements from the stack of open elements until
* an element with the same tag name as the token has
* been popped from the stack. */
do {
$node = array_pop($this->stack);
} while ($node->tagName !== 'p');
} else {
// parse error
$this->emitToken(array(
'name' => 'p',
'type' => HTML5_Tokenizer::STARTTAG,
));
$this->emitToken($token);
}
break;
/* An end tag whose tag name is "li" */
case 'li':
/* If the stack of open elements does not have an element
* in list item scope with the same tag name as that of the
* token, then this is a parse error; ignore the token. */
if ($this->elementInScope($token['name'], self::SCOPE_LISTITEM)) {
/* Generate implied end tags, except for elements with the
* same tag name as the token. */
$this->generateImpliedEndTags(array($token['name']));
/* If the current node is not an element with the same tag
* name as that of the token, then this is a parse error. */
// XERROR: parse error
/* Pop elements from the stack of open elements until an
* element with the same tag name as the token has been
* popped from the stack. */
do {
$node = array_pop($this->stack);
} while ($node->tagName !== $token['name']);
}
/*else {
// XERROR: parse error
}*/
break;
/* An end tag whose tag name is "dc", "dd", "ds", "dt" */
case 'dc': case 'dd': case 'ds': case 'dt':
if ($this->elementInScope($token['name'])) {
$this->generateImpliedEndTags(array($token['name']));
/* If the current node is not an element with the same
tag name as the token, then this is a parse error. */
// XERROR: implement parse error
/* Pop elements from the stack of open elements until
* an element with the same tag name as the token has
* been popped from the stack. */
do {
$node = array_pop($this->stack);
} while ($node->tagName !== $token['name']);
}
/*else {
// XERROR: parse error
}*/
break;
/* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
"h5", "h6" */
case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':
$elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
/* If the stack of open elements has in scope an element whose
tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
generate implied end tags. */
if ($this->elementInScope($elements)) {
$this->generateImpliedEndTags();
/* Now, if the current node is not an element with the same
tag name as that of the token, then this is a parse error. */
// XERROR: implement parse error
/* If the stack of open elements has in scope an element
whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
"h6", then pop elements from the stack until an element
with one of those tag names has been popped from the stack. */
do {
$node = array_pop($this->stack);
} while (!in_array($node->tagName, $elements));
}
/*else {
// parse error
}*/
break;
/* An end tag whose tag name is one of: "a", "b", "big", "em",
"font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
case 'a': case 'b': case 'big': case 'code': case 'em': case 'font':
case 'i': case 'nobr': case 's': case 'small': case 'strike':
case 'strong': case 'tt': case 'u':
// XERROR: generally speaking this needs parse error logic
/* 1. Let the formatting element be the last element in
the list of active formatting elements that:
* is between the end of the list and the last scope
marker in the list, if any, or the start of the list
otherwise, and
* has the same tag name as the token.
*/
while (true) {
for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
if ($this->a_formatting[$a] === self::MARKER) {
break;
} elseif ($this->a_formatting[$a]->tagName === $token['name']) {
$formatting_element = $this->a_formatting[$a];
$in_stack = in_array($formatting_element, $this->stack, true);
$fe_af_pos = $a;
break;
}
}
/* If there is no such node, or, if that node is
also in the stack of open elements but the element
is not in scope, then this is a parse error. Abort
these steps. The token is ignored. */
if (
!isset($formatting_element) || (
$in_stack &&
!$this->elementInScope($token['name'])
)
) {
$this->ignored = true;
break;
/* Otherwise, if there is such a node, but that node
is not in the stack of open elements, then this is a
parse error; remove the element from the list, and
abort these steps. */
} elseif (isset($formatting_element) && !$in_stack) {
unset($this->a_formatting[$fe_af_pos]);
$this->a_formatting = array_merge($this->a_formatting);
break;
}
/* Otherwise, there is a formatting element and that
* element is in the stack and is in scope. If the
* element is not the current node, this is a parse
* error. In any case, proceed with the algorithm as
* written in the following steps. */
// XERROR: implement me
/* 2. Let the furthest block be the topmost node in the
stack of open elements that is lower in the stack
than the formatting element, and is not an element in
the phrasing or formatting categories. There might
not be one. */
$fe_s_pos = array_search($formatting_element, $this->stack, true);
$length = count($this->stack);
for ($s = $fe_s_pos + 1; $s < $length; $s++) {
$category = $this->getElementCategory($this->stack[$s]);
if ($category !== self::PHRASING && $category !== self::FORMATTING) {
$furthest_block = $this->stack[$s];
break;
}
}
/* 3. If there is no furthest block, then the UA must
skip the subsequent steps and instead just pop all
the nodes from the bottom of the stack of open
elements, from the current node up to the formatting
element, and remove the formatting element from the
list of active formatting elements. */
if (!isset($furthest_block)) {
for ($n = $length - 1; $n >= $fe_s_pos; $n--) {
array_pop($this->stack);
}
unset($this->a_formatting[$fe_af_pos]);
$this->a_formatting = array_merge($this->a_formatting);
break;
}
/* 4. Let the common ancestor be the element
immediately above the formatting element in the stack
of open elements. */
$common_ancestor = $this->stack[$fe_s_pos - 1];
/* 5. Let a bookmark note the position of the
formatting element in the list of active formatting
elements relative to the elements on either side
of it in the list. */
$bookmark = $fe_af_pos;
/* 6. Let node and last node be the furthest block.
Follow these steps: */
$node = $furthest_block;
$last_node = $furthest_block;
while (true) {
for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
/* 6.1 Let node be the element immediately
prior to node in the stack of open elements. */
$node = $this->stack[$n];
/* 6.2 If node is not in the list of active
formatting elements, then remove node from
the stack of open elements and then go back
to step 1. */
if (!in_array($node, $this->a_formatting, true)) {
array_splice($this->stack, $n, 1);
} else {
break;
}
}
/* 6.3 Otherwise, if node is the formatting
element, then go to the next step in the overall
algorithm. */
if ($node === $formatting_element) {
break;
/* 6.4 Otherwise, if last node is the furthest
block, then move the aforementioned bookmark to
be immediately after the node in the list of
active formatting elements. */
} elseif ($last_node === $furthest_block) {
$bookmark = array_search($node, $this->a_formatting, true) + 1;
}
/* 6.5 Create an element for the token for which
* the element node was created, replace the entry
* for node in the list of active formatting
* elements with an entry for the new element,
* replace the entry for node in the stack of open
* elements with an entry for the new element, and
* let node be the new element. */
// we don't know what the token is anymore
// XDOM
$clone = $node->cloneNode();
$a_pos = array_search($node, $this->a_formatting, true);
$s_pos = array_search($node, $this->stack, true);
$this->a_formatting[$a_pos] = $clone;
$this->stack[$s_pos] = $clone;
$node = $clone;
/* 6.6 Insert last node into node, first removing
it from its previous parent node if any. */
// XDOM
if ($last_node->parentNode !== null) {
$last_node->parentNode->removeChild($last_node);
}
// XDOM
$node->appendChild($last_node);
/* 6.7 Let last node be node. */
$last_node = $node;
/* 6.8 Return to step 1 of this inner set of steps. */
}
/* 7. If the common ancestor node is a table, tbody,
* tfoot, thead, or tr element, then, foster parent
* whatever last node ended up being in the previous
* step, first removing it from its previous parent
* node if any. */
// XDOM
if ($last_node->parentNode) { // common step
$last_node->parentNode->removeChild($last_node);
}
if (in_array($common_ancestor->tagName, array('table', 'tbody', 'tfoot', 'thead', 'tr'))) {
$this->fosterParent($last_node);
/* Otherwise, append whatever last node ended up being
* in the previous step to the common ancestor node,
* first removing it from its previous parent node if
* any. */
} else {
// XDOM
$common_ancestor->appendChild($last_node);
}
/* 8. Create an element for the token for which the
* formatting element was created. */
// XDOM
$clone = $formatting_element->cloneNode();
/* 9. Take all of the child nodes of the furthest
block and append them to the element created in the
last step. */
// XDOM
while ($furthest_block->hasChildNodes()) {
$child = $furthest_block->firstChild;
$furthest_block->removeChild($child);
$clone->appendChild($child);
}
/* 10. Append that clone to the furthest block. */
// XDOM
$furthest_block->appendChild($clone);
/* 11. Remove the formatting element from the list
of active formatting elements, and insert the new element
into the list of active formatting elements at the
position of the aforementioned bookmark. */
$fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
array_splice($this->a_formatting, $fe_af_pos, 1);
$af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
$af_part2 = array_slice($this->a_formatting, $bookmark);
$this->a_formatting = array_merge($af_part1, array($clone), $af_part2);
/* 12. Remove the formatting element from the stack
of open elements, and insert the new element into the stack
of open elements immediately below the position of the
furthest block in that stack. */
$fe_s_pos = array_search($formatting_element, $this->stack, true);
array_splice($this->stack, $fe_s_pos, 1);
$fb_s_pos = array_search($furthest_block, $this->stack, true);
$s_part1 = array_slice($this->stack, 0, $fb_s_pos + 1);
$s_part2 = array_slice($this->stack, $fb_s_pos + 1);
$this->stack = array_merge($s_part1, array($clone), $s_part2);
/* 13. Jump back to step 1 in this series of steps. */
unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
}
break;
case 'applet': case 'button': case 'marquee': case 'object':
/* If the stack of open elements has an element in scope whose
tag name matches the tag name of the token, then generate implied
tags. */
if ($this->elementInScope($token['name'])) {
$this->generateImpliedEndTags();
/* Now, if the current node is not an element with the same
tag name as the token, then this is a parse error. */
// XERROR: implement logic
/* Pop elements from the stack of open elements until
* an element with the same tag name as the token has
* been popped from the stack. */
do {
$node = array_pop($this->stack);
} while ($node->tagName !== $token['name']);
/* Clear the list of active formatting elements up to the
* last marker. */
$keys = array_keys($this->a_formatting, self::MARKER, true);
$marker = end($keys);
for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
array_pop($this->a_formatting);
}
}
/*else {
// parse error
}*/
break;
case 'br':
// Parse error
$this->emitToken(array(
'name' => 'br',
'type' => HTML5_Tokenizer::STARTTAG,
));
break;
/* An end tag token not covered by the previous entries */
default:
for ($n = count($this->stack) - 1; $n >= 0; $n--) {
/* Initialise node to be the current node (the bottommost
node of the stack). */
$node = $this->stack[$n];
/* If node has the same tag name as the end tag token,
then: */
if ($token['name'] === $node->tagName) {
/* Generate implied end tags. */
$this->generateImpliedEndTags();
/* If the tag name of the end tag token does not
match the tag name of the current node, this is a
parse error. */
// XERROR: implement this
/* Pop all the nodes from the current node up to
node, including node, then stop these steps. */
// XSKETCHY
do {
$pop = array_pop($this->stack);
} while ($pop !== $node);
break;
} else {
$category = $this->getElementCategory($node);
if ($category !== self::FORMATTING && $category !== self::PHRASING) {
/* Otherwise, if node is in neither the formatting
category nor the phrasing category, then this is a
parse error. Stop this algorithm. The end tag token
is ignored. */
$this->ignored = true;
break;
// parse error
}
}
/* Set node to the previous entry in the stack of open elements. Loop. */
}
break;
}
break;
}
break;
case self::IN_CDATA_RCDATA:
if (
$token['type'] === HTML5_Tokenizer::CHARACTER ||
$token['type'] === HTML5_Tokenizer::SPACECHARACTER
) {
$this->insertText($token['data']);
} elseif ($token['type'] === HTML5_Tokenizer::EOF) {
// parse error
/* If the current node is a script element, mark the script
* element as "already executed". */
// probably not necessary
array_pop($this->stack);
$this->mode = $this->original_mode;
$this->emitToken($token);
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'script') {
array_pop($this->stack);
$this->mode = $this->original_mode;
// we're ignoring all of the execution stuff
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG) {
array_pop($this->stack);
$this->mode = $this->original_mode;
}
break;
case self::IN_TABLE:
$clear = array('html', 'table');
/* A character token */
if ($token['type'] === HTML5_Tokenizer::CHARACTER ||
$token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
/* Let the pending table character tokens
* be an empty list of tokens. */
$this->pendingTableCharacters = "";
$this->pendingTableCharactersDirty = false;
/* Let the original insertion mode be the current
* insertion mode. */
$this->original_mode = $this->mode;
/* Switch the insertion mode to
* "in table text" and
* reprocess the token. */
$this->mode = self::IN_TABLE_TEXT;
$this->emitToken($token);
/* A comment token */
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the current node with the data
attribute set to the data given in the comment token. */
$this->insertComment($token['data']);
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
// parse error
/* A start tag whose tag name is "caption" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'caption') {
/* Clear the stack back to a table context. */
$this->clearStackToTableContext($clear);
/* Insert a marker at the end of the list of active
formatting elements. */
$this->a_formatting[] = self::MARKER;
/* Insert an HTML element for the token, then switch the
insertion mode to "in caption". */
$this->insertElement($token);
$this->mode = self::IN_CAPTION;
/* A start tag whose tag name is "colgroup" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'colgroup') {
/* Clear the stack back to a table context. */
$this->clearStackToTableContext($clear);
/* Insert an HTML element for the token, then switch the
insertion mode to "in column group". */
$this->insertElement($token);
$this->mode = self::IN_COLUMN_GROUP;
/* A start tag whose tag name is "col" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'col') {
$this->emitToken(array(
'name' => 'colgroup',
'type' => HTML5_Tokenizer::STARTTAG,
'attr' => array()
));
$this->emitToken($token);
/* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
array('tbody', 'tfoot', 'thead'))) {
/* Clear the stack back to a table context. */
$this->clearStackToTableContext($clear);
/* Insert an HTML element for the token, then switch the insertion
mode to "in table body". */
$this->insertElement($token);
$this->mode = self::IN_TABLE_BODY;
/* A start tag whose tag name is one of: "td", "th", "tr" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
in_array($token['name'], array('td', 'th', 'tr'))) {
/* Act as if a start tag token with the tag name "tbody" had been
seen, then reprocess the current token. */
$this->emitToken(array(
'name' => 'tbody',
'type' => HTML5_Tokenizer::STARTTAG,
'attr' => array()
));
$this->emitToken($token);
/* A start tag whose tag name is "table" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'table') {
/* Parse error. Act as if an end tag token with the tag name "table"
had been seen, then, if that token wasn't ignored, reprocess the
current token. */
$this->emitToken(array(
'name' => 'table',
'type' => HTML5_Tokenizer::ENDTAG
));
if (!$this->ignored) {
$this->emitToken($token);
}
/* An end tag whose tag name is "table" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] === 'table') {
/* If the stack of open elements does not have an element in table
scope with the same tag name as the token, this is a parse error.
Ignore the token. (fragment case) */
if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
$this->ignored = true;
} else {
do {
$node = array_pop($this->stack);
} while ($node->tagName !== 'table');
/* Reset the insertion mode appropriately. */
$this->resetInsertionMode();
}
/* An end tag whose tag name is one of: "body", "caption", "col",
"colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td',
'tfoot', 'th', 'thead', 'tr'))) {
// Parse error. Ignore the token.
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
($token['name'] === 'style' || $token['name'] === 'script')) {
$this->processWithRulesFor($token, self::IN_HEAD);
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'input' &&
// assignment is intentional
/* If the token does not have an attribute with the name "type", or
* if it does, but that attribute's value is not an ASCII
* case-insensitive match for the string "hidden", then: act as
* described in the "anything else" entry below. */
($type = $this->getAttr($token, 'type')) && strtolower($type) === 'hidden') {
// I.e., if its an input with the type attribute == 'hidden'
/* Otherwise */
// parse error
$this->insertElement($token);
array_pop($this->stack);
} elseif ($token['type'] === HTML5_Tokenizer::EOF) {
/* If the current node is not the root html element, then this is a parse error. */
if (end($this->stack)->tagName !== 'html') {
// Note: It can only be the current node in the fragment case.
// parse error
}
/* Stop parsing. */
/* Anything else */
} else {
/* Parse error. Process the token as if the insertion mode was "in
body", with the following exception: */
$old = $this->foster_parent;
$this->foster_parent = true;
$this->processWithRulesFor($token, self::IN_BODY);
$this->foster_parent = $old;
}
break;
case self::IN_TABLE_TEXT:
/* A character token */
if ($token['type'] === HTML5_Tokenizer::CHARACTER) {
/* Append the character token to the pending table
* character tokens list. */
$this->pendingTableCharacters .= $token['data'];
$this->pendingTableCharactersDirty = true;
} elseif ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
$this->pendingTableCharacters .= $token['data'];
/* Anything else */
} else {
if ($this->pendingTableCharacters !== '' && is_string($this->pendingTableCharacters)) {
/* If any of the tokens in the pending table character tokens list
* are character tokens that are not one of U+0009 CHARACTER
* TABULATION, U+000A LINE FEED (LF), U+000C FORM FEED (FF), or
* U+0020 SPACE, then reprocess those character tokens using the
* rules given in the "anything else" entry in the in table"
* insertion mode.*/
if ($this->pendingTableCharactersDirty) {
/* Parse error. Process the token using the rules for the
* "in body" insertion mode, except that if the current
* node is a table, tbody, tfoot, thead, or tr element,
* then, whenever a node would be inserted into the current
* node, it must instead be foster parented. */
// XERROR
$old = $this->foster_parent;
$this->foster_parent = true;
$text_token = array(
'type' => HTML5_Tokenizer::CHARACTER,
'data' => $this->pendingTableCharacters,
);
$this->processWithRulesFor($text_token, self::IN_BODY);
$this->foster_parent = $old;
/* Otherwise, insert the characters given by the pending table
* character tokens list into the current node. */
} else {
$this->insertText($this->pendingTableCharacters);
}
$this->pendingTableCharacters = null;
$this->pendingTableCharactersNull = null;
}
/* Switch the insertion mode to the original insertion mode and
* reprocess the token.
*/
$this->mode = $this->original_mode;
$this->emitToken($token);
}
break;
case self::IN_CAPTION:
/* An end tag whose tag name is "caption" */
if ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'caption') {
/* If the stack of open elements does not have an element in table
scope with the same tag name as the token, this is a parse error.
Ignore the token. (fragment case) */
if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
$this->ignored = true;
// Ignore
/* Otherwise: */
} else {
/* Generate implied end tags. */
$this->generateImpliedEndTags();
/* Now, if the current node is not a caption element, then this
is a parse error. */
// XERROR: implement
/* Pop elements from this stack until a caption element has
been popped from the stack. */
do {
$node = array_pop($this->stack);
} while ($node->tagName !== 'caption');
/* Clear the list of active formatting elements up to the last
marker. */
$this->clearTheActiveFormattingElementsUpToTheLastMarker();
/* Switch the insertion mode to "in table". */
$this->mode = self::IN_TABLE;
}
/* A start tag whose tag name is one of: "caption", "col", "colgroup",
"tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
name is "table" */
} elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
'thead', 'tr'))) || ($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] === 'table')) {
/* Parse error. Act as if an end tag with the tag name "caption"
had been seen, then, if that token wasn't ignored, reprocess the
current token. */
$this->emitToken(array(
'name' => 'caption',
'type' => HTML5_Tokenizer::ENDTAG
));
if (!$this->ignored) {
$this->emitToken($token);
}
/* An end tag whose tag name is one of: "body", "col", "colgroup",
"html", "tbody", "td", "tfoot", "th", "thead", "tr" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th',
'thead', 'tr'))) {
// Parse error. Ignore the token.
$this->ignored = true;
} else {
/* Process the token as if the insertion mode was "in body". */
$this->processWithRulesFor($token, self::IN_BODY);
}
break;
case self::IN_COLUMN_GROUP:
/* A character token that is one of one of U+0009 CHARACTER TABULATION,
U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
or U+0020 SPACE */
if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
/* Append the character to the current node. */
$this->insertText($token['data']);
/* A comment token */
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the current node with the data
attribute set to the data given in the comment token. */
$this->insertComment($token['data']);
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
// parse error
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
$this->processWithRulesFor($token, self::IN_BODY);
/* A start tag whose tag name is "col" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'col') {
/* Insert a col element for the token. Immediately pop the current
node off the stack of open elements. */
$this->insertElement($token);
array_pop($this->stack);
// XERROR: Acknowledge the token's self-closing flag, if it is set.
/* An end tag whose tag name is "colgroup" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] === 'colgroup') {
/* If the current node is the root html element, then this is a
parse error, ignore the token. (fragment case) */
if (end($this->stack)->tagName === 'html') {
$this->ignored = true;
/* Otherwise, pop the current node (which will be a colgroup
element) from the stack of open elements. Switch the insertion
mode to "in table". */
} else {
array_pop($this->stack);
$this->mode = self::IN_TABLE;
}
/* An end tag whose tag name is "col" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'col') {
/* Parse error. Ignore the token. */
$this->ignored = true;
/* An end-of-file token */
/* If the current node is the root html element */
} elseif ($token['type'] === HTML5_Tokenizer::EOF && end($this->stack)->tagName === 'html') {
/* Stop parsing */
/* Anything else */
} else {
/* Act as if an end tag with the tag name "colgroup" had been seen,
and then, if that token wasn't ignored, reprocess the current token. */
$this->emitToken(array(
'name' => 'colgroup',
'type' => HTML5_Tokenizer::ENDTAG
));
if (!$this->ignored) {
$this->emitToken($token);
}
}
break;
case self::IN_TABLE_BODY:
$clear = array('tbody', 'tfoot', 'thead', 'html');
/* A start tag whose tag name is "tr" */
if ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'tr') {
/* Clear the stack back to a table body context. */
$this->clearStackToTableContext($clear);
/* Insert a tr element for the token, then switch the insertion
mode to "in row". */
$this->insertElement($token);
$this->mode = self::IN_ROW;
/* A start tag whose tag name is one of: "th", "td" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
($token['name'] === 'th' || $token['name'] === 'td')) {
/* Parse error. Act as if a start tag with the tag name "tr" had
been seen, then reprocess the current token. */
$this->emitToken(array(
'name' => 'tr',
'type' => HTML5_Tokenizer::STARTTAG,
'attr' => array()
));
$this->emitToken($token);
/* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
in_array($token['name'], array('tbody', 'tfoot', 'thead'))) {
/* If the stack of open elements does not have an element in table
scope with the same tag name as the token, this is a parse error.
Ignore the token. */
if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
// Parse error
$this->ignored = true;
/* Otherwise: */
} else {
/* Clear the stack back to a table body context. */
$this->clearStackToTableContext($clear);
/* Pop the current node from the stack of open elements. Switch
the insertion mode to "in table". */
array_pop($this->stack);
$this->mode = self::IN_TABLE;
}
/* A start tag whose tag name is one of: "caption", "col", "colgroup",
"tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
} elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead'))) ||
($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'table')) {
/* If the stack of open elements does not have a tbody, thead, or
tfoot element in table scope, this is a parse error. Ignore the
token. (fragment case) */
if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), self::SCOPE_TABLE)) {
// parse error
$this->ignored = true;
/* Otherwise: */
} else {
/* Clear the stack back to a table body context. */
$this->clearStackToTableContext($clear);
/* Act as if an end tag with the same tag name as the current
node ("tbody", "tfoot", or "thead") had been seen, then
reprocess the current token. */
$this->emitToken(array(
'name' => end($this->stack)->tagName,
'type' => HTML5_Tokenizer::ENDTAG
));
$this->emitToken($token);
}
/* An end tag whose tag name is one of: "body", "caption", "col",
"colgroup", "html", "td", "th", "tr" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) {
/* Parse error. Ignore the token. */
$this->ignored = true;
/* Anything else */
} else {
/* Process the token as if the insertion mode was "in table". */
$this->processWithRulesFor($token, self::IN_TABLE);
}
break;
case self::IN_ROW:
$clear = array('tr', 'html');
/* A start tag whose tag name is one of: "th", "td" */
if ($token['type'] === HTML5_Tokenizer::STARTTAG &&
($token['name'] === 'th' || $token['name'] === 'td')) {
/* Clear the stack back to a table row context. */
$this->clearStackToTableContext($clear);
/* Insert an HTML element for the token, then switch the insertion
mode to "in cell". */
$this->insertElement($token);
$this->mode = self::IN_CELL;
/* Insert a marker at the end of the list of active formatting
elements. */
$this->a_formatting[] = self::MARKER;
/* An end tag whose tag name is "tr" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'tr') {
/* If the stack of open elements does not have an element in table
scope with the same tag name as the token, this is a parse error.
Ignore the token. (fragment case) */
if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
// Ignore.
$this->ignored = true;
} else {
/* Clear the stack back to a table row context. */
$this->clearStackToTableContext($clear);
/* Pop the current node (which will be a tr element) from the
stack of open elements. Switch the insertion mode to "in table
body". */
array_pop($this->stack);
$this->mode = self::IN_TABLE_BODY;
}
/* A start tag whose tag name is one of: "caption", "col", "colgroup",
"tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
} elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) ||
($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'table')) {
/* Act as if an end tag with the tag name "tr" had been seen, then,
if that token wasn't ignored, reprocess the current token. */
$this->emitToken(array(
'name' => 'tr',
'type' => HTML5_Tokenizer::ENDTAG
));
if (!$this->ignored) {
$this->emitToken($token);
}
/* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
in_array($token['name'], array('tbody', 'tfoot', 'thead'))) {
/* If the stack of open elements does not have an element in table
scope with the same tag name as the token, this is a parse error.
Ignore the token. */
if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
$this->ignored = true;
/* Otherwise: */
} else {
/* Otherwise, act as if an end tag with the tag name "tr" had
been seen, then reprocess the current token. */
$this->emitToken(array(
'name' => 'tr',
'type' => HTML5_Tokenizer::ENDTAG
));
$this->emitToken($token);
}
/* An end tag whose tag name is one of: "body", "caption", "col",
"colgroup", "html", "td", "th" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th'))) {
/* Parse error. Ignore the token. */
$this->ignored = true;
/* Anything else */
} else {
/* Process the token as if the insertion mode was "in table". */
$this->processWithRulesFor($token, self::IN_TABLE);
}
break;
case self::IN_CELL:
/* An end tag whose tag name is one of: "td", "th" */
if ($token['type'] === HTML5_Tokenizer::ENDTAG &&
($token['name'] === 'td' || $token['name'] === 'th')) {
/* If the stack of open elements does not have an element in table
scope with the same tag name as that of the token, then this is a
parse error and the token must be ignored. */
if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
$this->ignored = true;
/* Otherwise: */
} else {
/* Generate implied end tags, except for elements with the same
tag name as the token. */
$this->generateImpliedEndTags(array($token['name']));
/* Now, if the current node is not an element with the same tag
name as the token, then this is a parse error. */
// XERROR: Implement parse error code
/* Pop elements from this stack until an element with the same
tag name as the token has been popped from the stack. */
do {
$node = array_pop($this->stack);
} while ($node->tagName !== $token['name']);
/* Clear the list of active formatting elements up to the last
marker. */
$this->clearTheActiveFormattingElementsUpToTheLastMarker();
/* Switch the insertion mode to "in row". (The current node
will be a tr element at this point.) */
$this->mode = self::IN_ROW;
}
/* A start tag whose tag name is one of: "caption", "col", "colgroup",
"tbody", "td", "tfoot", "th", "thead", "tr" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
'thead', 'tr'))) {
/* If the stack of open elements does not have a td or th element
in table scope, then this is a parse error; ignore the token.
(fragment case) */
if (!$this->elementInScope(array('td', 'th'), self::SCOPE_TABLE)) {
// parse error
$this->ignored = true;
/* Otherwise, close the cell (see below) and reprocess the current
token. */
} else {
$this->closeCell();
$this->emitToken($token);
}
/* An end tag whose tag name is one of: "body", "caption", "col",
"colgroup", "html" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
array('body', 'caption', 'col', 'colgroup', 'html'))) {
/* Parse error. Ignore the token. */
$this->ignored = true;
/* An end tag whose tag name is one of: "table", "tbody", "tfoot",
"thead", "tr" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
array('table', 'tbody', 'tfoot', 'thead', 'tr'))) {
/* If the stack of open elements does not have a td or th element
in table scope, then this is a parse error; ignore the token.
(innerHTML case) */
if (!$this->elementInScope(array('td', 'th'), self::SCOPE_TABLE)) {
// Parse error
$this->ignored = true;
/* Otherwise, close the cell (see below) and reprocess the current
token. */
} else {
$this->closeCell();
$this->emitToken($token);
}
/* Anything else */
} else {
/* Process the token as if the insertion mode was "in body". */
$this->processWithRulesFor($token, self::IN_BODY);
}
break;
case self::IN_SELECT:
/* Handle the token as follows: */
/* A character token */
if (
$token['type'] === HTML5_Tokenizer::CHARACTER ||
$token['type'] === HTML5_Tokenizer::SPACECHARACTER
) {
/* Append the token's character to the current node. */
$this->insertText($token['data']);
/* A comment token */
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the current node with the data
attribute set to the data given in the comment token. */
$this->insertComment($token['data']);
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
// parse error
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
$this->processWithRulesFor($token, self::IN_BODY);
/* A start tag token whose tag name is "option" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'option') {
/* If the current node is an option element, act as if an end tag
with the tag name "option" had been seen. */
if (end($this->stack)->tagName === 'option') {
$this->emitToken(array(
'name' => 'option',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* Insert an HTML element for the token. */
$this->insertElement($token);
/* A start tag token whose tag name is "optgroup" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'optgroup') {
/* If the current node is an option element, act as if an end tag
with the tag name "option" had been seen. */
if (end($this->stack)->tagName === 'option') {
$this->emitToken(array(
'name' => 'option',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* If the current node is an optgroup element, act as if an end tag
with the tag name "optgroup" had been seen. */
if (end($this->stack)->tagName === 'optgroup') {
$this->emitToken(array(
'name' => 'optgroup',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* Insert an HTML element for the token. */
$this->insertElement($token);
/* An end tag token whose tag name is "optgroup" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] === 'optgroup') {
/* First, if the current node is an option element, and the node
immediately before it in the stack of open elements is an optgroup
element, then act as if an end tag with the tag name "option" had
been seen. */
$elements_in_stack = count($this->stack);
if ($this->stack[$elements_in_stack - 1]->tagName === 'option' &&
$this->stack[$elements_in_stack - 2]->tagName === 'optgroup') {
$this->emitToken(array(
'name' => 'option',
'type' => HTML5_Tokenizer::ENDTAG
));
}
/* If the current node is an optgroup element, then pop that node
from the stack of open elements. Otherwise, this is a parse error,
ignore the token. */
if (end($this->stack)->tagName === 'optgroup') {
array_pop($this->stack);
} else {
// parse error
$this->ignored = true;
}
/* An end tag token whose tag name is "option" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] === 'option') {
/* If the current node is an option element, then pop that node
from the stack of open elements. Otherwise, this is a parse error,
ignore the token. */
if (end($this->stack)->tagName === 'option') {
array_pop($this->stack);
} else {
// parse error
$this->ignored = true;
}
/* An end tag whose tag name is "select" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] === 'select') {
/* If the stack of open elements does not have an element in table
scope with the same tag name as the token, this is a parse error.
Ignore the token. (fragment case) */
if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
$this->ignored = true;
// parse error
/* Otherwise: */
} else {
/* Pop elements from the stack of open elements until a select
element has been popped from the stack. */
do {
$node = array_pop($this->stack);
} while ($node->tagName !== 'select');
/* Reset the insertion mode appropriately. */
$this->resetInsertionMode();
}
/* A start tag whose tag name is "select" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'select') {
/* Parse error. Act as if the token had been an end tag with the
tag name "select" instead. */
$this->emitToken(array(
'name' => 'select',
'type' => HTML5_Tokenizer::ENDTAG
));
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
($token['name'] === 'input' || $token['name'] === 'keygen' || $token['name'] === 'textarea')) {
// parse error
$this->emitToken(array(
'name' => 'select',
'type' => HTML5_Tokenizer::ENDTAG
));
$this->emitToken($token);
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'script') {
$this->processWithRulesFor($token, self::IN_HEAD);
} elseif ($token['type'] === HTML5_Tokenizer::EOF) {
// XERROR: If the current node is not the root html element, then this is a parse error.
/* Stop parsing */
/* Anything else */
} else {
/* Parse error. Ignore the token. */
$this->ignored = true;
}
break;
case self::IN_SELECT_IN_TABLE:
if ($token['type'] === HTML5_Tokenizer::STARTTAG &&
in_array($token['name'], array('caption', 'table', 'tbody',
'tfoot', 'thead', 'tr', 'td', 'th'))) {
// parse error
$this->emitToken(array(
'name' => 'select',
'type' => HTML5_Tokenizer::ENDTAG,
));
$this->emitToken($token);
/* An end tag whose tag name is one of: "caption", "table", "tbody",
"tfoot", "thead", "tr", "td", "th" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
in_array($token['name'], array('caption', 'table', 'tbody', 'tfoot', 'thead', 'tr', 'td', 'th'))) {
/* Parse error. */
// parse error
/* If the stack of open elements has an element in table scope with
the same tag name as that of the token, then act as if an end tag
with the tag name "select" had been seen, and reprocess the token.
Otherwise, ignore the token. */
if ($this->elementInScope($token['name'], self::SCOPE_TABLE)) {
$this->emitToken(array(
'name' => 'select',
'type' => HTML5_Tokenizer::ENDTAG
));
$this->emitToken($token);
} else {
$this->ignored = true;
}
} else {
$this->processWithRulesFor($token, self::IN_SELECT);
}
break;
case self::IN_FOREIGN_CONTENT:
if ($token['type'] === HTML5_Tokenizer::CHARACTER ||
$token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
$this->insertText($token['data']);
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
$this->insertComment($token['data']);
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
// XERROR: parse error
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] === 'script' && end($this->stack)->tagName === 'script' &&
// XDOM
end($this->stack)->namespaceURI === self::NS_SVG) {
array_pop($this->stack);
// a bunch of script running mumbo jumbo
} elseif (
($token['type'] === HTML5_Tokenizer::STARTTAG &&
((
$token['name'] !== 'mglyph' &&
$token['name'] !== 'malignmark' &&
// XDOM
end($this->stack)->namespaceURI === self::NS_MATHML &&
in_array(end($this->stack)->tagName, array('mi', 'mo', 'mn', 'ms', 'mtext'))
) ||
(
$token['name'] === 'svg' &&
// XDOM
end($this->stack)->namespaceURI === self::NS_MATHML &&
end($this->stack)->tagName === 'annotation-xml'
) ||
(
// XDOM
end($this->stack)->namespaceURI === self::NS_SVG &&
in_array(end($this->stack)->tagName, array('foreignObject', 'desc', 'title'))
) ||
(
// XSKETCHY && XDOM
end($this->stack)->namespaceURI === self::NS_HTML
))
) || $token['type'] === HTML5_Tokenizer::ENDTAG
) {
$this->processWithRulesFor($token, $this->secondary_mode);
/* If, after doing so, the insertion mode is still "in foreign
* content", but there is no element in scope that has a namespace
* other than the HTML namespace, switch the insertion mode to the
* secondary insertion mode. */
if ($this->mode === self::IN_FOREIGN_CONTENT) {
$found = false;
// this basically duplicates elementInScope()
for ($i = count($this->stack) - 1; $i >= 0; $i--) {
// XDOM
$node = $this->stack[$i];
if ($node->namespaceURI !== self::NS_HTML) {
$found = true;
break;
} elseif (in_array($node->tagName, array('table', 'html',
'applet', 'caption', 'td', 'th', 'button', 'marquee',
'object')) || ($node->tagName === 'foreignObject' &&
$node->namespaceURI === self::NS_SVG)) {
break;
}
}
if (!$found) {
$this->mode = $this->secondary_mode;
}
}
} elseif ($token['type'] === HTML5_Tokenizer::EOF || (
$token['type'] === HTML5_Tokenizer::STARTTAG &&
(in_array($token['name'], array('b', "big", "blockquote", "body", "br",
"center", "code", "dc", "dd", "div", "dl", "ds", "dt", "em", "embed", "h1", "h2",
"h3", "h4", "h5", "h6", "head", "hr", "i", "img", "li", "listing",
"menu", "meta", "nobr", "ol", "p", "pre", "ruby", "s", "small",
"span", "strong", "strike", "sub", "sup", "table", "tt", "u", "ul",
"var")) || ($token['name'] === 'font' && ($this->getAttr($token, 'color') ||
$this->getAttr($token, 'face') || $this->getAttr($token, 'size')))))) {
// XERROR: parse error
do {
$node = array_pop($this->stack);
// XDOM
} while ($node->namespaceURI !== self::NS_HTML);
$this->stack[] = $node;
$this->mode = $this->secondary_mode;
$this->emitToken($token);
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG) {
static $svg_lookup = array(
'altglyph' => 'altGlyph',
'altglyphdef' => 'altGlyphDef',
'altglyphitem' => 'altGlyphItem',
'animatecolor' => 'animateColor',
'animatemotion' => 'animateMotion',
'animatetransform' => 'animateTransform',
'clippath' => 'clipPath',
'feblend' => 'feBlend',
'fecolormatrix' => 'feColorMatrix',
'fecomponenttransfer' => 'feComponentTransfer',
'fecomposite' => 'feComposite',
'feconvolvematrix' => 'feConvolveMatrix',
'fediffuselighting' => 'feDiffuseLighting',
'fedisplacementmap' => 'feDisplacementMap',
'fedistantlight' => 'feDistantLight',
'feflood' => 'feFlood',
'fefunca' => 'feFuncA',
'fefuncb' => 'feFuncB',
'fefuncg' => 'feFuncG',
'fefuncr' => 'feFuncR',
'fegaussianblur' => 'feGaussianBlur',
'feimage' => 'feImage',
'femerge' => 'feMerge',
'femergenode' => 'feMergeNode',
'femorphology' => 'feMorphology',
'feoffset' => 'feOffset',
'fepointlight' => 'fePointLight',
'fespecularlighting' => 'feSpecularLighting',
'fespotlight' => 'feSpotLight',
'fetile' => 'feTile',
'feturbulence' => 'feTurbulence',
'foreignobject' => 'foreignObject',
'glyphref' => 'glyphRef',
'lineargradient' => 'linearGradient',
'radialgradient' => 'radialGradient',
'textpath' => 'textPath',
);
// XDOM
$current = end($this->stack);
if ($current->namespaceURI === self::NS_MATHML) {
$token = $this->adjustMathMLAttributes($token);
}
if ($current->namespaceURI === self::NS_SVG &&
isset($svg_lookup[$token['name']])) {
$token['name'] = $svg_lookup[$token['name']];
}
if ($current->namespaceURI === self::NS_SVG) {
$token = $this->adjustSVGAttributes($token);
}
$token = $this->adjustForeignAttributes($token);
$this->insertForeignElement($token, $current->namespaceURI);
if (isset($token['self-closing'])) {
array_pop($this->stack);
// XERROR: acknowledge self-closing flag
}
}
break;
case self::AFTER_BODY:
/* Handle the token as follows: */
/* A character token that is one of one of U+0009 CHARACTER TABULATION,
U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
or U+0020 SPACE */
if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
/* Process the token as it would be processed if the insertion mode
was "in body". */
$this->processWithRulesFor($token, self::IN_BODY);
/* A comment token */
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the first element in the stack of open
elements (the html element), with the data attribute set to the
data given in the comment token. */
// XDOM
$comment = $this->dom->createComment($token['data']);
$this->stack[0]->appendChild($comment);
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
// parse error
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
$this->processWithRulesFor($token, self::IN_BODY);
/* An end tag with the tag name "html" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'html') {
/* If the parser was originally created as part of the HTML
* fragment parsing algorithm, this is a parse error; ignore
* the token. (fragment case) */
$this->ignored = true;
// XERROR: implement this
$this->mode = self::AFTER_AFTER_BODY;
} elseif ($token['type'] === HTML5_Tokenizer::EOF) {
/* Stop parsing */
/* Anything else */
} else {
/* Parse error. Set the insertion mode to "in body" and reprocess
the token. */
$this->mode = self::IN_BODY;
$this->emitToken($token);
}
break;
case self::IN_FRAMESET:
/* Handle the token as follows: */
/* A character token that is one of one of U+0009 CHARACTER TABULATION,
U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
/* Append the character to the current node. */
$this->insertText($token['data']);
/* A comment token */
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the current node with the data
attribute set to the data given in the comment token. */
$this->insertComment($token['data']);
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
// parse error
/* A start tag with the tag name "frameset" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'frameset') {
$this->insertElement($token);
/* An end tag with the tag name "frameset" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] === 'frameset') {
/* If the current node is the root html element, then this is a
parse error; ignore the token. (fragment case) */
if (end($this->stack)->tagName === 'html') {
$this->ignored = true;
// Parse error
} else {
/* Otherwise, pop the current node from the stack of open
elements. */
array_pop($this->stack);
/* If the parser was not originally created as part of the HTML
* fragment parsing algorithm (fragment case), and the current
* node is no longer a frameset element, then switch the
* insertion mode to "after frameset". */
$this->mode = self::AFTER_FRAMESET;
}
/* A start tag with the tag name "frame" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'frame') {
/* Insert an HTML element for the token. */
$this->insertElement($token);
/* Immediately pop the current node off the stack of open elements. */
array_pop($this->stack);
// XERROR: Acknowledge the token's self-closing flag, if it is set.
/* A start tag with the tag name "noframes" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'noframes') {
/* Process the token using the rules for the "in head" insertion mode. */
$this->processwithRulesFor($token, self::IN_HEAD);
} elseif ($token['type'] === HTML5_Tokenizer::EOF) {
// XERROR: If the current node is not the root html element, then this is a parse error.
/* Stop parsing */
/* Anything else */
} else {
/* Parse error. Ignore the token. */
$this->ignored = true;
}
break;
case self::AFTER_FRAMESET:
/* Handle the token as follows: */
/* A character token that is one of one of U+0009 CHARACTER TABULATION,
U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
/* Append the character to the current node. */
$this->insertText($token['data']);
/* A comment token */
} elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the current node with the data
attribute set to the data given in the comment token. */
$this->insertComment($token['data']);
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
// parse error
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
$this->processWithRulesFor($token, self::IN_BODY);
/* An end tag with the tag name "html" */
} elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
$token['name'] === 'html') {
$this->mode = self::AFTER_AFTER_FRAMESET;
/* A start tag with the tag name "noframes" */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
$token['name'] === 'noframes') {
$this->processWithRulesFor($token, self::IN_HEAD);
} elseif ($token['type'] === HTML5_Tokenizer::EOF) {
/* Stop parsing */
/* Anything else */
} else {
/* Parse error. Ignore the token. */
$this->ignored = true;
}
break;
case self::AFTER_AFTER_BODY:
/* A comment token */
if ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the Document object with the data
attribute set to the data given in the comment token. */
// XDOM
$comment = $this->dom->createComment($token['data']);
$this->dom->appendChild($comment);
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE ||
$token['type'] === HTML5_Tokenizer::SPACECHARACTER ||
($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html')) {
$this->processWithRulesFor($token, self::IN_BODY);
/* An end-of-file token */
} elseif ($token['type'] === HTML5_Tokenizer::EOF) {
/* OMG DONE!! */
} else {
// parse error
$this->mode = self::IN_BODY;
$this->emitToken($token);
}
break;
case self::AFTER_AFTER_FRAMESET:
/* A comment token */
if ($token['type'] === HTML5_Tokenizer::COMMENT) {
/* Append a Comment node to the Document object with the data
attribute set to the data given in the comment token. */
// XDOM
$comment = $this->dom->createComment($token['data']);
$this->dom->appendChild($comment);
} elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE ||
$token['type'] === HTML5_Tokenizer::SPACECHARACTER ||
($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html')) {
$this->processWithRulesFor($token, self::IN_BODY);
/* An end-of-file token */
} elseif ($token['type'] === HTML5_Tokenizer::EOF) {
/* OMG DONE!! */
} elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'nofrmaes') {
$this->processWithRulesFor($token, self::IN_HEAD);
} else {
// parse error
}
break;
}
}
private function insertElement($token, $append = true) {
$el = $this->dom->createElementNS(self::NS_HTML, $token['name']);
if (!empty($token['attr'])) {
foreach ($token['attr'] as $attr) {
if (!$el->hasAttribute($attr['name']) && preg_match("/^[a-zA-Z_:]/", $attr['name'])) {
$el->setAttribute($attr['name'], $attr['value']);
}
}
}
if ($append) {
$this->appendToRealParent($el);
$this->stack[] = $el;
}
return $el;
}
/**
* @param $data
*/
private function insertText($data) {
if ($data === '') {
return;
}
if ($this->ignore_lf_token) {
if ($data[0] === "\n") {
$data = substr($data, 1);
if ($data === false) {
return;
}
}
}
$text = $this->dom->createTextNode($data);
$this->appendToRealParent($text);
}
/**
* @param $data
*/
private function insertComment($data) {
$comment = $this->dom->createComment($data);
$this->appendToRealParent($comment);
}
/**
* @param $node
*/
private function appendToRealParent($node) {
// this is only for the foster_parent case
/* If the current node is a table, tbody, tfoot, thead, or tr
element, then, whenever a node would be inserted into the current
node, it must instead be inserted into the foster parent element. */
if (
!$this->foster_parent ||
!in_array(
end($this->stack)->tagName,
array('table', 'tbody', 'tfoot', 'thead', 'tr')
)
) {
end($this->stack)->appendChild($node);
} else {
$this->fosterParent($node);
}
}
/**
* @param $el
* @param int $scope
* @return bool|null
*/
private function elementInScope($el, $scope = self::SCOPE) {
if (is_array($el)) {
foreach($el as $element) {
if ($this->elementInScope($element, $scope)) {
return true;
}
}
return false;
}
$leng = count($this->stack);
for ($n = 0; $n < $leng; $n++) {
/* 1. Initialise node to be the current node (the bottommost node of
the stack). */
$node = $this->stack[$leng - 1 - $n];
if ($node->tagName === $el) {
/* 2. If node is the target node, terminate in a match state. */
return true;
// We've expanded the logic for these states a little differently;
// Hixie's refactoring into "specific scope" is more general, but
// this "gets the job done"
// these are the common states for all scopes
} elseif ($node->tagName === 'table' || $node->tagName === 'html') {
return false;
// these are valid for "in scope" and "in list item scope"
} elseif ($scope !== self::SCOPE_TABLE &&
(in_array($node->tagName, array('applet', 'caption', 'td',
'th', 'button', 'marquee', 'object')) ||
$node->tagName === 'foreignObject' && $node->namespaceURI === self::NS_SVG)) {
return false;
// these are valid for "in list item scope"
} elseif ($scope === self::SCOPE_LISTITEM && in_array($node->tagName, array('ol', 'ul'))) {
return false;
}
/* Otherwise, set node to the previous entry in the stack of open
elements and return to step 2. (This will never fail, since the loop
will always terminate in the previous step if the top of the stack
is reached.) */
}
// To fix warning. This never happens or should return true/false
return null;
}
/**
* @return bool
*/
private function reconstructActiveFormattingElements() {
/* 1. If there are no entries in the list of active formatting elements,
then there is nothing to reconstruct; stop this algorithm. */
$formatting_elements = count($this->a_formatting);
if ($formatting_elements === 0) {
return false;
}
/* 3. Let entry be the last (most recently added) element in the list
of active formatting elements. */
$entry = end($this->a_formatting);
/* 2. If the last (most recently added) entry in the list of active
formatting elements is a marker, or if it is an element that is in the
stack of open elements, then there is nothing to reconstruct; stop this
algorithm. */
if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
return false;
}
for ($a = $formatting_elements - 1; $a >= 0; true) {
/* 4. If there are no entries before entry in the list of active
formatting elements, then jump to step 8. */
if ($a === 0) {
$step_seven = false;
break;
}
/* 5. Let entry be the entry one earlier than entry in the list of
active formatting elements. */
$a--;
$entry = $this->a_formatting[$a];
/* 6. If entry is neither a marker nor an element that is also in
thetack of open elements, go to step 4. */
if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
break;
}
}
while (true) {
/* 7. Let entry be the element one later than entry in the list of
active formatting elements. */
if (isset($step_seven) && $step_seven === true) {
$a++;
$entry = $this->a_formatting[$a];
}
/* 8. Perform a shallow clone of the element entry to obtain clone. */
$clone = $entry->cloneNode();
/* 9. Append clone to the current node and push it onto the stack
of open elements so that it is the new current node. */
$this->appendToRealParent($clone);
$this->stack[] = $clone;
/* 10. Replace the entry for entry in the list with an entry for
clone. */
$this->a_formatting[$a] = $clone;
/* 11. If the entry for clone in the list of active formatting
elements is not the last entry in the list, return to step 7. */
if (end($this->a_formatting) !== $clone) {
$step_seven = true;
} else {
break;
}
}
// Return value not in use ATM. Would just make sense to also return true here.
return true;
}
/**
*
*/
private function clearTheActiveFormattingElementsUpToTheLastMarker() {
/* When the steps below require the UA to clear the list of active
formatting elements up to the last marker, the UA must perform the
following steps: */
while (true) {
/* 1. Let entry be the last (most recently added) entry in the list
of active formatting elements. */
$entry = end($this->a_formatting);
/* 2. Remove entry from the list of active formatting elements. */
array_pop($this->a_formatting);
/* 3. If entry was a marker, then stop the algorithm at this point.
The list has been cleared up to the last marker. */
if ($entry === self::MARKER) {
break;
}
}
}
/**
* @param array $exclude
*/
private function generateImpliedEndTags($exclude = array()) {
/* When the steps below require the UA to generate implied end tags,
* then, while the current node is a dc element, a dd element, a ds
* element, a dt element, an li element, an option element, an optgroup
* element, a p element, an rp element, or an rt element, the UA must
* pop the current node off the stack of open elements. */
$node = end($this->stack);
$elements = array_diff(array('dc', 'dd', 'ds', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude);
while (in_array(end($this->stack)->tagName, $elements)) {
array_pop($this->stack);
}
}
/**
* @param $node
* @return int
*/
private function getElementCategory($node) {
if (!is_object($node)) {
debug_print_backtrace();
}
$name = $node->tagName;
if (in_array($name, $this->special)) {
return self::SPECIAL;
} elseif (in_array($name, $this->scoping)) {
return self::SCOPING;
} elseif (in_array($name, $this->formatting)) {
return self::FORMATTING;
} else {
return self::PHRASING;
}
}
/**
* @param $elements
*/
private function clearStackToTableContext($elements) {
/* When the steps above require the UA to clear the stack back to a
table context, it means that the UA must, while the current node is not
a table element or an html element, pop elements from the stack of open
elements. */
while (true) {
$name = end($this->stack)->tagName;
if (in_array($name, $elements)) {
break;
} else {
array_pop($this->stack);
}
}
}
/**
* @param null $context
*/
private function resetInsertionMode($context = null) {
/* 1. Let last be false. */
$last = false;
$leng = count($this->stack);
for ($n = $leng - 1; $n >= 0; $n--) {
/* 2. Let node be the last node in the stack of open elements. */
$node = $this->stack[$n];
/* 3. If node is the first node in the stack of open elements, then
* set last to true and set node to the context element. (fragment
* case) */
if ($this->stack[0]->isSameNode($node)) {
$last = true;
$node = $context;
}
/* 4. If node is a select element, then switch the insertion mode to
"in select" and abort these steps. (fragment case) */
if ($node->tagName === 'select') {
$this->mode = self::IN_SELECT;
break;
/* 5. If node is a td or th element, then switch the insertion mode
to "in cell" and abort these steps. */
} elseif ($node->tagName === 'td' || $node->nodeName === 'th') {
$this->mode = self::IN_CELL;
break;
/* 6. If node is a tr element, then switch the insertion mode to
"in row" and abort these steps. */
} elseif ($node->tagName === 'tr') {
$this->mode = self::IN_ROW;
break;
/* 7. If node is a tbody, thead, or tfoot element, then switch the
insertion mode to "in table body" and abort these steps. */
} elseif (in_array($node->tagName, array('tbody', 'thead', 'tfoot'))) {
$this->mode = self::IN_TABLE_BODY;
break;
/* 8. If node is a caption element, then switch the insertion mode
to "in caption" and abort these steps. */
} elseif ($node->tagName === 'caption') {
$this->mode = self::IN_CAPTION;
break;
/* 9. If node is a colgroup element, then switch the insertion mode
to "in column group" and abort these steps. (innerHTML case) */
} elseif ($node->tagName === 'colgroup') {
$this->mode = self::IN_COLUMN_GROUP;
break;
/* 10. If node is a table element, then switch the insertion mode
to "in table" and abort these steps. */
} elseif ($node->tagName === 'table') {
$this->mode = self::IN_TABLE;
break;
/* 11. If node is an element from the MathML namespace or the SVG
* namespace, then switch the insertion mode to "in foreign
* content", let the secondary insertion mode be "in body", and
* abort these steps. */
} elseif ($node->namespaceURI === self::NS_SVG ||
$node->namespaceURI === self::NS_MATHML) {
$this->mode = self::IN_FOREIGN_CONTENT;
$this->secondary_mode = self::IN_BODY;
break;
/* 12. If node is a head element, then switch the insertion mode
to "in body" ("in body"! not "in head"!) and abort these steps.
(fragment case) */
} elseif ($node->tagName === 'head') {
$this->mode = self::IN_BODY;
break;
/* 13. If node is a body element, then switch the insertion mode to
"in body" and abort these steps. */
} elseif ($node->tagName === 'body') {
$this->mode = self::IN_BODY;
break;
/* 14. If node is a frameset element, then switch the insertion
mode to "in frameset" and abort these steps. (fragment case) */
} elseif ($node->tagName === 'frameset') {
$this->mode = self::IN_FRAMESET;
break;
/* 15. If node is an html element, then: if the head element
pointer is null, switch the insertion mode to "before head",
otherwise, switch the insertion mode to "after head". In either
case, abort these steps. (fragment case) */
} elseif ($node->tagName === 'html') {
$this->mode = ($this->head_pointer === null)
? self::BEFORE_HEAD
: self::AFTER_HEAD;
break;
/* 16. If last is true, then set the insertion mode to "in body"
and abort these steps. (fragment case) */
} elseif ($last) {
$this->mode = self::IN_BODY;
break;
}
}
}
/**
*
*/
private function closeCell() {
/* If the stack of open elements has a td or th element in table scope,
then act as if an end tag token with that tag name had been seen. */
foreach (array('td', 'th') as $cell) {
if ($this->elementInScope($cell, self::SCOPE_TABLE)) {
$this->emitToken(array(
'name' => $cell,
'type' => HTML5_Tokenizer::ENDTAG
));
break;
}
}
}
/**
* @param $token
* @param $mode
*/
private function processWithRulesFor($token, $mode) {
/* "using the rules for the m insertion mode", where m is one of these
* modes, the user agent must use the rules described under the m
* insertion mode's section, but must leave the insertion mode
* unchanged unless the rules in m themselves switch the insertion mode
* to a new value. */
$this->emitToken($token, $mode);
}
/**
* @param $token
*/
private function insertCDATAElement($token) {
$this->insertElement($token);
$this->original_mode = $this->mode;
$this->mode = self::IN_CDATA_RCDATA;
$this->content_model = HTML5_Tokenizer::CDATA;
}
/**
* @param $token
*/
private function insertRCDATAElement($token) {
$this->insertElement($token);
$this->original_mode = $this->mode;
$this->mode = self::IN_CDATA_RCDATA;
$this->content_model = HTML5_Tokenizer::RCDATA;
}
/**
* @param $token
* @param $key
* @return bool
*/
private function getAttr($token, $key) {
if (!isset($token['attr'])) {
return false;
}
$ret = false;
foreach ($token['attr'] as $keypair) {
if ($keypair['name'] === $key) {
$ret = $keypair['value'];
}
}
return $ret;
}
/**
* @return mixed
*/
private function getCurrentTable() {
/* The current table is the last table element in the stack of open
* elements, if there is one. If there is no table element in the stack
* of open elements (fragment case), then the current table is the
* first element in the stack of open elements (the html element). */
for ($i = count($this->stack) - 1; $i >= 0; $i--) {
if ($this->stack[$i]->tagName === 'table') {
return $this->stack[$i];
}
}
return $this->stack[0];
}
/**
* @return mixed
*/
private function getFosterParent() {
/* The foster parent element is the parent element of the last
table element in the stack of open elements, if there is a
table element and it has such a parent element. If there is no
table element in the stack of open elements (innerHTML case),
then the foster parent element is the first element in the
stack of open elements (the html element). Otherwise, if there
is a table element in the stack of open elements, but the last
table element in the stack of open elements has no parent, or
its parent node is not an element, then the foster parent
element is the element before the last table element in the
stack of open elements. */
for ($n = count($this->stack) - 1; $n >= 0; $n--) {
if ($this->stack[$n]->tagName === 'table') {
$table = $this->stack[$n];
break;
}
}
if (isset($table) && $table->parentNode !== null) {
return $table->parentNode;
} elseif (!isset($table)) {
return $this->stack[0];
} elseif (isset($table) && ($table->parentNode === null ||
$table->parentNode->nodeType !== XML_ELEMENT_NODE)) {
return $this->stack[$n - 1];
}
return null;
}
/**
* @param $node
*/
public function fosterParent($node) {
$foster_parent = $this->getFosterParent();
$table = $this->getCurrentTable(); // almost equivalent to last table element, except it can be html
/* When a node node is to be foster parented, the node node must be
* be inserted into the foster parent element. */
/* If the foster parent element is the parent element of the last table
* element in the stack of open elements, then node must be inserted
* immediately before the last table element in the stack of open
* elements in the foster parent element; otherwise, node must be
* appended to the foster parent element. */
if ($table->tagName === 'table' && $table->parentNode->isSameNode($foster_parent)) {
$foster_parent->insertBefore($node, $table);
} else {
$foster_parent->appendChild($node);
}
}
/**
* For debugging, prints the stack
*/
private function printStack() {
$names = array();
foreach ($this->stack as $i => $element) {
$names[] = $element->tagName;
}
echo " -> stack [" . implode(', ', $names) . "]\n";
}
/**
* For debugging, prints active formatting elements
*/
private function printActiveFormattingElements() {
if (!$this->a_formatting) {
return;
}
$names = array();
foreach ($this->a_formatting as $node) {
if ($node === self::MARKER) {
$names[] = 'MARKER';
} else {
$names[] = $node->tagName;
}
}
echo " -> active formatting [" . implode(', ', $names) . "]\n";
}
/**
* @return bool
*/
public function currentTableIsTainted() {
return !empty($this->getCurrentTable()->tainted);
}
/**
* Sets up the tree constructor for building a fragment.
*
* @param null $context
*/
public function setupContext($context = null) {
$this->fragment = true;
if ($context) {
$context = $this->dom->createElementNS(self::NS_HTML, $context);
/* 4.1. Set the HTML parser's tokenization stage's content model
* flag according to the context element, as follows: */
switch ($context->tagName) {
case 'title': case 'textarea':
$this->content_model = HTML5_Tokenizer::RCDATA;
break;
case 'style': case 'script': case 'xmp': case 'iframe':
case 'noembed': case 'noframes':
$this->content_model = HTML5_Tokenizer::CDATA;
break;
case 'noscript':
// XSCRIPT: assuming scripting is enabled
$this->content_model = HTML5_Tokenizer::CDATA;
break;
case 'plaintext':
$this->content_model = HTML5_Tokenizer::PLAINTEXT;
break;
}
/* 4.2. Let root be a new html element with no attributes. */
$root = $this->dom->createElementNS(self::NS_HTML, 'html');
$this->root = $root;
/* 4.3 Append the element root to the Document node created above. */
$this->dom->appendChild($root);
/* 4.4 Set up the parser's stack of open elements so that it
* contains just the single element root. */
$this->stack = array($root);
/* 4.5 Reset the parser's insertion mode appropriately. */
$this->resetInsertionMode($context);
/* 4.6 Set the parser's form element pointer to the nearest node
* to the context element that is a form element (going straight up
* the ancestor chain, and including the element itself, if it is a
* form element), or, if there is no such form element, to null. */
$node = $context;
do {
if ($node->tagName === 'form') {
$this->form_pointer = $node;
break;
}
} while ($node = $node->parentNode);
}
}
/**
* @param $token
* @return mixed
*/
public function adjustMathMLAttributes($token) {
foreach ($token['attr'] as &$kp) {
if ($kp['name'] === 'definitionurl') {
$kp['name'] = 'definitionURL';
}
}
return $token;
}
/**
* @param $token
* @return mixed
*/
public function adjustSVGAttributes($token) {
static $lookup = array(
'attributename' => 'attributeName',
'attributetype' => 'attributeType',
'basefrequency' => 'baseFrequency',
'baseprofile' => 'baseProfile',
'calcmode' => 'calcMode',
'clippathunits' => 'clipPathUnits',
'contentscripttype' => 'contentScriptType',
'contentstyletype' => 'contentStyleType',
'diffuseconstant' => 'diffuseConstant',
'edgemode' => 'edgeMode',
'externalresourcesrequired' => 'externalResourcesRequired',
'filterres' => 'filterRes',
'filterunits' => 'filterUnits',
'glyphref' => 'glyphRef',
'gradienttransform' => 'gradientTransform',
'gradientunits' => 'gradientUnits',
'kernelmatrix' => 'kernelMatrix',
'kernelunitlength' => 'kernelUnitLength',
'keypoints' => 'keyPoints',
'keysplines' => 'keySplines',
'keytimes' => 'keyTimes',
'lengthadjust' => 'lengthAdjust',
'limitingconeangle' => 'limitingConeAngle',
'markerheight' => 'markerHeight',
'markerunits' => 'markerUnits',
'markerwidth' => 'markerWidth',
'maskcontentunits' => 'maskContentUnits',
'maskunits' => 'maskUnits',
'numoctaves' => 'numOctaves',
'pathlength' => 'pathLength',
'patterncontentunits' => 'patternContentUnits',
'patterntransform' => 'patternTransform',
'patternunits' => 'patternUnits',
'pointsatx' => 'pointsAtX',
'pointsaty' => 'pointsAtY',
'pointsatz' => 'pointsAtZ',
'preservealpha' => 'preserveAlpha',
'preserveaspectratio' => 'preserveAspectRatio',
'primitiveunits' => 'primitiveUnits',
'refx' => 'refX',
'refy' => 'refY',
'repeatcount' => 'repeatCount',
'repeatdur' => 'repeatDur',
'requiredextensions' => 'requiredExtensions',
'requiredfeatures' => 'requiredFeatures',
'specularconstant' => 'specularConstant',
'specularexponent' => 'specularExponent',
'spreadmethod' => 'spreadMethod',
'startoffset' => 'startOffset',
'stddeviation' => 'stdDeviation',
'stitchtiles' => 'stitchTiles',
'surfacescale' => 'surfaceScale',
'systemlanguage' => 'systemLanguage',
'tablevalues' => 'tableValues',
'targetx' => 'targetX',
'targety' => 'targetY',
'textlength' => 'textLength',
'viewbox' => 'viewBox',
'viewtarget' => 'viewTarget',
'xchannelselector' => 'xChannelSelector',
'ychannelselector' => 'yChannelSelector',
'zoomandpan' => 'zoomAndPan',
);
foreach ($token['attr'] as &$kp) {
if (isset($lookup[$kp['name']])) {
$kp['name'] = $lookup[$kp['name']];
}
}
return $token;
}
/**
* @param $token
* @return mixed
*/
public function adjustForeignAttributes($token) {
static $lookup = array(
'xlink:actuate' => array('xlink', 'actuate', self::NS_XLINK),
'xlink:arcrole' => array('xlink', 'arcrole', self::NS_XLINK),
'xlink:href' => array('xlink', 'href', self::NS_XLINK),
'xlink:role' => array('xlink', 'role', self::NS_XLINK),
'xlink:show' => array('xlink', 'show', self::NS_XLINK),
'xlink:title' => array('xlink', 'title', self::NS_XLINK),
'xlink:type' => array('xlink', 'type', self::NS_XLINK),
'xml:base' => array('xml', 'base', self::NS_XML),
'xml:lang' => array('xml', 'lang', self::NS_XML),
'xml:space' => array('xml', 'space', self::NS_XML),
'xmlns' => array(null, 'xmlns', self::NS_XMLNS),
'xmlns:xlink' => array('xmlns', 'xlink', self::NS_XMLNS),
);
foreach ($token['attr'] as &$kp) {
if (isset($lookup[$kp['name']])) {
$kp['name'] = $lookup[$kp['name']];
}
}
return $token;
}
/**
* @param $token
* @param $namespaceURI
*/
public function insertForeignElement($token, $namespaceURI) {
$el = $this->dom->createElementNS($namespaceURI, $token['name']);
if (!empty($token['attr'])) {
foreach ($token['attr'] as $kp) {
$attr = $kp['name'];
if (is_array($attr)) {
$ns = $attr[2];
$attr = $attr[1];
} else {
$ns = self::NS_HTML;
}
if (!$el->hasAttributeNS($ns, $attr)) {
// XSKETCHY: work around godawful libxml bug
if ($ns === self::NS_XLINK) {
$el->setAttribute('xlink:'.$attr, $kp['value']);
} elseif ($ns === self::NS_HTML) {
// Another godawful libxml bug
$el->setAttribute($attr, $kp['value']);
} else {
$el->setAttributeNS($ns, $attr, $kp['value']);
}
}
}
}
$this->appendToRealParent($el);
$this->stack[] = $el;
// XERROR: see below
/* If the newly created element has an xmlns attribute in the XMLNS
* namespace whose value is not exactly the same as the element's
* namespace, that is a parse error. Similarly, if the newly created
* element has an xmlns:xlink attribute in the XMLNS namespace whose
* value is not the XLink Namespace, that is a parse error. */
}
/**
* @return DOMDocument|DOMNodeList
*/
public function save() {
$this->dom->normalize();
if (!$this->fragment) {
return $this->dom;
} else {
if ($this->root) {
return $this->root->childNodes;
} else {
return $this->dom->childNodes;
}
}
}
}
PK :;K`ۗ lib/Cpdf.phpnu W+A
* @author Orion Richardson
* @author Helmut Tischer
* @author Ryan H. Masten
* @author Brian Sweeney
* @author Fabien Ménager
* @license Public Domain http://creativecommons.org/licenses/publicdomain/
* @package Cpdf
*/
use FontLib\Font;
use FontLib\BinaryStream;
class Cpdf
{
/**
* @var integer The current number of pdf objects in the document
*/
public $numObj = 0;
/**
* @var array This array contains all of the pdf objects, ready for final assembly
*/
public $objects = array();
/**
* @var integer The objectId (number within the objects array) of the document catalog
*/
public $catalogId;
/**
* @var array Array carrying information about the fonts that the system currently knows about
* Used to ensure that a font is not loaded twice, among other things
*/
public $fonts = array();
/**
* @var string The default font metrics file to use if no other font has been loaded.
* The path to the directory containing the font metrics should be included
*/
public $defaultFont = './fonts/Helvetica.afm';
/**
* @string A record of the current font
*/
public $currentFont = '';
/**
* @var string The current base font
*/
public $currentBaseFont = '';
/**
* @var integer The number of the current font within the font array
*/
public $currentFontNum = 0;
/**
* @var integer
*/
public $currentNode;
/**
* @var integer Object number of the current page
*/
public $currentPage;
/**
* @var integer Object number of the currently active contents block
*/
public $currentContents;
/**
* @var integer Number of fonts within the system
*/
public $numFonts = 0;
/**
* @var integer Number of graphic state resources used
*/
private $numStates = 0;
/**
* @var array Number of graphic state resources used
*/
private $gstates = array();
/**
* @var array Current color for fill operations, defaults to inactive value,
* all three components should be between 0 and 1 inclusive when active
*/
public $currentColor = null;
/**
* @var array Current color for stroke operations (lines etc.)
*/
public $currentStrokeColor = null;
/**
* @var string Fill rule (nonzero or evenodd)
*/
public $fillRule = "nonzero";
/**
* @var string Current style that lines are drawn in
*/
public $currentLineStyle = '';
/**
* @var array Current line transparency (partial graphics state)
*/
public $currentLineTransparency = array("mode" => "Normal", "opacity" => 1.0);
/**
* array Current fill transparency (partial graphics state)
*/
public $currentFillTransparency = array("mode" => "Normal", "opacity" => 1.0);
/**
* @var array An array which is used to save the state of the document, mainly the colors and styles
* it is used to temporarily change to another state, then change back to what it was before
*/
public $stateStack = array();
/**
* @var integer Number of elements within the state stack
*/
public $nStateStack = 0;
/**
* @var integer Number of page objects within the document
*/
public $numPages = 0;
/**
* @var array Object Id storage stack
*/
public $stack = array();
/**
* @var integer Number of elements within the object Id storage stack
*/
public $nStack = 0;
/**
* an array which contains information about the objects which are not firmly attached to pages
* these have been added with the addObject function
*/
public $looseObjects = array();
/**
* array contains information about how the loose objects are to be added to the document
*/
public $addLooseObjects = array();
/**
* @var integer The objectId of the information object for the document
* this contains authorship, title etc.
*/
public $infoObject = 0;
/**
* @var integer Number of images being tracked within the document
*/
public $numImages = 0;
/**
* @var array An array containing options about the document
* it defaults to turning on the compression of the objects
*/
public $options = array('compression' => true);
/**
* @var integer The objectId of the first page of the document
*/
public $firstPageId;
/**
* @var integer The object Id of the procset object
*/
public $procsetObjectId;
/**
* @var array Store the information about the relationship between font families
* this used so that the code knows which font is the bold version of another font, etc.
* the value of this array is initialised in the constructor function.
*/
public $fontFamilies = array();
/**
* @var string Folder for php serialized formats of font metrics files.
* If empty string, use same folder as original metrics files.
* This can be passed in from class creator.
* If this folder does not exist or is not writable, Cpdf will be **much** slower.
* Because of potential trouble with php safe mode, folder cannot be created at runtime.
*/
public $fontcache = '';
/**
* @var integer The version of the font metrics cache file.
* This value must be manually incremented whenever the internal font data structure is modified.
*/
public $fontcacheVersion = 6;
/**
* @var string Temporary folder.
* If empty string, will attempt system tmp folder.
* This can be passed in from class creator.
*/
public $tmp = '';
/**
* @var string Track if the current font is bolded or italicised
*/
public $currentTextState = '';
/**
* @var string Messages are stored here during processing, these can be selected afterwards to give some useful debug information
*/
public $messages = '';
/**
* @var string The encryption array for the document encryption is stored here
*/
public $arc4 = '';
/**
* @var integer The object Id of the encryption information
*/
public $arc4_objnum = 0;
/**
* @var string The file identifier, used to uniquely identify a pdf document
*/
public $fileIdentifier = '';
/**
* @var boolean A flag to say if a document is to be encrypted or not
*/
public $encrypted = false;
/**
* @var string The encryption key for the encryption of all the document content (structure is not encrypted)
*/
public $encryptionKey = '';
/**
* @var array Array which forms a stack to keep track of nested callback functions
*/
public $callback = array();
/**
* @var integer The number of callback functions in the callback array
*/
public $nCallback = 0;
/**
* @var array Store label->id pairs for named destinations, these will be used to replace internal links
* done this way so that destinations can be defined after the location that links to them
*/
public $destinations = array();
/**
* @var array Store the stack for the transaction commands, each item in here is a record of the values of all the
* publiciables within the class, so that the user can rollback at will (from each 'start' command)
* note that this includes the objects array, so these can be large.
*/
public $checkpoint = '';
/**
* @var array Table of Image origin filenames and image labels which were already added with o_image().
* Allows to merge identical images
*/
public $imagelist = array();
/**
* @var boolean Whether the text passed in should be treated as Unicode or just local character set.
*/
public $isUnicode = false;
/**
* @var string the JavaScript code of the document
*/
public $javascript = '';
/**
* @var boolean whether the compression is possible
*/
protected $compressionReady = false;
/**
* @var array Current page size
*/
protected $currentPageSize = array("width" => 0, "height" => 0);
/**
* @var array All the chars that will be required in the font subsets
*/
protected $stringSubsets = array();
/**
* @var string The target internal encoding
*/
static protected $targetEncoding = 'Windows-1252';
/**
* @var array The list of the core fonts
*/
static protected $coreFonts = array(
'courier',
'courier-bold',
'courier-oblique',
'courier-boldoblique',
'helvetica',
'helvetica-bold',
'helvetica-oblique',
'helvetica-boldoblique',
'times-roman',
'times-bold',
'times-italic',
'times-bolditalic',
'symbol',
'zapfdingbats'
);
/**
* Class constructor
* This will start a new document
*
* @param array $pageSize Array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero.
* @param boolean $isUnicode Whether text will be treated as Unicode or not.
* @param string $fontcache The font cache folder
* @param string $tmp The temporary folder
*/
function __construct($pageSize = array(0, 0, 612, 792), $isUnicode = false, $fontcache = '', $tmp = '')
{
$this->isUnicode = $isUnicode;
$this->fontcache = rtrim($fontcache, DIRECTORY_SEPARATOR."/\\");
$this->tmp = ($tmp !== '' ? $tmp : sys_get_temp_dir());
$this->newDocument($pageSize);
$this->compressionReady = function_exists('gzcompress');
if (in_array('Windows-1252', mb_list_encodings())) {
self::$targetEncoding = 'Windows-1252';
}
// also initialize the font families that are known about already
$this->setFontFamily('init');
}
/**
* Document object methods (internal use only)
*
* There is about one object method for each type of object in the pdf document
* Each function has the same call list ($id,$action,$options).
* $id = the object ID of the object, or what it is to be if it is being created
* $action = a string specifying the action to be performed, though ALL must support:
* 'new' - create the object with the id $id
* 'out' - produce the output for the pdf object
* $options = optional, a string or array containing the various parameters for the object
*
* These, in conjunction with the output function are the ONLY way for output to be produced
* within the pdf 'file'.
*/
/**
* Destination object, used to specify the location for the user to jump to, presently on opening
*
* @param $id
* @param $action
* @param string $options
* @return string|null
*/
protected function o_destination($id, $action, $options = '')
{
switch ($action) {
case 'new':
$this->objects[$id] = array('t' => 'destination', 'info' => array());
$tmp = '';
switch ($options['type']) {
case 'XYZ':
/** @noinspection PhpMissingBreakStatementInspection */
case 'FitR':
$tmp = ' ' . $options['p3'] . $tmp;
case 'FitH':
case 'FitV':
case 'FitBH':
/** @noinspection PhpMissingBreakStatementInspection */
case 'FitBV':
$tmp = ' ' . $options['p1'] . ' ' . $options['p2'] . $tmp;
case 'Fit':
case 'FitB':
$tmp = $options['type'] . $tmp;
$this->objects[$id]['info']['string'] = $tmp;
$this->objects[$id]['info']['page'] = $options['page'];
}
break;
case 'out':
$o = &$this->objects[$id];
$tmp = $o['info'];
$res = "\n$id 0 obj\n" . '[' . $tmp['page'] . ' 0 R /' . $tmp['string'] . "]\nendobj";
return $res;
}
return null;
}
/**
* set the viewer preferences
*
* @param $id
* @param $action
* @param string|array $options
* @return string|null
*/
protected function o_viewerPreferences($id, $action, $options = '')
{
switch ($action) {
case 'new':
$this->objects[$id] = array('t' => 'viewerPreferences', 'info' => array());
break;
case 'add':
$o = &$this->objects[$id];
foreach ($options as $k => $v) {
switch ($k) {
// Boolean keys
case 'HideToolbar':
case 'HideMenubar':
case 'HideWindowUI':
case 'FitWindow':
case 'CenterWindow':
case 'DisplayDocTitle':
case 'PickTrayByPDFSize':
$o['info'][$k] = (bool)$v;
break;
// Integer keys
case 'NumCopies':
$o['info'][$k] = (int)$v;
break;
// Name keys
case 'ViewArea':
case 'ViewClip':
case 'PrintClip':
case 'PrintArea':
$o['info'][$k] = (string)$v;
break;
// Named with limited valid values
case 'NonFullScreenPageMode':
if (!in_array($v, array('UseNone', 'UseOutlines', 'UseThumbs', 'UseOC'))) {
continue;
}
$o['info'][$k] = $v;
break;
case 'Direction':
if (!in_array($v, array('L2R', 'R2L'))) {
continue;
}
$o['info'][$k] = $v;
break;
case 'PrintScaling':
if (!in_array($v, array('None', 'AppDefault'))) {
continue;
}
$o['info'][$k] = $v;
break;
case 'Duplex':
if (!in_array($v, array('None', 'AppDefault'))) {
continue;
}
$o['info'][$k] = $v;
break;
// Integer array
case 'PrintPageRange':
// Cast to integer array
foreach ($v as $vK => $vV) {
$v[$vK] = (int)$vV;
}
$o['info'][$k] = array_values($v);
break;
}
}
break;
case 'out':
$o = &$this->objects[$id];
$res = "\n$id 0 obj\n<< ";
foreach ($o['info'] as $k => $v) {
if (is_string($v)) {
$v = '/' . $v;
} elseif (is_int($v)) {
$v = (string) $v;
} elseif (is_bool($v)) {
$v = ($v ? 'true' : 'false');
} elseif (is_array($v)) {
$v = '[' . implode(' ', $v) . ']';
}
$res .= "\n/$k $v";
}
$res .= "\n>>\n";
return $res;
}
return null;
}
/**
* define the document catalog, the overall controller for the document
*
* @param $id
* @param $action
* @param string|array $options
* @return string|null
*/
protected function o_catalog($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
$this->objects[$id] = array('t' => 'catalog', 'info' => array());
$this->catalogId = $id;
break;
case 'outlines':
case 'pages':
case 'openHere':
case 'javascript':
$o['info'][$action] = $options;
break;
case 'viewerPreferences':
if (!isset($o['info']['viewerPreferences'])) {
$this->numObj++;
$this->o_viewerPreferences($this->numObj, 'new');
$o['info']['viewerPreferences'] = $this->numObj;
}
$vp = $o['info']['viewerPreferences'];
$this->o_viewerPreferences($vp, 'add', $options);
break;
case 'out':
$res = "\n$id 0 obj\n<< /Type /Catalog";
foreach ($o['info'] as $k => $v) {
switch ($k) {
case 'outlines':
$res .= "\n/Outlines $v 0 R";
break;
case 'pages':
$res .= "\n/Pages $v 0 R";
break;
case 'viewerPreferences':
$res .= "\n/ViewerPreferences $v 0 R";
break;
case 'openHere':
$res .= "\n/OpenAction $v 0 R";
break;
case 'javascript':
$res .= "\n/Names <>";
break;
}
}
$res .= " >>\nendobj";
return $res;
}
return null;
}
/**
* object which is a parent to the pages in the document
*
* @param $id
* @param $action
* @param string $options
* @return string|null
*/
protected function o_pages($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
$this->objects[$id] = array('t' => 'pages', 'info' => array());
$this->o_catalog($this->catalogId, 'pages', $id);
break;
case 'page':
if (!is_array($options)) {
// then it will just be the id of the new page
$o['info']['pages'][] = $options;
} else {
// then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative
// and pos is either 'before' or 'after', saying where this page will fit.
if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) {
$i = array_search($options['rid'], $o['info']['pages']);
if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) {
// then there is a match
// make a space
switch ($options['pos']) {
case 'before':
$k = $i;
break;
case 'after':
$k = $i + 1;
break;
default:
$k = -1;
break;
}
if ($k >= 0) {
for ($j = count($o['info']['pages']) - 1; $j >= $k; $j--) {
$o['info']['pages'][$j + 1] = $o['info']['pages'][$j];
}
$o['info']['pages'][$k] = $options['id'];
}
}
}
}
break;
case 'procset':
$o['info']['procset'] = $options;
break;
case 'mediaBox':
$o['info']['mediaBox'] = $options;
// which should be an array of 4 numbers
$this->currentPageSize = array('width' => $options[2], 'height' => $options[3]);
break;
case 'font':
$o['info']['fonts'][] = array('objNum' => $options['objNum'], 'fontNum' => $options['fontNum']);
break;
case 'extGState':
$o['info']['extGStates'][] = array('objNum' => $options['objNum'], 'stateNum' => $options['stateNum']);
break;
case 'xObject':
$o['info']['xObjects'][] = array('objNum' => $options['objNum'], 'label' => $options['label']);
break;
case 'out':
if (count($o['info']['pages'])) {
$res = "\n$id 0 obj\n<< /Type /Pages\n/Kids [";
foreach ($o['info']['pages'] as $v) {
$res .= "$v 0 R\n";
}
$res .= "]\n/Count " . count($this->objects[$id]['info']['pages']);
if ((isset($o['info']['fonts']) && count($o['info']['fonts'])) ||
isset($o['info']['procset']) ||
(isset($o['info']['extGStates']) && count($o['info']['extGStates']))
) {
$res .= "\n/Resources <<";
if (isset($o['info']['procset'])) {
$res .= "\n/ProcSet " . $o['info']['procset'] . " 0 R";
}
if (isset($o['info']['fonts']) && count($o['info']['fonts'])) {
$res .= "\n/Font << ";
foreach ($o['info']['fonts'] as $finfo) {
$res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R";
}
$res .= "\n>>";
}
if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) {
$res .= "\n/XObject << ";
foreach ($o['info']['xObjects'] as $finfo) {
$res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R";
}
$res .= "\n>>";
}
if (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) {
$res .= "\n/ExtGState << ";
foreach ($o['info']['extGStates'] as $gstate) {
$res .= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R";
}
$res .= "\n>>";
}
$res .= "\n>>";
if (isset($o['info']['mediaBox'])) {
$tmp = $o['info']['mediaBox'];
$res .= "\n/MediaBox [" . sprintf(
'%.3F %.3F %.3F %.3F',
$tmp[0],
$tmp[1],
$tmp[2],
$tmp[3]
) . ']';
}
}
$res .= "\n >>\nendobj";
} else {
$res = "\n$id 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj";
}
return $res;
}
return null;
}
/**
* define the outlines in the doc, empty for now
*
* @param $id
* @param $action
* @param string $options
* @return string|null
*/
protected function o_outlines($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
$this->objects[$id] = array('t' => 'outlines', 'info' => array('outlines' => array()));
$this->o_catalog($this->catalogId, 'outlines', $id);
break;
case 'outline':
$o['info']['outlines'][] = $options;
break;
case 'out':
if (count($o['info']['outlines'])) {
$res = "\n$id 0 obj\n<< /Type /Outlines /Kids [";
foreach ($o['info']['outlines'] as $v) {
$res .= "$v 0 R ";
}
$res .= "] /Count " . count($o['info']['outlines']) . " >>\nendobj";
} else {
$res = "\n$id 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj";
}
return $res;
}
return null;
}
/**
* an object to hold the font description
*
* @param $id
* @param $action
* @param string|array $options
* @return string|null
*/
protected function o_font($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
$this->objects[$id] = array(
't' => 'font',
'info' => array(
'name' => $options['name'],
'fontFileName' => $options['fontFileName'],
'SubType' => 'Type1'
)
);
$fontNum = $this->numFonts;
$this->objects[$id]['info']['fontNum'] = $fontNum;
// deal with the encoding and the differences
if (isset($options['differences'])) {
// then we'll need an encoding dictionary
$this->numObj++;
$this->o_fontEncoding($this->numObj, 'new', $options);
$this->objects[$id]['info']['encodingDictionary'] = $this->numObj;
} else {
if (isset($options['encoding'])) {
// we can specify encoding here
switch ($options['encoding']) {
case 'WinAnsiEncoding':
case 'MacRomanEncoding':
case 'MacExpertEncoding':
$this->objects[$id]['info']['encoding'] = $options['encoding'];
break;
case 'none':
break;
default:
$this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding';
break;
}
} else {
$this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding';
}
}
if ($this->fonts[$options['fontFileName']]['isUnicode']) {
// For Unicode fonts, we need to incorporate font data into
// sub-sections that are linked from the primary font section.
// Look at o_fontGIDtoCID and o_fontDescendentCID functions
// for more information.
//
// All of this code is adapted from the excellent changes made to
// transform FPDF to TCPDF (http://tcpdf.sourceforge.net/)
$toUnicodeId = ++$this->numObj;
$this->o_toUnicode($toUnicodeId, 'new');
$this->objects[$id]['info']['toUnicode'] = $toUnicodeId;
$cidFontId = ++$this->numObj;
$this->o_fontDescendentCID($cidFontId, 'new', $options);
$this->objects[$id]['info']['cidFont'] = $cidFontId;
}
// also tell the pages node about the new font
$this->o_pages($this->currentNode, 'font', array('fontNum' => $fontNum, 'objNum' => $id));
break;
case 'add':
foreach ($options as $k => $v) {
switch ($k) {
case 'BaseFont':
$o['info']['name'] = $v;
break;
case 'FirstChar':
case 'LastChar':
case 'Widths':
case 'FontDescriptor':
case 'SubType':
$this->addMessage('o_font ' . $k . " : " . $v);
$o['info'][$k] = $v;
break;
}
}
// pass values down to descendent font
if (isset($o['info']['cidFont'])) {
$this->o_fontDescendentCID($o['info']['cidFont'], 'add', $options);
}
break;
case 'out':
if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) {
// For Unicode fonts, we need to incorporate font data into
// sub-sections that are linked from the primary font section.
// Look at o_fontGIDtoCID and o_fontDescendentCID functions
// for more information.
//
// All of this code is adapted from the excellent changes made to
// transform FPDF to TCPDF (http://tcpdf.sourceforge.net/)
$res = "\n$id 0 obj\n<>\n";
$res .= "endobj";
} else {
$res = "\n$id 0 obj\n<< /Type /Font\n/Subtype /" . $o['info']['SubType'] . "\n";
$res .= "/Name /F" . $o['info']['fontNum'] . "\n";
$res .= "/BaseFont /" . $o['info']['name'] . "\n";
if (isset($o['info']['encodingDictionary'])) {
// then place a reference to the dictionary
$res .= "/Encoding " . $o['info']['encodingDictionary'] . " 0 R\n";
} else {
if (isset($o['info']['encoding'])) {
// use the specified encoding
$res .= "/Encoding /" . $o['info']['encoding'] . "\n";
}
}
if (isset($o['info']['FirstChar'])) {
$res .= "/FirstChar " . $o['info']['FirstChar'] . "\n";
}
if (isset($o['info']['LastChar'])) {
$res .= "/LastChar " . $o['info']['LastChar'] . "\n";
}
if (isset($o['info']['Widths'])) {
$res .= "/Widths " . $o['info']['Widths'] . " 0 R\n";
}
if (isset($o['info']['FontDescriptor'])) {
$res .= "/FontDescriptor " . $o['info']['FontDescriptor'] . " 0 R\n";
}
$res .= ">>\n";
$res .= "endobj";
}
return $res;
}
return null;
}
/**
* A toUnicode section, needed for unicode fonts
*
* @param $id
* @param $action
* @return null|string
*/
protected function o_toUnicode($id, $action)
{
switch ($action) {
case 'new':
$this->objects[$id] = array(
't' => 'toUnicode'
);
break;
case 'add':
break;
case 'out':
$ordering = '(UCS)';
$registry = '(Adobe)';
if ($this->encrypted) {
$this->encryptInit($id);
$ordering = $this->ARC4($ordering);
$registry = $this->ARC4($registry);
}
$stream = <<> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<0000>
endcodespacerange
1 beginbfrange
<0000> <0000>
endbfrange
endcmap
CMapName currentdict /CMap defineresource pop
end
end
EOT;
$res = "\n$id 0 obj\n";
$res .= "<>\n";
$res .= "stream\n" . $stream . "\nendstream" . "\nendobj";;
return $res;
}
return null;
}
/**
* a font descriptor, needed for including additional fonts
*
* @param $id
* @param $action
* @param string $options
* @return null|string
*/
protected function o_fontDescriptor($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
$this->objects[$id] = array('t' => 'fontDescriptor', 'info' => $options);
break;
case 'out':
$res = "\n$id 0 obj\n<< /Type /FontDescriptor\n";
foreach ($o['info'] as $label => $value) {
switch ($label) {
case 'Ascent':
case 'CapHeight':
case 'Descent':
case 'Flags':
case 'ItalicAngle':
case 'StemV':
case 'AvgWidth':
case 'Leading':
case 'MaxWidth':
case 'MissingWidth':
case 'StemH':
case 'XHeight':
case 'CharSet':
if (mb_strlen($value, '8bit')) {
$res .= "/$label $value\n";
}
break;
case 'FontFile':
case 'FontFile2':
case 'FontFile3':
$res .= "/$label $value 0 R\n";
break;
case 'FontBBox':
$res .= "/$label [$value[0] $value[1] $value[2] $value[3]]\n";
break;
case 'FontName':
$res .= "/$label /$value\n";
break;
}
}
$res .= ">>\nendobj";
return $res;
}
return null;
}
/**
* the font encoding
*
* @param $id
* @param $action
* @param string $options
* @return null|string
*/
protected function o_fontEncoding($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
// the options array should contain 'differences' and maybe 'encoding'
$this->objects[$id] = array('t' => 'fontEncoding', 'info' => $options);
break;
case 'out':
$res = "\n$id 0 obj\n<< /Type /Encoding\n";
if (!isset($o['info']['encoding'])) {
$o['info']['encoding'] = 'WinAnsiEncoding';
}
if ($o['info']['encoding'] !== 'none') {
$res .= "/BaseEncoding /" . $o['info']['encoding'] . "\n";
}
$res .= "/Differences \n[";
$onum = -100;
foreach ($o['info']['differences'] as $num => $label) {
if ($num != $onum + 1) {
// we cannot make use of consecutive numbering
$res .= "\n$num /$label";
} else {
$res .= " /$label";
}
$onum = $num;
}
$res .= "\n]\n>>\nendobj";
return $res;
}
return null;
}
/**
* a descendent cid font, needed for unicode fonts
*
* @param $id
* @param $action
* @param string|array $options
* @return null|string
*/
protected function o_fontDescendentCID($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
$this->objects[$id] = array('t' => 'fontDescendentCID', 'info' => $options);
// we need a CID system info section
$cidSystemInfoId = ++$this->numObj;
$this->o_cidSystemInfo($cidSystemInfoId, 'new');
$this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId;
// and a CID to GID map
$cidToGidMapId = ++$this->numObj;
$this->o_fontGIDtoCIDMap($cidToGidMapId, 'new', $options);
$this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId;
break;
case 'add':
foreach ($options as $k => $v) {
switch ($k) {
case 'BaseFont':
$o['info']['name'] = $v;
break;
case 'FirstChar':
case 'LastChar':
case 'MissingWidth':
case 'FontDescriptor':
case 'SubType':
$this->addMessage("o_fontDescendentCID $k : $v");
$o['info'][$k] = $v;
break;
}
}
// pass values down to cid to gid map
$this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options);
break;
case 'out':
$res = "\n$id 0 obj\n";
$res .= "<fonts[$o['info']['fontFileName']]['CIDWidths'])) {
$cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths'];
$w = '';
foreach ($cid_widths as $cid => $width) {
$w .= "$cid [$width] ";
}
$res .= "/W [$w]\n";
}
$res .= "/CIDToGIDMap " . $o['info']['cidToGidMap'] . " 0 R\n";
$res .= ">>\n";
$res .= "endobj";
return $res;
}
return null;
}
/**
* CID system info section, needed for unicode fonts
*
* @param $id
* @param $action
* @return null|string
*/
protected function o_cidSystemInfo($id, $action)
{
switch ($action) {
case 'new':
$this->objects[$id] = array(
't' => 'cidSystemInfo'
);
break;
case 'add':
break;
case 'out':
$ordering = '(UCS)';
$registry = '(Adobe)';
if ($this->encrypted) {
$this->encryptInit($id);
$ordering = $this->ARC4($ordering);
$registry = $this->ARC4($registry);
}
$res = "\n$id 0 obj\n";
$res .= '<>";
$res .= "\nendobj";;
return $res;
}
return null;
}
/**
* a font glyph to character map, needed for unicode fonts
*
* @param $id
* @param $action
* @param string $options
* @return null|string
*/
protected function o_fontGIDtoCIDMap($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
$this->objects[$id] = array('t' => 'fontGIDtoCIDMap', 'info' => $options);
break;
case 'out':
$res = "\n$id 0 obj\n";
$fontFileName = $o['info']['fontFileName'];
$tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']);
$compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) &&
$this->fonts[$fontFileName]['CIDtoGID_Compressed'];
if (!$compressed && isset($o['raw'])) {
$res .= $tmp;
} else {
$res .= "<<";
if (!$compressed && $this->compressionReady && $this->options['compression']) {
// then implement ZLIB based compression on this content stream
$compressed = true;
$tmp = gzcompress($tmp, 6);
}
if ($compressed) {
$res .= "\n/Filter /FlateDecode";
}
if ($this->encrypted) {
$this->encryptInit($id);
$tmp = $this->ARC4($tmp);
}
$res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream";
}
$res .= "\nendobj";
return $res;
}
return null;
}
/**
* the document procset, solves some problems with printing to old PS printers
*
* @param $id
* @param $action
* @param string $options
* @return null|string
*/
protected function o_procset($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
$this->objects[$id] = array('t' => 'procset', 'info' => array('PDF' => 1, 'Text' => 1));
$this->o_pages($this->currentNode, 'procset', $id);
$this->procsetObjectId = $id;
break;
case 'add':
// this is to add new items to the procset list, despite the fact that this is considered
// obsolete, the items are required for printing to some postscript printers
switch ($options) {
case 'ImageB':
case 'ImageC':
case 'ImageI':
$o['info'][$options] = 1;
break;
}
break;
case 'out':
$res = "\n$id 0 obj\n[";
foreach ($o['info'] as $label => $val) {
$res .= "/$label ";
}
$res .= "]\nendobj";
return $res;
}
return null;
}
/**
* define the document information
*
* @param $id
* @param $action
* @param string $options
* @return null|string
*/
protected function o_info($id, $action, $options = '')
{
switch ($action) {
case 'new':
$this->infoObject = $id;
$date = 'D:' . @date('Ymd');
$this->objects[$id] = array(
't' => 'info',
'info' => array(
'Producer' => 'CPDF (dompdf)',
'CreationDate' => $date
)
);
break;
case 'Title':
case 'Author':
case 'Subject':
case 'Keywords':
case 'Creator':
case 'Producer':
case 'CreationDate':
case 'ModDate':
case 'Trapped':
$this->objects[$id]['info'][$action] = $options;
break;
case 'out':
$encrypted = $this->encrypted;
if ($encrypted) {
$this->encryptInit($id);
}
$res = "\n$id 0 obj\n<<\n";
$o = &$this->objects[$id];
foreach ($o['info'] as $k => $v) {
$res .= "/$k (";
// dates must be outputted as-is, without Unicode transformations
if ($k !== 'CreationDate' && $k !== 'ModDate') {
$v = $this->filterText($v, true, false);
}
if ($encrypted) {
$v = $this->ARC4($v);
}
$res .= $v;
$res .= ")\n";
}
$res .= ">>\nendobj";
return $res;
}
return null;
}
/**
* an action object, used to link to URLS initially
*
* @param $id
* @param $action
* @param string $options
* @return null|string
*/
protected function o_action($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
if (is_array($options)) {
$this->objects[$id] = array('t' => 'action', 'info' => $options, 'type' => $options['type']);
} else {
// then assume a URI action
$this->objects[$id] = array('t' => 'action', 'info' => $options, 'type' => 'URI');
}
break;
case 'out':
if ($this->encrypted) {
$this->encryptInit($id);
}
$res = "\n$id 0 obj\n<< /Type /Action";
switch ($o['type']) {
case 'ilink':
if (!isset($this->destinations[(string)$o['info']['label']])) {
break;
}
// there will be an 'label' setting, this is the name of the destination
$res .= "\n/S /GoTo\n/D " . $this->destinations[(string)$o['info']['label']] . " 0 R";
break;
case 'URI':
$res .= "\n/S /URI\n/URI (";
if ($this->encrypted) {
$res .= $this->filterText($this->ARC4($o['info']), true, false);
} else {
$res .= $this->filterText($o['info'], true, false);
}
$res .= ")";
break;
}
$res .= "\n>>\nendobj";
return $res;
}
return null;
}
/**
* an annotation object, this will add an annotation to the current page.
* initially will support just link annotations
*
* @param $id
* @param $action
* @param string $options
* @return null|string
*/
protected function o_annotation($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
// add the annotation to the current page
$pageId = $this->currentPage;
$this->o_page($pageId, 'annot', $id);
// and add the action object which is going to be required
switch ($options['type']) {
case 'link':
$this->objects[$id] = array('t' => 'annotation', 'info' => $options);
$this->numObj++;
$this->o_action($this->numObj, 'new', $options['url']);
$this->objects[$id]['info']['actionId'] = $this->numObj;
break;
case 'ilink':
// this is to a named internal link
$label = $options['label'];
$this->objects[$id] = array('t' => 'annotation', 'info' => $options);
$this->numObj++;
$this->o_action($this->numObj, 'new', array('type' => 'ilink', 'label' => $label));
$this->objects[$id]['info']['actionId'] = $this->numObj;
break;
}
break;
case 'out':
$res = "\n$id 0 obj\n<< /Type /Annot";
switch ($o['info']['type']) {
case 'link':
case 'ilink':
$res .= "\n/Subtype /Link";
break;
}
$res .= "\n/A " . $o['info']['actionId'] . " 0 R";
$res .= "\n/Border [0 0 0]";
$res .= "\n/H /I";
$res .= "\n/Rect [ ";
foreach ($o['info']['rect'] as $v) {
$res .= sprintf("%.4F ", $v);
}
$res .= "]";
$res .= "\n>>\nendobj";
return $res;
}
return null;
}
/**
* a page object, it also creates a contents object to hold its contents
*
* @param $id
* @param $action
* @param string $options
* @return null|string
*/
protected function o_page($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
$this->numPages++;
$this->objects[$id] = array(
't' => 'page',
'info' => array(
'parent' => $this->currentNode,
'pageNum' => $this->numPages,
'mediaBox' => $this->objects[$this->currentNode]['info']['mediaBox']
)
);
if (is_array($options)) {
// then this must be a page insertion, array should contain 'rid','pos'=[before|after]
$options['id'] = $id;
$this->o_pages($this->currentNode, 'page', $options);
} else {
$this->o_pages($this->currentNode, 'page', $id);
}
$this->currentPage = $id;
//make a contents object to go with this page
$this->numObj++;
$this->o_contents($this->numObj, 'new', $id);
$this->currentContents = $this->numObj;
$this->objects[$id]['info']['contents'] = array();
$this->objects[$id]['info']['contents'][] = $this->numObj;
$match = ($this->numPages % 2 ? 'odd' : 'even');
foreach ($this->addLooseObjects as $oId => $target) {
if ($target === 'all' || $match === $target) {
$this->objects[$id]['info']['contents'][] = $oId;
}
}
break;
case 'content':
$o['info']['contents'][] = $options;
break;
case 'annot':
// add an annotation to this page
if (!isset($o['info']['annot'])) {
$o['info']['annot'] = array();
}
// $options should contain the id of the annotation dictionary
$o['info']['annot'][] = $options;
break;
case 'out':
$res = "\n$id 0 obj\n<< /Type /Page";
if (isset($o['info']['mediaBox'])) {
$tmp = $o['info']['mediaBox'];
$res .= "\n/MediaBox [" . sprintf(
'%.3F %.3F %.3F %.3F',
$tmp[0],
$tmp[1],
$tmp[2],
$tmp[3]
) . ']';
}
$res .= "\n/Parent " . $o['info']['parent'] . " 0 R";
if (isset($o['info']['annot'])) {
$res .= "\n/Annots [";
foreach ($o['info']['annot'] as $aId) {
$res .= " $aId 0 R";
}
$res .= " ]";
}
$count = count($o['info']['contents']);
if ($count == 1) {
$res .= "\n/Contents " . $o['info']['contents'][0] . " 0 R";
} else {
if ($count > 1) {
$res .= "\n/Contents [\n";
// reverse the page contents so added objects are below normal content
//foreach (array_reverse($o['info']['contents']) as $cId) {
// Back to normal now that I've got transparency working --Benj
foreach ($o['info']['contents'] as $cId) {
$res .= "$cId 0 R\n";
}
$res .= "]";
}
}
$res .= "\n>>\nendobj";
return $res;
}
return null;
}
/**
* the contents objects hold all of the content which appears on pages
*
* @param $id
* @param $action
* @param string|array $options
* @return null|string
*/
protected function o_contents($id, $action, $options = '')
{
if ($action !== 'new') {
$o = &$this->objects[$id];
}
switch ($action) {
case 'new':
$this->objects[$id] = array('t' => 'contents', 'c' => '', 'info' => array());
if (mb_strlen($options, '8bit') && intval($options)) {
// then this contents is the primary for a page
$this->objects[$id]['onPage'] = $options;
} else {
if ($options === 'raw') {
// then this page contains some other type of system object
$this->objects[$id]['raw'] = 1;
}
}
break;
case 'add':
// add more options to the declaration
foreach ($options as $k => $v) {
$o['info'][$k] = $v;
}
case 'out':
$tmp = $o['c'];
$res = "\n$id 0 obj\n";
if (isset($this->objects[$id]['raw'])) {
$res .= $tmp;
} else {
$res .= "<<";
if ($this->compressionReady && $this->options['compression']) {
// then implement ZLIB based compression on this content stream
$res .= " /Filter /FlateDecode";
$tmp = gzcompress($tmp, 6);
}
if ($this->encrypted) {
$this->encryptInit($id);
$tmp = $this->ARC4($tmp);
}
foreach ($o['info'] as $k => $v) {
$res .= "\n/$k $v";
}
$res .= "\n/Length " . mb_strlen($tmp, '8bit') . " >>\nstream\n$tmp\nendstream";
}
$res .= "\nendobj";
return $res;
}
return null;
}
/**
* @param $id
* @param $action
* @return string|null
*/
protected function o_embedjs($id, $action)
{
switch ($action) {
case 'new':
$this->objects[$id] = array(
't' => 'embedjs',
'info' => array(
'Names' => '[(EmbeddedJS) ' . ($id + 1) . ' 0 R]'
)
);
break;
case 'out':
$o = &$this->objects[$id];
$res = "\n$id 0 obj\n<< ";
foreach ($o['info'] as $k => $v) {
$res .= "\n/$k $v";
}
$res .= "\n>>\nendobj";
return $res;
}
return null;
}
/**
* @param $id
* @param $action
* @param string $code
* @return null|string
*/
protected function o_javascript($id, $action, $code = '')
{
switch ($action) {
case 'new':
$this->objects[$id] = array(
't' => 'javascript',
'info' => array(
'S' => '/JavaScript',
'JS' => '(' . $this->filterText($code, true, false) . ')',
)
);
break;
case 'out':
$o = &$this->objects[$id];
$res = "\n$id 0 obj\n<< ";
foreach ($o['info'] as $k => $v) {
$res .= "\n/$k $v";
}
$res .= "\n>>\nendobj";
return $res;
}
return null;
}
/**
* an image object, will be an XObject in the document, includes description and data
*
* @param $id
* @param $action
* @param string $options
* @return null|string
*/
protected function o_image($id, $action, $options = '')
{
switch ($action) {
case 'new':
// make the new object
$this->objects[$id] = array('t' => 'image', 'data' => &$options['data'], 'info' => array());
$info =& $this->objects[$id]['info'];
$info['Type'] = '/XObject';
$info['Subtype'] = '/Image';
$info['Width'] = $options['iw'];
$info['Height'] = $options['ih'];
if (isset($options['masked']) && $options['masked']) {
$info['SMask'] = ($this->numObj - 1) . ' 0 R';
}
if (!isset($options['type']) || $options['type'] === 'jpg') {
if (!isset($options['channels'])) {
$options['channels'] = 3;
}
switch ($options['channels']) {
case 1:
$info['ColorSpace'] = '/DeviceGray';
break;
case 4:
$info['ColorSpace'] = '/DeviceCMYK';
break;
default:
$info['ColorSpace'] = '/DeviceRGB';
break;
}
if ($info['ColorSpace'] === '/DeviceCMYK') {
$info['Decode'] = '[1 0 1 0 1 0 1 0]';
}
$info['Filter'] = '/DCTDecode';
$info['BitsPerComponent'] = 8;
} else {
if ($options['type'] === 'png') {
$info['Filter'] = '/FlateDecode';
$info['DecodeParms'] = '<< /Predictor 15 /Colors ' . $options['ncolor'] . ' /Columns ' . $options['iw'] . ' /BitsPerComponent ' . $options['bitsPerComponent'] . '>>';
if ($options['isMask']) {
$info['ColorSpace'] = '/DeviceGray';
} else {
if (mb_strlen($options['pdata'], '8bit')) {
$tmp = ' [ /Indexed /DeviceRGB ' . (mb_strlen($options['pdata'], '8bit') / 3 - 1) . ' ';
$this->numObj++;
$this->o_contents($this->numObj, 'new');
$this->objects[$this->numObj]['c'] = $options['pdata'];
$tmp .= $this->numObj . ' 0 R';
$tmp .= ' ]';
$info['ColorSpace'] = $tmp;
if (isset($options['transparency'])) {
$transparency = $options['transparency'];
switch ($transparency['type']) {
case 'indexed':
$tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] ';
$info['Mask'] = $tmp;
break;
case 'color-key':
$tmp = ' [ ' .
$transparency['r'] . ' ' . $transparency['r'] .
$transparency['g'] . ' ' . $transparency['g'] .
$transparency['b'] . ' ' . $transparency['b'] .
' ] ';
$info['Mask'] = $tmp;
break;
}
}
} else {
if (isset($options['transparency'])) {
$transparency = $options['transparency'];
switch ($transparency['type']) {
case 'indexed':
$tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] ';
$info['Mask'] = $tmp;
break;
case 'color-key':
$tmp = ' [ ' .
$transparency['r'] . ' ' . $transparency['r'] . ' ' .
$transparency['g'] . ' ' . $transparency['g'] . ' ' .
$transparency['b'] . ' ' . $transparency['b'] .
' ] ';
$info['Mask'] = $tmp;
break;
}
}
$info['ColorSpace'] = '/' . $options['color'];
}
}
$info['BitsPerComponent'] = $options['bitsPerComponent'];
}
}
// assign it a place in the named resource dictionary as an external object, according to
// the label passed in with it.
$this->o_pages($this->currentNode, 'xObject', array('label' => $options['label'], 'objNum' => $id));
// also make sure that we have the right procset object for it.
$this->o_procset($this->procsetObjectId, 'add', 'ImageC');
break;
case 'out':
$o = &$this->objects[$id];
$tmp = &$o['data'];
$res = "\n$id 0 obj\n<<";
foreach ($o['info'] as $k => $v) {
$res .= "\n/$k $v";
}
if ($this->encrypted) {
$this->encryptInit($id);
$tmp = $this->ARC4($tmp);
}
$res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream\nendobj";
return $res;
}
return null;
}
/**
* graphics state object
*
* @param $id
* @param $action
* @param string $options
* @return null|string
*/
protected function o_extGState($id, $action, $options = "")
{
static $valid_params = array(
"LW",
"LC",
"LC",
"LJ",
"ML",
"D",
"RI",
"OP",
"op",
"OPM",
"Font",
"BG",
"BG2",
"UCR",
"TR",
"TR2",
"HT",
"FL",
"SM",
"SA",
"BM",
"SMask",
"CA",
"ca",
"AIS",
"TK"
);
switch ($action) {
case "new":
$this->objects[$id] = array('t' => 'extGState', 'info' => $options);
// Tell the pages about the new resource
$this->numStates++;
$this->o_pages($this->currentNode, 'extGState', array("objNum" => $id, "stateNum" => $this->numStates));
break;
case "out":
$o = &$this->objects[$id];
$res = "\n$id 0 obj\n<< /Type /ExtGState\n";
foreach ($o["info"] as $k => $v) {
if (!in_array($k, $valid_params)) {
continue;
}
$res .= "/$k $v\n";
}
$res .= ">>\nendobj";
return $res;
}
return null;
}
/**
* encryption object.
*
* @param $id
* @param $action
* @param string $options
* @return string|null
*/
protected function o_encryption($id, $action, $options = '')
{
switch ($action) {
case 'new':
// make the new object
$this->objects[$id] = array('t' => 'encryption', 'info' => $options);
$this->arc4_objnum = $id;
break;
case 'keys':
// figure out the additional parameters required
$pad = chr(0x28) . chr(0xBF) . chr(0x4E) . chr(0x5E) . chr(0x4E) . chr(0x75) . chr(0x8A) . chr(0x41)
. chr(0x64) . chr(0x00) . chr(0x4E) . chr(0x56) . chr(0xFF) . chr(0xFA) . chr(0x01) . chr(0x08)
. chr(0x2E) . chr(0x2E) . chr(0x00) . chr(0xB6) . chr(0xD0) . chr(0x68) . chr(0x3E) . chr(0x80)
. chr(0x2F) . chr(0x0C) . chr(0xA9) . chr(0xFE) . chr(0x64) . chr(0x53) . chr(0x69) . chr(0x7A);
$info = $this->objects[$id]['info'];
$len = mb_strlen($info['owner'], '8bit');
if ($len > 32) {
$owner = substr($info['owner'], 0, 32);
} else {
if ($len < 32) {
$owner = $info['owner'] . substr($pad, 0, 32 - $len);
} else {
$owner = $info['owner'];
}
}
$len = mb_strlen($info['user'], '8bit');
if ($len > 32) {
$user = substr($info['user'], 0, 32);
} else {
if ($len < 32) {
$user = $info['user'] . substr($pad, 0, 32 - $len);
} else {
$user = $info['user'];
}
}
$tmp = $this->md5_16($owner);
$okey = substr($tmp, 0, 5);
$this->ARC4_init($okey);
$ovalue = $this->ARC4($user);
$this->objects[$id]['info']['O'] = $ovalue;
// now make the u value, phew.
$tmp = $this->md5_16(
$user . $ovalue . chr($info['p']) . chr(255) . chr(255) . chr(255) . hex2bin($this->fileIdentifier)
);
$ukey = substr($tmp, 0, 5);
$this->ARC4_init($ukey);
$this->encryptionKey = $ukey;
$this->encrypted = true;
$uvalue = $this->ARC4($pad);
$this->objects[$id]['info']['U'] = $uvalue;
// initialize the arc4 array
break;
case 'out':
$o = &$this->objects[$id];
$res = "\n$id 0 obj\n<<";
$res .= "\n/Filter /Standard";
$res .= "\n/V 1";
$res .= "\n/R 2";
$res .= "\n/O (" . $this->filterText($o['info']['O'], false, false) . ')';
$res .= "\n/U (" . $this->filterText($o['info']['U'], false, false) . ')';
// and the p-value needs to be converted to account for the twos-complement approach
$o['info']['p'] = (($o['info']['p'] ^ 255) + 1) * -1;
$res .= "\n/P " . ($o['info']['p']);
$res .= "\n>>\nendobj";
return $res;
}
return null;
}
/**
* ARC4 functions
* A series of function to implement ARC4 encoding in PHP
*/
/**
* calculate the 16 byte version of the 128 bit md5 digest of the string
*
* @param $string
* @return string
*/
function md5_16($string)
{
$tmp = md5($string);
$out = '';
for ($i = 0; $i <= 30; $i = $i + 2) {
$out .= chr(hexdec(substr($tmp, $i, 2)));
}
return $out;
}
/**
* initialize the encryption for processing a particular object
*
* @param $id
*/
function encryptInit($id)
{
$tmp = $this->encryptionKey;
$hex = dechex($id);
if (mb_strlen($hex, '8bit') < 6) {
$hex = substr('000000', 0, 6 - mb_strlen($hex, '8bit')) . $hex;
}
$tmp .= chr(hexdec(substr($hex, 4, 2)))
. chr(hexdec(substr($hex, 2, 2)))
. chr(hexdec(substr($hex, 0, 2)))
. chr(0)
. chr(0)
;
$key = $this->md5_16($tmp);
$this->ARC4_init(substr($key, 0, 10));
}
/**
* initialize the ARC4 encryption
*
* @param string $key
*/
function ARC4_init($key = '')
{
$this->arc4 = '';
// setup the control array
if (mb_strlen($key, '8bit') == 0) {
return;
}
$k = '';
while (mb_strlen($k, '8bit') < 256) {
$k .= $key;
}
$k = substr($k, 0, 256);
for ($i = 0; $i < 256; $i++) {
$this->arc4 .= chr($i);
}
$j = 0;
for ($i = 0; $i < 256; $i++) {
$t = $this->arc4[$i];
$j = ($j + ord($t) + ord($k[$i])) % 256;
$this->arc4[$i] = $this->arc4[$j];
$this->arc4[$j] = $t;
}
}
/**
* ARC4 encrypt a text string
*
* @param $text
* @return string
*/
function ARC4($text)
{
$len = mb_strlen($text, '8bit');
$a = 0;
$b = 0;
$c = $this->arc4;
$out = '';
for ($i = 0; $i < $len; $i++) {
$a = ($a + 1) % 256;
$t = $c[$a];
$b = ($b + ord($t)) % 256;
$c[$a] = $c[$b];
$c[$b] = $t;
$k = ord($c[(ord($c[$a]) + ord($c[$b])) % 256]);
$out .= chr(ord($text[$i]) ^ $k);
}
return $out;
}
/**
* functions which can be called to adjust or add to the document
*/
/**
* add a link in the document to an external URL
*
* @param $url
* @param $x0
* @param $y0
* @param $x1
* @param $y1
*/
function addLink($url, $x0, $y0, $x1, $y1)
{
$this->numObj++;
$info = array('type' => 'link', 'url' => $url, 'rect' => array($x0, $y0, $x1, $y1));
$this->o_annotation($this->numObj, 'new', $info);
}
/**
* add a link in the document to an internal destination (ie. within the document)
*
* @param $label
* @param $x0
* @param $y0
* @param $x1
* @param $y1
*/
function addInternalLink($label, $x0, $y0, $x1, $y1)
{
$this->numObj++;
$info = array('type' => 'ilink', 'label' => $label, 'rect' => array($x0, $y0, $x1, $y1));
$this->o_annotation($this->numObj, 'new', $info);
}
/**
* set the encryption of the document
* can be used to turn it on and/or set the passwords which it will have.
* also the functions that the user will have are set here, such as print, modify, add
*
* @param string $userPass
* @param string $ownerPass
* @param array $pc
*/
function setEncryption($userPass = '', $ownerPass = '', $pc = array())
{
$p = bindec("11000000");
$options = array('print' => 4, 'modify' => 8, 'copy' => 16, 'add' => 32);
foreach ($pc as $k => $v) {
if ($v && isset($options[$k])) {
$p += $options[$k];
} else {
if (isset($options[$v])) {
$p += $options[$v];
}
}
}
// implement encryption on the document
if ($this->arc4_objnum == 0) {
// then the block does not exist already, add it.
$this->numObj++;
if (mb_strlen($ownerPass) == 0) {
$ownerPass = $userPass;
}
$this->o_encryption($this->numObj, 'new', array('user' => $userPass, 'owner' => $ownerPass, 'p' => $p));
}
}
/**
* should be used for internal checks, not implemented as yet
*/
function checkAllHere()
{
}
/**
* return the pdf stream as a string returned from the function
*
* @param bool $debug
* @return string
*/
function output($debug = false)
{
if ($debug) {
// turn compression off
$this->options['compression'] = false;
}
if ($this->javascript) {
$this->numObj++;
$js_id = $this->numObj;
$this->o_embedjs($js_id, 'new');
$this->o_javascript(++$this->numObj, 'new', $this->javascript);
$id = $this->catalogId;
$this->o_catalog($id, 'javascript', $js_id);
}
if ($this->fileIdentifier === '') {
$tmp = implode('', $this->objects[$this->infoObject]['info']);
$this->fileIdentifier = md5('DOMPDF' . __FILE__ . $tmp . microtime() . mt_rand());
}
if ($this->arc4_objnum) {
$this->o_encryption($this->arc4_objnum, 'keys');
$this->ARC4_init($this->encryptionKey);
}
$this->checkAllHere();
$xref = array();
$content = '%PDF-1.3';
$pos = mb_strlen($content, '8bit');
foreach ($this->objects as $k => $v) {
$tmp = 'o_' . $v['t'];
$cont = $this->$tmp($k, 'out');
$content .= $cont;
$xref[] = $pos + 1; //+1 to account for \n at the start of each object
$pos += mb_strlen($cont, '8bit');
}
$content .= "\nxref\n0 " . (count($xref) + 1) . "\n0000000000 65535 f \n";
foreach ($xref as $p) {
$content .= str_pad($p, 10, "0", STR_PAD_LEFT) . " 00000 n \n";
}
$content .= "trailer\n<<\n" .
'/Size ' . (count($xref) + 1) . "\n" .
'/Root 1 0 R' . "\n" .
'/Info ' . $this->infoObject . " 0 R\n"
;
// if encryption has been applied to this document then add the marker for this dictionary
if ($this->arc4_objnum > 0) {
$content .= '/Encrypt ' . $this->arc4_objnum . " 0 R\n";
}
$content .= '/ID[<' . $this->fileIdentifier . '><' . $this->fileIdentifier . ">]\n";
// account for \n added at start of xref table
$pos++;
$content .= ">>\nstartxref\n$pos\n%%EOF\n";
return $content;
}
/**
* initialize a new document
* if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum
* this function is called automatically by the constructor function
*
* @param array $pageSize
*/
private function newDocument($pageSize = array(0, 0, 612, 792))
{
$this->numObj = 0;
$this->objects = array();
$this->numObj++;
$this->o_catalog($this->numObj, 'new');
$this->numObj++;
$this->o_outlines($this->numObj, 'new');
$this->numObj++;
$this->o_pages($this->numObj, 'new');
$this->o_pages($this->numObj, 'mediaBox', $pageSize);
$this->currentNode = 3;
$this->numObj++;
$this->o_procset($this->numObj, 'new');
$this->numObj++;
$this->o_info($this->numObj, 'new');
$this->numObj++;
$this->o_page($this->numObj, 'new');
// need to store the first page id as there is no way to get it to the user during
// startup
$this->firstPageId = $this->currentContents;
}
/**
* open the font file and return a php structure containing it.
* first check if this one has been done before and saved in a form more suited to php
* note that if a php serialized version does not exist it will try and make one, but will
* require write access to the directory to do it... it is MUCH faster to have these serialized
* files.
*
* @param $font
*/
private function openFont($font)
{
// assume that $font contains the path and file but not the extension
$name = basename($font);
$dir = dirname($font) . '/';
$fontcache = $this->fontcache;
if ($fontcache == '') {
$fontcache = rtrim($dir, DIRECTORY_SEPARATOR."/\\");
}
//$name filename without folder and extension of font metrics
//$dir folder of font metrics
//$fontcache folder of runtime created php serialized version of font metrics.
// If this is not given, the same folder as the font metrics will be used.
// Storing and reusing serialized versions improves speed much
$this->addMessage("openFont: $font - $name");
if (!$this->isUnicode || in_array(mb_strtolower(basename($name)), self::$coreFonts)) {
$metrics_name = "$name.afm";
} else {
$metrics_name = "$name.ufm";
}
$cache_name = "$metrics_name.php";
$this->addMessage("metrics: $metrics_name, cache: $cache_name");
if (file_exists($fontcache . '/' . $cache_name)) {
$this->addMessage("openFont: php file exists $fontcache/$cache_name");
$this->fonts[$font] = require($fontcache . '/' . $cache_name);
if (!isset($this->fonts[$font]['_version_']) || $this->fonts[$font]['_version_'] != $this->fontcacheVersion) {
// if the font file is old, then clear it out and prepare for re-creation
$this->addMessage('openFont: clear out, make way for new version.');
$this->fonts[$font] = null;
unset($this->fonts[$font]);
}
} else {
$old_cache_name = "php_$metrics_name";
if (file_exists($fontcache . '/' . $old_cache_name)) {
$this->addMessage(
"openFont: php file doesn't exist $fontcache/$cache_name, creating it from the old format"
);
$old_cache = file_get_contents($fontcache . '/' . $old_cache_name);
file_put_contents($fontcache . '/' . $cache_name, 'openFont($font);
return;
}
}
if (!isset($this->fonts[$font]) && file_exists($dir . $metrics_name)) {
// then rebuild the php_.afm file from the .afm file
$this->addMessage("openFont: build php file from $dir$metrics_name");
$data = array();
// 20 => 'space'
$data['codeToName'] = array();
// Since we're not going to enable Unicode for the core fonts we need to use a font-based
// setting for Unicode support rather than a global setting.
$data['isUnicode'] = (strtolower(substr($metrics_name, -3)) !== 'afm');
$cidtogid = '';
if ($data['isUnicode']) {
$cidtogid = str_pad('', 256 * 256 * 2, "\x00");
}
$file = file($dir . $metrics_name);
foreach ($file as $rowA) {
$row = trim($rowA);
$pos = strpos($row, ' ');
if ($pos) {
// then there must be some keyword
$key = substr($row, 0, $pos);
switch ($key) {
case 'FontName':
case 'FullName':
case 'FamilyName':
case 'PostScriptName':
case 'Weight':
case 'ItalicAngle':
case 'IsFixedPitch':
case 'CharacterSet':
case 'UnderlinePosition':
case 'UnderlineThickness':
case 'Version':
case 'EncodingScheme':
case 'CapHeight':
case 'XHeight':
case 'Ascender':
case 'Descender':
case 'StdHW':
case 'StdVW':
case 'StartCharMetrics':
case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font. Otherwise it's too big.
$data[$key] = trim(substr($row, $pos));
break;
case 'FontBBox':
$data[$key] = explode(' ', trim(substr($row, $pos)));
break;
//C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;
case 'C': // Found in AFM files
$bits = explode(';', trim($row));
$dtmp = array();
foreach ($bits as $bit) {
$bits2 = explode(' ', trim($bit));
if (mb_strlen($bits2[0], '8bit') == 0) {
continue;
}
if (count($bits2) > 2) {
$dtmp[$bits2[0]] = array();
for ($i = 1; $i < count($bits2); $i++) {
$dtmp[$bits2[0]][] = $bits2[$i];
}
} else {
if (count($bits2) == 2) {
$dtmp[$bits2[0]] = $bits2[1];
}
}
}
$c = (int)$dtmp['C'];
$n = $dtmp['N'];
$width = floatval($dtmp['WX']);
if ($c >= 0) {
if ($c != hexdec($n)) {
$data['codeToName'][$c] = $n;
}
$data['C'][$c] = $width;
} else {
$data['C'][$n] = $width;
}
if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') {
$data['MissingWidth'] = $width;
}
break;
// U 827 ; WX 0 ; N squaresubnosp ; G 675 ;
case 'U': // Found in UFM files
if (!$data['isUnicode']) {
break;
}
$bits = explode(';', trim($row));
$dtmp = array();
foreach ($bits as $bit) {
$bits2 = explode(' ', trim($bit));
if (mb_strlen($bits2[0], '8bit') === 0) {
continue;
}
if (count($bits2) > 2) {
$dtmp[$bits2[0]] = array();
for ($i = 1; $i < count($bits2); $i++) {
$dtmp[$bits2[0]][] = $bits2[$i];
}
} else {
if (count($bits2) == 2) {
$dtmp[$bits2[0]] = $bits2[1];
}
}
}
$c = (int)$dtmp['U'];
$n = $dtmp['N'];
$glyph = $dtmp['G'];
$width = floatval($dtmp['WX']);
if ($c >= 0) {
// Set values in CID to GID map
if ($c >= 0 && $c < 0xFFFF && $glyph) {
$cidtogid[$c * 2] = chr($glyph >> 8);
$cidtogid[$c * 2 + 1] = chr($glyph & 0xFF);
}
if ($c != hexdec($n)) {
$data['codeToName'][$c] = $n;
}
$data['C'][$c] = $width;
} else {
$data['C'][$n] = $width;
}
if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') {
$data['MissingWidth'] = $width;
}
break;
case 'KPX':
break; // don't include them as they are not used yet
//KPX Adieresis yacute -40
/*$bits = explode(' ', trim($row));
$data['KPX'][$bits[1]][$bits[2]] = $bits[3];
break;*/
}
}
}
if ($this->compressionReady && $this->options['compression']) {
// then implement ZLIB based compression on CIDtoGID string
$data['CIDtoGID_Compressed'] = true;
$cidtogid = gzcompress($cidtogid, 6);
}
$data['CIDtoGID'] = base64_encode($cidtogid);
$data['_version_'] = $this->fontcacheVersion;
$this->fonts[$font] = $data;
//Because of potential trouble with php safe mode, expect that the folder already exists.
//If not existing, this will hit performance because of missing cached results.
if (is_dir($fontcache) && is_writable($fontcache)) {
file_put_contents($fontcache . '/' . $cache_name, 'fonts[$font])) {
$this->addMessage("openFont: no font file found for $font. Do you need to run load_font.php?");
}
//pre_r($this->messages);
}
/**
* if the font is not loaded then load it and make the required object
* else just make it the current font
* the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding'
* note that encoding='none' will need to be used for symbolic fonts
* and 'differences' => an array of mappings between numbers 0->255 and character names.
*
* @param $fontName
* @param string $encoding
* @param bool $set
* @return int
*/
function selectFont($fontName, $encoding = '', $set = true)
{
$ext = substr($fontName, -4);
if ($ext === '.afm' || $ext === '.ufm') {
$fontName = substr($fontName, 0, mb_strlen($fontName) - 4);
}
if (!isset($this->fonts[$fontName])) {
$this->addMessage("selectFont: selecting - $fontName - $encoding, $set");
// load the file
$this->openFont($fontName);
if (isset($this->fonts[$fontName])) {
$this->numObj++;
$this->numFonts++;
$font = &$this->fonts[$fontName];
$name = basename($fontName);
$dir = dirname($fontName) . '/';
$options = array('name' => $name, 'fontFileName' => $fontName);
if (is_array($encoding)) {
// then encoding and differences might be set
if (isset($encoding['encoding'])) {
$options['encoding'] = $encoding['encoding'];
}
if (isset($encoding['differences'])) {
$options['differences'] = $encoding['differences'];
}
} else {
if (mb_strlen($encoding, '8bit')) {
// then perhaps only the encoding has been set
$options['encoding'] = $encoding;
}
}
$fontObj = $this->numObj;
$this->o_font($this->numObj, 'new', $options);
$font['fontNum'] = $this->numFonts;
// if this is a '.afm' font, and there is a '.pfa' file to go with it (as there
// should be for all non-basic fonts), then load it into an object and put the
// references into the font object
$basefile = $fontName;
$fbtype = '';
if (file_exists("$basefile.ttf")) {
$fbtype = 'ttf';
} elseif (file_exists("$basefile.TTF")) {
$fbtype = 'TTF';
} elseif (file_exists("$basefile.pfb")) {
$fbtype = 'pfb';
} elseif (file_exists("$basefile.PFB")) {
$fbtype = 'PFB';
}
$fbfile = "$basefile.$fbtype";
// $pfbfile = substr($fontName,0,strlen($fontName)-4).'.pfb';
// $ttffile = substr($fontName,0,strlen($fontName)-4).'.ttf';
$this->addMessage('selectFont: checking for - ' . $fbfile);
// OAR - I don't understand this old check
// if (substr($fontName, -4) === '.afm' && strlen($fbtype)) {
if ($fbtype) {
$adobeFontName = isset($font['PostScriptName']) ? $font['PostScriptName'] : $font['FontName'];
// $fontObj = $this->numObj;
$this->addMessage("selectFont: adding font file - $fbfile - $adobeFontName");
// find the array of font widths, and put that into an object.
$firstChar = -1;
$lastChar = 0;
$widths = array();
$cid_widths = array();
foreach ($font['C'] as $num => $d) {
if (intval($num) > 0 || $num == '0') {
if (!$font['isUnicode']) {
// With Unicode, widths array isn't used
if ($lastChar > 0 && $num > $lastChar + 1) {
for ($i = $lastChar + 1; $i < $num; $i++) {
$widths[] = 0;
}
}
}
$widths[] = $d;
if ($font['isUnicode']) {
$cid_widths[$num] = $d;
}
if ($firstChar == -1) {
$firstChar = $num;
}
$lastChar = $num;
}
}
// also need to adjust the widths for the differences array
if (isset($options['differences'])) {
foreach ($options['differences'] as $charNum => $charName) {
if ($charNum > $lastChar) {
if (!$font['isUnicode']) {
// With Unicode, widths array isn't used
for ($i = $lastChar + 1; $i <= $charNum; $i++) {
$widths[] = 0;
}
}
$lastChar = $charNum;
}
if (isset($font['C'][$charName])) {
$widths[$charNum - $firstChar] = $font['C'][$charName];
if ($font['isUnicode']) {
$cid_widths[$charName] = $font['C'][$charName];
}
}
}
}
if ($font['isUnicode']) {
$font['CIDWidths'] = $cid_widths;
}
$this->addMessage('selectFont: FirstChar = ' . $firstChar);
$this->addMessage('selectFont: LastChar = ' . $lastChar);
$widthid = -1;
if (!$font['isUnicode']) {
// With Unicode, widths array isn't used
$this->numObj++;
$this->o_contents($this->numObj, 'new', 'raw');
$this->objects[$this->numObj]['c'] .= '[' . implode(' ', $widths) . ']';
$widthid = $this->numObj;
}
$missing_width = 500;
$stemV = 70;
if (isset($font['MissingWidth'])) {
$missing_width = $font['MissingWidth'];
}
if (isset($font['StdVW'])) {
$stemV = $font['StdVW'];
} else {
if (isset($font['Weight']) && preg_match('!(bold|black)!i', $font['Weight'])) {
$stemV = 120;
}
}
// load the pfb file, and put that into an object too.
// note that pdf supports only binary format type 1 font files, though there is a
// simple utility to convert them from pfa to pfb.
// FIXME: should we move font subset creation to CPDF::output? See notes in issue #750.
if (!$this->isUnicode || strtolower($fbtype) !== 'ttf' || empty($this->stringSubsets)) {
$data = file_get_contents($fbfile);
} else {
$this->stringSubsets[$fontName][] = 32; // Force space if not in yet
$subset = $this->stringSubsets[$fontName];
sort($subset);
// Load font
$font_obj = Font::load($fbfile);
$font_obj->parse();
// Define subset
$font_obj->setSubset($subset);
$font_obj->reduce();
// Write new font
$tmp_name = $this->tmp . "/" . basename($fbfile) . ".tmp." . uniqid();
$font_obj->open($tmp_name, BinaryStream::modeWrite);
$font_obj->encode(array("OS/2"));
$font_obj->close();
// Parse the new font to get cid2gid and widths
$font_obj = Font::load($tmp_name);
// Find Unicode char map table
$subtable = null;
foreach ($font_obj->getData("cmap", "subtables") as $_subtable) {
if ($_subtable["platformID"] == 0 || $_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1) {
$subtable = $_subtable;
break;
}
}
if ($subtable) {
$glyphIndexArray = $subtable["glyphIndexArray"];
$hmtx = $font_obj->getData("hmtx");
unset($glyphIndexArray[0xFFFF]);
$cidtogid = str_pad('', max(array_keys($glyphIndexArray)) * 2 + 1, "\x00");
$font['CIDWidths'] = array();
foreach ($glyphIndexArray as $cid => $gid) {
if ($cid >= 0 && $cid < 0xFFFF && $gid) {
$cidtogid[$cid * 2] = chr($gid >> 8);
$cidtogid[$cid * 2 + 1] = chr($gid & 0xFF);
}
$width = $font_obj->normalizeFUnit(isset($hmtx[$gid]) ? $hmtx[$gid][0] : $hmtx[0][0]);
$font['CIDWidths'][$cid] = $width;
}
$font['CIDtoGID'] = base64_encode(gzcompress($cidtogid));
$font['CIDtoGID_Compressed'] = true;
$data = file_get_contents($tmp_name);
} else {
$data = file_get_contents($fbfile);
}
$font_obj->close();
unlink($tmp_name);
}
// create the font descriptor
$this->numObj++;
$fontDescriptorId = $this->numObj;
$this->numObj++;
$pfbid = $this->numObj;
// determine flags (more than a little flakey, hopefully will not matter much)
$flags = 0;
if ($font['ItalicAngle'] != 0) {
$flags += pow(2, 6);
}
if ($font['IsFixedPitch'] === 'true') {
$flags += 1;
}
$flags += pow(2, 5); // assume non-sybolic
$list = array(
'Ascent' => 'Ascender',
'CapHeight' => 'Ascender', //FIXME: php-font-lib is not grabbing this value, so we'll fake it and use the Ascender value // 'CapHeight'
'MissingWidth' => 'MissingWidth',
'Descent' => 'Descender',
'FontBBox' => 'FontBBox',
'ItalicAngle' => 'ItalicAngle'
);
$fdopt = array(
'Flags' => $flags,
'FontName' => $adobeFontName,
'StemV' => $stemV
);
foreach ($list as $k => $v) {
if (isset($font[$v])) {
$fdopt[$k] = $font[$v];
}
}
if (strtolower($fbtype) === 'pfb') {
$fdopt['FontFile'] = $pfbid;
} elseif (strtolower($fbtype) === 'ttf') {
$fdopt['FontFile2'] = $pfbid;
}
$this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt);
// embed the font program
$this->o_contents($this->numObj, 'new');
$this->objects[$pfbid]['c'] .= $data;
// determine the cruicial lengths within this file
if (strtolower($fbtype) === 'pfb') {
$l1 = strpos($data, 'eexec') + 6;
$l2 = strpos($data, '00000000') - $l1;
$l3 = mb_strlen($data, '8bit') - $l2 - $l1;
$this->o_contents(
$this->numObj,
'add',
array('Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3)
);
} elseif (strtolower($fbtype) == 'ttf') {
$l1 = mb_strlen($data, '8bit');
$this->o_contents($this->numObj, 'add', array('Length1' => $l1));
}
// tell the font object about all this new stuff
$tmp = array(
'BaseFont' => $adobeFontName,
'MissingWidth' => $missing_width,
'Widths' => $widthid,
'FirstChar' => $firstChar,
'LastChar' => $lastChar,
'FontDescriptor' => $fontDescriptorId
);
if (strtolower($fbtype) === 'ttf') {
$tmp['SubType'] = 'TrueType';
}
$this->addMessage("adding extra info to font.($fontObj)");
foreach ($tmp as $fk => $fv) {
$this->addMessage("$fk : $fv");
}
$this->o_font($fontObj, 'add', $tmp);
} else {
$this->addMessage(
'selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts'
);
}
// also set the differences here, note that this means that these will take effect only the
//first time that a font is selected, else they are ignored
if (isset($options['differences'])) {
$font['differences'] = $options['differences'];
}
}
}
if ($set && isset($this->fonts[$fontName])) {
// so if for some reason the font was not set in the last one then it will not be selected
$this->currentBaseFont = $fontName;
// the next lines mean that if a new font is selected, then the current text state will be
// applied to it as well.
$this->currentFont = $this->currentBaseFont;
$this->currentFontNum = $this->fonts[$this->currentFont]['fontNum'];
//$this->setCurrentFont();
}
return $this->currentFontNum;
//return $this->numObj;
}
/**
* sets up the current font, based on the font families, and the current text state
* note that this system is quite flexible, a bold-italic font can be completely different to a
* italic-bold font, and even bold-bold will have to be defined within the family to have meaning
* This function is to be called whenever the currentTextState is changed, it will update
* the currentFont setting to whatever the appropriate family one is.
* If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont
* This function will change the currentFont to whatever it should be, but will not change the
* currentBaseFont.
*/
private function setCurrentFont()
{
// if (strlen($this->currentBaseFont) == 0){
// // then assume an initial font
// $this->selectFont($this->defaultFont);
// }
// $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1);
// if (strlen($this->currentTextState)
// && isset($this->fontFamilies[$cf])
// && isset($this->fontFamilies[$cf][$this->currentTextState])){
// // then we are in some state or another
// // and this font has a family, and the current setting exists within it
// // select the font, then return it
// $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState];
// $this->selectFont($nf,'',0);
// $this->currentFont = $nf;
// $this->currentFontNum = $this->fonts[$nf]['fontNum'];
// } else {
// // the this font must not have the right family member for the current state
// // simply assume the base font
$this->currentFont = $this->currentBaseFont;
$this->currentFontNum = $this->fonts[$this->currentFont]['fontNum'];
// }
}
/**
* function for the user to find out what the ID is of the first page that was created during
* startup - useful if they wish to add something to it later.
*
* @return int
*/
function getFirstPageId()
{
return $this->firstPageId;
}
/**
* add content to the currently active object
*
* @param $content
*/
private function addContent($content)
{
$this->objects[$this->currentContents]['c'] .= $content;
}
/**
* sets the color for fill operations
*
* @param $color
* @param bool $force
*/
function setColor($color, $force = false)
{
$new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null);
if (!$force && $this->currentColor == $new_color) {
return;
}
if (isset($new_color[3])) {
$this->currentColor = $new_color;
$this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F k", $this->currentColor));
} else {
if (isset($new_color[2])) {
$this->currentColor = $new_color;
$this->addContent(vsprintf("\n%.3F %.3F %.3F rg", $this->currentColor));
}
}
}
/**
* sets the color for fill operations
*
* @param $fillRule
*/
function setFillRule($fillRule)
{
if (!in_array($fillRule, array("nonzero", "evenodd"))) {
return;
}
$this->fillRule = $fillRule;
}
/**
* sets the color for stroke operations
*
* @param $color
* @param bool $force
*/
function setStrokeColor($color, $force = false)
{
$new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null);
if (!$force && $this->currentStrokeColor == $new_color) {
return;
}
if (isset($new_color[3])) {
$this->currentStrokeColor = $new_color;
$this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F K", $this->currentStrokeColor));
} else {
if (isset($new_color[2])) {
$this->currentStrokeColor = $new_color;
$this->addContent(vsprintf("\n%.3F %.3F %.3F RG", $this->currentStrokeColor));
}
}
}
/**
* Set the graphics state for compositions
*
* @param $parameters
*/
function setGraphicsState($parameters)
{
// Create a new graphics state object if necessary
if (($gstate = array_search($parameters, $this->gstates)) === false) {
$this->numObj++;
$this->o_extGState($this->numObj, 'new', $parameters);
$gstate = $this->numStates;
$this->gstates[$gstate] = $parameters;
}
$this->addContent("\n/GS$gstate gs");
}
/**
* Set current blend mode & opacity for lines.
*
* Valid blend modes are:
*
* Normal, Multiply, Screen, Overlay, Darken, Lighten,
* ColorDogde, ColorBurn, HardLight, SoftLight, Difference,
* Exclusion
*
* @param string $mode the blend mode to use
* @param float $opacity 0.0 fully transparent, 1.0 fully opaque
*/
function setLineTransparency($mode, $opacity)
{
static $blend_modes = array(
"Normal",
"Multiply",
"Screen",
"Overlay",
"Darken",
"Lighten",
"ColorDogde",
"ColorBurn",
"HardLight",
"SoftLight",
"Difference",
"Exclusion"
);
if (!in_array($mode, $blend_modes)) {
$mode = "Normal";
}
// Only create a new graphics state if required
if ($mode === $this->currentLineTransparency["mode"] &&
$opacity == $this->currentLineTransparency["opacity"]
) {
return;
}
$this->currentLineTransparency["mode"] = $mode;
$this->currentLineTransparency["opacity"] = $opacity;
$options = array(
"BM" => "/$mode",
"CA" => (float)$opacity
);
$this->setGraphicsState($options);
}
/**
* Set current blend mode & opacity for filled objects.
*
* Valid blend modes are:
*
* Normal, Multiply, Screen, Overlay, Darken, Lighten,
* ColorDogde, ColorBurn, HardLight, SoftLight, Difference,
* Exclusion
*
* @param string $mode the blend mode to use
* @param float $opacity 0.0 fully transparent, 1.0 fully opaque
*/
function setFillTransparency($mode, $opacity)
{
static $blend_modes = array(
"Normal",
"Multiply",
"Screen",
"Overlay",
"Darken",
"Lighten",
"ColorDogde",
"ColorBurn",
"HardLight",
"SoftLight",
"Difference",
"Exclusion"
);
if (!in_array($mode, $blend_modes)) {
$mode = "Normal";
}
if ($mode === $this->currentFillTransparency["mode"] &&
$opacity == $this->currentFillTransparency["opacity"]
) {
return;
}
$this->currentFillTransparency["mode"] = $mode;
$this->currentFillTransparency["opacity"] = $opacity;
$options = array(
"BM" => "/$mode",
"ca" => (float)$opacity,
);
$this->setGraphicsState($options);
}
/**
* draw a line from one set of coordinates to another
*
* @param $x1
* @param $y1
* @param $x2
* @param $y2
* @param bool $stroke
*/
function line($x1, $y1, $x2, $y2, $stroke = true)
{
$this->addContent(sprintf("\n%.3F %.3F m %.3F %.3F l", $x1, $y1, $x2, $y2));
if ($stroke) {
$this->addContent(' S');
}
}
/**
* draw a bezier curve based on 4 control points
*
* @param $x0
* @param $y0
* @param $x1
* @param $y1
* @param $x2
* @param $y2
* @param $x3
* @param $y3
*/
function curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3)
{
// in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points
// as the control points for the curve.
$this->addContent(
sprintf("\n%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c S", $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3)
);
}
/**
* draw a part of an ellipse
*
* @param $x0
* @param $y0
* @param $astart
* @param $afinish
* @param $r1
* @param int $r2
* @param int $angle
* @param int $nSeg
*/
function partEllipse($x0, $y0, $astart, $afinish, $r1, $r2 = 0, $angle = 0, $nSeg = 8)
{
$this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, false);
}
/**
* draw a filled ellipse
*
* @param $x0
* @param $y0
* @param $r1
* @param int $r2
* @param int $angle
* @param int $nSeg
* @param int $astart
* @param int $afinish
*/
function filledEllipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360)
{
$this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, true, true);
}
/**
* @param $x
* @param $y
*/
function lineTo($x, $y)
{
$this->addContent(sprintf("\n%.3F %.3F l", $x, $y));
}
/**
* @param $x
* @param $y
*/
function moveTo($x, $y)
{
$this->addContent(sprintf("\n%.3F %.3F m", $x, $y));
}
/**
* draw a bezier curve based on 4 control points
*
* @param $x1
* @param $y1
* @param $x2
* @param $y2
* @param $x3
* @param $y3
*/
function curveTo($x1, $y1, $x2, $y2, $x3, $y3)
{
$this->addContent(sprintf("\n%.3F %.3F %.3F %.3F %.3F %.3F c", $x1, $y1, $x2, $y2, $x3, $y3));
}
/**
* draw a bezier curve based on 4 control points
*/ function quadTo($cpx, $cpy, $x, $y)
{
$this->addContent(sprintf("\n%.3F %.3F %.3F %.3F v", $cpx, $cpy, $x, $y));
}
function closePath()
{
$this->addContent(' h');
}
function endPath()
{
$this->addContent(' n');
}
/**
* draw an ellipse
* note that the part and filled ellipse are just special cases of this function
*
* draws an ellipse in the current line style
* centered at $x0,$y0, radii $r1,$r2
* if $r2 is not set, then a circle is drawn
* from $astart to $afinish, measured in degrees, running anti-clockwise from the right hand side of the ellipse.
* nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a
* pretty crappy shape at 2, as we are approximating with bezier curves.
*
* @param $x0
* @param $y0
* @param $r1
* @param int $r2
* @param int $angle
* @param int $nSeg
* @param int $astart
* @param int $afinish
* @param bool $close
* @param bool $fill
* @param bool $stroke
* @param bool $incomplete
*/
function ellipse(
$x0,
$y0,
$r1,
$r2 = 0,
$angle = 0,
$nSeg = 8,
$astart = 0,
$afinish = 360,
$close = true,
$fill = false,
$stroke = true,
$incomplete = false
) {
if ($r1 == 0) {
return;
}
if ($r2 == 0) {
$r2 = $r1;
}
if ($nSeg < 2) {
$nSeg = 2;
}
$astart = deg2rad((float)$astart);
$afinish = deg2rad((float)$afinish);
$totalAngle = $afinish - $astart;
$dt = $totalAngle / $nSeg;
$dtm = $dt / 3;
if ($angle != 0) {
$a = -1 * deg2rad((float)$angle);
$this->addContent(
sprintf("\n q %.3F %.3F %.3F %.3F %.3F %.3F cm", cos($a), -sin($a), sin($a), cos($a), $x0, $y0)
);
$x0 = 0;
$y0 = 0;
}
$t1 = $astart;
$a0 = $x0 + $r1 * cos($t1);
$b0 = $y0 + $r2 * sin($t1);
$c0 = -$r1 * sin($t1);
$d0 = $r2 * cos($t1);
if (!$incomplete) {
$this->addContent(sprintf("\n%.3F %.3F m ", $a0, $b0));
}
for ($i = 1; $i <= $nSeg; $i++) {
// draw this bit of the total curve
$t1 = $i * $dt + $astart;
$a1 = $x0 + $r1 * cos($t1);
$b1 = $y0 + $r2 * sin($t1);
$c1 = -$r1 * sin($t1);
$d1 = $r2 * cos($t1);
$this->addContent(
sprintf(
"\n%.3F %.3F %.3F %.3F %.3F %.3F c",
($a0 + $c0 * $dtm),
($b0 + $d0 * $dtm),
($a1 - $c1 * $dtm),
($b1 - $d1 * $dtm),
$a1,
$b1
)
);
$a0 = $a1;
$b0 = $b1;
$c0 = $c1;
$d0 = $d1;
}
if (!$incomplete) {
if ($fill) {
$this->addContent(' f');
}
if ($stroke) {
if ($close) {
$this->addContent(' s'); // small 's' signifies closing the path as well
} else {
$this->addContent(' S');
}
}
}
if ($angle != 0) {
$this->addContent(' Q');
}
}
/**
* this sets the line drawing style.
* width, is the thickness of the line in user units
* cap is the type of cap to put on the line, values can be 'butt','round','square'
* where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the
* end of the line.
* join can be 'miter', 'round', 'bevel'
* dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the
* on and off dashes.
* (2) represents 2 on, 2 off, 2 on , 2 off ...
* (2,1) is 2 on, 1 off, 2 on, 1 off.. etc
* phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts.
*
* @param int $width
* @param string $cap
* @param string $join
* @param string $dash
* @param int $phase
*/
function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0)
{
// this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day
$string = '';
if ($width > 0) {
$string .= "$width w";
}
$ca = array('butt' => 0, 'round' => 1, 'square' => 2);
if (isset($ca[$cap])) {
$string .= " $ca[$cap] J";
}
$ja = array('miter' => 0, 'round' => 1, 'bevel' => 2);
if (isset($ja[$join])) {
$string .= " $ja[$join] j";
}
if (is_array($dash)) {
$string .= ' [ ' . implode(' ', $dash) . " ] $phase d";
}
$this->currentLineStyle = $string;
$this->addContent("\n$string");
}
/**
* draw a polygon, the syntax for this is similar to the GD polygon command
*
* @param $p
* @param $np
* @param bool $f
*/
function polygon($p, $np, $f = false)
{
$this->addContent(sprintf("\n%.3F %.3F m ", $p[0], $p[1]));
for ($i = 2; $i < $np * 2; $i = $i + 2) {
$this->addContent(sprintf("%.3F %.3F l ", $p[$i], $p[$i + 1]));
}
if ($f) {
$this->addContent(' f');
} else {
$this->addContent(' S');
}
}
/**
* a filled rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not
* the coordinates of the upper-right corner
*
* @param $x1
* @param $y1
* @param $width
* @param $height
*/
function filledRectangle($x1, $y1, $width, $height)
{
$this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re f", $x1, $y1, $width, $height));
}
/**
* draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not
* the coordinates of the upper-right corner
*
* @param $x1
* @param $y1
* @param $width
* @param $height
*/
function rectangle($x1, $y1, $width, $height)
{
$this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re S", $x1, $y1, $width, $height));
}
/**
* draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not
* the coordinates of the upper-right corner
*
* @param $x1
* @param $y1
* @param $width
* @param $height
*/
function rect($x1, $y1, $width, $height)
{
$this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re", $x1, $y1, $width, $height));
}
function stroke()
{
$this->addContent("\nS");
}
function fill()
{
$this->addContent("\nf" . ($this->fillRule === "evenodd" ? "*" : ""));
}
function fillStroke()
{
$this->addContent("\nb" . ($this->fillRule === "evenodd" ? "*" : ""));
}
/**
* save the current graphic state
*/
function save()
{
// we must reset the color cache or it will keep bad colors after clipping
$this->currentColor = null;
$this->currentStrokeColor = null;
$this->addContent("\nq");
}
/**
* restore the last graphic state
*/
function restore()
{
// we must reset the color cache or it will keep bad colors after clipping
$this->currentColor = null;
$this->currentStrokeColor = null;
$this->addContent("\nQ");
}
/**
* draw a clipping rectangle, all the elements added after this will be clipped
*
* @param $x1
* @param $y1
* @param $width
* @param $height
*/
function clippingRectangle($x1, $y1, $width, $height)
{
$this->save();
$this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re W n", $x1, $y1, $width, $height));
}
/**
* draw a clipping rounded rectangle, all the elements added after this will be clipped
*
* @param $x1
* @param $y1
* @param $w
* @param $h
* @param $rTL
* @param $rTR
* @param $rBR
* @param $rBL
*/
function clippingRectangleRounded($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL)
{
$this->save();
// start: top edge, left end
$this->addContent(sprintf("\n%.3F %.3F m ", $x1, $y1 - $rTL + $h));
// line: bottom edge, left end
$this->addContent(sprintf("\n%.3F %.3F l ", $x1, $y1 + $rBL));
// curve: bottom-left corner
$this->ellipse($x1 + $rBL, $y1 + $rBL, $rBL, 0, 0, 8, 180, 270, false, false, false, true);
// line: right edge, bottom end
$this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w - $rBR, $y1));
// curve: bottom-right corner
$this->ellipse($x1 + $w - $rBR, $y1 + $rBR, $rBR, 0, 0, 8, 270, 360, false, false, false, true);
// line: right edge, top end
$this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w, $y1 + $h - $rTR));
// curve: bottom-right corner
$this->ellipse($x1 + $w - $rTR, $y1 + $h - $rTR, $rTR, 0, 0, 8, 0, 90, false, false, false, true);
// line: bottom edge, right end
$this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rTL, $y1 + $h));
// curve: top-right corner
$this->ellipse($x1 + $rTL, $y1 + $h - $rTL, $rTL, 0, 0, 8, 90, 180, false, false, false, true);
// line: top edge, left end
$this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rBL, $y1));
// Close & clip
$this->addContent(" W n");
}
/**
* ends the last clipping shape
*/
function clippingEnd()
{
$this->restore();
}
/**
* scale
*
* @param float $s_x scaling factor for width as percent
* @param float $s_y scaling factor for height as percent
* @param float $x Origin abscissa
* @param float $y Origin ordinate
*/
function scale($s_x, $s_y, $x, $y)
{
$y = $this->currentPageSize["height"] - $y;
$tm = array(
$s_x,
0,
0,
$s_y,
$x * (1 - $s_x),
$y * (1 - $s_y)
);
$this->transform($tm);
}
/**
* translate
*
* @param float $t_x movement to the right
* @param float $t_y movement to the bottom
*/
function translate($t_x, $t_y)
{
$tm = array(
1,
0,
0,
1,
$t_x,
-$t_y
);
$this->transform($tm);
}
/**
* rotate
*
* @param float $angle angle in degrees for counter-clockwise rotation
* @param float $x Origin abscissa
* @param float $y Origin ordinate
*/
function rotate($angle, $x, $y)
{
$y = $this->currentPageSize["height"] - $y;
$a = deg2rad($angle);
$cos_a = cos($a);
$sin_a = sin($a);
$tm = array(
$cos_a,
-$sin_a,
$sin_a,
$cos_a,
$x - $sin_a * $y - $cos_a * $x,
$y - $cos_a * $y + $sin_a * $x,
);
$this->transform($tm);
}
/**
* skew
*
* @param float $angle_x
* @param float $angle_y
* @param float $x Origin abscissa
* @param float $y Origin ordinate
*/
function skew($angle_x, $angle_y, $x, $y)
{
$y = $this->currentPageSize["height"] - $y;
$tan_x = tan(deg2rad($angle_x));
$tan_y = tan(deg2rad($angle_y));
$tm = array(
1,
-$tan_y,
-$tan_x,
1,
$tan_x * $y,
$tan_y * $x,
);
$this->transform($tm);
}
/**
* apply graphic transformations
*
* @param array $tm transformation matrix
*/
function transform($tm)
{
$this->addContent(vsprintf("\n %.3F %.3F %.3F %.3F %.3F %.3F cm", $tm));
}
/**
* add a new page to the document
* this also makes the new page the current active object
*
* @param int $insert
* @param int $id
* @param string $pos
* @return int
*/
function newPage($insert = 0, $id = 0, $pos = 'after')
{
// if there is a state saved, then go up the stack closing them
// then on the new page, re-open them with the right setings
if ($this->nStateStack) {
for ($i = $this->nStateStack; $i >= 1; $i--) {
$this->restoreState($i);
}
}
$this->numObj++;
if ($insert) {
// the id from the ezPdf class is the id of the contents of the page, not the page object itself
// query that object to find the parent
$rid = $this->objects[$id]['onPage'];
$opt = array('rid' => $rid, 'pos' => $pos);
$this->o_page($this->numObj, 'new', $opt);
} else {
$this->o_page($this->numObj, 'new');
}
// if there is a stack saved, then put that onto the page
if ($this->nStateStack) {
for ($i = 1; $i <= $this->nStateStack; $i++) {
$this->saveState($i);
}
}
// and if there has been a stroke or fill color set, then transfer them
if (isset($this->currentColor)) {
$this->setColor($this->currentColor, true);
}
if (isset($this->currentStrokeColor)) {
$this->setStrokeColor($this->currentStrokeColor, true);
}
// if there is a line style set, then put this in too
if (mb_strlen($this->currentLineStyle, '8bit')) {
$this->addContent("\n$this->currentLineStyle");
}
// the call to the o_page object set currentContents to the present page, so this can be returned as the page id
return $this->currentContents;
}
/**
* Streams the PDF to the client.
*
* @param string $filename The filename to present to the client.
* @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1).
*/
function stream($filename = "document.pdf", $options = array())
{
if (headers_sent()) {
die("Unable to stream pdf: headers already sent");
}
if (!isset($options["compress"])) $options["compress"] = true;
if (!isset($options["Attachment"])) $options["Attachment"] = true;
$debug = !$options['compress'];
$tmp = ltrim($this->output($debug));
header("Cache-Control: private");
header("Content-Type: application/pdf");
header("Content-Length: " . mb_strlen($tmp, "8bit"));
$filename = str_replace(array("\n", "'"), "", basename($filename, ".pdf")) . ".pdf";
$attachment = $options["Attachment"] ? "attachment" : "inline";
$encoding = mb_detect_encoding($filename);
$fallbackfilename = mb_convert_encoding($filename, "ISO-8859-1", $encoding);
$fallbackfilename = str_replace("\"", "", $fallbackfilename);
$encodedfilename = rawurlencode($filename);
$contentDisposition = "Content-Disposition: $attachment; filename=\"$fallbackfilename\"";
if ($fallbackfilename !== $filename) {
$contentDisposition .= "; filename*=UTF-8''$encodedfilename";
}
header($contentDisposition);
echo $tmp;
flush();
}
/**
* return the height in units of the current font in the given size
*
* @param $size
* @return float|int
*/
function getFontHeight($size)
{
if (!$this->numFonts) {
$this->selectFont($this->defaultFont);
}
$font = $this->fonts[$this->currentFont];
// for the current font, and the given size, what is the height of the font in user units
if (isset($font['Ascender']) && isset($font['Descender'])) {
$h = $font['Ascender'] - $font['Descender'];
} else {
$h = $font['FontBBox'][3] - $font['FontBBox'][1];
}
// have to adjust by a font offset for Windows fonts. unfortunately it looks like
// the bounding box calculations are wrong and I don't know why.
if (isset($font['FontHeightOffset'])) {
// For CourierNew from Windows this needs to be -646 to match the
// Adobe native Courier font.
//
// For FreeMono from GNU this needs to be -337 to match the
// Courier font.
//
// Both have been added manually to the .afm and .ufm files.
$h += (int)$font['FontHeightOffset'];
}
return $size * $h / 1000;
}
/**
* @param $size
* @return float|int
*/
function getFontXHeight($size)
{
if (!$this->numFonts) {
$this->selectFont($this->defaultFont);
}
$font = $this->fonts[$this->currentFont];
// for the current font, and the given size, what is the height of the font in user units
if (isset($font['XHeight'])) {
$xh = $font['Ascender'] - $font['Descender'];
} else {
$xh = $this->getFontHeight($size) / 2;
}
return $size * $xh / 1000;
}
/**
* return the font descender, this will normally return a negative number
* if you add this number to the baseline, you get the level of the bottom of the font
* it is in the pdf user units
*
* @param $size
* @return float|int
*/
function getFontDescender($size)
{
// note that this will most likely return a negative value
if (!$this->numFonts) {
$this->selectFont($this->defaultFont);
}
//$h = $this->fonts[$this->currentFont]['FontBBox'][1];
$h = $this->fonts[$this->currentFont]['Descender'];
return $size * $h / 1000;
}
/**
* filter the text, this is applied to all text just before being inserted into the pdf document
* it escapes the various things that need to be escaped, and so on
*
* @access private
*
* @param $text
* @param bool $bom
* @param bool $convert_encoding
* @return string
*/
function filterText($text, $bom = true, $convert_encoding = true)
{
if (!$this->numFonts) {
$this->selectFont($this->defaultFont);
}
if ($convert_encoding) {
$cf = $this->currentFont;
if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) {
$text = $this->utf8toUtf16BE($text, $bom);
} else {
//$text = html_entity_decode($text, ENT_QUOTES);
$text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8');
}
} else if ($bom) {
$text = $this->utf8toUtf16BE($text, $bom);
}
// the chr(13) substitution fixes a bug seen in TCPDF (bug #1421290)
return strtr($text, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r'));
}
/**
* return array containing codepoints (UTF-8 character values) for the
* string passed in.
*
* based on the excellent TCPDF code by Nicola Asuni and the
* RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html
*
* @access private
* @author Orion Richardson
* @since January 5, 2008
*
* @param string $text UTF-8 string to process
*
* @return array UTF-8 codepoints array for the string
*/
function utf8toCodePointsArray(&$text)
{
$length = mb_strlen($text, '8bit'); // http://www.php.net/manual/en/function.mb-strlen.php#77040
$unicode = array(); // array containing unicode values
$bytes = array(); // array containing single character byte sequences
$numbytes = 1; // number of octets needed to represent the UTF-8 character
for ($i = 0; $i < $length; $i++) {
$c = ord($text[$i]); // get one string character at time
if (count($bytes) === 0) { // get starting octect
if ($c <= 0x7F) {
$unicode[] = $c; // use the character "as is" because is ASCII
$numbytes = 1;
} elseif (($c >> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN)
$bytes[] = ($c - 0xC0) << 0x06;
$numbytes = 2;
} elseif (($c >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN)
$bytes[] = ($c - 0xE0) << 0x0C;
$numbytes = 3;
} elseif (($c >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN)
$bytes[] = ($c - 0xF0) << 0x12;
$numbytes = 4;
} else {
// use replacement character for other invalid sequences
$unicode[] = 0xFFFD;
$bytes = array();
$numbytes = 1;
}
} elseif (($c >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN
$bytes[] = $c - 0x80;
if (count($bytes) === $numbytes) {
// compose UTF-8 bytes to a single unicode value
$c = $bytes[0];
for ($j = 1; $j < $numbytes; $j++) {
$c += ($bytes[$j] << (($numbytes - $j - 1) * 0x06));
}
if ((($c >= 0xD800) AND ($c <= 0xDFFF)) OR ($c >= 0x10FFFF)) {
// The definition of UTF-8 prohibits encoding character numbers between
// U+D800 and U+DFFF, which are reserved for use with the UTF-16
// encoding form (as surrogate pairs) and do not directly represent
// characters.
$unicode[] = 0xFFFD; // use replacement character
} else {
$unicode[] = $c; // add char to array
}
// reset data for next char
$bytes = array();
$numbytes = 1;
}
} else {
// use replacement character for other invalid sequences
$unicode[] = 0xFFFD;
$bytes = array();
$numbytes = 1;
}
}
return $unicode;
}
/**
* convert UTF-8 to UTF-16 with an additional byte order marker
* at the front if required.
*
* based on the excellent TCPDF code by Nicola Asuni and the
* RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html
*
* @access private
* @author Orion Richardson
* @since January 5, 2008
*
* @param string $text UTF-8 string to process
* @param boolean $bom whether to add the byte order marker
*
* @return string UTF-16 result string
*/
function utf8toUtf16BE(&$text, $bom = true)
{
$out = $bom ? "\xFE\xFF" : '';
$unicode = $this->utf8toCodePointsArray($text);
foreach ($unicode as $c) {
if ($c === 0xFFFD) {
$out .= "\xFF\xFD"; // replacement character
} elseif ($c < 0x10000) {
$out .= chr($c >> 0x08) . chr($c & 0xFF);
} else {
$c -= 0x10000;
$w1 = 0xD800 | ($c >> 0x10);
$w2 = 0xDC00 | ($c & 0x3FF);
$out .= chr($w1 >> 0x08) . chr($w1 & 0xFF) . chr($w2 >> 0x08) . chr($w2 & 0xFF);
}
}
return $out;
}
/**
* given a start position and information about how text is to be laid out, calculate where
* on the page the text will end
*
* @param $x
* @param $y
* @param $angle
* @param $size
* @param $wa
* @param $text
* @return array
*/
private function getTextPosition($x, $y, $angle, $size, $wa, $text)
{
// given this information return an array containing x and y for the end position as elements 0 and 1
$w = $this->getTextWidth($size, $text);
// need to adjust for the number of spaces in this text
$words = explode(' ', $text);
$nspaces = count($words) - 1;
$w += $wa * $nspaces;
$a = deg2rad((float)$angle);
return array(cos($a) * $w + $x, -sin($a) * $w + $y);
}
/**
* Callback method used by smallCaps
*
* @param array $matches
*
* @return string
*/
function toUpper($matches)
{
return mb_strtoupper($matches[0]);
}
function concatMatches($matches)
{
$str = "";
foreach ($matches as $match) {
$str .= $match[0];
}
return $str;
}
/**
* register text for font subsetting
*
* @param $font
* @param $text
*/
function registerText($font, $text)
{
if (!$this->isUnicode || in_array(mb_strtolower(basename($font)), self::$coreFonts)) {
return;
}
if (!isset($this->stringSubsets[$font])) {
$this->stringSubsets[$font] = array();
}
$this->stringSubsets[$font] = array_unique(
array_merge($this->stringSubsets[$font], $this->utf8toCodePointsArray($text))
);
}
/**
* add text to the document, at a specified location, size and angle on the page
*
* @param $x
* @param $y
* @param $size
* @param $text
* @param int $angle
* @param int $wordSpaceAdjust
* @param int $charSpaceAdjust
* @param bool $smallCaps
*/
function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false)
{
if (!$this->numFonts) {
$this->selectFont($this->defaultFont);
}
$text = str_replace(array("\r", "\n"), "", $text);
if ($smallCaps) {
preg_match_all("/(\P{Ll}+)/u", $text, $matches, PREG_SET_ORDER);
$lower = $this->concatMatches($matches);
d($lower);
preg_match_all("/(\p{Ll}+)/u", $text, $matches, PREG_SET_ORDER);
$other = $this->concatMatches($matches);
d($other);
//$text = preg_replace_callback("/\p{Ll}/u", array($this, "toUpper"), $text);
}
// if there are any open callbacks, then they should be called, to show the start of the line
if ($this->nCallback > 0) {
for ($i = $this->nCallback; $i > 0; $i--) {
// call each function
$info = array(
'x' => $x,
'y' => $y,
'angle' => $angle,
'status' => 'sol',
'p' => $this->callback[$i]['p'],
'nCallback' => $this->callback[$i]['nCallback'],
'height' => $this->callback[$i]['height'],
'descender' => $this->callback[$i]['descender']
);
$func = $this->callback[$i]['f'];
$this->$func($info);
}
}
if ($angle == 0) {
$this->addContent(sprintf("\nBT %.3F %.3F Td", $x, $y));
} else {
$a = deg2rad((float)$angle);
$this->addContent(
sprintf("\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm", cos($a), -sin($a), sin($a), cos($a), $x, $y)
);
}
if ($wordSpaceAdjust != 0) {
$this->addContent(sprintf(" %.3F Tw", $wordSpaceAdjust));
}
if ($charSpaceAdjust != 0) {
$this->addContent(sprintf(" %.3F Tc", $charSpaceAdjust));
}
$len = mb_strlen($text);
$start = 0;
if ($start < $len) {
$part = $text; // OAR - Don't need this anymore, given that $start always equals zero. substr($text, $start);
$place_text = $this->filterText($part, false);
// modify unicode text so that extra word spacing is manually implemented (bug #)
$cf = $this->currentFont;
if ($this->fonts[$cf]['isUnicode'] && $wordSpaceAdjust != 0) {
$space_scale = 1000 / $size;
$place_text = str_replace("\x00\x20", "\x00\x20)\x00\x20" . (-round($space_scale * $wordSpaceAdjust)) . "\x00\x20(", $place_text);
}
$this->addContent(" /F$this->currentFontNum " . sprintf('%.1F Tf ', $size));
$this->addContent(" [($place_text)] TJ");
}
if ($wordSpaceAdjust != 0) {
$this->addContent(sprintf(" %.3F Tw", 0));
}
if ($charSpaceAdjust != 0) {
$this->addContent(sprintf(" %.3F Tc", 0));
}
$this->addContent(' ET');
// if there are any open callbacks, then they should be called, to show the end of the line
if ($this->nCallback > 0) {
for ($i = $this->nCallback; $i > 0; $i--) {
// call each function
$tmp = $this->getTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text);
$info = array(
'x' => $tmp[0],
'y' => $tmp[1],
'angle' => $angle,
'status' => 'eol',
'p' => $this->callback[$i]['p'],
'nCallback' => $this->callback[$i]['nCallback'],
'height' => $this->callback[$i]['height'],
'descender' => $this->callback[$i]['descender']
);
$func = $this->callback[$i]['f'];
$this->$func($info);
}
}
}
/**
* calculate how wide a given text string will be on a page, at a given size.
* this can be called externally, but is also used by the other class functions
*
* @param $size
* @param $text
* @param int $word_spacing
* @param int $char_spacing
* @return float|int
*/
function getTextWidth($size, $text, $word_spacing = 0, $char_spacing = 0)
{
static $ord_cache = array();
// this function should not change any of the settings, though it will need to
// track any directives which change during calculation, so copy them at the start
// and put them back at the end.
$store_currentTextState = $this->currentTextState;
if (!$this->numFonts) {
$this->selectFont($this->defaultFont);
}
$text = str_replace(array("\r", "\n"), "", $text);
// converts a number or a float to a string so it can get the width
$text = "$text";
// hmm, this is where it all starts to get tricky - use the font information to
// calculate the width of each character, add them up and convert to user units
$w = 0;
$cf = $this->currentFont;
$current_font = $this->fonts[$cf];
$space_scale = 1000 / ($size > 0 ? $size : 1);
$n_spaces = 0;
if ($current_font['isUnicode']) {
// for Unicode, use the code points array to calculate width rather
// than just the string itself
$unicode = $this->utf8toCodePointsArray($text);
foreach ($unicode as $char) {
// check if we have to replace character
if (isset($current_font['differences'][$char])) {
$char = $current_font['differences'][$char];
}
if (isset($current_font['C'][$char])) {
$char_width = $current_font['C'][$char];
// add the character width
$w += $char_width;
// add additional padding for space
if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space
$w += $word_spacing * $space_scale;
$n_spaces++;
}
}
}
// add additional char spacing
if ($char_spacing != 0) {
$w += $char_spacing * $space_scale * (count($unicode) + $n_spaces);
}
} else {
// If CPDF is in Unicode mode but the current font does not support Unicode we need to convert the character set to Windows-1252
if ($this->isUnicode) {
$text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8');
}
$len = mb_strlen($text, 'Windows-1252');
for ($i = 0; $i < $len; $i++) {
$c = $text[$i];
$char = isset($ord_cache[$c]) ? $ord_cache[$c] : ($ord_cache[$c] = ord($c));
// check if we have to replace character
if (isset($current_font['differences'][$char])) {
$char = $current_font['differences'][$char];
}
if (isset($current_font['C'][$char])) {
$char_width = $current_font['C'][$char];
// add the character width
$w += $char_width;
// add additional padding for space
if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space
$w += $word_spacing * $space_scale;
$n_spaces++;
}
}
}
// add additional char spacing
if ($char_spacing != 0) {
$w += $char_spacing * $space_scale * ($len + $n_spaces);
}
}
$this->currentTextState = $store_currentTextState;
$this->setCurrentFont();
return $w * $size / 1000;
}
/**
* this will be called at a new page to return the state to what it was on the
* end of the previous page, before the stack was closed down
* This is to get around not being able to have open 'q' across pages
*
* @param int $pageEnd
*/
function saveState($pageEnd = 0)
{
if ($pageEnd) {
// this will be called at a new page to return the state to what it was on the
// end of the previous page, before the stack was closed down
// This is to get around not being able to have open 'q' across pages
$opt = $this->stateStack[$pageEnd];
// ok to use this as stack starts numbering at 1
$this->setColor($opt['col'], true);
$this->setStrokeColor($opt['str'], true);
$this->addContent("\n" . $opt['lin']);
// $this->currentLineStyle = $opt['lin'];
} else {
$this->nStateStack++;
$this->stateStack[$this->nStateStack] = array(
'col' => $this->currentColor,
'str' => $this->currentStrokeColor,
'lin' => $this->currentLineStyle
);
}
$this->save();
}
/**
* restore a previously saved state
*
* @param int $pageEnd
*/
function restoreState($pageEnd = 0)
{
if (!$pageEnd) {
$n = $this->nStateStack;
$this->currentColor = $this->stateStack[$n]['col'];
$this->currentStrokeColor = $this->stateStack[$n]['str'];
$this->addContent("\n" . $this->stateStack[$n]['lin']);
$this->currentLineStyle = $this->stateStack[$n]['lin'];
$this->stateStack[$n] = null;
unset($this->stateStack[$n]);
$this->nStateStack--;
}
$this->restore();
}
/**
* make a loose object, the output will go into this object, until it is closed, then will revert to
* the current one.
* this object will not appear until it is included within a page.
* the function will return the object number
*
* @return int
*/
function openObject()
{
$this->nStack++;
$this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage);
// add a new object of the content type, to hold the data flow
$this->numObj++;
$this->o_contents($this->numObj, 'new');
$this->currentContents = $this->numObj;
$this->looseObjects[$this->numObj] = 1;
return $this->numObj;
}
/**
* open an existing object for editing
*
* @param $id
*/
function reopenObject($id)
{
$this->nStack++;
$this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage);
$this->currentContents = $id;
// also if this object is the primary contents for a page, then set the current page to its parent
if (isset($this->objects[$id]['onPage'])) {
$this->currentPage = $this->objects[$id]['onPage'];
}
}
/**
* close an object
*/
function closeObject()
{
// close the object, as long as there was one open in the first place, which will be indicated by
// an objectId on the stack.
if ($this->nStack > 0) {
$this->currentContents = $this->stack[$this->nStack]['c'];
$this->currentPage = $this->stack[$this->nStack]['p'];
$this->nStack--;
// easier to probably not worry about removing the old entries, they will be overwritten
// if there are new ones.
}
}
/**
* stop an object from appearing on pages from this point on
*
* @param $id
*/
function stopObject($id)
{
// if an object has been appearing on pages up to now, then stop it, this page will
// be the last one that could contain it.
if (isset($this->addLooseObjects[$id])) {
$this->addLooseObjects[$id] = '';
}
}
/**
* after an object has been created, it wil only show if it has been added, using this function.
*
* @param $id
* @param string $options
*/
function addObject($id, $options = 'add')
{
// add the specified object to the page
if (isset($this->looseObjects[$id]) && $this->currentContents != $id) {
// then it is a valid object, and it is not being added to itself
switch ($options) {
case 'all':
// then this object is to be added to this page (done in the next block) and
// all future new pages.
$this->addLooseObjects[$id] = 'all';
case 'add':
if (isset($this->objects[$this->currentContents]['onPage'])) {
// then the destination contents is the primary for the page
// (though this object is actually added to that page)
$this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id);
}
break;
case 'even':
$this->addLooseObjects[$id] = 'even';
$pageObjectId = $this->objects[$this->currentContents]['onPage'];
if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 0) {
$this->addObject($id);
// hacky huh :)
}
break;
case 'odd':
$this->addLooseObjects[$id] = 'odd';
$pageObjectId = $this->objects[$this->currentContents]['onPage'];
if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 1) {
$this->addObject($id);
// hacky huh :)
}
break;
case 'next':
$this->addLooseObjects[$id] = 'all';
break;
case 'nexteven':
$this->addLooseObjects[$id] = 'even';
break;
case 'nextodd':
$this->addLooseObjects[$id] = 'odd';
break;
}
}
}
/**
* return a storable representation of a specific object
*
* @param $id
* @return string|null
*/
function serializeObject($id)
{
if (array_key_exists($id, $this->objects)) {
return serialize($this->objects[$id]);
}
return null;
}
/**
* restore an object from its stored representation. returns its new object id.
*
* @param $obj
* @return int
*/
function restoreSerializedObject($obj)
{
$obj_id = $this->openObject();
$this->objects[$obj_id] = unserialize($obj);
$this->closeObject();
return $obj_id;
}
/**
* add content to the documents info object
*
* @param $label
* @param int $value
*/
function addInfo($label, $value = 0)
{
// this will only work if the label is one of the valid ones.
// modify this so that arrays can be passed as well.
// if $label is an array then assume that it is key => value pairs
// else assume that they are both scalar, anything else will probably error
if (is_array($label)) {
foreach ($label as $l => $v) {
$this->o_info($this->infoObject, $l, $v);
}
} else {
$this->o_info($this->infoObject, $label, $value);
}
}
/**
* set the viewer preferences of the document, it is up to the browser to obey these.
*
* @param $label
* @param int $value
*/
function setPreferences($label, $value = 0)
{
// this will only work if the label is one of the valid ones.
if (is_array($label)) {
foreach ($label as $l => $v) {
$this->o_catalog($this->catalogId, 'viewerPreferences', array($l => $v));
}
} else {
$this->o_catalog($this->catalogId, 'viewerPreferences', array($label => $value));
}
}
/**
* extract an integer from a position in a byte stream
*
* @param $data
* @param $pos
* @param $num
* @return int
*/
private function getBytes(&$data, $pos, $num)
{
// return the integer represented by $num bytes from $pos within $data
$ret = 0;
for ($i = 0; $i < $num; $i++) {
$ret *= 256;
$ret += ord($data[$pos + $i]);
}
return $ret;
}
/**
* Check if image already added to pdf image directory.
* If yes, need not to create again (pass empty data)
*
* @param $imgname
* @return bool
*/
function image_iscached($imgname)
{
return isset($this->imagelist[$imgname]);
}
/**
* add a PNG image into the document, from a GD object
* this should work with remote files
*
* @param string $file The PNG file
* @param float $x X position
* @param float $y Y position
* @param float $w Width
* @param float $h Height
* @param resource $img A GD resource
* @param bool $is_mask true if the image is a mask
* @param bool $mask true if the image is masked
* @throws Exception
*/
function addImagePng($file, $x, $y, $w = 0.0, $h = 0.0, &$img, $is_mask = false, $mask = null)
{
if (!function_exists("imagepng")) {
throw new \Exception("The PHP GD extension is required, but is not installed.");
}
//if already cached, need not to read again
if (isset($this->imagelist[$file])) {
$data = null;
} else {
// Example for transparency handling on new image. Retain for current image
// $tIndex = imagecolortransparent($img);
// if ($tIndex > 0) {
// $tColor = imagecolorsforindex($img, $tIndex);
// $new_tIndex = imagecolorallocate($new_img, $tColor['red'], $tColor['green'], $tColor['blue']);
// imagefill($new_img, 0, 0, $new_tIndex);
// imagecolortransparent($new_img, $new_tIndex);
// }
// blending mode (literal/blending) on drawing into current image. not relevant when not saved or not drawn
//imagealphablending($img, true);
//default, but explicitely set to ensure pdf compatibility
imagesavealpha($img, false/*!$is_mask && !$mask*/);
$error = 0;
//DEBUG_IMG_TEMP
//debugpng
if (defined("DEBUGPNG") && DEBUGPNG) {
print '[addImagePng ' . $file . ']';
}
ob_start();
@imagepng($img);
$data = ob_get_clean();
if ($data == '') {
$error = 1;
$errormsg = 'trouble writing file from GD';
//DEBUG_IMG_TEMP
//debugpng
if (defined("DEBUGPNG") && DEBUGPNG) {
print 'trouble writing file from GD';
}
}
if ($error) {
$this->addMessage('PNG error - (' . $file . ') ' . $errormsg);
return;
}
} //End isset($this->imagelist[$file]) (png Duplicate removal)
$this->addPngFromBuf($file, $x, $y, $w, $h, $data, $is_mask, $mask);
}
/**
* @param $file
* @param $x
* @param $y
* @param $w
* @param $h
* @param $byte
*/
protected function addImagePngAlpha($file, $x, $y, $w, $h, $byte)
{
// generate images
$img = imagecreatefrompng($file);
if ($img === false) {
return;
}
// FIXME The pixel transformation doesn't work well with 8bit PNGs
$eight_bit = ($byte & 4) !== 4;
$wpx = imagesx($img);
$hpx = imagesy($img);
imagesavealpha($img, false);
// create temp alpha file
$tempfile_alpha = tempnam($this->tmp, "cpdf_img_");
@unlink($tempfile_alpha);
$tempfile_alpha = "$tempfile_alpha.png";
// create temp plain file
$tempfile_plain = tempnam($this->tmp, "cpdf_img_");
@unlink($tempfile_plain);
$tempfile_plain = "$tempfile_plain.png";
$imgalpha = imagecreate($wpx, $hpx);
imagesavealpha($imgalpha, false);
// generate gray scale palette (0 -> 255)
for ($c = 0; $c < 256; ++$c) {
imagecolorallocate($imgalpha, $c, $c, $c);
}
// Use PECL gmagick + Graphics Magic to process transparent PNG images
if (extension_loaded("gmagick")) {
$gmagick = new \Gmagick($file);
$gmagick->setimageformat('png');
// Get opacity channel (negative of alpha channel)
$alpha_channel_neg = clone $gmagick;
$alpha_channel_neg->separateimagechannel(\Gmagick::CHANNEL_OPACITY);
// Negate opacity channel
$alpha_channel = new \Gmagick();
$alpha_channel->newimage($wpx, $hpx, "#FFFFFF", "png");
$alpha_channel->compositeimage($alpha_channel_neg, \Gmagick::COMPOSITE_DIFFERENCE, 0, 0);
$alpha_channel->separateimagechannel(\Gmagick::CHANNEL_RED);
$alpha_channel->writeimage($tempfile_alpha);
// Cast to 8bit+palette
$imgalpha_ = imagecreatefrompng($tempfile_alpha);
imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx);
imagedestroy($imgalpha_);
imagepng($imgalpha, $tempfile_alpha);
// Make opaque image
$color_channels = new \Gmagick();
$color_channels->newimage($wpx, $hpx, "#FFFFFF", "png");
$color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYRED, 0, 0);
$color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYGREEN, 0, 0);
$color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYBLUE, 0, 0);
$color_channels->writeimage($tempfile_plain);
$imgplain = imagecreatefrompng($tempfile_plain);
}
// Use PECL imagick + ImageMagic to process transparent PNG images
elseif (extension_loaded("imagick")) {
// Native cloning was added to pecl-imagick in svn commit 263814
// the first version containing it was 3.0.1RC1
static $imagickClonable = null;
if ($imagickClonable === null) {
$imagickClonable = version_compare(Imagick::IMAGICK_EXTVER, '3.0.1rc1') > 0;
}
$imagick = new \Imagick($file);
$imagick->setFormat('png');
// Get opacity channel (negative of alpha channel)
$alpha_channel = $imagickClonable ? clone $imagick : $imagick->clone();
$alpha_channel->separateImageChannel(\Imagick::CHANNEL_ALPHA);
$alpha_channel->negateImage(true);
$alpha_channel->writeImage($tempfile_alpha);
// Cast to 8bit+palette
$imgalpha_ = imagecreatefrompng($tempfile_alpha);
imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx);
imagedestroy($imgalpha_);
imagepng($imgalpha, $tempfile_alpha);
// Make opaque image
$color_channels = new \Imagick();
$color_channels->newImage($wpx, $hpx, "#FFFFFF", "png");
$color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYRED, 0, 0);
$color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYGREEN, 0, 0);
$color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYBLUE, 0, 0);
$color_channels->writeImage($tempfile_plain);
$imgplain = imagecreatefrompng($tempfile_plain);
} else {
// allocated colors cache
$allocated_colors = array();
// extract alpha channel
for ($xpx = 0; $xpx < $wpx; ++$xpx) {
for ($ypx = 0; $ypx < $hpx; ++$ypx) {
$color = imagecolorat($img, $xpx, $ypx);
$col = imagecolorsforindex($img, $color);
$alpha = $col['alpha'];
if ($eight_bit) {
// with gamma correction
$gammacorr = 2.2;
$pixel = pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255;
} else {
// without gamma correction
$pixel = (127 - $alpha) * 2;
$key = $col['red'] . $col['green'] . $col['blue'];
if (!isset($allocated_colors[$key])) {
$pixel_img = imagecolorallocate($img, $col['red'], $col['green'], $col['blue']);
$allocated_colors[$key] = $pixel_img;
} else {
$pixel_img = $allocated_colors[$key];
}
imagesetpixel($img, $xpx, $ypx, $pixel_img);
}
imagesetpixel($imgalpha, $xpx, $ypx, $pixel);
}
}
// extract image without alpha channel
$imgplain = imagecreatetruecolor($wpx, $hpx);
imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx);
imagedestroy($img);
imagepng($imgalpha, $tempfile_alpha);
imagepng($imgplain, $tempfile_plain);
}
// embed mask image
$this->addImagePng($tempfile_alpha, $x, $y, $w, $h, $imgalpha, true);
imagedestroy($imgalpha);
// embed image, masked with previously embedded mask
$this->addImagePng($tempfile_plain, $x, $y, $w, $h, $imgplain, false, true);
imagedestroy($imgplain);
// remove temp files
unlink($tempfile_alpha);
unlink($tempfile_plain);
}
/**
* add a PNG image into the document, from a file
* this should work with remote files
*
* @param $file
* @param $x
* @param $y
* @param int $w
* @param int $h
* @throws Exception
*/
function addPngFromFile($file, $x, $y, $w = 0, $h = 0)
{
if (!function_exists("imagecreatefrompng")) {
throw new \Exception("The PHP GD extension is required, but is not installed.");
}
//if already cached, need not to read again
if (isset($this->imagelist[$file])) {
$img = null;
} else {
$info = file_get_contents($file, false, null, 24, 5);
$meta = unpack("CbitDepth/CcolorType/CcompressionMethod/CfilterMethod/CinterlaceMethod", $info);
$bit_depth = $meta["bitDepth"];
$color_type = $meta["colorType"];
// http://www.w3.org/TR/PNG/#11IHDR
// 3 => indexed
// 4 => greyscale with alpha
// 6 => fullcolor with alpha
$is_alpha = in_array($color_type, array(4, 6)) || ($color_type == 3 && $bit_depth != 4);
if ($is_alpha) { // exclude grayscale alpha
$this->addImagePngAlpha($file, $x, $y, $w, $h, $color_type);
return;
}
//png files typically contain an alpha channel.
//pdf file format or class.pdf does not support alpha blending.
//on alpha blended images, more transparent areas have a color near black.
//This appears in the result on not storing the alpha channel.
//Correct would be the box background image or its parent when transparent.
//But this would make the image dependent on the background.
//Therefore create an image with white background and copy in
//A more natural background than black is white.
//Therefore create an empty image with white background and merge the
//image in with alpha blending.
$imgtmp = @imagecreatefrompng($file);
if (!$imgtmp) {
return;
}
$sx = imagesx($imgtmp);
$sy = imagesy($imgtmp);
$img = imagecreatetruecolor($sx, $sy);
imagealphablending($img, true);
// @todo is it still needed ??
$ti = imagecolortransparent($imgtmp);
if ($ti >= 0) {
$tc = imagecolorsforindex($imgtmp, $ti);
$ti = imagecolorallocate($img, $tc['red'], $tc['green'], $tc['blue']);
imagefill($img, 0, 0, $ti);
imagecolortransparent($img, $ti);
} else {
imagefill($img, 1, 1, imagecolorallocate($img, 255, 255, 255));
}
imagecopy($img, $imgtmp, 0, 0, 0, 0, $sx, $sy);
imagedestroy($imgtmp);
}
$this->addImagePng($file, $x, $y, $w, $h, $img);
if ($img) {
imagedestroy($img);
}
}
/**
* add a PNG image into the document, from a file
* this should work with remote files
*
* @param $file
* @param $x
* @param $y
* @param int $w
* @param int $h
*/
function addSvgFromFile($file, $x, $y, $w = 0, $h = 0)
{
$doc = new \Svg\Document();
$doc->loadFile($file);
$dimensions = $doc->getDimensions();
$this->save();
$this->transform(array($w / $dimensions["width"], 0, 0, $h / $dimensions["height"], $x, $y));
$surface = new \Svg\Surface\SurfaceCpdf($doc, $this);
$doc->render($surface);
$this->restore();
}
/**
* add a PNG image into the document, from a memory buffer of the file
*
* @param $file
* @param $x
* @param $y
* @param float $w
* @param float $h
* @param $data
* @param bool $is_mask
* @param null $mask
*/
function addPngFromBuf($file, $x, $y, $w = 0.0, $h = 0.0, &$data, $is_mask = false, $mask = null)
{
if (isset($this->imagelist[$file])) {
$data = null;
$info['width'] = $this->imagelist[$file]['w'];
$info['height'] = $this->imagelist[$file]['h'];
$label = $this->imagelist[$file]['label'];
} else {
if ($data == null) {
$this->addMessage('addPngFromBuf error - data not present!');
return;
}
$error = 0;
if (!$error) {
$header = chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10);
if (mb_substr($data, 0, 8, '8bit') != $header) {
$error = 1;
if (defined("DEBUGPNG") && DEBUGPNG) {
print '[addPngFromFile this file does not have a valid header ' . $file . ']';
}
$errormsg = 'this file does not have a valid header';
}
}
if (!$error) {
// set pointer
$p = 8;
$len = mb_strlen($data, '8bit');
// cycle through the file, identifying chunks
$haveHeader = 0;
$info = array();
$idata = '';
$pdata = '';
while ($p < $len) {
$chunkLen = $this->getBytes($data, $p, 4);
$chunkType = mb_substr($data, $p + 4, 4, '8bit');
switch ($chunkType) {
case 'IHDR':
// this is where all the file information comes from
$info['width'] = $this->getBytes($data, $p + 8, 4);
$info['height'] = $this->getBytes($data, $p + 12, 4);
$info['bitDepth'] = ord($data[$p + 16]);
$info['colorType'] = ord($data[$p + 17]);
$info['compressionMethod'] = ord($data[$p + 18]);
$info['filterMethod'] = ord($data[$p + 19]);
$info['interlaceMethod'] = ord($data[$p + 20]);
//print_r($info);
$haveHeader = 1;
if ($info['compressionMethod'] != 0) {
$error = 1;
//debugpng
if (defined("DEBUGPNG") && DEBUGPNG) {
print '[addPngFromFile unsupported compression method ' . $file . ']';
}
$errormsg = 'unsupported compression method';
}
if ($info['filterMethod'] != 0) {
$error = 1;
//debugpng
if (defined("DEBUGPNG") && DEBUGPNG) {
print '[addPngFromFile unsupported filter method ' . $file . ']';
}
$errormsg = 'unsupported filter method';
}
break;
case 'PLTE':
$pdata .= mb_substr($data, $p + 8, $chunkLen, '8bit');
break;
case 'IDAT':
$idata .= mb_substr($data, $p + 8, $chunkLen, '8bit');
break;
case 'tRNS':
//this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk
//print "tRNS found, color type = ".$info['colorType']."\n";
$transparency = array();
switch ($info['colorType']) {
// indexed color, rbg
case 3:
/* corresponding to entries in the plte chunk
Alpha for palette index 0: 1 byte
Alpha for palette index 1: 1 byte
...etc...
*/
// there will be one entry for each palette entry. up until the last non-opaque entry.
// set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent)
$transparency['type'] = 'indexed';
$trans = 0;
for ($i = $chunkLen; $i >= 0; $i--) {
if (ord($data[$p + 8 + $i]) == 0) {
$trans = $i;
}
}
$transparency['data'] = $trans;
break;
// grayscale
case 0:
/* corresponding to entries in the plte chunk
Gray: 2 bytes, range 0 .. (2^bitdepth)-1
*/
// $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale
$transparency['type'] = 'indexed';
$transparency['data'] = ord($data[$p + 8 + 1]);
break;
// truecolor
case 2:
/* corresponding to entries in the plte chunk
Red: 2 bytes, range 0 .. (2^bitdepth)-1
Green: 2 bytes, range 0 .. (2^bitdepth)-1
Blue: 2 bytes, range 0 .. (2^bitdepth)-1
*/
$transparency['r'] = $this->getBytes($data, $p + 8, 2);
// r from truecolor
$transparency['g'] = $this->getBytes($data, $p + 10, 2);
// g from truecolor
$transparency['b'] = $this->getBytes($data, $p + 12, 2);
// b from truecolor
$transparency['type'] = 'color-key';
break;
//unsupported transparency type
default:
if (defined("DEBUGPNG") && DEBUGPNG) {
print '[addPngFromFile unsupported transparency type ' . $file . ']';
}
break;
}
// KS End new code
break;
default:
break;
}
$p += $chunkLen + 12;
}
if (!$haveHeader) {
$error = 1;
//debugpng
if (defined("DEBUGPNG") && DEBUGPNG) {
print '[addPngFromFile information header is missing ' . $file . ']';
}
$errormsg = 'information header is missing';
}
if (isset($info['interlaceMethod']) && $info['interlaceMethod']) {
$error = 1;
//debugpng
if (defined("DEBUGPNG") && DEBUGPNG) {
print '[addPngFromFile no support for interlaced images in pdf ' . $file . ']';
}
$errormsg = 'There appears to be no support for interlaced images in pdf.';
}
}
if (!$error && $info['bitDepth'] > 8) {
$error = 1;
//debugpng
if (defined("DEBUGPNG") && DEBUGPNG) {
print '[addPngFromFile bit depth of 8 or less is supported ' . $file . ']';
}
$errormsg = 'only bit depth of 8 or less is supported';
}
if (!$error) {
switch ($info['colorType']) {
case 3:
$color = 'DeviceRGB';
$ncolor = 1;
break;
case 2:
$color = 'DeviceRGB';
$ncolor = 3;
break;
case 0:
$color = 'DeviceGray';
$ncolor = 1;
break;
default:
$error = 1;
//debugpng
if (defined("DEBUGPNG") && DEBUGPNG) {
print '[addPngFromFile alpha channel not supported: ' . $info['colorType'] . ' ' . $file . ']';
}
$errormsg = 'transparency alpha channel not supported, transparency only supported for palette images.';
}
}
if ($error) {
$this->addMessage('PNG error - (' . $file . ') ' . $errormsg);
return;
}
//print_r($info);
// so this image is ok... add it in.
$this->numImages++;
$im = $this->numImages;
$label = "I$im";
$this->numObj++;
// $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width']));
$options = array(
'label' => $label,
'data' => $idata,
'bitsPerComponent' => $info['bitDepth'],
'pdata' => $pdata,
'iw' => $info['width'],
'ih' => $info['height'],
'type' => 'png',
'color' => $color,
'ncolor' => $ncolor,
'masked' => $mask,
'isMask' => $is_mask
);
if (isset($transparency)) {
$options['transparency'] = $transparency;
}
$this->o_image($this->numObj, 'new', $options);
$this->imagelist[$file] = array('label' => $label, 'w' => $info['width'], 'h' => $info['height']);
}
if ($is_mask) {
return;
}
if ($w <= 0 && $h <= 0) {
$w = $info['width'];
$h = $info['height'];
}
if ($w <= 0) {
$w = $h / $info['height'] * $info['width'];
}
if ($h <= 0) {
$h = $w * $info['height'] / $info['width'];
}
$this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ", $w, $h, $x, $y, $label));
}
/**
* add a JPEG image into the document, from a file
*
* @param $img
* @param $x
* @param $y
* @param int $w
* @param int $h
*/
function addJpegFromFile($img, $x, $y, $w = 0, $h = 0)
{
// attempt to add a jpeg image straight from a file, using no GD commands
// note that this function is unable to operate on a remote file.
if (!file_exists($img)) {
return;
}
if ($this->image_iscached($img)) {
$data = null;
$imageWidth = $this->imagelist[$img]['w'];
$imageHeight = $this->imagelist[$img]['h'];
$channels = $this->imagelist[$img]['c'];
} else {
$tmp = getimagesize($img);
$imageWidth = $tmp[0];
$imageHeight = $tmp[1];
if (isset($tmp['channels'])) {
$channels = $tmp['channels'];
} else {
$channels = 3;
}
$data = file_get_contents($img);
}
if ($w <= 0 && $h <= 0) {
$w = $imageWidth;
}
if ($w == 0) {
$w = $h / $imageHeight * $imageWidth;
}
if ($h == 0) {
$h = $w * $imageHeight / $imageWidth;
}
$this->addJpegImage_common($data, $x, $y, $w, $h, $imageWidth, $imageHeight, $channels, $img);
}
/**
* common code used by the two JPEG adding functions
* @param $data
* @param $x
* @param $y
* @param int $w
* @param int $h
* @param $imageWidth
* @param $imageHeight
* @param int $channels
* @param $imgname
*/
private function addJpegImage_common(
&$data,
$x,
$y,
$w = 0,
$h = 0,
$imageWidth,
$imageHeight,
$channels = 3,
$imgname
) {
if ($this->image_iscached($imgname)) {
$label = $this->imagelist[$imgname]['label'];
//debugpng
//if (DEBUGPNG) print '[addJpegImage_common Duplicate '.$imgname.']';
} else {
if ($data == null) {
$this->addMessage('addJpegImage_common error - (' . $imgname . ') data not present!');
return;
}
// note that this function is not to be called externally
// it is just the common code between the GD and the file options
$this->numImages++;
$im = $this->numImages;
$label = "I$im";
$this->numObj++;
$this->o_image(
$this->numObj,
'new',
array(
'label' => $label,
'data' => &$data,
'iw' => $imageWidth,
'ih' => $imageHeight,
'channels' => $channels
)
);
$this->imagelist[$imgname] = array(
'label' => $label,
'w' => $imageWidth,
'h' => $imageHeight,
'c' => $channels
);
}
$this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ ", $w, $h, $x, $y, $label));
}
/**
* specify where the document should open when it first starts
*
* @param $style
* @param int $a
* @param int $b
* @param int $c
*/
function openHere($style, $a = 0, $b = 0, $c = 0)
{
// this function will open the document at a specified page, in a specified style
// the values for style, and the required parameters are:
// 'XYZ' left, top, zoom
// 'Fit'
// 'FitH' top
// 'FitV' left
// 'FitR' left,bottom,right
// 'FitB'
// 'FitBH' top
// 'FitBV' left
$this->numObj++;
$this->o_destination(
$this->numObj,
'new',
array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c)
);
$id = $this->catalogId;
$this->o_catalog($id, 'openHere', $this->numObj);
}
/**
* Add JavaScript code to the PDF document
*
* @param string $code
*/
function addJavascript($code)
{
$this->javascript .= $code;
}
/**
* create a labelled destination within the document
*
* @param $label
* @param $style
* @param int $a
* @param int $b
* @param int $c
*/
function addDestination($label, $style, $a = 0, $b = 0, $c = 0)
{
// associates the given label with the destination, it is done this way so that a destination can be specified after
// it has been linked to
// styles are the same as the 'openHere' function
$this->numObj++;
$this->o_destination(
$this->numObj,
'new',
array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c)
);
$id = $this->numObj;
// store the label->idf relationship, note that this means that labels can be used only once
$this->destinations["$label"] = $id;
}
/**
* define font families, this is used to initialize the font families for the default fonts
* and for the user to add new ones for their fonts. The default bahavious can be overridden should
* that be desired.
*
* @param $family
* @param string $options
*/
function setFontFamily($family, $options = '')
{
if (!is_array($options)) {
if ($family === 'init') {
// set the known family groups
// these font families will be used to enable bold and italic markers to be included
// within text streams. html forms will be used...
$this->fontFamilies['Helvetica.afm'] =
array(
'b' => 'Helvetica-Bold.afm',
'i' => 'Helvetica-Oblique.afm',
'bi' => 'Helvetica-BoldOblique.afm',
'ib' => 'Helvetica-BoldOblique.afm'
);
$this->fontFamilies['Courier.afm'] =
array(
'b' => 'Courier-Bold.afm',
'i' => 'Courier-Oblique.afm',
'bi' => 'Courier-BoldOblique.afm',
'ib' => 'Courier-BoldOblique.afm'
);
$this->fontFamilies['Times-Roman.afm'] =
array(
'b' => 'Times-Bold.afm',
'i' => 'Times-Italic.afm',
'bi' => 'Times-BoldItalic.afm',
'ib' => 'Times-BoldItalic.afm'
);
}
} else {
// the user is trying to set a font family
// note that this can also be used to set the base ones to something else
if (mb_strlen($family)) {
$this->fontFamilies[$family] = $options;
}
}
}
/**
* used to add messages for use in debugging
*
* @param $message
*/
function addMessage($message)
{
$this->messages .= $message . "\n";
}
/**
* a few functions which should allow the document to be treated transactionally.
*
* @param $action
*/
function transaction($action)
{
switch ($action) {
case 'start':
// store all the data away into the checkpoint variable
$data = get_object_vars($this);
$this->checkpoint = $data;
unset($data);
break;
case 'commit':
if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) {
$tmp = $this->checkpoint['checkpoint'];
$this->checkpoint = $tmp;
unset($tmp);
} else {
$this->checkpoint = '';
}
break;
case 'rewind':
// do not destroy the current checkpoint, but move us back to the state then, so that we can try again
if (is_array($this->checkpoint)) {
// can only abort if were inside a checkpoint
$tmp = $this->checkpoint;
foreach ($tmp as $k => $v) {
if ($k !== 'checkpoint') {
$this->$k = $v;
}
}
unset($tmp);
}
break;
case 'abort':
if (is_array($this->checkpoint)) {
// can only abort if were inside a checkpoint
$tmp = $this->checkpoint;
foreach ($tmp as $k => $v) {
$this->$k = $v;
}
unset($tmp);
}
break;
}
}
}
PK :;K7 lib/fonts/DejaVuSerif-Bold.ufmnu W+A StartFontMetrics 4.1
Notice Converted by PHP-font-lib
Comment https://github.com/PhenX/php-font-lib
EncodingScheme FontSpecific
FontName DejaVu Serif
FontSubfamily Bold
UniqueID DejaVu Serif Bold
FullName DejaVu Serif Bold
Version Version 2.37
PostScriptName DejaVuSerif-Bold
Manufacturer DejaVu fonts team
FontVendorURL http://dejavu.sourceforge.net
LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License
PreferredFamily DejaVu Serif
PreferredSubfamily Bold
Weight Bold
ItalicAngle 0
IsFixedPitch false
UnderlineThickness 44
UnderlinePosition -63
FontHeightOffset 0
Ascender 939
Descender -236
FontBBox -836 -389 1854 1145
StartCharMetrics 3506
U 32 ; WX 348 ; N space ; G 3
U 33 ; WX 439 ; N exclam ; G 4
U 34 ; WX 521 ; N quotedbl ; G 5
U 35 ; WX 838 ; N numbersign ; G 6
U 36 ; WX 696 ; N dollar ; G 7
U 37 ; WX 950 ; N percent ; G 8
U 38 ; WX 903 ; N ampersand ; G 9
U 39 ; WX 306 ; N quotesingle ; G 10
U 40 ; WX 473 ; N parenleft ; G 11
U 41 ; WX 473 ; N parenright ; G 12
U 42 ; WX 523 ; N asterisk ; G 13
U 43 ; WX 838 ; N plus ; G 14
U 44 ; WX 348 ; N comma ; G 15
U 45 ; WX 415 ; N hyphen ; G 16
U 46 ; WX 348 ; N period ; G 17
U 47 ; WX 365 ; N slash ; G 18
U 48 ; WX 696 ; N zero ; G 19
U 49 ; WX 696 ; N one ; G 20
U 50 ; WX 696 ; N two ; G 21
U 51 ; WX 696 ; N three ; G 22
U 52 ; WX 696 ; N four ; G 23
U 53 ; WX 696 ; N five ; G 24
U 54 ; WX 696 ; N six ; G 25
U 55 ; WX 696 ; N seven ; G 26
U 56 ; WX 696 ; N eight ; G 27
U 57 ; WX 696 ; N nine ; G 28
U 58 ; WX 369 ; N colon ; G 29
U 59 ; WX 369 ; N semicolon ; G 30
U 60 ; WX 838 ; N less ; G 31
U 61 ; WX 838 ; N equal ; G 32
U 62 ; WX 838 ; N greater ; G 33
U 63 ; WX 586 ; N question ; G 34
U 64 ; WX 1000 ; N at ; G 35
U 65 ; WX 776 ; N A ; G 36
U 66 ; WX 845 ; N B ; G 37
U 67 ; WX 796 ; N C ; G 38
U 68 ; WX 867 ; N D ; G 39
U 69 ; WX 762 ; N E ; G 40
U 70 ; WX 710 ; N F ; G 41
U 71 ; WX 854 ; N G ; G 42
U 72 ; WX 945 ; N H ; G 43
U 73 ; WX 468 ; N I ; G 44
U 74 ; WX 473 ; N J ; G 45
U 75 ; WX 869 ; N K ; G 46
U 76 ; WX 703 ; N L ; G 47
U 77 ; WX 1107 ; N M ; G 48
U 78 ; WX 914 ; N N ; G 49
U 79 ; WX 871 ; N O ; G 50
U 80 ; WX 752 ; N P ; G 51
U 81 ; WX 871 ; N Q ; G 52
U 82 ; WX 831 ; N R ; G 53
U 83 ; WX 722 ; N S ; G 54
U 84 ; WX 744 ; N T ; G 55
U 85 ; WX 872 ; N U ; G 56
U 86 ; WX 776 ; N V ; G 57
U 87 ; WX 1123 ; N W ; G 58
U 88 ; WX 776 ; N X ; G 59
U 89 ; WX 714 ; N Y ; G 60
U 90 ; WX 730 ; N Z ; G 61
U 91 ; WX 473 ; N bracketleft ; G 62
U 92 ; WX 365 ; N backslash ; G 63
U 93 ; WX 473 ; N bracketright ; G 64
U 94 ; WX 838 ; N asciicircum ; G 65
U 95 ; WX 500 ; N underscore ; G 66
U 96 ; WX 500 ; N grave ; G 67
U 97 ; WX 648 ; N a ; G 68
U 98 ; WX 699 ; N b ; G 69
U 99 ; WX 609 ; N c ; G 70
U 100 ; WX 699 ; N d ; G 71
U 101 ; WX 636 ; N e ; G 72
U 102 ; WX 430 ; N f ; G 73
U 103 ; WX 699 ; N g ; G 74
U 104 ; WX 727 ; N h ; G 75
U 105 ; WX 380 ; N i ; G 76
U 106 ; WX 362 ; N j ; G 77
U 107 ; WX 693 ; N k ; G 78
U 108 ; WX 380 ; N l ; G 79
U 109 ; WX 1058 ; N m ; G 80
U 110 ; WX 727 ; N n ; G 81
U 111 ; WX 667 ; N o ; G 82
U 112 ; WX 699 ; N p ; G 83
U 113 ; WX 699 ; N q ; G 84
U 114 ; WX 527 ; N r ; G 85
U 115 ; WX 563 ; N s ; G 86
U 116 ; WX 462 ; N t ; G 87
U 117 ; WX 727 ; N u ; G 88
U 118 ; WX 581 ; N v ; G 89
U 119 ; WX 861 ; N w ; G 90
U 120 ; WX 596 ; N x ; G 91
U 121 ; WX 581 ; N y ; G 92
U 122 ; WX 568 ; N z ; G 93
U 123 ; WX 643 ; N braceleft ; G 94
U 124 ; WX 364 ; N bar ; G 95
U 125 ; WX 643 ; N braceright ; G 96
U 126 ; WX 838 ; N asciitilde ; G 97
U 160 ; WX 348 ; N nbspace ; G 98
U 161 ; WX 439 ; N exclamdown ; G 99
U 162 ; WX 696 ; N cent ; G 100
U 163 ; WX 696 ; N sterling ; G 101
U 164 ; WX 636 ; N currency ; G 102
U 165 ; WX 696 ; N yen ; G 103
U 166 ; WX 364 ; N brokenbar ; G 104
U 167 ; WX 523 ; N section ; G 105
U 168 ; WX 500 ; N dieresis ; G 106
U 169 ; WX 1000 ; N copyright ; G 107
U 170 ; WX 487 ; N ordfeminine ; G 108
U 171 ; WX 625 ; N guillemotleft ; G 109
U 172 ; WX 838 ; N logicalnot ; G 110
U 173 ; WX 415 ; N sfthyphen ; G 111
U 174 ; WX 1000 ; N registered ; G 112
U 175 ; WX 500 ; N macron ; G 113
U 176 ; WX 500 ; N degree ; G 114
U 177 ; WX 838 ; N plusminus ; G 115
U 178 ; WX 438 ; N twosuperior ; G 116
U 179 ; WX 438 ; N threesuperior ; G 117
U 180 ; WX 500 ; N acute ; G 118
U 181 ; WX 732 ; N mu ; G 119
U 182 ; WX 636 ; N paragraph ; G 120
U 183 ; WX 348 ; N periodcentered ; G 121
U 184 ; WX 500 ; N cedilla ; G 122
U 185 ; WX 438 ; N onesuperior ; G 123
U 186 ; WX 500 ; N ordmasculine ; G 124
U 187 ; WX 625 ; N guillemotright ; G 125
U 188 ; WX 1043 ; N onequarter ; G 126
U 189 ; WX 1043 ; N onehalf ; G 127
U 190 ; WX 1043 ; N threequarters ; G 128
U 191 ; WX 586 ; N questiondown ; G 129
U 192 ; WX 776 ; N Agrave ; G 130
U 193 ; WX 776 ; N Aacute ; G 131
U 194 ; WX 776 ; N Acircumflex ; G 132
U 195 ; WX 776 ; N Atilde ; G 133
U 196 ; WX 776 ; N Adieresis ; G 134
U 197 ; WX 776 ; N Aring ; G 135
U 198 ; WX 1034 ; N AE ; G 136
U 199 ; WX 796 ; N Ccedilla ; G 137
U 200 ; WX 762 ; N Egrave ; G 138
U 201 ; WX 762 ; N Eacute ; G 139
U 202 ; WX 762 ; N Ecircumflex ; G 140
U 203 ; WX 762 ; N Edieresis ; G 141
U 204 ; WX 468 ; N Igrave ; G 142
U 205 ; WX 468 ; N Iacute ; G 143
U 206 ; WX 468 ; N Icircumflex ; G 144
U 207 ; WX 468 ; N Idieresis ; G 145
U 208 ; WX 874 ; N Eth ; G 146
U 209 ; WX 914 ; N Ntilde ; G 147
U 210 ; WX 871 ; N Ograve ; G 148
U 211 ; WX 871 ; N Oacute ; G 149
U 212 ; WX 871 ; N Ocircumflex ; G 150
U 213 ; WX 871 ; N Otilde ; G 151
U 214 ; WX 871 ; N Odieresis ; G 152
U 215 ; WX 838 ; N multiply ; G 153
U 216 ; WX 871 ; N Oslash ; G 154
U 217 ; WX 872 ; N Ugrave ; G 155
U 218 ; WX 872 ; N Uacute ; G 156
U 219 ; WX 872 ; N Ucircumflex ; G 157
U 220 ; WX 872 ; N Udieresis ; G 158
U 221 ; WX 714 ; N Yacute ; G 159
U 222 ; WX 757 ; N Thorn ; G 160
U 223 ; WX 760 ; N germandbls ; G 161
U 224 ; WX 648 ; N agrave ; G 162
U 225 ; WX 648 ; N aacute ; G 163
U 226 ; WX 648 ; N acircumflex ; G 164
U 227 ; WX 648 ; N atilde ; G 165
U 228 ; WX 648 ; N adieresis ; G 166
U 229 ; WX 648 ; N aring ; G 167
U 230 ; WX 975 ; N ae ; G 168
U 231 ; WX 609 ; N ccedilla ; G 169
U 232 ; WX 636 ; N egrave ; G 170
U 233 ; WX 636 ; N eacute ; G 171
U 234 ; WX 636 ; N ecircumflex ; G 172
U 235 ; WX 636 ; N edieresis ; G 173
U 236 ; WX 380 ; N igrave ; G 174
U 237 ; WX 380 ; N iacute ; G 175
U 238 ; WX 380 ; N icircumflex ; G 176
U 239 ; WX 380 ; N idieresis ; G 177
U 240 ; WX 667 ; N eth ; G 178
U 241 ; WX 727 ; N ntilde ; G 179
U 242 ; WX 667 ; N ograve ; G 180
U 243 ; WX 667 ; N oacute ; G 181
U 244 ; WX 667 ; N ocircumflex ; G 182
U 245 ; WX 667 ; N otilde ; G 183
U 246 ; WX 667 ; N odieresis ; G 184
U 247 ; WX 838 ; N divide ; G 185
U 248 ; WX 667 ; N oslash ; G 186
U 249 ; WX 727 ; N ugrave ; G 187
U 250 ; WX 727 ; N uacute ; G 188
U 251 ; WX 727 ; N ucircumflex ; G 189
U 252 ; WX 727 ; N udieresis ; G 190
U 253 ; WX 581 ; N yacute ; G 191
U 254 ; WX 699 ; N thorn ; G 192
U 255 ; WX 581 ; N ydieresis ; G 193
U 256 ; WX 776 ; N Amacron ; G 194
U 257 ; WX 648 ; N amacron ; G 195
U 258 ; WX 776 ; N Abreve ; G 196
U 259 ; WX 648 ; N abreve ; G 197
U 260 ; WX 776 ; N Aogonek ; G 198
U 261 ; WX 648 ; N aogonek ; G 199
U 262 ; WX 796 ; N Cacute ; G 200
U 263 ; WX 609 ; N cacute ; G 201
U 264 ; WX 796 ; N Ccircumflex ; G 202
U 265 ; WX 609 ; N ccircumflex ; G 203
U 266 ; WX 796 ; N Cdotaccent ; G 204
U 267 ; WX 609 ; N cdotaccent ; G 205
U 268 ; WX 796 ; N Ccaron ; G 206
U 269 ; WX 609 ; N ccaron ; G 207
U 270 ; WX 867 ; N Dcaron ; G 208
U 271 ; WX 699 ; N dcaron ; G 209
U 272 ; WX 874 ; N Dcroat ; G 210
U 273 ; WX 699 ; N dmacron ; G 211
U 274 ; WX 762 ; N Emacron ; G 212
U 275 ; WX 636 ; N emacron ; G 213
U 276 ; WX 762 ; N Ebreve ; G 214
U 277 ; WX 636 ; N ebreve ; G 215
U 278 ; WX 762 ; N Edotaccent ; G 216
U 279 ; WX 636 ; N edotaccent ; G 217
U 280 ; WX 762 ; N Eogonek ; G 218
U 281 ; WX 636 ; N eogonek ; G 219
U 282 ; WX 762 ; N Ecaron ; G 220
U 283 ; WX 636 ; N ecaron ; G 221
U 284 ; WX 854 ; N Gcircumflex ; G 222
U 285 ; WX 699 ; N gcircumflex ; G 223
U 286 ; WX 854 ; N Gbreve ; G 224
U 287 ; WX 699 ; N gbreve ; G 225
U 288 ; WX 854 ; N Gdotaccent ; G 226
U 289 ; WX 699 ; N gdotaccent ; G 227
U 290 ; WX 854 ; N Gcommaaccent ; G 228
U 291 ; WX 699 ; N gcommaaccent ; G 229
U 292 ; WX 945 ; N Hcircumflex ; G 230
U 293 ; WX 727 ; N hcircumflex ; G 231
U 294 ; WX 945 ; N Hbar ; G 232
U 295 ; WX 727 ; N hbar ; G 233
U 296 ; WX 468 ; N Itilde ; G 234
U 297 ; WX 380 ; N itilde ; G 235
U 298 ; WX 468 ; N Imacron ; G 236
U 299 ; WX 380 ; N imacron ; G 237
U 300 ; WX 468 ; N Ibreve ; G 238
U 301 ; WX 380 ; N ibreve ; G 239
U 302 ; WX 468 ; N Iogonek ; G 240
U 303 ; WX 380 ; N iogonek ; G 241
U 304 ; WX 468 ; N Idot ; G 242
U 305 ; WX 380 ; N dotlessi ; G 243
U 306 ; WX 942 ; N IJ ; G 244
U 307 ; WX 751 ; N ij ; G 245
U 308 ; WX 473 ; N Jcircumflex ; G 246
U 309 ; WX 362 ; N jcircumflex ; G 247
U 310 ; WX 869 ; N Kcommaaccent ; G 248
U 311 ; WX 693 ; N kcommaaccent ; G 249
U 312 ; WX 693 ; N kgreenlandic ; G 250
U 313 ; WX 703 ; N Lacute ; G 251
U 314 ; WX 380 ; N lacute ; G 252
U 315 ; WX 703 ; N Lcommaaccent ; G 253
U 316 ; WX 380 ; N lcommaaccent ; G 254
U 317 ; WX 703 ; N Lcaron ; G 255
U 318 ; WX 380 ; N lcaron ; G 256
U 319 ; WX 703 ; N Ldot ; G 257
U 320 ; WX 380 ; N ldot ; G 258
U 321 ; WX 710 ; N Lslash ; G 259
U 322 ; WX 385 ; N lslash ; G 260
U 323 ; WX 914 ; N Nacute ; G 261
U 324 ; WX 727 ; N nacute ; G 262
U 325 ; WX 914 ; N Ncommaaccent ; G 263
U 326 ; WX 727 ; N ncommaaccent ; G 264
U 327 ; WX 914 ; N Ncaron ; G 265
U 328 ; WX 727 ; N ncaron ; G 266
U 329 ; WX 1008 ; N napostrophe ; G 267
U 330 ; WX 872 ; N Eng ; G 268
U 331 ; WX 727 ; N eng ; G 269
U 332 ; WX 871 ; N Omacron ; G 270
U 333 ; WX 667 ; N omacron ; G 271
U 334 ; WX 871 ; N Obreve ; G 272
U 335 ; WX 667 ; N obreve ; G 273
U 336 ; WX 871 ; N Ohungarumlaut ; G 274
U 337 ; WX 667 ; N ohungarumlaut ; G 275
U 338 ; WX 1180 ; N OE ; G 276
U 339 ; WX 1028 ; N oe ; G 277
U 340 ; WX 831 ; N Racute ; G 278
U 341 ; WX 527 ; N racute ; G 279
U 342 ; WX 831 ; N Rcommaaccent ; G 280
U 343 ; WX 527 ; N rcommaaccent ; G 281
U 344 ; WX 831 ; N Rcaron ; G 282
U 345 ; WX 527 ; N rcaron ; G 283
U 346 ; WX 722 ; N Sacute ; G 284
U 347 ; WX 563 ; N sacute ; G 285
U 348 ; WX 722 ; N Scircumflex ; G 286
U 349 ; WX 563 ; N scircumflex ; G 287
U 350 ; WX 722 ; N Scedilla ; G 288
U 351 ; WX 563 ; N scedilla ; G 289
U 352 ; WX 722 ; N Scaron ; G 290
U 353 ; WX 563 ; N scaron ; G 291
U 354 ; WX 744 ; N Tcommaaccent ; G 292
U 355 ; WX 462 ; N tcommaaccent ; G 293
U 356 ; WX 744 ; N Tcaron ; G 294
U 357 ; WX 462 ; N tcaron ; G 295
U 358 ; WX 744 ; N Tbar ; G 296
U 359 ; WX 462 ; N tbar ; G 297
U 360 ; WX 872 ; N Utilde ; G 298
U 361 ; WX 727 ; N utilde ; G 299
U 362 ; WX 872 ; N Umacron ; G 300
U 363 ; WX 727 ; N umacron ; G 301
U 364 ; WX 872 ; N Ubreve ; G 302
U 365 ; WX 727 ; N ubreve ; G 303
U 366 ; WX 872 ; N Uring ; G 304
U 367 ; WX 727 ; N uring ; G 305
U 368 ; WX 872 ; N Uhungarumlaut ; G 306
U 369 ; WX 727 ; N uhungarumlaut ; G 307
U 370 ; WX 872 ; N Uogonek ; G 308
U 371 ; WX 727 ; N uogonek ; G 309
U 372 ; WX 1123 ; N Wcircumflex ; G 310
U 373 ; WX 861 ; N wcircumflex ; G 311
U 374 ; WX 714 ; N Ycircumflex ; G 312
U 375 ; WX 581 ; N ycircumflex ; G 313
U 376 ; WX 714 ; N Ydieresis ; G 314
U 377 ; WX 730 ; N Zacute ; G 315
U 378 ; WX 568 ; N zacute ; G 316
U 379 ; WX 730 ; N Zdotaccent ; G 317
U 380 ; WX 568 ; N zdotaccent ; G 318
U 381 ; WX 730 ; N Zcaron ; G 319
U 382 ; WX 568 ; N zcaron ; G 320
U 383 ; WX 430 ; N longs ; G 321
U 384 ; WX 699 ; N uni0180 ; G 322
U 385 ; WX 845 ; N uni0181 ; G 323
U 386 ; WX 854 ; N uni0182 ; G 324
U 387 ; WX 699 ; N uni0183 ; G 325
U 388 ; WX 854 ; N uni0184 ; G 326
U 389 ; WX 699 ; N uni0185 ; G 327
U 390 ; WX 796 ; N uni0186 ; G 328
U 391 ; WX 796 ; N uni0187 ; G 329
U 392 ; WX 609 ; N uni0188 ; G 330
U 393 ; WX 874 ; N uni0189 ; G 331
U 394 ; WX 867 ; N uni018A ; G 332
U 395 ; WX 854 ; N uni018B ; G 333
U 396 ; WX 699 ; N uni018C ; G 334
U 397 ; WX 667 ; N uni018D ; G 335
U 398 ; WX 762 ; N uni018E ; G 336
U 399 ; WX 871 ; N uni018F ; G 337
U 400 ; WX 721 ; N uni0190 ; G 338
U 401 ; WX 710 ; N uni0191 ; G 339
U 402 ; WX 430 ; N florin ; G 340
U 403 ; WX 854 ; N uni0193 ; G 341
U 404 ; WX 771 ; N uni0194 ; G 342
U 405 ; WX 1043 ; N uni0195 ; G 343
U 406 ; WX 468 ; N uni0196 ; G 344
U 407 ; WX 468 ; N uni0197 ; G 345
U 408 ; WX 869 ; N uni0198 ; G 346
U 409 ; WX 693 ; N uni0199 ; G 347
U 410 ; WX 380 ; N uni019A ; G 348
U 411 ; WX 701 ; N uni019B ; G 349
U 412 ; WX 1058 ; N uni019C ; G 350
U 413 ; WX 914 ; N uni019D ; G 351
U 414 ; WX 727 ; N uni019E ; G 352
U 415 ; WX 871 ; N uni019F ; G 353
U 416 ; WX 871 ; N Ohorn ; G 354
U 417 ; WX 667 ; N ohorn ; G 355
U 418 ; WX 1200 ; N uni01A2 ; G 356
U 419 ; WX 943 ; N uni01A3 ; G 357
U 420 ; WX 752 ; N uni01A4 ; G 358
U 421 ; WX 699 ; N uni01A5 ; G 359
U 422 ; WX 831 ; N uni01A6 ; G 360
U 423 ; WX 722 ; N uni01A7 ; G 361
U 424 ; WX 563 ; N uni01A8 ; G 362
U 425 ; WX 707 ; N uni01A9 ; G 363
U 426 ; WX 331 ; N uni01AA ; G 364
U 427 ; WX 462 ; N uni01AB ; G 365
U 428 ; WX 744 ; N uni01AC ; G 366
U 429 ; WX 462 ; N uni01AD ; G 367
U 430 ; WX 744 ; N uni01AE ; G 368
U 431 ; WX 872 ; N Uhorn ; G 369
U 432 ; WX 727 ; N uhorn ; G 370
U 433 ; WX 890 ; N uni01B1 ; G 371
U 434 ; WX 890 ; N uni01B2 ; G 372
U 435 ; WX 714 ; N uni01B3 ; G 373
U 436 ; WX 708 ; N uni01B4 ; G 374
U 437 ; WX 730 ; N uni01B5 ; G 375
U 438 ; WX 568 ; N uni01B6 ; G 376
U 439 ; WX 657 ; N uni01B7 ; G 377
U 440 ; WX 657 ; N uni01B8 ; G 378
U 441 ; WX 657 ; N uni01B9 ; G 379
U 442 ; WX 657 ; N uni01BA ; G 380
U 443 ; WX 696 ; N uni01BB ; G 381
U 444 ; WX 754 ; N uni01BC ; G 382
U 445 ; WX 568 ; N uni01BD ; G 383
U 446 ; WX 536 ; N uni01BE ; G 384
U 447 ; WX 716 ; N uni01BF ; G 385
U 448 ; WX 295 ; N uni01C0 ; G 386
U 449 ; WX 492 ; N uni01C1 ; G 387
U 450 ; WX 459 ; N uni01C2 ; G 388
U 451 ; WX 295 ; N uni01C3 ; G 389
U 452 ; WX 1597 ; N uni01C4 ; G 390
U 453 ; WX 1435 ; N uni01C5 ; G 391
U 454 ; WX 1267 ; N uni01C6 ; G 392
U 455 ; WX 1176 ; N uni01C7 ; G 393
U 456 ; WX 1065 ; N uni01C8 ; G 394
U 457 ; WX 742 ; N uni01C9 ; G 395
U 458 ; WX 1387 ; N uni01CA ; G 396
U 459 ; WX 1276 ; N uni01CB ; G 397
U 460 ; WX 1089 ; N uni01CC ; G 398
U 461 ; WX 776 ; N uni01CD ; G 399
U 462 ; WX 648 ; N uni01CE ; G 400
U 463 ; WX 468 ; N uni01CF ; G 401
U 464 ; WX 380 ; N uni01D0 ; G 402
U 465 ; WX 871 ; N uni01D1 ; G 403
U 466 ; WX 667 ; N uni01D2 ; G 404
U 467 ; WX 872 ; N uni01D3 ; G 405
U 468 ; WX 727 ; N uni01D4 ; G 406
U 469 ; WX 872 ; N uni01D5 ; G 407
U 470 ; WX 727 ; N uni01D6 ; G 408
U 471 ; WX 872 ; N uni01D7 ; G 409
U 472 ; WX 727 ; N uni01D8 ; G 410
U 473 ; WX 872 ; N uni01D9 ; G 411
U 474 ; WX 727 ; N uni01DA ; G 412
U 475 ; WX 872 ; N uni01DB ; G 413
U 476 ; WX 727 ; N uni01DC ; G 414
U 477 ; WX 636 ; N uni01DD ; G 415
U 478 ; WX 776 ; N uni01DE ; G 416
U 479 ; WX 648 ; N uni01DF ; G 417
U 480 ; WX 776 ; N uni01E0 ; G 418
U 481 ; WX 648 ; N uni01E1 ; G 419
U 482 ; WX 1034 ; N uni01E2 ; G 420
U 483 ; WX 975 ; N uni01E3 ; G 421
U 484 ; WX 896 ; N uni01E4 ; G 422
U 485 ; WX 699 ; N uni01E5 ; G 423
U 486 ; WX 854 ; N Gcaron ; G 424
U 487 ; WX 699 ; N gcaron ; G 425
U 488 ; WX 869 ; N uni01E8 ; G 426
U 489 ; WX 693 ; N uni01E9 ; G 427
U 490 ; WX 871 ; N uni01EA ; G 428
U 491 ; WX 667 ; N uni01EB ; G 429
U 492 ; WX 871 ; N uni01EC ; G 430
U 493 ; WX 667 ; N uni01ED ; G 431
U 494 ; WX 657 ; N uni01EE ; G 432
U 495 ; WX 568 ; N uni01EF ; G 433
U 496 ; WX 380 ; N uni01F0 ; G 434
U 497 ; WX 1597 ; N uni01F1 ; G 435
U 498 ; WX 1435 ; N uni01F2 ; G 436
U 499 ; WX 1267 ; N uni01F3 ; G 437
U 500 ; WX 854 ; N uni01F4 ; G 438
U 501 ; WX 699 ; N uni01F5 ; G 439
U 502 ; WX 1221 ; N uni01F6 ; G 440
U 503 ; WX 787 ; N uni01F7 ; G 441
U 504 ; WX 914 ; N uni01F8 ; G 442
U 505 ; WX 727 ; N uni01F9 ; G 443
U 506 ; WX 776 ; N Aringacute ; G 444
U 507 ; WX 648 ; N aringacute ; G 445
U 508 ; WX 1034 ; N AEacute ; G 446
U 509 ; WX 975 ; N aeacute ; G 447
U 510 ; WX 871 ; N Oslashacute ; G 448
U 511 ; WX 667 ; N oslashacute ; G 449
U 512 ; WX 776 ; N uni0200 ; G 450
U 513 ; WX 648 ; N uni0201 ; G 451
U 514 ; WX 776 ; N uni0202 ; G 452
U 515 ; WX 648 ; N uni0203 ; G 453
U 516 ; WX 762 ; N uni0204 ; G 454
U 517 ; WX 636 ; N uni0205 ; G 455
U 518 ; WX 762 ; N uni0206 ; G 456
U 519 ; WX 636 ; N uni0207 ; G 457
U 520 ; WX 468 ; N uni0208 ; G 458
U 521 ; WX 380 ; N uni0209 ; G 459
U 522 ; WX 468 ; N uni020A ; G 460
U 523 ; WX 380 ; N uni020B ; G 461
U 524 ; WX 871 ; N uni020C ; G 462
U 525 ; WX 667 ; N uni020D ; G 463
U 526 ; WX 871 ; N uni020E ; G 464
U 527 ; WX 667 ; N uni020F ; G 465
U 528 ; WX 831 ; N uni0210 ; G 466
U 529 ; WX 527 ; N uni0211 ; G 467
U 530 ; WX 831 ; N uni0212 ; G 468
U 531 ; WX 527 ; N uni0213 ; G 469
U 532 ; WX 872 ; N uni0214 ; G 470
U 533 ; WX 727 ; N uni0215 ; G 471
U 534 ; WX 872 ; N uni0216 ; G 472
U 535 ; WX 727 ; N uni0217 ; G 473
U 536 ; WX 722 ; N Scommaaccent ; G 474
U 537 ; WX 563 ; N scommaaccent ; G 475
U 538 ; WX 744 ; N uni021A ; G 476
U 539 ; WX 462 ; N uni021B ; G 477
U 540 ; WX 690 ; N uni021C ; G 478
U 541 ; WX 607 ; N uni021D ; G 479
U 542 ; WX 945 ; N uni021E ; G 480
U 543 ; WX 727 ; N uni021F ; G 481
U 544 ; WX 872 ; N uni0220 ; G 482
U 545 ; WX 791 ; N uni0221 ; G 483
U 546 ; WX 703 ; N uni0222 ; G 484
U 547 ; WX 616 ; N uni0223 ; G 485
U 548 ; WX 730 ; N uni0224 ; G 486
U 549 ; WX 568 ; N uni0225 ; G 487
U 550 ; WX 776 ; N uni0226 ; G 488
U 551 ; WX 648 ; N uni0227 ; G 489
U 552 ; WX 762 ; N uni0228 ; G 490
U 553 ; WX 636 ; N uni0229 ; G 491
U 554 ; WX 871 ; N uni022A ; G 492
U 555 ; WX 667 ; N uni022B ; G 493
U 556 ; WX 871 ; N uni022C ; G 494
U 557 ; WX 667 ; N uni022D ; G 495
U 558 ; WX 871 ; N uni022E ; G 496
U 559 ; WX 667 ; N uni022F ; G 497
U 560 ; WX 871 ; N uni0230 ; G 498
U 561 ; WX 667 ; N uni0231 ; G 499
U 562 ; WX 714 ; N uni0232 ; G 500
U 563 ; WX 581 ; N uni0233 ; G 501
U 564 ; WX 573 ; N uni0234 ; G 502
U 565 ; WX 922 ; N uni0235 ; G 503
U 566 ; WX 564 ; N uni0236 ; G 504
U 567 ; WX 362 ; N dotlessj ; G 505
U 568 ; WX 1031 ; N uni0238 ; G 506
U 569 ; WX 1031 ; N uni0239 ; G 507
U 570 ; WX 776 ; N uni023A ; G 508
U 571 ; WX 796 ; N uni023B ; G 509
U 572 ; WX 609 ; N uni023C ; G 510
U 573 ; WX 703 ; N uni023D ; G 511
U 574 ; WX 744 ; N uni023E ; G 512
U 575 ; WX 563 ; N uni023F ; G 513
U 576 ; WX 568 ; N uni0240 ; G 514
U 577 ; WX 660 ; N uni0241 ; G 515
U 578 ; WX 547 ; N uni0242 ; G 516
U 579 ; WX 845 ; N uni0243 ; G 517
U 580 ; WX 872 ; N uni0244 ; G 518
U 581 ; WX 776 ; N uni0245 ; G 519
U 582 ; WX 762 ; N uni0246 ; G 520
U 583 ; WX 636 ; N uni0247 ; G 521
U 584 ; WX 473 ; N uni0248 ; G 522
U 585 ; WX 387 ; N uni0249 ; G 523
U 586 ; WX 848 ; N uni024A ; G 524
U 587 ; WX 699 ; N uni024B ; G 525
U 588 ; WX 831 ; N uni024C ; G 526
U 589 ; WX 527 ; N uni024D ; G 527
U 590 ; WX 714 ; N uni024E ; G 528
U 591 ; WX 581 ; N uni024F ; G 529
U 592 ; WX 648 ; N uni0250 ; G 530
U 593 ; WX 699 ; N uni0251 ; G 531
U 594 ; WX 699 ; N uni0252 ; G 532
U 595 ; WX 699 ; N uni0253 ; G 533
U 596 ; WX 609 ; N uni0254 ; G 534
U 597 ; WX 609 ; N uni0255 ; G 535
U 598 ; WX 699 ; N uni0256 ; G 536
U 599 ; WX 730 ; N uni0257 ; G 537
U 600 ; WX 636 ; N uni0258 ; G 538
U 601 ; WX 636 ; N uni0259 ; G 539
U 602 ; WX 907 ; N uni025A ; G 540
U 603 ; WX 608 ; N uni025B ; G 541
U 604 ; WX 562 ; N uni025C ; G 542
U 605 ; WX 907 ; N uni025D ; G 543
U 606 ; WX 714 ; N uni025E ; G 544
U 607 ; WX 387 ; N uni025F ; G 545
U 608 ; WX 699 ; N uni0260 ; G 546
U 609 ; WX 699 ; N uni0261 ; G 547
U 610 ; WX 638 ; N uni0262 ; G 548
U 611 ; WX 601 ; N uni0263 ; G 549
U 612 ; WX 627 ; N uni0264 ; G 550
U 613 ; WX 727 ; N uni0265 ; G 551
U 614 ; WX 727 ; N uni0266 ; G 552
U 615 ; WX 727 ; N uni0267 ; G 553
U 616 ; WX 380 ; N uni0268 ; G 554
U 617 ; WX 380 ; N uni0269 ; G 555
U 618 ; WX 380 ; N uni026A ; G 556
U 619 ; WX 409 ; N uni026B ; G 557
U 620 ; WX 514 ; N uni026C ; G 558
U 621 ; WX 380 ; N uni026D ; G 559
U 622 ; WX 795 ; N uni026E ; G 560
U 623 ; WX 1058 ; N uni026F ; G 561
U 624 ; WX 1058 ; N uni0270 ; G 562
U 625 ; WX 1058 ; N uni0271 ; G 563
U 626 ; WX 727 ; N uni0272 ; G 564
U 627 ; WX 727 ; N uni0273 ; G 565
U 628 ; WX 712 ; N uni0274 ; G 566
U 629 ; WX 667 ; N uni0275 ; G 567
U 630 ; WX 1061 ; N uni0276 ; G 568
U 631 ; WX 944 ; N uni0277 ; G 569
U 632 ; WX 797 ; N uni0278 ; G 570
U 633 ; WX 571 ; N uni0279 ; G 571
U 634 ; WX 571 ; N uni027A ; G 572
U 635 ; WX 571 ; N uni027B ; G 573
U 636 ; WX 527 ; N uni027C ; G 574
U 637 ; WX 527 ; N uni027D ; G 575
U 638 ; WX 452 ; N uni027E ; G 576
U 639 ; WX 487 ; N uni027F ; G 577
U 640 ; WX 694 ; N uni0280 ; G 578
U 641 ; WX 694 ; N uni0281 ; G 579
U 642 ; WX 563 ; N uni0282 ; G 580
U 643 ; WX 331 ; N uni0283 ; G 581
U 644 ; WX 430 ; N uni0284 ; G 582
U 645 ; WX 540 ; N uni0285 ; G 583
U 646 ; WX 331 ; N uni0286 ; G 584
U 647 ; WX 492 ; N uni0287 ; G 585
U 648 ; WX 462 ; N uni0288 ; G 586
U 649 ; WX 727 ; N uni0289 ; G 587
U 650 ; WX 679 ; N uni028A ; G 588
U 651 ; WX 694 ; N uni028B ; G 589
U 652 ; WX 641 ; N uni028C ; G 590
U 653 ; WX 907 ; N uni028D ; G 591
U 654 ; WX 635 ; N uni028E ; G 592
U 655 ; WX 727 ; N uni028F ; G 593
U 656 ; WX 568 ; N uni0290 ; G 594
U 657 ; WX 568 ; N uni0291 ; G 595
U 658 ; WX 568 ; N uni0292 ; G 596
U 659 ; WX 568 ; N uni0293 ; G 597
U 660 ; WX 551 ; N uni0294 ; G 598
U 661 ; WX 551 ; N uni0295 ; G 599
U 662 ; WX 551 ; N uni0296 ; G 600
U 663 ; WX 545 ; N uni0297 ; G 601
U 664 ; WX 871 ; N uni0298 ; G 602
U 665 ; WX 695 ; N uni0299 ; G 603
U 666 ; WX 714 ; N uni029A ; G 604
U 667 ; WX 689 ; N uni029B ; G 605
U 668 ; WX 732 ; N uni029C ; G 606
U 669 ; WX 384 ; N uni029D ; G 607
U 670 ; WX 740 ; N uni029E ; G 608
U 671 ; WX 617 ; N uni029F ; G 609
U 672 ; WX 699 ; N uni02A0 ; G 610
U 673 ; WX 551 ; N uni02A1 ; G 611
U 674 ; WX 551 ; N uni02A2 ; G 612
U 675 ; WX 1117 ; N uni02A3 ; G 613
U 676 ; WX 1179 ; N uni02A4 ; G 614
U 677 ; WX 1117 ; N uni02A5 ; G 615
U 678 ; WX 938 ; N uni02A6 ; G 616
U 679 ; WX 715 ; N uni02A7 ; G 617
U 680 ; WX 946 ; N uni02A8 ; G 618
U 681 ; WX 1039 ; N uni02A9 ; G 619
U 682 ; WX 870 ; N uni02AA ; G 620
U 683 ; WX 795 ; N uni02AB ; G 621
U 684 ; WX 662 ; N uni02AC ; G 622
U 685 ; WX 443 ; N uni02AD ; G 623
U 686 ; WX 613 ; N uni02AE ; G 624
U 687 ; WX 717 ; N uni02AF ; G 625
U 688 ; WX 521 ; N uni02B0 ; G 626
U 689 ; WX 519 ; N uni02B1 ; G 627
U 690 ; WX 313 ; N uni02B2 ; G 628
U 691 ; WX 414 ; N uni02B3 ; G 629
U 692 ; WX 414 ; N uni02B4 ; G 630
U 693 ; WX 480 ; N uni02B5 ; G 631
U 694 ; WX 527 ; N uni02B6 ; G 632
U 695 ; WX 662 ; N uni02B7 ; G 633
U 696 ; WX 485 ; N uni02B8 ; G 634
U 697 ; WX 302 ; N uni02B9 ; G 635
U 698 ; WX 521 ; N uni02BA ; G 636
U 699 ; WX 348 ; N uni02BB ; G 637
U 700 ; WX 348 ; N uni02BC ; G 638
U 701 ; WX 348 ; N uni02BD ; G 639
U 702 ; WX 366 ; N uni02BE ; G 640
U 703 ; WX 366 ; N uni02BF ; G 641
U 704 ; WX 313 ; N uni02C0 ; G 642
U 705 ; WX 313 ; N uni02C1 ; G 643
U 706 ; WX 500 ; N uni02C2 ; G 644
U 707 ; WX 500 ; N uni02C3 ; G 645
U 708 ; WX 500 ; N uni02C4 ; G 646
U 709 ; WX 500 ; N uni02C5 ; G 647
U 710 ; WX 500 ; N circumflex ; G 648
U 711 ; WX 500 ; N caron ; G 649
U 712 ; WX 282 ; N uni02C8 ; G 650
U 713 ; WX 500 ; N uni02C9 ; G 651
U 714 ; WX 500 ; N uni02CA ; G 652
U 715 ; WX 500 ; N uni02CB ; G 653
U 716 ; WX 282 ; N uni02CC ; G 654
U 717 ; WX 500 ; N uni02CD ; G 655
U 720 ; WX 369 ; N uni02D0 ; G 656
U 721 ; WX 369 ; N uni02D1 ; G 657
U 722 ; WX 366 ; N uni02D2 ; G 658
U 723 ; WX 366 ; N uni02D3 ; G 659
U 726 ; WX 392 ; N uni02D6 ; G 660
U 727 ; WX 392 ; N uni02D7 ; G 661
U 728 ; WX 500 ; N breve ; G 662
U 729 ; WX 500 ; N dotaccent ; G 663
U 730 ; WX 500 ; N ring ; G 664
U 731 ; WX 500 ; N ogonek ; G 665
U 732 ; WX 500 ; N tilde ; G 666
U 733 ; WX 500 ; N hungarumlaut ; G 667
U 734 ; WX 417 ; N uni02DE ; G 668
U 736 ; WX 378 ; N uni02E0 ; G 669
U 737 ; WX 292 ; N uni02E1 ; G 670
U 738 ; WX 395 ; N uni02E2 ; G 671
U 739 ; WX 475 ; N uni02E3 ; G 672
U 740 ; WX 313 ; N uni02E4 ; G 673
U 741 ; WX 500 ; N uni02E5 ; G 674
U 742 ; WX 500 ; N uni02E6 ; G 675
U 743 ; WX 500 ; N uni02E7 ; G 676
U 744 ; WX 500 ; N uni02E8 ; G 677
U 745 ; WX 500 ; N uni02E9 ; G 678
U 748 ; WX 500 ; N uni02EC ; G 679
U 750 ; WX 553 ; N uni02EE ; G 680
U 751 ; WX 500 ; N uni02EF ; G 681
U 752 ; WX 500 ; N uni02F0 ; G 682
U 755 ; WX 500 ; N uni02F3 ; G 683
U 759 ; WX 500 ; N uni02F7 ; G 684
U 768 ; WX 0 ; N gravecomb ; G 685
U 769 ; WX 0 ; N acutecomb ; G 686
U 770 ; WX 0 ; N uni0302 ; G 687
U 771 ; WX 0 ; N tildecomb ; G 688
U 772 ; WX 0 ; N uni0304 ; G 689
U 773 ; WX 0 ; N uni0305 ; G 690
U 774 ; WX 0 ; N uni0306 ; G 691
U 775 ; WX 0 ; N uni0307 ; G 692
U 776 ; WX 0 ; N uni0308 ; G 693
U 777 ; WX 0 ; N hookabovecomb ; G 694
U 778 ; WX 0 ; N uni030A ; G 695
U 779 ; WX 0 ; N uni030B ; G 696
U 780 ; WX 0 ; N uni030C ; G 697
U 781 ; WX 0 ; N uni030D ; G 698
U 782 ; WX 0 ; N uni030E ; G 699
U 783 ; WX 0 ; N uni030F ; G 700
U 784 ; WX 0 ; N uni0310 ; G 701
U 785 ; WX 0 ; N uni0311 ; G 702
U 786 ; WX 0 ; N uni0312 ; G 703
U 787 ; WX 0 ; N uni0313 ; G 704
U 788 ; WX 0 ; N uni0314 ; G 705
U 789 ; WX 0 ; N uni0315 ; G 706
U 790 ; WX 0 ; N uni0316 ; G 707
U 791 ; WX 0 ; N uni0317 ; G 708
U 792 ; WX 0 ; N uni0318 ; G 709
U 793 ; WX 0 ; N uni0319 ; G 710
U 794 ; WX 0 ; N uni031A ; G 711
U 795 ; WX 0 ; N uni031B ; G 712
U 796 ; WX 0 ; N uni031C ; G 713
U 797 ; WX 0 ; N uni031D ; G 714
U 798 ; WX 0 ; N uni031E ; G 715
U 799 ; WX 0 ; N uni031F ; G 716
U 800 ; WX 0 ; N uni0320 ; G 717
U 801 ; WX 0 ; N uni0321 ; G 718
U 802 ; WX 0 ; N uni0322 ; G 719
U 803 ; WX 0 ; N dotbelowcomb ; G 720
U 804 ; WX 0 ; N uni0324 ; G 721
U 805 ; WX 0 ; N uni0325 ; G 722
U 806 ; WX 0 ; N uni0326 ; G 723
U 807 ; WX 0 ; N uni0327 ; G 724
U 808 ; WX 0 ; N uni0328 ; G 725
U 809 ; WX 0 ; N uni0329 ; G 726
U 810 ; WX 0 ; N uni032A ; G 727
U 811 ; WX 0 ; N uni032B ; G 728
U 812 ; WX 0 ; N uni032C ; G 729
U 813 ; WX 0 ; N uni032D ; G 730
U 814 ; WX 0 ; N uni032E ; G 731
U 815 ; WX 0 ; N uni032F ; G 732
U 816 ; WX 0 ; N uni0330 ; G 733
U 817 ; WX 0 ; N uni0331 ; G 734
U 818 ; WX 0 ; N uni0332 ; G 735
U 819 ; WX 0 ; N uni0333 ; G 736
U 820 ; WX 0 ; N uni0334 ; G 737
U 821 ; WX 0 ; N uni0335 ; G 738
U 822 ; WX 0 ; N uni0336 ; G 739
U 823 ; WX 0 ; N uni0337 ; G 740
U 824 ; WX 0 ; N uni0338 ; G 741
U 825 ; WX 0 ; N uni0339 ; G 742
U 826 ; WX 0 ; N uni033A ; G 743
U 827 ; WX 0 ; N uni033B ; G 744
U 828 ; WX 0 ; N uni033C ; G 745
U 829 ; WX 0 ; N uni033D ; G 746
U 830 ; WX 0 ; N uni033E ; G 747
U 831 ; WX 0 ; N uni033F ; G 748
U 835 ; WX 0 ; N uni0343 ; G 749
U 847 ; WX 0 ; N uni034F ; G 750
U 856 ; WX 0 ; N uni0358 ; G 751
U 864 ; WX 0 ; N uni0360 ; G 752
U 865 ; WX 0 ; N uni0361 ; G 753
U 880 ; WX 779 ; N uni0370 ; G 754
U 881 ; WX 576 ; N uni0371 ; G 755
U 882 ; WX 803 ; N uni0372 ; G 756
U 883 ; WX 777 ; N uni0373 ; G 757
U 884 ; WX 302 ; N uni0374 ; G 758
U 885 ; WX 302 ; N uni0375 ; G 759
U 886 ; WX 963 ; N uni0376 ; G 760
U 887 ; WX 737 ; N uni0377 ; G 761
U 890 ; WX 500 ; N uni037A ; G 762
U 891 ; WX 609 ; N uni037B ; G 763
U 892 ; WX 609 ; N uni037C ; G 764
U 893 ; WX 609 ; N uni037D ; G 765
U 894 ; WX 369 ; N uni037E ; G 766
U 895 ; WX 473 ; N uni037F ; G 767
U 900 ; WX 500 ; N tonos ; G 768
U 901 ; WX 500 ; N dieresistonos ; G 769
U 902 ; WX 776 ; N Alphatonos ; G 770
U 903 ; WX 348 ; N anoteleia ; G 771
U 904 ; WX 947 ; N Epsilontonos ; G 772
U 905 ; WX 1118 ; N Etatonos ; G 773
U 906 ; WX 662 ; N Iotatonos ; G 774
U 908 ; WX 887 ; N Omicrontonos ; G 775
U 910 ; WX 953 ; N Upsilontonos ; G 776
U 911 ; WX 911 ; N Omegatonos ; G 777
U 912 ; WX 484 ; N iotadieresistonos ; G 778
U 913 ; WX 776 ; N Alpha ; G 779
U 914 ; WX 845 ; N Beta ; G 780
U 915 ; WX 710 ; N Gamma ; G 781
U 916 ; WX 776 ; N uni0394 ; G 782
U 917 ; WX 762 ; N Epsilon ; G 783
U 918 ; WX 730 ; N Zeta ; G 784
U 919 ; WX 945 ; N Eta ; G 785
U 920 ; WX 871 ; N Theta ; G 786
U 921 ; WX 468 ; N Iota ; G 787
U 922 ; WX 869 ; N Kappa ; G 788
U 923 ; WX 776 ; N Lambda ; G 789
U 924 ; WX 1107 ; N Mu ; G 790
U 925 ; WX 914 ; N Nu ; G 791
U 926 ; WX 704 ; N Xi ; G 792
U 927 ; WX 871 ; N Omicron ; G 793
U 928 ; WX 944 ; N Pi ; G 794
U 929 ; WX 752 ; N Rho ; G 795
U 931 ; WX 707 ; N Sigma ; G 796
U 932 ; WX 744 ; N Tau ; G 797
U 933 ; WX 714 ; N Upsilon ; G 798
U 934 ; WX 871 ; N Phi ; G 799
U 935 ; WX 776 ; N Chi ; G 800
U 936 ; WX 913 ; N Psi ; G 801
U 937 ; WX 890 ; N Omega ; G 802
U 938 ; WX 468 ; N Iotadieresis ; G 803
U 939 ; WX 714 ; N Upsilondieresis ; G 804
U 940 ; WX 770 ; N alphatonos ; G 805
U 941 ; WX 608 ; N epsilontonos ; G 806
U 942 ; WX 727 ; N etatonos ; G 807
U 943 ; WX 484 ; N iotatonos ; G 808
U 944 ; WX 694 ; N upsilondieresistonos ; G 809
U 945 ; WX 770 ; N alpha ; G 810
U 946 ; WX 664 ; N beta ; G 811
U 947 ; WX 660 ; N gamma ; G 812
U 948 ; WX 667 ; N delta ; G 813
U 949 ; WX 608 ; N epsilon ; G 814
U 950 ; WX 592 ; N zeta ; G 815
U 951 ; WX 727 ; N eta ; G 816
U 952 ; WX 667 ; N theta ; G 817
U 953 ; WX 484 ; N iota ; G 818
U 954 ; WX 750 ; N kappa ; G 819
U 955 ; WX 701 ; N lambda ; G 820
U 956 ; WX 732 ; N uni03BC ; G 821
U 957 ; WX 694 ; N nu ; G 822
U 958 ; WX 592 ; N xi ; G 823
U 959 ; WX 667 ; N omicron ; G 824
U 960 ; WX 732 ; N pi ; G 825
U 961 ; WX 665 ; N rho ; G 826
U 962 ; WX 609 ; N sigma1 ; G 827
U 963 ; WX 737 ; N sigma ; G 828
U 964 ; WX 673 ; N tau ; G 829
U 965 ; WX 694 ; N upsilon ; G 830
U 966 ; WX 905 ; N phi ; G 831
U 967 ; WX 658 ; N chi ; G 832
U 968 ; WX 941 ; N psi ; G 833
U 969 ; WX 952 ; N omega ; G 834
U 970 ; WX 484 ; N iotadieresis ; G 835
U 971 ; WX 694 ; N upsilondieresis ; G 836
U 972 ; WX 667 ; N omicrontonos ; G 837
U 973 ; WX 694 ; N upsilontonos ; G 838
U 974 ; WX 952 ; N omegatonos ; G 839
U 975 ; WX 869 ; N uni03CF ; G 840
U 976 ; WX 667 ; N uni03D0 ; G 841
U 977 ; WX 849 ; N theta1 ; G 842
U 978 ; WX 764 ; N Upsilon1 ; G 843
U 979 ; WX 969 ; N uni03D3 ; G 844
U 980 ; WX 764 ; N uni03D4 ; G 845
U 981 ; WX 941 ; N phi1 ; G 846
U 982 ; WX 952 ; N omega1 ; G 847
U 983 ; WX 655 ; N uni03D7 ; G 848
U 984 ; WX 871 ; N uni03D8 ; G 849
U 985 ; WX 667 ; N uni03D9 ; G 850
U 986 ; WX 796 ; N uni03DA ; G 851
U 987 ; WX 609 ; N uni03DB ; G 852
U 988 ; WX 710 ; N uni03DC ; G 853
U 989 ; WX 527 ; N uni03DD ; G 854
U 990 ; WX 590 ; N uni03DE ; G 855
U 991 ; WX 660 ; N uni03DF ; G 856
U 992 ; WX 796 ; N uni03E0 ; G 857
U 993 ; WX 667 ; N uni03E1 ; G 858
U 1008 ; WX 655 ; N uni03F0 ; G 859
U 1009 ; WX 665 ; N uni03F1 ; G 860
U 1010 ; WX 609 ; N uni03F2 ; G 861
U 1011 ; WX 362 ; N uni03F3 ; G 862
U 1012 ; WX 871 ; N uni03F4 ; G 863
U 1013 ; WX 609 ; N uni03F5 ; G 864
U 1014 ; WX 609 ; N uni03F6 ; G 865
U 1015 ; WX 757 ; N uni03F7 ; G 866
U 1016 ; WX 699 ; N uni03F8 ; G 867
U 1017 ; WX 796 ; N uni03F9 ; G 868
U 1018 ; WX 1107 ; N uni03FA ; G 869
U 1019 ; WX 860 ; N uni03FB ; G 870
U 1020 ; WX 692 ; N uni03FC ; G 871
U 1021 ; WX 796 ; N uni03FD ; G 872
U 1022 ; WX 796 ; N uni03FE ; G 873
U 1023 ; WX 796 ; N uni03FF ; G 874
U 1024 ; WX 762 ; N uni0400 ; G 875
U 1025 ; WX 762 ; N uni0401 ; G 876
U 1026 ; WX 901 ; N uni0402 ; G 877
U 1027 ; WX 690 ; N uni0403 ; G 878
U 1028 ; WX 795 ; N uni0404 ; G 879
U 1029 ; WX 722 ; N uni0405 ; G 880
U 1030 ; WX 468 ; N uni0406 ; G 881
U 1031 ; WX 468 ; N uni0407 ; G 882
U 1032 ; WX 473 ; N uni0408 ; G 883
U 1033 ; WX 1202 ; N uni0409 ; G 884
U 1034 ; WX 1262 ; N uni040A ; G 885
U 1035 ; WX 963 ; N uni040B ; G 886
U 1036 ; WX 910 ; N uni040C ; G 887
U 1037 ; WX 945 ; N uni040D ; G 888
U 1038 ; WX 812 ; N uni040E ; G 889
U 1039 ; WX 945 ; N uni040F ; G 890
U 1040 ; WX 814 ; N uni0410 ; G 891
U 1041 ; WX 854 ; N uni0411 ; G 892
U 1042 ; WX 845 ; N uni0412 ; G 893
U 1043 ; WX 690 ; N uni0413 ; G 894
U 1044 ; WX 889 ; N uni0414 ; G 895
U 1045 ; WX 762 ; N uni0415 ; G 896
U 1046 ; WX 1312 ; N uni0416 ; G 897
U 1047 ; WX 721 ; N uni0417 ; G 898
U 1048 ; WX 945 ; N uni0418 ; G 899
U 1049 ; WX 945 ; N uni0419 ; G 900
U 1050 ; WX 910 ; N uni041A ; G 901
U 1051 ; WX 884 ; N uni041B ; G 902
U 1052 ; WX 1107 ; N uni041C ; G 903
U 1053 ; WX 945 ; N uni041D ; G 904
U 1054 ; WX 871 ; N uni041E ; G 905
U 1055 ; WX 944 ; N uni041F ; G 906
U 1056 ; WX 752 ; N uni0420 ; G 907
U 1057 ; WX 796 ; N uni0421 ; G 908
U 1058 ; WX 744 ; N uni0422 ; G 909
U 1059 ; WX 812 ; N uni0423 ; G 910
U 1060 ; WX 949 ; N uni0424 ; G 911
U 1061 ; WX 776 ; N uni0425 ; G 912
U 1062 ; WX 966 ; N uni0426 ; G 913
U 1063 ; WX 913 ; N uni0427 ; G 914
U 1064 ; WX 1268 ; N uni0428 ; G 915
U 1065 ; WX 1293 ; N uni0429 ; G 916
U 1066 ; WX 957 ; N uni042A ; G 917
U 1067 ; WX 1202 ; N uni042B ; G 918
U 1068 ; WX 825 ; N uni042C ; G 919
U 1069 ; WX 795 ; N uni042D ; G 920
U 1070 ; WX 1287 ; N uni042E ; G 921
U 1071 ; WX 882 ; N uni042F ; G 922
U 1072 ; WX 648 ; N uni0430 ; G 923
U 1073 ; WX 667 ; N uni0431 ; G 924
U 1074 ; WX 695 ; N uni0432 ; G 925
U 1075 ; WX 613 ; N uni0433 ; G 926
U 1076 ; WX 667 ; N uni0434 ; G 927
U 1077 ; WX 636 ; N uni0435 ; G 928
U 1078 ; WX 1010 ; N uni0436 ; G 929
U 1079 ; WX 638 ; N uni0437 ; G 930
U 1080 ; WX 742 ; N uni0438 ; G 931
U 1081 ; WX 742 ; N uni0439 ; G 932
U 1082 ; WX 722 ; N uni043A ; G 933
U 1083 ; WX 705 ; N uni043B ; G 934
U 1084 ; WX 869 ; N uni043C ; G 935
U 1085 ; WX 732 ; N uni043D ; G 936
U 1086 ; WX 667 ; N uni043E ; G 937
U 1087 ; WX 732 ; N uni043F ; G 938
U 1088 ; WX 699 ; N uni0440 ; G 939
U 1089 ; WX 609 ; N uni0441 ; G 940
U 1090 ; WX 620 ; N uni0442 ; G 941
U 1091 ; WX 640 ; N uni0443 ; G 942
U 1092 ; WX 902 ; N uni0444 ; G 943
U 1093 ; WX 596 ; N uni0445 ; G 944
U 1094 ; WX 739 ; N uni0446 ; G 945
U 1095 ; WX 732 ; N uni0447 ; G 946
U 1096 ; WX 1075 ; N uni0448 ; G 947
U 1097 ; WX 1082 ; N uni0449 ; G 948
U 1098 ; WX 767 ; N uni044A ; G 949
U 1099 ; WX 1002 ; N uni044B ; G 950
U 1100 ; WX 679 ; N uni044C ; G 951
U 1101 ; WX 609 ; N uni044D ; G 952
U 1102 ; WX 1025 ; N uni044E ; G 953
U 1103 ; WX 739 ; N uni044F ; G 954
U 1104 ; WX 636 ; N uni0450 ; G 955
U 1105 ; WX 636 ; N uni0451 ; G 956
U 1106 ; WX 719 ; N uni0452 ; G 957
U 1107 ; WX 613 ; N uni0453 ; G 958
U 1108 ; WX 609 ; N uni0454 ; G 959
U 1109 ; WX 563 ; N uni0455 ; G 960
U 1110 ; WX 380 ; N uni0456 ; G 961
U 1111 ; WX 380 ; N uni0457 ; G 962
U 1112 ; WX 362 ; N uni0458 ; G 963
U 1113 ; WX 988 ; N uni0459 ; G 964
U 1114 ; WX 1015 ; N uni045A ; G 965
U 1115 ; WX 727 ; N uni045B ; G 966
U 1116 ; WX 722 ; N uni045C ; G 967
U 1117 ; WX 742 ; N uni045D ; G 968
U 1118 ; WX 640 ; N uni045E ; G 969
U 1119 ; WX 732 ; N uni045F ; G 970
U 1122 ; WX 880 ; N uni0462 ; G 971
U 1123 ; WX 703 ; N uni0463 ; G 972
U 1124 ; WX 1195 ; N uni0464 ; G 973
U 1125 ; WX 963 ; N uni0465 ; G 974
U 1130 ; WX 1312 ; N uni046A ; G 975
U 1131 ; WX 1010 ; N uni046B ; G 976
U 1132 ; WX 1630 ; N uni046C ; G 977
U 1133 ; WX 1297 ; N uni046D ; G 978
U 1136 ; WX 1096 ; N uni0470 ; G 979
U 1137 ; WX 1105 ; N uni0471 ; G 980
U 1138 ; WX 871 ; N uni0472 ; G 981
U 1139 ; WX 652 ; N uni0473 ; G 982
U 1140 ; WX 916 ; N uni0474 ; G 983
U 1141 ; WX 749 ; N uni0475 ; G 984
U 1142 ; WX 916 ; N uni0476 ; G 985
U 1143 ; WX 749 ; N uni0477 ; G 986
U 1164 ; WX 846 ; N uni048C ; G 987
U 1165 ; WX 673 ; N uni048D ; G 988
U 1168 ; WX 700 ; N uni0490 ; G 989
U 1169 ; WX 618 ; N uni0491 ; G 990
U 1170 ; WX 690 ; N uni0492 ; G 991
U 1171 ; WX 613 ; N uni0493 ; G 992
U 1172 ; WX 868 ; N uni0494 ; G 993
U 1173 ; WX 716 ; N uni0495 ; G 994
U 1174 ; WX 1312 ; N uni0496 ; G 995
U 1175 ; WX 1010 ; N uni0497 ; G 996
U 1176 ; WX 721 ; N uni0498 ; G 997
U 1177 ; WX 638 ; N uni0499 ; G 998
U 1178 ; WX 947 ; N uni049A ; G 999
U 1179 ; WX 744 ; N uni049B ; G 1000
U 1182 ; WX 910 ; N uni049E ; G 1001
U 1183 ; WX 722 ; N uni049F ; G 1002
U 1184 ; WX 1041 ; N uni04A0 ; G 1003
U 1185 ; WX 827 ; N uni04A1 ; G 1004
U 1186 ; WX 966 ; N uni04A2 ; G 1005
U 1187 ; WX 739 ; N uni04A3 ; G 1006
U 1188 ; WX 1167 ; N uni04A4 ; G 1007
U 1189 ; WX 956 ; N uni04A5 ; G 1008
U 1190 ; WX 1345 ; N uni04A6 ; G 1009
U 1191 ; WX 1059 ; N uni04A7 ; G 1010
U 1194 ; WX 796 ; N uni04AA ; G 1011
U 1195 ; WX 609 ; N uni04AB ; G 1012
U 1196 ; WX 744 ; N uni04AC ; G 1013
U 1197 ; WX 620 ; N uni04AD ; G 1014
U 1198 ; WX 714 ; N uni04AE ; G 1015
U 1199 ; WX 581 ; N uni04AF ; G 1016
U 1200 ; WX 714 ; N uni04B0 ; G 1017
U 1201 ; WX 581 ; N uni04B1 ; G 1018
U 1202 ; WX 866 ; N uni04B2 ; G 1019
U 1203 ; WX 649 ; N uni04B3 ; G 1020
U 1204 ; WX 1022 ; N uni04B4 ; G 1021
U 1205 ; WX 807 ; N uni04B5 ; G 1022
U 1206 ; WX 928 ; N uni04B6 ; G 1023
U 1207 ; WX 739 ; N uni04B7 ; G 1024
U 1210 ; WX 910 ; N uni04BA ; G 1025
U 1211 ; WX 727 ; N uni04BB ; G 1026
U 1216 ; WX 468 ; N uni04C0 ; G 1027
U 1217 ; WX 1312 ; N uni04C1 ; G 1028
U 1218 ; WX 1010 ; N uni04C2 ; G 1029
U 1219 ; WX 869 ; N uni04C3 ; G 1030
U 1220 ; WX 693 ; N uni04C4 ; G 1031
U 1223 ; WX 945 ; N uni04C7 ; G 1032
U 1224 ; WX 732 ; N uni04C8 ; G 1033
U 1227 ; WX 913 ; N uni04CB ; G 1034
U 1228 ; WX 732 ; N uni04CC ; G 1035
U 1231 ; WX 380 ; N uni04CF ; G 1036
U 1232 ; WX 814 ; N uni04D0 ; G 1037
U 1233 ; WX 648 ; N uni04D1 ; G 1038
U 1234 ; WX 814 ; N uni04D2 ; G 1039
U 1235 ; WX 648 ; N uni04D3 ; G 1040
U 1236 ; WX 1034 ; N uni04D4 ; G 1041
U 1237 ; WX 975 ; N uni04D5 ; G 1042
U 1238 ; WX 762 ; N uni04D6 ; G 1043
U 1239 ; WX 636 ; N uni04D7 ; G 1044
U 1240 ; WX 871 ; N uni04D8 ; G 1045
U 1241 ; WX 636 ; N uni04D9 ; G 1046
U 1242 ; WX 871 ; N uni04DA ; G 1047
U 1243 ; WX 636 ; N uni04DB ; G 1048
U 1244 ; WX 1312 ; N uni04DC ; G 1049
U 1245 ; WX 1010 ; N uni04DD ; G 1050
U 1246 ; WX 721 ; N uni04DE ; G 1051
U 1247 ; WX 638 ; N uni04DF ; G 1052
U 1248 ; WX 657 ; N uni04E0 ; G 1053
U 1249 ; WX 568 ; N uni04E1 ; G 1054
U 1250 ; WX 945 ; N uni04E2 ; G 1055
U 1251 ; WX 742 ; N uni04E3 ; G 1056
U 1252 ; WX 945 ; N uni04E4 ; G 1057
U 1253 ; WX 742 ; N uni04E5 ; G 1058
U 1254 ; WX 871 ; N uni04E6 ; G 1059
U 1255 ; WX 667 ; N uni04E7 ; G 1060
U 1256 ; WX 871 ; N uni04E8 ; G 1061
U 1257 ; WX 667 ; N uni04E9 ; G 1062
U 1258 ; WX 871 ; N uni04EA ; G 1063
U 1259 ; WX 667 ; N uni04EB ; G 1064
U 1260 ; WX 795 ; N uni04EC ; G 1065
U 1261 ; WX 609 ; N uni04ED ; G 1066
U 1262 ; WX 812 ; N uni04EE ; G 1067
U 1263 ; WX 640 ; N uni04EF ; G 1068
U 1264 ; WX 812 ; N uni04F0 ; G 1069
U 1265 ; WX 640 ; N uni04F1 ; G 1070
U 1266 ; WX 812 ; N uni04F2 ; G 1071
U 1267 ; WX 640 ; N uni04F3 ; G 1072
U 1268 ; WX 913 ; N uni04F4 ; G 1073
U 1269 ; WX 732 ; N uni04F5 ; G 1074
U 1270 ; WX 690 ; N uni04F6 ; G 1075
U 1271 ; WX 613 ; N uni04F7 ; G 1076
U 1272 ; WX 1202 ; N uni04F8 ; G 1077
U 1273 ; WX 1002 ; N uni04F9 ; G 1078
U 1296 ; WX 721 ; N uni0510 ; G 1079
U 1297 ; WX 638 ; N uni0511 ; G 1080
U 1298 ; WX 884 ; N uni0512 ; G 1081
U 1299 ; WX 705 ; N uni0513 ; G 1082
U 1300 ; WX 1248 ; N uni0514 ; G 1083
U 1301 ; WX 945 ; N uni0515 ; G 1084
U 1306 ; WX 820 ; N uni051A ; G 1085
U 1307 ; WX 640 ; N uni051B ; G 1086
U 1308 ; WX 1028 ; N uni051C ; G 1087
U 1309 ; WX 856 ; N uni051D ; G 1088
U 1329 ; WX 942 ; N uni0531 ; G 1089
U 1330 ; WX 832 ; N uni0532 ; G 1090
U 1331 ; WX 894 ; N uni0533 ; G 1091
U 1332 ; WX 909 ; N uni0534 ; G 1092
U 1333 ; WX 822 ; N uni0535 ; G 1093
U 1334 ; WX 821 ; N uni0536 ; G 1094
U 1335 ; WX 747 ; N uni0537 ; G 1095
U 1336 ; WX 832 ; N uni0538 ; G 1096
U 1337 ; WX 1125 ; N uni0539 ; G 1097
U 1338 ; WX 894 ; N uni053A ; G 1098
U 1339 ; WX 803 ; N uni053B ; G 1099
U 1340 ; WX 722 ; N uni053C ; G 1100
U 1341 ; WX 1188 ; N uni053D ; G 1101
U 1342 ; WX 887 ; N uni053E ; G 1102
U 1343 ; WX 842 ; N uni053F ; G 1103
U 1344 ; WX 737 ; N uni0540 ; G 1104
U 1345 ; WX 863 ; N uni0541 ; G 1105
U 1346 ; WX 918 ; N uni0542 ; G 1106
U 1347 ; WX 851 ; N uni0543 ; G 1107
U 1348 ; WX 977 ; N uni0544 ; G 1108
U 1349 ; WX 833 ; N uni0545 ; G 1109
U 1350 ; WX 914 ; N uni0546 ; G 1110
U 1351 ; WX 843 ; N uni0547 ; G 1111
U 1352 ; WX 871 ; N uni0548 ; G 1112
U 1353 ; WX 818 ; N uni0549 ; G 1113
U 1354 ; WX 1034 ; N uni054A ; G 1114
U 1355 ; WX 846 ; N uni054B ; G 1115
U 1356 ; WX 964 ; N uni054C ; G 1116
U 1357 ; WX 871 ; N uni054D ; G 1117
U 1358 ; WX 914 ; N uni054E ; G 1118
U 1359 ; WX 808 ; N uni054F ; G 1119
U 1360 ; WX 808 ; N uni0550 ; G 1120
U 1361 ; WX 836 ; N uni0551 ; G 1121
U 1362 ; WX 710 ; N uni0552 ; G 1122
U 1363 ; WX 955 ; N uni0553 ; G 1123
U 1364 ; WX 891 ; N uni0554 ; G 1124
U 1365 ; WX 871 ; N uni0555 ; G 1125
U 1366 ; WX 963 ; N uni0556 ; G 1126
U 1369 ; WX 307 ; N uni0559 ; G 1127
U 1370 ; WX 264 ; N uni055A ; G 1128
U 1371 ; WX 293 ; N uni055B ; G 1129
U 1372 ; WX 391 ; N uni055C ; G 1130
U 1373 ; WX 323 ; N uni055D ; G 1131
U 1374 ; WX 439 ; N uni055E ; G 1132
U 1375 ; WX 500 ; N uni055F ; G 1133
U 1377 ; WX 1055 ; N uni0561 ; G 1134
U 1378 ; WX 695 ; N uni0562 ; G 1135
U 1379 ; WX 776 ; N uni0563 ; G 1136
U 1380 ; WX 801 ; N uni0564 ; G 1137
U 1381 ; WX 729 ; N uni0565 ; G 1138
U 1382 ; WX 742 ; N uni0566 ; G 1139
U 1383 ; WX 599 ; N uni0567 ; G 1140
U 1384 ; WX 733 ; N uni0568 ; G 1141
U 1385 ; WX 909 ; N uni0569 ; G 1142
U 1386 ; WX 768 ; N uni056A ; G 1143
U 1387 ; WX 724 ; N uni056B ; G 1144
U 1388 ; WX 398 ; N uni056C ; G 1145
U 1389 ; WX 1087 ; N uni056D ; G 1146
U 1390 ; WX 695 ; N uni056E ; G 1147
U 1391 ; WX 719 ; N uni056F ; G 1148
U 1392 ; WX 737 ; N uni0570 ; G 1149
U 1393 ; WX 684 ; N uni0571 ; G 1150
U 1394 ; WX 738 ; N uni0572 ; G 1151
U 1395 ; WX 703 ; N uni0573 ; G 1152
U 1396 ; WX 724 ; N uni0574 ; G 1153
U 1397 ; WX 359 ; N uni0575 ; G 1154
U 1398 ; WX 719 ; N uni0576 ; G 1155
U 1399 ; WX 496 ; N uni0577 ; G 1156
U 1400 ; WX 738 ; N uni0578 ; G 1157
U 1401 ; WX 428 ; N uni0579 ; G 1158
U 1402 ; WX 1059 ; N uni057A ; G 1159
U 1403 ; WX 668 ; N uni057B ; G 1160
U 1404 ; WX 744 ; N uni057C ; G 1161
U 1405 ; WX 724 ; N uni057D ; G 1162
U 1406 ; WX 724 ; N uni057E ; G 1163
U 1407 ; WX 1040 ; N uni057F ; G 1164
U 1408 ; WX 724 ; N uni0580 ; G 1165
U 1409 ; WX 713 ; N uni0581 ; G 1166
U 1410 ; WX 493 ; N uni0582 ; G 1167
U 1411 ; WX 1040 ; N uni0583 ; G 1168
U 1412 ; WX 734 ; N uni0584 ; G 1169
U 1413 ; WX 693 ; N uni0585 ; G 1170
U 1414 ; WX 956 ; N uni0586 ; G 1171
U 1415 ; WX 833 ; N uni0587 ; G 1172
U 1417 ; WX 340 ; N uni0589 ; G 1173
U 1418 ; WX 388 ; N uni058A ; G 1174
U 3647 ; WX 696 ; N uni0E3F ; G 1175
U 4256 ; WX 755 ; N uni10A0 ; G 1176
U 4257 ; WX 936 ; N uni10A1 ; G 1177
U 4258 ; WX 866 ; N uni10A2 ; G 1178
U 4259 ; WX 874 ; N uni10A3 ; G 1179
U 4260 ; WX 781 ; N uni10A4 ; G 1180
U 4261 ; WX 1078 ; N uni10A5 ; G 1181
U 4262 ; WX 1014 ; N uni10A6 ; G 1182
U 4263 ; WX 1213 ; N uni10A7 ; G 1183
U 4264 ; WX 643 ; N uni10A8 ; G 1184
U 4265 ; WX 818 ; N uni10A9 ; G 1185
U 4266 ; WX 1051 ; N uni10AA ; G 1186
U 4267 ; WX 1051 ; N uni10AB ; G 1187
U 4268 ; WX 796 ; N uni10AC ; G 1188
U 4269 ; WX 1135 ; N uni10AD ; G 1189
U 4270 ; WX 969 ; N uni10AE ; G 1190
U 4271 ; WX 902 ; N uni10AF ; G 1191
U 4272 ; WX 1109 ; N uni10B0 ; G 1192
U 4273 ; WX 792 ; N uni10B1 ; G 1193
U 4274 ; WX 756 ; N uni10B2 ; G 1194
U 4275 ; WX 1076 ; N uni10B3 ; G 1195
U 4276 ; WX 976 ; N uni10B4 ; G 1196
U 4277 ; WX 1066 ; N uni10B5 ; G 1197
U 4278 ; WX 811 ; N uni10B6 ; G 1198
U 4279 ; WX 833 ; N uni10B7 ; G 1199
U 4280 ; WX 821 ; N uni10B8 ; G 1200
U 4281 ; WX 833 ; N uni10B9 ; G 1201
U 4282 ; WX 908 ; N uni10BA ; G 1202
U 4283 ; WX 1077 ; N uni10BB ; G 1203
U 4284 ; WX 769 ; N uni10BC ; G 1204
U 4285 ; WX 822 ; N uni10BD ; G 1205
U 4286 ; WX 813 ; N uni10BE ; G 1206
U 4287 ; WX 1111 ; N uni10BF ; G 1207
U 4288 ; WX 1123 ; N uni10C0 ; G 1208
U 4289 ; WX 802 ; N uni10C1 ; G 1209
U 4290 ; WX 892 ; N uni10C2 ; G 1210
U 4291 ; WX 802 ; N uni10C3 ; G 1211
U 4292 ; WX 880 ; N uni10C4 ; G 1212
U 4293 ; WX 1063 ; N uni10C5 ; G 1213
U 4304 ; WX 594 ; N uni10D0 ; G 1214
U 4305 ; WX 625 ; N uni10D1 ; G 1215
U 4306 ; WX 643 ; N uni10D2 ; G 1216
U 4307 ; WX 887 ; N uni10D3 ; G 1217
U 4308 ; WX 615 ; N uni10D4 ; G 1218
U 4309 ; WX 611 ; N uni10D5 ; G 1219
U 4310 ; WX 667 ; N uni10D6 ; G 1220
U 4311 ; WX 915 ; N uni10D7 ; G 1221
U 4312 ; WX 613 ; N uni10D8 ; G 1222
U 4313 ; WX 600 ; N uni10D9 ; G 1223
U 4314 ; WX 1120 ; N uni10DA ; G 1224
U 4315 ; WX 640 ; N uni10DB ; G 1225
U 4316 ; WX 640 ; N uni10DC ; G 1226
U 4317 ; WX 879 ; N uni10DD ; G 1227
U 4318 ; WX 624 ; N uni10DE ; G 1228
U 4319 ; WX 634 ; N uni10DF ; G 1229
U 4320 ; WX 877 ; N uni10E0 ; G 1230
U 4321 ; WX 666 ; N uni10E1 ; G 1231
U 4322 ; WX 780 ; N uni10E2 ; G 1232
U 4323 ; WX 751 ; N uni10E3 ; G 1233
U 4324 ; WX 869 ; N uni10E4 ; G 1234
U 4325 ; WX 639 ; N uni10E5 ; G 1235
U 4326 ; WX 912 ; N uni10E6 ; G 1236
U 4327 ; WX 622 ; N uni10E7 ; G 1237
U 4328 ; WX 647 ; N uni10E8 ; G 1238
U 4329 ; WX 640 ; N uni10E9 ; G 1239
U 4330 ; WX 729 ; N uni10EA ; G 1240
U 4331 ; WX 641 ; N uni10EB ; G 1241
U 4332 ; WX 630 ; N uni10EC ; G 1242
U 4333 ; WX 629 ; N uni10ED ; G 1243
U 4334 ; WX 670 ; N uni10EE ; G 1244
U 4335 ; WX 753 ; N uni10EF ; G 1245
U 4336 ; WX 625 ; N uni10F0 ; G 1246
U 4337 ; WX 657 ; N uni10F1 ; G 1247
U 4338 ; WX 625 ; N uni10F2 ; G 1248
U 4339 ; WX 625 ; N uni10F3 ; G 1249
U 4340 ; WX 624 ; N uni10F4 ; G 1250
U 4341 ; WX 670 ; N uni10F5 ; G 1251
U 4342 ; WX 940 ; N uni10F6 ; G 1252
U 4343 ; WX 680 ; N uni10F7 ; G 1253
U 4344 ; WX 636 ; N uni10F8 ; G 1254
U 4345 ; WX 672 ; N uni10F9 ; G 1255
U 4346 ; WX 625 ; N uni10FA ; G 1256
U 4347 ; WX 588 ; N uni10FB ; G 1257
U 4348 ; WX 354 ; N uni10FC ; G 1258
U 7424 ; WX 641 ; N uni1D00 ; G 1259
U 7425 ; WX 892 ; N uni1D01 ; G 1260
U 7426 ; WX 940 ; N uni1D02 ; G 1261
U 7427 ; WX 695 ; N uni1D03 ; G 1262
U 7428 ; WX 609 ; N uni1D04 ; G 1263
U 7429 ; WX 675 ; N uni1D05 ; G 1264
U 7430 ; WX 675 ; N uni1D06 ; G 1265
U 7431 ; WX 617 ; N uni1D07 ; G 1266
U 7432 ; WX 509 ; N uni1D08 ; G 1267
U 7433 ; WX 320 ; N uni1D09 ; G 1268
U 7434 ; WX 561 ; N uni1D0A ; G 1269
U 7435 ; WX 722 ; N uni1D0B ; G 1270
U 7436 ; WX 617 ; N uni1D0C ; G 1271
U 7437 ; WX 869 ; N uni1D0D ; G 1272
U 7438 ; WX 737 ; N uni1D0E ; G 1273
U 7439 ; WX 667 ; N uni1D0F ; G 1274
U 7440 ; WX 609 ; N uni1D10 ; G 1275
U 7441 ; WX 628 ; N uni1D11 ; G 1276
U 7442 ; WX 628 ; N uni1D12 ; G 1277
U 7443 ; WX 667 ; N uni1D13 ; G 1278
U 7444 ; WX 989 ; N uni1D14 ; G 1279
U 7445 ; WX 598 ; N uni1D15 ; G 1280
U 7446 ; WX 667 ; N uni1D16 ; G 1281
U 7447 ; WX 667 ; N uni1D17 ; G 1282
U 7448 ; WX 586 ; N uni1D18 ; G 1283
U 7449 ; WX 801 ; N uni1D19 ; G 1284
U 7450 ; WX 801 ; N uni1D1A ; G 1285
U 7451 ; WX 620 ; N uni1D1B ; G 1286
U 7452 ; WX 647 ; N uni1D1C ; G 1287
U 7453 ; WX 664 ; N uni1D1D ; G 1288
U 7454 ; WX 923 ; N uni1D1E ; G 1289
U 7455 ; WX 655 ; N uni1D1F ; G 1290
U 7456 ; WX 581 ; N uni1D20 ; G 1291
U 7457 ; WX 861 ; N uni1D21 ; G 1292
U 7458 ; WX 568 ; N uni1D22 ; G 1293
U 7459 ; WX 568 ; N uni1D23 ; G 1294
U 7460 ; WX 588 ; N uni1D24 ; G 1295
U 7461 ; WX 802 ; N uni1D25 ; G 1296
U 7462 ; WX 586 ; N uni1D26 ; G 1297
U 7463 ; WX 641 ; N uni1D27 ; G 1298
U 7464 ; WX 732 ; N uni1D28 ; G 1299
U 7465 ; WX 586 ; N uni1D29 ; G 1300
U 7466 ; WX 854 ; N uni1D2A ; G 1301
U 7467 ; WX 705 ; N uni1D2B ; G 1302
U 7468 ; WX 489 ; N uni1D2C ; G 1303
U 7469 ; WX 651 ; N uni1D2D ; G 1304
U 7470 ; WX 532 ; N uni1D2E ; G 1305
U 7471 ; WX 532 ; N uni1D2F ; G 1306
U 7472 ; WX 546 ; N uni1D30 ; G 1307
U 7473 ; WX 480 ; N uni1D31 ; G 1308
U 7474 ; WX 480 ; N uni1D32 ; G 1309
U 7475 ; WX 538 ; N uni1D33 ; G 1310
U 7476 ; WX 595 ; N uni1D34 ; G 1311
U 7477 ; WX 294 ; N uni1D35 ; G 1312
U 7478 ; WX 298 ; N uni1D36 ; G 1313
U 7479 ; WX 547 ; N uni1D37 ; G 1314
U 7480 ; WX 443 ; N uni1D38 ; G 1315
U 7481 ; WX 697 ; N uni1D39 ; G 1316
U 7482 ; WX 576 ; N uni1D3A ; G 1317
U 7483 ; WX 606 ; N uni1D3B ; G 1318
U 7484 ; WX 548 ; N uni1D3C ; G 1319
U 7485 ; WX 442 ; N uni1D3D ; G 1320
U 7486 ; WX 474 ; N uni1D3E ; G 1321
U 7487 ; WX 523 ; N uni1D3F ; G 1322
U 7488 ; WX 455 ; N uni1D40 ; G 1323
U 7489 ; WX 469 ; N uni1D41 ; G 1324
U 7490 ; WX 549 ; N uni1D42 ; G 1325
U 7491 ; WX 466 ; N uni1D43 ; G 1326
U 7492 ; WX 466 ; N uni1D44 ; G 1327
U 7493 ; WX 498 ; N uni1D45 ; G 1328
U 7494 ; WX 657 ; N uni1D46 ; G 1329
U 7495 ; WX 499 ; N uni1D47 ; G 1330
U 7496 ; WX 498 ; N uni1D48 ; G 1331
U 7497 ; WX 444 ; N uni1D49 ; G 1332
U 7498 ; WX 444 ; N uni1D4A ; G 1333
U 7499 ; WX 412 ; N uni1D4B ; G 1334
U 7500 ; WX 412 ; N uni1D4C ; G 1335
U 7501 ; WX 498 ; N uni1D4D ; G 1336
U 7502 ; WX 300 ; N uni1D4E ; G 1337
U 7503 ; WX 523 ; N uni1D4F ; G 1338
U 7504 ; WX 729 ; N uni1D50 ; G 1339
U 7505 ; WX 473 ; N uni1D51 ; G 1340
U 7506 ; WX 467 ; N uni1D52 ; G 1341
U 7507 ; WX 427 ; N uni1D53 ; G 1342
U 7508 ; WX 467 ; N uni1D54 ; G 1343
U 7509 ; WX 467 ; N uni1D55 ; G 1344
U 7510 ; WX 499 ; N uni1D56 ; G 1345
U 7511 ; WX 371 ; N uni1D57 ; G 1346
U 7512 ; WX 520 ; N uni1D58 ; G 1347
U 7513 ; WX 418 ; N uni1D59 ; G 1348
U 7514 ; WX 729 ; N uni1D5A ; G 1349
U 7515 ; WX 491 ; N uni1D5B ; G 1350
U 7516 ; WX 505 ; N uni1D5C ; G 1351
U 7517 ; WX 418 ; N uni1D5D ; G 1352
U 7518 ; WX 416 ; N uni1D5E ; G 1353
U 7519 ; WX 420 ; N uni1D5F ; G 1354
U 7520 ; WX 570 ; N uni1D60 ; G 1355
U 7521 ; WX 414 ; N uni1D61 ; G 1356
U 7522 ; WX 239 ; N uni1D62 ; G 1357
U 7523 ; WX 414 ; N uni1D63 ; G 1358
U 7524 ; WX 520 ; N uni1D64 ; G 1359
U 7525 ; WX 491 ; N uni1D65 ; G 1360
U 7526 ; WX 418 ; N uni1D66 ; G 1361
U 7527 ; WX 416 ; N uni1D67 ; G 1362
U 7528 ; WX 419 ; N uni1D68 ; G 1363
U 7529 ; WX 570 ; N uni1D69 ; G 1364
U 7530 ; WX 414 ; N uni1D6A ; G 1365
U 7531 ; WX 1041 ; N uni1D6B ; G 1366
U 7543 ; WX 640 ; N uni1D77 ; G 1367
U 7544 ; WX 595 ; N uni1D78 ; G 1368
U 7547 ; WX 380 ; N uni1D7B ; G 1369
U 7548 ; WX 380 ; N uni1D7C ; G 1370
U 7549 ; WX 699 ; N uni1D7D ; G 1371
U 7550 ; WX 647 ; N uni1D7E ; G 1372
U 7551 ; WX 679 ; N uni1D7F ; G 1373
U 7557 ; WX 380 ; N uni1D85 ; G 1374
U 7579 ; WX 498 ; N uni1D9B ; G 1375
U 7580 ; WX 427 ; N uni1D9C ; G 1376
U 7581 ; WX 427 ; N uni1D9D ; G 1377
U 7582 ; WX 467 ; N uni1D9E ; G 1378
U 7583 ; WX 412 ; N uni1D9F ; G 1379
U 7584 ; WX 383 ; N uni1DA0 ; G 1380
U 7585 ; WX 373 ; N uni1DA1 ; G 1381
U 7586 ; WX 498 ; N uni1DA2 ; G 1382
U 7587 ; WX 522 ; N uni1DA3 ; G 1383
U 7588 ; WX 300 ; N uni1DA4 ; G 1384
U 7589 ; WX 307 ; N uni1DA5 ; G 1385
U 7590 ; WX 300 ; N uni1DA6 ; G 1386
U 7591 ; WX 300 ; N uni1DA7 ; G 1387
U 7592 ; WX 370 ; N uni1DA8 ; G 1388
U 7593 ; WX 368 ; N uni1DA9 ; G 1389
U 7594 ; WX 321 ; N uni1DAA ; G 1390
U 7595 ; WX 430 ; N uni1DAB ; G 1391
U 7596 ; WX 682 ; N uni1DAC ; G 1392
U 7597 ; WX 729 ; N uni1DAD ; G 1393
U 7598 ; WX 588 ; N uni1DAE ; G 1394
U 7599 ; WX 587 ; N uni1DAF ; G 1395
U 7600 ; WX 472 ; N uni1DB0 ; G 1396
U 7601 ; WX 467 ; N uni1DB1 ; G 1397
U 7602 ; WX 522 ; N uni1DB2 ; G 1398
U 7603 ; WX 400 ; N uni1DB3 ; G 1399
U 7604 ; WX 387 ; N uni1DB4 ; G 1400
U 7605 ; WX 371 ; N uni1DB5 ; G 1401
U 7606 ; WX 520 ; N uni1DB6 ; G 1402
U 7607 ; WX 475 ; N uni1DB7 ; G 1403
U 7608 ; WX 408 ; N uni1DB8 ; G 1404
U 7609 ; WX 489 ; N uni1DB9 ; G 1405
U 7610 ; WX 491 ; N uni1DBA ; G 1406
U 7611 ; WX 412 ; N uni1DBB ; G 1407
U 7612 ; WX 527 ; N uni1DBC ; G 1408
U 7613 ; WX 412 ; N uni1DBD ; G 1409
U 7614 ; WX 452 ; N uni1DBE ; G 1410
U 7615 ; WX 467 ; N uni1DBF ; G 1411
U 7620 ; WX 0 ; N uni1DC4 ; G 1412
U 7621 ; WX 0 ; N uni1DC5 ; G 1413
U 7622 ; WX 0 ; N uni1DC6 ; G 1414
U 7623 ; WX 0 ; N uni1DC7 ; G 1415
U 7624 ; WX 0 ; N uni1DC8 ; G 1416
U 7625 ; WX 0 ; N uni1DC9 ; G 1417
U 7680 ; WX 776 ; N uni1E00 ; G 1418
U 7681 ; WX 648 ; N uni1E01 ; G 1419
U 7682 ; WX 845 ; N uni1E02 ; G 1420
U 7683 ; WX 699 ; N uni1E03 ; G 1421
U 7684 ; WX 845 ; N uni1E04 ; G 1422
U 7685 ; WX 699 ; N uni1E05 ; G 1423
U 7686 ; WX 845 ; N uni1E06 ; G 1424
U 7687 ; WX 699 ; N uni1E07 ; G 1425
U 7688 ; WX 796 ; N uni1E08 ; G 1426
U 7689 ; WX 609 ; N uni1E09 ; G 1427
U 7690 ; WX 867 ; N uni1E0A ; G 1428
U 7691 ; WX 699 ; N uni1E0B ; G 1429
U 7692 ; WX 867 ; N uni1E0C ; G 1430
U 7693 ; WX 699 ; N uni1E0D ; G 1431
U 7694 ; WX 867 ; N uni1E0E ; G 1432
U 7695 ; WX 699 ; N uni1E0F ; G 1433
U 7696 ; WX 867 ; N uni1E10 ; G 1434
U 7697 ; WX 699 ; N uni1E11 ; G 1435
U 7698 ; WX 867 ; N uni1E12 ; G 1436
U 7699 ; WX 699 ; N uni1E13 ; G 1437
U 7700 ; WX 762 ; N uni1E14 ; G 1438
U 7701 ; WX 636 ; N uni1E15 ; G 1439
U 7702 ; WX 762 ; N uni1E16 ; G 1440
U 7703 ; WX 636 ; N uni1E17 ; G 1441
U 7704 ; WX 762 ; N uni1E18 ; G 1442
U 7705 ; WX 636 ; N uni1E19 ; G 1443
U 7706 ; WX 762 ; N uni1E1A ; G 1444
U 7707 ; WX 636 ; N uni1E1B ; G 1445
U 7708 ; WX 762 ; N uni1E1C ; G 1446
U 7709 ; WX 636 ; N uni1E1D ; G 1447
U 7710 ; WX 710 ; N uni1E1E ; G 1448
U 7711 ; WX 430 ; N uni1E1F ; G 1449
U 7712 ; WX 854 ; N uni1E20 ; G 1450
U 7713 ; WX 699 ; N uni1E21 ; G 1451
U 7714 ; WX 945 ; N uni1E22 ; G 1452
U 7715 ; WX 727 ; N uni1E23 ; G 1453
U 7716 ; WX 945 ; N uni1E24 ; G 1454
U 7717 ; WX 727 ; N uni1E25 ; G 1455
U 7718 ; WX 945 ; N uni1E26 ; G 1456
U 7719 ; WX 727 ; N uni1E27 ; G 1457
U 7720 ; WX 945 ; N uni1E28 ; G 1458
U 7721 ; WX 727 ; N uni1E29 ; G 1459
U 7722 ; WX 945 ; N uni1E2A ; G 1460
U 7723 ; WX 727 ; N uni1E2B ; G 1461
U 7724 ; WX 468 ; N uni1E2C ; G 1462
U 7725 ; WX 380 ; N uni1E2D ; G 1463
U 7726 ; WX 468 ; N uni1E2E ; G 1464
U 7727 ; WX 380 ; N uni1E2F ; G 1465
U 7728 ; WX 869 ; N uni1E30 ; G 1466
U 7729 ; WX 693 ; N uni1E31 ; G 1467
U 7730 ; WX 869 ; N uni1E32 ; G 1468
U 7731 ; WX 693 ; N uni1E33 ; G 1469
U 7732 ; WX 869 ; N uni1E34 ; G 1470
U 7733 ; WX 693 ; N uni1E35 ; G 1471
U 7734 ; WX 703 ; N uni1E36 ; G 1472
U 7735 ; WX 380 ; N uni1E37 ; G 1473
U 7736 ; WX 703 ; N uni1E38 ; G 1474
U 7737 ; WX 380 ; N uni1E39 ; G 1475
U 7738 ; WX 703 ; N uni1E3A ; G 1476
U 7739 ; WX 380 ; N uni1E3B ; G 1477
U 7740 ; WX 703 ; N uni1E3C ; G 1478
U 7741 ; WX 380 ; N uni1E3D ; G 1479
U 7742 ; WX 1107 ; N uni1E3E ; G 1480
U 7743 ; WX 1058 ; N uni1E3F ; G 1481
U 7744 ; WX 1107 ; N uni1E40 ; G 1482
U 7745 ; WX 1058 ; N uni1E41 ; G 1483
U 7746 ; WX 1107 ; N uni1E42 ; G 1484
U 7747 ; WX 1058 ; N uni1E43 ; G 1485
U 7748 ; WX 914 ; N uni1E44 ; G 1486
U 7749 ; WX 727 ; N uni1E45 ; G 1487
U 7750 ; WX 914 ; N uni1E46 ; G 1488
U 7751 ; WX 727 ; N uni1E47 ; G 1489
U 7752 ; WX 914 ; N uni1E48 ; G 1490
U 7753 ; WX 727 ; N uni1E49 ; G 1491
U 7754 ; WX 914 ; N uni1E4A ; G 1492
U 7755 ; WX 727 ; N uni1E4B ; G 1493
U 7756 ; WX 871 ; N uni1E4C ; G 1494
U 7757 ; WX 667 ; N uni1E4D ; G 1495
U 7758 ; WX 871 ; N uni1E4E ; G 1496
U 7759 ; WX 667 ; N uni1E4F ; G 1497
U 7760 ; WX 871 ; N uni1E50 ; G 1498
U 7761 ; WX 667 ; N uni1E51 ; G 1499
U 7762 ; WX 871 ; N uni1E52 ; G 1500
U 7763 ; WX 667 ; N uni1E53 ; G 1501
U 7764 ; WX 752 ; N uni1E54 ; G 1502
U 7765 ; WX 699 ; N uni1E55 ; G 1503
U 7766 ; WX 752 ; N uni1E56 ; G 1504
U 7767 ; WX 699 ; N uni1E57 ; G 1505
U 7768 ; WX 831 ; N uni1E58 ; G 1506
U 7769 ; WX 527 ; N uni1E59 ; G 1507
U 7770 ; WX 831 ; N uni1E5A ; G 1508
U 7771 ; WX 527 ; N uni1E5B ; G 1509
U 7772 ; WX 831 ; N uni1E5C ; G 1510
U 7773 ; WX 527 ; N uni1E5D ; G 1511
U 7774 ; WX 831 ; N uni1E5E ; G 1512
U 7775 ; WX 527 ; N uni1E5F ; G 1513
U 7776 ; WX 722 ; N uni1E60 ; G 1514
U 7777 ; WX 563 ; N uni1E61 ; G 1515
U 7778 ; WX 722 ; N uni1E62 ; G 1516
U 7779 ; WX 563 ; N uni1E63 ; G 1517
U 7780 ; WX 722 ; N uni1E64 ; G 1518
U 7781 ; WX 563 ; N uni1E65 ; G 1519
U 7782 ; WX 722 ; N uni1E66 ; G 1520
U 7783 ; WX 563 ; N uni1E67 ; G 1521
U 7784 ; WX 722 ; N uni1E68 ; G 1522
U 7785 ; WX 563 ; N uni1E69 ; G 1523
U 7786 ; WX 744 ; N uni1E6A ; G 1524
U 7787 ; WX 462 ; N uni1E6B ; G 1525
U 7788 ; WX 744 ; N uni1E6C ; G 1526
U 7789 ; WX 462 ; N uni1E6D ; G 1527
U 7790 ; WX 744 ; N uni1E6E ; G 1528
U 7791 ; WX 462 ; N uni1E6F ; G 1529
U 7792 ; WX 744 ; N uni1E70 ; G 1530
U 7793 ; WX 462 ; N uni1E71 ; G 1531
U 7794 ; WX 872 ; N uni1E72 ; G 1532
U 7795 ; WX 727 ; N uni1E73 ; G 1533
U 7796 ; WX 872 ; N uni1E74 ; G 1534
U 7797 ; WX 727 ; N uni1E75 ; G 1535
U 7798 ; WX 872 ; N uni1E76 ; G 1536
U 7799 ; WX 727 ; N uni1E77 ; G 1537
U 7800 ; WX 872 ; N uni1E78 ; G 1538
U 7801 ; WX 727 ; N uni1E79 ; G 1539
U 7802 ; WX 872 ; N uni1E7A ; G 1540
U 7803 ; WX 727 ; N uni1E7B ; G 1541
U 7804 ; WX 776 ; N uni1E7C ; G 1542
U 7805 ; WX 581 ; N uni1E7D ; G 1543
U 7806 ; WX 776 ; N uni1E7E ; G 1544
U 7807 ; WX 581 ; N uni1E7F ; G 1545
U 7808 ; WX 1123 ; N Wgrave ; G 1546
U 7809 ; WX 861 ; N wgrave ; G 1547
U 7810 ; WX 1123 ; N Wacute ; G 1548
U 7811 ; WX 861 ; N wacute ; G 1549
U 7812 ; WX 1123 ; N Wdieresis ; G 1550
U 7813 ; WX 861 ; N wdieresis ; G 1551
U 7814 ; WX 1123 ; N uni1E86 ; G 1552
U 7815 ; WX 861 ; N uni1E87 ; G 1553
U 7816 ; WX 1123 ; N uni1E88 ; G 1554
U 7817 ; WX 861 ; N uni1E89 ; G 1555
U 7818 ; WX 776 ; N uni1E8A ; G 1556
U 7819 ; WX 596 ; N uni1E8B ; G 1557
U 7820 ; WX 776 ; N uni1E8C ; G 1558
U 7821 ; WX 596 ; N uni1E8D ; G 1559
U 7822 ; WX 714 ; N uni1E8E ; G 1560
U 7823 ; WX 581 ; N uni1E8F ; G 1561
U 7824 ; WX 730 ; N uni1E90 ; G 1562
U 7825 ; WX 568 ; N uni1E91 ; G 1563
U 7826 ; WX 730 ; N uni1E92 ; G 1564
U 7827 ; WX 568 ; N uni1E93 ; G 1565
U 7828 ; WX 730 ; N uni1E94 ; G 1566
U 7829 ; WX 568 ; N uni1E95 ; G 1567
U 7830 ; WX 727 ; N uni1E96 ; G 1568
U 7831 ; WX 462 ; N uni1E97 ; G 1569
U 7832 ; WX 861 ; N uni1E98 ; G 1570
U 7833 ; WX 581 ; N uni1E99 ; G 1571
U 7834 ; WX 1014 ; N uni1E9A ; G 1572
U 7835 ; WX 430 ; N uni1E9B ; G 1573
U 7836 ; WX 430 ; N uni1E9C ; G 1574
U 7837 ; WX 430 ; N uni1E9D ; G 1575
U 7838 ; WX 947 ; N uni1E9E ; G 1576
U 7839 ; WX 667 ; N uni1E9F ; G 1577
U 7840 ; WX 776 ; N uni1EA0 ; G 1578
U 7841 ; WX 648 ; N uni1EA1 ; G 1579
U 7842 ; WX 776 ; N uni1EA2 ; G 1580
U 7843 ; WX 648 ; N uni1EA3 ; G 1581
U 7844 ; WX 776 ; N uni1EA4 ; G 1582
U 7845 ; WX 648 ; N uni1EA5 ; G 1583
U 7846 ; WX 776 ; N uni1EA6 ; G 1584
U 7847 ; WX 648 ; N uni1EA7 ; G 1585
U 7848 ; WX 776 ; N uni1EA8 ; G 1586
U 7849 ; WX 648 ; N uni1EA9 ; G 1587
U 7850 ; WX 776 ; N uni1EAA ; G 1588
U 7851 ; WX 648 ; N uni1EAB ; G 1589
U 7852 ; WX 776 ; N uni1EAC ; G 1590
U 7853 ; WX 648 ; N uni1EAD ; G 1591
U 7854 ; WX 776 ; N uni1EAE ; G 1592
U 7855 ; WX 648 ; N uni1EAF ; G 1593
U 7856 ; WX 776 ; N uni1EB0 ; G 1594
U 7857 ; WX 648 ; N uni1EB1 ; G 1595
U 7858 ; WX 776 ; N uni1EB2 ; G 1596
U 7859 ; WX 648 ; N uni1EB3 ; G 1597
U 7860 ; WX 776 ; N uni1EB4 ; G 1598
U 7861 ; WX 648 ; N uni1EB5 ; G 1599
U 7862 ; WX 776 ; N uni1EB6 ; G 1600
U 7863 ; WX 648 ; N uni1EB7 ; G 1601
U 7864 ; WX 762 ; N uni1EB8 ; G 1602
U 7865 ; WX 636 ; N uni1EB9 ; G 1603
U 7866 ; WX 762 ; N uni1EBA ; G 1604
U 7867 ; WX 636 ; N uni1EBB ; G 1605
U 7868 ; WX 762 ; N uni1EBC ; G 1606
U 7869 ; WX 636 ; N uni1EBD ; G 1607
U 7870 ; WX 762 ; N uni1EBE ; G 1608
U 7871 ; WX 636 ; N uni1EBF ; G 1609
U 7872 ; WX 762 ; N uni1EC0 ; G 1610
U 7873 ; WX 636 ; N uni1EC1 ; G 1611
U 7874 ; WX 762 ; N uni1EC2 ; G 1612
U 7875 ; WX 636 ; N uni1EC3 ; G 1613
U 7876 ; WX 762 ; N uni1EC4 ; G 1614
U 7877 ; WX 636 ; N uni1EC5 ; G 1615
U 7878 ; WX 762 ; N uni1EC6 ; G 1616
U 7879 ; WX 636 ; N uni1EC7 ; G 1617
U 7880 ; WX 468 ; N uni1EC8 ; G 1618
U 7881 ; WX 380 ; N uni1EC9 ; G 1619
U 7882 ; WX 468 ; N uni1ECA ; G 1620
U 7883 ; WX 380 ; N uni1ECB ; G 1621
U 7884 ; WX 871 ; N uni1ECC ; G 1622
U 7885 ; WX 667 ; N uni1ECD ; G 1623
U 7886 ; WX 871 ; N uni1ECE ; G 1624
U 7887 ; WX 667 ; N uni1ECF ; G 1625
U 7888 ; WX 871 ; N uni1ED0 ; G 1626
U 7889 ; WX 667 ; N uni1ED1 ; G 1627
U 7890 ; WX 871 ; N uni1ED2 ; G 1628
U 7891 ; WX 667 ; N uni1ED3 ; G 1629
U 7892 ; WX 871 ; N uni1ED4 ; G 1630
U 7893 ; WX 667 ; N uni1ED5 ; G 1631
U 7894 ; WX 871 ; N uni1ED6 ; G 1632
U 7895 ; WX 667 ; N uni1ED7 ; G 1633
U 7896 ; WX 871 ; N uni1ED8 ; G 1634
U 7897 ; WX 667 ; N uni1ED9 ; G 1635
U 7898 ; WX 871 ; N uni1EDA ; G 1636
U 7899 ; WX 667 ; N uni1EDB ; G 1637
U 7900 ; WX 871 ; N uni1EDC ; G 1638
U 7901 ; WX 667 ; N uni1EDD ; G 1639
U 7902 ; WX 871 ; N uni1EDE ; G 1640
U 7903 ; WX 667 ; N uni1EDF ; G 1641
U 7904 ; WX 871 ; N uni1EE0 ; G 1642
U 7905 ; WX 667 ; N uni1EE1 ; G 1643
U 7906 ; WX 871 ; N uni1EE2 ; G 1644
U 7907 ; WX 667 ; N uni1EE3 ; G 1645
U 7908 ; WX 872 ; N uni1EE4 ; G 1646
U 7909 ; WX 727 ; N uni1EE5 ; G 1647
U 7910 ; WX 872 ; N uni1EE6 ; G 1648
U 7911 ; WX 727 ; N uni1EE7 ; G 1649
U 7912 ; WX 872 ; N uni1EE8 ; G 1650
U 7913 ; WX 727 ; N uni1EE9 ; G 1651
U 7914 ; WX 872 ; N uni1EEA ; G 1652
U 7915 ; WX 727 ; N uni1EEB ; G 1653
U 7916 ; WX 872 ; N uni1EEC ; G 1654
U 7917 ; WX 727 ; N uni1EED ; G 1655
U 7918 ; WX 872 ; N uni1EEE ; G 1656
U 7919 ; WX 727 ; N uni1EEF ; G 1657
U 7920 ; WX 872 ; N uni1EF0 ; G 1658
U 7921 ; WX 727 ; N uni1EF1 ; G 1659
U 7922 ; WX 714 ; N Ygrave ; G 1660
U 7923 ; WX 581 ; N ygrave ; G 1661
U 7924 ; WX 714 ; N uni1EF4 ; G 1662
U 7925 ; WX 581 ; N uni1EF5 ; G 1663
U 7926 ; WX 714 ; N uni1EF6 ; G 1664
U 7927 ; WX 581 ; N uni1EF7 ; G 1665
U 7928 ; WX 714 ; N uni1EF8 ; G 1666
U 7929 ; WX 581 ; N uni1EF9 ; G 1667
U 7930 ; WX 1078 ; N uni1EFA ; G 1668
U 7931 ; WX 701 ; N uni1EFB ; G 1669
U 7936 ; WX 770 ; N uni1F00 ; G 1670
U 7937 ; WX 770 ; N uni1F01 ; G 1671
U 7938 ; WX 770 ; N uni1F02 ; G 1672
U 7939 ; WX 770 ; N uni1F03 ; G 1673
U 7940 ; WX 770 ; N uni1F04 ; G 1674
U 7941 ; WX 770 ; N uni1F05 ; G 1675
U 7942 ; WX 770 ; N uni1F06 ; G 1676
U 7943 ; WX 770 ; N uni1F07 ; G 1677
U 7944 ; WX 776 ; N uni1F08 ; G 1678
U 7945 ; WX 776 ; N uni1F09 ; G 1679
U 7946 ; WX 978 ; N uni1F0A ; G 1680
U 7947 ; WX 978 ; N uni1F0B ; G 1681
U 7948 ; WX 832 ; N uni1F0C ; G 1682
U 7949 ; WX 849 ; N uni1F0D ; G 1683
U 7950 ; WX 776 ; N uni1F0E ; G 1684
U 7951 ; WX 776 ; N uni1F0F ; G 1685
U 7952 ; WX 608 ; N uni1F10 ; G 1686
U 7953 ; WX 608 ; N uni1F11 ; G 1687
U 7954 ; WX 608 ; N uni1F12 ; G 1688
U 7955 ; WX 608 ; N uni1F13 ; G 1689
U 7956 ; WX 608 ; N uni1F14 ; G 1690
U 7957 ; WX 608 ; N uni1F15 ; G 1691
U 7960 ; WX 917 ; N uni1F18 ; G 1692
U 7961 ; WX 909 ; N uni1F19 ; G 1693
U 7962 ; WX 1169 ; N uni1F1A ; G 1694
U 7963 ; WX 1169 ; N uni1F1B ; G 1695
U 7964 ; WX 1093 ; N uni1F1C ; G 1696
U 7965 ; WX 1120 ; N uni1F1D ; G 1697
U 7968 ; WX 727 ; N uni1F20 ; G 1698
U 7969 ; WX 727 ; N uni1F21 ; G 1699
U 7970 ; WX 727 ; N uni1F22 ; G 1700
U 7971 ; WX 727 ; N uni1F23 ; G 1701
U 7972 ; WX 727 ; N uni1F24 ; G 1702
U 7973 ; WX 727 ; N uni1F25 ; G 1703
U 7974 ; WX 727 ; N uni1F26 ; G 1704
U 7975 ; WX 727 ; N uni1F27 ; G 1705
U 7976 ; WX 1100 ; N uni1F28 ; G 1706
U 7977 ; WX 1094 ; N uni1F29 ; G 1707
U 7978 ; WX 1358 ; N uni1F2A ; G 1708
U 7979 ; WX 1361 ; N uni1F2B ; G 1709
U 7980 ; WX 1279 ; N uni1F2C ; G 1710
U 7981 ; WX 1308 ; N uni1F2D ; G 1711
U 7982 ; WX 1197 ; N uni1F2E ; G 1712
U 7983 ; WX 1194 ; N uni1F2F ; G 1713
U 7984 ; WX 484 ; N uni1F30 ; G 1714
U 7985 ; WX 484 ; N uni1F31 ; G 1715
U 7986 ; WX 484 ; N uni1F32 ; G 1716
U 7987 ; WX 484 ; N uni1F33 ; G 1717
U 7988 ; WX 484 ; N uni1F34 ; G 1718
U 7989 ; WX 484 ; N uni1F35 ; G 1719
U 7990 ; WX 484 ; N uni1F36 ; G 1720
U 7991 ; WX 484 ; N uni1F37 ; G 1721
U 7992 ; WX 629 ; N uni1F38 ; G 1722
U 7993 ; WX 617 ; N uni1F39 ; G 1723
U 7994 ; WX 878 ; N uni1F3A ; G 1724
U 7995 ; WX 881 ; N uni1F3B ; G 1725
U 7996 ; WX 799 ; N uni1F3C ; G 1726
U 7997 ; WX 831 ; N uni1F3D ; G 1727
U 7998 ; WX 723 ; N uni1F3E ; G 1728
U 7999 ; WX 714 ; N uni1F3F ; G 1729
U 8000 ; WX 667 ; N uni1F40 ; G 1730
U 8001 ; WX 667 ; N uni1F41 ; G 1731
U 8002 ; WX 667 ; N uni1F42 ; G 1732
U 8003 ; WX 667 ; N uni1F43 ; G 1733
U 8004 ; WX 667 ; N uni1F44 ; G 1734
U 8005 ; WX 667 ; N uni1F45 ; G 1735
U 8008 ; WX 900 ; N uni1F48 ; G 1736
U 8009 ; WX 935 ; N uni1F49 ; G 1737
U 8010 ; WX 1240 ; N uni1F4A ; G 1738
U 8011 ; WX 1237 ; N uni1F4B ; G 1739
U 8012 ; WX 1035 ; N uni1F4C ; G 1740
U 8013 ; WX 1066 ; N uni1F4D ; G 1741
U 8016 ; WX 694 ; N uni1F50 ; G 1742
U 8017 ; WX 694 ; N uni1F51 ; G 1743
U 8018 ; WX 694 ; N uni1F52 ; G 1744
U 8019 ; WX 694 ; N uni1F53 ; G 1745
U 8020 ; WX 694 ; N uni1F54 ; G 1746
U 8021 ; WX 694 ; N uni1F55 ; G 1747
U 8022 ; WX 694 ; N uni1F56 ; G 1748
U 8023 ; WX 694 ; N uni1F57 ; G 1749
U 8025 ; WX 922 ; N uni1F59 ; G 1750
U 8027 ; WX 1186 ; N uni1F5B ; G 1751
U 8029 ; WX 1133 ; N uni1F5D ; G 1752
U 8031 ; WX 1019 ; N uni1F5F ; G 1753
U 8032 ; WX 952 ; N uni1F60 ; G 1754
U 8033 ; WX 952 ; N uni1F61 ; G 1755
U 8034 ; WX 952 ; N uni1F62 ; G 1756
U 8035 ; WX 952 ; N uni1F63 ; G 1757
U 8036 ; WX 952 ; N uni1F64 ; G 1758
U 8037 ; WX 952 ; N uni1F65 ; G 1759
U 8038 ; WX 952 ; N uni1F66 ; G 1760
U 8039 ; WX 952 ; N uni1F67 ; G 1761
U 8040 ; WX 931 ; N uni1F68 ; G 1762
U 8041 ; WX 963 ; N uni1F69 ; G 1763
U 8042 ; WX 1268 ; N uni1F6A ; G 1764
U 8043 ; WX 1274 ; N uni1F6B ; G 1765
U 8044 ; WX 1054 ; N uni1F6C ; G 1766
U 8045 ; WX 1088 ; N uni1F6D ; G 1767
U 8046 ; WX 1023 ; N uni1F6E ; G 1768
U 8047 ; WX 1060 ; N uni1F6F ; G 1769
U 8048 ; WX 770 ; N uni1F70 ; G 1770
U 8049 ; WX 770 ; N uni1F71 ; G 1771
U 8050 ; WX 608 ; N uni1F72 ; G 1772
U 8051 ; WX 608 ; N uni1F73 ; G 1773
U 8052 ; WX 727 ; N uni1F74 ; G 1774
U 8053 ; WX 727 ; N uni1F75 ; G 1775
U 8054 ; WX 484 ; N uni1F76 ; G 1776
U 8055 ; WX 484 ; N uni1F77 ; G 1777
U 8056 ; WX 667 ; N uni1F78 ; G 1778
U 8057 ; WX 667 ; N uni1F79 ; G 1779
U 8058 ; WX 694 ; N uni1F7A ; G 1780
U 8059 ; WX 694 ; N uni1F7B ; G 1781
U 8060 ; WX 952 ; N uni1F7C ; G 1782
U 8061 ; WX 952 ; N uni1F7D ; G 1783
U 8064 ; WX 770 ; N uni1F80 ; G 1784
U 8065 ; WX 770 ; N uni1F81 ; G 1785
U 8066 ; WX 770 ; N uni1F82 ; G 1786
U 8067 ; WX 770 ; N uni1F83 ; G 1787
U 8068 ; WX 770 ; N uni1F84 ; G 1788
U 8069 ; WX 770 ; N uni1F85 ; G 1789
U 8070 ; WX 770 ; N uni1F86 ; G 1790
U 8071 ; WX 770 ; N uni1F87 ; G 1791
U 8072 ; WX 776 ; N uni1F88 ; G 1792
U 8073 ; WX 776 ; N uni1F89 ; G 1793
U 8074 ; WX 978 ; N uni1F8A ; G 1794
U 8075 ; WX 978 ; N uni1F8B ; G 1795
U 8076 ; WX 832 ; N uni1F8C ; G 1796
U 8077 ; WX 849 ; N uni1F8D ; G 1797
U 8078 ; WX 776 ; N uni1F8E ; G 1798
U 8079 ; WX 776 ; N uni1F8F ; G 1799
U 8080 ; WX 727 ; N uni1F90 ; G 1800
U 8081 ; WX 727 ; N uni1F91 ; G 1801
U 8082 ; WX 727 ; N uni1F92 ; G 1802
U 8083 ; WX 727 ; N uni1F93 ; G 1803
U 8084 ; WX 727 ; N uni1F94 ; G 1804
U 8085 ; WX 727 ; N uni1F95 ; G 1805
U 8086 ; WX 727 ; N uni1F96 ; G 1806
U 8087 ; WX 727 ; N uni1F97 ; G 1807
U 8088 ; WX 1100 ; N uni1F98 ; G 1808
U 8089 ; WX 1094 ; N uni1F99 ; G 1809
U 8090 ; WX 1358 ; N uni1F9A ; G 1810
U 8091 ; WX 1361 ; N uni1F9B ; G 1811
U 8092 ; WX 1279 ; N uni1F9C ; G 1812
U 8093 ; WX 1308 ; N uni1F9D ; G 1813
U 8094 ; WX 1197 ; N uni1F9E ; G 1814
U 8095 ; WX 1194 ; N uni1F9F ; G 1815
U 8096 ; WX 952 ; N uni1FA0 ; G 1816
U 8097 ; WX 952 ; N uni1FA1 ; G 1817
U 8098 ; WX 952 ; N uni1FA2 ; G 1818
U 8099 ; WX 952 ; N uni1FA3 ; G 1819
U 8100 ; WX 952 ; N uni1FA4 ; G 1820
U 8101 ; WX 952 ; N uni1FA5 ; G 1821
U 8102 ; WX 952 ; N uni1FA6 ; G 1822
U 8103 ; WX 952 ; N uni1FA7 ; G 1823
U 8104 ; WX 931 ; N uni1FA8 ; G 1824
U 8105 ; WX 963 ; N uni1FA9 ; G 1825
U 8106 ; WX 1268 ; N uni1FAA ; G 1826
U 8107 ; WX 1274 ; N uni1FAB ; G 1827
U 8108 ; WX 1054 ; N uni1FAC ; G 1828
U 8109 ; WX 1088 ; N uni1FAD ; G 1829
U 8110 ; WX 1023 ; N uni1FAE ; G 1830
U 8111 ; WX 1060 ; N uni1FAF ; G 1831
U 8112 ; WX 770 ; N uni1FB0 ; G 1832
U 8113 ; WX 770 ; N uni1FB1 ; G 1833
U 8114 ; WX 770 ; N uni1FB2 ; G 1834
U 8115 ; WX 770 ; N uni1FB3 ; G 1835
U 8116 ; WX 770 ; N uni1FB4 ; G 1836
U 8118 ; WX 770 ; N uni1FB6 ; G 1837
U 8119 ; WX 770 ; N uni1FB7 ; G 1838
U 8120 ; WX 776 ; N uni1FB8 ; G 1839
U 8121 ; WX 776 ; N uni1FB9 ; G 1840
U 8122 ; WX 811 ; N uni1FBA ; G 1841
U 8123 ; WX 776 ; N uni1FBB ; G 1842
U 8124 ; WX 776 ; N uni1FBC ; G 1843
U 8125 ; WX 500 ; N uni1FBD ; G 1844
U 8126 ; WX 500 ; N uni1FBE ; G 1845
U 8127 ; WX 500 ; N uni1FBF ; G 1846
U 8128 ; WX 500 ; N uni1FC0 ; G 1847
U 8129 ; WX 500 ; N uni1FC1 ; G 1848
U 8130 ; WX 727 ; N uni1FC2 ; G 1849
U 8131 ; WX 727 ; N uni1FC3 ; G 1850
U 8132 ; WX 727 ; N uni1FC4 ; G 1851
U 8134 ; WX 727 ; N uni1FC6 ; G 1852
U 8135 ; WX 727 ; N uni1FC7 ; G 1853
U 8136 ; WX 1000 ; N uni1FC8 ; G 1854
U 8137 ; WX 947 ; N uni1FC9 ; G 1855
U 8138 ; WX 1191 ; N uni1FCA ; G 1856
U 8139 ; WX 1118 ; N uni1FCB ; G 1857
U 8140 ; WX 945 ; N uni1FCC ; G 1858
U 8141 ; WX 500 ; N uni1FCD ; G 1859
U 8142 ; WX 500 ; N uni1FCE ; G 1860
U 8143 ; WX 500 ; N uni1FCF ; G 1861
U 8144 ; WX 484 ; N uni1FD0 ; G 1862
U 8145 ; WX 484 ; N uni1FD1 ; G 1863
U 8146 ; WX 484 ; N uni1FD2 ; G 1864
U 8147 ; WX 484 ; N uni1FD3 ; G 1865
U 8150 ; WX 484 ; N uni1FD6 ; G 1866
U 8151 ; WX 484 ; N uni1FD7 ; G 1867
U 8152 ; WX 468 ; N uni1FD8 ; G 1868
U 8153 ; WX 468 ; N uni1FD9 ; G 1869
U 8154 ; WX 714 ; N uni1FDA ; G 1870
U 8155 ; WX 662 ; N uni1FDB ; G 1871
U 8157 ; WX 500 ; N uni1FDD ; G 1872
U 8158 ; WX 500 ; N uni1FDE ; G 1873
U 8159 ; WX 500 ; N uni1FDF ; G 1874
U 8160 ; WX 694 ; N uni1FE0 ; G 1875
U 8161 ; WX 694 ; N uni1FE1 ; G 1876
U 8162 ; WX 694 ; N uni1FE2 ; G 1877
U 8163 ; WX 694 ; N uni1FE3 ; G 1878
U 8164 ; WX 665 ; N uni1FE4 ; G 1879
U 8165 ; WX 665 ; N uni1FE5 ; G 1880
U 8166 ; WX 694 ; N uni1FE6 ; G 1881
U 8167 ; WX 694 ; N uni1FE7 ; G 1882
U 8168 ; WX 714 ; N uni1FE8 ; G 1883
U 8169 ; WX 714 ; N uni1FE9 ; G 1884
U 8170 ; WX 1019 ; N uni1FEA ; G 1885
U 8171 ; WX 953 ; N uni1FEB ; G 1886
U 8172 ; WX 910 ; N uni1FEC ; G 1887
U 8173 ; WX 500 ; N uni1FED ; G 1888
U 8174 ; WX 500 ; N uni1FEE ; G 1889
U 8175 ; WX 500 ; N uni1FEF ; G 1890
U 8178 ; WX 952 ; N uni1FF2 ; G 1891
U 8179 ; WX 952 ; N uni1FF3 ; G 1892
U 8180 ; WX 952 ; N uni1FF4 ; G 1893
U 8182 ; WX 952 ; N uni1FF6 ; G 1894
U 8183 ; WX 952 ; N uni1FF7 ; G 1895
U 8184 ; WX 1069 ; N uni1FF8 ; G 1896
U 8185 ; WX 887 ; N uni1FF9 ; G 1897
U 8186 ; WX 1101 ; N uni1FFA ; G 1898
U 8187 ; WX 911 ; N uni1FFB ; G 1899
U 8188 ; WX 890 ; N uni1FFC ; G 1900
U 8189 ; WX 500 ; N uni1FFD ; G 1901
U 8190 ; WX 500 ; N uni1FFE ; G 1902
U 8192 ; WX 500 ; N uni2000 ; G 1903
U 8193 ; WX 1000 ; N uni2001 ; G 1904
U 8194 ; WX 500 ; N uni2002 ; G 1905
U 8195 ; WX 1000 ; N uni2003 ; G 1906
U 8196 ; WX 330 ; N uni2004 ; G 1907
U 8197 ; WX 250 ; N uni2005 ; G 1908
U 8198 ; WX 167 ; N uni2006 ; G 1909
U 8199 ; WX 696 ; N uni2007 ; G 1910
U 8200 ; WX 348 ; N uni2008 ; G 1911
U 8201 ; WX 200 ; N uni2009 ; G 1912
U 8202 ; WX 100 ; N uni200A ; G 1913
U 8203 ; WX 0 ; N uni200B ; G 1914
U 8204 ; WX 0 ; N uni200C ; G 1915
U 8205 ; WX 0 ; N uni200D ; G 1916
U 8206 ; WX 0 ; N uni200E ; G 1917
U 8207 ; WX 0 ; N uni200F ; G 1918
U 8208 ; WX 415 ; N uni2010 ; G 1919
U 8209 ; WX 415 ; N uni2011 ; G 1920
U 8210 ; WX 696 ; N figuredash ; G 1921
U 8211 ; WX 500 ; N endash ; G 1922
U 8212 ; WX 1000 ; N emdash ; G 1923
U 8213 ; WX 1000 ; N uni2015 ; G 1924
U 8214 ; WX 500 ; N uni2016 ; G 1925
U 8215 ; WX 500 ; N underscoredbl ; G 1926
U 8216 ; WX 348 ; N quoteleft ; G 1927
U 8217 ; WX 348 ; N quoteright ; G 1928
U 8218 ; WX 348 ; N quotesinglbase ; G 1929
U 8219 ; WX 348 ; N quotereversed ; G 1930
U 8220 ; WX 575 ; N quotedblleft ; G 1931
U 8221 ; WX 575 ; N quotedblright ; G 1932
U 8222 ; WX 575 ; N quotedblbase ; G 1933
U 8223 ; WX 575 ; N uni201F ; G 1934
U 8224 ; WX 523 ; N dagger ; G 1935
U 8225 ; WX 523 ; N daggerdbl ; G 1936
U 8226 ; WX 639 ; N bullet ; G 1937
U 8227 ; WX 639 ; N uni2023 ; G 1938
U 8228 ; WX 348 ; N onedotenleader ; G 1939
U 8229 ; WX 674 ; N twodotenleader ; G 1940
U 8230 ; WX 1000 ; N ellipsis ; G 1941
U 8234 ; WX 0 ; N uni202A ; G 1942
U 8235 ; WX 0 ; N uni202B ; G 1943
U 8236 ; WX 0 ; N uni202C ; G 1944
U 8237 ; WX 0 ; N uni202D ; G 1945
U 8238 ; WX 0 ; N uni202E ; G 1946
U 8239 ; WX 200 ; N uni202F ; G 1947
U 8240 ; WX 1385 ; N perthousand ; G 1948
U 8241 ; WX 1820 ; N uni2031 ; G 1949
U 8242 ; WX 264 ; N minute ; G 1950
U 8243 ; WX 447 ; N second ; G 1951
U 8244 ; WX 630 ; N uni2034 ; G 1952
U 8245 ; WX 264 ; N uni2035 ; G 1953
U 8246 ; WX 447 ; N uni2036 ; G 1954
U 8247 ; WX 630 ; N uni2037 ; G 1955
U 8248 ; WX 733 ; N uni2038 ; G 1956
U 8249 ; WX 400 ; N guilsinglleft ; G 1957
U 8250 ; WX 400 ; N guilsinglright ; G 1958
U 8252 ; WX 629 ; N exclamdbl ; G 1959
U 8253 ; WX 586 ; N uni203D ; G 1960
U 8254 ; WX 500 ; N uni203E ; G 1961
U 8258 ; WX 1023 ; N uni2042 ; G 1962
U 8260 ; WX 167 ; N fraction ; G 1963
U 8261 ; WX 473 ; N uni2045 ; G 1964
U 8262 ; WX 473 ; N uni2046 ; G 1965
U 8263 ; WX 1082 ; N uni2047 ; G 1966
U 8264 ; WX 856 ; N uni2048 ; G 1967
U 8265 ; WX 856 ; N uni2049 ; G 1968
U 8267 ; WX 636 ; N uni204B ; G 1969
U 8268 ; WX 500 ; N uni204C ; G 1970
U 8269 ; WX 500 ; N uni204D ; G 1971
U 8270 ; WX 523 ; N uni204E ; G 1972
U 8271 ; WX 369 ; N uni204F ; G 1973
U 8273 ; WX 523 ; N uni2051 ; G 1974
U 8274 ; WX 556 ; N uni2052 ; G 1975
U 8275 ; WX 1000 ; N uni2053 ; G 1976
U 8279 ; WX 813 ; N uni2057 ; G 1977
U 8287 ; WX 222 ; N uni205F ; G 1978
U 8288 ; WX 0 ; N uni2060 ; G 1979
U 8289 ; WX 0 ; N uni2061 ; G 1980
U 8290 ; WX 0 ; N uni2062 ; G 1981
U 8291 ; WX 0 ; N uni2063 ; G 1982
U 8292 ; WX 0 ; N uni2064 ; G 1983
U 8298 ; WX 0 ; N uni206A ; G 1984
U 8299 ; WX 0 ; N uni206B ; G 1985
U 8300 ; WX 0 ; N uni206C ; G 1986
U 8301 ; WX 0 ; N uni206D ; G 1987
U 8302 ; WX 0 ; N uni206E ; G 1988
U 8303 ; WX 0 ; N uni206F ; G 1989
U 8304 ; WX 438 ; N uni2070 ; G 1990
U 8305 ; WX 239 ; N uni2071 ; G 1991
U 8308 ; WX 438 ; N uni2074 ; G 1992
U 8309 ; WX 438 ; N uni2075 ; G 1993
U 8310 ; WX 438 ; N uni2076 ; G 1994
U 8311 ; WX 438 ; N uni2077 ; G 1995
U 8312 ; WX 438 ; N uni2078 ; G 1996
U 8313 ; WX 438 ; N uni2079 ; G 1997
U 8314 ; WX 528 ; N uni207A ; G 1998
U 8315 ; WX 528 ; N uni207B ; G 1999
U 8316 ; WX 528 ; N uni207C ; G 2000
U 8317 ; WX 298 ; N uni207D ; G 2001
U 8318 ; WX 298 ; N uni207E ; G 2002
U 8319 ; WX 519 ; N uni207F ; G 2003
U 8320 ; WX 438 ; N uni2080 ; G 2004
U 8321 ; WX 438 ; N uni2081 ; G 2005
U 8322 ; WX 438 ; N uni2082 ; G 2006
U 8323 ; WX 438 ; N uni2083 ; G 2007
U 8324 ; WX 438 ; N uni2084 ; G 2008
U 8325 ; WX 438 ; N uni2085 ; G 2009
U 8326 ; WX 438 ; N uni2086 ; G 2010
U 8327 ; WX 438 ; N uni2087 ; G 2011
U 8328 ; WX 438 ; N uni2088 ; G 2012
U 8329 ; WX 438 ; N uni2089 ; G 2013
U 8330 ; WX 528 ; N uni208A ; G 2014
U 8331 ; WX 528 ; N uni208B ; G 2015
U 8332 ; WX 528 ; N uni208C ; G 2016
U 8333 ; WX 298 ; N uni208D ; G 2017
U 8334 ; WX 298 ; N uni208E ; G 2018
U 8336 ; WX 466 ; N uni2090 ; G 2019
U 8337 ; WX 444 ; N uni2091 ; G 2020
U 8338 ; WX 467 ; N uni2092 ; G 2021
U 8339 ; WX 475 ; N uni2093 ; G 2022
U 8340 ; WX 444 ; N uni2094 ; G 2023
U 8341 ; WX 521 ; N uni2095 ; G 2024
U 8342 ; WX 523 ; N uni2096 ; G 2025
U 8343 ; WX 292 ; N uni2097 ; G 2026
U 8344 ; WX 729 ; N uni2098 ; G 2027
U 8345 ; WX 519 ; N uni2099 ; G 2028
U 8346 ; WX 499 ; N uni209A ; G 2029
U 8347 ; WX 395 ; N uni209B ; G 2030
U 8348 ; WX 371 ; N uni209C ; G 2031
U 8358 ; WX 696 ; N uni20A6 ; G 2032
U 8364 ; WX 696 ; N Euro ; G 2033
U 8367 ; WX 1155 ; N uni20AF ; G 2034
U 8369 ; WX 790 ; N uni20B1 ; G 2035
U 8372 ; WX 876 ; N uni20B4 ; G 2036
U 8373 ; WX 696 ; N uni20B5 ; G 2037
U 8376 ; WX 696 ; N uni20B8 ; G 2038
U 8377 ; WX 696 ; N uni20B9 ; G 2039
U 8378 ; WX 696 ; N uni20BA ; G 2040
U 8381 ; WX 696 ; N uni20BD ; G 2041
U 8451 ; WX 1198 ; N uni2103 ; G 2042
U 8457 ; WX 1112 ; N uni2109 ; G 2043
U 8462 ; WX 727 ; N uni210E ; G 2044
U 8463 ; WX 727 ; N uni210F ; G 2045
U 8470 ; WX 1087 ; N uni2116 ; G 2046
U 8482 ; WX 1000 ; N trademark ; G 2047
U 8486 ; WX 890 ; N uni2126 ; G 2048
U 8487 ; WX 890 ; N uni2127 ; G 2049
U 8490 ; WX 869 ; N uni212A ; G 2050
U 8491 ; WX 776 ; N uni212B ; G 2051
U 8498 ; WX 710 ; N uni2132 ; G 2052
U 8513 ; WX 775 ; N uni2141 ; G 2053
U 8514 ; WX 557 ; N uni2142 ; G 2054
U 8515 ; WX 637 ; N uni2143 ; G 2055
U 8516 ; WX 760 ; N uni2144 ; G 2056
U 8523 ; WX 903 ; N uni214B ; G 2057
U 8526 ; WX 592 ; N uni214E ; G 2058
U 8528 ; WX 1035 ; N uni2150 ; G 2059
U 8529 ; WX 1035 ; N uni2151 ; G 2060
U 8530 ; WX 1473 ; N uni2152 ; G 2061
U 8531 ; WX 1035 ; N onethird ; G 2062
U 8532 ; WX 1035 ; N twothirds ; G 2063
U 8533 ; WX 1035 ; N uni2155 ; G 2064
U 8534 ; WX 1035 ; N uni2156 ; G 2065
U 8535 ; WX 1035 ; N uni2157 ; G 2066
U 8536 ; WX 1035 ; N uni2158 ; G 2067
U 8537 ; WX 1035 ; N uni2159 ; G 2068
U 8538 ; WX 1035 ; N uni215A ; G 2069
U 8539 ; WX 1035 ; N oneeighth ; G 2070
U 8540 ; WX 1035 ; N threeeighths ; G 2071
U 8541 ; WX 1035 ; N fiveeighths ; G 2072
U 8542 ; WX 1035 ; N seveneighths ; G 2073
U 8543 ; WX 615 ; N uni215F ; G 2074
U 8544 ; WX 468 ; N uni2160 ; G 2075
U 8545 ; WX 843 ; N uni2161 ; G 2076
U 8546 ; WX 1218 ; N uni2162 ; G 2077
U 8547 ; WX 1135 ; N uni2163 ; G 2078
U 8548 ; WX 776 ; N uni2164 ; G 2079
U 8549 ; WX 1150 ; N uni2165 ; G 2080
U 8550 ; WX 1525 ; N uni2166 ; G 2081
U 8551 ; WX 1900 ; N uni2167 ; G 2082
U 8552 ; WX 1126 ; N uni2168 ; G 2083
U 8553 ; WX 776 ; N uni2169 ; G 2084
U 8554 ; WX 1127 ; N uni216A ; G 2085
U 8555 ; WX 1502 ; N uni216B ; G 2086
U 8556 ; WX 703 ; N uni216C ; G 2087
U 8557 ; WX 796 ; N uni216D ; G 2088
U 8558 ; WX 867 ; N uni216E ; G 2089
U 8559 ; WX 1107 ; N uni216F ; G 2090
U 8560 ; WX 380 ; N uni2170 ; G 2091
U 8561 ; WX 760 ; N uni2171 ; G 2092
U 8562 ; WX 1140 ; N uni2172 ; G 2093
U 8563 ; WX 961 ; N uni2173 ; G 2094
U 8564 ; WX 581 ; N uni2174 ; G 2095
U 8565 ; WX 961 ; N uni2175 ; G 2096
U 8566 ; WX 1341 ; N uni2176 ; G 2097
U 8567 ; WX 1721 ; N uni2177 ; G 2098
U 8568 ; WX 976 ; N uni2178 ; G 2099
U 8569 ; WX 596 ; N uni2179 ; G 2100
U 8570 ; WX 976 ; N uni217A ; G 2101
U 8571 ; WX 1356 ; N uni217B ; G 2102
U 8572 ; WX 380 ; N uni217C ; G 2103
U 8573 ; WX 609 ; N uni217D ; G 2104
U 8574 ; WX 699 ; N uni217E ; G 2105
U 8575 ; WX 1058 ; N uni217F ; G 2106
U 8576 ; WX 1255 ; N uni2180 ; G 2107
U 8577 ; WX 867 ; N uni2181 ; G 2108
U 8578 ; WX 1268 ; N uni2182 ; G 2109
U 8579 ; WX 796 ; N uni2183 ; G 2110
U 8580 ; WX 609 ; N uni2184 ; G 2111
U 8581 ; WX 796 ; N uni2185 ; G 2112
U 8585 ; WX 1035 ; N uni2189 ; G 2113
U 8592 ; WX 838 ; N arrowleft ; G 2114
U 8593 ; WX 838 ; N arrowup ; G 2115
U 8594 ; WX 838 ; N arrowright ; G 2116
U 8595 ; WX 838 ; N arrowdown ; G 2117
U 8596 ; WX 838 ; N arrowboth ; G 2118
U 8597 ; WX 838 ; N arrowupdn ; G 2119
U 8598 ; WX 838 ; N uni2196 ; G 2120
U 8599 ; WX 838 ; N uni2197 ; G 2121
U 8600 ; WX 838 ; N uni2198 ; G 2122
U 8601 ; WX 838 ; N uni2199 ; G 2123
U 8602 ; WX 838 ; N uni219A ; G 2124
U 8603 ; WX 838 ; N uni219B ; G 2125
U 8604 ; WX 838 ; N uni219C ; G 2126
U 8605 ; WX 838 ; N uni219D ; G 2127
U 8606 ; WX 838 ; N uni219E ; G 2128
U 8607 ; WX 838 ; N uni219F ; G 2129
U 8608 ; WX 838 ; N uni21A0 ; G 2130
U 8609 ; WX 838 ; N uni21A1 ; G 2131
U 8610 ; WX 838 ; N uni21A2 ; G 2132
U 8611 ; WX 838 ; N uni21A3 ; G 2133
U 8612 ; WX 838 ; N uni21A4 ; G 2134
U 8613 ; WX 838 ; N uni21A5 ; G 2135
U 8614 ; WX 838 ; N uni21A6 ; G 2136
U 8615 ; WX 838 ; N uni21A7 ; G 2137
U 8616 ; WX 838 ; N arrowupdnbse ; G 2138
U 8617 ; WX 838 ; N uni21A9 ; G 2139
U 8618 ; WX 838 ; N uni21AA ; G 2140
U 8619 ; WX 838 ; N uni21AB ; G 2141
U 8620 ; WX 838 ; N uni21AC ; G 2142
U 8621 ; WX 838 ; N uni21AD ; G 2143
U 8622 ; WX 838 ; N uni21AE ; G 2144
U 8623 ; WX 850 ; N uni21AF ; G 2145
U 8624 ; WX 838 ; N uni21B0 ; G 2146
U 8625 ; WX 838 ; N uni21B1 ; G 2147
U 8626 ; WX 838 ; N uni21B2 ; G 2148
U 8627 ; WX 838 ; N uni21B3 ; G 2149
U 8628 ; WX 838 ; N uni21B4 ; G 2150
U 8629 ; WX 838 ; N carriagereturn ; G 2151
U 8630 ; WX 838 ; N uni21B6 ; G 2152
U 8631 ; WX 838 ; N uni21B7 ; G 2153
U 8632 ; WX 838 ; N uni21B8 ; G 2154
U 8633 ; WX 838 ; N uni21B9 ; G 2155
U 8634 ; WX 838 ; N uni21BA ; G 2156
U 8635 ; WX 838 ; N uni21BB ; G 2157
U 8636 ; WX 838 ; N uni21BC ; G 2158
U 8637 ; WX 838 ; N uni21BD ; G 2159
U 8638 ; WX 838 ; N uni21BE ; G 2160
U 8639 ; WX 838 ; N uni21BF ; G 2161
U 8640 ; WX 838 ; N uni21C0 ; G 2162
U 8641 ; WX 838 ; N uni21C1 ; G 2163
U 8642 ; WX 838 ; N uni21C2 ; G 2164
U 8643 ; WX 838 ; N uni21C3 ; G 2165
U 8644 ; WX 838 ; N uni21C4 ; G 2166
U 8645 ; WX 838 ; N uni21C5 ; G 2167
U 8646 ; WX 838 ; N uni21C6 ; G 2168
U 8647 ; WX 838 ; N uni21C7 ; G 2169
U 8648 ; WX 838 ; N uni21C8 ; G 2170
U 8649 ; WX 838 ; N uni21C9 ; G 2171
U 8650 ; WX 838 ; N uni21CA ; G 2172
U 8651 ; WX 838 ; N uni21CB ; G 2173
U 8652 ; WX 838 ; N uni21CC ; G 2174
U 8653 ; WX 838 ; N uni21CD ; G 2175
U 8654 ; WX 838 ; N uni21CE ; G 2176
U 8655 ; WX 838 ; N uni21CF ; G 2177
U 8656 ; WX 838 ; N arrowdblleft ; G 2178
U 8657 ; WX 838 ; N arrowdblup ; G 2179
U 8658 ; WX 838 ; N arrowdblright ; G 2180
U 8659 ; WX 838 ; N arrowdbldown ; G 2181
U 8660 ; WX 838 ; N arrowdblboth ; G 2182
U 8661 ; WX 838 ; N uni21D5 ; G 2183
U 8662 ; WX 838 ; N uni21D6 ; G 2184
U 8663 ; WX 838 ; N uni21D7 ; G 2185
U 8664 ; WX 838 ; N uni21D8 ; G 2186
U 8665 ; WX 838 ; N uni21D9 ; G 2187
U 8666 ; WX 838 ; N uni21DA ; G 2188
U 8667 ; WX 838 ; N uni21DB ; G 2189
U 8668 ; WX 838 ; N uni21DC ; G 2190
U 8669 ; WX 838 ; N uni21DD ; G 2191
U 8670 ; WX 838 ; N uni21DE ; G 2192
U 8671 ; WX 838 ; N uni21DF ; G 2193
U 8672 ; WX 838 ; N uni21E0 ; G 2194
U 8673 ; WX 838 ; N uni21E1 ; G 2195
U 8674 ; WX 838 ; N uni21E2 ; G 2196
U 8675 ; WX 838 ; N uni21E3 ; G 2197
U 8676 ; WX 838 ; N uni21E4 ; G 2198
U 8677 ; WX 838 ; N uni21E5 ; G 2199
U 8678 ; WX 838 ; N uni21E6 ; G 2200
U 8679 ; WX 838 ; N uni21E7 ; G 2201
U 8680 ; WX 838 ; N uni21E8 ; G 2202
U 8681 ; WX 838 ; N uni21E9 ; G 2203
U 8682 ; WX 838 ; N uni21EA ; G 2204
U 8683 ; WX 838 ; N uni21EB ; G 2205
U 8684 ; WX 838 ; N uni21EC ; G 2206
U 8685 ; WX 838 ; N uni21ED ; G 2207
U 8686 ; WX 838 ; N uni21EE ; G 2208
U 8687 ; WX 838 ; N uni21EF ; G 2209
U 8688 ; WX 838 ; N uni21F0 ; G 2210
U 8689 ; WX 838 ; N uni21F1 ; G 2211
U 8690 ; WX 838 ; N uni21F2 ; G 2212
U 8691 ; WX 838 ; N uni21F3 ; G 2213
U 8692 ; WX 838 ; N uni21F4 ; G 2214
U 8693 ; WX 838 ; N uni21F5 ; G 2215
U 8694 ; WX 838 ; N uni21F6 ; G 2216
U 8695 ; WX 838 ; N uni21F7 ; G 2217
U 8696 ; WX 838 ; N uni21F8 ; G 2218
U 8697 ; WX 838 ; N uni21F9 ; G 2219
U 8698 ; WX 838 ; N uni21FA ; G 2220
U 8699 ; WX 838 ; N uni21FB ; G 2221
U 8700 ; WX 838 ; N uni21FC ; G 2222
U 8701 ; WX 838 ; N uni21FD ; G 2223
U 8702 ; WX 838 ; N uni21FE ; G 2224
U 8703 ; WX 838 ; N uni21FF ; G 2225
U 8704 ; WX 641 ; N universal ; G 2226
U 8706 ; WX 534 ; N partialdiff ; G 2227
U 8707 ; WX 620 ; N existential ; G 2228
U 8708 ; WX 620 ; N uni2204 ; G 2229
U 8710 ; WX 753 ; N increment ; G 2230
U 8711 ; WX 753 ; N gradient ; G 2231
U 8712 ; WX 740 ; N element ; G 2232
U 8713 ; WX 740 ; N notelement ; G 2233
U 8715 ; WX 740 ; N suchthat ; G 2234
U 8716 ; WX 740 ; N uni220C ; G 2235
U 8719 ; WX 842 ; N product ; G 2236
U 8720 ; WX 842 ; N uni2210 ; G 2237
U 8721 ; WX 753 ; N summation ; G 2238
U 8722 ; WX 838 ; N minus ; G 2239
U 8723 ; WX 838 ; N uni2213 ; G 2240
U 8724 ; WX 838 ; N uni2214 ; G 2241
U 8725 ; WX 365 ; N uni2215 ; G 2242
U 8727 ; WX 691 ; N asteriskmath ; G 2243
U 8728 ; WX 519 ; N uni2218 ; G 2244
U 8729 ; WX 519 ; N uni2219 ; G 2245
U 8730 ; WX 657 ; N radical ; G 2246
U 8731 ; WX 657 ; N uni221B ; G 2247
U 8732 ; WX 657 ; N uni221C ; G 2248
U 8733 ; WX 672 ; N proportional ; G 2249
U 8734 ; WX 833 ; N infinity ; G 2250
U 8735 ; WX 838 ; N orthogonal ; G 2251
U 8736 ; WX 838 ; N angle ; G 2252
U 8739 ; WX 324 ; N uni2223 ; G 2253
U 8740 ; WX 607 ; N uni2224 ; G 2254
U 8741 ; WX 529 ; N uni2225 ; G 2255
U 8742 ; WX 773 ; N uni2226 ; G 2256
U 8743 ; WX 812 ; N logicaland ; G 2257
U 8744 ; WX 812 ; N logicalor ; G 2258
U 8745 ; WX 838 ; N intersection ; G 2259
U 8746 ; WX 838 ; N union ; G 2260
U 8747 ; WX 579 ; N integral ; G 2261
U 8748 ; WX 1000 ; N uni222C ; G 2262
U 8749 ; WX 1391 ; N uni222D ; G 2263
U 8760 ; WX 838 ; N uni2238 ; G 2264
U 8761 ; WX 838 ; N uni2239 ; G 2265
U 8762 ; WX 838 ; N uni223A ; G 2266
U 8763 ; WX 838 ; N uni223B ; G 2267
U 8764 ; WX 838 ; N similar ; G 2268
U 8765 ; WX 838 ; N uni223D ; G 2269
U 8770 ; WX 838 ; N uni2242 ; G 2270
U 8771 ; WX 838 ; N uni2243 ; G 2271
U 8776 ; WX 838 ; N approxequal ; G 2272
U 8784 ; WX 838 ; N uni2250 ; G 2273
U 8785 ; WX 838 ; N uni2251 ; G 2274
U 8786 ; WX 838 ; N uni2252 ; G 2275
U 8787 ; WX 838 ; N uni2253 ; G 2276
U 8788 ; WX 1082 ; N uni2254 ; G 2277
U 8789 ; WX 1082 ; N uni2255 ; G 2278
U 8800 ; WX 838 ; N notequal ; G 2279
U 8801 ; WX 838 ; N equivalence ; G 2280
U 8804 ; WX 838 ; N lessequal ; G 2281
U 8805 ; WX 838 ; N greaterequal ; G 2282
U 8834 ; WX 838 ; N propersubset ; G 2283
U 8835 ; WX 838 ; N propersuperset ; G 2284
U 8836 ; WX 838 ; N notsubset ; G 2285
U 8837 ; WX 838 ; N uni2285 ; G 2286
U 8838 ; WX 838 ; N reflexsubset ; G 2287
U 8839 ; WX 838 ; N reflexsuperset ; G 2288
U 8844 ; WX 838 ; N uni228C ; G 2289
U 8845 ; WX 838 ; N uni228D ; G 2290
U 8846 ; WX 838 ; N uni228E ; G 2291
U 8847 ; WX 838 ; N uni228F ; G 2292
U 8848 ; WX 838 ; N uni2290 ; G 2293
U 8849 ; WX 838 ; N uni2291 ; G 2294
U 8850 ; WX 838 ; N uni2292 ; G 2295
U 8851 ; WX 838 ; N uni2293 ; G 2296
U 8852 ; WX 838 ; N uni2294 ; G 2297
U 8853 ; WX 838 ; N circleplus ; G 2298
U 8854 ; WX 838 ; N uni2296 ; G 2299
U 8855 ; WX 838 ; N circlemultiply ; G 2300
U 8856 ; WX 838 ; N uni2298 ; G 2301
U 8857 ; WX 838 ; N uni2299 ; G 2302
U 8858 ; WX 838 ; N uni229A ; G 2303
U 8859 ; WX 838 ; N uni229B ; G 2304
U 8860 ; WX 838 ; N uni229C ; G 2305
U 8861 ; WX 838 ; N uni229D ; G 2306
U 8862 ; WX 838 ; N uni229E ; G 2307
U 8863 ; WX 838 ; N uni229F ; G 2308
U 8864 ; WX 838 ; N uni22A0 ; G 2309
U 8865 ; WX 838 ; N uni22A1 ; G 2310
U 8866 ; WX 884 ; N uni22A2 ; G 2311
U 8867 ; WX 884 ; N uni22A3 ; G 2312
U 8868 ; WX 960 ; N uni22A4 ; G 2313
U 8869 ; WX 960 ; N perpendicular ; G 2314
U 8870 ; WX 616 ; N uni22A6 ; G 2315
U 8871 ; WX 616 ; N uni22A7 ; G 2316
U 8872 ; WX 884 ; N uni22A8 ; G 2317
U 8873 ; WX 884 ; N uni22A9 ; G 2318
U 8874 ; WX 884 ; N uni22AA ; G 2319
U 8875 ; WX 1080 ; N uni22AB ; G 2320
U 8876 ; WX 884 ; N uni22AC ; G 2321
U 8877 ; WX 884 ; N uni22AD ; G 2322
U 8878 ; WX 884 ; N uni22AE ; G 2323
U 8879 ; WX 1080 ; N uni22AF ; G 2324
U 8900 ; WX 626 ; N uni22C4 ; G 2325
U 8901 ; WX 398 ; N dotmath ; G 2326
U 8962 ; WX 834 ; N house ; G 2327
U 8968 ; WX 473 ; N uni2308 ; G 2328
U 8969 ; WX 473 ; N uni2309 ; G 2329
U 8970 ; WX 473 ; N uni230A ; G 2330
U 8971 ; WX 473 ; N uni230B ; G 2331
U 8976 ; WX 838 ; N revlogicalnot ; G 2332
U 8977 ; WX 539 ; N uni2311 ; G 2333
U 8984 ; WX 928 ; N uni2318 ; G 2334
U 8985 ; WX 838 ; N uni2319 ; G 2335
U 8992 ; WX 579 ; N integraltp ; G 2336
U 8993 ; WX 579 ; N integralbt ; G 2337
U 8997 ; WX 1000 ; N uni2325 ; G 2338
U 9000 ; WX 1443 ; N uni2328 ; G 2339
U 9085 ; WX 1008 ; N uni237D ; G 2340
U 9115 ; WX 500 ; N uni239B ; G 2341
U 9116 ; WX 500 ; N uni239C ; G 2342
U 9117 ; WX 500 ; N uni239D ; G 2343
U 9118 ; WX 500 ; N uni239E ; G 2344
U 9119 ; WX 500 ; N uni239F ; G 2345
U 9120 ; WX 500 ; N uni23A0 ; G 2346
U 9121 ; WX 500 ; N uni23A1 ; G 2347
U 9122 ; WX 500 ; N uni23A2 ; G 2348
U 9123 ; WX 500 ; N uni23A3 ; G 2349
U 9124 ; WX 500 ; N uni23A4 ; G 2350
U 9125 ; WX 500 ; N uni23A5 ; G 2351
U 9126 ; WX 500 ; N uni23A6 ; G 2352
U 9127 ; WX 750 ; N uni23A7 ; G 2353
U 9128 ; WX 750 ; N uni23A8 ; G 2354
U 9129 ; WX 750 ; N uni23A9 ; G 2355
U 9130 ; WX 750 ; N uni23AA ; G 2356
U 9131 ; WX 750 ; N uni23AB ; G 2357
U 9132 ; WX 750 ; N uni23AC ; G 2358
U 9133 ; WX 750 ; N uni23AD ; G 2359
U 9134 ; WX 579 ; N uni23AE ; G 2360
U 9167 ; WX 945 ; N uni23CF ; G 2361
U 9251 ; WX 834 ; N uni2423 ; G 2362
U 9472 ; WX 602 ; N SF100000 ; G 2363
U 9473 ; WX 602 ; N uni2501 ; G 2364
U 9474 ; WX 602 ; N SF110000 ; G 2365
U 9475 ; WX 602 ; N uni2503 ; G 2366
U 9476 ; WX 602 ; N uni2504 ; G 2367
U 9477 ; WX 602 ; N uni2505 ; G 2368
U 9478 ; WX 602 ; N uni2506 ; G 2369
U 9479 ; WX 602 ; N uni2507 ; G 2370
U 9480 ; WX 602 ; N uni2508 ; G 2371
U 9481 ; WX 602 ; N uni2509 ; G 2372
U 9482 ; WX 602 ; N uni250A ; G 2373
U 9483 ; WX 602 ; N uni250B ; G 2374
U 9484 ; WX 602 ; N SF010000 ; G 2375
U 9485 ; WX 602 ; N uni250D ; G 2376
U 9486 ; WX 602 ; N uni250E ; G 2377
U 9487 ; WX 602 ; N uni250F ; G 2378
U 9488 ; WX 602 ; N SF030000 ; G 2379
U 9489 ; WX 602 ; N uni2511 ; G 2380
U 9490 ; WX 602 ; N uni2512 ; G 2381
U 9491 ; WX 602 ; N uni2513 ; G 2382
U 9492 ; WX 602 ; N SF020000 ; G 2383
U 9493 ; WX 602 ; N uni2515 ; G 2384
U 9494 ; WX 602 ; N uni2516 ; G 2385
U 9495 ; WX 602 ; N uni2517 ; G 2386
U 9496 ; WX 602 ; N SF040000 ; G 2387
U 9497 ; WX 602 ; N uni2519 ; G 2388
U 9498 ; WX 602 ; N uni251A ; G 2389
U 9499 ; WX 602 ; N uni251B ; G 2390
U 9500 ; WX 602 ; N SF080000 ; G 2391
U 9501 ; WX 602 ; N uni251D ; G 2392
U 9502 ; WX 602 ; N uni251E ; G 2393
U 9503 ; WX 602 ; N uni251F ; G 2394
U 9504 ; WX 602 ; N uni2520 ; G 2395
U 9505 ; WX 602 ; N uni2521 ; G 2396
U 9506 ; WX 602 ; N uni2522 ; G 2397
U 9507 ; WX 602 ; N uni2523 ; G 2398
U 9508 ; WX 602 ; N SF090000 ; G 2399
U 9509 ; WX 602 ; N uni2525 ; G 2400
U 9510 ; WX 602 ; N uni2526 ; G 2401
U 9511 ; WX 602 ; N uni2527 ; G 2402
U 9512 ; WX 602 ; N uni2528 ; G 2403
U 9513 ; WX 602 ; N uni2529 ; G 2404
U 9514 ; WX 602 ; N uni252A ; G 2405
U 9515 ; WX 602 ; N uni252B ; G 2406
U 9516 ; WX 602 ; N SF060000 ; G 2407
U 9517 ; WX 602 ; N uni252D ; G 2408
U 9518 ; WX 602 ; N uni252E ; G 2409
U 9519 ; WX 602 ; N uni252F ; G 2410
U 9520 ; WX 602 ; N uni2530 ; G 2411
U 9521 ; WX 602 ; N uni2531 ; G 2412
U 9522 ; WX 602 ; N uni2532 ; G 2413
U 9523 ; WX 602 ; N uni2533 ; G 2414
U 9524 ; WX 602 ; N SF070000 ; G 2415
U 9525 ; WX 602 ; N uni2535 ; G 2416
U 9526 ; WX 602 ; N uni2536 ; G 2417
U 9527 ; WX 602 ; N uni2537 ; G 2418
U 9528 ; WX 602 ; N uni2538 ; G 2419
U 9529 ; WX 602 ; N uni2539 ; G 2420
U 9530 ; WX 602 ; N uni253A ; G 2421
U 9531 ; WX 602 ; N uni253B ; G 2422
U 9532 ; WX 602 ; N SF050000 ; G 2423
U 9533 ; WX 602 ; N uni253D ; G 2424
U 9534 ; WX 602 ; N uni253E ; G 2425
U 9535 ; WX 602 ; N uni253F ; G 2426
U 9536 ; WX 602 ; N uni2540 ; G 2427
U 9537 ; WX 602 ; N uni2541 ; G 2428
U 9538 ; WX 602 ; N uni2542 ; G 2429
U 9539 ; WX 602 ; N uni2543 ; G 2430
U 9540 ; WX 602 ; N uni2544 ; G 2431
U 9541 ; WX 602 ; N uni2545 ; G 2432
U 9542 ; WX 602 ; N uni2546 ; G 2433
U 9543 ; WX 602 ; N uni2547 ; G 2434
U 9544 ; WX 602 ; N uni2548 ; G 2435
U 9545 ; WX 602 ; N uni2549 ; G 2436
U 9546 ; WX 602 ; N uni254A ; G 2437
U 9547 ; WX 602 ; N uni254B ; G 2438
U 9548 ; WX 602 ; N uni254C ; G 2439
U 9549 ; WX 602 ; N uni254D ; G 2440
U 9550 ; WX 602 ; N uni254E ; G 2441
U 9551 ; WX 602 ; N uni254F ; G 2442
U 9552 ; WX 602 ; N SF430000 ; G 2443
U 9553 ; WX 602 ; N SF240000 ; G 2444
U 9554 ; WX 602 ; N SF510000 ; G 2445
U 9555 ; WX 602 ; N SF520000 ; G 2446
U 9556 ; WX 602 ; N SF390000 ; G 2447
U 9557 ; WX 602 ; N SF220000 ; G 2448
U 9558 ; WX 602 ; N SF210000 ; G 2449
U 9559 ; WX 602 ; N SF250000 ; G 2450
U 9560 ; WX 602 ; N SF500000 ; G 2451
U 9561 ; WX 602 ; N SF490000 ; G 2452
U 9562 ; WX 602 ; N SF380000 ; G 2453
U 9563 ; WX 602 ; N SF280000 ; G 2454
U 9564 ; WX 602 ; N SF270000 ; G 2455
U 9565 ; WX 602 ; N SF260000 ; G 2456
U 9566 ; WX 602 ; N SF360000 ; G 2457
U 9567 ; WX 602 ; N SF370000 ; G 2458
U 9568 ; WX 602 ; N SF420000 ; G 2459
U 9569 ; WX 602 ; N SF190000 ; G 2460
U 9570 ; WX 602 ; N SF200000 ; G 2461
U 9571 ; WX 602 ; N SF230000 ; G 2462
U 9572 ; WX 602 ; N SF470000 ; G 2463
U 9573 ; WX 602 ; N SF480000 ; G 2464
U 9574 ; WX 602 ; N SF410000 ; G 2465
U 9575 ; WX 602 ; N SF450000 ; G 2466
U 9576 ; WX 602 ; N SF460000 ; G 2467
U 9577 ; WX 602 ; N SF400000 ; G 2468
U 9578 ; WX 602 ; N SF540000 ; G 2469
U 9579 ; WX 602 ; N SF530000 ; G 2470
U 9580 ; WX 602 ; N SF440000 ; G 2471
U 9581 ; WX 602 ; N uni256D ; G 2472
U 9582 ; WX 602 ; N uni256E ; G 2473
U 9583 ; WX 602 ; N uni256F ; G 2474
U 9584 ; WX 602 ; N uni2570 ; G 2475
U 9585 ; WX 602 ; N uni2571 ; G 2476
U 9586 ; WX 602 ; N uni2572 ; G 2477
U 9587 ; WX 602 ; N uni2573 ; G 2478
U 9588 ; WX 602 ; N uni2574 ; G 2479
U 9589 ; WX 602 ; N uni2575 ; G 2480
U 9590 ; WX 602 ; N uni2576 ; G 2481
U 9591 ; WX 602 ; N uni2577 ; G 2482
U 9592 ; WX 602 ; N uni2578 ; G 2483
U 9593 ; WX 602 ; N uni2579 ; G 2484
U 9594 ; WX 602 ; N uni257A ; G 2485
U 9595 ; WX 602 ; N uni257B ; G 2486
U 9596 ; WX 602 ; N uni257C ; G 2487
U 9597 ; WX 602 ; N uni257D ; G 2488
U 9598 ; WX 602 ; N uni257E ; G 2489
U 9599 ; WX 602 ; N uni257F ; G 2490
U 9600 ; WX 769 ; N upblock ; G 2491
U 9601 ; WX 769 ; N uni2581 ; G 2492
U 9602 ; WX 769 ; N uni2582 ; G 2493
U 9603 ; WX 769 ; N uni2583 ; G 2494
U 9604 ; WX 769 ; N dnblock ; G 2495
U 9605 ; WX 769 ; N uni2585 ; G 2496
U 9606 ; WX 769 ; N uni2586 ; G 2497
U 9607 ; WX 769 ; N uni2587 ; G 2498
U 9608 ; WX 769 ; N block ; G 2499
U 9609 ; WX 769 ; N uni2589 ; G 2500
U 9610 ; WX 769 ; N uni258A ; G 2501
U 9611 ; WX 769 ; N uni258B ; G 2502
U 9612 ; WX 769 ; N lfblock ; G 2503
U 9613 ; WX 769 ; N uni258D ; G 2504
U 9614 ; WX 769 ; N uni258E ; G 2505
U 9615 ; WX 769 ; N uni258F ; G 2506
U 9616 ; WX 769 ; N rtblock ; G 2507
U 9617 ; WX 769 ; N ltshade ; G 2508
U 9618 ; WX 769 ; N shade ; G 2509
U 9619 ; WX 769 ; N dkshade ; G 2510
U 9620 ; WX 769 ; N uni2594 ; G 2511
U 9621 ; WX 769 ; N uni2595 ; G 2512
U 9622 ; WX 769 ; N uni2596 ; G 2513
U 9623 ; WX 769 ; N uni2597 ; G 2514
U 9624 ; WX 769 ; N uni2598 ; G 2515
U 9625 ; WX 769 ; N uni2599 ; G 2516
U 9626 ; WX 769 ; N uni259A ; G 2517
U 9627 ; WX 769 ; N uni259B ; G 2518
U 9628 ; WX 769 ; N uni259C ; G 2519
U 9629 ; WX 769 ; N uni259D ; G 2520
U 9630 ; WX 769 ; N uni259E ; G 2521
U 9631 ; WX 769 ; N uni259F ; G 2522
U 9632 ; WX 945 ; N filledbox ; G 2523
U 9633 ; WX 945 ; N H22073 ; G 2524
U 9634 ; WX 945 ; N uni25A2 ; G 2525
U 9635 ; WX 945 ; N uni25A3 ; G 2526
U 9636 ; WX 945 ; N uni25A4 ; G 2527
U 9637 ; WX 945 ; N uni25A5 ; G 2528
U 9638 ; WX 945 ; N uni25A6 ; G 2529
U 9639 ; WX 945 ; N uni25A7 ; G 2530
U 9640 ; WX 945 ; N uni25A8 ; G 2531
U 9641 ; WX 945 ; N uni25A9 ; G 2532
U 9642 ; WX 678 ; N H18543 ; G 2533
U 9643 ; WX 678 ; N H18551 ; G 2534
U 9644 ; WX 945 ; N filledrect ; G 2535
U 9645 ; WX 945 ; N uni25AD ; G 2536
U 9646 ; WX 550 ; N uni25AE ; G 2537
U 9647 ; WX 550 ; N uni25AF ; G 2538
U 9648 ; WX 769 ; N uni25B0 ; G 2539
U 9649 ; WX 769 ; N uni25B1 ; G 2540
U 9650 ; WX 769 ; N triagup ; G 2541
U 9651 ; WX 769 ; N uni25B3 ; G 2542
U 9652 ; WX 502 ; N uni25B4 ; G 2543
U 9653 ; WX 502 ; N uni25B5 ; G 2544
U 9654 ; WX 769 ; N uni25B6 ; G 2545
U 9655 ; WX 769 ; N uni25B7 ; G 2546
U 9656 ; WX 502 ; N uni25B8 ; G 2547
U 9657 ; WX 502 ; N uni25B9 ; G 2548
U 9658 ; WX 769 ; N triagrt ; G 2549
U 9659 ; WX 769 ; N uni25BB ; G 2550
U 9660 ; WX 769 ; N triagdn ; G 2551
U 9661 ; WX 769 ; N uni25BD ; G 2552
U 9662 ; WX 502 ; N uni25BE ; G 2553
U 9663 ; WX 502 ; N uni25BF ; G 2554
U 9664 ; WX 769 ; N uni25C0 ; G 2555
U 9665 ; WX 769 ; N uni25C1 ; G 2556
U 9666 ; WX 502 ; N uni25C2 ; G 2557
U 9667 ; WX 502 ; N uni25C3 ; G 2558
U 9668 ; WX 769 ; N triaglf ; G 2559
U 9669 ; WX 769 ; N uni25C5 ; G 2560
U 9670 ; WX 769 ; N uni25C6 ; G 2561
U 9671 ; WX 769 ; N uni25C7 ; G 2562
U 9672 ; WX 769 ; N uni25C8 ; G 2563
U 9673 ; WX 873 ; N uni25C9 ; G 2564
U 9674 ; WX 494 ; N lozenge ; G 2565
U 9675 ; WX 873 ; N circle ; G 2566
U 9676 ; WX 873 ; N uni25CC ; G 2567
U 9677 ; WX 873 ; N uni25CD ; G 2568
U 9678 ; WX 873 ; N uni25CE ; G 2569
U 9679 ; WX 873 ; N H18533 ; G 2570
U 9680 ; WX 873 ; N uni25D0 ; G 2571
U 9681 ; WX 873 ; N uni25D1 ; G 2572
U 9682 ; WX 873 ; N uni25D2 ; G 2573
U 9683 ; WX 873 ; N uni25D3 ; G 2574
U 9684 ; WX 873 ; N uni25D4 ; G 2575
U 9685 ; WX 873 ; N uni25D5 ; G 2576
U 9686 ; WX 527 ; N uni25D6 ; G 2577
U 9687 ; WX 527 ; N uni25D7 ; G 2578
U 9688 ; WX 791 ; N invbullet ; G 2579
U 9689 ; WX 970 ; N invcircle ; G 2580
U 9690 ; WX 970 ; N uni25DA ; G 2581
U 9691 ; WX 970 ; N uni25DB ; G 2582
U 9692 ; WX 387 ; N uni25DC ; G 2583
U 9693 ; WX 387 ; N uni25DD ; G 2584
U 9694 ; WX 387 ; N uni25DE ; G 2585
U 9695 ; WX 387 ; N uni25DF ; G 2586
U 9696 ; WX 873 ; N uni25E0 ; G 2587
U 9697 ; WX 873 ; N uni25E1 ; G 2588
U 9698 ; WX 769 ; N uni25E2 ; G 2589
U 9699 ; WX 769 ; N uni25E3 ; G 2590
U 9700 ; WX 769 ; N uni25E4 ; G 2591
U 9701 ; WX 769 ; N uni25E5 ; G 2592
U 9702 ; WX 590 ; N openbullet ; G 2593
U 9703 ; WX 945 ; N uni25E7 ; G 2594
U 9704 ; WX 945 ; N uni25E8 ; G 2595
U 9705 ; WX 945 ; N uni25E9 ; G 2596
U 9706 ; WX 945 ; N uni25EA ; G 2597
U 9707 ; WX 945 ; N uni25EB ; G 2598
U 9708 ; WX 769 ; N uni25EC ; G 2599
U 9709 ; WX 769 ; N uni25ED ; G 2600
U 9710 ; WX 769 ; N uni25EE ; G 2601
U 9711 ; WX 1119 ; N uni25EF ; G 2602
U 9712 ; WX 945 ; N uni25F0 ; G 2603
U 9713 ; WX 945 ; N uni25F1 ; G 2604
U 9714 ; WX 945 ; N uni25F2 ; G 2605
U 9715 ; WX 945 ; N uni25F3 ; G 2606
U 9716 ; WX 873 ; N uni25F4 ; G 2607
U 9717 ; WX 873 ; N uni25F5 ; G 2608
U 9718 ; WX 873 ; N uni25F6 ; G 2609
U 9719 ; WX 873 ; N uni25F7 ; G 2610
U 9720 ; WX 769 ; N uni25F8 ; G 2611
U 9721 ; WX 769 ; N uni25F9 ; G 2612
U 9722 ; WX 769 ; N uni25FA ; G 2613
U 9723 ; WX 830 ; N uni25FB ; G 2614
U 9724 ; WX 830 ; N uni25FC ; G 2615
U 9725 ; WX 732 ; N uni25FD ; G 2616
U 9726 ; WX 732 ; N uni25FE ; G 2617
U 9727 ; WX 769 ; N uni25FF ; G 2618
U 9728 ; WX 896 ; N uni2600 ; G 2619
U 9784 ; WX 896 ; N uni2638 ; G 2620
U 9785 ; WX 896 ; N uni2639 ; G 2621
U 9786 ; WX 896 ; N smileface ; G 2622
U 9787 ; WX 896 ; N invsmileface ; G 2623
U 9788 ; WX 896 ; N sun ; G 2624
U 9791 ; WX 614 ; N uni263F ; G 2625
U 9792 ; WX 731 ; N female ; G 2626
U 9793 ; WX 731 ; N uni2641 ; G 2627
U 9794 ; WX 896 ; N male ; G 2628
U 9795 ; WX 896 ; N uni2643 ; G 2629
U 9796 ; WX 896 ; N uni2644 ; G 2630
U 9797 ; WX 896 ; N uni2645 ; G 2631
U 9798 ; WX 896 ; N uni2646 ; G 2632
U 9799 ; WX 896 ; N uni2647 ; G 2633
U 9824 ; WX 896 ; N spade ; G 2634
U 9825 ; WX 896 ; N uni2661 ; G 2635
U 9826 ; WX 896 ; N uni2662 ; G 2636
U 9827 ; WX 896 ; N club ; G 2637
U 9828 ; WX 896 ; N uni2664 ; G 2638
U 9829 ; WX 896 ; N heart ; G 2639
U 9830 ; WX 896 ; N diamond ; G 2640
U 9831 ; WX 896 ; N uni2667 ; G 2641
U 9833 ; WX 472 ; N uni2669 ; G 2642
U 9834 ; WX 638 ; N musicalnote ; G 2643
U 9835 ; WX 896 ; N musicalnotedbl ; G 2644
U 9836 ; WX 896 ; N uni266C ; G 2645
U 9837 ; WX 472 ; N uni266D ; G 2646
U 9838 ; WX 357 ; N uni266E ; G 2647
U 9839 ; WX 484 ; N uni266F ; G 2648
U 10145 ; WX 838 ; N uni27A1 ; G 2649
U 10181 ; WX 457 ; N uni27C5 ; G 2650
U 10182 ; WX 457 ; N uni27C6 ; G 2651
U 10208 ; WX 494 ; N uni27E0 ; G 2652
U 10216 ; WX 457 ; N uni27E8 ; G 2653
U 10217 ; WX 457 ; N uni27E9 ; G 2654
U 10224 ; WX 838 ; N uni27F0 ; G 2655
U 10225 ; WX 838 ; N uni27F1 ; G 2656
U 10226 ; WX 838 ; N uni27F2 ; G 2657
U 10227 ; WX 838 ; N uni27F3 ; G 2658
U 10228 ; WX 1033 ; N uni27F4 ; G 2659
U 10229 ; WX 1434 ; N uni27F5 ; G 2660
U 10230 ; WX 1434 ; N uni27F6 ; G 2661
U 10231 ; WX 1434 ; N uni27F7 ; G 2662
U 10232 ; WX 1434 ; N uni27F8 ; G 2663
U 10233 ; WX 1434 ; N uni27F9 ; G 2664
U 10234 ; WX 1434 ; N uni27FA ; G 2665
U 10235 ; WX 1434 ; N uni27FB ; G 2666
U 10236 ; WX 1434 ; N uni27FC ; G 2667
U 10237 ; WX 1434 ; N uni27FD ; G 2668
U 10238 ; WX 1434 ; N uni27FE ; G 2669
U 10239 ; WX 1434 ; N uni27FF ; G 2670
U 10240 ; WX 781 ; N uni2800 ; G 2671
U 10241 ; WX 781 ; N uni2801 ; G 2672
U 10242 ; WX 781 ; N uni2802 ; G 2673
U 10243 ; WX 781 ; N uni2803 ; G 2674
U 10244 ; WX 781 ; N uni2804 ; G 2675
U 10245 ; WX 781 ; N uni2805 ; G 2676
U 10246 ; WX 781 ; N uni2806 ; G 2677
U 10247 ; WX 781 ; N uni2807 ; G 2678
U 10248 ; WX 781 ; N uni2808 ; G 2679
U 10249 ; WX 781 ; N uni2809 ; G 2680
U 10250 ; WX 781 ; N uni280A ; G 2681
U 10251 ; WX 781 ; N uni280B ; G 2682
U 10252 ; WX 781 ; N uni280C ; G 2683
U 10253 ; WX 781 ; N uni280D ; G 2684
U 10254 ; WX 781 ; N uni280E ; G 2685
U 10255 ; WX 781 ; N uni280F ; G 2686
U 10256 ; WX 781 ; N uni2810 ; G 2687
U 10257 ; WX 781 ; N uni2811 ; G 2688
U 10258 ; WX 781 ; N uni2812 ; G 2689
U 10259 ; WX 781 ; N uni2813 ; G 2690
U 10260 ; WX 781 ; N uni2814 ; G 2691
U 10261 ; WX 781 ; N uni2815 ; G 2692
U 10262 ; WX 781 ; N uni2816 ; G 2693
U 10263 ; WX 781 ; N uni2817 ; G 2694
U 10264 ; WX 781 ; N uni2818 ; G 2695
U 10265 ; WX 781 ; N uni2819 ; G 2696
U 10266 ; WX 781 ; N uni281A ; G 2697
U 10267 ; WX 781 ; N uni281B ; G 2698
U 10268 ; WX 781 ; N uni281C ; G 2699
U 10269 ; WX 781 ; N uni281D ; G 2700
U 10270 ; WX 781 ; N uni281E ; G 2701
U 10271 ; WX 781 ; N uni281F ; G 2702
U 10272 ; WX 781 ; N uni2820 ; G 2703
U 10273 ; WX 781 ; N uni2821 ; G 2704
U 10274 ; WX 781 ; N uni2822 ; G 2705
U 10275 ; WX 781 ; N uni2823 ; G 2706
U 10276 ; WX 781 ; N uni2824 ; G 2707
U 10277 ; WX 781 ; N uni2825 ; G 2708
U 10278 ; WX 781 ; N uni2826 ; G 2709
U 10279 ; WX 781 ; N uni2827 ; G 2710
U 10280 ; WX 781 ; N uni2828 ; G 2711
U 10281 ; WX 781 ; N uni2829 ; G 2712
U 10282 ; WX 781 ; N uni282A ; G 2713
U 10283 ; WX 781 ; N uni282B ; G 2714
U 10284 ; WX 781 ; N uni282C ; G 2715
U 10285 ; WX 781 ; N uni282D ; G 2716
U 10286 ; WX 781 ; N uni282E ; G 2717
U 10287 ; WX 781 ; N uni282F ; G 2718
U 10288 ; WX 781 ; N uni2830 ; G 2719
U 10289 ; WX 781 ; N uni2831 ; G 2720
U 10290 ; WX 781 ; N uni2832 ; G 2721
U 10291 ; WX 781 ; N uni2833 ; G 2722
U 10292 ; WX 781 ; N uni2834 ; G 2723
U 10293 ; WX 781 ; N uni2835 ; G 2724
U 10294 ; WX 781 ; N uni2836 ; G 2725
U 10295 ; WX 781 ; N uni2837 ; G 2726
U 10296 ; WX 781 ; N uni2838 ; G 2727
U 10297 ; WX 781 ; N uni2839 ; G 2728
U 10298 ; WX 781 ; N uni283A ; G 2729
U 10299 ; WX 781 ; N uni283B ; G 2730
U 10300 ; WX 781 ; N uni283C ; G 2731
U 10301 ; WX 781 ; N uni283D ; G 2732
U 10302 ; WX 781 ; N uni283E ; G 2733
U 10303 ; WX 781 ; N uni283F ; G 2734
U 10304 ; WX 781 ; N uni2840 ; G 2735
U 10305 ; WX 781 ; N uni2841 ; G 2736
U 10306 ; WX 781 ; N uni2842 ; G 2737
U 10307 ; WX 781 ; N uni2843 ; G 2738
U 10308 ; WX 781 ; N uni2844 ; G 2739
U 10309 ; WX 781 ; N uni2845 ; G 2740
U 10310 ; WX 781 ; N uni2846 ; G 2741
U 10311 ; WX 781 ; N uni2847 ; G 2742
U 10312 ; WX 781 ; N uni2848 ; G 2743
U 10313 ; WX 781 ; N uni2849 ; G 2744
U 10314 ; WX 781 ; N uni284A ; G 2745
U 10315 ; WX 781 ; N uni284B ; G 2746
U 10316 ; WX 781 ; N uni284C ; G 2747
U 10317 ; WX 781 ; N uni284D ; G 2748
U 10318 ; WX 781 ; N uni284E ; G 2749
U 10319 ; WX 781 ; N uni284F ; G 2750
U 10320 ; WX 781 ; N uni2850 ; G 2751
U 10321 ; WX 781 ; N uni2851 ; G 2752
U 10322 ; WX 781 ; N uni2852 ; G 2753
U 10323 ; WX 781 ; N uni2853 ; G 2754
U 10324 ; WX 781 ; N uni2854 ; G 2755
U 10325 ; WX 781 ; N uni2855 ; G 2756
U 10326 ; WX 781 ; N uni2856 ; G 2757
U 10327 ; WX 781 ; N uni2857 ; G 2758
U 10328 ; WX 781 ; N uni2858 ; G 2759
U 10329 ; WX 781 ; N uni2859 ; G 2760
U 10330 ; WX 781 ; N uni285A ; G 2761
U 10331 ; WX 781 ; N uni285B ; G 2762
U 10332 ; WX 781 ; N uni285C ; G 2763
U 10333 ; WX 781 ; N uni285D ; G 2764
U 10334 ; WX 781 ; N uni285E ; G 2765
U 10335 ; WX 781 ; N uni285F ; G 2766
U 10336 ; WX 781 ; N uni2860 ; G 2767
U 10337 ; WX 781 ; N uni2861 ; G 2768
U 10338 ; WX 781 ; N uni2862 ; G 2769
U 10339 ; WX 781 ; N uni2863 ; G 2770
U 10340 ; WX 781 ; N uni2864 ; G 2771
U 10341 ; WX 781 ; N uni2865 ; G 2772
U 10342 ; WX 781 ; N uni2866 ; G 2773
U 10343 ; WX 781 ; N uni2867 ; G 2774
U 10344 ; WX 781 ; N uni2868 ; G 2775
U 10345 ; WX 781 ; N uni2869 ; G 2776
U 10346 ; WX 781 ; N uni286A ; G 2777
U 10347 ; WX 781 ; N uni286B ; G 2778
U 10348 ; WX 781 ; N uni286C ; G 2779
U 10349 ; WX 781 ; N uni286D ; G 2780
U 10350 ; WX 781 ; N uni286E ; G 2781
U 10351 ; WX 781 ; N uni286F ; G 2782
U 10352 ; WX 781 ; N uni2870 ; G 2783
U 10353 ; WX 781 ; N uni2871 ; G 2784
U 10354 ; WX 781 ; N uni2872 ; G 2785
U 10355 ; WX 781 ; N uni2873 ; G 2786
U 10356 ; WX 781 ; N uni2874 ; G 2787
U 10357 ; WX 781 ; N uni2875 ; G 2788
U 10358 ; WX 781 ; N uni2876 ; G 2789
U 10359 ; WX 781 ; N uni2877 ; G 2790
U 10360 ; WX 781 ; N uni2878 ; G 2791
U 10361 ; WX 781 ; N uni2879 ; G 2792
U 10362 ; WX 781 ; N uni287A ; G 2793
U 10363 ; WX 781 ; N uni287B ; G 2794
U 10364 ; WX 781 ; N uni287C ; G 2795
U 10365 ; WX 781 ; N uni287D ; G 2796
U 10366 ; WX 781 ; N uni287E ; G 2797
U 10367 ; WX 781 ; N uni287F ; G 2798
U 10368 ; WX 781 ; N uni2880 ; G 2799
U 10369 ; WX 781 ; N uni2881 ; G 2800
U 10370 ; WX 781 ; N uni2882 ; G 2801
U 10371 ; WX 781 ; N uni2883 ; G 2802
U 10372 ; WX 781 ; N uni2884 ; G 2803
U 10373 ; WX 781 ; N uni2885 ; G 2804
U 10374 ; WX 781 ; N uni2886 ; G 2805
U 10375 ; WX 781 ; N uni2887 ; G 2806
U 10376 ; WX 781 ; N uni2888 ; G 2807
U 10377 ; WX 781 ; N uni2889 ; G 2808
U 10378 ; WX 781 ; N uni288A ; G 2809
U 10379 ; WX 781 ; N uni288B ; G 2810
U 10380 ; WX 781 ; N uni288C ; G 2811
U 10381 ; WX 781 ; N uni288D ; G 2812
U 10382 ; WX 781 ; N uni288E ; G 2813
U 10383 ; WX 781 ; N uni288F ; G 2814
U 10384 ; WX 781 ; N uni2890 ; G 2815
U 10385 ; WX 781 ; N uni2891 ; G 2816
U 10386 ; WX 781 ; N uni2892 ; G 2817
U 10387 ; WX 781 ; N uni2893 ; G 2818
U 10388 ; WX 781 ; N uni2894 ; G 2819
U 10389 ; WX 781 ; N uni2895 ; G 2820
U 10390 ; WX 781 ; N uni2896 ; G 2821
U 10391 ; WX 781 ; N uni2897 ; G 2822
U 10392 ; WX 781 ; N uni2898 ; G 2823
U 10393 ; WX 781 ; N uni2899 ; G 2824
U 10394 ; WX 781 ; N uni289A ; G 2825
U 10395 ; WX 781 ; N uni289B ; G 2826
U 10396 ; WX 781 ; N uni289C ; G 2827
U 10397 ; WX 781 ; N uni289D ; G 2828
U 10398 ; WX 781 ; N uni289E ; G 2829
U 10399 ; WX 781 ; N uni289F ; G 2830
U 10400 ; WX 781 ; N uni28A0 ; G 2831
U 10401 ; WX 781 ; N uni28A1 ; G 2832
U 10402 ; WX 781 ; N uni28A2 ; G 2833
U 10403 ; WX 781 ; N uni28A3 ; G 2834
U 10404 ; WX 781 ; N uni28A4 ; G 2835
U 10405 ; WX 781 ; N uni28A5 ; G 2836
U 10406 ; WX 781 ; N uni28A6 ; G 2837
U 10407 ; WX 781 ; N uni28A7 ; G 2838
U 10408 ; WX 781 ; N uni28A8 ; G 2839
U 10409 ; WX 781 ; N uni28A9 ; G 2840
U 10410 ; WX 781 ; N uni28AA ; G 2841
U 10411 ; WX 781 ; N uni28AB ; G 2842
U 10412 ; WX 781 ; N uni28AC ; G 2843
U 10413 ; WX 781 ; N uni28AD ; G 2844
U 10414 ; WX 781 ; N uni28AE ; G 2845
U 10415 ; WX 781 ; N uni28AF ; G 2846
U 10416 ; WX 781 ; N uni28B0 ; G 2847
U 10417 ; WX 781 ; N uni28B1 ; G 2848
U 10418 ; WX 781 ; N uni28B2 ; G 2849
U 10419 ; WX 781 ; N uni28B3 ; G 2850
U 10420 ; WX 781 ; N uni28B4 ; G 2851
U 10421 ; WX 781 ; N uni28B5 ; G 2852
U 10422 ; WX 781 ; N uni28B6 ; G 2853
U 10423 ; WX 781 ; N uni28B7 ; G 2854
U 10424 ; WX 781 ; N uni28B8 ; G 2855
U 10425 ; WX 781 ; N uni28B9 ; G 2856
U 10426 ; WX 781 ; N uni28BA ; G 2857
U 10427 ; WX 781 ; N uni28BB ; G 2858
U 10428 ; WX 781 ; N uni28BC ; G 2859
U 10429 ; WX 781 ; N uni28BD ; G 2860
U 10430 ; WX 781 ; N uni28BE ; G 2861
U 10431 ; WX 781 ; N uni28BF ; G 2862
U 10432 ; WX 781 ; N uni28C0 ; G 2863
U 10433 ; WX 781 ; N uni28C1 ; G 2864
U 10434 ; WX 781 ; N uni28C2 ; G 2865
U 10435 ; WX 781 ; N uni28C3 ; G 2866
U 10436 ; WX 781 ; N uni28C4 ; G 2867
U 10437 ; WX 781 ; N uni28C5 ; G 2868
U 10438 ; WX 781 ; N uni28C6 ; G 2869
U 10439 ; WX 781 ; N uni28C7 ; G 2870
U 10440 ; WX 781 ; N uni28C8 ; G 2871
U 10441 ; WX 781 ; N uni28C9 ; G 2872
U 10442 ; WX 781 ; N uni28CA ; G 2873
U 10443 ; WX 781 ; N uni28CB ; G 2874
U 10444 ; WX 781 ; N uni28CC ; G 2875
U 10445 ; WX 781 ; N uni28CD ; G 2876
U 10446 ; WX 781 ; N uni28CE ; G 2877
U 10447 ; WX 781 ; N uni28CF ; G 2878
U 10448 ; WX 781 ; N uni28D0 ; G 2879
U 10449 ; WX 781 ; N uni28D1 ; G 2880
U 10450 ; WX 781 ; N uni28D2 ; G 2881
U 10451 ; WX 781 ; N uni28D3 ; G 2882
U 10452 ; WX 781 ; N uni28D4 ; G 2883
U 10453 ; WX 781 ; N uni28D5 ; G 2884
U 10454 ; WX 781 ; N uni28D6 ; G 2885
U 10455 ; WX 781 ; N uni28D7 ; G 2886
U 10456 ; WX 781 ; N uni28D8 ; G 2887
U 10457 ; WX 781 ; N uni28D9 ; G 2888
U 10458 ; WX 781 ; N uni28DA ; G 2889
U 10459 ; WX 781 ; N uni28DB ; G 2890
U 10460 ; WX 781 ; N uni28DC ; G 2891
U 10461 ; WX 781 ; N uni28DD ; G 2892
U 10462 ; WX 781 ; N uni28DE ; G 2893
U 10463 ; WX 781 ; N uni28DF ; G 2894
U 10464 ; WX 781 ; N uni28E0 ; G 2895
U 10465 ; WX 781 ; N uni28E1 ; G 2896
U 10466 ; WX 781 ; N uni28E2 ; G 2897
U 10467 ; WX 781 ; N uni28E3 ; G 2898
U 10468 ; WX 781 ; N uni28E4 ; G 2899
U 10469 ; WX 781 ; N uni28E5 ; G 2900
U 10470 ; WX 781 ; N uni28E6 ; G 2901
U 10471 ; WX 781 ; N uni28E7 ; G 2902
U 10472 ; WX 781 ; N uni28E8 ; G 2903
U 10473 ; WX 781 ; N uni28E9 ; G 2904
U 10474 ; WX 781 ; N uni28EA ; G 2905
U 10475 ; WX 781 ; N uni28EB ; G 2906
U 10476 ; WX 781 ; N uni28EC ; G 2907
U 10477 ; WX 781 ; N uni28ED ; G 2908
U 10478 ; WX 781 ; N uni28EE ; G 2909
U 10479 ; WX 781 ; N uni28EF ; G 2910
U 10480 ; WX 781 ; N uni28F0 ; G 2911
U 10481 ; WX 781 ; N uni28F1 ; G 2912
U 10482 ; WX 781 ; N uni28F2 ; G 2913
U 10483 ; WX 781 ; N uni28F3 ; G 2914
U 10484 ; WX 781 ; N uni28F4 ; G 2915
U 10485 ; WX 781 ; N uni28F5 ; G 2916
U 10486 ; WX 781 ; N uni28F6 ; G 2917
U 10487 ; WX 781 ; N uni28F7 ; G 2918
U 10488 ; WX 781 ; N uni28F8 ; G 2919
U 10489 ; WX 781 ; N uni28F9 ; G 2920
U 10490 ; WX 781 ; N uni28FA ; G 2921
U 10491 ; WX 781 ; N uni28FB ; G 2922
U 10492 ; WX 781 ; N uni28FC ; G 2923
U 10493 ; WX 781 ; N uni28FD ; G 2924
U 10494 ; WX 781 ; N uni28FE ; G 2925
U 10495 ; WX 781 ; N uni28FF ; G 2926
U 10496 ; WX 838 ; N uni2900 ; G 2927
U 10497 ; WX 838 ; N uni2901 ; G 2928
U 10498 ; WX 838 ; N uni2902 ; G 2929
U 10499 ; WX 838 ; N uni2903 ; G 2930
U 10500 ; WX 838 ; N uni2904 ; G 2931
U 10501 ; WX 838 ; N uni2905 ; G 2932
U 10502 ; WX 838 ; N uni2906 ; G 2933
U 10503 ; WX 838 ; N uni2907 ; G 2934
U 10504 ; WX 838 ; N uni2908 ; G 2935
U 10505 ; WX 838 ; N uni2909 ; G 2936
U 10506 ; WX 838 ; N uni290A ; G 2937
U 10507 ; WX 838 ; N uni290B ; G 2938
U 10508 ; WX 838 ; N uni290C ; G 2939
U 10509 ; WX 838 ; N uni290D ; G 2940
U 10510 ; WX 838 ; N uni290E ; G 2941
U 10511 ; WX 838 ; N uni290F ; G 2942
U 10512 ; WX 838 ; N uni2910 ; G 2943
U 10513 ; WX 838 ; N uni2911 ; G 2944
U 10514 ; WX 838 ; N uni2912 ; G 2945
U 10515 ; WX 838 ; N uni2913 ; G 2946
U 10516 ; WX 838 ; N uni2914 ; G 2947
U 10517 ; WX 838 ; N uni2915 ; G 2948
U 10518 ; WX 838 ; N uni2916 ; G 2949
U 10519 ; WX 838 ; N uni2917 ; G 2950
U 10520 ; WX 838 ; N uni2918 ; G 2951
U 10521 ; WX 838 ; N uni2919 ; G 2952
U 10522 ; WX 838 ; N uni291A ; G 2953
U 10523 ; WX 838 ; N uni291B ; G 2954
U 10524 ; WX 838 ; N uni291C ; G 2955
U 10525 ; WX 838 ; N uni291D ; G 2956
U 10526 ; WX 838 ; N uni291E ; G 2957
U 10527 ; WX 838 ; N uni291F ; G 2958
U 10528 ; WX 838 ; N uni2920 ; G 2959
U 10529 ; WX 838 ; N uni2921 ; G 2960
U 10530 ; WX 838 ; N uni2922 ; G 2961
U 10531 ; WX 838 ; N uni2923 ; G 2962
U 10532 ; WX 838 ; N uni2924 ; G 2963
U 10533 ; WX 838 ; N uni2925 ; G 2964
U 10534 ; WX 838 ; N uni2926 ; G 2965
U 10535 ; WX 838 ; N uni2927 ; G 2966
U 10536 ; WX 838 ; N uni2928 ; G 2967
U 10537 ; WX 838 ; N uni2929 ; G 2968
U 10538 ; WX 838 ; N uni292A ; G 2969
U 10539 ; WX 838 ; N uni292B ; G 2970
U 10540 ; WX 838 ; N uni292C ; G 2971
U 10541 ; WX 838 ; N uni292D ; G 2972
U 10542 ; WX 838 ; N uni292E ; G 2973
U 10543 ; WX 838 ; N uni292F ; G 2974
U 10544 ; WX 838 ; N uni2930 ; G 2975
U 10545 ; WX 838 ; N uni2931 ; G 2976
U 10546 ; WX 838 ; N uni2932 ; G 2977
U 10547 ; WX 838 ; N uni2933 ; G 2978
U 10548 ; WX 838 ; N uni2934 ; G 2979
U 10549 ; WX 838 ; N uni2935 ; G 2980
U 10550 ; WX 838 ; N uni2936 ; G 2981
U 10551 ; WX 838 ; N uni2937 ; G 2982
U 10552 ; WX 838 ; N uni2938 ; G 2983
U 10553 ; WX 838 ; N uni2939 ; G 2984
U 10554 ; WX 838 ; N uni293A ; G 2985
U 10555 ; WX 838 ; N uni293B ; G 2986
U 10556 ; WX 838 ; N uni293C ; G 2987
U 10557 ; WX 838 ; N uni293D ; G 2988
U 10558 ; WX 838 ; N uni293E ; G 2989
U 10559 ; WX 838 ; N uni293F ; G 2990
U 10560 ; WX 838 ; N uni2940 ; G 2991
U 10561 ; WX 838 ; N uni2941 ; G 2992
U 10562 ; WX 838 ; N uni2942 ; G 2993
U 10563 ; WX 838 ; N uni2943 ; G 2994
U 10564 ; WX 838 ; N uni2944 ; G 2995
U 10565 ; WX 838 ; N uni2945 ; G 2996
U 10566 ; WX 838 ; N uni2946 ; G 2997
U 10567 ; WX 838 ; N uni2947 ; G 2998
U 10568 ; WX 838 ; N uni2948 ; G 2999
U 10569 ; WX 838 ; N uni2949 ; G 3000
U 10570 ; WX 838 ; N uni294A ; G 3001
U 10571 ; WX 838 ; N uni294B ; G 3002
U 10572 ; WX 838 ; N uni294C ; G 3003
U 10573 ; WX 838 ; N uni294D ; G 3004
U 10574 ; WX 838 ; N uni294E ; G 3005
U 10575 ; WX 838 ; N uni294F ; G 3006
U 10576 ; WX 838 ; N uni2950 ; G 3007
U 10577 ; WX 838 ; N uni2951 ; G 3008
U 10578 ; WX 838 ; N uni2952 ; G 3009
U 10579 ; WX 838 ; N uni2953 ; G 3010
U 10580 ; WX 838 ; N uni2954 ; G 3011
U 10581 ; WX 838 ; N uni2955 ; G 3012
U 10582 ; WX 838 ; N uni2956 ; G 3013
U 10583 ; WX 838 ; N uni2957 ; G 3014
U 10584 ; WX 838 ; N uni2958 ; G 3015
U 10585 ; WX 838 ; N uni2959 ; G 3016
U 10586 ; WX 838 ; N uni295A ; G 3017
U 10587 ; WX 838 ; N uni295B ; G 3018
U 10588 ; WX 838 ; N uni295C ; G 3019
U 10589 ; WX 838 ; N uni295D ; G 3020
U 10590 ; WX 838 ; N uni295E ; G 3021
U 10591 ; WX 838 ; N uni295F ; G 3022
U 10592 ; WX 838 ; N uni2960 ; G 3023
U 10593 ; WX 838 ; N uni2961 ; G 3024
U 10594 ; WX 838 ; N uni2962 ; G 3025
U 10595 ; WX 838 ; N uni2963 ; G 3026
U 10596 ; WX 838 ; N uni2964 ; G 3027
U 10597 ; WX 838 ; N uni2965 ; G 3028
U 10598 ; WX 838 ; N uni2966 ; G 3029
U 10599 ; WX 838 ; N uni2967 ; G 3030
U 10600 ; WX 838 ; N uni2968 ; G 3031
U 10601 ; WX 838 ; N uni2969 ; G 3032
U 10602 ; WX 838 ; N uni296A ; G 3033
U 10603 ; WX 838 ; N uni296B ; G 3034
U 10604 ; WX 838 ; N uni296C ; G 3035
U 10605 ; WX 838 ; N uni296D ; G 3036
U 10606 ; WX 838 ; N uni296E ; G 3037
U 10607 ; WX 838 ; N uni296F ; G 3038
U 10608 ; WX 838 ; N uni2970 ; G 3039
U 10609 ; WX 838 ; N uni2971 ; G 3040
U 10610 ; WX 838 ; N uni2972 ; G 3041
U 10611 ; WX 838 ; N uni2973 ; G 3042
U 10612 ; WX 838 ; N uni2974 ; G 3043
U 10613 ; WX 838 ; N uni2975 ; G 3044
U 10614 ; WX 838 ; N uni2976 ; G 3045
U 10615 ; WX 1032 ; N uni2977 ; G 3046
U 10616 ; WX 838 ; N uni2978 ; G 3047
U 10617 ; WX 838 ; N uni2979 ; G 3048
U 10618 ; WX 960 ; N uni297A ; G 3049
U 10619 ; WX 838 ; N uni297B ; G 3050
U 10620 ; WX 838 ; N uni297C ; G 3051
U 10621 ; WX 838 ; N uni297D ; G 3052
U 10622 ; WX 838 ; N uni297E ; G 3053
U 10623 ; WX 838 ; N uni297F ; G 3054
U 10731 ; WX 494 ; N uni29EB ; G 3055
U 10764 ; WX 1782 ; N uni2A0C ; G 3056
U 10765 ; WX 610 ; N uni2A0D ; G 3057
U 10766 ; WX 610 ; N uni2A0E ; G 3058
U 10799 ; WX 838 ; N uni2A2F ; G 3059
U 10858 ; WX 838 ; N uni2A6A ; G 3060
U 10859 ; WX 838 ; N uni2A6B ; G 3061
U 11008 ; WX 838 ; N uni2B00 ; G 3062
U 11009 ; WX 838 ; N uni2B01 ; G 3063
U 11010 ; WX 838 ; N uni2B02 ; G 3064
U 11011 ; WX 838 ; N uni2B03 ; G 3065
U 11012 ; WX 838 ; N uni2B04 ; G 3066
U 11013 ; WX 838 ; N uni2B05 ; G 3067
U 11014 ; WX 838 ; N uni2B06 ; G 3068
U 11015 ; WX 838 ; N uni2B07 ; G 3069
U 11016 ; WX 838 ; N uni2B08 ; G 3070
U 11017 ; WX 838 ; N uni2B09 ; G 3071
U 11018 ; WX 838 ; N uni2B0A ; G 3072
U 11019 ; WX 838 ; N uni2B0B ; G 3073
U 11020 ; WX 838 ; N uni2B0C ; G 3074
U 11021 ; WX 838 ; N uni2B0D ; G 3075
U 11022 ; WX 838 ; N uni2B0E ; G 3076
U 11023 ; WX 838 ; N uni2B0F ; G 3077
U 11024 ; WX 838 ; N uni2B10 ; G 3078
U 11025 ; WX 838 ; N uni2B11 ; G 3079
U 11026 ; WX 945 ; N uni2B12 ; G 3080
U 11027 ; WX 945 ; N uni2B13 ; G 3081
U 11028 ; WX 945 ; N uni2B14 ; G 3082
U 11029 ; WX 945 ; N uni2B15 ; G 3083
U 11030 ; WX 769 ; N uni2B16 ; G 3084
U 11031 ; WX 769 ; N uni2B17 ; G 3085
U 11032 ; WX 769 ; N uni2B18 ; G 3086
U 11033 ; WX 769 ; N uni2B19 ; G 3087
U 11034 ; WX 945 ; N uni2B1A ; G 3088
U 11360 ; WX 703 ; N uni2C60 ; G 3089
U 11361 ; WX 380 ; N uni2C61 ; G 3090
U 11363 ; WX 752 ; N uni2C63 ; G 3091
U 11364 ; WX 831 ; N uni2C64 ; G 3092
U 11367 ; WX 945 ; N uni2C67 ; G 3093
U 11368 ; WX 727 ; N uni2C68 ; G 3094
U 11369 ; WX 869 ; N uni2C69 ; G 3095
U 11370 ; WX 693 ; N uni2C6A ; G 3096
U 11371 ; WX 730 ; N uni2C6B ; G 3097
U 11372 ; WX 568 ; N uni2C6C ; G 3098
U 11373 ; WX 848 ; N uni2C6D ; G 3099
U 11374 ; WX 1107 ; N uni2C6E ; G 3100
U 11375 ; WX 776 ; N uni2C6F ; G 3101
U 11376 ; WX 848 ; N uni2C70 ; G 3102
U 11377 ; WX 709 ; N uni2C71 ; G 3103
U 11378 ; WX 1221 ; N uni2C72 ; G 3104
U 11379 ; WX 984 ; N uni2C73 ; G 3105
U 11381 ; WX 779 ; N uni2C75 ; G 3106
U 11382 ; WX 601 ; N uni2C76 ; G 3107
U 11383 ; WX 905 ; N uni2C77 ; G 3108
U 11385 ; WX 571 ; N uni2C79 ; G 3109
U 11386 ; WX 667 ; N uni2C7A ; G 3110
U 11387 ; WX 617 ; N uni2C7B ; G 3111
U 11388 ; WX 313 ; N uni2C7C ; G 3112
U 11389 ; WX 489 ; N uni2C7D ; G 3113
U 11390 ; WX 722 ; N uni2C7E ; G 3114
U 11391 ; WX 730 ; N uni2C7F ; G 3115
U 11520 ; WX 773 ; N uni2D00 ; G 3116
U 11521 ; WX 635 ; N uni2D01 ; G 3117
U 11522 ; WX 804 ; N uni2D02 ; G 3118
U 11523 ; WX 658 ; N uni2D03 ; G 3119
U 11524 ; WX 788 ; N uni2D04 ; G 3120
U 11525 ; WX 962 ; N uni2D05 ; G 3121
U 11526 ; WX 756 ; N uni2D06 ; G 3122
U 11527 ; WX 960 ; N uni2D07 ; G 3123
U 11528 ; WX 617 ; N uni2D08 ; G 3124
U 11529 ; WX 646 ; N uni2D09 ; G 3125
U 11530 ; WX 962 ; N uni2D0A ; G 3126
U 11531 ; WX 631 ; N uni2D0B ; G 3127
U 11532 ; WX 646 ; N uni2D0C ; G 3128
U 11533 ; WX 962 ; N uni2D0D ; G 3129
U 11534 ; WX 846 ; N uni2D0E ; G 3130
U 11535 ; WX 866 ; N uni2D0F ; G 3131
U 11536 ; WX 961 ; N uni2D10 ; G 3132
U 11537 ; WX 645 ; N uni2D11 ; G 3133
U 11538 ; WX 645 ; N uni2D12 ; G 3134
U 11539 ; WX 959 ; N uni2D13 ; G 3135
U 11540 ; WX 945 ; N uni2D14 ; G 3136
U 11541 ; WX 863 ; N uni2D15 ; G 3137
U 11542 ; WX 644 ; N uni2D16 ; G 3138
U 11543 ; WX 646 ; N uni2D17 ; G 3139
U 11544 ; WX 645 ; N uni2D18 ; G 3140
U 11545 ; WX 649 ; N uni2D19 ; G 3141
U 11546 ; WX 688 ; N uni2D1A ; G 3142
U 11547 ; WX 936 ; N uni2D1B ; G 3143
U 11548 ; WX 982 ; N uni2D1C ; G 3144
U 11549 ; WX 681 ; N uni2D1D ; G 3145
U 11550 ; WX 676 ; N uni2D1E ; G 3146
U 11551 ; WX 852 ; N uni2D1F ; G 3147
U 11552 ; WX 1113 ; N uni2D20 ; G 3148
U 11553 ; WX 632 ; N uni2D21 ; G 3149
U 11554 ; WX 645 ; N uni2D22 ; G 3150
U 11555 ; WX 646 ; N uni2D23 ; G 3151
U 11556 ; WX 749 ; N uni2D24 ; G 3152
U 11557 ; WX 914 ; N uni2D25 ; G 3153
U 11800 ; WX 586 ; N uni2E18 ; G 3154
U 11807 ; WX 838 ; N uni2E1F ; G 3155
U 11810 ; WX 473 ; N uni2E22 ; G 3156
U 11811 ; WX 473 ; N uni2E23 ; G 3157
U 11812 ; WX 473 ; N uni2E24 ; G 3158
U 11813 ; WX 473 ; N uni2E25 ; G 3159
U 11822 ; WX 586 ; N uni2E2E ; G 3160
U 42564 ; WX 722 ; N uniA644 ; G 3161
U 42565 ; WX 563 ; N uniA645 ; G 3162
U 42566 ; WX 468 ; N uniA646 ; G 3163
U 42567 ; WX 380 ; N uniA647 ; G 3164
U 42576 ; WX 1333 ; N uniA650 ; G 3165
U 42577 ; WX 1092 ; N uniA651 ; G 3166
U 42580 ; WX 1287 ; N uniA654 ; G 3167
U 42581 ; WX 1025 ; N uniA655 ; G 3168
U 42582 ; WX 1287 ; N uniA656 ; G 3169
U 42583 ; WX 1039 ; N uniA657 ; G 3170
U 42648 ; WX 1448 ; N uniA698 ; G 3171
U 42649 ; WX 1060 ; N uniA699 ; G 3172
U 42760 ; WX 500 ; N uniA708 ; G 3173
U 42761 ; WX 500 ; N uniA709 ; G 3174
U 42762 ; WX 500 ; N uniA70A ; G 3175
U 42763 ; WX 500 ; N uniA70B ; G 3176
U 42764 ; WX 500 ; N uniA70C ; G 3177
U 42765 ; WX 500 ; N uniA70D ; G 3178
U 42766 ; WX 500 ; N uniA70E ; G 3179
U 42767 ; WX 500 ; N uniA70F ; G 3180
U 42768 ; WX 500 ; N uniA710 ; G 3181
U 42769 ; WX 500 ; N uniA711 ; G 3182
U 42770 ; WX 500 ; N uniA712 ; G 3183
U 42771 ; WX 500 ; N uniA713 ; G 3184
U 42772 ; WX 500 ; N uniA714 ; G 3185
U 42773 ; WX 500 ; N uniA715 ; G 3186
U 42774 ; WX 500 ; N uniA716 ; G 3187
U 42779 ; WX 384 ; N uniA71B ; G 3188
U 42780 ; WX 384 ; N uniA71C ; G 3189
U 42781 ; WX 276 ; N uniA71D ; G 3190
U 42782 ; WX 276 ; N uniA71E ; G 3191
U 42783 ; WX 276 ; N uniA71F ; G 3192
U 42790 ; WX 945 ; N uniA726 ; G 3193
U 42791 ; WX 712 ; N uniA727 ; G 3194
U 42792 ; WX 1003 ; N uniA728 ; G 3195
U 42793 ; WX 909 ; N uniA729 ; G 3196
U 42794 ; WX 696 ; N uniA72A ; G 3197
U 42795 ; WX 609 ; N uniA72B ; G 3198
U 42796 ; WX 634 ; N uniA72C ; G 3199
U 42797 ; WX 598 ; N uniA72D ; G 3200
U 42798 ; WX 741 ; N uniA72E ; G 3201
U 42799 ; WX 706 ; N uniA72F ; G 3202
U 42800 ; WX 592 ; N uniA730 ; G 3203
U 42801 ; WX 563 ; N uniA731 ; G 3204
U 42802 ; WX 1301 ; N uniA732 ; G 3205
U 42803 ; WX 986 ; N uniA733 ; G 3206
U 42804 ; WX 1261 ; N uniA734 ; G 3207
U 42805 ; WX 1004 ; N uniA735 ; G 3208
U 42806 ; WX 1168 ; N uniA736 ; G 3209
U 42807 ; WX 1008 ; N uniA737 ; G 3210
U 42808 ; WX 1016 ; N uniA738 ; G 3211
U 42809 ; WX 813 ; N uniA739 ; G 3212
U 42810 ; WX 1016 ; N uniA73A ; G 3213
U 42811 ; WX 813 ; N uniA73B ; G 3214
U 42812 ; WX 994 ; N uniA73C ; G 3215
U 42813 ; WX 847 ; N uniA73D ; G 3216
U 42814 ; WX 796 ; N uniA73E ; G 3217
U 42815 ; WX 609 ; N uniA73F ; G 3218
U 42816 ; WX 910 ; N uniA740 ; G 3219
U 42817 ; WX 722 ; N uniA741 ; G 3220
U 42822 ; WX 916 ; N uniA746 ; G 3221
U 42823 ; WX 581 ; N uniA747 ; G 3222
U 42826 ; WX 1010 ; N uniA74A ; G 3223
U 42827 ; WX 770 ; N uniA74B ; G 3224
U 42830 ; WX 1448 ; N uniA74E ; G 3225
U 42831 ; WX 1060 ; N uniA74F ; G 3226
U 42856 ; WX 787 ; N uniA768 ; G 3227
U 42857 ; WX 716 ; N uniA769 ; G 3228
U 42875 ; WX 694 ; N uniA77B ; G 3229
U 42876 ; WX 527 ; N uniA77C ; G 3230
U 42880 ; WX 703 ; N uniA780 ; G 3231
U 42881 ; WX 380 ; N uniA781 ; G 3232
U 42882 ; WX 872 ; N uniA782 ; G 3233
U 42883 ; WX 727 ; N uniA783 ; G 3234
U 42884 ; WX 694 ; N uniA784 ; G 3235
U 42885 ; WX 527 ; N uniA785 ; G 3236
U 42886 ; WX 796 ; N uniA786 ; G 3237
U 42887 ; WX 609 ; N uniA787 ; G 3238
U 42891 ; WX 439 ; N uniA78B ; G 3239
U 42892 ; WX 306 ; N uniA78C ; G 3240
U 42893 ; WX 913 ; N uniA78D ; G 3241
U 42896 ; WX 914 ; N uniA790 ; G 3242
U 42897 ; WX 727 ; N uniA791 ; G 3243
U 42922 ; WX 945 ; N uniA7AA ; G 3244
U 43000 ; WX 595 ; N uniA7F8 ; G 3245
U 43001 ; WX 647 ; N uniA7F9 ; G 3246
U 43002 ; WX 1069 ; N uniA7FA ; G 3247
U 43003 ; WX 710 ; N uniA7FB ; G 3248
U 43004 ; WX 752 ; N uniA7FC ; G 3249
U 43005 ; WX 1107 ; N uniA7FD ; G 3250
U 43006 ; WX 468 ; N uniA7FE ; G 3251
U 43007 ; WX 1286 ; N uniA7FF ; G 3252
U 62464 ; WX 705 ; N uniF400 ; G 3253
U 62465 ; WX 716 ; N uniF401 ; G 3254
U 62466 ; WX 765 ; N uniF402 ; G 3255
U 62467 ; WX 999 ; N uniF403 ; G 3256
U 62468 ; WX 716 ; N uniF404 ; G 3257
U 62469 ; WX 710 ; N uniF405 ; G 3258
U 62470 ; WX 776 ; N uniF406 ; G 3259
U 62471 ; WX 1038 ; N uniF407 ; G 3260
U 62472 ; WX 716 ; N uniF408 ; G 3261
U 62473 ; WX 716 ; N uniF409 ; G 3262
U 62474 ; WX 1309 ; N uniF40A ; G 3263
U 62475 ; WX 734 ; N uniF40B ; G 3264
U 62476 ; WX 733 ; N uniF40C ; G 3265
U 62477 ; WX 1004 ; N uniF40D ; G 3266
U 62478 ; WX 716 ; N uniF40E ; G 3267
U 62479 ; WX 733 ; N uniF40F ; G 3268
U 62480 ; WX 1050 ; N uniF410 ; G 3269
U 62481 ; WX 797 ; N uniF411 ; G 3270
U 62482 ; WX 850 ; N uniF412 ; G 3271
U 62483 ; WX 799 ; N uniF413 ; G 3272
U 62484 ; WX 996 ; N uniF414 ; G 3273
U 62485 ; WX 732 ; N uniF415 ; G 3274
U 62486 ; WX 987 ; N uniF416 ; G 3275
U 62487 ; WX 731 ; N uniF417 ; G 3276
U 62488 ; WX 739 ; N uniF418 ; G 3277
U 62489 ; WX 733 ; N uniF419 ; G 3278
U 62490 ; WX 780 ; N uniF41A ; G 3279
U 62491 ; WX 733 ; N uniF41B ; G 3280
U 62492 ; WX 739 ; N uniF41C ; G 3281
U 62493 ; WX 717 ; N uniF41D ; G 3282
U 62494 ; WX 780 ; N uniF41E ; G 3283
U 62495 ; WX 936 ; N uniF41F ; G 3284
U 62496 ; WX 716 ; N uniF420 ; G 3285
U 62497 ; WX 826 ; N uniF421 ; G 3286
U 62498 ; WX 717 ; N uniF422 ; G 3287
U 62499 ; WX 716 ; N uniF423 ; G 3288
U 62500 ; WX 716 ; N uniF424 ; G 3289
U 62501 ; WX 773 ; N uniF425 ; G 3290
U 62502 ; WX 1013 ; N uniF426 ; G 3291
U 62504 ; WX 904 ; N uniF428 ; G 3292
U 63173 ; WX 667 ; N uniF6C5 ; G 3293
U 63185 ; WX 500 ; N cyrBreve ; G 3294
U 63188 ; WX 500 ; N cyrbreve ; G 3295
U 64256 ; WX 821 ; N uniFB00 ; G 3296
U 64257 ; WX 727 ; N fi ; G 3297
U 64258 ; WX 727 ; N fl ; G 3298
U 64259 ; WX 1120 ; N uniFB03 ; G 3299
U 64260 ; WX 1117 ; N uniFB04 ; G 3300
U 64261 ; WX 871 ; N uniFB05 ; G 3301
U 64262 ; WX 971 ; N uniFB06 ; G 3302
U 65024 ; WX 0 ; N uniFE00 ; G 3303
U 65025 ; WX 0 ; N uniFE01 ; G 3304
U 65026 ; WX 0 ; N uniFE02 ; G 3305
U 65027 ; WX 0 ; N uniFE03 ; G 3306
U 65028 ; WX 0 ; N uniFE04 ; G 3307
U 65029 ; WX 0 ; N uniFE05 ; G 3308
U 65030 ; WX 0 ; N uniFE06 ; G 3309
U 65031 ; WX 0 ; N uniFE07 ; G 3310
U 65032 ; WX 0 ; N uniFE08 ; G 3311
U 65033 ; WX 0 ; N uniFE09 ; G 3312
U 65034 ; WX 0 ; N uniFE0A ; G 3313
U 65035 ; WX 0 ; N uniFE0B ; G 3314
U 65036 ; WX 0 ; N uniFE0C ; G 3315
U 65037 ; WX 0 ; N uniFE0D ; G 3316
U 65038 ; WX 0 ; N uniFE0E ; G 3317
U 65039 ; WX 0 ; N uniFE0F ; G 3318
U 65529 ; WX 0 ; N uniFFF9 ; G 3319
U 65530 ; WX 0 ; N uniFFFA ; G 3320
U 65531 ; WX 0 ; N uniFFFB ; G 3321
U 65532 ; WX 0 ; N uniFFFC ; G 3322
U 65533 ; WX 1113 ; N uniFFFD ; G 3323
EndCharMetrics
StartKernData
StartKernPairs 1408
KPX dollar seven -112
KPX dollar nine -149
KPX dollar colon -102
KPX dollar less -102
KPX dollar I -36
KPX dollar W -36
KPX dollar Y -83
KPX dollar Z -83
KPX dollar backslash -83
KPX dollar questiondown -83
KPX dollar Aacute -83
KPX dollar Hcircumflex -112
KPX dollar hcircumflex -36
KPX dollar Hbar -112
KPX dollar hbar -36
KPX dollar Kcommaaccent -102
KPX dollar kcommaaccent -83
KPX dollar kgreenlandic -102
KPX dollar Lacute -83
KPX dollar lacute -102
KPX dollar uni01DC -112
KPX dollar uni01DD -36
KPX dollar uni01F4 -102
KPX dollar uni01F5 -83
KPX percent ampersand 38
KPX percent asterisk 38
KPX percent two 38
KPX percent less -36
KPX percent Egrave 38
KPX percent Ecircumflex 38
KPX percent Igrave 38
KPX percent Icircumflex 38
KPX percent Thorn 38
KPX percent agrave 38
KPX percent acircumflex 38
KPX percent adieresis 38
KPX percent Dcaron 38
KPX percent Dcroat 38
KPX percent Emacron 38
KPX percent Ebreve 38
KPX percent kgreenlandic -36
KPX percent lacute -36
KPX percent uni01AC 38
KPX percent uni01AE 38
KPX percent uni01F0 38
KPX percent uni01F4 -36
KPX quotesingle nine -36
KPX parenright dollar -120
KPX parenright D -112
KPX parenright H -112
KPX parenright R -112
KPX parenright U -36
KPX parenright X -36
KPX parenright cent -112
KPX parenright sterling -112
KPX parenright currency -112
KPX parenright yen -112
KPX parenright brokenbar -112
KPX parenright section -112
KPX parenright dieresis -112
KPX parenright ordfeminine -112
KPX parenright guillemotleft -112
KPX parenright logicalnot -112
KPX parenright sfthyphen -112
KPX parenright acute -112
KPX parenright mu -112
KPX parenright paragraph -112
KPX parenright periodcentered -112
KPX parenright cedilla -112
KPX parenright ordmasculine -112
KPX parenright guillemotright -36
KPX parenright onequarter -36
KPX parenright onehalf -36
KPX parenright threequarters -36
KPX parenright Acircumflex -120
KPX parenright Atilde -112
KPX parenright Adieresis -120
KPX parenright Aring -112
KPX parenright AE -120
KPX parenright Ccedilla -112
KPX parenright Otilde -112
KPX parenright multiply -112
KPX parenright Ugrave -112
KPX parenright Ucircumflex -112
KPX parenright Yacute -112
KPX parenright dcaron -112
KPX parenright dmacron -112
KPX parenright emacron -112
KPX parenright ebreve -112
KPX parenright edotaccent -36
KPX parenright eogonek -36
KPX parenright ecaron -36
KPX parenright imacron -36
KPX parenright ibreve -36
KPX parenright iogonek -36
KPX parenright dotlessi -36
KPX parenright ij -36
KPX parenright jcircumflex -36
KPX parenright uni01A5 -112
KPX parenright uni01AD -112
KPX parenright Uhorn -112
KPX parenright uni01F1 -112
KPX period dollar -83
KPX period ampersand -55
KPX period two -55
KPX period eight -73
KPX period colon -73
KPX period less -55
KPX period H -45
KPX period R -45
KPX period X -45
KPX period backslash -92
KPX period ordfeminine -45
KPX period guillemotleft -45
KPX period logicalnot -45
KPX period sfthyphen -45
KPX period acute -45
KPX period mu -45
KPX period paragraph -45
KPX period periodcentered -45
KPX period cedilla -45
KPX period ordmasculine -36
KPX period guillemotright -45
KPX period onequarter -45
KPX period onehalf -45
KPX period threequarters -45
KPX period questiondown -92
KPX period Aacute -92
KPX period Egrave -55
KPX period Icircumflex -55
KPX period Yacute -45
KPX period Ebreve -55
KPX period ebreve -45
KPX period Idot -73
KPX period dotlessi -45
KPX period lacute -55
KPX slash seven -167
KPX slash eight -112
KPX slash nine -243
KPX slash colon -139
KPX slash less -131
KPX slash backslash -73
KPX slash questiondown -73
KPX slash Aacute -73
KPX slash Hbar -167
KPX slash Idot -112
KPX slash lacute -131
KPX two nine -36
KPX two semicolon -36
KPX three dollar -149
KPX three D -55
KPX three H -55
KPX three R -55
KPX three cent -55
KPX three sterling -55
KPX three currency -55
KPX three yen -55
KPX three brokenbar -55
KPX three section -55
KPX three dieresis -55
KPX three ordfeminine -55
KPX three guillemotleft -55
KPX three logicalnot -55
KPX three sfthyphen -55
KPX three acute -55
KPX three mu -55
KPX three paragraph -55
KPX three periodcentered -55
KPX three cedilla -55
KPX three ordmasculine -55
KPX three Yacute -55
KPX three ebreve -55
KPX five seven -36
KPX five nine -73
KPX five colon -45
KPX five less -63
KPX five D 47
KPX five backslash -36
KPX five cent 47
KPX five sterling 47
KPX five currency 47
KPX five yen 47
KPX five brokenbar 47
KPX five section 47
KPX five dieresis 47
KPX five ordmasculine 38
KPX five questiondown -36
KPX five Aacute -36
KPX five Hbar -36
KPX five lacute -63
KPX six six -45
KPX six Gdotaccent -45
KPX six Gcommaaccent -45
KPX seven dollar -112
KPX seven seven -73
KPX seven D -196
KPX seven F -235
KPX seven H -235
KPX seven R -235
KPX seven U -149
KPX seven V -188
KPX seven X -188
KPX seven Z -225
KPX seven backslash -225
KPX seven m -149
KPX seven braceright -149
KPX seven cent -96
KPX seven sterling -196
KPX seven currency -96
KPX seven yen -96
KPX seven brokenbar -96
KPX seven section -96
KPX seven dieresis -159
KPX seven copyright -235
KPX seven ordfeminine -175
KPX seven guillemotleft -235
KPX seven logicalnot -175
KPX seven sfthyphen -175
KPX seven acute -155
KPX seven mu -235
KPX seven paragraph -155
KPX seven periodcentered -155
KPX seven cedilla -155
KPX seven ordmasculine -159
KPX seven guillemotright -158
KPX seven onequarter -188
KPX seven onehalf -158
KPX seven threequarters -158
KPX seven questiondown -225
KPX seven Aacute -225
KPX seven Eacute -235
KPX seven Idieresis -235
KPX seven Yacute -235
KPX seven ebreve -159
KPX seven edotaccent -149
KPX seven ecaron -149
KPX seven gdotaccent -188
KPX seven gcommaaccent -188
KPX seven Hbar -73
KPX seven dotlessi -188
KPX eight dollar -63
KPX nine dollar -159
KPX nine two -36
KPX nine D -188
KPX nine H -188
KPX nine L -36
KPX nine R -188
KPX nine X -131
KPX nine backslash -83
KPX nine cent -188
KPX nine sterling -188
KPX nine currency -188
KPX nine yen -188
KPX nine brokenbar -188
KPX nine section -188
KPX nine dieresis -188
KPX nine ordfeminine -188
KPX nine guillemotleft -188
KPX nine logicalnot -188
KPX nine sfthyphen -188
KPX nine acute -188
KPX nine mu -188
KPX nine paragraph -188
KPX nine periodcentered -188
KPX nine cedilla -188
KPX nine ordmasculine -188
KPX nine guillemotright -131
KPX nine onequarter -131
KPX nine onehalf -131
KPX nine threequarters -131
KPX nine questiondown -83
KPX nine Aacute -83
KPX nine Yacute -188
KPX nine Ebreve -36
KPX nine ebreve -188
KPX nine dotlessi -131
KPX colon dollar -131
KPX colon D -178
KPX colon H -167
KPX colon L -36
KPX colon R -167
KPX colon U -92
KPX colon X -83
KPX colon backslash -45
KPX colon cent -178
KPX colon sterling -178
KPX colon currency -178
KPX colon yen -178
KPX colon brokenbar -178
KPX colon section -178
KPX colon dieresis -139
KPX colon ordfeminine -167
KPX colon guillemotleft -167
KPX colon logicalnot -167
KPX colon sfthyphen -167
KPX colon acute -167
KPX colon mu -167
KPX colon paragraph -167
KPX colon periodcentered -167
KPX colon cedilla -167
KPX colon ordmasculine -167
KPX colon guillemotright -83
KPX colon onequarter -83
KPX colon onehalf -83
KPX colon threequarters -83
KPX colon questiondown -45
KPX colon Aacute -45
KPX colon Yacute -167
KPX colon ebreve -167
KPX colon edotaccent -92
KPX colon ecaron -92
KPX colon dotlessi -83
KPX semicolon dollar -73
KPX semicolon ampersand -36
KPX semicolon two -36
KPX semicolon Egrave -36
KPX semicolon Icircumflex -36
KPX semicolon Ebreve -36
KPX less dollar -131
KPX less ampersand -36
KPX less D -159
KPX less H -178
KPX less L -36
KPX less R -178
KPX less X -178
KPX less cent -159
KPX less sterling -159
KPX less currency -159
KPX less yen -159
KPX less brokenbar -159
KPX less section -159
KPX less dieresis -159
KPX less ordfeminine -178
KPX less guillemotleft -178
KPX less logicalnot -178
KPX less sfthyphen -178
KPX less acute -178
KPX less mu -178
KPX less paragraph -178
KPX less periodcentered -178
KPX less cedilla -178
KPX less ordmasculine -178
KPX less guillemotright -178
KPX less onequarter -178
KPX less onehalf -178
KPX less threequarters -178
KPX less Egrave -36
KPX less Icircumflex -36
KPX less Yacute -178
KPX less ebreve -178
KPX less dotlessi -178
KPX m hyphen -73
KPX m seven -149
KPX m Hbar -149
KPX braceright hyphen -73
KPX braceright seven -149
KPX braceright Hbar -149
KPX Acircumflex seven -112
KPX Acircumflex nine -149
KPX Acircumflex colon -102
KPX Acircumflex less -102
KPX Acircumflex I -36
KPX Acircumflex W -36
KPX Acircumflex Y -83
KPX Acircumflex Z -83
KPX Acircumflex backslash -83
KPX Acircumflex questiondown -83
KPX Acircumflex Aacute -83
KPX Acircumflex Hcircumflex -112
KPX Acircumflex hcircumflex -36
KPX Acircumflex Hbar -112
KPX Acircumflex hbar -36
KPX Acircumflex Kcommaaccent -102
KPX Acircumflex kcommaaccent -83
KPX Acircumflex kgreenlandic -102
KPX Acircumflex Lacute -83
KPX Acircumflex lacute -102
KPX Acircumflex uni01DC -112
KPX Acircumflex uni01DD -36
KPX Acircumflex uni01F4 -102
KPX Acircumflex uni01F5 -83
KPX Adieresis seven -112
KPX Adieresis nine -149
KPX Adieresis colon -102
KPX Adieresis less -102
KPX Adieresis I -36
KPX Adieresis W -36
KPX Adieresis Y -83
KPX Adieresis Z -83
KPX Adieresis backslash -83
KPX Adieresis questiondown -83
KPX Adieresis Aacute -83
KPX Adieresis Hcircumflex -112
KPX Adieresis hcircumflex -36
KPX Adieresis Hbar -112
KPX Adieresis hbar -36
KPX Adieresis Kcommaaccent -102
KPX Adieresis kcommaaccent -83
KPX Adieresis kgreenlandic -102
KPX Adieresis Lacute -83
KPX Adieresis lacute -102
KPX Adieresis uni01DC -112
KPX Adieresis uni01DD -36
KPX Adieresis uni01F4 -102
KPX Adieresis uni01F5 -83
KPX AE seven -112
KPX AE nine -149
KPX AE colon -102
KPX AE less -102
KPX AE I -36
KPX AE W -36
KPX AE Y -83
KPX AE Z -83
KPX AE backslash -83
KPX AE questiondown -83
KPX AE Aacute -83
KPX AE Hcircumflex -112
KPX AE hcircumflex -36
KPX AE Hbar -112
KPX AE hbar -36
KPX AE Kcommaaccent -102
KPX AE kcommaaccent -83
KPX AE kgreenlandic -102
KPX AE Lacute -83
KPX AE lacute -102
KPX AE uni01DC -112
KPX AE uni01DD -36
KPX AE uni01F4 -102
KPX AE uni01F5 -83
KPX Eth nine -36
KPX Ograve nine -36
KPX ucircumflex seven -167
KPX ucircumflex eight -112
KPX ucircumflex nine -243
KPX ucircumflex colon -139
KPX ucircumflex less -131
KPX ucircumflex backslash -73
KPX ucircumflex questiondown -73
KPX ucircumflex Aacute -73
KPX ucircumflex Hbar -167
KPX ucircumflex Idot -112
KPX ucircumflex lacute -131
KPX ydieresis seven -167
KPX ydieresis eight -112
KPX ydieresis nine -243
KPX ydieresis colon -139
KPX ydieresis less -131
KPX ydieresis backslash -73
KPX ydieresis questiondown -73
KPX ydieresis Aacute -73
KPX ydieresis Hbar -167
KPX ydieresis Idot -112
KPX ydieresis lacute -131
KPX Abreve O -241
KPX abreve seven -167
KPX abreve eight -112
KPX abreve nine -243
KPX abreve colon -139
KPX abreve less -131
KPX abreve backslash -73
KPX abreve questiondown -73
KPX abreve Aacute -73
KPX abreve Hbar -167
KPX abreve Idot -112
KPX abreve lacute -131
KPX Edotaccent seven -36
KPX Edotaccent nine -73
KPX Edotaccent colon -45
KPX Edotaccent less -63
KPX Edotaccent D 47
KPX Edotaccent backslash -36
KPX Edotaccent cent 47
KPX Edotaccent sterling 47
KPX Edotaccent currency 47
KPX Edotaccent yen 47
KPX Edotaccent brokenbar 47
KPX Edotaccent section 47
KPX Edotaccent dieresis 47
KPX Edotaccent ordmasculine 38
KPX Edotaccent questiondown -36
KPX Edotaccent Aacute -36
KPX Edotaccent Hbar -36
KPX Edotaccent lacute -63
KPX Ecaron seven -36
KPX Ecaron nine -73
KPX Ecaron colon -45
KPX Ecaron less -63
KPX Ecaron D 47
KPX Ecaron backslash -36
KPX Ecaron cent 47
KPX Ecaron sterling 47
KPX Ecaron currency 47
KPX Ecaron yen 47
KPX Ecaron brokenbar 47
KPX Ecaron section 47
KPX Ecaron dieresis 47
KPX Ecaron ordmasculine 38
KPX Ecaron questiondown -36
KPX Ecaron Aacute -36
KPX Ecaron Hbar -36
KPX Ecaron lacute -63
KPX Gdotaccent six -45
KPX Gdotaccent Gdotaccent -45
KPX Gdotaccent Gcommaaccent -45
KPX Gcommaaccent six -45
KPX Gcommaaccent Gdotaccent -45
KPX Gcommaaccent Gcommaaccent -45
KPX Hbar dollar -112
KPX Hbar seven -73
KPX Hbar D -196
KPX Hbar F -235
KPX Hbar H -235
KPX Hbar R -235
KPX Hbar U -149
KPX Hbar V -188
KPX Hbar X -188
KPX Hbar Z -225
KPX Hbar backslash -225
KPX Hbar m -149
KPX Hbar braceright -149
KPX Hbar cent -196
KPX Hbar sterling -196
KPX Hbar currency -196
KPX Hbar yen -196
KPX Hbar brokenbar -196
KPX Hbar section -196
KPX Hbar dieresis -159
KPX Hbar copyright -235
KPX Hbar ordfeminine -235
KPX Hbar guillemotleft -235
KPX Hbar logicalnot -235
KPX Hbar sfthyphen -235
KPX Hbar acute -235
KPX Hbar mu -235
KPX Hbar paragraph -235
KPX Hbar periodcentered -235
KPX Hbar cedilla -235
KPX Hbar ordmasculine -159
KPX Hbar guillemotright -188
KPX Hbar onequarter -188
KPX Hbar onehalf -188
KPX Hbar threequarters -188
KPX Hbar questiondown -225
KPX Hbar Aacute -225
KPX Hbar Eacute -235
KPX Hbar Idieresis -235
KPX Hbar Yacute -235
KPX Hbar ebreve -159
KPX Hbar edotaccent -149
KPX Hbar ecaron -149
KPX Hbar gdotaccent -188
KPX Hbar gcommaaccent -188
KPX Hbar Hbar -73
KPX Hbar dotlessi -188
KPX Idot dollar -63
KPX lacute dollar -131
KPX lacute ampersand -36
KPX lacute D -159
KPX lacute H -178
KPX lacute L -36
KPX lacute R -178
KPX lacute X -178
KPX lacute cent -159
KPX lacute sterling -159
KPX lacute currency -159
KPX lacute yen -159
KPX lacute brokenbar -159
KPX lacute section -159
KPX lacute dieresis -159
KPX lacute ordfeminine -178
KPX lacute guillemotleft -178
KPX lacute logicalnot -178
KPX lacute sfthyphen -178
KPX lacute acute -178
KPX lacute mu -178
KPX lacute paragraph -178
KPX lacute periodcentered -178
KPX lacute cedilla -178
KPX lacute ordmasculine -178
KPX lacute guillemotright -178
KPX lacute onequarter -178
KPX lacute onehalf -178
KPX lacute threequarters -178
KPX lacute Egrave -36
KPX lacute Icircumflex -36
KPX lacute Yacute -178
KPX lacute ebreve -178
KPX lacute dotlessi -178
KPX uni027D dollar -282
EndKernPairs
EndKernData
EndFontMetrics
PK :;Kb}k k + lib/fonts/dompdf_font_family_cache.dist.phpnu W+A
array(
'normal' => $distFontDir . 'Helvetica',
'bold' => $distFontDir . 'Helvetica-Bold',
'italic' => $distFontDir . 'Helvetica-Oblique',
'bold_italic' => $distFontDir . 'Helvetica-BoldOblique'
),
'times' =>
array(
'normal' => $distFontDir . 'Times-Roman',
'bold' => $distFontDir . 'Times-Bold',
'italic' => $distFontDir . 'Times-Italic',
'bold_italic' => $distFontDir . 'Times-BoldItalic'
),
'times-roman' =>
array(
'normal' => $distFontDir . 'Times-Roman',
'bold' => $distFontDir . 'Times-Bold',
'italic' => $distFontDir . 'Times-Italic',
'bold_italic' => $distFontDir . 'Times-BoldItalic'
),
'courier' =>
array(
'normal' => $distFontDir . 'Courier',
'bold' => $distFontDir . 'Courier-Bold',
'italic' => $distFontDir . 'Courier-Oblique',
'bold_italic' => $distFontDir . 'Courier-BoldOblique'
),
'helvetica' =>
array(
'normal' => $distFontDir . 'Helvetica',
'bold' => $distFontDir . 'Helvetica-Bold',
'italic' => $distFontDir . 'Helvetica-Oblique',
'bold_italic' => $distFontDir . 'Helvetica-BoldOblique'
),
'zapfdingbats' =>
array(
'normal' => $distFontDir . 'ZapfDingbats',
'bold' => $distFontDir . 'ZapfDingbats',
'italic' => $distFontDir . 'ZapfDingbats',
'bold_italic' => $distFontDir . 'ZapfDingbats'
),
'symbol' =>
array(
'normal' => $distFontDir . 'Symbol',
'bold' => $distFontDir . 'Symbol',
'italic' => $distFontDir . 'Symbol',
'bold_italic' => $distFontDir . 'Symbol'
),
'serif' =>
array(
'normal' => $distFontDir . 'Times-Roman',
'bold' => $distFontDir . 'Times-Bold',
'italic' => $distFontDir . 'Times-Italic',
'bold_italic' => $distFontDir . 'Times-BoldItalic'
),
'monospace' =>
array(
'normal' => $distFontDir . 'Courier',
'bold' => $distFontDir . 'Courier-Bold',
'italic' => $distFontDir . 'Courier-Oblique',
'bold_italic' => $distFontDir . 'Courier-BoldOblique'
),
'fixed' =>
array(
'normal' => $distFontDir . 'Courier',
'bold' => $distFontDir . 'Courier-Bold',
'italic' => $distFontDir . 'Courier-Oblique',
'bold_italic' => $distFontDir . 'Courier-BoldOblique'
),
'dejavu sans' =>
array(
'bold' => $distFontDir . 'DejaVuSans-Bold',
'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
'italic' => $distFontDir . 'DejaVuSans-Oblique',
'normal' => $distFontDir . 'DejaVuSans'
),
'dejavu sans mono' =>
array(
'bold' => $distFontDir . 'DejaVuSansMono-Bold',
'bold_italic' => $distFontDir . 'DejaVuSansMono-BoldOblique',
'italic' => $distFontDir . 'DejaVuSansMono-Oblique',
'normal' => $distFontDir . 'DejaVuSansMono'
),
'dejavu serif' =>
array(
'bold' => $distFontDir . 'DejaVuSerif-Bold',
'bold_italic' => $distFontDir . 'DejaVuSerif-BoldItalic',
'italic' => $distFontDir . 'DejaVuSerif-Italic',
'normal' => $distFontDir . 'DejaVuSerif'
)
);PK :;K@4 4 lib/fonts/Helvetica-Bold.afmnu W+A StartFontMetrics 4.1
Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
Comment Creation Date: Thu May 1 12:43:52 1997
Comment UniqueID 43052
Comment VMusage 37169 48194
FontName Helvetica-Bold
FullName Helvetica Bold
FamilyName Helvetica
Weight Bold
ItalicAngle 0
IsFixedPitch false
CharacterSet ExtendedRoman
FontBBox -170 -228 1003 962
UnderlinePosition -100
UnderlineThickness 50
Version 002.000
Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
EncodingScheme WinAnsiEncoding
CapHeight 718
XHeight 532
Ascender 718
Descender -207
StdHW 118
StdVW 140
StartCharMetrics 317
C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
C 160 ; WX 278 ; N space ; B 0 0 0 0 ;
C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ;
C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ;
C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ;
C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ;
C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ;
C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ;
C 146 ; WX 278 ; N quoteright ; B 69 445 209 718 ;
C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ;
C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ;
C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ;
C 43 ; WX 584 ; N plus ; B 40 0 544 506 ;
C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ;
C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ;
C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ;
C 46 ; WX 278 ; N period ; B 64 0 214 146 ;
C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ;
C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ;
C 49 ; WX 556 ; N one ; B 69 0 378 710 ;
C 50 ; WX 556 ; N two ; B 26 0 511 710 ;
C 51 ; WX 556 ; N three ; B 27 -19 516 710 ;
C 52 ; WX 556 ; N four ; B 27 0 526 710 ;
C 53 ; WX 556 ; N five ; B 27 -19 516 698 ;
C 54 ; WX 556 ; N six ; B 31 -19 520 710 ;
C 55 ; WX 556 ; N seven ; B 25 0 528 698 ;
C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ;
C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ;
C 58 ; WX 333 ; N colon ; B 92 0 242 512 ;
C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ;
C 60 ; WX 584 ; N less ; B 38 -8 546 514 ;
C 61 ; WX 584 ; N equal ; B 40 87 544 419 ;
C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ;
C 63 ; WX 611 ; N question ; B 60 0 556 727 ;
C 64 ; WX 975 ; N at ; B 118 -19 856 737 ;
C 65 ; WX 722 ; N A ; B 20 0 702 718 ;
C 66 ; WX 722 ; N B ; B 76 0 669 718 ;
C 67 ; WX 722 ; N C ; B 44 -19 684 737 ;
C 68 ; WX 722 ; N D ; B 76 0 685 718 ;
C 69 ; WX 667 ; N E ; B 76 0 621 718 ;
C 70 ; WX 611 ; N F ; B 76 0 587 718 ;
C 71 ; WX 778 ; N G ; B 44 -19 713 737 ;
C 72 ; WX 722 ; N H ; B 71 0 651 718 ;
C 73 ; WX 278 ; N I ; B 64 0 214 718 ;
C 74 ; WX 556 ; N J ; B 22 -18 484 718 ;
C 75 ; WX 722 ; N K ; B 87 0 722 718 ;
C 76 ; WX 611 ; N L ; B 76 0 583 718 ;
C 77 ; WX 833 ; N M ; B 69 0 765 718 ;
C 78 ; WX 722 ; N N ; B 69 0 654 718 ;
C 79 ; WX 778 ; N O ; B 44 -19 734 737 ;
C 80 ; WX 667 ; N P ; B 76 0 627 718 ;
C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ;
C 82 ; WX 722 ; N R ; B 76 0 677 718 ;
C 83 ; WX 667 ; N S ; B 39 -19 629 737 ;
C 84 ; WX 611 ; N T ; B 14 0 598 718 ;
C 85 ; WX 722 ; N U ; B 72 -19 651 718 ;
C 86 ; WX 667 ; N V ; B 19 0 648 718 ;
C 87 ; WX 944 ; N W ; B 16 0 929 718 ;
C 88 ; WX 667 ; N X ; B 14 0 653 718 ;
C 89 ; WX 667 ; N Y ; B 15 0 653 718 ;
C 90 ; WX 611 ; N Z ; B 25 0 586 718 ;
C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ;
C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ;
C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ;
C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ;
C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;
C 145 ; WX 278 ; N quoteleft ; B 69 454 209 727 ;
C 97 ; WX 556 ; N a ; B 29 -14 527 546 ;
C 98 ; WX 611 ; N b ; B 61 -14 578 718 ;
C 99 ; WX 556 ; N c ; B 34 -14 524 546 ;
C 100 ; WX 611 ; N d ; B 34 -14 551 718 ;
C 101 ; WX 556 ; N e ; B 23 -14 528 546 ;
C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ;
C 103 ; WX 611 ; N g ; B 40 -217 553 546 ;
C 104 ; WX 611 ; N h ; B 65 0 546 718 ;
C 105 ; WX 278 ; N i ; B 69 0 209 725 ;
C 106 ; WX 278 ; N j ; B 3 -214 209 725 ;
C 107 ; WX 556 ; N k ; B 69 0 562 718 ;
C 108 ; WX 278 ; N l ; B 69 0 209 718 ;
C 109 ; WX 889 ; N m ; B 64 0 826 546 ;
C 110 ; WX 611 ; N n ; B 65 0 546 546 ;
C 111 ; WX 611 ; N o ; B 34 -14 578 546 ;
C 112 ; WX 611 ; N p ; B 62 -207 578 546 ;
C 113 ; WX 611 ; N q ; B 34 -207 552 546 ;
C 114 ; WX 389 ; N r ; B 64 0 373 546 ;
C 115 ; WX 556 ; N s ; B 30 -14 519 546 ;
C 116 ; WX 333 ; N t ; B 10 -6 309 676 ;
C 117 ; WX 611 ; N u ; B 66 -14 545 532 ;
C 118 ; WX 556 ; N v ; B 13 0 543 532 ;
C 119 ; WX 778 ; N w ; B 10 0 769 532 ;
C 120 ; WX 556 ; N x ; B 15 0 541 532 ;
C 121 ; WX 556 ; N y ; B 10 -214 539 532 ;
C 122 ; WX 500 ; N z ; B 20 0 480 532 ;
C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ;
C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ;
C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ;
C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ;
C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ;
C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ;
C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ;
C -1 ; WX 167 ; N fraction ; B -170 -19 336 710 ;
C 165 ; WX 556 ; N yen ; B -9 0 565 698 ;
C 131 ; WX 556 ; N florin ; B -10 -210 516 737 ;
C 167 ; WX 556 ; N section ; B 34 -184 522 727 ;
C 164 ; WX 556 ; N currency ; B -3 76 559 636 ;
C 39 ; WX 238 ; N quotesingle ; B 70 447 168 718 ;
C 147 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ;
C 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ;
C 139 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ;
C 155 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ;
C -1 ; WX 611 ; N fi ; B 10 0 542 727 ;
C -1 ; WX 611 ; N fl ; B 10 0 542 727 ;
C 150 ; WX 556 ; N endash ; B 0 227 556 333 ;
C 134 ; WX 556 ; N dagger ; B 36 -171 520 718 ;
C 135 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ;
C 183 ; WX 278 ; N periodcentered ; B 58 172 220 334 ;
C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ;
C 149 ; WX 350 ; N bullet ; B 10 194 340 524 ;
C 130 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ;
C 132 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ;
C 148 ; WX 500 ; N quotedblright ; B 64 445 436 718 ;
C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ;
C 133 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ;
C 137 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ;
C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ;
C 96 ; WX 333 ; N grave ; B -23 604 225 750 ;
C 180 ; WX 333 ; N acute ; B 108 604 356 750 ;
C 136 ; WX 333 ; N circumflex ; B -10 604 343 750 ;
C 152 ; WX 333 ; N tilde ; B -17 610 350 737 ;
C 175 ; WX 333 ; N macron ; B -6 604 339 678 ;
C -1 ; WX 333 ; N breve ; B -2 604 335 750 ;
C -1 ; WX 333 ; N dotaccent ; B 104 614 230 729 ;
C 168 ; WX 333 ; N dieresis ; B 6 614 327 729 ;
C -1 ; WX 333 ; N ring ; B 59 568 275 776 ;
C 184 ; WX 333 ; N cedilla ; B 6 -228 245 0 ;
C -1 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ;
C -1 ; WX 333 ; N ogonek ; B 71 -228 304 0 ;
C -1 ; WX 333 ; N caron ; B -10 604 343 750 ;
C 151 ; WX 1000 ; N emdash ; B 0 227 1000 333 ;
C 198 ; WX 1000 ; N AE ; B 5 0 954 718 ;
C 170 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ;
C -1 ; WX 611 ; N Lslash ; B -20 0 583 718 ;
C 216 ; WX 778 ; N Oslash ; B 33 -27 744 745 ;
C 140 ; WX 1000 ; N OE ; B 37 -19 961 737 ;
C 186 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ;
C 230 ; WX 889 ; N ae ; B 29 -14 858 546 ;
C -1 ; WX 278 ; N dotlessi ; B 69 0 209 532 ;
C -1 ; WX 278 ; N lslash ; B -18 0 296 718 ;
C 248 ; WX 611 ; N oslash ; B 22 -29 589 560 ;
C 156 ; WX 944 ; N oe ; B 34 -14 912 546 ;
C 223 ; WX 611 ; N germandbls ; B 69 -14 579 731 ;
C 207 ; WX 278 ; N Idieresis ; B -21 0 300 915 ;
C 233 ; WX 556 ; N eacute ; B 23 -14 528 750 ;
C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ;
C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ;
C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ;
C 159 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ;
C 247 ; WX 584 ; N divide ; B 40 -42 544 548 ;
C 221 ; WX 667 ; N Yacute ; B 15 0 653 936 ;
C 194 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ;
C 225 ; WX 556 ; N aacute ; B 29 -14 527 750 ;
C 219 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ;
C 253 ; WX 556 ; N yacute ; B 10 -214 539 750 ;
C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ;
C 234 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ;
C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ;
C 220 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ;
C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ;
C 218 ; WX 722 ; N Uacute ; B 72 -19 651 936 ;
C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ;
C 203 ; WX 667 ; N Edieresis ; B 76 0 621 915 ;
C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ;
C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ;
C 169 ; WX 737 ; N copyright ; B -11 -19 749 737 ;
C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ;
C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ;
C 229 ; WX 556 ; N aring ; B 29 -14 527 776 ;
C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ;
C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ;
C 224 ; WX 556 ; N agrave ; B 29 -14 527 750 ;
C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ;
C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ;
C 227 ; WX 556 ; N atilde ; B 29 -14 527 737 ;
C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ;
C 154 ; WX 556 ; N scaron ; B 30 -14 519 750 ;
C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ;
C 237 ; WX 278 ; N iacute ; B 69 0 329 750 ;
C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ;
C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ;
C 251 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ;
C 226 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ;
C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ;
C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ;
C 231 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ;
C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ;
C 222 ; WX 667 ; N Thorn ; B 76 0 627 718 ;
C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ;
C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ;
C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ;
C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ;
C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ;
C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ;
C 179 ; WX 333 ; N threesuperior ; B 8 271 326 710 ;
C 210 ; WX 778 ; N Ograve ; B 44 -19 734 936 ;
C 192 ; WX 722 ; N Agrave ; B 20 0 702 936 ;
C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ;
C 215 ; WX 584 ; N multiply ; B 40 1 545 505 ;
C 250 ; WX 611 ; N uacute ; B 66 -14 545 750 ;
C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ;
C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
C 255 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ;
C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ;
C 238 ; WX 278 ; N icircumflex ; B -37 0 316 750 ;
C 202 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ;
C 228 ; WX 556 ; N adieresis ; B 29 -14 527 729 ;
C 235 ; WX 556 ; N edieresis ; B 23 -14 528 729 ;
C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ;
C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ;
C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ;
C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ;
C 205 ; WX 278 ; N Iacute ; B 64 0 329 936 ;
C 177 ; WX 584 ; N plusminus ; B 40 0 544 506 ;
C 166 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ;
C 174 ; WX 737 ; N registered ; B -11 -19 748 737 ;
C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ;
C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ;
C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
C 200 ; WX 667 ; N Egrave ; B 76 0 621 936 ;
C -1 ; WX 389 ; N racute ; B 64 0 384 750 ;
C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ;
C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ;
C 142 ; WX 611 ; N Zcaron ; B 25 0 586 936 ;
C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
C 208 ; WX 722 ; N Eth ; B -5 0 685 718 ;
C 199 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ;
C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ;
C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ;
C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ;
C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ;
C 193 ; WX 722 ; N Aacute ; B 20 0 702 936 ;
C 196 ; WX 722 ; N Adieresis ; B 20 0 702 915 ;
C 232 ; WX 556 ; N egrave ; B 23 -14 528 750 ;
C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ;
C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ;
C 211 ; WX 778 ; N Oacute ; B 44 -19 734 936 ;
C 243 ; WX 611 ; N oacute ; B 34 -14 578 750 ;
C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ;
C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ;
C 239 ; WX 278 ; N idieresis ; B -21 0 300 729 ;
C 212 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ;
C 217 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ;
C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
C 254 ; WX 611 ; N thorn ; B 62 -208 578 718 ;
C 178 ; WX 333 ; N twosuperior ; B 9 283 324 710 ;
C 214 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ;
C 181 ; WX 611 ; N mu ; B 66 -207 545 532 ;
C 236 ; WX 278 ; N igrave ; B -50 0 209 750 ;
C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ;
C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ;
C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ;
C 190 ; WX 834 ; N threequarters ; B 16 -19 799 710 ;
C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ;
C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ;
C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ;
C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ;
C 153 ; WX 1000 ; N trademark ; B 44 306 956 718 ;
C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ;
C 204 ; WX 278 ; N Igrave ; B -50 0 214 936 ;
C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ;
C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ;
C 189 ; WX 834 ; N onehalf ; B 26 -19 794 710 ;
C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
C 244 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ;
C 241 ; WX 611 ; N ntilde ; B 65 0 546 737 ;
C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ;
C 201 ; WX 667 ; N Eacute ; B 76 0 621 936 ;
C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ;
C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ;
C 188 ; WX 834 ; N onequarter ; B 26 -19 766 710 ;
C 138 ; WX 667 ; N Scaron ; B 39 -19 629 936 ;
C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ;
C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ;
C 176 ; WX 400 ; N degree ; B 57 426 343 712 ;
C 242 ; WX 611 ; N ograve ; B 34 -14 578 750 ;
C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ;
C 249 ; WX 611 ; N ugrave ; B 66 -14 545 750 ;
C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ;
C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ;
C 209 ; WX 722 ; N Ntilde ; B 69 0 654 923 ;
C 245 ; WX 611 ; N otilde ; B 34 -14 578 737 ;
C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ;
C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ;
C 195 ; WX 722 ; N Atilde ; B 20 0 702 923 ;
C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ;
C 197 ; WX 722 ; N Aring ; B 20 0 702 962 ;
C 213 ; WX 778 ; N Otilde ; B 44 -19 734 923 ;
C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ;
C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ;
C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ;
C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ;
C -1 ; WX 584 ; N minus ; B 40 197 544 309 ;
C 206 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ;
C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ;
C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ;
C 172 ; WX 584 ; N logicalnot ; B 40 108 544 419 ;
C 246 ; WX 611 ; N odieresis ; B 34 -14 578 729 ;
C 252 ; WX 611 ; N udieresis ; B 66 -14 545 729 ;
C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ;
C 240 ; WX 611 ; N eth ; B 34 -14 578 737 ;
C 158 ; WX 500 ; N zcaron ; B 20 0 480 750 ;
C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ;
C 185 ; WX 333 ; N onesuperior ; B 26 283 237 710 ;
C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ;
C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ;
EndCharMetrics
StartKernData
StartKernPairs 2481
KPX A C -40
KPX A Cacute -40
KPX A Ccaron -40
KPX A Ccedilla -40
KPX A G -50
KPX A Gbreve -50
KPX A Gcommaaccent -50
KPX A O -40
KPX A Oacute -40
KPX A Ocircumflex -40
KPX A Odieresis -40
KPX A Ograve -40
KPX A Ohungarumlaut -40
KPX A Omacron -40
KPX A Oslash -40
KPX A Otilde -40
KPX A Q -40
KPX A T -90
KPX A Tcaron -90
KPX A Tcommaaccent -90
KPX A U -50
KPX A Uacute -50
KPX A Ucircumflex -50
KPX A Udieresis -50
KPX A Ugrave -50
KPX A Uhungarumlaut -50
KPX A Umacron -50
KPX A Uogonek -50
KPX A Uring -50
KPX A V -80
KPX A W -60
KPX A Y -110
KPX A Yacute -110
KPX A Ydieresis -110
KPX A u -30
KPX A uacute -30
KPX A ucircumflex -30
KPX A udieresis -30
KPX A ugrave -30
KPX A uhungarumlaut -30
KPX A umacron -30
KPX A uogonek -30
KPX A uring -30
KPX A v -40
KPX A w -30
KPX A y -30
KPX A yacute -30
KPX A ydieresis -30
KPX Aacute C -40
KPX Aacute Cacute -40
KPX Aacute Ccaron -40
KPX Aacute Ccedilla -40
KPX Aacute G -50
KPX Aacute Gbreve -50
KPX Aacute Gcommaaccent -50
KPX Aacute O -40
KPX Aacute Oacute -40
KPX Aacute Ocircumflex -40
KPX Aacute Odieresis -40
KPX Aacute Ograve -40
KPX Aacute Ohungarumlaut -40
KPX Aacute Omacron -40
KPX Aacute Oslash -40
KPX Aacute Otilde -40
KPX Aacute Q -40
KPX Aacute T -90
KPX Aacute Tcaron -90
KPX Aacute Tcommaaccent -90
KPX Aacute U -50
KPX Aacute Uacute -50
KPX Aacute Ucircumflex -50
KPX Aacute Udieresis -50
KPX Aacute Ugrave -50
KPX Aacute Uhungarumlaut -50
KPX Aacute Umacron -50
KPX Aacute Uogonek -50
KPX Aacute Uring -50
KPX Aacute V -80
KPX Aacute W -60
KPX Aacute Y -110
KPX Aacute Yacute -110
KPX Aacute Ydieresis -110
KPX Aacute u -30
KPX Aacute uacute -30
KPX Aacute ucircumflex -30
KPX Aacute udieresis -30
KPX Aacute ugrave -30
KPX Aacute uhungarumlaut -30
KPX Aacute umacron -30
KPX Aacute uogonek -30
KPX Aacute uring -30
KPX Aacute v -40
KPX Aacute w -30
KPX Aacute y -30
KPX Aacute yacute -30
KPX Aacute ydieresis -30
KPX Abreve C -40
KPX Abreve Cacute -40
KPX Abreve Ccaron -40
KPX Abreve Ccedilla -40
KPX Abreve G -50
KPX Abreve Gbreve -50
KPX Abreve Gcommaaccent -50
KPX Abreve O -40
KPX Abreve Oacute -40
KPX Abreve Ocircumflex -40
KPX Abreve Odieresis -40
KPX Abreve Ograve -40
KPX Abreve Ohungarumlaut -40
KPX Abreve Omacron -40
KPX Abreve Oslash -40
KPX Abreve Otilde -40
KPX Abreve Q -40
KPX Abreve T -90
KPX Abreve Tcaron -90
KPX Abreve Tcommaaccent -90
KPX Abreve U -50
KPX Abreve Uacute -50
KPX Abreve Ucircumflex -50
KPX Abreve Udieresis -50
KPX Abreve Ugrave -50
KPX Abreve Uhungarumlaut -50
KPX Abreve Umacron -50
KPX Abreve Uogonek -50
KPX Abreve Uring -50
KPX Abreve V -80
KPX Abreve W -60
KPX Abreve Y -110
KPX Abreve Yacute -110
KPX Abreve Ydieresis -110
KPX Abreve u -30
KPX Abreve uacute -30
KPX Abreve ucircumflex -30
KPX Abreve udieresis -30
KPX Abreve ugrave -30
KPX Abreve uhungarumlaut -30
KPX Abreve umacron -30
KPX Abreve uogonek -30
KPX Abreve uring -30
KPX Abreve v -40
KPX Abreve w -30
KPX Abreve y -30
KPX Abreve yacute -30
KPX Abreve ydieresis -30
KPX Acircumflex C -40
KPX Acircumflex Cacute -40
KPX Acircumflex Ccaron -40
KPX Acircumflex Ccedilla -40
KPX Acircumflex G -50
KPX Acircumflex Gbreve -50
KPX Acircumflex Gcommaaccent -50
KPX Acircumflex O -40
KPX Acircumflex Oacute -40
KPX Acircumflex Ocircumflex -40
KPX Acircumflex Odieresis -40
KPX Acircumflex Ograve -40
KPX Acircumflex Ohungarumlaut -40
KPX Acircumflex Omacron -40
KPX Acircumflex Oslash -40
KPX Acircumflex Otilde -40
KPX Acircumflex Q -40
KPX Acircumflex T -90
KPX Acircumflex Tcaron -90
KPX Acircumflex Tcommaaccent -90
KPX Acircumflex U -50
KPX Acircumflex Uacute -50
KPX Acircumflex Ucircumflex -50
KPX Acircumflex Udieresis -50
KPX Acircumflex Ugrave -50
KPX Acircumflex Uhungarumlaut -50
KPX Acircumflex Umacron -50
KPX Acircumflex Uogonek -50
KPX Acircumflex Uring -50
KPX Acircumflex V -80
KPX Acircumflex W -60
KPX Acircumflex Y -110
KPX Acircumflex Yacute -110
KPX Acircumflex Ydieresis -110
KPX Acircumflex u -30
KPX Acircumflex uacute -30
KPX Acircumflex ucircumflex -30
KPX Acircumflex udieresis -30
KPX Acircumflex ugrave -30
KPX Acircumflex uhungarumlaut -30
KPX Acircumflex umacron -30
KPX Acircumflex uogonek -30
KPX Acircumflex uring -30
KPX Acircumflex v -40
KPX Acircumflex w -30
KPX Acircumflex y -30
KPX Acircumflex yacute -30
KPX Acircumflex ydieresis -30
KPX Adieresis C -40
KPX Adieresis Cacute -40
KPX Adieresis Ccaron -40
KPX Adieresis Ccedilla -40
KPX Adieresis G -50
KPX Adieresis Gbreve -50
KPX Adieresis Gcommaaccent -50
KPX Adieresis O -40
KPX Adieresis Oacute -40
KPX Adieresis Ocircumflex -40
KPX Adieresis Odieresis -40
KPX Adieresis Ograve -40
KPX Adieresis Ohungarumlaut -40
KPX Adieresis Omacron -40
KPX Adieresis Oslash -40
KPX Adieresis Otilde -40
KPX Adieresis Q -40
KPX Adieresis T -90
KPX Adieresis Tcaron -90
KPX Adieresis Tcommaaccent -90
KPX Adieresis U -50
KPX Adieresis Uacute -50
KPX Adieresis Ucircumflex -50
KPX Adieresis Udieresis -50
KPX Adieresis Ugrave -50
KPX Adieresis Uhungarumlaut -50
KPX Adieresis Umacron -50
KPX Adieresis Uogonek -50
KPX Adieresis Uring -50
KPX Adieresis V -80
KPX Adieresis W -60
KPX Adieresis Y -110
KPX Adieresis Yacute -110
KPX Adieresis Ydieresis -110
KPX Adieresis u -30
KPX Adieresis uacute -30
KPX Adieresis ucircumflex -30
KPX Adieresis udieresis -30
KPX Adieresis ugrave -30
KPX Adieresis uhungarumlaut -30
KPX Adieresis umacron -30
KPX Adieresis uogonek -30
KPX Adieresis uring -30
KPX Adieresis v -40
KPX Adieresis w -30
KPX Adieresis y -30
KPX Adieresis yacute -30
KPX Adieresis ydieresis -30
KPX Agrave C -40
KPX Agrave Cacute -40
KPX Agrave Ccaron -40
KPX Agrave Ccedilla -40
KPX Agrave G -50
KPX Agrave Gbreve -50
KPX Agrave Gcommaaccent -50
KPX Agrave O -40
KPX Agrave Oacute -40
KPX Agrave Ocircumflex -40
KPX Agrave Odieresis -40
KPX Agrave Ograve -40
KPX Agrave Ohungarumlaut -40
KPX Agrave Omacron -40
KPX Agrave Oslash -40
KPX Agrave Otilde -40
KPX Agrave Q -40
KPX Agrave T -90
KPX Agrave Tcaron -90
KPX Agrave Tcommaaccent -90
KPX Agrave U -50
KPX Agrave Uacute -50
KPX Agrave Ucircumflex -50
KPX Agrave Udieresis -50
KPX Agrave Ugrave -50
KPX Agrave Uhungarumlaut -50
KPX Agrave Umacron -50
KPX Agrave Uogonek -50
KPX Agrave Uring -50
KPX Agrave V -80
KPX Agrave W -60
KPX Agrave Y -110
KPX Agrave Yacute -110
KPX Agrave Ydieresis -110
KPX Agrave u -30
KPX Agrave uacute -30
KPX Agrave ucircumflex -30
KPX Agrave udieresis -30
KPX Agrave ugrave -30
KPX Agrave uhungarumlaut -30
KPX Agrave umacron -30
KPX Agrave uogonek -30
KPX Agrave uring -30
KPX Agrave v -40
KPX Agrave w -30
KPX Agrave y -30
KPX Agrave yacute -30
KPX Agrave ydieresis -30
KPX Amacron C -40
KPX Amacron Cacute -40
KPX Amacron Ccaron -40
KPX Amacron Ccedilla -40
KPX Amacron G -50
KPX Amacron Gbreve -50
KPX Amacron Gcommaaccent -50
KPX Amacron O -40
KPX Amacron Oacute -40
KPX Amacron Ocircumflex -40
KPX Amacron Odieresis -40
KPX Amacron Ograve -40
KPX Amacron Ohungarumlaut -40
KPX Amacron Omacron -40
KPX Amacron Oslash -40
KPX Amacron Otilde -40
KPX Amacron Q -40
KPX Amacron T -90
KPX Amacron Tcaron -90
KPX Amacron Tcommaaccent -90
KPX Amacron U -50
KPX Amacron Uacute -50
KPX Amacron Ucircumflex -50
KPX Amacron Udieresis -50
KPX Amacron Ugrave -50
KPX Amacron Uhungarumlaut -50
KPX Amacron Umacron -50
KPX Amacron Uogonek -50
KPX Amacron Uring -50
KPX Amacron V -80
KPX Amacron W -60
KPX Amacron Y -110
KPX Amacron Yacute -110
KPX Amacron Ydieresis -110
KPX Amacron u -30
KPX Amacron uacute -30
KPX Amacron ucircumflex -30
KPX Amacron udieresis -30
KPX Amacron ugrave -30
KPX Amacron uhungarumlaut -30
KPX Amacron umacron -30
KPX Amacron uogonek -30
KPX Amacron uring -30
KPX Amacron v -40
KPX Amacron w -30
KPX Amacron y -30
KPX Amacron yacute -30
KPX Amacron ydieresis -30
KPX Aogonek C -40
KPX Aogonek Cacute -40
KPX Aogonek Ccaron -40
KPX Aogonek Ccedilla -40
KPX Aogonek G -50
KPX Aogonek Gbreve -50
KPX Aogonek Gcommaaccent -50
KPX Aogonek O -40
KPX Aogonek Oacute -40
KPX Aogonek Ocircumflex -40
KPX Aogonek Odieresis -40
KPX Aogonek Ograve -40
KPX Aogonek Ohungarumlaut -40
KPX Aogonek Omacron -40
KPX Aogonek Oslash -40
KPX Aogonek Otilde -40
KPX Aogonek Q -40
KPX Aogonek T -90
KPX Aogonek Tcaron -90
KPX Aogonek Tcommaaccent -90
KPX Aogonek U -50
KPX Aogonek Uacute -50
KPX Aogonek Ucircumflex -50
KPX Aogonek Udieresis -50
KPX Aogonek Ugrave -50
KPX Aogonek Uhungarumlaut -50
KPX Aogonek Umacron -50
KPX Aogonek Uogonek -50
KPX Aogonek Uring -50
KPX Aogonek V -80
KPX Aogonek W -60
KPX Aogonek Y -110
KPX Aogonek Yacute -110
KPX Aogonek Ydieresis -110
KPX Aogonek u -30
KPX Aogonek uacute -30
KPX Aogonek ucircumflex -30
KPX Aogonek udieresis -30
KPX Aogonek ugrave -30
KPX Aogonek uhungarumlaut -30
KPX Aogonek umacron -30
KPX Aogonek uogonek -30
KPX Aogonek uring -30
KPX Aogonek v -40
KPX Aogonek w -30
KPX Aogonek y -30
KPX Aogonek yacute -30
KPX Aogonek ydieresis -30
KPX Aring C -40
KPX Aring Cacute -40
KPX Aring Ccaron -40
KPX Aring Ccedilla -40
KPX Aring G -50
KPX Aring Gbreve -50
KPX Aring Gcommaaccent -50
KPX Aring O -40
KPX Aring Oacute -40
KPX Aring Ocircumflex -40
KPX Aring Odieresis -40
KPX Aring Ograve -40
KPX Aring Ohungarumlaut -40
KPX Aring Omacron -40
KPX Aring Oslash -40
KPX Aring Otilde -40
KPX Aring Q -40
KPX Aring T -90
KPX Aring Tcaron -90
KPX Aring Tcommaaccent -90
KPX Aring U -50
KPX Aring Uacute -50
KPX Aring Ucircumflex -50
KPX Aring Udieresis -50
KPX Aring Ugrave -50
KPX Aring Uhungarumlaut -50
KPX Aring Umacron -50
KPX Aring Uogonek -50
KPX Aring Uring -50
KPX Aring V -80
KPX Aring W -60
KPX Aring Y -110
KPX Aring Yacute -110
KPX Aring Ydieresis -110
KPX Aring u -30
KPX Aring uacute -30
KPX Aring ucircumflex -30
KPX Aring udieresis -30
KPX Aring ugrave -30
KPX Aring uhungarumlaut -30
KPX Aring umacron -30
KPX Aring uogonek -30
KPX Aring uring -30
KPX Aring v -40
KPX Aring w -30
KPX Aring y -30
KPX Aring yacute -30
KPX Aring ydieresis -30
KPX Atilde C -40
KPX Atilde Cacute -40
KPX Atilde Ccaron -40
KPX Atilde Ccedilla -40
KPX Atilde G -50
KPX Atilde Gbreve -50
KPX Atilde Gcommaaccent -50
KPX Atilde O -40
KPX Atilde Oacute -40
KPX Atilde Ocircumflex -40
KPX Atilde Odieresis -40
KPX Atilde Ograve -40
KPX Atilde Ohungarumlaut -40
KPX Atilde Omacron -40
KPX Atilde Oslash -40
KPX Atilde Otilde -40
KPX Atilde Q -40
KPX Atilde T -90
KPX Atilde Tcaron -90
KPX Atilde Tcommaaccent -90
KPX Atilde U -50
KPX Atilde Uacute -50
KPX Atilde Ucircumflex -50
KPX Atilde Udieresis -50
KPX Atilde Ugrave -50
KPX Atilde Uhungarumlaut -50
KPX Atilde Umacron -50
KPX Atilde Uogonek -50
KPX Atilde Uring -50
KPX Atilde V -80
KPX Atilde W -60
KPX Atilde Y -110
KPX Atilde Yacute -110
KPX Atilde Ydieresis -110
KPX Atilde u -30
KPX Atilde uacute -30
KPX Atilde ucircumflex -30
KPX Atilde udieresis -30
KPX Atilde ugrave -30
KPX Atilde uhungarumlaut -30
KPX Atilde umacron -30
KPX Atilde uogonek -30
KPX Atilde uring -30
KPX Atilde v -40
KPX Atilde w -30
KPX Atilde y -30
KPX Atilde yacute -30
KPX Atilde ydieresis -30
KPX B A -30
KPX B Aacute -30
KPX B Abreve -30
KPX B Acircumflex -30
KPX B Adieresis -30
KPX B Agrave -30
KPX B Amacron -30
KPX B Aogonek -30
KPX B Aring -30
KPX B Atilde -30
KPX B U -10
KPX B Uacute -10
KPX B Ucircumflex -10
KPX B Udieresis -10
KPX B Ugrave -10
KPX B Uhungarumlaut -10
KPX B Umacron -10
KPX B Uogonek -10
KPX B Uring -10
KPX D A -40
KPX D Aacute -40
KPX D Abreve -40
KPX D Acircumflex -40
KPX D Adieresis -40
KPX D Agrave -40
KPX D Amacron -40
KPX D Aogonek -40
KPX D Aring -40
KPX D Atilde -40
KPX D V -40
KPX D W -40
KPX D Y -70
KPX D Yacute -70
KPX D Ydieresis -70
KPX D comma -30
KPX D period -30
KPX Dcaron A -40
KPX Dcaron Aacute -40
KPX Dcaron Abreve -40
KPX Dcaron Acircumflex -40
KPX Dcaron Adieresis -40
KPX Dcaron Agrave -40
KPX Dcaron Amacron -40
KPX Dcaron Aogonek -40
KPX Dcaron Aring -40
KPX Dcaron Atilde -40
KPX Dcaron V -40
KPX Dcaron W -40
KPX Dcaron Y -70
KPX Dcaron Yacute -70
KPX Dcaron Ydieresis -70
KPX Dcaron comma -30
KPX Dcaron period -30
KPX Dcroat A -40
KPX Dcroat Aacute -40
KPX Dcroat Abreve -40
KPX Dcroat Acircumflex -40
KPX Dcroat Adieresis -40
KPX Dcroat Agrave -40
KPX Dcroat Amacron -40
KPX Dcroat Aogonek -40
KPX Dcroat Aring -40
KPX Dcroat Atilde -40
KPX Dcroat V -40
KPX Dcroat W -40
KPX Dcroat Y -70
KPX Dcroat Yacute -70
KPX Dcroat Ydieresis -70
KPX Dcroat comma -30
KPX Dcroat period -30
KPX F A -80
KPX F Aacute -80
KPX F Abreve -80
KPX F Acircumflex -80
KPX F Adieresis -80
KPX F Agrave -80
KPX F Amacron -80
KPX F Aogonek -80
KPX F Aring -80
KPX F Atilde -80
KPX F a -20
KPX F aacute -20
KPX F abreve -20
KPX F acircumflex -20
KPX F adieresis -20
KPX F agrave -20
KPX F amacron -20
KPX F aogonek -20
KPX F aring -20
KPX F atilde -20
KPX F comma -100
KPX F period -100
KPX J A -20
KPX J Aacute -20
KPX J Abreve -20
KPX J Acircumflex -20
KPX J Adieresis -20
KPX J Agrave -20
KPX J Amacron -20
KPX J Aogonek -20
KPX J Aring -20
KPX J Atilde -20
KPX J comma -20
KPX J period -20
KPX J u -20
KPX J uacute -20
KPX J ucircumflex -20
KPX J udieresis -20
KPX J ugrave -20
KPX J uhungarumlaut -20
KPX J umacron -20
KPX J uogonek -20
KPX J uring -20
KPX K O -30
KPX K Oacute -30
KPX K Ocircumflex -30
KPX K Odieresis -30
KPX K Ograve -30
KPX K Ohungarumlaut -30
KPX K Omacron -30
KPX K Oslash -30
KPX K Otilde -30
KPX K e -15
KPX K eacute -15
KPX K ecaron -15
KPX K ecircumflex -15
KPX K edieresis -15
KPX K edotaccent -15
KPX K egrave -15
KPX K emacron -15
KPX K eogonek -15
KPX K o -35
KPX K oacute -35
KPX K ocircumflex -35
KPX K odieresis -35
KPX K ograve -35
KPX K ohungarumlaut -35
KPX K omacron -35
KPX K oslash -35
KPX K otilde -35
KPX K u -30
KPX K uacute -30
KPX K ucircumflex -30
KPX K udieresis -30
KPX K ugrave -30
KPX K uhungarumlaut -30
KPX K umacron -30
KPX K uogonek -30
KPX K uring -30
KPX K y -40
KPX K yacute -40
KPX K ydieresis -40
KPX Kcommaaccent O -30
KPX Kcommaaccent Oacute -30
KPX Kcommaaccent Ocircumflex -30
KPX Kcommaaccent Odieresis -30
KPX Kcommaaccent Ograve -30
KPX Kcommaaccent Ohungarumlaut -30
KPX Kcommaaccent Omacron -30
KPX Kcommaaccent Oslash -30
KPX Kcommaaccent Otilde -30
KPX Kcommaaccent e -15
KPX Kcommaaccent eacute -15
KPX Kcommaaccent ecaron -15
KPX Kcommaaccent ecircumflex -15
KPX Kcommaaccent edieresis -15
KPX Kcommaaccent edotaccent -15
KPX Kcommaaccent egrave -15
KPX Kcommaaccent emacron -15
KPX Kcommaaccent eogonek -15
KPX Kcommaaccent o -35
KPX Kcommaaccent oacute -35
KPX Kcommaaccent ocircumflex -35
KPX Kcommaaccent odieresis -35
KPX Kcommaaccent ograve -35
KPX Kcommaaccent ohungarumlaut -35
KPX Kcommaaccent omacron -35
KPX Kcommaaccent oslash -35
KPX Kcommaaccent otilde -35
KPX Kcommaaccent u -30
KPX Kcommaaccent uacute -30
KPX Kcommaaccent ucircumflex -30
KPX Kcommaaccent udieresis -30
KPX Kcommaaccent ugrave -30
KPX Kcommaaccent uhungarumlaut -30
KPX Kcommaaccent umacron -30
KPX Kcommaaccent uogonek -30
KPX Kcommaaccent uring -30
KPX Kcommaaccent y -40
KPX Kcommaaccent yacute -40
KPX Kcommaaccent ydieresis -40
KPX L T -90
KPX L Tcaron -90
KPX L Tcommaaccent -90
KPX L V -110
KPX L W -80
KPX L Y -120
KPX L Yacute -120
KPX L Ydieresis -120
KPX L quotedblright -140
KPX L quoteright -140
KPX L y -30
KPX L yacute -30
KPX L ydieresis -30
KPX Lacute T -90
KPX Lacute Tcaron -90
KPX Lacute Tcommaaccent -90
KPX Lacute V -110
KPX Lacute W -80
KPX Lacute Y -120
KPX Lacute Yacute -120
KPX Lacute Ydieresis -120
KPX Lacute quotedblright -140
KPX Lacute quoteright -140
KPX Lacute y -30
KPX Lacute yacute -30
KPX Lacute ydieresis -30
KPX Lcommaaccent T -90
KPX Lcommaaccent Tcaron -90
KPX Lcommaaccent Tcommaaccent -90
KPX Lcommaaccent V -110
KPX Lcommaaccent W -80
KPX Lcommaaccent Y -120
KPX Lcommaaccent Yacute -120
KPX Lcommaaccent Ydieresis -120
KPX Lcommaaccent quotedblright -140
KPX Lcommaaccent quoteright -140
KPX Lcommaaccent y -30
KPX Lcommaaccent yacute -30
KPX Lcommaaccent ydieresis -30
KPX Lslash T -90
KPX Lslash Tcaron -90
KPX Lslash Tcommaaccent -90
KPX Lslash V -110
KPX Lslash W -80
KPX Lslash Y -120
KPX Lslash Yacute -120
KPX Lslash Ydieresis -120
KPX Lslash quotedblright -140
KPX Lslash quoteright -140
KPX Lslash y -30
KPX Lslash yacute -30
KPX Lslash ydieresis -30
KPX O A -50
KPX O Aacute -50
KPX O Abreve -50
KPX O Acircumflex -50
KPX O Adieresis -50
KPX O Agrave -50
KPX O Amacron -50
KPX O Aogonek -50
KPX O Aring -50
KPX O Atilde -50
KPX O T -40
KPX O Tcaron -40
KPX O Tcommaaccent -40
KPX O V -50
KPX O W -50
KPX O X -50
KPX O Y -70
KPX O Yacute -70
KPX O Ydieresis -70
KPX O comma -40
KPX O period -40
KPX Oacute A -50
KPX Oacute Aacute -50
KPX Oacute Abreve -50
KPX Oacute Acircumflex -50
KPX Oacute Adieresis -50
KPX Oacute Agrave -50
KPX Oacute Amacron -50
KPX Oacute Aogonek -50
KPX Oacute Aring -50
KPX Oacute Atilde -50
KPX Oacute T -40
KPX Oacute Tcaron -40
KPX Oacute Tcommaaccent -40
KPX Oacute V -50
KPX Oacute W -50
KPX Oacute X -50
KPX Oacute Y -70
KPX Oacute Yacute -70
KPX Oacute Ydieresis -70
KPX Oacute comma -40
KPX Oacute period -40
KPX Ocircumflex A -50
KPX Ocircumflex Aacute -50
KPX Ocircumflex Abreve -50
KPX Ocircumflex Acircumflex -50
KPX Ocircumflex Adieresis -50
KPX Ocircumflex Agrave -50
KPX Ocircumflex Amacron -50
KPX Ocircumflex Aogonek -50
KPX Ocircumflex Aring -50
KPX Ocircumflex Atilde -50
KPX Ocircumflex T -40
KPX Ocircumflex Tcaron -40
KPX Ocircumflex Tcommaaccent -40
KPX Ocircumflex V -50
KPX Ocircumflex W -50
KPX Ocircumflex X -50
KPX Ocircumflex Y -70
KPX Ocircumflex Yacute -70
KPX Ocircumflex Ydieresis -70
KPX Ocircumflex comma -40
KPX Ocircumflex period -40
KPX Odieresis A -50
KPX Odieresis Aacute -50
KPX Odieresis Abreve -50
KPX Odieresis Acircumflex -50
KPX Odieresis Adieresis -50
KPX Odieresis Agrave -50
KPX Odieresis Amacron -50
KPX Odieresis Aogonek -50
KPX Odieresis Aring -50
KPX Odieresis Atilde -50
KPX Odieresis T -40
KPX Odieresis Tcaron -40
KPX Odieresis Tcommaaccent -40
KPX Odieresis V -50
KPX Odieresis W -50
KPX Odieresis X -50
KPX Odieresis Y -70
KPX Odieresis Yacute -70
KPX Odieresis Ydieresis -70
KPX Odieresis comma -40
KPX Odieresis period -40
KPX Ograve A -50
KPX Ograve Aacute -50
KPX Ograve Abreve -50
KPX Ograve Acircumflex -50
KPX Ograve Adieresis -50
KPX Ograve Agrave -50
KPX Ograve Amacron -50
KPX Ograve Aogonek -50
KPX Ograve Aring -50
KPX Ograve Atilde -50
KPX Ograve T -40
KPX Ograve Tcaron -40
KPX Ograve Tcommaaccent -40
KPX Ograve V -50
KPX Ograve W -50
KPX Ograve X -50
KPX Ograve Y -70
KPX Ograve Yacute -70
KPX Ograve Ydieresis -70
KPX Ograve comma -40
KPX Ograve period -40
KPX Ohungarumlaut A -50
KPX Ohungarumlaut Aacute -50
KPX Ohungarumlaut Abreve -50
KPX Ohungarumlaut Acircumflex -50
KPX Ohungarumlaut Adieresis -50
KPX Ohungarumlaut Agrave -50
KPX Ohungarumlaut Amacron -50
KPX Ohungarumlaut Aogonek -50
KPX Ohungarumlaut Aring -50
KPX Ohungarumlaut Atilde -50
KPX Ohungarumlaut T -40
KPX Ohungarumlaut Tcaron -40
KPX Ohungarumlaut Tcommaaccent -40
KPX Ohungarumlaut V -50
KPX Ohungarumlaut W -50
KPX Ohungarumlaut X -50
KPX Ohungarumlaut Y -70
KPX Ohungarumlaut Yacute -70
KPX Ohungarumlaut Ydieresis -70
KPX Ohungarumlaut comma -40
KPX Ohungarumlaut period -40
KPX Omacron A -50
KPX Omacron Aacute -50
KPX Omacron Abreve -50
KPX Omacron Acircumflex -50
KPX Omacron Adieresis -50
KPX Omacron Agrave -50
KPX Omacron Amacron -50
KPX Omacron Aogonek -50
KPX Omacron Aring -50
KPX Omacron Atilde -50
KPX Omacron T -40
KPX Omacron Tcaron -40
KPX Omacron Tcommaaccent -40
KPX Omacron V -50
KPX Omacron W -50
KPX Omacron X -50
KPX Omacron Y -70
KPX Omacron Yacute -70
KPX Omacron Ydieresis -70
KPX Omacron comma -40
KPX Omacron period -40
KPX Oslash A -50
KPX Oslash Aacute -50
KPX Oslash Abreve -50
KPX Oslash Acircumflex -50
KPX Oslash Adieresis -50
KPX Oslash Agrave -50
KPX Oslash Amacron -50
KPX Oslash Aogonek -50
KPX Oslash Aring -50
KPX Oslash Atilde -50
KPX Oslash T -40
KPX Oslash Tcaron -40
KPX Oslash Tcommaaccent -40
KPX Oslash V -50
KPX Oslash W -50
KPX Oslash X -50
KPX Oslash Y -70
KPX Oslash Yacute -70
KPX Oslash Ydieresis -70
KPX Oslash comma -40
KPX Oslash period -40
KPX Otilde A -50
KPX Otilde Aacute -50
KPX Otilde Abreve -50
KPX Otilde Acircumflex -50
KPX Otilde Adieresis -50
KPX Otilde Agrave -50
KPX Otilde Amacron -50
KPX Otilde Aogonek -50
KPX Otilde Aring -50
KPX Otilde Atilde -50
KPX Otilde T -40
KPX Otilde Tcaron -40
KPX Otilde Tcommaaccent -40
KPX Otilde V -50
KPX Otilde W -50
KPX Otilde X -50
KPX Otilde Y -70
KPX Otilde Yacute -70
KPX Otilde Ydieresis -70
KPX Otilde comma -40
KPX Otilde period -40
KPX P A -100
KPX P Aacute -100
KPX P Abreve -100
KPX P Acircumflex -100
KPX P Adieresis -100
KPX P Agrave -100
KPX P Amacron -100
KPX P Aogonek -100
KPX P Aring -100
KPX P Atilde -100
KPX P a -30
KPX P aacute -30
KPX P abreve -30
KPX P acircumflex -30
KPX P adieresis -30
KPX P agrave -30
KPX P amacron -30
KPX P aogonek -30
KPX P aring -30
KPX P atilde -30
KPX P comma -120
KPX P e -30
KPX P eacute -30
KPX P ecaron -30
KPX P ecircumflex -30
KPX P edieresis -30
KPX P edotaccent -30
KPX P egrave -30
KPX P emacron -30
KPX P eogonek -30
KPX P o -40
KPX P oacute -40
KPX P ocircumflex -40
KPX P odieresis -40
KPX P ograve -40
KPX P ohungarumlaut -40
KPX P omacron -40
KPX P oslash -40
KPX P otilde -40
KPX P period -120
KPX Q U -10
KPX Q Uacute -10
KPX Q Ucircumflex -10
KPX Q Udieresis -10
KPX Q Ugrave -10
KPX Q Uhungarumlaut -10
KPX Q Umacron -10
KPX Q Uogonek -10
KPX Q Uring -10
KPX Q comma 20
KPX Q period 20
KPX R O -20
KPX R Oacute -20
KPX R Ocircumflex -20
KPX R Odieresis -20
KPX R Ograve -20
KPX R Ohungarumlaut -20
KPX R Omacron -20
KPX R Oslash -20
KPX R Otilde -20
KPX R T -20
KPX R Tcaron -20
KPX R Tcommaaccent -20
KPX R U -20
KPX R Uacute -20
KPX R Ucircumflex -20
KPX R Udieresis -20
KPX R Ugrave -20
KPX R Uhungarumlaut -20
KPX R Umacron -20
KPX R Uogonek -20
KPX R Uring -20
KPX R V -50
KPX R W -40
KPX R Y -50
KPX R Yacute -50
KPX R Ydieresis -50
KPX Racute O -20
KPX Racute Oacute -20
KPX Racute Ocircumflex -20
KPX Racute Odieresis -20
KPX Racute Ograve -20
KPX Racute Ohungarumlaut -20
KPX Racute Omacron -20
KPX Racute Oslash -20
KPX Racute Otilde -20
KPX Racute T -20
KPX Racute Tcaron -20
KPX Racute Tcommaaccent -20
KPX Racute U -20
KPX Racute Uacute -20
KPX Racute Ucircumflex -20
KPX Racute Udieresis -20
KPX Racute Ugrave -20
KPX Racute Uhungarumlaut -20
KPX Racute Umacron -20
KPX Racute Uogonek -20
KPX Racute Uring -20
KPX Racute V -50
KPX Racute W -40
KPX Racute Y -50
KPX Racute Yacute -50
KPX Racute Ydieresis -50
KPX Rcaron O -20
KPX Rcaron Oacute -20
KPX Rcaron Ocircumflex -20
KPX Rcaron Odieresis -20
KPX Rcaron Ograve -20
KPX Rcaron Ohungarumlaut -20
KPX Rcaron Omacron -20
KPX Rcaron Oslash -20
KPX Rcaron Otilde -20
KPX Rcaron T -20
KPX Rcaron Tcaron -20
KPX Rcaron Tcommaaccent -20
KPX Rcaron U -20
KPX Rcaron Uacute -20
KPX Rcaron Ucircumflex -20
KPX Rcaron Udieresis -20
KPX Rcaron Ugrave -20
KPX Rcaron Uhungarumlaut -20
KPX Rcaron Umacron -20
KPX Rcaron Uogonek -20
KPX Rcaron Uring -20
KPX Rcaron V -50
KPX Rcaron W -40
KPX Rcaron Y -50
KPX Rcaron Yacute -50
KPX Rcaron Ydieresis -50
KPX Rcommaaccent O -20
KPX Rcommaaccent Oacute -20
KPX Rcommaaccent Ocircumflex -20
KPX Rcommaaccent Odieresis -20
KPX Rcommaaccent Ograve -20
KPX Rcommaaccent Ohungarumlaut -20
KPX Rcommaaccent Omacron -20
KPX Rcommaaccent Oslash -20
KPX Rcommaaccent Otilde -20
KPX Rcommaaccent T -20
KPX Rcommaaccent Tcaron -20
KPX Rcommaaccent Tcommaaccent -20
KPX Rcommaaccent U -20
KPX Rcommaaccent Uacute -20
KPX Rcommaaccent Ucircumflex -20
KPX Rcommaaccent Udieresis -20
KPX Rcommaaccent Ugrave -20
KPX Rcommaaccent Uhungarumlaut -20
KPX Rcommaaccent Umacron -20
KPX Rcommaaccent Uogonek -20
KPX Rcommaaccent Uring -20
KPX Rcommaaccent V -50
KPX Rcommaaccent W -40
KPX Rcommaaccent Y -50
KPX Rcommaaccent Yacute -50
KPX Rcommaaccent Ydieresis -50
KPX T A -90
KPX T Aacute -90
KPX T Abreve -90
KPX T Acircumflex -90
KPX T Adieresis -90
KPX T Agrave -90
KPX T Amacron -90
KPX T Aogonek -90
KPX T Aring -90
KPX T Atilde -90
KPX T O -40
KPX T Oacute -40
KPX T Ocircumflex -40
KPX T Odieresis -40
KPX T Ograve -40
KPX T Ohungarumlaut -40
KPX T Omacron -40
KPX T Oslash -40
KPX T Otilde -40
KPX T a -80
KPX T aacute -80
KPX T abreve -80
KPX T acircumflex -80
KPX T adieresis -80
KPX T agrave -80
KPX T amacron -80
KPX T aogonek -80
KPX T aring -80
KPX T atilde -80
KPX T colon -40
KPX T comma -80
KPX T e -60
KPX T eacute -60
KPX T ecaron -60
KPX T ecircumflex -60
KPX T edieresis -60
KPX T edotaccent -60
KPX T egrave -60
KPX T emacron -60
KPX T eogonek -60
KPX T hyphen -120
KPX T o -80
KPX T oacute -80
KPX T ocircumflex -80
KPX T odieresis -80
KPX T ograve -80
KPX T ohungarumlaut -80
KPX T omacron -80
KPX T oslash -80
KPX T otilde -80
KPX T period -80
KPX T r -80
KPX T racute -80
KPX T rcommaaccent -80
KPX T semicolon -40
KPX T u -90
KPX T uacute -90
KPX T ucircumflex -90
KPX T udieresis -90
KPX T ugrave -90
KPX T uhungarumlaut -90
KPX T umacron -90
KPX T uogonek -90
KPX T uring -90
KPX T w -60
KPX T y -60
KPX T yacute -60
KPX T ydieresis -60
KPX Tcaron A -90
KPX Tcaron Aacute -90
KPX Tcaron Abreve -90
KPX Tcaron Acircumflex -90
KPX Tcaron Adieresis -90
KPX Tcaron Agrave -90
KPX Tcaron Amacron -90
KPX Tcaron Aogonek -90
KPX Tcaron Aring -90
KPX Tcaron Atilde -90
KPX Tcaron O -40
KPX Tcaron Oacute -40
KPX Tcaron Ocircumflex -40
KPX Tcaron Odieresis -40
KPX Tcaron Ograve -40
KPX Tcaron Ohungarumlaut -40
KPX Tcaron Omacron -40
KPX Tcaron Oslash -40
KPX Tcaron Otilde -40
KPX Tcaron a -80
KPX Tcaron aacute -80
KPX Tcaron abreve -80
KPX Tcaron acircumflex -80
KPX Tcaron adieresis -80
KPX Tcaron agrave -80
KPX Tcaron amacron -80
KPX Tcaron aogonek -80
KPX Tcaron aring -80
KPX Tcaron atilde -80
KPX Tcaron colon -40
KPX Tcaron comma -80
KPX Tcaron e -60
KPX Tcaron eacute -60
KPX Tcaron ecaron -60
KPX Tcaron ecircumflex -60
KPX Tcaron edieresis -60
KPX Tcaron edotaccent -60
KPX Tcaron egrave -60
KPX Tcaron emacron -60
KPX Tcaron eogonek -60
KPX Tcaron hyphen -120
KPX Tcaron o -80
KPX Tcaron oacute -80
KPX Tcaron ocircumflex -80
KPX Tcaron odieresis -80
KPX Tcaron ograve -80
KPX Tcaron ohungarumlaut -80
KPX Tcaron omacron -80
KPX Tcaron oslash -80
KPX Tcaron otilde -80
KPX Tcaron period -80
KPX Tcaron r -80
KPX Tcaron racute -80
KPX Tcaron rcommaaccent -80
KPX Tcaron semicolon -40
KPX Tcaron u -90
KPX Tcaron uacute -90
KPX Tcaron ucircumflex -90
KPX Tcaron udieresis -90
KPX Tcaron ugrave -90
KPX Tcaron uhungarumlaut -90
KPX Tcaron umacron -90
KPX Tcaron uogonek -90
KPX Tcaron uring -90
KPX Tcaron w -60
KPX Tcaron y -60
KPX Tcaron yacute -60
KPX Tcaron ydieresis -60
KPX Tcommaaccent A -90
KPX Tcommaaccent Aacute -90
KPX Tcommaaccent Abreve -90
KPX Tcommaaccent Acircumflex -90
KPX Tcommaaccent Adieresis -90
KPX Tcommaaccent Agrave -90
KPX Tcommaaccent Amacron -90
KPX Tcommaaccent Aogonek -90
KPX Tcommaaccent Aring -90
KPX Tcommaaccent Atilde -90
KPX Tcommaaccent O -40
KPX Tcommaaccent Oacute -40
KPX Tcommaaccent Ocircumflex -40
KPX Tcommaaccent Odieresis -40
KPX Tcommaaccent Ograve -40
KPX Tcommaaccent Ohungarumlaut -40
KPX Tcommaaccent Omacron -40
KPX Tcommaaccent Oslash -40
KPX Tcommaaccent Otilde -40
KPX Tcommaaccent a -80
KPX Tcommaaccent aacute -80
KPX Tcommaaccent abreve -80
KPX Tcommaaccent acircumflex -80
KPX Tcommaaccent adieresis -80
KPX Tcommaaccent agrave -80
KPX Tcommaaccent amacron -80
KPX Tcommaaccent aogonek -80
KPX Tcommaaccent aring -80
KPX Tcommaaccent atilde -80
KPX Tcommaaccent colon -40
KPX Tcommaaccent comma -80
KPX Tcommaaccent e -60
KPX Tcommaaccent eacute -60
KPX Tcommaaccent ecaron -60
KPX Tcommaaccent ecircumflex -60
KPX Tcommaaccent edieresis -60
KPX Tcommaaccent edotaccent -60
KPX Tcommaaccent egrave -60
KPX Tcommaaccent emacron -60
KPX Tcommaaccent eogonek -60
KPX Tcommaaccent hyphen -120
KPX Tcommaaccent o -80
KPX Tcommaaccent oacute -80
KPX Tcommaaccent ocircumflex -80
KPX Tcommaaccent odieresis -80
KPX Tcommaaccent ograve -80
KPX Tcommaaccent ohungarumlaut -80
KPX Tcommaaccent omacron -80
KPX Tcommaaccent oslash -80
KPX Tcommaaccent otilde -80
KPX Tcommaaccent period -80
KPX Tcommaaccent r -80
KPX Tcommaaccent racute -80
KPX Tcommaaccent rcommaaccent -80
KPX Tcommaaccent semicolon -40
KPX Tcommaaccent u -90
KPX Tcommaaccent uacute -90
KPX Tcommaaccent ucircumflex -90
KPX Tcommaaccent udieresis -90
KPX Tcommaaccent ugrave -90
KPX Tcommaaccent uhungarumlaut -90
KPX Tcommaaccent umacron -90
KPX Tcommaaccent uogonek -90
KPX Tcommaaccent uring -90
KPX Tcommaaccent w -60
KPX Tcommaaccent y -60
KPX Tcommaaccent yacute -60
KPX Tcommaaccent ydieresis -60
KPX U A -50
KPX U Aacute -50
KPX U Abreve -50
KPX U Acircumflex -50
KPX U Adieresis -50
KPX U Agrave -50
KPX U Amacron -50
KPX U Aogonek -50
KPX U Aring -50
KPX U Atilde -50
KPX U comma -30
KPX U period -30
KPX Uacute A -50
KPX Uacute Aacute -50
KPX Uacute Abreve -50
KPX Uacute Acircumflex -50
KPX Uacute Adieresis -50
KPX Uacute Agrave -50
KPX Uacute Amacron -50
KPX Uacute Aogonek -50
KPX Uacute Aring -50
KPX Uacute Atilde -50
KPX Uacute comma -30
KPX Uacute period -30
KPX Ucircumflex A -50
KPX Ucircumflex Aacute -50
KPX Ucircumflex Abreve -50
KPX Ucircumflex Acircumflex -50
KPX Ucircumflex Adieresis -50
KPX Ucircumflex Agrave -50
KPX Ucircumflex Amacron -50
KPX Ucircumflex Aogonek -50
KPX Ucircumflex Aring -50
KPX Ucircumflex Atilde -50
KPX Ucircumflex comma -30
KPX Ucircumflex period -30
KPX Udieresis A -50
KPX Udieresis Aacute -50
KPX Udieresis Abreve -50
KPX Udieresis Acircumflex -50
KPX Udieresis Adieresis -50
KPX Udieresis Agrave -50
KPX Udieresis Amacron -50
KPX Udieresis Aogonek -50
KPX Udieresis Aring -50
KPX Udieresis Atilde -50
KPX Udieresis comma -30
KPX Udieresis period -30
KPX Ugrave A -50
KPX Ugrave Aacute -50
KPX Ugrave Abreve -50
KPX Ugrave Acircumflex -50
KPX Ugrave Adieresis -50
KPX Ugrave Agrave -50
KPX Ugrave Amacron -50
KPX Ugrave Aogonek -50
KPX Ugrave Aring -50
KPX Ugrave Atilde -50
KPX Ugrave comma -30
KPX Ugrave period -30
KPX Uhungarumlaut A -50
KPX Uhungarumlaut Aacute -50
KPX Uhungarumlaut Abreve -50
KPX Uhungarumlaut Acircumflex -50
KPX Uhungarumlaut Adieresis -50
KPX Uhungarumlaut Agrave -50
KPX Uhungarumlaut Amacron -50
KPX Uhungarumlaut Aogonek -50
KPX Uhungarumlaut Aring -50
KPX Uhungarumlaut Atilde -50
KPX Uhungarumlaut comma -30
KPX Uhungarumlaut period -30
KPX Umacron A -50
KPX Umacron Aacute -50
KPX Umacron Abreve -50
KPX Umacron Acircumflex -50
KPX Umacron Adieresis -50
KPX Umacron Agrave -50
KPX Umacron Amacron -50
KPX Umacron Aogonek -50
KPX Umacron Aring -50
KPX Umacron Atilde -50
KPX Umacron comma -30
KPX Umacron period -30
KPX Uogonek A -50
KPX Uogonek Aacute -50
KPX Uogonek Abreve -50
KPX Uogonek Acircumflex -50
KPX Uogonek Adieresis -50
KPX Uogonek Agrave -50
KPX Uogonek Amacron -50
KPX Uogonek Aogonek -50
KPX Uogonek Aring -50
KPX Uogonek Atilde -50
KPX Uogonek comma -30
KPX Uogonek period -30
KPX Uring A -50
KPX Uring Aacute -50
KPX Uring Abreve -50
KPX Uring Acircumflex -50
KPX Uring Adieresis -50
KPX Uring Agrave -50
KPX Uring Amacron -50
KPX Uring Aogonek -50
KPX Uring Aring -50
KPX Uring Atilde -50
KPX Uring comma -30
KPX Uring period -30
KPX V A -80
KPX V Aacute -80
KPX V Abreve -80
KPX V Acircumflex -80
KPX V Adieresis -80
KPX V Agrave -80
KPX V Amacron -80
KPX V Aogonek -80
KPX V Aring -80
KPX V Atilde -80
KPX V G -50
KPX V Gbreve -50
KPX V Gcommaaccent -50
KPX V O -50
KPX V Oacute -50
KPX V Ocircumflex -50
KPX V Odieresis -50
KPX V Ograve -50
KPX V Ohungarumlaut -50
KPX V Omacron -50
KPX V Oslash -50
KPX V Otilde -50
KPX V a -60
KPX V aacute -60
KPX V abreve -60
KPX V acircumflex -60
KPX V adieresis -60
KPX V agrave -60
KPX V amacron -60
KPX V aogonek -60
KPX V aring -60
KPX V atilde -60
KPX V colon -40
KPX V comma -120
KPX V e -50
KPX V eacute -50
KPX V ecaron -50
KPX V ecircumflex -50
KPX V edieresis -50
KPX V edotaccent -50
KPX V egrave -50
KPX V emacron -50
KPX V eogonek -50
KPX V hyphen -80
KPX V o -90
KPX V oacute -90
KPX V ocircumflex -90
KPX V odieresis -90
KPX V ograve -90
KPX V ohungarumlaut -90
KPX V omacron -90
KPX V oslash -90
KPX V otilde -90
KPX V period -120
KPX V semicolon -40
KPX V u -60
KPX V uacute -60
KPX V ucircumflex -60
KPX V udieresis -60
KPX V ugrave -60
KPX V uhungarumlaut -60
KPX V umacron -60
KPX V uogonek -60
KPX V uring -60
KPX W A -60
KPX W Aacute -60
KPX W Abreve -60
KPX W Acircumflex -60
KPX W Adieresis -60
KPX W Agrave -60
KPX W Amacron -60
KPX W Aogonek -60
KPX W Aring -60
KPX W Atilde -60
KPX W O -20
KPX W Oacute -20
KPX W Ocircumflex -20
KPX W Odieresis -20
KPX W Ograve -20
KPX W Ohungarumlaut -20
KPX W Omacron -20
KPX W Oslash -20
KPX W Otilde -20
KPX W a -40
KPX W aacute -40
KPX W abreve -40
KPX W acircumflex -40
KPX W adieresis -40
KPX W agrave -40
KPX W amacron -40
KPX W aogonek -40
KPX W aring -40
KPX W atilde -40
KPX W colon -10
KPX W comma -80
KPX W e -35
KPX W eacute -35
KPX W ecaron -35
KPX W ecircumflex -35
KPX W edieresis -35
KPX W edotaccent -35
KPX W egrave -35
KPX W emacron -35
KPX W eogonek -35
KPX W hyphen -40
KPX W o -60
KPX W oacute -60
KPX W ocircumflex -60
KPX W odieresis -60
KPX W ograve -60
KPX W ohungarumlaut -60
KPX W omacron -60
KPX W oslash -60
KPX W otilde -60
KPX W period -80
KPX W semicolon -10
KPX W u -45
KPX W uacute -45
KPX W ucircumflex -45
KPX W udieresis -45
KPX W ugrave -45
KPX W uhungarumlaut -45
KPX W umacron -45
KPX W uogonek -45
KPX W uring -45
KPX W y -20
KPX W yacute -20
KPX W ydieresis -20
KPX Y A -110
KPX Y Aacute -110
KPX Y Abreve -110
KPX Y Acircumflex -110
KPX Y Adieresis -110
KPX Y Agrave -110
KPX Y Amacron -110
KPX Y Aogonek -110
KPX Y Aring -110
KPX Y Atilde -110
KPX Y O -70
KPX Y Oacute -70
KPX Y Ocircumflex -70
KPX Y Odieresis -70
KPX Y Ograve -70
KPX Y Ohungarumlaut -70
KPX Y Omacron -70
KPX Y Oslash -70
KPX Y Otilde -70
KPX Y a -90
KPX Y aacute -90
KPX Y abreve -90
KPX Y acircumflex -90
KPX Y adieresis -90
KPX Y agrave -90
KPX Y amacron -90
KPX Y aogonek -90
KPX Y aring -90
KPX Y atilde -90
KPX Y colon -50
KPX Y comma -100
KPX Y e -80
KPX Y eacute -80
KPX Y ecaron -80
KPX Y ecircumflex -80
KPX Y edieresis -80
KPX Y edotaccent -80
KPX Y egrave -80
KPX Y emacron -80
KPX Y eogonek -80
KPX Y o -100
KPX Y oacute -100
KPX Y ocircumflex -100
KPX Y odieresis -100
KPX Y ograve -100
KPX Y ohungarumlaut -100
KPX Y omacron -100
KPX Y oslash -100
KPX Y otilde -100
KPX Y period -100
KPX Y semicolon -50
KPX Y u -100
KPX Y uacute -100
KPX Y ucircumflex -100
KPX Y udieresis -100
KPX Y ugrave -100
KPX Y uhungarumlaut -100
KPX Y umacron -100
KPX Y uogonek -100
KPX Y uring -100
KPX Yacute A -110
KPX Yacute Aacute -110
KPX Yacute Abreve -110
KPX Yacute Acircumflex -110
KPX Yacute Adieresis -110
KPX Yacute Agrave -110
KPX Yacute Amacron -110
KPX Yacute Aogonek -110
KPX Yacute Aring -110
KPX Yacute Atilde -110
KPX Yacute O -70
KPX Yacute Oacute -70
KPX Yacute Ocircumflex -70
KPX Yacute Odieresis -70
KPX Yacute Ograve -70
KPX Yacute Ohungarumlaut -70
KPX Yacute Omacron -70
KPX Yacute Oslash -70
KPX Yacute Otilde -70
KPX Yacute a -90
KPX Yacute aacute -90
KPX Yacute abreve -90
KPX Yacute acircumflex -90
KPX Yacute adieresis -90
KPX Yacute agrave -90
KPX Yacute amacron -90
KPX Yacute aogonek -90
KPX Yacute aring -90
KPX Yacute atilde -90
KPX Yacute colon -50
KPX Yacute comma -100
KPX Yacute e -80
KPX Yacute eacute -80
KPX Yacute ecaron -80
KPX Yacute ecircumflex -80
KPX Yacute edieresis -80
KPX Yacute edotaccent -80
KPX Yacute egrave -80
KPX Yacute emacron -80
KPX Yacute eogonek -80
KPX Yacute o -100
KPX Yacute oacute -100
KPX Yacute ocircumflex -100
KPX Yacute odieresis -100
KPX Yacute ograve -100
KPX Yacute ohungarumlaut -100
KPX Yacute omacron -100
KPX Yacute oslash -100
KPX Yacute otilde -100
KPX Yacute period -100
KPX Yacute semicolon -50
KPX Yacute u -100
KPX Yacute uacute -100
KPX Yacute ucircumflex -100
KPX Yacute udieresis -100
KPX Yacute ugrave -100
KPX Yacute uhungarumlaut -100
KPX Yacute umacron -100
KPX Yacute uogonek -100
KPX Yacute uring -100
KPX Ydieresis A -110
KPX Ydieresis Aacute -110
KPX Ydieresis Abreve -110
KPX Ydieresis Acircumflex -110
KPX Ydieresis Adieresis -110
KPX Ydieresis Agrave -110
KPX Ydieresis Amacron -110
KPX Ydieresis Aogonek -110
KPX Ydieresis Aring -110
KPX Ydieresis Atilde -110
KPX Ydieresis O -70
KPX Ydieresis Oacute -70
KPX Ydieresis Ocircumflex -70
KPX Ydieresis Odieresis -70
KPX Ydieresis Ograve -70
KPX Ydieresis Ohungarumlaut -70
KPX Ydieresis Omacron -70
KPX Ydieresis Oslash -70
KPX Ydieresis Otilde -70
KPX Ydieresis a -90
KPX Ydieresis aacute -90
KPX Ydieresis abreve -90
KPX Ydieresis acircumflex -90
KPX Ydieresis adieresis -90
KPX Ydieresis agrave -90
KPX Ydieresis amacron -90
KPX Ydieresis aogonek -90
KPX Ydieresis aring -90
KPX Ydieresis atilde -90
KPX Ydieresis colon -50
KPX Ydieresis comma -100
KPX Ydieresis e -80
KPX Ydieresis eacute -80
KPX Ydieresis ecaron -80
KPX Ydieresis ecircumflex -80
KPX Ydieresis edieresis -80
KPX Ydieresis edotaccent -80
KPX Ydieresis egrave -80
KPX Ydieresis emacron -80
KPX Ydieresis eogonek -80
KPX Ydieresis o -100
KPX Ydieresis oacute -100
KPX Ydieresis ocircumflex -100
KPX Ydieresis odieresis -100
KPX Ydieresis ograve -100
KPX Ydieresis ohungarumlaut -100
KPX Ydieresis omacron -100
KPX Ydieresis oslash -100
KPX Ydieresis otilde -100
KPX Ydieresis period -100
KPX Ydieresis semicolon -50
KPX Ydieresis u -100
KPX Ydieresis uacute -100
KPX Ydieresis ucircumflex -100
KPX Ydieresis udieresis -100
KPX Ydieresis ugrave -100
KPX Ydieresis uhungarumlaut -100
KPX Ydieresis umacron -100
KPX Ydieresis uogonek -100
KPX Ydieresis uring -100
KPX a g -10
KPX a gbreve -10
KPX a gcommaaccent -10
KPX a v -15
KPX a w -15
KPX a y -20
KPX a yacute -20
KPX a ydieresis -20
KPX aacute g -10
KPX aacute gbreve -10
KPX aacute gcommaaccent -10
KPX aacute v -15
KPX aacute w -15
KPX aacute y -20
KPX aacute yacute -20
KPX aacute ydieresis -20
KPX abreve g -10
KPX abreve gbreve -10
KPX abreve gcommaaccent -10
KPX abreve v -15
KPX abreve w -15
KPX abreve y -20
KPX abreve yacute -20
KPX abreve ydieresis -20
KPX acircumflex g -10
KPX acircumflex gbreve -10
KPX acircumflex gcommaaccent -10
KPX acircumflex v -15
KPX acircumflex w -15
KPX acircumflex y -20
KPX acircumflex yacute -20
KPX acircumflex ydieresis -20
KPX adieresis g -10
KPX adieresis gbreve -10
KPX adieresis gcommaaccent -10
KPX adieresis v -15
KPX adieresis w -15
KPX adieresis y -20
KPX adieresis yacute -20
KPX adieresis ydieresis -20
KPX agrave g -10
KPX agrave gbreve -10
KPX agrave gcommaaccent -10
KPX agrave v -15
KPX agrave w -15
KPX agrave y -20
KPX agrave yacute -20
KPX agrave ydieresis -20
KPX amacron g -10
KPX amacron gbreve -10
KPX amacron gcommaaccent -10
KPX amacron v -15
KPX amacron w -15
KPX amacron y -20
KPX amacron yacute -20
KPX amacron ydieresis -20
KPX aogonek g -10
KPX aogonek gbreve -10
KPX aogonek gcommaaccent -10
KPX aogonek v -15
KPX aogonek w -15
KPX aogonek y -20
KPX aogonek yacute -20
KPX aogonek ydieresis -20
KPX aring g -10
KPX aring gbreve -10
KPX aring gcommaaccent -10
KPX aring v -15
KPX aring w -15
KPX aring y -20
KPX aring yacute -20
KPX aring ydieresis -20
KPX atilde g -10
KPX atilde gbreve -10
KPX atilde gcommaaccent -10
KPX atilde v -15
KPX atilde w -15
KPX atilde y -20
KPX atilde yacute -20
KPX atilde ydieresis -20
KPX b l -10
KPX b lacute -10
KPX b lcommaaccent -10
KPX b lslash -10
KPX b u -20
KPX b uacute -20
KPX b ucircumflex -20
KPX b udieresis -20
KPX b ugrave -20
KPX b uhungarumlaut -20
KPX b umacron -20
KPX b uogonek -20
KPX b uring -20
KPX b v -20
KPX b y -20
KPX b yacute -20
KPX b ydieresis -20
KPX c h -10
KPX c k -20
KPX c kcommaaccent -20
KPX c l -20
KPX c lacute -20
KPX c lcommaaccent -20
KPX c lslash -20
KPX c y -10
KPX c yacute -10
KPX c ydieresis -10
KPX cacute h -10
KPX cacute k -20
KPX cacute kcommaaccent -20
KPX cacute l -20
KPX cacute lacute -20
KPX cacute lcommaaccent -20
KPX cacute lslash -20
KPX cacute y -10
KPX cacute yacute -10
KPX cacute ydieresis -10
KPX ccaron h -10
KPX ccaron k -20
KPX ccaron kcommaaccent -20
KPX ccaron l -20
KPX ccaron lacute -20
KPX ccaron lcommaaccent -20
KPX ccaron lslash -20
KPX ccaron y -10
KPX ccaron yacute -10
KPX ccaron ydieresis -10
KPX ccedilla h -10
KPX ccedilla k -20
KPX ccedilla kcommaaccent -20
KPX ccedilla l -20
KPX ccedilla lacute -20
KPX ccedilla lcommaaccent -20
KPX ccedilla lslash -20
KPX ccedilla y -10
KPX ccedilla yacute -10
KPX ccedilla ydieresis -10
KPX colon space -40
KPX comma quotedblright -120
KPX comma quoteright -120
KPX comma space -40
KPX d d -10
KPX d dcroat -10
KPX d v -15
KPX d w -15
KPX d y -15
KPX d yacute -15
KPX d ydieresis -15
KPX dcroat d -10
KPX dcroat dcroat -10
KPX dcroat v -15
KPX dcroat w -15
KPX dcroat y -15
KPX dcroat yacute -15
KPX dcroat ydieresis -15
KPX e comma 10
KPX e period 20
KPX e v -15
KPX e w -15
KPX e x -15
KPX e y -15
KPX e yacute -15
KPX e ydieresis -15
KPX eacute comma 10
KPX eacute period 20
KPX eacute v -15
KPX eacute w -15
KPX eacute x -15
KPX eacute y -15
KPX eacute yacute -15
KPX eacute ydieresis -15
KPX ecaron comma 10
KPX ecaron period 20
KPX ecaron v -15
KPX ecaron w -15
KPX ecaron x -15
KPX ecaron y -15
KPX ecaron yacute -15
KPX ecaron ydieresis -15
KPX ecircumflex comma 10
KPX ecircumflex period 20
KPX ecircumflex v -15
KPX ecircumflex w -15
KPX ecircumflex x -15
KPX ecircumflex y -15
KPX ecircumflex yacute -15
KPX ecircumflex ydieresis -15
KPX edieresis comma 10
KPX edieresis period 20
KPX edieresis v -15
KPX edieresis w -15
KPX edieresis x -15
KPX edieresis y -15
KPX edieresis yacute -15
KPX edieresis ydieresis -15
KPX edotaccent comma 10
KPX edotaccent period 20
KPX edotaccent v -15
KPX edotaccent w -15
KPX edotaccent x -15
KPX edotaccent y -15
KPX edotaccent yacute -15
KPX edotaccent ydieresis -15
KPX egrave comma 10
KPX egrave period 20
KPX egrave v -15
KPX egrave w -15
KPX egrave x -15
KPX egrave y -15
KPX egrave yacute -15
KPX egrave ydieresis -15
KPX emacron comma 10
KPX emacron period 20
KPX emacron v -15
KPX emacron w -15
KPX emacron x -15
KPX emacron y -15
KPX emacron yacute -15
KPX emacron ydieresis -15
KPX eogonek comma 10
KPX eogonek period 20
KPX eogonek v -15
KPX eogonek w -15
KPX eogonek x -15
KPX eogonek y -15
KPX eogonek yacute -15
KPX eogonek ydieresis -15
KPX f comma -10
KPX f e -10
KPX f eacute -10
KPX f ecaron -10
KPX f ecircumflex -10
KPX f edieresis -10
KPX f edotaccent -10
KPX f egrave -10
KPX f emacron -10
KPX f eogonek -10
KPX f o -20
KPX f oacute -20
KPX f ocircumflex -20
KPX f odieresis -20
KPX f ograve -20
KPX f ohungarumlaut -20
KPX f omacron -20
KPX f oslash -20
KPX f otilde -20
KPX f period -10
KPX f quotedblright 30
KPX f quoteright 30
KPX g e 10
KPX g eacute 10
KPX g ecaron 10
KPX g ecircumflex 10
KPX g edieresis 10
KPX g edotaccent 10
KPX g egrave 10
KPX g emacron 10
KPX g eogonek 10
KPX g g -10
KPX g gbreve -10
KPX g gcommaaccent -10
KPX gbreve e 10
KPX gbreve eacute 10
KPX gbreve ecaron 10
KPX gbreve ecircumflex 10
KPX gbreve edieresis 10
KPX gbreve edotaccent 10
KPX gbreve egrave 10
KPX gbreve emacron 10
KPX gbreve eogonek 10
KPX gbreve g -10
KPX gbreve gbreve -10
KPX gbreve gcommaaccent -10
KPX gcommaaccent e 10
KPX gcommaaccent eacute 10
KPX gcommaaccent ecaron 10
KPX gcommaaccent ecircumflex 10
KPX gcommaaccent edieresis 10
KPX gcommaaccent edotaccent 10
KPX gcommaaccent egrave 10
KPX gcommaaccent emacron 10
KPX gcommaaccent eogonek 10
KPX gcommaaccent g -10
KPX gcommaaccent gbreve -10
KPX gcommaaccent gcommaaccent -10
KPX h y -20
KPX h yacute -20
KPX h ydieresis -20
KPX k o -15
KPX k oacute -15
KPX k ocircumflex -15
KPX k odieresis -15
KPX k ograve -15
KPX k ohungarumlaut -15
KPX k omacron -15
KPX k oslash -15
KPX k otilde -15
KPX kcommaaccent o -15
KPX kcommaaccent oacute -15
KPX kcommaaccent ocircumflex -15
KPX kcommaaccent odieresis -15
KPX kcommaaccent ograve -15
KPX kcommaaccent ohungarumlaut -15
KPX kcommaaccent omacron -15
KPX kcommaaccent oslash -15
KPX kcommaaccent otilde -15
KPX l w -15
KPX l y -15
KPX l yacute -15
KPX l ydieresis -15
KPX lacute w -15
KPX lacute y -15
KPX lacute yacute -15
KPX lacute ydieresis -15
KPX lcommaaccent w -15
KPX lcommaaccent y -15
KPX lcommaaccent yacute -15
KPX lcommaaccent ydieresis -15
KPX lslash w -15
KPX lslash y -15
KPX lslash yacute -15
KPX lslash ydieresis -15
KPX m u -20
KPX m uacute -20
KPX m ucircumflex -20
KPX m udieresis -20
KPX m ugrave -20
KPX m uhungarumlaut -20
KPX m umacron -20
KPX m uogonek -20
KPX m uring -20
KPX m y -30
KPX m yacute -30
KPX m ydieresis -30
KPX n u -10
KPX n uacute -10
KPX n ucircumflex -10
KPX n udieresis -10
KPX n ugrave -10
KPX n uhungarumlaut -10
KPX n umacron -10
KPX n uogonek -10
KPX n uring -10
KPX n v -40
KPX n y -20
KPX n yacute -20
KPX n ydieresis -20
KPX nacute u -10
KPX nacute uacute -10
KPX nacute ucircumflex -10
KPX nacute udieresis -10
KPX nacute ugrave -10
KPX nacute uhungarumlaut -10
KPX nacute umacron -10
KPX nacute uogonek -10
KPX nacute uring -10
KPX nacute v -40
KPX nacute y -20
KPX nacute yacute -20
KPX nacute ydieresis -20
KPX ncaron u -10
KPX ncaron uacute -10
KPX ncaron ucircumflex -10
KPX ncaron udieresis -10
KPX ncaron ugrave -10
KPX ncaron uhungarumlaut -10
KPX ncaron umacron -10
KPX ncaron uogonek -10
KPX ncaron uring -10
KPX ncaron v -40
KPX ncaron y -20
KPX ncaron yacute -20
KPX ncaron ydieresis -20
KPX ncommaaccent u -10
KPX ncommaaccent uacute -10
KPX ncommaaccent ucircumflex -10
KPX ncommaaccent udieresis -10
KPX ncommaaccent ugrave -10
KPX ncommaaccent uhungarumlaut -10
KPX ncommaaccent umacron -10
KPX ncommaaccent uogonek -10
KPX ncommaaccent uring -10
KPX ncommaaccent v -40
KPX ncommaaccent y -20
KPX ncommaaccent yacute -20
KPX ncommaaccent ydieresis -20
KPX ntilde u -10
KPX ntilde uacute -10
KPX ntilde ucircumflex -10
KPX ntilde udieresis -10
KPX ntilde ugrave -10
KPX ntilde uhungarumlaut -10
KPX ntilde umacron -10
KPX ntilde uogonek -10
KPX ntilde uring -10
KPX ntilde v -40
KPX ntilde y -20
KPX ntilde yacute -20
KPX ntilde ydieresis -20
KPX o v -20
KPX o w -15
KPX o x -30
KPX o y -20
KPX o yacute -20
KPX o ydieresis -20
KPX oacute v -20
KPX oacute w -15
KPX oacute x -30
KPX oacute y -20
KPX oacute yacute -20
KPX oacute ydieresis -20
KPX ocircumflex v -20
KPX ocircumflex w -15
KPX ocircumflex x -30
KPX ocircumflex y -20
KPX ocircumflex yacute -20
KPX ocircumflex ydieresis -20
KPX odieresis v -20
KPX odieresis w -15
KPX odieresis x -30
KPX odieresis y -20
KPX odieresis yacute -20
KPX odieresis ydieresis -20
KPX ograve v -20
KPX ograve w -15
KPX ograve x -30
KPX ograve y -20
KPX ograve yacute -20
KPX ograve ydieresis -20
KPX ohungarumlaut v -20
KPX ohungarumlaut w -15
KPX ohungarumlaut x -30
KPX ohungarumlaut y -20
KPX ohungarumlaut yacute -20
KPX ohungarumlaut ydieresis -20
KPX omacron v -20
KPX omacron w -15
KPX omacron x -30
KPX omacron y -20
KPX omacron yacute -20
KPX omacron ydieresis -20
KPX oslash v -20
KPX oslash w -15
KPX oslash x -30
KPX oslash y -20
KPX oslash yacute -20
KPX oslash ydieresis -20
KPX otilde v -20
KPX otilde w -15
KPX otilde x -30
KPX otilde y -20
KPX otilde yacute -20
KPX otilde ydieresis -20
KPX p y -15
KPX p yacute -15
KPX p ydieresis -15
KPX period quotedblright -120
KPX period quoteright -120
KPX period space -40
KPX quotedblright space -80
KPX quoteleft quoteleft -46
KPX quoteright d -80
KPX quoteright dcroat -80
KPX quoteright l -20
KPX quoteright lacute -20
KPX quoteright lcommaaccent -20
KPX quoteright lslash -20
KPX quoteright quoteright -46
KPX quoteright r -40
KPX quoteright racute -40
KPX quoteright rcaron -40
KPX quoteright rcommaaccent -40
KPX quoteright s -60
KPX quoteright sacute -60
KPX quoteright scaron -60
KPX quoteright scedilla -60
KPX quoteright scommaaccent -60
KPX quoteright space -80
KPX quoteright v -20
KPX r c -20
KPX r cacute -20
KPX r ccaron -20
KPX r ccedilla -20
KPX r comma -60
KPX r d -20
KPX r dcroat -20
KPX r g -15
KPX r gbreve -15
KPX r gcommaaccent -15
KPX r hyphen -20
KPX r o -20
KPX r oacute -20
KPX r ocircumflex -20
KPX r odieresis -20
KPX r ograve -20
KPX r ohungarumlaut -20
KPX r omacron -20
KPX r oslash -20
KPX r otilde -20
KPX r period -60
KPX r q -20
KPX r s -15
KPX r sacute -15
KPX r scaron -15
KPX r scedilla -15
KPX r scommaaccent -15
KPX r t 20
KPX r tcommaaccent 20
KPX r v 10
KPX r y 10
KPX r yacute 10
KPX r ydieresis 10
KPX racute c -20
KPX racute cacute -20
KPX racute ccaron -20
KPX racute ccedilla -20
KPX racute comma -60
KPX racute d -20
KPX racute dcroat -20
KPX racute g -15
KPX racute gbreve -15
KPX racute gcommaaccent -15
KPX racute hyphen -20
KPX racute o -20
KPX racute oacute -20
KPX racute ocircumflex -20
KPX racute odieresis -20
KPX racute ograve -20
KPX racute ohungarumlaut -20
KPX racute omacron -20
KPX racute oslash -20
KPX racute otilde -20
KPX racute period -60
KPX racute q -20
KPX racute s -15
KPX racute sacute -15
KPX racute scaron -15
KPX racute scedilla -15
KPX racute scommaaccent -15
KPX racute t 20
KPX racute tcommaaccent 20
KPX racute v 10
KPX racute y 10
KPX racute yacute 10
KPX racute ydieresis 10
KPX rcaron c -20
KPX rcaron cacute -20
KPX rcaron ccaron -20
KPX rcaron ccedilla -20
KPX rcaron comma -60
KPX rcaron d -20
KPX rcaron dcroat -20
KPX rcaron g -15
KPX rcaron gbreve -15
KPX rcaron gcommaaccent -15
KPX rcaron hyphen -20
KPX rcaron o -20
KPX rcaron oacute -20
KPX rcaron ocircumflex -20
KPX rcaron odieresis -20
KPX rcaron ograve -20
KPX rcaron ohungarumlaut -20
KPX rcaron omacron -20
KPX rcaron oslash -20
KPX rcaron otilde -20
KPX rcaron period -60
KPX rcaron q -20
KPX rcaron s -15
KPX rcaron sacute -15
KPX rcaron scaron -15
KPX rcaron scedilla -15
KPX rcaron scommaaccent -15
KPX rcaron t 20
KPX rcaron tcommaaccent 20
KPX rcaron v 10
KPX rcaron y 10
KPX rcaron yacute 10
KPX rcaron ydieresis 10
KPX rcommaaccent c -20
KPX rcommaaccent cacute -20
KPX rcommaaccent ccaron -20
KPX rcommaaccent ccedilla -20
KPX rcommaaccent comma -60
KPX rcommaaccent d -20
KPX rcommaaccent dcroat -20
KPX rcommaaccent g -15
KPX rcommaaccent gbreve -15
KPX rcommaaccent gcommaaccent -15
KPX rcommaaccent hyphen -20
KPX rcommaaccent o -20
KPX rcommaaccent oacute -20
KPX rcommaaccent ocircumflex -20
KPX rcommaaccent odieresis -20
KPX rcommaaccent ograve -20
KPX rcommaaccent ohungarumlaut -20
KPX rcommaaccent omacron -20
KPX rcommaaccent oslash -20
KPX rcommaaccent otilde -20
KPX rcommaaccent period -60
KPX rcommaaccent q -20
KPX rcommaaccent s -15
KPX rcommaaccent sacute -15
KPX rcommaaccent scaron -15
KPX rcommaaccent scedilla -15
KPX rcommaaccent scommaaccent -15
KPX rcommaaccent t 20
KPX rcommaaccent tcommaaccent 20
KPX rcommaaccent v 10
KPX rcommaaccent y 10
KPX rcommaaccent yacute 10
KPX rcommaaccent ydieresis 10
KPX s w -15
KPX sacute w -15
KPX scaron w -15
KPX scedilla w -15
KPX scommaaccent w -15
KPX semicolon space -40
KPX space T -100
KPX space Tcaron -100
KPX space Tcommaaccent -100
KPX space V -80
KPX space W -80
KPX space Y -120
KPX space Yacute -120
KPX space Ydieresis -120
KPX space quotedblleft -80
KPX space quoteleft -60
KPX v a -20
KPX v aacute -20
KPX v abreve -20
KPX v acircumflex -20
KPX v adieresis -20
KPX v agrave -20
KPX v amacron -20
KPX v aogonek -20
KPX v aring -20
KPX v atilde -20
KPX v comma -80
KPX v o -30
KPX v oacute -30
KPX v ocircumflex -30
KPX v odieresis -30
KPX v ograve -30
KPX v ohungarumlaut -30
KPX v omacron -30
KPX v oslash -30
KPX v otilde -30
KPX v period -80
KPX w comma -40
KPX w o -20
KPX w oacute -20
KPX w ocircumflex -20
KPX w odieresis -20
KPX w ograve -20
KPX w ohungarumlaut -20
KPX w omacron -20
KPX w oslash -20
KPX w otilde -20
KPX w period -40
KPX x e -10
KPX x eacute -10
KPX x ecaron -10
KPX x ecircumflex -10
KPX x edieresis -10
KPX x edotaccent -10
KPX x egrave -10
KPX x emacron -10
KPX x eogonek -10
KPX y a -30
KPX y aacute -30
KPX y abreve -30
KPX y acircumflex -30
KPX y adieresis -30
KPX y agrave -30
KPX y amacron -30
KPX y aogonek -30
KPX y aring -30
KPX y atilde -30
KPX y comma -80
KPX y e -10
KPX y eacute -10
KPX y ecaron -10
KPX y ecircumflex -10
KPX y edieresis -10
KPX y edotaccent -10
KPX y egrave -10
KPX y emacron -10
KPX y eogonek -10
KPX y o -25
KPX y oacute -25
KPX y ocircumflex -25
KPX y odieresis -25
KPX y ograve -25
KPX y ohungarumlaut -25
KPX y omacron -25
KPX y oslash -25
KPX y otilde -25
KPX y period -80
KPX yacute a -30
KPX yacute aacute -30
KPX yacute abreve -30
KPX yacute acircumflex -30
KPX yacute adieresis -30
KPX yacute agrave -30
KPX yacute amacron -30
KPX yacute aogonek -30
KPX yacute aring -30
KPX yacute atilde -30
KPX yacute comma -80
KPX yacute e -10
KPX yacute eacute -10
KPX yacute ecaron -10
KPX yacute ecircumflex -10
KPX yacute edieresis -10
KPX yacute edotaccent -10
KPX yacute egrave -10
KPX yacute emacron -10
KPX yacute eogonek -10
KPX yacute o -25
KPX yacute oacute -25
KPX yacute ocircumflex -25
KPX yacute odieresis -25
KPX yacute ograve -25
KPX yacute ohungarumlaut -25
KPX yacute omacron -25
KPX yacute oslash -25
KPX yacute otilde -25
KPX yacute period -80
KPX ydieresis a -30
KPX ydieresis aacute -30
KPX ydieresis abreve -30
KPX ydieresis acircumflex -30
KPX ydieresis adieresis -30
KPX ydieresis agrave -30
KPX ydieresis amacron -30
KPX ydieresis aogonek -30
KPX ydieresis aring -30
KPX ydieresis atilde -30
KPX ydieresis comma -80
KPX ydieresis e -10
KPX ydieresis eacute -10
KPX ydieresis ecaron -10
KPX ydieresis ecircumflex -10
KPX ydieresis edieresis -10
KPX ydieresis edotaccent -10
KPX ydieresis egrave -10
KPX ydieresis emacron -10
KPX ydieresis eogonek -10
KPX ydieresis o -25
KPX ydieresis oacute -25
KPX ydieresis ocircumflex -25
KPX ydieresis odieresis -25
KPX ydieresis ograve -25
KPX ydieresis ohungarumlaut -25
KPX ydieresis omacron -25
KPX ydieresis oslash -25
KPX ydieresis otilde -25
KPX ydieresis period -80
KPX z e 10
KPX z eacute 10
KPX z ecaron 10
KPX z ecircumflex 10
KPX z edieresis 10
KPX z edotaccent 10
KPX z egrave 10
KPX z emacron 10
KPX z eogonek 10
KPX zacute e 10
KPX zacute eacute 10
KPX zacute ecaron 10
KPX zacute ecircumflex 10
KPX zacute edieresis 10
KPX zacute edotaccent 10
KPX zacute egrave 10
KPX zacute emacron 10
KPX zacute eogonek 10
KPX zcaron e 10
KPX zcaron eacute 10
KPX zcaron ecaron 10
KPX zcaron ecircumflex 10
KPX zcaron edieresis 10
KPX zcaron edotaccent 10
KPX zcaron egrave 10
KPX zcaron emacron 10
KPX zcaron eogonek 10
KPX zdotaccent e 10
KPX zdotaccent eacute 10
KPX zdotaccent ecaron 10
KPX zdotaccent ecircumflex 10
KPX zdotaccent edieresis 10
KPX zdotaccent edotaccent 10
KPX zdotaccent egrave 10
KPX zdotaccent emacron 10
KPX zdotaccent eogonek 10
EndKernPairs
EndKernData
EndFontMetrics
PK :;Kh2 2 lib/fonts/Times-Roman.afmnu W+A StartFontMetrics 4.1
Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
Comment Creation Date: Thu May 1 12:49:17 1997
Comment UniqueID 43068
Comment VMusage 43909 54934
FontName Times-Roman
FullName Times Roman
FamilyName Times
Weight Roman
ItalicAngle 0
IsFixedPitch false
CharacterSet ExtendedRoman
FontBBox -168 -218 1000 898
UnderlinePosition -100
UnderlineThickness 50
Version 002.00
Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
EncodingScheme WinAnsiEncoding
CapHeight 662
XHeight 450
Ascender 683
Descender -217
StdHW 28
StdVW 84
StartCharMetrics 317
C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
C 160 ; WX 250 ; N space ; B 0 0 0 0 ;
C 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ;
C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ;
C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ;
C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ;
C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ;
C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ;
C 146 ; WX 333 ; N quoteright ; B 79 433 218 676 ;
C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ;
C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ;
C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ;
C 43 ; WX 564 ; N plus ; B 30 0 534 506 ;
C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ;
C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ;
C 173 ; WX 333 ; N hyphen ; B 39 194 285 257 ;
C 46 ; WX 250 ; N period ; B 70 -11 181 100 ;
C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ;
C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ;
C 49 ; WX 500 ; N one ; B 111 0 394 676 ;
C 50 ; WX 500 ; N two ; B 30 0 475 676 ;
C 51 ; WX 500 ; N three ; B 43 -14 431 676 ;
C 52 ; WX 500 ; N four ; B 12 0 472 676 ;
C 53 ; WX 500 ; N five ; B 32 -14 438 688 ;
C 54 ; WX 500 ; N six ; B 34 -14 468 684 ;
C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ;
C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ;
C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ;
C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ;
C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ;
C 60 ; WX 564 ; N less ; B 28 -8 536 514 ;
C 61 ; WX 564 ; N equal ; B 30 120 534 386 ;
C 62 ; WX 564 ; N greater ; B 28 -8 536 514 ;
C 63 ; WX 444 ; N question ; B 68 -8 414 676 ;
C 64 ; WX 921 ; N at ; B 116 -14 809 676 ;
C 65 ; WX 722 ; N A ; B 15 0 706 674 ;
C 66 ; WX 667 ; N B ; B 17 0 593 662 ;
C 67 ; WX 667 ; N C ; B 28 -14 633 676 ;
C 68 ; WX 722 ; N D ; B 16 0 685 662 ;
C 69 ; WX 611 ; N E ; B 12 0 597 662 ;
C 70 ; WX 556 ; N F ; B 12 0 546 662 ;
C 71 ; WX 722 ; N G ; B 32 -14 709 676 ;
C 72 ; WX 722 ; N H ; B 19 0 702 662 ;
C 73 ; WX 333 ; N I ; B 18 0 315 662 ;
C 74 ; WX 389 ; N J ; B 10 -14 370 662 ;
C 75 ; WX 722 ; N K ; B 34 0 723 662 ;
C 76 ; WX 611 ; N L ; B 12 0 598 662 ;
C 77 ; WX 889 ; N M ; B 12 0 863 662 ;
C 78 ; WX 722 ; N N ; B 12 -11 707 662 ;
C 79 ; WX 722 ; N O ; B 34 -14 688 676 ;
C 80 ; WX 556 ; N P ; B 16 0 542 662 ;
C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ;
C 82 ; WX 667 ; N R ; B 17 0 659 662 ;
C 83 ; WX 556 ; N S ; B 42 -14 491 676 ;
C 84 ; WX 611 ; N T ; B 17 0 593 662 ;
C 85 ; WX 722 ; N U ; B 14 -14 705 662 ;
C 86 ; WX 722 ; N V ; B 16 -11 697 662 ;
C 87 ; WX 944 ; N W ; B 5 -11 932 662 ;
C 88 ; WX 722 ; N X ; B 10 0 704 662 ;
C 89 ; WX 722 ; N Y ; B 22 0 703 662 ;
C 90 ; WX 611 ; N Z ; B 9 0 597 662 ;
C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ;
C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ;
C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ;
C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ;
C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
C 145 ; WX 333 ; N quoteleft ; B 115 433 254 676 ;
C 97 ; WX 444 ; N a ; B 37 -10 442 460 ;
C 98 ; WX 500 ; N b ; B 3 -10 468 683 ;
C 99 ; WX 444 ; N c ; B 25 -10 412 460 ;
C 100 ; WX 500 ; N d ; B 27 -10 491 683 ;
C 101 ; WX 444 ; N e ; B 25 -10 424 460 ;
C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ;
C 103 ; WX 500 ; N g ; B 28 -218 470 460 ;
C 104 ; WX 500 ; N h ; B 9 0 487 683 ;
C 105 ; WX 278 ; N i ; B 16 0 253 683 ;
C 106 ; WX 278 ; N j ; B -70 -218 194 683 ;
C 107 ; WX 500 ; N k ; B 7 0 505 683 ;
C 108 ; WX 278 ; N l ; B 19 0 257 683 ;
C 109 ; WX 778 ; N m ; B 16 0 775 460 ;
C 110 ; WX 500 ; N n ; B 16 0 485 460 ;
C 111 ; WX 500 ; N o ; B 29 -10 470 460 ;
C 112 ; WX 500 ; N p ; B 5 -217 470 460 ;
C 113 ; WX 500 ; N q ; B 24 -217 488 460 ;
C 114 ; WX 333 ; N r ; B 5 0 335 460 ;
C 115 ; WX 389 ; N s ; B 51 -10 348 460 ;
C 116 ; WX 278 ; N t ; B 13 -10 279 579 ;
C 117 ; WX 500 ; N u ; B 9 -10 479 450 ;
C 118 ; WX 500 ; N v ; B 19 -14 477 450 ;
C 119 ; WX 722 ; N w ; B 21 -14 694 450 ;
C 120 ; WX 500 ; N x ; B 17 0 479 450 ;
C 121 ; WX 500 ; N y ; B 14 -218 475 450 ;
C 122 ; WX 444 ; N z ; B 27 0 418 450 ;
C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ;
C 124 ; WX 200 ; N bar ; B 67 -218 133 782 ;
C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ;
C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;
C 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ;
C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ;
C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ;
C -1 ; WX 167 ; N fraction ; B -168 -14 331 676 ;
C 165 ; WX 500 ; N yen ; B -53 0 512 662 ;
C 131 ; WX 500 ; N florin ; B 7 -189 490 676 ;
C 167 ; WX 500 ; N section ; B 70 -148 426 676 ;
C 164 ; WX 500 ; N currency ; B -22 58 522 602 ;
C 39 ; WX 180 ; N quotesingle ; B 48 431 133 676 ;
C 147 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ;
C 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ;
C 139 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ;
C 155 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ;
C -1 ; WX 556 ; N fi ; B 31 0 521 683 ;
C -1 ; WX 556 ; N fl ; B 32 0 521 683 ;
C 150 ; WX 500 ; N endash ; B 0 201 500 250 ;
C 134 ; WX 500 ; N dagger ; B 59 -149 442 676 ;
C 135 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ;
C 183 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;
C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ;
C 149 ; WX 350 ; N bullet ; B 40 196 310 466 ;
C 130 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ;
C 132 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ;
C 148 ; WX 444 ; N quotedblright ; B 30 433 401 676 ;
C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ;
C 133 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ;
C 137 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ;
C 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ;
C 96 ; WX 333 ; N grave ; B 19 507 242 678 ;
C 180 ; WX 333 ; N acute ; B 93 507 317 678 ;
C 136 ; WX 333 ; N circumflex ; B 11 507 322 674 ;
C 152 ; WX 333 ; N tilde ; B 1 532 331 638 ;
C 175 ; WX 333 ; N macron ; B 11 547 322 601 ;
C -1 ; WX 333 ; N breve ; B 26 507 307 664 ;
C -1 ; WX 333 ; N dotaccent ; B 118 581 216 681 ;
C 168 ; WX 333 ; N dieresis ; B 18 581 315 681 ;
C -1 ; WX 333 ; N ring ; B 67 512 266 711 ;
C 184 ; WX 333 ; N cedilla ; B 52 -215 261 0 ;
C -1 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ;
C -1 ; WX 333 ; N ogonek ; B 62 -165 243 0 ;
C -1 ; WX 333 ; N caron ; B 11 507 322 674 ;
C 151 ; WX 1000 ; N emdash ; B 0 201 1000 250 ;
C 198 ; WX 889 ; N AE ; B 0 0 863 662 ;
C 170 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ;
C -1 ; WX 611 ; N Lslash ; B 12 0 598 662 ;
C 216 ; WX 722 ; N Oslash ; B 34 -80 688 734 ;
C 140 ; WX 889 ; N OE ; B 30 -6 885 668 ;
C 186 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ;
C 230 ; WX 667 ; N ae ; B 38 -10 632 460 ;
C -1 ; WX 278 ; N dotlessi ; B 16 0 253 460 ;
C -1 ; WX 278 ; N lslash ; B 19 0 259 683 ;
C 248 ; WX 500 ; N oslash ; B 29 -112 470 551 ;
C 156 ; WX 722 ; N oe ; B 30 -10 690 460 ;
C 223 ; WX 500 ; N germandbls ; B 12 -9 468 683 ;
C 207 ; WX 333 ; N Idieresis ; B 18 0 315 835 ;
C 233 ; WX 444 ; N eacute ; B 25 -10 424 678 ;
C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ;
C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ;
C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ;
C 159 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ;
C 247 ; WX 564 ; N divide ; B 30 -10 534 516 ;
C 221 ; WX 722 ; N Yacute ; B 22 0 703 890 ;
C 194 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ;
C 225 ; WX 444 ; N aacute ; B 37 -10 442 678 ;
C 219 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ;
C 253 ; WX 500 ; N yacute ; B 14 -218 475 678 ;
C -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ;
C 234 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ;
C -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ;
C 220 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ;
C -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ;
C 218 ; WX 722 ; N Uacute ; B 14 -14 705 890 ;
C -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ;
C 203 ; WX 611 ; N Edieresis ; B 12 0 597 835 ;
C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ;
C -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ;
C 169 ; WX 760 ; N copyright ; B 38 -14 722 676 ;
C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ;
C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ;
C 229 ; WX 444 ; N aring ; B 37 -10 442 711 ;
C -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ;
C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ;
C 224 ; WX 444 ; N agrave ; B 37 -10 442 678 ;
C -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ;
C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ;
C 227 ; WX 444 ; N atilde ; B 37 -10 442 638 ;
C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ;
C 154 ; WX 389 ; N scaron ; B 39 -10 350 674 ;
C -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ;
C 237 ; WX 278 ; N iacute ; B 16 0 290 678 ;
C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;
C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ;
C -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ;
C 251 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ;
C 226 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ;
C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ;
C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ;
C 231 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ;
C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ;
C 222 ; WX 556 ; N Thorn ; B 16 0 542 662 ;
C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ;
C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ;
C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ;
C -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ;
C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ;
C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ;
C 179 ; WX 300 ; N threesuperior ; B 15 262 291 676 ;
C 210 ; WX 722 ; N Ograve ; B 34 -14 688 890 ;
C 192 ; WX 722 ; N Agrave ; B 15 0 706 890 ;
C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ;
C 215 ; WX 564 ; N multiply ; B 38 8 527 497 ;
C 250 ; WX 500 ; N uacute ; B 9 -10 479 678 ;
C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ;
C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;
C 255 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ;
C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ;
C 238 ; WX 278 ; N icircumflex ; B -16 0 295 674 ;
C 202 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ;
C 228 ; WX 444 ; N adieresis ; B 37 -10 442 623 ;
C 235 ; WX 444 ; N edieresis ; B 25 -10 424 623 ;
C -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ;
C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ;
C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ;
C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ;
C 205 ; WX 333 ; N Iacute ; B 18 0 317 890 ;
C 177 ; WX 564 ; N plusminus ; B 30 0 534 506 ;
C 166 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ;
C 174 ; WX 760 ; N registered ; B 38 -14 722 676 ;
C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ;
C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ;
C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
C 200 ; WX 611 ; N Egrave ; B 12 0 597 890 ;
C -1 ; WX 333 ; N racute ; B 5 0 335 678 ;
C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ;
C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ;
C 142 ; WX 611 ; N Zcaron ; B 9 0 597 886 ;
C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ;
C 208 ; WX 722 ; N Eth ; B 16 0 685 662 ;
C 199 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ;
C -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ;
C -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ;
C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ;
C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ;
C 193 ; WX 722 ; N Aacute ; B 15 0 706 890 ;
C 196 ; WX 722 ; N Adieresis ; B 15 0 706 835 ;
C 232 ; WX 444 ; N egrave ; B 25 -10 424 678 ;
C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ;
C -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ;
C 211 ; WX 722 ; N Oacute ; B 34 -14 688 890 ;
C 243 ; WX 500 ; N oacute ; B 29 -10 470 678 ;
C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ;
C -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ;
C 239 ; WX 278 ; N idieresis ; B -9 0 288 623 ;
C 212 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ;
C 217 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ;
C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
C 254 ; WX 500 ; N thorn ; B 5 -217 470 683 ;
C 178 ; WX 300 ; N twosuperior ; B 1 270 296 676 ;
C 214 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ;
C 181 ; WX 500 ; N mu ; B 36 -218 512 450 ;
C 236 ; WX 278 ; N igrave ; B -8 0 253 678 ;
C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ;
C -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ;
C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ;
C 190 ; WX 750 ; N threequarters ; B 15 -14 718 676 ;
C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ;
C -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ;
C -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ;
C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ;
C 153 ; WX 980 ; N trademark ; B 30 256 957 662 ;
C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ;
C 204 ; WX 333 ; N Igrave ; B 18 0 315 890 ;
C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ;
C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ;
C 189 ; WX 750 ; N onehalf ; B 31 -14 746 676 ;
C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ;
C 244 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ;
C 241 ; WX 500 ; N ntilde ; B 16 0 485 638 ;
C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ;
C 201 ; WX 611 ; N Eacute ; B 12 0 597 890 ;
C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ;
C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ;
C 188 ; WX 750 ; N onequarter ; B 37 -14 718 676 ;
C 138 ; WX 556 ; N Scaron ; B 42 -14 491 886 ;
C -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ;
C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ;
C 176 ; WX 400 ; N degree ; B 57 390 343 676 ;
C 242 ; WX 500 ; N ograve ; B 29 -10 470 678 ;
C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ;
C 249 ; WX 500 ; N ugrave ; B 9 -10 479 678 ;
C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;
C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ;
C -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ;
C 209 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ;
C 245 ; WX 500 ; N otilde ; B 29 -10 470 638 ;
C -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ;
C -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ;
C 195 ; WX 722 ; N Atilde ; B 15 0 706 850 ;
C -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ;
C 197 ; WX 722 ; N Aring ; B 15 0 706 898 ;
C 213 ; WX 722 ; N Otilde ; B 34 -14 688 850 ;
C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ;
C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ;
C -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ;
C -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ;
C -1 ; WX 564 ; N minus ; B 30 220 534 286 ;
C 206 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ;
C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ;
C -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ;
C 172 ; WX 564 ; N logicalnot ; B 30 108 534 386 ;
C 246 ; WX 500 ; N odieresis ; B 29 -10 470 623 ;
C 252 ; WX 500 ; N udieresis ; B 9 -10 479 623 ;
C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ;
C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ;
C 240 ; WX 500 ; N eth ; B 29 -10 471 686 ;
C 158 ; WX 444 ; N zcaron ; B 27 0 418 674 ;
C -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ;
C 185 ; WX 300 ; N onesuperior ; B 57 270 248 676 ;
C -1 ; WX 278 ; N imacron ; B 6 0 271 601 ;
C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ;
EndCharMetrics
StartKernData
StartKernPairs 2073
KPX A C -40
KPX A Cacute -40
KPX A Ccaron -40
KPX A Ccedilla -40
KPX A G -40
KPX A Gbreve -40
KPX A Gcommaaccent -40
KPX A O -55
KPX A Oacute -55
KPX A Ocircumflex -55
KPX A Odieresis -55
KPX A Ograve -55
KPX A Ohungarumlaut -55
KPX A Omacron -55
KPX A Oslash -55
KPX A Otilde -55
KPX A Q -55
KPX A T -111
KPX A Tcaron -111
KPX A Tcommaaccent -111
KPX A U -55
KPX A Uacute -55
KPX A Ucircumflex -55
KPX A Udieresis -55
KPX A Ugrave -55
KPX A Uhungarumlaut -55
KPX A Umacron -55
KPX A Uogonek -55
KPX A Uring -55
KPX A V -135
KPX A W -90
KPX A Y -105
KPX A Yacute -105
KPX A Ydieresis -105
KPX A quoteright -111
KPX A v -74
KPX A w -92
KPX A y -92
KPX A yacute -92
KPX A ydieresis -92
KPX Aacute C -40
KPX Aacute Cacute -40
KPX Aacute Ccaron -40
KPX Aacute Ccedilla -40
KPX Aacute G -40
KPX Aacute Gbreve -40
KPX Aacute Gcommaaccent -40
KPX Aacute O -55
KPX Aacute Oacute -55
KPX Aacute Ocircumflex -55
KPX Aacute Odieresis -55
KPX Aacute Ograve -55
KPX Aacute Ohungarumlaut -55
KPX Aacute Omacron -55
KPX Aacute Oslash -55
KPX Aacute Otilde -55
KPX Aacute Q -55
KPX Aacute T -111
KPX Aacute Tcaron -111
KPX Aacute Tcommaaccent -111
KPX Aacute U -55
KPX Aacute Uacute -55
KPX Aacute Ucircumflex -55
KPX Aacute Udieresis -55
KPX Aacute Ugrave -55
KPX Aacute Uhungarumlaut -55
KPX Aacute Umacron -55
KPX Aacute Uogonek -55
KPX Aacute Uring -55
KPX Aacute V -135
KPX Aacute W -90
KPX Aacute Y -105
KPX Aacute Yacute -105
KPX Aacute Ydieresis -105
KPX Aacute quoteright -111
KPX Aacute v -74
KPX Aacute w -92
KPX Aacute y -92
KPX Aacute yacute -92
KPX Aacute ydieresis -92
KPX Abreve C -40
KPX Abreve Cacute -40
KPX Abreve Ccaron -40
KPX Abreve Ccedilla -40
KPX Abreve G -40
KPX Abreve Gbreve -40
KPX Abreve Gcommaaccent -40
KPX Abreve O -55
KPX Abreve Oacute -55
KPX Abreve Ocircumflex -55
KPX Abreve Odieresis -55
KPX Abreve Ograve -55
KPX Abreve Ohungarumlaut -55
KPX Abreve Omacron -55
KPX Abreve Oslash -55
KPX Abreve Otilde -55
KPX Abreve Q -55
KPX Abreve T -111
KPX Abreve Tcaron -111
KPX Abreve Tcommaaccent -111
KPX Abreve U -55
KPX Abreve Uacute -55
KPX Abreve Ucircumflex -55
KPX Abreve Udieresis -55
KPX Abreve Ugrave -55
KPX Abreve Uhungarumlaut -55
KPX Abreve Umacron -55
KPX Abreve Uogonek -55
KPX Abreve Uring -55
KPX Abreve V -135
KPX Abreve W -90
KPX Abreve Y -105
KPX Abreve Yacute -105
KPX Abreve Ydieresis -105
KPX Abreve quoteright -111
KPX Abreve v -74
KPX Abreve w -92
KPX Abreve y -92
KPX Abreve yacute -92
KPX Abreve ydieresis -92
KPX Acircumflex C -40
KPX Acircumflex Cacute -40
KPX Acircumflex Ccaron -40
KPX Acircumflex Ccedilla -40
KPX Acircumflex G -40
KPX Acircumflex Gbreve -40
KPX Acircumflex Gcommaaccent -40
KPX Acircumflex O -55
KPX Acircumflex Oacute -55
KPX Acircumflex Ocircumflex -55
KPX Acircumflex Odieresis -55
KPX Acircumflex Ograve -55
KPX Acircumflex Ohungarumlaut -55
KPX Acircumflex Omacron -55
KPX Acircumflex Oslash -55
KPX Acircumflex Otilde -55
KPX Acircumflex Q -55
KPX Acircumflex T -111
KPX Acircumflex Tcaron -111
KPX Acircumflex Tcommaaccent -111
KPX Acircumflex U -55
KPX Acircumflex Uacute -55
KPX Acircumflex Ucircumflex -55
KPX Acircumflex Udieresis -55
KPX Acircumflex Ugrave -55
KPX Acircumflex Uhungarumlaut -55
KPX Acircumflex Umacron -55
KPX Acircumflex Uogonek -55
KPX Acircumflex Uring -55
KPX Acircumflex V -135
KPX Acircumflex W -90
KPX Acircumflex Y -105
KPX Acircumflex Yacute -105
KPX Acircumflex Ydieresis -105
KPX Acircumflex quoteright -111
KPX Acircumflex v -74
KPX Acircumflex w -92
KPX Acircumflex y -92
KPX Acircumflex yacute -92
KPX Acircumflex ydieresis -92
KPX Adieresis C -40
KPX Adieresis Cacute -40
KPX Adieresis Ccaron -40
KPX Adieresis Ccedilla -40
KPX Adieresis G -40
KPX Adieresis Gbreve -40
KPX Adieresis Gcommaaccent -40
KPX Adieresis O -55
KPX Adieresis Oacute -55
KPX Adieresis Ocircumflex -55
KPX Adieresis Odieresis -55
KPX Adieresis Ograve -55
KPX Adieresis Ohungarumlaut -55
KPX Adieresis Omacron -55
KPX Adieresis Oslash -55
KPX Adieresis Otilde -55
KPX Adieresis Q -55
KPX Adieresis T -111
KPX Adieresis Tcaron -111
KPX Adieresis Tcommaaccent -111
KPX Adieresis U -55
KPX Adieresis Uacute -55
KPX Adieresis Ucircumflex -55
KPX Adieresis Udieresis -55
KPX Adieresis Ugrave -55
KPX Adieresis Uhungarumlaut -55
KPX Adieresis Umacron -55
KPX Adieresis Uogonek -55
KPX Adieresis Uring -55
KPX Adieresis V -135
KPX Adieresis W -90
KPX Adieresis Y -105
KPX Adieresis Yacute -105
KPX Adieresis Ydieresis -105
KPX Adieresis quoteright -111
KPX Adieresis v -74
KPX Adieresis w -92
KPX Adieresis y -92
KPX Adieresis yacute -92
KPX Adieresis ydieresis -92
KPX Agrave C -40
KPX Agrave Cacute -40
KPX Agrave Ccaron -40
KPX Agrave Ccedilla -40
KPX Agrave G -40
KPX Agrave Gbreve -40
KPX Agrave Gcommaaccent -40
KPX Agrave O -55
KPX Agrave Oacute -55
KPX Agrave Ocircumflex -55
KPX Agrave Odieresis -55
KPX Agrave Ograve -55
KPX Agrave Ohungarumlaut -55
KPX Agrave Omacron -55
KPX Agrave Oslash -55
KPX Agrave Otilde -55
KPX Agrave Q -55
KPX Agrave T -111
KPX Agrave Tcaron -111
KPX Agrave Tcommaaccent -111
KPX Agrave U -55
KPX Agrave Uacute -55
KPX Agrave Ucircumflex -55
KPX Agrave Udieresis -55
KPX Agrave Ugrave -55
KPX Agrave Uhungarumlaut -55
KPX Agrave Umacron -55
KPX Agrave Uogonek -55
KPX Agrave Uring -55
KPX Agrave V -135
KPX Agrave W -90
KPX Agrave Y -105
KPX Agrave Yacute -105
KPX Agrave Ydieresis -105
KPX Agrave quoteright -111
KPX Agrave v -74
KPX Agrave w -92
KPX Agrave y -92
KPX Agrave yacute -92
KPX Agrave ydieresis -92
KPX Amacron C -40
KPX Amacron Cacute -40
KPX Amacron Ccaron -40
KPX Amacron Ccedilla -40
KPX Amacron G -40
KPX Amacron Gbreve -40
KPX Amacron Gcommaaccent -40
KPX Amacron O -55
KPX Amacron Oacute -55
KPX Amacron Ocircumflex -55
KPX Amacron Odieresis -55
KPX Amacron Ograve -55
KPX Amacron Ohungarumlaut -55
KPX Amacron Omacron -55
KPX Amacron Oslash -55
KPX Amacron Otilde -55
KPX Amacron Q -55
KPX Amacron T -111
KPX Amacron Tcaron -111
KPX Amacron Tcommaaccent -111
KPX Amacron U -55
KPX Amacron Uacute -55
KPX Amacron Ucircumflex -55
KPX Amacron Udieresis -55
KPX Amacron Ugrave -55
KPX Amacron Uhungarumlaut -55
KPX Amacron Umacron -55
KPX Amacron Uogonek -55
KPX Amacron Uring -55
KPX Amacron V -135
KPX Amacron W -90
KPX Amacron Y -105
KPX Amacron Yacute -105
KPX Amacron Ydieresis -105
KPX Amacron quoteright -111
KPX Amacron v -74
KPX Amacron w -92
KPX Amacron y -92
KPX Amacron yacute -92
KPX Amacron ydieresis -92
KPX Aogonek C -40
KPX Aogonek Cacute -40
KPX Aogonek Ccaron -40
KPX Aogonek Ccedilla -40
KPX Aogonek G -40
KPX Aogonek Gbreve -40
KPX Aogonek Gcommaaccent -40
KPX Aogonek O -55
KPX Aogonek Oacute -55
KPX Aogonek Ocircumflex -55
KPX Aogonek Odieresis -55
KPX Aogonek Ograve -55
KPX Aogonek Ohungarumlaut -55
KPX Aogonek Omacron -55
KPX Aogonek Oslash -55
KPX Aogonek Otilde -55
KPX Aogonek Q -55
KPX Aogonek T -111
KPX Aogonek Tcaron -111
KPX Aogonek Tcommaaccent -111
KPX Aogonek U -55
KPX Aogonek Uacute -55
KPX Aogonek Ucircumflex -55
KPX Aogonek Udieresis -55
KPX Aogonek Ugrave -55
KPX Aogonek Uhungarumlaut -55
KPX Aogonek Umacron -55
KPX Aogonek Uogonek -55
KPX Aogonek Uring -55
KPX Aogonek V -135
KPX Aogonek W -90
KPX Aogonek Y -105
KPX Aogonek Yacute -105
KPX Aogonek Ydieresis -105
KPX Aogonek quoteright -111
KPX Aogonek v -74
KPX Aogonek w -52
KPX Aogonek y -52
KPX Aogonek yacute -52
KPX Aogonek ydieresis -52
KPX Aring C -40
KPX Aring Cacute -40
KPX Aring Ccaron -40
KPX Aring Ccedilla -40
KPX Aring G -40
KPX Aring Gbreve -40
KPX Aring Gcommaaccent -40
KPX Aring O -55
KPX Aring Oacute -55
KPX Aring Ocircumflex -55
KPX Aring Odieresis -55
KPX Aring Ograve -55
KPX Aring Ohungarumlaut -55
KPX Aring Omacron -55
KPX Aring Oslash -55
KPX Aring Otilde -55
KPX Aring Q -55
KPX Aring T -111
KPX Aring Tcaron -111
KPX Aring Tcommaaccent -111
KPX Aring U -55
KPX Aring Uacute -55
KPX Aring Ucircumflex -55
KPX Aring Udieresis -55
KPX Aring Ugrave -55
KPX Aring Uhungarumlaut -55
KPX Aring Umacron -55
KPX Aring Uogonek -55
KPX Aring Uring -55
KPX Aring V -135
KPX Aring W -90
KPX Aring Y -105
KPX Aring Yacute -105
KPX Aring Ydieresis -105
KPX Aring quoteright -111
KPX Aring v -74
KPX Aring w -92
KPX Aring y -92
KPX Aring yacute -92
KPX Aring ydieresis -92
KPX Atilde C -40
KPX Atilde Cacute -40
KPX Atilde Ccaron -40
KPX Atilde Ccedilla -40
KPX Atilde G -40
KPX Atilde Gbreve -40
KPX Atilde Gcommaaccent -40
KPX Atilde O -55
KPX Atilde Oacute -55
KPX Atilde Ocircumflex -55
KPX Atilde Odieresis -55
KPX Atilde Ograve -55
KPX Atilde Ohungarumlaut -55
KPX Atilde Omacron -55
KPX Atilde Oslash -55
KPX Atilde Otilde -55
KPX Atilde Q -55
KPX Atilde T -111
KPX Atilde Tcaron -111
KPX Atilde Tcommaaccent -111
KPX Atilde U -55
KPX Atilde Uacute -55
KPX Atilde Ucircumflex -55
KPX Atilde Udieresis -55
KPX Atilde Ugrave -55
KPX Atilde Uhungarumlaut -55
KPX Atilde Umacron -55
KPX Atilde Uogonek -55
KPX Atilde Uring -55
KPX Atilde V -135
KPX Atilde W -90
KPX Atilde Y -105
KPX Atilde Yacute -105
KPX Atilde Ydieresis -105
KPX Atilde quoteright -111
KPX Atilde v -74
KPX Atilde w -92
KPX Atilde y -92
KPX Atilde yacute -92
KPX Atilde ydieresis -92
KPX B A -35
KPX B Aacute -35
KPX B Abreve -35
KPX B Acircumflex -35
KPX B Adieresis -35
KPX B Agrave -35
KPX B Amacron -35
KPX B Aogonek -35
KPX B Aring -35
KPX B Atilde -35
KPX B U -10
KPX B Uacute -10
KPX B Ucircumflex -10
KPX B Udieresis -10
KPX B Ugrave -10
KPX B Uhungarumlaut -10
KPX B Umacron -10
KPX B Uogonek -10
KPX B Uring -10
KPX D A -40
KPX D Aacute -40
KPX D Abreve -40
KPX D Acircumflex -40
KPX D Adieresis -40
KPX D Agrave -40
KPX D Amacron -40
KPX D Aogonek -40
KPX D Aring -40
KPX D Atilde -40
KPX D V -40
KPX D W -30
KPX D Y -55
KPX D Yacute -55
KPX D Ydieresis -55
KPX Dcaron A -40
KPX Dcaron Aacute -40
KPX Dcaron Abreve -40
KPX Dcaron Acircumflex -40
KPX Dcaron Adieresis -40
KPX Dcaron Agrave -40
KPX Dcaron Amacron -40
KPX Dcaron Aogonek -40
KPX Dcaron Aring -40
KPX Dcaron Atilde -40
KPX Dcaron V -40
KPX Dcaron W -30
KPX Dcaron Y -55
KPX Dcaron Yacute -55
KPX Dcaron Ydieresis -55
KPX Dcroat A -40
KPX Dcroat Aacute -40
KPX Dcroat Abreve -40
KPX Dcroat Acircumflex -40
KPX Dcroat Adieresis -40
KPX Dcroat Agrave -40
KPX Dcroat Amacron -40
KPX Dcroat Aogonek -40
KPX Dcroat Aring -40
KPX Dcroat Atilde -40
KPX Dcroat V -40
KPX Dcroat W -30
KPX Dcroat Y -55
KPX Dcroat Yacute -55
KPX Dcroat Ydieresis -55
KPX F A -74
KPX F Aacute -74
KPX F Abreve -74
KPX F Acircumflex -74
KPX F Adieresis -74
KPX F Agrave -74
KPX F Amacron -74
KPX F Aogonek -74
KPX F Aring -74
KPX F Atilde -74
KPX F a -15
KPX F aacute -15
KPX F abreve -15
KPX F acircumflex -15
KPX F adieresis -15
KPX F agrave -15
KPX F amacron -15
KPX F aogonek -15
KPX F aring -15
KPX F atilde -15
KPX F comma -80
KPX F o -15
KPX F oacute -15
KPX F ocircumflex -15
KPX F odieresis -15
KPX F ograve -15
KPX F ohungarumlaut -15
KPX F omacron -15
KPX F oslash -15
KPX F otilde -15
KPX F period -80
KPX J A -60
KPX J Aacute -60
KPX J Abreve -60
KPX J Acircumflex -60
KPX J Adieresis -60
KPX J Agrave -60
KPX J Amacron -60
KPX J Aogonek -60
KPX J Aring -60
KPX J Atilde -60
KPX K O -30
KPX K Oacute -30
KPX K Ocircumflex -30
KPX K Odieresis -30
KPX K Ograve -30
KPX K Ohungarumlaut -30
KPX K Omacron -30
KPX K Oslash -30
KPX K Otilde -30
KPX K e -25
KPX K eacute -25
KPX K ecaron -25
KPX K ecircumflex -25
KPX K edieresis -25
KPX K edotaccent -25
KPX K egrave -25
KPX K emacron -25
KPX K eogonek -25
KPX K o -35
KPX K oacute -35
KPX K ocircumflex -35
KPX K odieresis -35
KPX K ograve -35
KPX K ohungarumlaut -35
KPX K omacron -35
KPX K oslash -35
KPX K otilde -35
KPX K u -15
KPX K uacute -15
KPX K ucircumflex -15
KPX K udieresis -15
KPX K ugrave -15
KPX K uhungarumlaut -15
KPX K umacron -15
KPX K uogonek -15
KPX K uring -15
KPX K y -25
KPX K yacute -25
KPX K ydieresis -25
KPX Kcommaaccent O -30
KPX Kcommaaccent Oacute -30
KPX Kcommaaccent Ocircumflex -30
KPX Kcommaaccent Odieresis -30
KPX Kcommaaccent Ograve -30
KPX Kcommaaccent Ohungarumlaut -30
KPX Kcommaaccent Omacron -30
KPX Kcommaaccent Oslash -30
KPX Kcommaaccent Otilde -30
KPX Kcommaaccent e -25
KPX Kcommaaccent eacute -25
KPX Kcommaaccent ecaron -25
KPX Kcommaaccent ecircumflex -25
KPX Kcommaaccent edieresis -25
KPX Kcommaaccent edotaccent -25
KPX Kcommaaccent egrave -25
KPX Kcommaaccent emacron -25
KPX Kcommaaccent eogonek -25
KPX Kcommaaccent o -35
KPX Kcommaaccent oacute -35
KPX Kcommaaccent ocircumflex -35
KPX Kcommaaccent odieresis -35
KPX Kcommaaccent ograve -35
KPX Kcommaaccent ohungarumlaut -35
KPX Kcommaaccent omacron -35
KPX Kcommaaccent oslash -35
KPX Kcommaaccent otilde -35
KPX Kcommaaccent u -15
KPX Kcommaaccent uacute -15
KPX Kcommaaccent ucircumflex -15
KPX Kcommaaccent udieresis -15
KPX Kcommaaccent ugrave -15
KPX Kcommaaccent uhungarumlaut -15
KPX Kcommaaccent umacron -15
KPX Kcommaaccent uogonek -15
KPX Kcommaaccent uring -15
KPX Kcommaaccent y -25
KPX Kcommaaccent yacute -25
KPX Kcommaaccent ydieresis -25
KPX L T -92
KPX L Tcaron -92
KPX L Tcommaaccent -92
KPX L V -100
KPX L W -74
KPX L Y -100
KPX L Yacute -100
KPX L Ydieresis -100
KPX L quoteright -92
KPX L y -55
KPX L yacute -55
KPX L ydieresis -55
KPX Lacute T -92
KPX Lacute Tcaron -92
KPX Lacute Tcommaaccent -92
KPX Lacute V -100
KPX Lacute W -74
KPX Lacute Y -100
KPX Lacute Yacute -100
KPX Lacute Ydieresis -100
KPX Lacute quoteright -92
KPX Lacute y -55
KPX Lacute yacute -55
KPX Lacute ydieresis -55
KPX Lcaron quoteright -92
KPX Lcaron y -55
KPX Lcaron yacute -55
KPX Lcaron ydieresis -55
KPX Lcommaaccent T -92
KPX Lcommaaccent Tcaron -92
KPX Lcommaaccent Tcommaaccent -92
KPX Lcommaaccent V -100
KPX Lcommaaccent W -74
KPX Lcommaaccent Y -100
KPX Lcommaaccent Yacute -100
KPX Lcommaaccent Ydieresis -100
KPX Lcommaaccent quoteright -92
KPX Lcommaaccent y -55
KPX Lcommaaccent yacute -55
KPX Lcommaaccent ydieresis -55
KPX Lslash T -92
KPX Lslash Tcaron -92
KPX Lslash Tcommaaccent -92
KPX Lslash V -100
KPX Lslash W -74
KPX Lslash Y -100
KPX Lslash Yacute -100
KPX Lslash Ydieresis -100
KPX Lslash quoteright -92
KPX Lslash y -55
KPX Lslash yacute -55
KPX Lslash ydieresis -55
KPX N A -35
KPX N Aacute -35
KPX N Abreve -35
KPX N Acircumflex -35
KPX N Adieresis -35
KPX N Agrave -35
KPX N Amacron -35
KPX N Aogonek -35
KPX N Aring -35
KPX N Atilde -35
KPX Nacute A -35
KPX Nacute Aacute -35
KPX Nacute Abreve -35
KPX Nacute Acircumflex -35
KPX Nacute Adieresis -35
KPX Nacute Agrave -35
KPX Nacute Amacron -35
KPX Nacute Aogonek -35
KPX Nacute Aring -35
KPX Nacute Atilde -35
KPX Ncaron A -35
KPX Ncaron Aacute -35
KPX Ncaron Abreve -35
KPX Ncaron Acircumflex -35
KPX Ncaron Adieresis -35
KPX Ncaron Agrave -35
KPX Ncaron Amacron -35
KPX Ncaron Aogonek -35
KPX Ncaron Aring -35
KPX Ncaron Atilde -35
KPX Ncommaaccent A -35
KPX Ncommaaccent Aacute -35
KPX Ncommaaccent Abreve -35
KPX Ncommaaccent Acircumflex -35
KPX Ncommaaccent Adieresis -35
KPX Ncommaaccent Agrave -35
KPX Ncommaaccent Amacron -35
KPX Ncommaaccent Aogonek -35
KPX Ncommaaccent Aring -35
KPX Ncommaaccent Atilde -35
KPX Ntilde A -35
KPX Ntilde Aacute -35
KPX Ntilde Abreve -35
KPX Ntilde Acircumflex -35
KPX Ntilde Adieresis -35
KPX Ntilde Agrave -35
KPX Ntilde Amacron -35
KPX Ntilde Aogonek -35
KPX Ntilde Aring -35
KPX Ntilde Atilde -35
KPX O A -35
KPX O Aacute -35
KPX O Abreve -35
KPX O Acircumflex -35
KPX O Adieresis -35
KPX O Agrave -35
KPX O Amacron -35
KPX O Aogonek -35
KPX O Aring -35
KPX O Atilde -35
KPX O T -40
KPX O Tcaron -40
KPX O Tcommaaccent -40
KPX O V -50
KPX O W -35
KPX O X -40
KPX O Y -50
KPX O Yacute -50
KPX O Ydieresis -50
KPX Oacute A -35
KPX Oacute Aacute -35
KPX Oacute Abreve -35
KPX Oacute Acircumflex -35
KPX Oacute Adieresis -35
KPX Oacute Agrave -35
KPX Oacute Amacron -35
KPX Oacute Aogonek -35
KPX Oacute Aring -35
KPX Oacute Atilde -35
KPX Oacute T -40
KPX Oacute Tcaron -40
KPX Oacute Tcommaaccent -40
KPX Oacute V -50
KPX Oacute W -35
KPX Oacute X -40
KPX Oacute Y -50
KPX Oacute Yacute -50
KPX Oacute Ydieresis -50
KPX Ocircumflex A -35
KPX Ocircumflex Aacute -35
KPX Ocircumflex Abreve -35
KPX Ocircumflex Acircumflex -35
KPX Ocircumflex Adieresis -35
KPX Ocircumflex Agrave -35
KPX Ocircumflex Amacron -35
KPX Ocircumflex Aogonek -35
KPX Ocircumflex Aring -35
KPX Ocircumflex Atilde -35
KPX Ocircumflex T -40
KPX Ocircumflex Tcaron -40
KPX Ocircumflex Tcommaaccent -40
KPX Ocircumflex V -50
KPX Ocircumflex W -35
KPX Ocircumflex X -40
KPX Ocircumflex Y -50
KPX Ocircumflex Yacute -50
KPX Ocircumflex Ydieresis -50
KPX Odieresis A -35
KPX Odieresis Aacute -35
KPX Odieresis Abreve -35
KPX Odieresis Acircumflex -35
KPX Odieresis Adieresis -35
KPX Odieresis Agrave -35
KPX Odieresis Amacron -35
KPX Odieresis Aogonek -35
KPX Odieresis Aring -35
KPX Odieresis Atilde -35
KPX Odieresis T -40
KPX Odieresis Tcaron -40
KPX Odieresis Tcommaaccent -40
KPX Odieresis V -50
KPX Odieresis W -35
KPX Odieresis X -40
KPX Odieresis Y -50
KPX Odieresis Yacute -50
KPX Odieresis Ydieresis -50
KPX Ograve A -35
KPX Ograve Aacute -35
KPX Ograve Abreve -35
KPX Ograve Acircumflex -35
KPX Ograve Adieresis -35
KPX Ograve Agrave -35
KPX Ograve Amacron -35
KPX Ograve Aogonek -35
KPX Ograve Aring -35
KPX Ograve Atilde -35
KPX Ograve T -40
KPX Ograve Tcaron -40
KPX Ograve Tcommaaccent -40
KPX Ograve V -50
KPX Ograve W -35
KPX Ograve X -40
KPX Ograve Y -50
KPX Ograve Yacute -50
KPX Ograve Ydieresis -50
KPX Ohungarumlaut A -35
KPX Ohungarumlaut Aacute -35
KPX Ohungarumlaut Abreve -35
KPX Ohungarumlaut Acircumflex -35
KPX Ohungarumlaut Adieresis -35
KPX Ohungarumlaut Agrave -35
KPX Ohungarumlaut Amacron -35
KPX Ohungarumlaut Aogonek -35
KPX Ohungarumlaut Aring -35
KPX Ohungarumlaut Atilde -35
KPX Ohungarumlaut T -40
KPX Ohungarumlaut Tcaron -40
KPX Ohungarumlaut Tcommaaccent -40
KPX Ohungarumlaut V -50
KPX Ohungarumlaut W -35
KPX Ohungarumlaut X -40
KPX Ohungarumlaut Y -50
KPX Ohungarumlaut Yacute -50
KPX Ohungarumlaut Ydieresis -50
KPX Omacron A -35
KPX Omacron Aacute -35
KPX Omacron Abreve -35
KPX Omacron Acircumflex -35
KPX Omacron Adieresis -35
KPX Omacron Agrave -35
KPX Omacron Amacron -35
KPX Omacron Aogonek -35
KPX Omacron Aring -35
KPX Omacron Atilde -35
KPX Omacron T -40
KPX Omacron Tcaron -40
KPX Omacron Tcommaaccent -40
KPX Omacron V -50
KPX Omacron W -35
KPX Omacron X -40
KPX Omacron Y -50
KPX Omacron Yacute -50
KPX Omacron Ydieresis -50
KPX Oslash A -35
KPX Oslash Aacute -35
KPX Oslash Abreve -35
KPX Oslash Acircumflex -35
KPX Oslash Adieresis -35
KPX Oslash Agrave -35
KPX Oslash Amacron -35
KPX Oslash Aogonek -35
KPX Oslash Aring -35
KPX Oslash Atilde -35
KPX Oslash T -40
KPX Oslash Tcaron -40
KPX Oslash Tcommaaccent -40
KPX Oslash V -50
KPX Oslash W -35
KPX Oslash X -40
KPX Oslash Y -50
KPX Oslash Yacute -50
KPX Oslash Ydieresis -50
KPX Otilde A -35
KPX Otilde Aacute -35
KPX Otilde Abreve -35
KPX Otilde Acircumflex -35
KPX Otilde Adieresis -35
KPX Otilde Agrave -35
KPX Otilde Amacron -35
KPX Otilde Aogonek -35
KPX Otilde Aring -35
KPX Otilde Atilde -35
KPX Otilde T -40
KPX Otilde Tcaron -40
KPX Otilde Tcommaaccent -40
KPX Otilde V -50
KPX Otilde W -35
KPX Otilde X -40
KPX Otilde Y -50
KPX Otilde Yacute -50
KPX Otilde Ydieresis -50
KPX P A -92
KPX P Aacute -92
KPX P Abreve -92
KPX P Acircumflex -92
KPX P Adieresis -92
KPX P Agrave -92
KPX P Amacron -92
KPX P Aogonek -92
KPX P Aring -92
KPX P Atilde -92
KPX P a -15
KPX P aacute -15
KPX P abreve -15
KPX P acircumflex -15
KPX P adieresis -15
KPX P agrave -15
KPX P amacron -15
KPX P aogonek -15
KPX P aring -15
KPX P atilde -15
KPX P comma -111
KPX P period -111
KPX Q U -10
KPX Q Uacute -10
KPX Q Ucircumflex -10
KPX Q Udieresis -10
KPX Q Ugrave -10
KPX Q Uhungarumlaut -10
KPX Q Umacron -10
KPX Q Uogonek -10
KPX Q Uring -10
KPX R O -40
KPX R Oacute -40
KPX R Ocircumflex -40
KPX R Odieresis -40
KPX R Ograve -40
KPX R Ohungarumlaut -40
KPX R Omacron -40
KPX R Oslash -40
KPX R Otilde -40
KPX R T -60
KPX R Tcaron -60
KPX R Tcommaaccent -60
KPX R U -40
KPX R Uacute -40
KPX R Ucircumflex -40
KPX R Udieresis -40
KPX R Ugrave -40
KPX R Uhungarumlaut -40
KPX R Umacron -40
KPX R Uogonek -40
KPX R Uring -40
KPX R V -80
KPX R W -55
KPX R Y -65
KPX R Yacute -65
KPX R Ydieresis -65
KPX Racute O -40
KPX Racute Oacute -40
KPX Racute Ocircumflex -40
KPX Racute Odieresis -40
KPX Racute Ograve -40
KPX Racute Ohungarumlaut -40
KPX Racute Omacron -40
KPX Racute Oslash -40
KPX Racute Otilde -40
KPX Racute T -60
KPX Racute Tcaron -60
KPX Racute Tcommaaccent -60
KPX Racute U -40
KPX Racute Uacute -40
KPX Racute Ucircumflex -40
KPX Racute Udieresis -40
KPX Racute Ugrave -40
KPX Racute Uhungarumlaut -40
KPX Racute Umacron -40
KPX Racute Uogonek -40
KPX Racute Uring -40
KPX Racute V -80
KPX Racute W -55
KPX Racute Y -65
KPX Racute Yacute -65
KPX Racute Ydieresis -65
KPX Rcaron O -40
KPX Rcaron Oacute -40
KPX Rcaron Ocircumflex -40
KPX Rcaron Odieresis -40
KPX Rcaron Ograve -40
KPX Rcaron Ohungarumlaut -40
KPX Rcaron Omacron -40
KPX Rcaron Oslash -40
KPX Rcaron Otilde -40
KPX Rcaron T -60
KPX Rcaron Tcaron -60
KPX Rcaron Tcommaaccent -60
KPX Rcaron U -40
KPX Rcaron Uacute -40
KPX Rcaron Ucircumflex -40
KPX Rcaron Udieresis -40
KPX Rcaron Ugrave -40
KPX Rcaron Uhungarumlaut -40
KPX Rcaron Umacron -40
KPX Rcaron Uogonek -40
KPX Rcaron Uring -40
KPX Rcaron V -80
KPX Rcaron W -55
KPX Rcaron Y -65
KPX Rcaron Yacute -65
KPX Rcaron Ydieresis -65
KPX Rcommaaccent O -40
KPX Rcommaaccent Oacute -40
KPX Rcommaaccent Ocircumflex -40
KPX Rcommaaccent Odieresis -40
KPX Rcommaaccent Ograve -40
KPX Rcommaaccent Ohungarumlaut -40
KPX Rcommaaccent Omacron -40
KPX Rcommaaccent Oslash -40
KPX Rcommaaccent Otilde -40
KPX Rcommaaccent T -60
KPX Rcommaaccent Tcaron -60
KPX Rcommaaccent Tcommaaccent -60
KPX Rcommaaccent U -40
KPX Rcommaaccent Uacute -40
KPX Rcommaaccent Ucircumflex -40
KPX Rcommaaccent Udieresis -40
KPX Rcommaaccent Ugrave -40
KPX Rcommaaccent Uhungarumlaut -40
KPX Rcommaaccent Umacron -40
KPX Rcommaaccent Uogonek -40
KPX Rcommaaccent Uring -40
KPX Rcommaaccent V -80
KPX Rcommaaccent W -55
KPX Rcommaaccent Y -65
KPX Rcommaaccent Yacute -65
KPX Rcommaaccent Ydieresis -65
KPX T A -93
KPX T Aacute -93
KPX T Abreve -93
KPX T Acircumflex -93
KPX T Adieresis -93
KPX T Agrave -93
KPX T Amacron -93
KPX T Aogonek -93
KPX T Aring -93
KPX T Atilde -93
KPX T O -18
KPX T Oacute -18
KPX T Ocircumflex -18
KPX T Odieresis -18
KPX T Ograve -18
KPX T Ohungarumlaut -18
KPX T Omacron -18
KPX T Oslash -18
KPX T Otilde -18
KPX T a -80
KPX T aacute -80
KPX T abreve -80
KPX T acircumflex -80
KPX T adieresis -40
KPX T agrave -40
KPX T amacron -40
KPX T aogonek -80
KPX T aring -80
KPX T atilde -40
KPX T colon -50
KPX T comma -74
KPX T e -70
KPX T eacute -70
KPX T ecaron -70
KPX T ecircumflex -70
KPX T edieresis -30
KPX T edotaccent -70
KPX T egrave -70
KPX T emacron -30
KPX T eogonek -70
KPX T hyphen -92
KPX T i -35
KPX T iacute -35
KPX T iogonek -35
KPX T o -80
KPX T oacute -80
KPX T ocircumflex -80
KPX T odieresis -80
KPX T ograve -80
KPX T ohungarumlaut -80
KPX T omacron -80
KPX T oslash -80
KPX T otilde -80
KPX T period -74
KPX T r -35
KPX T racute -35
KPX T rcaron -35
KPX T rcommaaccent -35
KPX T semicolon -55
KPX T u -45
KPX T uacute -45
KPX T ucircumflex -45
KPX T udieresis -45
KPX T ugrave -45
KPX T uhungarumlaut -45
KPX T umacron -45
KPX T uogonek -45
KPX T uring -45
KPX T w -80
KPX T y -80
KPX T yacute -80
KPX T ydieresis -80
KPX Tcaron A -93
KPX Tcaron Aacute -93
KPX Tcaron Abreve -93
KPX Tcaron Acircumflex -93
KPX Tcaron Adieresis -93
KPX Tcaron Agrave -93
KPX Tcaron Amacron -93
KPX Tcaron Aogonek -93
KPX Tcaron Aring -93
KPX Tcaron Atilde -93
KPX Tcaron O -18
KPX Tcaron Oacute -18
KPX Tcaron Ocircumflex -18
KPX Tcaron Odieresis -18
KPX Tcaron Ograve -18
KPX Tcaron Ohungarumlaut -18
KPX Tcaron Omacron -18
KPX Tcaron Oslash -18
KPX Tcaron Otilde -18
KPX Tcaron a -80
KPX Tcaron aacute -80
KPX Tcaron abreve -80
KPX Tcaron acircumflex -80
KPX Tcaron adieresis -40
KPX Tcaron agrave -40
KPX Tcaron amacron -40
KPX Tcaron aogonek -80
KPX Tcaron aring -80
KPX Tcaron atilde -40
KPX Tcaron colon -50
KPX Tcaron comma -74
KPX Tcaron e -70
KPX Tcaron eacute -70
KPX Tcaron ecaron -70
KPX Tcaron ecircumflex -30
KPX Tcaron edieresis -30
KPX Tcaron edotaccent -70
KPX Tcaron egrave -70
KPX Tcaron emacron -30
KPX Tcaron eogonek -70
KPX Tcaron hyphen -92
KPX Tcaron i -35
KPX Tcaron iacute -35
KPX Tcaron iogonek -35
KPX Tcaron o -80
KPX Tcaron oacute -80
KPX Tcaron ocircumflex -80
KPX Tcaron odieresis -80
KPX Tcaron ograve -80
KPX Tcaron ohungarumlaut -80
KPX Tcaron omacron -80
KPX Tcaron oslash -80
KPX Tcaron otilde -80
KPX Tcaron period -74
KPX Tcaron r -35
KPX Tcaron racute -35
KPX Tcaron rcaron -35
KPX Tcaron rcommaaccent -35
KPX Tcaron semicolon -55
KPX Tcaron u -45
KPX Tcaron uacute -45
KPX Tcaron ucircumflex -45
KPX Tcaron udieresis -45
KPX Tcaron ugrave -45
KPX Tcaron uhungarumlaut -45
KPX Tcaron umacron -45
KPX Tcaron uogonek -45
KPX Tcaron uring -45
KPX Tcaron w -80
KPX Tcaron y -80
KPX Tcaron yacute -80
KPX Tcaron ydieresis -80
KPX Tcommaaccent A -93
KPX Tcommaaccent Aacute -93
KPX Tcommaaccent Abreve -93
KPX Tcommaaccent Acircumflex -93
KPX Tcommaaccent Adieresis -93
KPX Tcommaaccent Agrave -93
KPX Tcommaaccent Amacron -93
KPX Tcommaaccent Aogonek -93
KPX Tcommaaccent Aring -93
KPX Tcommaaccent Atilde -93
KPX Tcommaaccent O -18
KPX Tcommaaccent Oacute -18
KPX Tcommaaccent Ocircumflex -18
KPX Tcommaaccent Odieresis -18
KPX Tcommaaccent Ograve -18
KPX Tcommaaccent Ohungarumlaut -18
KPX Tcommaaccent Omacron -18
KPX Tcommaaccent Oslash -18
KPX Tcommaaccent Otilde -18
KPX Tcommaaccent a -80
KPX Tcommaaccent aacute -80
KPX Tcommaaccent abreve -80
KPX Tcommaaccent acircumflex -80
KPX Tcommaaccent adieresis -40
KPX Tcommaaccent agrave -40
KPX Tcommaaccent amacron -40
KPX Tcommaaccent aogonek -80
KPX Tcommaaccent aring -80
KPX Tcommaaccent atilde -40
KPX Tcommaaccent colon -50
KPX Tcommaaccent comma -74
KPX Tcommaaccent e -70
KPX Tcommaaccent eacute -70
KPX Tcommaaccent ecaron -70
KPX Tcommaaccent ecircumflex -30
KPX Tcommaaccent edieresis -30
KPX Tcommaaccent edotaccent -70
KPX Tcommaaccent egrave -30
KPX Tcommaaccent emacron -70
KPX Tcommaaccent eogonek -70
KPX Tcommaaccent hyphen -92
KPX Tcommaaccent i -35
KPX Tcommaaccent iacute -35
KPX Tcommaaccent iogonek -35
KPX Tcommaaccent o -80
KPX Tcommaaccent oacute -80
KPX Tcommaaccent ocircumflex -80
KPX Tcommaaccent odieresis -80
KPX Tcommaaccent ograve -80
KPX Tcommaaccent ohungarumlaut -80
KPX Tcommaaccent omacron -80
KPX Tcommaaccent oslash -80
KPX Tcommaaccent otilde -80
KPX Tcommaaccent period -74
KPX Tcommaaccent r -35
KPX Tcommaaccent racute -35
KPX Tcommaaccent rcaron -35
KPX Tcommaaccent rcommaaccent -35
KPX Tcommaaccent semicolon -55
KPX Tcommaaccent u -45
KPX Tcommaaccent uacute -45
KPX Tcommaaccent ucircumflex -45
KPX Tcommaaccent udieresis -45
KPX Tcommaaccent ugrave -45
KPX Tcommaaccent uhungarumlaut -45
KPX Tcommaaccent umacron -45
KPX Tcommaaccent uogonek -45
KPX Tcommaaccent uring -45
KPX Tcommaaccent w -80
KPX Tcommaaccent y -80
KPX Tcommaaccent yacute -80
KPX Tcommaaccent ydieresis -80
KPX U A -40
KPX U Aacute -40
KPX U Abreve -40
KPX U Acircumflex -40
KPX U Adieresis -40
KPX U Agrave -40
KPX U Amacron -40
KPX U Aogonek -40
KPX U Aring -40
KPX U Atilde -40
KPX Uacute A -40
KPX Uacute Aacute -40
KPX Uacute Abreve -40
KPX Uacute Acircumflex -40
KPX Uacute Adieresis -40
KPX Uacute Agrave -40
KPX Uacute Amacron -40
KPX Uacute Aogonek -40
KPX Uacute Aring -40
KPX Uacute Atilde -40
KPX Ucircumflex A -40
KPX Ucircumflex Aacute -40
KPX Ucircumflex Abreve -40
KPX Ucircumflex Acircumflex -40
KPX Ucircumflex Adieresis -40
KPX Ucircumflex Agrave -40
KPX Ucircumflex Amacron -40
KPX Ucircumflex Aogonek -40
KPX Ucircumflex Aring -40
KPX Ucircumflex Atilde -40
KPX Udieresis A -40
KPX Udieresis Aacute -40
KPX Udieresis Abreve -40
KPX Udieresis Acircumflex -40
KPX Udieresis Adieresis -40
KPX Udieresis Agrave -40
KPX Udieresis Amacron -40
KPX Udieresis Aogonek -40
KPX Udieresis Aring -40
KPX Udieresis Atilde -40
KPX Ugrave A -40
KPX Ugrave Aacute -40
KPX Ugrave Abreve -40
KPX Ugrave Acircumflex -40
KPX Ugrave Adieresis -40
KPX Ugrave Agrave -40
KPX Ugrave Amacron -40
KPX Ugrave Aogonek -40
KPX Ugrave Aring -40
KPX Ugrave Atilde -40
KPX Uhungarumlaut A -40
KPX Uhungarumlaut Aacute -40
KPX Uhungarumlaut Abreve -40
KPX Uhungarumlaut Acircumflex -40
KPX Uhungarumlaut Adieresis -40
KPX Uhungarumlaut Agrave -40
KPX Uhungarumlaut Amacron -40
KPX Uhungarumlaut Aogonek -40
KPX Uhungarumlaut Aring -40
KPX Uhungarumlaut Atilde -40
KPX Umacron A -40
KPX Umacron Aacute -40
KPX Umacron Abreve -40
KPX Umacron Acircumflex -40
KPX Umacron Adieresis -40
KPX Umacron Agrave -40
KPX Umacron Amacron -40
KPX Umacron Aogonek -40
KPX Umacron Aring -40
KPX Umacron Atilde -40
KPX Uogonek A -40
KPX Uogonek Aacute -40
KPX Uogonek Abreve -40
KPX Uogonek Acircumflex -40
KPX Uogonek Adieresis -40
KPX Uogonek Agrave -40
KPX Uogonek Amacron -40
KPX Uogonek Aogonek -40
KPX Uogonek Aring -40
KPX Uogonek Atilde -40
KPX Uring A -40
KPX Uring Aacute -40
KPX Uring Abreve -40
KPX Uring Acircumflex -40
KPX Uring Adieresis -40
KPX Uring Agrave -40
KPX Uring Amacron -40
KPX Uring Aogonek -40
KPX Uring Aring -40
KPX Uring Atilde -40
KPX V A -135
KPX V Aacute -135
KPX V Abreve -135
KPX V Acircumflex -135
KPX V Adieresis -135
KPX V Agrave -135
KPX V Amacron -135
KPX V Aogonek -135
KPX V Aring -135
KPX V Atilde -135
KPX V G -15
KPX V Gbreve -15
KPX V Gcommaaccent -15
KPX V O -40
KPX V Oacute -40
KPX V Ocircumflex -40
KPX V Odieresis -40
KPX V Ograve -40
KPX V Ohungarumlaut -40
KPX V Omacron -40
KPX V Oslash -40
KPX V Otilde -40
KPX V a -111
KPX V aacute -111
KPX V abreve -111
KPX V acircumflex -71
KPX V adieresis -71
KPX V agrave -71
KPX V amacron -71
KPX V aogonek -111
KPX V aring -111
KPX V atilde -71
KPX V colon -74
KPX V comma -129
KPX V e -111
KPX V eacute -111
KPX V ecaron -71
KPX V ecircumflex -71
KPX V edieresis -71
KPX V edotaccent -111
KPX V egrave -71
KPX V emacron -71
KPX V eogonek -111
KPX V hyphen -100
KPX V i -60
KPX V iacute -60
KPX V icircumflex -20
KPX V idieresis -20
KPX V igrave -20
KPX V imacron -20
KPX V iogonek -60
KPX V o -129
KPX V oacute -129
KPX V ocircumflex -129
KPX V odieresis -89
KPX V ograve -89
KPX V ohungarumlaut -129
KPX V omacron -89
KPX V oslash -129
KPX V otilde -89
KPX V period -129
KPX V semicolon -74
KPX V u -75
KPX V uacute -75
KPX V ucircumflex -75
KPX V udieresis -75
KPX V ugrave -75
KPX V uhungarumlaut -75
KPX V umacron -75
KPX V uogonek -75
KPX V uring -75
KPX W A -120
KPX W Aacute -120
KPX W Abreve -120
KPX W Acircumflex -120
KPX W Adieresis -120
KPX W Agrave -120
KPX W Amacron -120
KPX W Aogonek -120
KPX W Aring -120
KPX W Atilde -120
KPX W O -10
KPX W Oacute -10
KPX W Ocircumflex -10
KPX W Odieresis -10
KPX W Ograve -10
KPX W Ohungarumlaut -10
KPX W Omacron -10
KPX W Oslash -10
KPX W Otilde -10
KPX W a -80
KPX W aacute -80
KPX W abreve -80
KPX W acircumflex -80
KPX W adieresis -80
KPX W agrave -80
KPX W amacron -80
KPX W aogonek -80
KPX W aring -80
KPX W atilde -80
KPX W colon -37
KPX W comma -92
KPX W e -80
KPX W eacute -80
KPX W ecaron -80
KPX W ecircumflex -80
KPX W edieresis -40
KPX W edotaccent -80
KPX W egrave -40
KPX W emacron -40
KPX W eogonek -80
KPX W hyphen -65
KPX W i -40
KPX W iacute -40
KPX W iogonek -40
KPX W o -80
KPX W oacute -80
KPX W ocircumflex -80
KPX W odieresis -80
KPX W ograve -80
KPX W ohungarumlaut -80
KPX W omacron -80
KPX W oslash -80
KPX W otilde -80
KPX W period -92
KPX W semicolon -37
KPX W u -50
KPX W uacute -50
KPX W ucircumflex -50
KPX W udieresis -50
KPX W ugrave -50
KPX W uhungarumlaut -50
KPX W umacron -50
KPX W uogonek -50
KPX W uring -50
KPX W y -73
KPX W yacute -73
KPX W ydieresis -73
KPX Y A -120
KPX Y Aacute -120
KPX Y Abreve -120
KPX Y Acircumflex -120
KPX Y Adieresis -120
KPX Y Agrave -120
KPX Y Amacron -120
KPX Y Aogonek -120
KPX Y Aring -120
KPX Y Atilde -120
KPX Y O -30
KPX Y Oacute -30
KPX Y Ocircumflex -30
KPX Y Odieresis -30
KPX Y Ograve -30
KPX Y Ohungarumlaut -30
KPX Y Omacron -30
KPX Y Oslash -30
KPX Y Otilde -30
KPX Y a -100
KPX Y aacute -100
KPX Y abreve -100
KPX Y acircumflex -100
KPX Y adieresis -60
KPX Y agrave -60
KPX Y amacron -60
KPX Y aogonek -100
KPX Y aring -100
KPX Y atilde -60
KPX Y colon -92
KPX Y comma -129
KPX Y e -100
KPX Y eacute -100
KPX Y ecaron -100
KPX Y ecircumflex -100
KPX Y edieresis -60
KPX Y edotaccent -100
KPX Y egrave -60
KPX Y emacron -60
KPX Y eogonek -100
KPX Y hyphen -111
KPX Y i -55
KPX Y iacute -55
KPX Y iogonek -55
KPX Y o -110
KPX Y oacute -110
KPX Y ocircumflex -110
KPX Y odieresis -70
KPX Y ograve -70
KPX Y ohungarumlaut -110
KPX Y omacron -70
KPX Y oslash -110
KPX Y otilde -70
KPX Y period -129
KPX Y semicolon -92
KPX Y u -111
KPX Y uacute -111
KPX Y ucircumflex -111
KPX Y udieresis -71
KPX Y ugrave -71
KPX Y uhungarumlaut -111
KPX Y umacron -71
KPX Y uogonek -111
KPX Y uring -111
KPX Yacute A -120
KPX Yacute Aacute -120
KPX Yacute Abreve -120
KPX Yacute Acircumflex -120
KPX Yacute Adieresis -120
KPX Yacute Agrave -120
KPX Yacute Amacron -120
KPX Yacute Aogonek -120
KPX Yacute Aring -120
KPX Yacute Atilde -120
KPX Yacute O -30
KPX Yacute Oacute -30
KPX Yacute Ocircumflex -30
KPX Yacute Odieresis -30
KPX Yacute Ograve -30
KPX Yacute Ohungarumlaut -30
KPX Yacute Omacron -30
KPX Yacute Oslash -30
KPX Yacute Otilde -30
KPX Yacute a -100
KPX Yacute aacute -100
KPX Yacute abreve -100
KPX Yacute acircumflex -100
KPX Yacute adieresis -60
KPX Yacute agrave -60
KPX Yacute amacron -60
KPX Yacute aogonek -100
KPX Yacute aring -100
KPX Yacute atilde -60
KPX Yacute colon -92
KPX Yacute comma -129
KPX Yacute e -100
KPX Yacute eacute -100
KPX Yacute ecaron -100
KPX Yacute ecircumflex -100
KPX Yacute edieresis -60
KPX Yacute edotaccent -100
KPX Yacute egrave -60
KPX Yacute emacron -60
KPX Yacute eogonek -100
KPX Yacute hyphen -111
KPX Yacute i -55
KPX Yacute iacute -55
KPX Yacute iogonek -55
KPX Yacute o -110
KPX Yacute oacute -110
KPX Yacute ocircumflex -110
KPX Yacute odieresis -70
KPX Yacute ograve -70
KPX Yacute ohungarumlaut -110
KPX Yacute omacron -70
KPX Yacute oslash -110
KPX Yacute otilde -70
KPX Yacute period -129
KPX Yacute semicolon -92
KPX Yacute u -111
KPX Yacute uacute -111
KPX Yacute ucircumflex -111
KPX Yacute udieresis -71
KPX Yacute ugrave -71
KPX Yacute uhungarumlaut -111
KPX Yacute umacron -71
KPX Yacute uogonek -111
KPX Yacute uring -111
KPX Ydieresis A -120
KPX Ydieresis Aacute -120
KPX Ydieresis Abreve -120
KPX Ydieresis Acircumflex -120
KPX Ydieresis Adieresis -120
KPX Ydieresis Agrave -120
KPX Ydieresis Amacron -120
KPX Ydieresis Aogonek -120
KPX Ydieresis Aring -120
KPX Ydieresis Atilde -120
KPX Ydieresis O -30
KPX Ydieresis Oacute -30
KPX Ydieresis Ocircumflex -30
KPX Ydieresis Odieresis -30
KPX Ydieresis Ograve -30
KPX Ydieresis Ohungarumlaut -30
KPX Ydieresis Omacron -30
KPX Ydieresis Oslash -30
KPX Ydieresis Otilde -30
KPX Ydieresis a -100
KPX Ydieresis aacute -100
KPX Ydieresis abreve -100
KPX Ydieresis acircumflex -100
KPX Ydieresis adieresis -60
KPX Ydieresis agrave -60
KPX Ydieresis amacron -60
KPX Ydieresis aogonek -100
KPX Ydieresis aring -100
KPX Ydieresis atilde -100
KPX Ydieresis colon -92
KPX Ydieresis comma -129
KPX Ydieresis e -100
KPX Ydieresis eacute -100
KPX Ydieresis ecaron -100
KPX Ydieresis ecircumflex -100
KPX Ydieresis edieresis -60
KPX Ydieresis edotaccent -100
KPX Ydieresis egrave -60
KPX Ydieresis emacron -60
KPX Ydieresis eogonek -100
KPX Ydieresis hyphen -111
KPX Ydieresis i -55
KPX Ydieresis iacute -55
KPX Ydieresis iogonek -55
KPX Ydieresis o -110
KPX Ydieresis oacute -110
KPX Ydieresis ocircumflex -110
KPX Ydieresis odieresis -70
KPX Ydieresis ograve -70
KPX Ydieresis ohungarumlaut -110
KPX Ydieresis omacron -70
KPX Ydieresis oslash -110
KPX Ydieresis otilde -70
KPX Ydieresis period -129
KPX Ydieresis semicolon -92
KPX Ydieresis u -111
KPX Ydieresis uacute -111
KPX Ydieresis ucircumflex -111
KPX Ydieresis udieresis -71
KPX Ydieresis ugrave -71
KPX Ydieresis uhungarumlaut -111
KPX Ydieresis umacron -71
KPX Ydieresis uogonek -111
KPX Ydieresis uring -111
KPX a v -20
KPX a w -15
KPX aacute v -20
KPX aacute w -15
KPX abreve v -20
KPX abreve w -15
KPX acircumflex v -20
KPX acircumflex w -15
KPX adieresis v -20
KPX adieresis w -15
KPX agrave v -20
KPX agrave w -15
KPX amacron v -20
KPX amacron w -15
KPX aogonek v -20
KPX aogonek w -15
KPX aring v -20
KPX aring w -15
KPX atilde v -20
KPX atilde w -15
KPX b period -40
KPX b u -20
KPX b uacute -20
KPX b ucircumflex -20
KPX b udieresis -20
KPX b ugrave -20
KPX b uhungarumlaut -20
KPX b umacron -20
KPX b uogonek -20
KPX b uring -20
KPX b v -15
KPX c y -15
KPX c yacute -15
KPX c ydieresis -15
KPX cacute y -15
KPX cacute yacute -15
KPX cacute ydieresis -15
KPX ccaron y -15
KPX ccaron yacute -15
KPX ccaron ydieresis -15
KPX ccedilla y -15
KPX ccedilla yacute -15
KPX ccedilla ydieresis -15
KPX comma quotedblright -70
KPX comma quoteright -70
KPX e g -15
KPX e gbreve -15
KPX e gcommaaccent -15
KPX e v -25
KPX e w -25
KPX e x -15
KPX e y -15
KPX e yacute -15
KPX e ydieresis -15
KPX eacute g -15
KPX eacute gbreve -15
KPX eacute gcommaaccent -15
KPX eacute v -25
KPX eacute w -25
KPX eacute x -15
KPX eacute y -15
KPX eacute yacute -15
KPX eacute ydieresis -15
KPX ecaron g -15
KPX ecaron gbreve -15
KPX ecaron gcommaaccent -15
KPX ecaron v -25
KPX ecaron w -25
KPX ecaron x -15
KPX ecaron y -15
KPX ecaron yacute -15
KPX ecaron ydieresis -15
KPX ecircumflex g -15
KPX ecircumflex gbreve -15
KPX ecircumflex gcommaaccent -15
KPX ecircumflex v -25
KPX ecircumflex w -25
KPX ecircumflex x -15
KPX ecircumflex y -15
KPX ecircumflex yacute -15
KPX ecircumflex ydieresis -15
KPX edieresis g -15
KPX edieresis gbreve -15
KPX edieresis gcommaaccent -15
KPX edieresis v -25
KPX edieresis w -25
KPX edieresis x -15
KPX edieresis y -15
KPX edieresis yacute -15
KPX edieresis ydieresis -15
KPX edotaccent g -15
KPX edotaccent gbreve -15
KPX edotaccent gcommaaccent -15
KPX edotaccent v -25
KPX edotaccent w -25
KPX edotaccent x -15
KPX edotaccent y -15
KPX edotaccent yacute -15
KPX edotaccent ydieresis -15
KPX egrave g -15
KPX egrave gbreve -15
KPX egrave gcommaaccent -15
KPX egrave v -25
KPX egrave w -25
KPX egrave x -15
KPX egrave y -15
KPX egrave yacute -15
KPX egrave ydieresis -15
KPX emacron g -15
KPX emacron gbreve -15
KPX emacron gcommaaccent -15
KPX emacron v -25
KPX emacron w -25
KPX emacron x -15
KPX emacron y -15
KPX emacron yacute -15
KPX emacron ydieresis -15
KPX eogonek g -15
KPX eogonek gbreve -15
KPX eogonek gcommaaccent -15
KPX eogonek v -25
KPX eogonek w -25
KPX eogonek x -15
KPX eogonek y -15
KPX eogonek yacute -15
KPX eogonek ydieresis -15
KPX f a -10
KPX f aacute -10
KPX f abreve -10
KPX f acircumflex -10
KPX f adieresis -10
KPX f agrave -10
KPX f amacron -10
KPX f aogonek -10
KPX f aring -10
KPX f atilde -10
KPX f dotlessi -50
KPX f f -25
KPX f i -20
KPX f iacute -20
KPX f quoteright 55
KPX g a -5
KPX g aacute -5
KPX g abreve -5
KPX g acircumflex -5
KPX g adieresis -5
KPX g agrave -5
KPX g amacron -5
KPX g aogonek -5
KPX g aring -5
KPX g atilde -5
KPX gbreve a -5
KPX gbreve aacute -5
KPX gbreve abreve -5
KPX gbreve acircumflex -5
KPX gbreve adieresis -5
KPX gbreve agrave -5
KPX gbreve amacron -5
KPX gbreve aogonek -5
KPX gbreve aring -5
KPX gbreve atilde -5
KPX gcommaaccent a -5
KPX gcommaaccent aacute -5
KPX gcommaaccent abreve -5
KPX gcommaaccent acircumflex -5
KPX gcommaaccent adieresis -5
KPX gcommaaccent agrave -5
KPX gcommaaccent amacron -5
KPX gcommaaccent aogonek -5
KPX gcommaaccent aring -5
KPX gcommaaccent atilde -5
KPX h y -5
KPX h yacute -5
KPX h ydieresis -5
KPX i v -25
KPX iacute v -25
KPX icircumflex v -25
KPX idieresis v -25
KPX igrave v -25
KPX imacron v -25
KPX iogonek v -25
KPX k e -10
KPX k eacute -10
KPX k ecaron -10
KPX k ecircumflex -10
KPX k edieresis -10
KPX k edotaccent -10
KPX k egrave -10
KPX k emacron -10
KPX k eogonek -10
KPX k o -10
KPX k oacute -10
KPX k ocircumflex -10
KPX k odieresis -10
KPX k ograve -10
KPX k ohungarumlaut -10
KPX k omacron -10
KPX k oslash -10
KPX k otilde -10
KPX k y -15
KPX k yacute -15
KPX k ydieresis -15
KPX kcommaaccent e -10
KPX kcommaaccent eacute -10
KPX kcommaaccent ecaron -10
KPX kcommaaccent ecircumflex -10
KPX kcommaaccent edieresis -10
KPX kcommaaccent edotaccent -10
KPX kcommaaccent egrave -10
KPX kcommaaccent emacron -10
KPX kcommaaccent eogonek -10
KPX kcommaaccent o -10
KPX kcommaaccent oacute -10
KPX kcommaaccent ocircumflex -10
KPX kcommaaccent odieresis -10
KPX kcommaaccent ograve -10
KPX kcommaaccent ohungarumlaut -10
KPX kcommaaccent omacron -10
KPX kcommaaccent oslash -10
KPX kcommaaccent otilde -10
KPX kcommaaccent y -15
KPX kcommaaccent yacute -15
KPX kcommaaccent ydieresis -15
KPX l w -10
KPX lacute w -10
KPX lcommaaccent w -10
KPX lslash w -10
KPX n v -40
KPX n y -15
KPX n yacute -15
KPX n ydieresis -15
KPX nacute v -40
KPX nacute y -15
KPX nacute yacute -15
KPX nacute ydieresis -15
KPX ncaron v -40
KPX ncaron y -15
KPX ncaron yacute -15
KPX ncaron ydieresis -15
KPX ncommaaccent v -40
KPX ncommaaccent y -15
KPX ncommaaccent yacute -15
KPX ncommaaccent ydieresis -15
KPX ntilde v -40
KPX ntilde y -15
KPX ntilde yacute -15
KPX ntilde ydieresis -15
KPX o v -15
KPX o w -25
KPX o y -10
KPX o yacute -10
KPX o ydieresis -10
KPX oacute v -15
KPX oacute w -25
KPX oacute y -10
KPX oacute yacute -10
KPX oacute ydieresis -10
KPX ocircumflex v -15
KPX ocircumflex w -25
KPX ocircumflex y -10
KPX ocircumflex yacute -10
KPX ocircumflex ydieresis -10
KPX odieresis v -15
KPX odieresis w -25
KPX odieresis y -10
KPX odieresis yacute -10
KPX odieresis ydieresis -10
KPX ograve v -15
KPX ograve w -25
KPX ograve y -10
KPX ograve yacute -10
KPX ograve ydieresis -10
KPX ohungarumlaut v -15
KPX ohungarumlaut w -25
KPX ohungarumlaut y -10
KPX ohungarumlaut yacute -10
KPX ohungarumlaut ydieresis -10
KPX omacron v -15
KPX omacron w -25
KPX omacron y -10
KPX omacron yacute -10
KPX omacron ydieresis -10
KPX oslash v -15
KPX oslash w -25
KPX oslash y -10
KPX oslash yacute -10
KPX oslash ydieresis -10
KPX otilde v -15
KPX otilde w -25
KPX otilde y -10
KPX otilde yacute -10
KPX otilde ydieresis -10
KPX p y -10
KPX p yacute -10
KPX p ydieresis -10
KPX period quotedblright -70
KPX period quoteright -70
KPX quotedblleft A -80
KPX quotedblleft Aacute -80
KPX quotedblleft Abreve -80
KPX quotedblleft Acircumflex -80
KPX quotedblleft Adieresis -80
KPX quotedblleft Agrave -80
KPX quotedblleft Amacron -80
KPX quotedblleft Aogonek -80
KPX quotedblleft Aring -80
KPX quotedblleft Atilde -80
KPX quoteleft A -80
KPX quoteleft Aacute -80
KPX quoteleft Abreve -80
KPX quoteleft Acircumflex -80
KPX quoteleft Adieresis -80
KPX quoteleft Agrave -80
KPX quoteleft Amacron -80
KPX quoteleft Aogonek -80
KPX quoteleft Aring -80
KPX quoteleft Atilde -80
KPX quoteleft quoteleft -74
KPX quoteright d -50
KPX quoteright dcroat -50
KPX quoteright l -10
KPX quoteright lacute -10
KPX quoteright lcommaaccent -10
KPX quoteright lslash -10
KPX quoteright quoteright -74
KPX quoteright r -50
KPX quoteright racute -50
KPX quoteright rcaron -50
KPX quoteright rcommaaccent -50
KPX quoteright s -55
KPX quoteright sacute -55
KPX quoteright scaron -55
KPX quoteright scedilla -55
KPX quoteright scommaaccent -55
KPX quoteright space -74
KPX quoteright t -18
KPX quoteright tcommaaccent -18
KPX quoteright v -50
KPX r comma -40
KPX r g -18
KPX r gbreve -18
KPX r gcommaaccent -18
KPX r hyphen -20
KPX r period -55
KPX racute comma -40
KPX racute g -18
KPX racute gbreve -18
KPX racute gcommaaccent -18
KPX racute hyphen -20
KPX racute period -55
KPX rcaron comma -40
KPX rcaron g -18
KPX rcaron gbreve -18
KPX rcaron gcommaaccent -18
KPX rcaron hyphen -20
KPX rcaron period -55
KPX rcommaaccent comma -40
KPX rcommaaccent g -18
KPX rcommaaccent gbreve -18
KPX rcommaaccent gcommaaccent -18
KPX rcommaaccent hyphen -20
KPX rcommaaccent period -55
KPX space A -55
KPX space Aacute -55
KPX space Abreve -55
KPX space Acircumflex -55
KPX space Adieresis -55
KPX space Agrave -55
KPX space Amacron -55
KPX space Aogonek -55
KPX space Aring -55
KPX space Atilde -55
KPX space T -18
KPX space Tcaron -18
KPX space Tcommaaccent -18
KPX space V -50
KPX space W -30
KPX space Y -90
KPX space Yacute -90
KPX space Ydieresis -90
KPX v a -25
KPX v aacute -25
KPX v abreve -25
KPX v acircumflex -25
KPX v adieresis -25
KPX v agrave -25
KPX v amacron -25
KPX v aogonek -25
KPX v aring -25
KPX v atilde -25
KPX v comma -65
KPX v e -15
KPX v eacute -15
KPX v ecaron -15
KPX v ecircumflex -15
KPX v edieresis -15
KPX v edotaccent -15
KPX v egrave -15
KPX v emacron -15
KPX v eogonek -15
KPX v o -20
KPX v oacute -20
KPX v ocircumflex -20
KPX v odieresis -20
KPX v ograve -20
KPX v ohungarumlaut -20
KPX v omacron -20
KPX v oslash -20
KPX v otilde -20
KPX v period -65
KPX w a -10
KPX w aacute -10
KPX w abreve -10
KPX w acircumflex -10
KPX w adieresis -10
KPX w agrave -10
KPX w amacron -10
KPX w aogonek -10
KPX w aring -10
KPX w atilde -10
KPX w comma -65
KPX w o -10
KPX w oacute -10
KPX w ocircumflex -10
KPX w odieresis -10
KPX w ograve -10
KPX w ohungarumlaut -10
KPX w omacron -10
KPX w oslash -10
KPX w otilde -10
KPX w period -65
KPX x e -15
KPX x eacute -15
KPX x ecaron -15
KPX x ecircumflex -15
KPX x edieresis -15
KPX x edotaccent -15
KPX x egrave -15
KPX x emacron -15
KPX x eogonek -15
KPX y comma -65
KPX y period -65
KPX yacute comma -65
KPX yacute period -65
KPX ydieresis comma -65
KPX ydieresis period -65
EndKernPairs
EndKernData
EndFontMetrics
PK :;KH2 2 lib/fonts/DejaVuSansMono.ttfnu W+A FFTMs , GDEFsp H GPOS/ 9GSUB\ ; OS/2 @ Vcmap_ҕ A Ncvt Wl 0fpgm[k Y gasp ZH glyf ZT head =\ 6hhea = $hmtxIL = jlocaP X$ 4maxp' name` !postd $ }prep: + = ) ) { |
0
DFLT &arab