halibut-1.1/0000755000175300017530000000000012444773746010034 500000000000000halibut-1.1/doc/0000755000175300017530000000000012444773746010601 500000000000000halibut-1.1/doc/Makefile0000644000175300017530000000121512444773746012160 00000000000000mandir=$(prefix)/man man1dir=$(mandir)/man1 CHAPTERS := $(SITE) blurb intro running input output licence manpage index INPUTS = $(patsubst %,%.but,$(CHAPTERS)) HALIBUT = ../build/halibut all: index.html halibut.1 index.html: $(INPUTS) $(HALIBUT) $(HALIBUT) --text=halibut.txt --html --info=halibut.info \ --ps=halibut.ps --pdf=halibut.pdf $(INPUTS) halibut.1: manpage.but $(HALIBUT) --man=halibut.1 manpage.but install: $(INSTALL) -m 644 halibut.1 $(man1dir)/halibut.1 clean: rm -f *.html *.txt *.hlp *.cnt *.1 *.info* *.ps *.pdf *.hh* *.chm chm: halibut.hhp halibut.hhp: $(INPUTS) $(HALIBUT) chm.but $(HALIBUT) --html $(INPUTS) chm.but halibut-1.1/doc/blurb.but0000644000175300017530000000143012444773746012341 00000000000000\title Halibut User Manual \cfg{xhtml-leaf-level}{1} \cfg{xhtml-leaf-smallest-contents}{2} \cfg{xhtml-leaf-contains-contents}{true} \cfg{xhtml-address-start}{Comments to anakin@pobox.com} \cfg{xhtml-contents-filename}{index.html} \cfg{xhtml-template-filename}{%k.html} \cfg{xhtml-template-fragment}{%k} \cfg{info-dir-entry}{Documentation}{Halibut}{Multi-format documentation processing system} Halibut is a free (MIT-licensed) documentation production system, able to generate multiple output formats from the same input data. This document is its user manual. \copyright This manual is copyright 2004-2007 Simon Tatham. All rights reserved. You may distribute this documentation under the MIT licence. See \k{licence} for the licence text in full. halibut-1.1/doc/chm.but0000644000175300017530000000115012444773746012001 00000000000000\# File containing the magic HTML configuration directives to create \# an MS HTML Help project. We put this on the end of the Halibut \# docs build command line to build the HHP and friends. \cfg{html-leaf-level}{infinite} \cfg{html-leaf-contains-contents}{false} \cfg{html-suppress-navlinks}{true} \cfg{html-suppress-address}{true} \cfg{html-contents-filename}{index.html} \cfg{html-template-filename}{%k.html} \cfg{html-template-fragment}{%k} \cfg{html-mshtmlhelp-chm}{halibut.chm} \cfg{html-mshtmlhelp-project}{halibut.hhp} \cfg{html-mshtmlhelp-contents}{halibut.hhc} \cfg{html-mshtmlhelp-index}{halibut.hhk} halibut-1.1/doc/index.but0000644000175300017530000006601012444773746012347 00000000000000\IM{Windows Help} Windows Help \IM{Windows Help} Help, Windows \IM{HTML Help} HTML Help \IM{HTML Help} Windows HTML Help \IM{HTML Help} MS HTML Help \IM{HTML Help} Microsoft HTML Help \IM{HTML Help} \cw{.chm} files \IM{Help compiler} Help compiler, lack of need for \IM{plain text} plain text \IM{plain text} text, plain \IM{text width} text width \IM{text width} width, of text \IM{text width} line length \IM{text width} length of lines \IM{output file name} output file name \IM{output file name} file name, output \IM{\\cfg\{text-filename\}} \c{text-filename} configuration directive \IM{\\cfg\{text-filename\}} \cw{\\cfg\{text-filename\}} \IM{\\cfg\{man-filename\}} \c{man-filename} configuration directive \IM{\\cfg\{man-filename\}} \cw{\\cfg\{man-filename\}} \IM{\\cfg\{info-filename\}} \c{info-filename} configuration directive \IM{\\cfg\{info-filename\}} \cw{\\cfg\{info-filename\}} \IM{\\cfg\{info-dir-entry\}} \c{info-dir-entry} configuration directive \IM{\\cfg\{info-dir-entry\}} \cw{\\cfg\{info-dir-entry\}} \IM{\\cfg\{info-max-file-size\}} \c{info-max-file-size} configuration directive \IM{\\cfg\{info-max-file-size\}} \cw{\\cfg\{info-max-file-size\}} \IM{\\cfg\{info-width\}} \c{info-width} configuration directive \IM{\\cfg\{info-width\}} \cw{\\cfg\{info-width\}} \IM{\\cfg\{info-indent-code\}} \c{info-indent-code} configuration directive \IM{\\cfg\{info-indent-code\}} \cw{\\cfg\{info-indent-code\}} \IM{\\cfg\{info-index-width\}} \c{info-index-width} configuration directive \IM{\\cfg\{info-index-width\}} \cw{\\cfg\{info-index-width\}} \IM{\\cfg\{info-list-indent\}} \c{info-list-indent} configuration directive \IM{\\cfg\{info-list-indent\}} \cw{\\cfg\{info-list-indent\}} \IM{\\cfg\{info-listitem-indent\}} \c{info-listitem-indent} configuration directive \IM{\\cfg\{info-listitem-indent\}} \cw{\\cfg\{info-listitem-indent\}} \IM{\\cfg\{info-section-suffix\}} \c{info-section-suffix} configuration directive \IM{\\cfg\{info-section-suffix\}} \cw{\\cfg\{info-section-suffix\}} \IM{\\cfg\{info-title-underline\}} \c{info-title-underline} configuration directive \IM{\\cfg\{info-title-underline\}} \cw{\\cfg\{info-title-underline\}} \IM{\\cfg\{info-chapter-underline\}} \c{info-chapter-underline} configuration directive \IM{\\cfg\{info-chapter-underline\}} \cw{\\cfg\{info-chapter-underline\}} \IM{\\cfg\{info-section-underline\}} \c{info-section-underline} configuration directive \IM{\\cfg\{info-section-underline\}} \cw{\\cfg\{info-section-underline\}} \IM{\\cfg\{info-charset\}} \c{info-charset} configuration directive \IM{\\cfg\{info-charset\}} \cw{\\cfg\{info-charset\}} \IM{\\cfg\{info-bullet\}} \c{info-bullet} configuration directive \IM{\\cfg\{info-bullet\}} \cw{\\cfg\{info-bullet\}} \IM{\\cfg\{info-rule\}} \c{info-rule} configuration directive \IM{\\cfg\{info-rule\}} \cw{\\cfg\{info-rule\}} \IM{\\cfg\{info-list-suffix\}} \c{info-list-suffix} configuration directive \IM{\\cfg\{info-list-suffix\}} \cw{\\cfg\{info-list-suffix\}} \IM{\\cfg\{info-emphasis\}} \c{info-emphasis} configuration directive \IM{\\cfg\{info-emphasis\}} \cw{\\cfg\{info-emphasis\}} \IM{\\cfg\{info-quotes\}} \c{info-quotes} configuration directive \IM{\\cfg\{info-quotes\}} \cw{\\cfg\{info-quotes\}} \IM{\\cfg\{winhelp-filename\}} \c{winhelp-filename} configuration directive \IM{\\cfg\{winhelp-filename\}} \cw{\\cfg\{winhelp-filename\}} \IM{\\cfg\{winhelp-bullet\}} \c{winhelp-bullet} configuration directive \IM{\\cfg\{winhelp-bullet\}} \cw{\\cfg\{winhelp-bullet\}} \IM{\\cfg\{winhelp-quotes\}} \c{winhelp-quotes} configuration directive \IM{\\cfg\{winhelp-quotes\}} \cw{\\cfg\{winhelp-quotes\}} \IM{\\cfg\{winhelp-contents-titlepage\}} \c{winhelp-contents-titlepage} configuration directive \IM{\\cfg\{winhelp-contents-titlepage\}} \cw{\\cfg\{winhelp-contents-titlepage\}} \IM{\\cfg\{winhelp-section-suffix\}} \c{winhelp-section-suffix} configuration directive \IM{\\cfg\{winhelp-section-suffix\}} \cw{\\cfg\{winhelp-section-suffix\}} \IM{\\cfg\{winhelp-list-suffix\}} \c{winhelp-list-suffix} configuration directive \IM{\\cfg\{winhelp-list-suffix\}} \cw{\\cfg\{winhelp-list-suffix\}} \IM{\\cfg\{xhtml-anything\}} \c{xhtml-}\e{anything} configuration directives \IM{\\cfg\{xhtml-anything\}} \cw{\\cfg\{xhtml-}\e{anything}\cw{\}} \IM{\\cfg\{html-contents-filename\}} \c{html-contents-filename} configuration directive \IM{\\cfg\{html-contents-filename\}} \cw{\\cfg\{html-contents-filename\}} \IM{\\cfg\{html-index-filename\}} \c{html-index-filename} configuration directive \IM{\\cfg\{html-index-filename\}} \cw{\\cfg\{html-index-filename\}} \IM{\\cfg\{html-template-filename\}} \c{html-template-filename} configuration directive \IM{\\cfg\{html-template-filename\}} \cw{\\cfg\{html-template-filename\}} \IM{\\cfg\{html-single-filename\}} \c{html-single-filename} configuration directive \IM{\\cfg\{html-single-filename\}} \cw{\\cfg\{html-single-filename\}} \IM{\\cfg\{html-template-fragment\}} \c{html-template-fragment} configuration directive \IM{\\cfg\{html-template-fragment\}} \cw{\\cfg\{html-template-fragment\}} \IM{\\cfg\{text-width\}} \c{text-width} configuration directive \IM{\\cfg\{text-width\}} \cw{\\cfg\{text-width\}} \IM{\\cfg\{text-indent\}} \c{text-indent} configuration directive \IM{\\cfg\{text-indent\}} \cw{\\cfg\{text-indent\}} \IM{\\cfg\{text-indent-code\}} \c{text-indent-code} configuration directive \IM{\\cfg\{text-indent-code\}} \cw{\\cfg\{text-indent-code\}} \IM{\\cfg\{text-list-indent\}} \c{text-list-indent} configuration directive \IM{\\cfg\{text-list-indent\}} \cw{\\cfg\{text-list-indent\}} \IM{\\cfg\{text-listitem-indent\}} \c{text-listitem-indent} configuration directive \IM{\\cfg\{text-listitem-indent\}} \cw{\\cfg\{text-listitem-indent\}} \IM{\\cfg\{text-indent-preamble\}} \c{text-indent-preamble} configuration directive \IM{\\cfg\{text-indent-preamble\}} \cw{\\cfg\{text-indent-preamble\}} \IM{\\cfg\{text-title-align\}} \c{text-title-align} configuration directive \IM{\\cfg\{text-title-align\}} \cw{\\cfg\{text-title-align\}} \IM{\\cfg\{text-title-underline\}} \c{text-title-underline} configuration directive \IM{\\cfg\{text-title-underline\}} \cw{\\cfg\{text-title-underline\}} \IM{\\cfg\{text-chapter-align\}} \c{text-chapter-align} configuration directive \IM{\\cfg\{text-chapter-align\}} \cw{\\cfg\{text-chapter-align\}} \IM{\\cfg\{text-chapter-underline\}} \c{text-chapter-underline} configuration directive \IM{\\cfg\{text-chapter-underline\}} \cw{\\cfg\{text-chapter-underline\}} \IM{\\cfg\{text-chapter-numeric\}} \c{text-chapter-numeric} configuration directive \IM{\\cfg\{text-chapter-numeric\}} \cw{\\cfg\{text-chapter-numeric\}} \IM{\\cfg\{text-chapter-suffix\}} \c{text-chapter-suffix} configuration directive \IM{\\cfg\{text-chapter-suffix\}} \cw{\\cfg\{text-chapter-suffix\}} \IM{\\cfg\{text-section-align\}} \c{text-section-align} configuration directive \IM{\\cfg\{text-section-align\}} \cw{\\cfg\{text-section-align\}} \IM{\\cfg\{text-section-underline\}} \c{text-section-underline} configuration directive \IM{\\cfg\{text-section-underline\}} \cw{\\cfg\{text-section-underline\}} \IM{\\cfg\{text-section-numeric\}} \c{text-section-numeric} configuration directive \IM{\\cfg\{text-section-numeric\}} \cw{\\cfg\{text-section-numeric\}} \IM{\\cfg\{text-section-suffix\}} \c{text-section-suffix} configuration directive \IM{\\cfg\{text-section-suffix\}} \cw{\\cfg\{text-section-suffix\}} \IM{\\cfg\{text-list-suffix\}} \c{text-list-suffix} configuration directive \IM{\\cfg\{text-list-suffix\}} \cw{\\cfg\{text-list-suffix\}} \IM{\\cfg\{text-versionid\}} \c{text-versionid} configuration directive \IM{\\cfg\{text-versionid\}} \cw{\\cfg\{text-versionid\}} \IM{\\cfg\{text-charset\}} \c{text-charset} configuration directive \IM{\\cfg\{text-charset\}} \cw{\\cfg\{text-charset\}} \IM{\\cfg\{text-bullet\}} \c{text-bullet} configuration directive \IM{\\cfg\{text-bullet\}} \cw{\\cfg\{text-bullet\}} \IM{\\cfg\{text-rule\}} \c{text-rule} configuration directive \IM{\\cfg\{text-rule\}} \cw{\\cfg\{text-rule\}} \IM{\\cfg\{text-quotes\}} \c{text-quotes} configuration directive \IM{\\cfg\{text-quotes\}} \cw{\\cfg\{text-quotes\}} \IM{\\cfg\{text-emphasis\}} \c{text-emphasis} configuration directive \IM{\\cfg\{text-emphasis\}} \cw{\\cfg\{text-emphasis\}} \IM{\\cfg\{html-leaf-level\}} \c{html-leaf-level} configuration directive \IM{\\cfg\{html-leaf-level\}} \cw{\\cfg\{html-leaf-level\}} \IM{\\cfg\{html-contents-depth\}} \c{html-contents-depth} configuration directive \IM{\\cfg\{html-contents-depth\}} \cw{\\cfg\{html-contents-depth\}} \IM{\\cfg\{html-leaf-contains-contents\}} \c{html-leaf-contains-contents} configuration directive \IM{\\cfg\{html-leaf-contains-contents\}} \cw{\\cfg\{html-leaf-contains-contents\}} \IM{\\cfg\{html-leaf-smallest-contents\}} \c{html-leaf-smallest-contents} configuration directive \IM{\\cfg\{html-leaf-smallest-contents\}} \cw{\\cfg\{html-leaf-smallest-contents\}} \IM{\\cfg\{html-head-end\}} \c{html-head-end} configuration directive \IM{\\cfg\{html-head-end\}} \cw{\\cfg\{html-head-end\}} \IM{\\cfg\{html-local-head\}} \c{html-local-head} configuration directive \IM{\\cfg\{html-local-head\}} \cw{\\cfg\{html-local-head\}} \IM{\\cfg\{html-body-tag\}} \c{html-body-tag} configuration directive \IM{\\cfg\{html-body-tag\}} \cw{\\cfg\{html-body-tag\}} \IM{\\cfg\{html-body-start\}} \c{html-body-start} configuration directive \IM{\\cfg\{html-body-start\}} \cw{\\cfg\{html-body-start\}} \IM{\\cfg\{html-body-end\}} \c{html-body-end} configuration directive \IM{\\cfg\{html-body-end\}} \cw{\\cfg\{html-body-end\}} \IM{\\cfg\{html-address-start\}} \c{html-address-start} configuration directive \IM{\\cfg\{html-address-start\}} \cw{\\cfg\{html-address-start\}} \IM{\\cfg\{html-address-end\}} \c{html-address-end} configuration directive \IM{\\cfg\{html-address-end\}} \cw{\\cfg\{html-address-end\}} \IM{\\cfg\{html-navigation-attributes\}} \c{html-navigation-attributes} configuration directive \IM{\\cfg\{html-navigation-attributes\}} \cw{\\cfg\{html-navigation-attributes\}} \IM{\\cfg\{html-chapter-numeric\}} \c{html-chapter-numeric} configuration directive \IM{\\cfg\{html-chapter-numeric\}} \cw{\\cfg\{html-chapter-numeric\}} \IM{\\cfg\{html-chapter-suffix\}} \c{html-chapter-suffix} configuration directive \IM{\\cfg\{html-chapter-suffix\}} \cw{\\cfg\{html-chapter-suffix\}} \IM{\\cfg\{html-section-numeric\}} \c{html-section-numeric} configuration directive \IM{\\cfg\{html-section-numeric\}} \cw{\\cfg\{html-section-numeric\}} \IM{\\cfg\{html-section-suffix\}} \c{html-section-suffix} configuration directive \IM{\\cfg\{html-section-suffix\}} \cw{\\cfg\{html-section-suffix\}} \IM{\\cfg\{html-preamble-text\}} \c{html-preamble-text} configuration directive \IM{\\cfg\{html-preamble-text\}} \cw{\\cfg\{html-preamble-text\}} \IM{\\cfg\{html-contents-text\}} \c{html-contents-text} configuration directive \IM{\\cfg\{html-contents-text\}} \cw{\\cfg\{html-contents-text\}} \IM{\\cfg\{html-index-text\}} \c{html-index-text} configuration directive \IM{\\cfg\{html-index-text\}} \cw{\\cfg\{html-index-text\}} \IM{\\cfg\{html-title-separator\}} \c{html-title-separator} configuration directive \IM{\\cfg\{html-title-separator\}} \cw{\\cfg\{html-title-separator\}} \IM{\\cfg\{html-index-main-separator\}} \c{html-index-main-separator} configuration directive \IM{\\cfg\{html-index-main-separator\}} \cw{\\cfg\{html-index-main-separator\}} \IM{\\cfg\{html-index-multiple-separator\}} \c{html-index-multiple-separator} configuration directive \IM{\\cfg\{html-index-multiple-separator\}} \cw{\\cfg\{html-index-multiple-separator\}} \IM{\\cfg\{html-pre-versionid\}} \c{html-pre-versionid} configuration directive \IM{\\cfg\{html-pre-versionid\}} \cw{\\cfg\{html-pre-versionid\}} \IM{\\cfg\{html-post-versionid\}} \c{html-post-versionid} configuration directive \IM{\\cfg\{html-post-versionid\}} \cw{\\cfg\{html-post-versionid\}} \IM{\\cfg\{html-nav-prev-text\}} \c{html-nav-prev-text} configuration directive \IM{\\cfg\{html-nav-prev-text\}} \cw{\\cfg\{html-nav-prev-text\}} \IM{\\cfg\{html-nav-next-text\}} \c{html-nav-next-text} configuration directive \IM{\\cfg\{html-nav-next-text\}} \cw{\\cfg\{html-nav-next-text\}} \IM{\\cfg\{html-nav-up-text\}} \c{html-nav-up-text} configuration directive \IM{\\cfg\{html-nav-up-text\}} \cw{\\cfg\{html-nav-up-text\}} \IM{\\cfg\{html-nav-separator\}} \c{html-nav-separator} configuration directive \IM{\\cfg\{html-nav-separator\}} \cw{\\cfg\{html-nav-separator\}} \IM{\\cfg\{html-charset\}} \c{html-charset} configuration directive, lack of \IM{\\cfg\{html-charset\}} \cw{\\cfg\{html-charset\}}, lack of \IM{\\cfg\{html-output-charset\}} \c{html-output-charset} configuration directive \IM{\\cfg\{html-output-charset\}} \cw{\\cfg\{html-output-charset\}} \IM{\\cfg\{html-restrict-charset\}} \c{html-restrict-charset} configuration directive \IM{\\cfg\{html-restrict-charset\}} \cw{\\cfg\{html-restrict-charset\}} \IM{\\cfg\{html-quotes\}} \c{html-quotes} configuration directive \IM{\\cfg\{html-quotes\}} \cw{\\cfg\{html-quotes\}} \IM{\\cfg\{html-version\}} \c{html-version} configuration directive \IM{\\cfg\{html-version\}} \cw{\\cfg\{html-version\}} \IM{\\cfg\{html-versionid\}} \c{html-versionid} configuration directive \IM{\\cfg\{html-versionid\}} \cw{\\cfg\{html-versionid\}} \IM{\\cfg\{html-suppress-address\}} \c{html-suppress-address} configuration directive \IM{\\cfg\{html-suppress-address\}} \cw{\\cfg\{html-suppress-address\}} \IM{\\cfg\{html-suppress-navlinks\}} \c{html-suppress-navlinks} configuration directive \IM{\\cfg\{html-suppress-navlinks\}} \cw{\\cfg\{html-suppress-navlinks\}} \IM{\\cfg\{html-rellinks\}} \c{html-rellinks} configuration directive \IM{\\cfg\{html-rellinks\}} \cw{\\cfg\{html-rellinks\}} \IM{\\cfg\{html-author\}} \c{html-author} configuration directive \IM{\\cfg\{html-author\}} \cw{\\cfg\{html-author\}} \IM{\\cfg\{html-description\}} \c{html-description} configuration directive \IM{\\cfg\{html-description\}} \cw{\\cfg\{html-description\}} \IM{\\cfg\{html-mshtmlhelp-project\}} \c{html-mshtmlhelp-project} configuration directive \IM{\\cfg\{html-mshtmlhelp-project\}} \cw{\\cfg\{html-mshtmlhelp-project\}} \IM{\\cfg\{html-mshtmlhelp-chm\}} \c{html-mshtmlhelp-chm} configuration directive \IM{\\cfg\{html-mshtmlhelp-chm\}} \cw{\\cfg\{html-mshtmlhelp-chm\}} \IM{\\cfg\{html-mshtmlhelp-contents\}} \c{html-mshtmlhelp-contents} configuration directive \IM{\\cfg\{html-mshtmlhelp-contents\}} \cw{\\cfg\{html-mshtmlhelp-contents\}} \IM{\\cfg\{html-mshtmlhelp-index\}} \c{html-mshtmlhelp-index} configuration directive \IM{\\cfg\{html-mshtmlhelp-index\}} \cw{\\cfg\{html-mshtmlhelp-index\}} \IM{\\cfg\{winhelp-topic\}} \c{winhelp-topic} configuration directive \IM{\\cfg\{winhelp-topic\}} \cw{\\cfg\{winhelp-topic\}} \IM{\\cfg\{man-identity\}} \c{man-identity} configuration directive \IM{\\cfg\{man-identity\}} \cw{\\cfg\{man-identity\}} \IM{\\cfg\{man-headnumbers\}} \c{man-headnumbers} configuration directive \IM{\\cfg\{man-headnumbers\}} \cw{\\cfg\{man-headnumbers\}} \IM{\\cfg\{man-mindepth\}} \c{man-mindepth} configuration directive \IM{\\cfg\{man-mindepth\}} \cw{\\cfg\{man-mindepth\}} \IM{\\cfg\{man-charset\}} \c{man-charset} configuration directive \IM{\\cfg\{man-charset\}} \cw{\\cfg\{man-charset\}} \IM{\\cfg\{man-bullet\}} \c{man-bullet} configuration directive \IM{\\cfg\{man-bullet\}} \cw{\\cfg\{man-bullet\}} \IM{\\cfg\{man-rule\}} \c{man-rule} configuration directive \IM{\\cfg\{man-rule\}} \cw{\\cfg\{man-rule\}} \IM{\\cfg\{man-quotes\}} \c{man-quotes} configuration directive \IM{\\cfg\{man-quotes\}} \cw{\\cfg\{man-quotes\}} \IM{\\cfg\{ps-filename\}} \c{ps-filename} configuration directive \IM{\\cfg\{ps-filename\}} \cw{\\cfg\{ps-filename\}} \IM{\\cfg\{pdf-filename\}} \c{pdf-filename} configuration directive \IM{\\cfg\{pdf-filename\}} \cw{\\cfg\{pdf-filename\}} \IM{\\cfg\{paper-page-width\}} \c{paper-page-width} configuration directive \IM{\\cfg\{paper-page-width\}} \cw{\\cfg\{paper-page-width\}} \IM{\\cfg\{paper-page-height\}} \c{paper-page-height} configuration directive \IM{\\cfg\{paper-page-height\}} \cw{\\cfg\{paper-page-height\}} \IM{\\cfg\{paper-left-margin\}} \c{paper-left-margin} configuration directive \IM{\\cfg\{paper-left-margin\}} \cw{\\cfg\{paper-left-margin\}} \IM{\\cfg\{paper-top-margin\}} \c{paper-top-margin} configuration directive \IM{\\cfg\{paper-top-margin\}} \cw{\\cfg\{paper-top-margin\}} \IM{\\cfg\{paper-right-margin\}} \c{paper-right-margin} configuration directive \IM{\\cfg\{paper-right-margin\}} \cw{\\cfg\{paper-right-margin\}} \IM{\\cfg\{paper-bottom-margin\}} \c{paper-bottom-margin} configuration directive \IM{\\cfg\{paper-bottom-margin\}} \cw{\\cfg\{paper-bottom-margin\}} \IM{\\cfg\{paper-list-indent\}} \c{paper-list-indent} configuration directive \IM{\\cfg\{paper-list-indent\}} \cw{\\cfg\{paper-list-indent\}} \IM{\\cfg\{paper-listitem-indent\}} \c{paper-listitem-indent} configuration directive \IM{\\cfg\{paper-listitem-indent\}} \cw{\\cfg\{paper-listitem-indent\}} \IM{\\cfg\{paper-quote-indent\}} \c{paper-quote-indent} configuration directive \IM{\\cfg\{paper-quote-indent\}} \cw{\\cfg\{paper-quote-indent\}} \IM{\\cfg\{paper-base-leading\}} \c{paper-base-leading} configuration directive \IM{\\cfg\{paper-base-leading\}} \cw{\\cfg\{paper-base-leading\}} \IM{\\cfg\{paper-base-para-spacing\}} \c{paper-base-para-spacing} configuration directive \IM{\\cfg\{paper-base-para-spacing\}} \cw{\\cfg\{paper-base-para-spacing\}} \IM{\\cfg\{paper-chapter-top-space\}} \c{paper-chapter-top-space} configuration directive \IM{\\cfg\{paper-chapter-top-space\}} \cw{\\cfg\{paper-chapter-top-space\}} \IM{\\cfg\{paper-sect-num-left-space\}} \c{paper-sect-num-left-space} configuration directive \IM{\\cfg\{paper-sect-num-left-space\}} \cw{\\cfg\{paper-sect-num-left-space\}} \IM{\\cfg\{paper-chapter-underline-depth\}} \c{paper-chapter-underline-depth} configuration directive \IM{\\cfg\{paper-chapter-underline-depth\}} \cw{\\cfg\{paper-chapter-underline-depth\}} \IM{\\cfg\{paper-chapter-underline-thickness\}} \c{paper-chapter-underline-thickness} configuration directive \IM{\\cfg\{paper-chapter-underline-thickness\}} \cw{\\cfg\{paper-chapter-underline-thickness\}} \IM{\\cfg\{paper-rule-thickness\}} \c{paper-rule-thickness} configuration directive \IM{\\cfg\{paper-rule-thickness\}} \cw{\\cfg\{paper-rule-thickness\}} \IM{\\cfg\{paper-contents-indent-step\}} \c{paper-contents-indent-step} configuration directive \IM{\\cfg\{paper-contents-indent-step\}} \cw{\\cfg\{paper-contents-indent-step\}} \IM{\\cfg\{paper-contents-margin\}} \c{paper-contents-margin} configuration directive \IM{\\cfg\{paper-contents-margin\}} \cw{\\cfg\{paper-contents-margin\}} \IM{\\cfg\{paper-leader-separation\}} \c{paper-leader-separation} configuration directive \IM{\\cfg\{paper-leader-separation\}} \cw{\\cfg\{paper-leader-separation\}} \IM{\\cfg\{paper-index-gutter\}} \c{paper-index-gutter} configuration directive \IM{\\cfg\{paper-index-gutter\}} \cw{\\cfg\{paper-index-gutter\}} \IM{\\cfg\{paper-index-minsep\}} \c{paper-index-minsep} configuration directive \IM{\\cfg\{paper-index-minsep\}} \cw{\\cfg\{paper-index-minsep\}} \IM{\\cfg\{paper-footer-distance\}} \c{paper-footer-distance} configuration directive \IM{\\cfg\{paper-footer-distance\}} \cw{\\cfg\{paper-footer-distance\}} \IM{\\cfg\{paper-base-fonts\}} \c{paper-base-fonts} configuration directive \IM{\\cfg\{paper-base-fonts\}} \cw{\\cfg\{paper-base-fonts\}} \IM{\\cfg\{paper-base-font-size\}} \c{paper-base-font-size} configuration directive \IM{\\cfg\{paper-base-font-size\}} \cw{\\cfg\{paper-base-font-size\}} \IM{\\cfg\{paper-title-fonts\}} \c{paper-title-fonts} configuration directive \IM{\\cfg\{paper-title-fonts\}} \cw{\\cfg\{paper-title-fonts\}} \IM{\\cfg\{paper-title-font-size\}} \c{paper-title-font-size} configuration directive \IM{\\cfg\{paper-title-font-size\}} \cw{\\cfg\{paper-title-font-size\}} \IM{\\cfg\{paper-chapter-fonts\}} \c{paper-chapter-fonts} configuration directive \IM{\\cfg\{paper-chapter-fonts\}} \cw{\\cfg\{paper-chapter-fonts\}} \IM{\\cfg\{paper-chapter-font-size\}} \c{paper-chapter-font-size} configuration directive \IM{\\cfg\{paper-chapter-font-size\}} \cw{\\cfg\{paper-chapter-font-size\}} \IM{\\cfg\{paper-section-fonts\}} \c{paper-section-fonts} configuration directive \IM{\\cfg\{paper-section-fonts\}} \cw{\\cfg\{paper-section-fonts\}} \IM{\\cfg\{paper-section-font-size\}} \c{paper-section-font-size} configuration directive \IM{\\cfg\{paper-section-font-size\}} \cw{\\cfg\{paper-section-font-size\}} \IM{\\cfg\{paper-code-fonts\}} \c{paper-code-fonts} configuration directive \IM{\\cfg\{paper-code-fonts\}} \cw{\\cfg\{paper-code-fonts\}} \IM{\\cfg\{paper-code-font-size\}} \c{paper-code-font-size} configuration directive \IM{\\cfg\{paper-code-font-size\}} \cw{\\cfg\{paper-code-font-size\}} \IM{\\cfg\{paper-index-columns\}} \c{paper-index-columns} configuration directive \IM{\\cfg\{paper-index-columns\}} \cw{\\cfg\{paper-index-columns\}} \IM{\\cfg\{paper-pagenum-font-size\}} \c{paper-pagenum-font-size} configuration directive \IM{\\cfg\{paper-pagenum-font-size\}} \cw{\\cfg\{paper-pagenum-font-size\}} \IM{\\cfg\{paper-bullet\}} \c{paper-bullet} configuration directive \IM{\\cfg\{paper-bullet\}} \cw{\\cfg\{paper-bullet\}} \IM{\\cfg\{paper-quotes\}} \c{paper-quotes} configuration directive \IM{\\cfg\{paper-quotes\}} \cw{\\cfg\{paper-quotes\}} \IM{\\cfg\{chapter\}} \c{chapter} configuration directive \IM{\\cfg\{chapter\}} \cw{\\cfg\{chapter\}} \IM{\\cfg\{section\}} \c{section} configuration directive \IM{\\cfg\{section\}} \cw{\\cfg\{section\}} \IM{\\cfg\{appendix\}} \c{appendix} configuration directive \IM{\\cfg\{appendix\}} \cw{\\cfg\{appendix\}} \IM{\\cfg\{quotes\}} \c{quotes} configuration directive \IM{\\cfg\{quotes\}} \cw{\\cfg\{quotes\}} \IM{\\cfg\{input-charset\}} \c{input-charset} configuration directive \IM{\\cfg\{input-charset\}} \cw{\\cfg\{input-charset\}} \IM{configuring heading display} configuring heading display \IM{configuring heading display} headings, configuring display \IM{configuring heading display} section headings, configuring display \IM{configuring heading display} chapter headings, configuring display \IM{section headings} section headings \IM{section headings} chapter headings \IM{section headings} headings \IM{depth of contents} depth of contents \IM{depth of contents} contents, depth \IM{version ID paragraphs} version IDs \IM{version IDs} version IDs \IM{author} author, of document \IM{header}{headers} headers \IM{header}{headers} page headers \IM{footer}{footers} footers \IM{footer}{footers} page footers \IM{inline formatting commands} inline formatting commands \IM{inline formatting commands} formatting commands, inline \IM{line break}{line breaks} line breaks \IM{computer code} code \IM{computer code} computer code \IM{\\e} \c{\\e} command \IM{\\s} \c{\\s} command \IM{\\c} \c{\\c} command \IM{\\cw} \c{\\cw} command \IM{\\cq} \c{\\cq} command \IM{\\q} \c{\\q} command \IM{\\_} \c{\\_} command \IM{\\-} \c{\\-} command \IM{\\date} \c{\\date} command \IM{\\W} \c{\\W} command \IM{\\u} \c{\\u} command \IM{\\k} \c{\\k} command \IM{\\K-upper} \c{\\K} command \IM{\\#} \c{\\#} command \IM{\\b} \c{\\b} command \IM{\\n} \c{\\n} command \IM{\\dt} \c{\\dt} command \IM{\\dd} \c{\\dd} command \IM{\\lcont} \c{\\lcont} command \IM{\\rule} \c{\\rule} command \IM{\\quote} \c{\\quote} command \IM{\\C-upper} \c{\\C} command \IM{\\H} \c{\\H} command \IM{\\S-upper} \c{\\S} command \IM{\\A} \c{\\A} command \IM{\\U-upper} \c{\\U} command \IM{\\S2} \c{\\S2}, \c{\\S3} commands etc. \IM{\\title} \c{\\title} command \IM{\\copyright} \c{\\copyright} command \IM{\\versionid} \c{\\versionid} command \IM{\\B-upper} \c{\\B} command \IM{\\BR} \c{\\BR} command \IM{\\nocite} \c{\\nocite} command \IM{\\i} \c{\\i} command \IM{\\i\\c} \c{\\i\\c} combination \IM{\\i\\cw} \c{\\i\\cw} combination \IM{\\i\\e} \c{\\i\\e} combination \IM{\\i\\s} \c{\\i\\s} combination \IM{\\I-upper} \c{\\I} command \IM{\\ii} \c{\\ii} command \IM{\\IM} \c{\\IM} command \IM{\\cfg} \c{\\cfg} command \IM{\\define} \c{\\define} command \IM{\\.} \c{\\.} command \IM{wrapping paragraphs} wrapping paragraphs \IM{wrapping paragraphs} paragraphs, wrapping \IM{non-breaking hyphens} non-breaking hyphens \IM{non-breaking hyphens} hyphens, non-breaking \IM{non-breaking spaces} non-breaking spaces \IM{non-breaking spaces} spaces, non-breaking \IM{hyperlink}{hyperlinks} hyperlinks \IM{numbered list}{numbered lists} numbered lists \IM{numbered list}{numbered lists} lists, numbered \IM{bulletted lists} bulletted lists \IM{bulletted lists} lists, bulletted \IM{description lists} description lists \IM{description lists} definition lists \IM{description lists} lists, description \IM{paragraph-level commands} commands, paragraph-level \IM{paragraph-level commands} paragraph-level formatting commands \IM{paragraph-level commands} formatting commands, paragraph-level \IM{continuing list items} continuing list items \IM{continuing list items} list items, continuing \IM{nested lists} nested lists \IM{nested lists} lists, nested \IM{horizontal rules} rules, horizontal \IM{horizontal rules} horizontal rules \IM{section numbering} section numbering \IM{section numbering} chapter numbering \IM{section numbering} numbering, of sections \IM{writing a FAQ} writing FAQs \IM{writing a FAQ} FAQs, writing \IM{renaming sections} renaming sections \IM{renaming sections} chapters, renaming \IM{renaming sections} sections, renaming \IM{renaming sections} appendices, renaming \IM{command-line options} command-line options \IM{command-line options} options, command-line \IM{--text} \c{--text} command-line option \IM{--html} \c{--html} command-line option \IM{--xhtml} \c{--xhtml} command-line option \IM{--winhelp} \c{--winhelp} command-line option \IM{--whlp} \c{--whlp} command-line option \IM{--hlp} \c{--hlp} command-line option \IM{--man} \c{--man} command-line option \IM{--info} \c{--info} command-line option \IM{--ps} \c{--ps} command-line option \IM{--pdf} \c{--pdf} command-line option \IM{-C} \c{-C} command-line option \IM{--input-charset} \c{--input-charset} command-line option \IM{--list-charsets} \c{--list-charsets} command-line option \IM{--list-fonts} \c{--list-fonts} command-line option \IM{--help} \c{--help} command-line option \IM{--version} \c{--version} command-line option \IM{--licence} \c{--licence} command-line option \IM{--list-charsets} \c{--list-charsets} command-line option \IM{--precise} \c{--precise} command-line option \IM{command syntax} commands, general syntax of \IM{command syntax} formatting commands, general syntax of \IM{command syntax} syntax of general formatting commands \IM{command syntax} general syntax of formatting commands \IM{keyword syntax} keywords, syntax of \IM{keyword syntax} section keywords, syntax of \IM{keyword syntax} chapter keywords, syntax of \IM{keyword syntax} heading keywords, syntax of \IM{keyword syntax} syntax of keywords \IM{GNU info} GNU Info \IM{GNU info} Info \IM{INFO-DIR-ENTRY} \cw{INFO-DIR-ENTRY} \IM{INFO-DIR-ENTRY} \cw{START-INFO-DIR-ENTRY} \IM{INFO-DIR-ENTRY} \cw{END-INFO-DIR-ENTRY} \IM{%N-upper} \c{%N} \IM{PDF} PDF \IM{PDF} Portable Document Format \IM{embedding fonts} embedding fonts \IM{embedding fonts} fonts, embedding \IM{Type 1 font} Type 1 fonts \IM{Type 1 font} fonts, Type 1 \IM{TrueType font} TrueType fonts \IM{TrueType font} fonts, TrueType \IM{font sizes} font size \IM{} \cw{} \IM{} \cw{AppleTitle}, \cw{} tag halibut-1.1/doc/input.but0000644000175300017530000015274412444773746012411 00000000000000\C{input} Halibut input format This chapter describes the format in which you should write documents to be processed by Halibut. \H{input-basics} The basics Halibut's input files mostly look like ordinary ASCII text files; you can edit them with any text editor you like. Writing \i{paragraphs of ordinary text} is very simple: you just write ordinary text in the ordinary way. You can wrap a paragraph across more than one line using \i{line breaks} in the text file, and Halibut will ignore this when it \I{wrapping paragraphs}rewraps the paragraph for each output format. To separate paragraphs, use a \i{blank line} (i.e. two consecutive line breaks). For example, a fragment of Halibut input looking like this: \c This is a line of text. \c This is another line of text. \c \c This line is separated from the previous one by a blank line. will produce two paragraphs looking like this: \quote{ This is a line of text. This is another line of text. This line is separated from the previous one by a blank line. } The first two lines of the input have been merged together into a single paragraph, and the line break in the input file was treated identically to the spaces between the individual words. Halibut is designed to have very few \I{escaping, special characters}\i{special characters}. The only printable characters in Halibut input which will not be treated exactly literally in the output are the \i{backslash} (\c{\\}) and the \i{braces} (\c{\{} and \c{\}}). If you do not use these characters, \e{everything} else you might type in normal ASCII text is perfectly safe. If you do need to use any of those three characters in your document, you will have to precede each one with a backslash. Hence, for example, you could write \c This \\ is a backslash, and these are \{braces\}. and Halibut would generate the text \quote{ This \\ is a backslash, and these are \{braces\}. } If you want to write your input file in a character set other than ASCII, you can do so by using the \c{\\cfg\{input-charset\}} command. See \k{input-config} for details of this. \H{input-inline} Simple \i{inline formatting commands} Halibut formatting commands all begin with a backslash, followed by a word or character identifying the command. Some of them then use braces to surround one or more pieces of text acted on by the command. (In fact, the \c{\\\\}, \c{\\\{} and \c{\\\}} sequences you met in \k{input-basics} are themselves formatting commands.) This section describes some simple formatting commands you can use in Halibut documents. The commands in this section are \e{inline} commands, which means you can use them in the middle of a paragraph. \K{input-para} describes some \e{paragraph} commands, which affect a whole paragraph at a time. Many of these commands are followed by a pair of braces surrounding some text. In all cases, it is perfectly safe to have a \i{line break} (in the input file) within those braces; Halibut will treat that exactly the same as a space. For example, these two paragraphs will be treated identically: \c Here is some \e{emphasised \c text}. \c \c Here is some \e{emphasised text}. \S{input-emph} \c{\\e}: Emphasising text Possibly the most obvious piece of formatting you might want to use in a document is \i\e{emphasis}. To emphasise text, you use the \i\c{\\e} command, and follow it up with the text to be emphasised in braces. For example, the first sentence in this paragraph was generated using the Halibut input \c Possibly the most obvious piece of formatting you might want \c to use in a document is \e{emphasis}. A second form of emphasis is supported, called \i\s{strong} text. You can use the \i\c{\\s} command for this type of emphasis. Typically, in output formats, \c{\\e} will give italics, and \c{\\s} will give bold. \S{input-code} \c{\\c} and \c{\\cw}: Displaying \i{computer code} inline Halibut was primarily designed to produce software manuals. It can be used for other types of document as well, but software manuals are its speciality. In software manuals, you often want to format text in a way that indicates that it is something you might see displayed \i{verbatim} on a computer screen. In printed manuals, this is typically done by setting that text in a font which is obviously \I{fixed-width font}fixed-width. This provides a visual cue that the text being displayed is code, and it also ensures that punctuation marks are clearly separated and shown individually (so that a user can copy the text accurately and conveniently). Halibut provides \e{two} commands for this, which are subtly different. The names of those commands are \i\c{\\c} (\q{code}) and \i\c{\\cw} (\q{\i{weak code}}). You use them just like \c{\\e} and \c{\\s}, by following them with some text in braces. For example, this... \c This sentence contains some \c{code} and some \cw{weak code}. ... produces this: \quote{ This sentence contains some \c{code} and some \cw{weak code}. } The distinction between code and weak code is mainly important when producing plain text output. Plain text output is typically viewed in a fixed-width font, so there is no need (and no way) to change font in order to make the order of punctuation marks clear. However, marking text as code is also \e{sometimes} done to provide a visual distinction between it and the text around it, so that the reader knows where the literal computer text starts and stops; and in plain text, this cannot be done by changing font, so there needs to be an alternative way. So in the plain text output format, things marked as code (\c{\\c}) will be surrounded by quote marks, so that it's obvious where they start and finish. Things marked as weak code (\c{\\cw}) will not look any different from normal text. I recommend using weak code for any application where it is \e{obvious} that the text is literal computer input or output. For example, if the text is capitalised, that's usually good enough. If I talk about the Pentium's \cw{EAX} and \cw{EDX} registers, for example, you don't need quotes to notice that those are special; so I would write that in Halibut as \cq{the Pentium's \\cw\{EAX\} and \\cw\{EDX\} registers}. But if I'm talking about the Unix command \c{man}, which is an ordinary English word in its own right, a reader might be slightly confused if it appeared in the middle of a sentence undecorated; so I would write that as \cq{the Unix command \\c\{man\}}. In summary: \b \c{\\c} means \q{this text \e{must} be visually distinct from the text around it}. Halibut's various output formats will do this by changing the font if possible, or by using quotes if not. \b \c{\\cw} means \q{it would be nice to display this text in a fixed-width font if possible, but it's not essential}. In really extreme cases, you might want Halibut to use \i{quotation marks} even in output formats which can change font. In \k{input-date}, for example, I mention the special formatting command \cq{\\.}. If that appeared at the end of a sentence \e{without} the quotes, then the two adjacent full stops would look pretty strange even if they were obviously in different fonts. For this, Halibut supports the \i\c{\\cq} command, which is exactly equivalent to using \c{\\q} to provide quotes and then using \c{\\cw} inside the quotes. So in the paragraph above, for example, I wrote \c the special formatting command \cq{\\.}. and I could equivalently have written \c the special formatting command \q{\cw{\\.}}. There is a separate mechanism for displaying computer code in an entire paragraph; see \k{input-codepara} for that one. \S{input-quotes} \c{\\q}: \ii{Quotation marks} Halibut's various output formats don't all use the same conventions for displaying text in ordinary quotation marks (\q{like these}). Some output formats have access to proper matched quote characters, whereas others are restricted to using plain ASCII. Therefore, it is not ideal to use the ordinary ASCII double quote character in your document (although you can if you like). Halibut provides the formatting command \i\c{\\q} to indicate quoted text. If you write \c Here is some \q{text in quotes}. then Halibut will print \quote{ Here is some \q{text in quotes}. } and in every output format Halibut generates, it will choose the best quote characters available to it in that format. (The quote characters to use can be configured with the \c{\\cfg} command.) You can still use the ordinary quote characters of your choice if you prefer; or you could even use the \c{\\u} command (see \k{input-unicode}) to generate \i{Unicode matched quotes} (single or double) in a way which will automatically fall back to the normal ASCII one if they aren't available. But I recommend using the built-in \c{\\q} command in most cases, because it's simple and does the best it can everywhere. If you're using the \c{\\c} or \c{\\cw} commands to display literal computer code, you will probably want to use literal \i{ASCII quote characters}, because it is likely to matter precisely which quote character you use. In fact, Halibut actually \e{disallows} the use of \c{\\q} within either of \c{\\c} and \c{\\cw}, since this simplifies some of the output formats. \S{input-nonbreaking} \c{\\-} and \c{\\_}: \ii{Non-breaking hyphens} and \I{non-breaking spaces}spaces If you use an ordinary hyphen in the middle of a word (such as \q{built-in}), Halibut's output formats will feel free to break a line after that hyphen when \i{wrapping paragraphs}. This is fine for a word like \q{built-in}, but if you were displaying some literal computer code such as the Emacs command \c{M\-x\_psychoanalyze\-pinhead}, you might prefer to see the whole hyphenated word treated as an unbreakable block. In some cases, you might even want to prevent the \e{space} in that command from becoming a line break. For these purposes, Halibut provides the commands \i\c{\\-} and \i\c{\\_}, which generate a non-breaking hyphen and a non-breaking space respectively. So the above Emacs command might be written as \c the Emacs command \c{M\-x\_psychoanalyze\-pinhead} Unfortunately, some of Halibut's output formats do not support non-breaking hyphens, and others don't support \e{breaking} hyphens! So Halibut cannot promise to honour these commands in all situations. All it can do is make a best effort. \S{input-date} \c{\\date}: Automatic \i{date} generation Sometimes you might want your document to give an up-to-date indication of the date on which it was run through Halibut. Halibut supplies the \i\c{\\date} command to do this. In its simplest form, you simply say \c This document was generated on \date. and Halibut generates something like \quote{ This document was generated on \date. } You can follow the \c{\\date} command directly with punctuation (as in this example, where it is immediately followed by a full stop), but if you try to follow it with an alphabetic or numeric character (such as writing \c{\\dateZ}) then Halibut will assume you are trying to invoke the name of a macro command you have defined yourself, and will complain if no such command exists. To get round this you can use the special \cq{\\.} do-nothing command. See \k{input-macro} for more about general Halibut command syntax and \cq{\\.}. If you would prefer the date to be generated in a specific format, you can follow the \c{\\date} command with a format specification in braces. The format specification will be run through the standard C function \i\c{strftime}, so any format acceptable to that function is acceptable here as well. I won't document the format here, because the details vary from computer to computer (although there is a standard core which should be supported everywhere). You should look at your local system's manual for \c{strftime} for details. Here's an example which generates the date in the international standard \i{ISO 8601} format: \c This document was generated on \date{%Y-%m-%d %H:%M:%S}. And here's some sample output from that command: \quote{ This document was generated on \date{%Y-%m-%d %H:%M:%S}. } \S{input-weblink} \c{\\W}: \i{WWW hyperlinks} Since one of Halibut's output formats is \i{HTML}, it's obviously useful to be able to provide \I{linking to web sites}links to arbitrary \i{web sites} in a Halibut document. This is done using the \i\c{\\W} command. \c{\\W} expects to be followed by \e{two} sets of braces. In the first set of braces you put a \i{URL}; in the second set you put the text which should be a \i{hyperlink}. For example, you might write \c Try searching on \W{http://www.google.com/}{Google}. and Halibut would generate \quote{ Try searching on \W{http://www.google.com/}{Google}. } Note that hyperlinks, like the non-breaking commands discussed in \k{input-nonbreaking}, are \e{discretionary}: if an output format does not support them then they will just be left out completely. So unless you're \e{only} intending to use the HTML output format, you should avoid storing vital content in the URL part of a \c{\\W} command. The Google example above is reasonable (because most users are likely to be able to find Google for themselves even without a convenient hyperlink leading straight there), but if you really need to direct users to a specific web site, you will need to give the URL in actual displayed text (probably displayed as code as well). However, there's nothing to stop you making it a hyperlink \e{as well} for the convenience of HTML readers. The \c{\\W} command supports a piece of extra syntax to make this convenient for you. You can specify \c{\\c} or \c{\\cw} \e{between} the first and second pairs of braces. For example, you might write \c Google is at \W{http://www.google.com/}\cw{www.google.com}. and Halibut would produce \quote{ Google is at \W{http://www.google.com/}\cw{www.google.com}. } If you want the link text to be an index term as well, you can also specify \c{\\i} or \c{\\ii}; this has to come before \c{\\c} or \c{\\cw} if both are present. (See \k{input-index} for more about indexing.) \S{input-unicode} \c{\\u}: Specifying arbitrary \i{Unicode} characters Halibut has extensive support for Unicode and character set conversion. You can specify any (reasonably well known) \i{character set} for your input document, and Halibut will convert it all to Unicode as it reads it in. See \k{input-config} for more details of this. If you need to specify a Unicode character in your input document which is not supported by the input character set you have chosen, you can use the \i\c{\\u} command to do this. \c{\\u} expects to be followed by a sequence of hex digits; so that \c{\\u0041}, for example, denotes the Unicode character \cw{0x0041}, which is the capital letter A. If a Unicode character specified in this way is not supported in a particular \e{output} format, you probably don't just want it to be omitted. So you can put a pair of braces after the \c{\\u} command containing \i{fallback text}. For example, to specify an amount of money in euros, you might write this: \c This is likely to cost \u20AC{EUR\_}2500 at least. Halibut will render that as a Euro sign \e{if available}, and the text \q{EUR\_} if not. In the output format you're currently reading in, the above input generates this: \quote{ This is likely to cost \u20AC{EUR\_}2500 at least. } If you read it in other formats, you may see different results. \S{input-xref} \i\c{\\k} and \I{\\K-upper}\c{\\K}: \ii{Cross-references} to other sections \K{intro-features} mentions that Halibut \I{section numbers}numbers the sections of your document automatically, and can generate cross-references to them on request. \c{\\k} and \c{\\K} are the commands used to generate those cross-references. To use one of these commands, you simply follow it with a pair of braces containing the keyword for the section in question. For example, you might write something like \c \K{input-xref} expands on \k{intro-features}. and Halibut would generate something like \quote{ \K{input-xref} expands on \k{intro-features}. } The \i{keywords} \c{input-xref} and \c{intro-features} are \i{section keywords} used in this manual itself. In your own document, you would have supplied a keyword for each one of your own sections, and you would provide your own keywords for the \c{\\k} command to work on. The difference between \c{\\k} and \c{\\K} is simply that \c{\\K} starts the cross-reference text with a capital letter; so you would use \c{\\K} at the beginning of a sentence, and \c{\\k} everywhere else. In output formats which permit it, cross-references act as \i{hyperlinks}, so that clicking the mouse on a cross-reference takes you straight to the referenced section. The \c{\\k} commands are also used for referring to entries in a \i{bibliography} (see \k{input-biblio} for more about bibliographies), and can also be used for referring to an element of a \i{numbered list} by its number (see \k{input-list-number} for more about numbered lists). See \k{input-sections} for more about chapters and sections. \S{input-inline-comment} \i\c{\\#}: Inline comments If you want to include \i{comments} in your Halibut input, to be seen when reading it directly but not copied into the output text, then you can use \c{\\#} to do this. If you follow \c{\\#} with text in braces, that text will be ignored by Halibut. For example, you might write \c The typical behaviour of an antelope \#{do I mean \c gazelle?} is... and Halibut will simply leave out the aside about gazelles, and will generate nothing but \quote{ The typical behaviour of an antelope \#{do I mean gazelle?} is... } This command will respect nested braces, so you can use it to comment out sections of Halibut markup: \c This function is \#{very, \e{very}} important. In this example, the comment lasts until the final closing brace (so that the whole \q{very, \e{very}} section is commented out). The \c{\\#} command can also be used to produce a whole-paragraph comment; see \k{input-commentpara} for details of that. \H{input-para} \ii{Paragraph-level commands} This section describes Halibut commands which affect an entire paragraph, or sometimes even \e{more} than one paragraph, at a time. \S{input-codepara} \i\c{\\c}: Displaying whole \I{code paragraphs}paragraphs of \i{computer code} \K{input-code} describes a mechanism for displaying computer code in the middle of a paragraph, a few words at a time. However, this is often not enough. Often, in a computer manual, you really want to show several lines of code in a \i{display paragraph}. This is also done using the \c{\\c} command, in a slightly different way. Instead of using it in the middle of a paragraph followed by braces, you can use it at the start of each line of a paragraph. For example, you could write \c \c #include \c \c \c \c int main(int argc, char **argv) { \c \c printf("hello, world\n"); \c \c return 0; \c \c } and Halibut would generate \quote{ \c #include \c \c int main(int argc, char **argv) { \c printf("hello, world\n"); \c return 0; \c } } Note that the above paragraph makes use of a backslash and a pair of braces, and does \e{not} need to escape them in the way described in \k{input-basics}. This is because code paragraphs formatted in this way are a special case; the intention is that you can just copy and paste a lump of code out of your program, put \cq{\\c } at the start of every line, and simply \e{not have to worry} about the details - you don't have to go through the whole block looking for characters to escape. Since a backslash inside a code paragraph generates a literal backslash, this means you cannot use any other Halibut formatting commands inside a code paragraph. In particular, if you want to emphasise or strengthen a particular word in the paragraph, you can't do that using \c{\\e} or \c{\\s} (\k{input-emph}) in the normal way. Therefore, Halibut provides an alternative means of \i{emphasis in code paragraphs}. Each line beginning with \c{\\c} can optionally be followed by a single line beginning with \c{\\e}, indicating the emphasis in that line. The emphasis line contains the letters \c{b} and \c{i} (for \q{bold} and \q{italic}, although some output formats might render \c{i} as underlining instead of italics), positioned to line up under the parts of the text that you want emphasised. For example, if you wanted to do \i{syntax highlighting} on the above C code by highlighting the preprocessor command in italic and the keywords in bold, you might do it like this: \c \c #include \c \e iiiiiiiiiiiiiiiiii \c \c \c \c int main(int argc, char **argv) { \c \e bbb bbb bbbb \c \c printf("hello, world\n"); \c \c return 0; \c \e bbbbbb \c \c } and Halibut would generate: \quote{ \c #include \e iiiiiiiiiiiiiiiiii \c \c int main(int argc, char **argv) { \e bbb bbb bbbb \c printf("hello, world\n"); \c return 0; \e bbbbbb \c } } Note that not every \c{\\c} line has to be followed by a \c{\\e} line; they're optional. Also, note that highlighting within a code paragraph is \e{discretionary}. Not all of Halibut's output formats can support it (plain text, in particular, has no sensible way to do it). Unless you know you are using a restricted range of output formats, you should use highlighting in code paragraphs \e{only} as a visual aid, and not rely on it to convey any vital semantic content. \S{input-lists} \c{\\b}, \c{\\n}, \c{\\dt}, \c{\\dd}, \c{\\lcont}: \ii{Lists} Halibut supports bulletted lists, numbered lists and description lists. \S2{input-list-bullet} \i\c{\\b}: \ii{Bulletted lists} To create a bulletted list, you simply prefix each paragraph describing a bullet point with the command \c{\\b}. For example, this Halibut input: \c Here's a list: \c \c \b One. \c \c \b Two. \c \c \b Three. would produce this Halibut output: \quote{ Here's a list: \b One. \b Two. \b Three. } \S2{input-list-number} \i\c{\\n}: \ii{Numbered lists} Numbered lists are just as simple: instead of \c{\\b}, you use \c{\\n}, and Halibut takes care of getting the numbering right for you. For example: \c Here's a list: \c \c \n One. \c \c \n Two. \c \c \n Three. This produces the Halibut output: \quote{ Here's a list: \n One. \n Two. \n Three. } The disadvantage of having Halibut sort out the list numbering for you is that if you need to refer to a list item by its number, you can't reliably know the number in advance (because if you later add another item at the start of the list, the numbers will all change). To get round this, Halibut allows an optional keyword in braces after the \c{\\n} command. This keyword can then be referenced using the \c{\\k} or \c{\\K} command (see \k{input-xref}) to provide the number of the list item. For example: \c Here's a list: \c \c \n One. \c \c \n{this-one} Two. \c \c \n Three. \c \c \n Now go back to step \k{this-one}. This produces the following output: \quote{ Here's a list: \n One. \n{this-one} Two. \n Three. \n Now go back to step \k{this-one}. } The keyword you supply after \c{\\n} is allowed to contain escaped special characters (\c{\\\\}, \c{\\\{} and \c{\\\}}), but should not contain any other Halibut markup. It is intended to be a word or two of ordinary text. (This also applies to keywords used in other commands, such as \c{\\B} and \c{\\C}). \S2{input-list-description} \i\c{\\dt} and \i\c{\\dd}: \ii{Description lists} To write a description list, you prefix alternate paragraphs with the \c{\\dt} (\q{described thing}) and \c{\\dd} (description) commands. For example: \c \dt Pelican \c \c \dd This is a large bird with a big beak. \c \c \dt Panda \c \c \dd This isn't. This produces the following output: \quote{ \dt Pelican \dd This is a large bird with a big beak. \dt Panda \dd This isn't. } If you really want to, you are allowed to use \c{\\dt} and \c{\\dd} without strictly interleaving them (multiple consecutive \c{\\dt}s or consecutive \c{\\dd}s, or a description list starting with \c{\\dd} or ending with \c{\\dt}). This is probably most useful if you are listing a sequence of things with \c{\\dt}, but only some of them actually need \c{\\dd} descriptions. You should \e{not} use multiple consecutive \c{\\dd}s to provide a multi-paragraph definition of something; that's what \c{\\lcont} is for, as explained in \k{input-list-continuation}. \S2{input-list-continuation} \ii{Continuing list items} into further paragraphs All three of the above list types assume that each list item is a single paragraph. For a short, snappy list in which each item is likely to be only one or two words, this is perfectly sufficient; but occasionally you will find you want to include several paragraphs in a single list item, or even to \I{nested lists}nest other types of paragraph (such as code paragraphs, or other lists) inside a list item. To do this, you use the \i\c{\\lcont} command. This is a command which can span \e{multiple} paragraphs. After the first paragraph of a list item, include the text \c{\\lcont\{}. This indicates that the subsequent paragraph(s) are a \e{continuation} of the list item that has just been seen. So you can include further paragraphs, and eventually include a closing brace \c{\}} to finish the list continuation. After that, you can either continue adding other items to the original list, or stop immediately and return to writing normal paragraphs of text. Here's a (long) example. \c Here's a list: \c \c \n One. This item is followed by a code paragraph: \c \c \lcont{ \c \c \c code \c \c paragraph \c \c } \c \c \n Two. Now when I say \q{two}, I mean: \c \c \lcont{ \c \c \n Two, part one. \c \c \n Two, part two. \c \c \n Two, part three. \c \c } \c \c \n Three. The output produced by this fragment is: \quote{ Here's a list: \n One. This item is followed by a code paragraph: \lcont{ \c code \c paragraph } \n Two. Now when I say \q{two}, I mean: \lcont{ \n Two, part one. \n Two, part two. \n Two, part three. } \n Three. } This syntax might seem a little bit inconvenient, and perhaps counter-intuitive: you might expect the enclosing braces to have to go around the \e{whole} list item, rather than everything except the first paragraph. \c{\\lcont} is a recent addition to the Halibut input language; previously, \e{all} lists were required to use no more than one paragraph per list item. So it's certainly true that this feature looks like an afterthought because it \e{is} an afterthought, and it's possible that if I'd been designing the language from scratch with multiple-paragraph list items in mind, I would have made it look different. However, the advantage of doing it this way is that no enclosing braces are required in the \e{common} case: simple lists with only one paragraph per item are really, really easy to write. So I'm not too unhappy with the way it turned out; it obeys the doctrine of making simple things simple, and difficult things possible. Note that \c{\\lcont} can only be used on \c{\\b}, \c{\\n} and \c{\\dd} paragraphs; it cannot be used on \c{\\dt}. \S{input-rule} \i\c{\\rule}: \ii{Horizontal rules} The command \c{\\rule}, appearing on its own as a paragraph, will cause a horizontal rule to be drawn, like this: \c Some text. \c \c \rule \c \c Some more text. This produces the following output: \quote{ Some text. \rule Some more text. } \S{input-quote} \i\c{\\quote}: \ii{Indenting multiple paragraphs} as a long \i{quotation} Quoting verbatim text using a code paragraph (\k{input-codepara}) is not always sufficient for your quoting needs. Sometimes you need to quote some normally formatted text, possibly in multiple paragraphs. This is similar to HTML's \i\cw{
} command. To do this, you can use the \c{\\quote} command. Like \c{\\lcont}, this is a command which expects to enclose at least one paragraph and possibly more. Simply write \c{\\quote\{} at the beginning of your quoted section, and \c{\}} at the end, and the paragraphs in between will be formatted to indicate that they are a quotation. (This very manual, in fact, uses this feature a lot: all of the examples of Halibut input followed by Halibut output have the output quoted using \c{\\quote}.) Here's some example Halibut input: \c In \q{Through the Looking Glass}, Lewis Carroll wrote: \c \c \quote{ \c \c \q{The question is,} said Alice, \q{whether you \e{can} make \c words mean so many different things.} \c \c \q{The question is,} said Humpty Dumpty, \q{who is to be \c master - that's all.} \c \c } \c \c So now you know. The output generated by this is: \quote{ In \q{Through the Looking Glass}, Lewis Carroll wrote: \quote{ \q{The question is,} said Alice, \q{whether you \e{can} make words mean so many different things.} \q{The question is,} said Humpty Dumpty, \q{who is to be master - that's all.} } So now you know. } \S{input-sections} \I{\\C-upper}\c{\\C}, \i\c{\\H}, \I{\\S-upper}\c{\\S}, \i\c{\\A}, \I{\\U-upper}\c{\\U}: Chapter and \i{section headings} \K{intro-features} mentions that Halibut \I{section numbering}numbers the sections of your document automatically, and can generate cross-references to them on request; \k{input-xref} describes the \c{\\k} and \c{\\K} commands used to generate the cross-references. This section describes the commands used to set up the sections in the first place. A paragraph beginning with the \c{\\C} command defines a chapter heading. The \c{\\C} command expects to be followed by a pair of braces containing a keyword for the chapter; this keyword can then be used with the \c{\\k} and \c{\\K} commands to generate cross-references to the chapter. After the closing brace, the rest of the paragraph is used as the displayed chapter title. So the heading for the current chapter of this manual, for example, is written as \c \C{input} Halibut input format and this allows me to use the command \c{\\k\{input\}} to generate a cross-reference to that chapter somewhere else. The \I{keyword syntax}keyword you supply after one of these commands is allowed to contain escaped special characters (\c{\\\\}, \c{\\\{} and \c{\\\}}), but should not contain any other Halibut markup. It is intended to be a word or two of ordinary text. (This also applies to keywords used in other commands, such as \c{\\B} and \c{\\n}). The next level down from \c{\\C} is \c{\\H}, for \q{heading}. This is used in exactly the same way as \c{\\C}, but section headings defined with \c{\\H} are considered to be part of a containing chapter, and will be numbered with a pair of numbers. After \c{\\H} comes \c{\\S}, and if necessary you can then move on to \c{\\S2}, \c{\\S3} and so on. For example, here's a sequence of heading commands. Normally these commands would be separated at least by blank lines (because each is a separate paragraph), and probably also by body text; but for the sake of brevity, both of those have been left out in this example. \c \C{foo} Using Foo \c \H{foo-intro} Introduction to Foo \c \H{foo-running} Running the Foo program \c \S{foo-inter} Running Foo interactively \c \S{foo-batch} Running Foo in batch mode \c \H{foo-trouble} Troubleshooting Foo \c \C{bar} Using Bar instead of Foo This would define two chapters with keywords \c{foo} and \c{bar}, which would end up being called Chapter 1 and Chapter 2 (unless there were other chapters before them). The sections \c{foo-intro}, \c{foo-running} and \c{foo-trouble} would be referred to as Section 1.1, Section 1.2 and Section 1.3 respectively; the subsections \c{foo-inter} and \c{foo-batch} would be Section 1.2.1 and Section 1.2.2. If there had been a \i\c{\\S2} command within one of those, it would have been something like Section 1.2.1.1. If you don't like the switch from \c{\\H} to \c{\\S}, you can use \c{\\S1} as a synonym for \c{\\S} and \c{\\S0} as a synonym for \c{\\H}. Chapters are still designated with \c{\\C}, because they need to be distinguished from other types of chapter such as appendices. (Personally, I like the \c{\\C},\c{\\H},\c{\\S} notation because it encourages me to think of my document as a hard disk :-) You can define an \i{appendix} by using \c{\\A} in place of \c{\\C}. This is no different from a chapter except that it's given a letter instead of a number, and cross-references to it will say \q{Appendix A} instead of \q{Chapter 9}. Subsections of an appendix will be numbered \q{A.1}, \q{A.2}, \q{A.2.1} and so on. \I{renaming sections}If you want a particular section to be referred to as something other than a \q{chapter}, \q{section} or \q{appendix}, you can include a second pair of braces after the keyword. For example, if you're \i{writing a FAQ} chapter and you want cross-references between questions to refer to \q{question 1.2.3} instead of \q{section 1.2.3}, you can write each section heading as \c \S{question-about-fish}{Question} What about fish? (The word \q{Question} should be given with an initial capital letter. Halibut will lower-case it when you refer to it using \c{\\k}, and will leave it alone if you use \c{\\K}.) This technique allows you to change the designation of \e{particular} sections. To make an overall change in what \e{every} section is called, see \k{input-config}. Finally, the \c{\\U} command defines an \I{unnumbered chapter}\e{unnumbered} chapter. These sometimes occur in books, for specialist purposes such as \q{Bibliography} or \q{Acknowledgements}. \c{\\U} does not expect a keyword argument, because there is no sensible way to generate an automatic cross-reference to such a chapter anyway. \S{input-blurb} \c{\\copyright}, \c{\\title}, \c{\\versionid}: Miscellaneous \i{blurb commands} These three commands define a variety of \i{special paragraph types}. They are all used in the same way: you put the command at the start of a paragraph, and then just follow it with normal text, like this: \c \title My First Manual The three special paragraph types are: \dt \i\cw{\\title} \dd This defines the overall title of the entire document. This title is treated specially in some output formats (for example, it's used in a \cw{} tag in the HTML output), so it needs a special paragraph type to point it out. \dt \i\cw{\\copyright} \dd This command indicates that the paragraph attached to it contains a \i{copyright statement} for the document. This text is displayed inline where it appears, exactly like a normal paragraph; but in some output formats it is given additional special treatment. For example, Windows Help files have a standard slot in which to store a copyright notice, so that other software can display it prominently. \dt \i\cw{\\versionid} \dd This command indicates that the paragraph contains a version identifier, such as those produced by CVS (of the form \c{$\#{hope this defuses CVS}Id: thingy.but,v 1.6 2004/01/01 16:47:48 simon Exp $}). This text will be tucked away somewhere unobtrusive, so that anyone wanting to (for example) report errors to the document's author can pick out the \i{version IDs} and send them as part of the report, so that the author can tell at a glance which revision of the document is being discussed. \S{input-commentpara} \i\c{\\#}: Whole-paragraph \i{comments} \K{input-inline-comment} describes the use of the \c{\\#} command to put a short comment in the middle of a paragraph. If you need to use a \e{long} comment, Halibut also allows you to use \c{\\#} without braces, to indicate that an entire paragraph is a comment, like this: \c Here's a (fairly short) paragraph which will be displayed. \c \c \# Here's a comment paragraph which will not be displayed, no \c matter how long it goes on. All I needed to indicate this was \c the single \# at the start of the paragraph; I don't need one \c on every line or anything like that. \c \c Here's another displayed paragraph. When run through Halibut, this produces the following output: \quote{ Here's a (fairly short) paragraph which will be displayed. \# Here's a comment paragraph which will not be displayed, no matter how long it goes on. All I needed to indicate this was the single \# at the start of the paragraph; I don't need one on every line or anything like that. Here's another displayed paragraph. } \H{input-biblio} Creating a \i{bibliography} If you need your document to refer to other documents (research papers, books, websites, whatever), you might find a bibliography feature useful. You can define a bibliography entry using the \I{\\B-upper}\c{\\B} command. This looks very like the \c{\\C} command and friends: it expects a keyword in braces, followed by some text describing the document being referred to. For example: \c \B{freds-book} \q{The Taming Of The Mongoose}, by Fred Bloggs. \c Published by Paperjam & Notoner, 1993. If this bibliography entry appears in the finished document, it will look something like this: \quote{ \B{freds-book} \q{The Taming Of The Mongoose}, by Fred Bloggs. Published by Paperjam & Notoner, 1993. } I say \q{if} above because not all bibliography entries defined using the \c{\\B} command will necessarily appear in the finished document. They only appear if they are \I{citation}referred to by a \i\c{\\k} command (see \k{input-xref}). This allows you to (for example) maintain a single Halibut source file with a centralised database of \e{all} the references you have ever needed in any of your writings, include that file in every document you feed to Halibut, and have it only produce the bibliography entries you actually need for each particular document. (In fact, you might even want this centralised source file to be created automatically by, say, a Perl script from BibTeX input, so that you can share the same bibliography with users of other formatting software.) If you really want a bibliography entry to appear in the document even though no text explicitly refers to it, you can do that using the \i\c{\\nocite} command: \c \nocite{freds-book} Normally, each bibliography entry will be referred to (in citations and in the bibliography itself) by a simple reference number, such as \k{freds-book}. If you would rather use an alternative reference notation, such as [Fred1993], you can use the \i\c{\\BR} (\q{Bibliography Rewrite}) command to specify your own reference format for a particular book: \c \BR{freds-book} [Fred1993] The keyword you supply after \c{\\B} is allowed to contain escaped special characters (\c{\\\\}, \c{\\\{} and \c{\\\}}), but should not contain any other Halibut markup. It is intended to be a word or two of ordinary text. (This also applies to keywords used in other commands, such as \c{\\n} and \c{\\C}). \H{input-index} Creating an \i{index} Halibut contains a comprehensive indexing mechanism, which attempts to be reasonably easy to use in the common case in spite of its power. \S{input-index-simple} Simple indexing In normal usage, you should be able to add index terms to your document simply by using the \i\c{\\i} command to wrap one or two words at a time. For example, if you write \c The \i{hippopotamus} is a particularly large animal. then the index will contain an entry under \q{hippopotamus}, pointing to that sentence (or as close to that sentence as the output format sensibly permits). You can wrap more than one word in \c{\\i} as well: \c We recommend using a \i{torque wrench} for this job. \S{input-index-special} Special cases of indexing If you need to index a computer-related term, you can use the special case \i\c{\\i\\c} (or \i\c{\\i\\cw} if you prefer): \c The \i\c{grep} command is what you want here. This will cause the word \q{grep} to appear in code style, as if the \c{\\i} were not present and the input just said \c{\\c\{grep\}}; the word will also appear in code style in the actual index. If you want to simultaneously index and emphasise a word, there's another special case \i\c{\\i\\e} (and similarly \i\c{\\i\\s}): \c This is what we call a \i\e{paper jam}. This will cause the words \q{paper jam} to be emphasised in the document, but (unlike the behaviour of \c{\\i\\c}) they will \e{not} be emphasised in the index. This different behaviour is based on an expectation that most people indexing a word of computer code will still want it to look like code in the index, whereas most people indexing an emphasised word will \e{not} want it emphasised in the index. (In fact, \e{no} emphasis in the text inside \c{\\i} will be preserved in the index. If you really want a term in the index to appear emphasised, you must say so explicitly using \c{\\IM}; see \k{input-index-rewrite}.) Sometimes you might want to index a term which is not explicitly mentioned, but which is highly relevant to the text and you think that somebody looking up that term in the index might find it useful to be directed here. To do this you can use the \I{\\I-upper}\c{\\I} command, to create an \i{\e{invisible} index tag}: \c If your printer runs out of toner, \I{replacing toner \c cartridge}here is what to do: This input will produce only the output \q{If your printer runs out of toner, here is what to do}; but an index entry will show up under \q{replacing toner cartridge}, so that if a user thinks the obvious place to start in the index is under R for \q{replacing}, they will find their way here with a minimum of fuss. (It's worth noting that there is no functional difference between \c{\\i\{foo\}} and \c{\\I\{foo\}foo}. The simple \c{\\i} case is only a shorthand for the latter.) Finally, if you want to index a word at the start of a sentence, you might very well not want it to show up with a capital letter in the index. For this, Halibut provides the \i\c{\\ii} command, for \q{index (case-)insensitively}. You use it like this: \c \ii{Lions} are at the top of the food chain in this area. This is equivalent to \c{\\I\{lions\}Lions}; in other words, the text will say \q{Lions}, but it will show up in the index as \q{lions}. The text inside \c{\\ii} is converted entirely into lower case before being added to the index data. \S{input-index-rewrite} \ii{Fine-tuning the index} Halibut's index mechanism as described so far still has a few problems left: \b In a reasonably large index, it's often difficult to predict \I{replicating index terms}which of several words a user will think of first when trying to look something up. For example, if they want to know how to replace a toner cartridge, they might look up \q{replacing} or they might look up \q{toner cartridge}. You probably don't really want to have to try to figure out which of those is more likely; instead, what you'd like is to be able to effortlessly index the same set of document locations under \e{both} terms. \b Also, you may find you've indexed the same concept under multiple different \I{merging index terms}index terms; for example, there might be several instances of \c{\\i\{frog\}} and several of \c{\\i\{frogs\}}, so that you'd end up with two separate index entries for what really ought to be the same concept. \b You might well not want the word \cq{grep} to appear in the index without explanation; you might prefer it to say something more \I{rewriting index terms}verbose such as \q{\cw{grep} command}, so that a user encountering it in the index has some idea of what it is \e{without} having to follow up the reference. However, you certainly don't want to have to write \c{\\I\{\\cw\{grep\} command\}\\c\{grep\}} every time you want to add an index term for this! You wanted to write \c{\\i\\c\{grep\}} as shown in the previous section, and tidy it all up afterwards. All of these problems can be cleaned up by the \i\c{\\IM} (for \q{Index Modification}) command. \c{\\IM} expects to be followed by one or more pairs of braces containing index terms as seen in the document, and then a piece of text (not in braces) describing how it should be shown in the index. So to rewrite the \c{grep} example above, you might do this: \c \IM{grep} \cw{grep} command This will arrange that the set of places in the document where you asked Halibut to index \cq{grep} will be listed under \q{\cw{grep} command} rather than just under \cq{grep}. You can specify more than one index term in a \c{\\IM} command; so to merge the index terms \q{frog} and \q{frogs} into a single term, you might do this: \c \IM{frog}{frogs} frog This will arrange that the single index entry \q{frog} will list \e{all} the places in the document where you asked Halibut to index either \q{frog} or \q{frogs}. You can use multiple \c{\\IM} commands to replicate the same set of document locations in more than one index entry. For example: \c \IM{replacing toner cartridge} replacing toner cartridge \c \IM{replacing toner cartridge} toner cartridge, replacing This will arrange that every place in the document where you have indexed \q{replacing toner cartridge} will be listed both there \e{and} under \q{toner cartridge, replacing}, so that no matter whether the user looks under R or under T they will stil find their way to the same parts of the document. In this example, note that although the first \c{\\IM} command \e{looks} as if it's a tautology, it is still necessary, because otherwise those document locations will \e{only} be indexed under \q{toner cartridge, replacing}. If you have \e{no} explicit \c{\\IM} commands for a particular index term, then Halibut will assume a default one (typically \c{\\IM\{foo\}\_foo}, although it might be \c{\\IM\{foo\}\_\\c\{foo\}} if you originally indexed using \c{\\i\\c}); but as soon as you specify an explicit \c{\\IM}, Halibut discards its default implicit one, and you must then specify that one explicitly as well if you wanted to keep it. \S{input-index-case} Indexing terms that differ only in case The \e{tags} you use to define an index term (that is, the text in the braces after \c{\\i}, \c{\\I} and \c{\\IM}) are treated case-insensitively by Halibut. So if, as in this manual itself, you need two index terms that differ only in case, doing this will not work: \c The \i\c{\\c} command defines computer code. \c \c The \i\c{\\C} command defines a chapter. Halibut will treat these terms as the same, and will fold the two sets of references into one combined list (although it will warn you that it is doing this). The idea is to ensure that people who forget to use \c{\\ii} find out about it rather than Halibut silently generating a bad index; checking an index for errors is very hard work, so Halibut tries to avoid errors in the first place as much as it can. If you do come across this situation, you will need to define two distinguishable index terms. What I did in this manual was something like this: \c The \i\c{\\c} command defines computer code. \c \c The \I{\\C-upper}\c{\\C} command defines a chapter. \c \c \IM{\\C-upper} \c{\\C} The effect of this will be two separate index entries, one reading \c{\\c} and the other reading \c{\\C}, pointing to the right places. \H{input-config} \ii{Configuring} Halibut Halibut uses the \i\c{\\cfg} command to allow you to configure various aspects of its functionality. The \c{\\cfg} command expects to be followed by at least one pair of braces, and usually more after that. The first pair of braces contains a keyword indicating what aspect of Halibut you want to configure, and the meaning of the one(s) after that depends on the first keyword. Each output format supports a range of configuration options of its own (and some configuration is shared between similar output formats - the PDF and PostScript formats share most of their configuration, as described in \k{output-paper}). The configuration keywords for each output format are listed in the manual section for that format; see \k{output}. There are also a small number of configuration options which apply across all output formats: \dt \I\cw{\\cfg\{chapter\}}\cw{\\cfg\{chapter\}\{}\e{new chapter name}\cw{\}} \dd This tells Halibut that you don't want to call a chapter a \I{renaming sections}\I{configuring heading display}chapter any more. For example, if you give the command \cw{\\cfg\{chapter\}\{Book\}}, then any chapter defined with the \c{\\C} command will be labelled \q{Book} rather than \q{Chapter}, both in the section headings and in cross-references. This is probably most useful if your document is not written in English. \lcont{ Your replacement name should be given with a capital letter. Halibut will leave it alone if it appears at the start of a sentence (in a chapter title, or when \c{\\K} is used), and will lower-case it otherwise (when \c{\\k} is used). } \dt \I\cw{\\cfg\{section\}}\cw{\\cfg\{section\}\{}\e{new section name}\cw{\}} \dd Exactly like \c{chapter}, but changes the name given to subsections of a chapter. \dt \I\cw{\\cfg\{appendix\}}\cw{\\cfg\{appendix\}\{}\e{new appendix name}\cw{\}} \dd Exactly like \c{chapter}, but changes the name given to appendices. \dt \I\cw{\\cfg\{contents\}}\cw{\\cfg\{contents\}\{}\e{new contents name}\cw{\}} \dd This changes the name given to the contents section (by default \q{Contents}) in back ends which generate one. \dt \I\cw{\\cfg\{index\}}\cw{\\cfg\{index\}\{}\e{new index name}\cw{\}} \dd This changes the name given to the index section (by default \q{Index}) in back ends which generate one. \dt \I\cw{\\cfg\{input-charset\}}\cw{\\cfg\{input-charset\}\{}\e{character set name}\cw{\}} \dd This tells Halibut what \i{character set} you are writing your input file in. By default, it is assumed to be US-ASCII (meaning \e{only} plain \i{ASCII}, with no accented characters at all). \lcont{ You can specify any well-known name for any supported character set. For example, \c{iso-8859-1}, \c{iso8859-1} and \c{iso_8859-1} are all recognised, \c{GB2312} and \c{EUC-CN} both work, and so on. (You can list character sets known to Halibut with by invoking it with the \cw{--list-charsets} option; see \k{running-options}.) This directive takes effect immediately after the \c{\\cfg} command. All text after that until the end of the input file is expected to be in the new character set. You can even change character set several times within a file if you really want to. When Halibut reads the input file, everything you type will be converted into \i{Unicode} from the character set you specify here, will be processed as Unicode by Halibut internally, and will be written to the various output formats in whatever character sets they deem appropriate. } \dt \I\cw{\\cfg\{quotes\}}\cw{\\cfg\{quotes\}\{}\e{open-quote}\cw{\}\{}\e{close-quote}\cw{\}}[\cw{\{}\e{open-quote}\cw{\}\{}\e{close-quote}...\cw{\}}] \dd This specifies the quote characters which should be used. You should separately specify the open and close quote marks; each quote mark can be one character (\cw{\\cfg\{quotes\}\{`\}\{'\}}), or more than one (\cw{\\cfg\{quotes\}\{<<\}\{>>\}}). \lcont{ \cw{\\cfg\{quotes\}} can be overridden by configuration directives for each individual backend (see \k{output}); it is a convenient way of setting quote characters for all backends at once. All backends use these characters in response to the \c{\\q} command (see \k{input-quotes}). Some (such as the text backend) use them for other purposes too. You can specify multiple fallback options in this command (a pair of open and close quotes, each in their own braces, then another pair, then another if you like), and Halibut will choose the first pair which the output character set supports (Halibut will always use a matching pair). (This is to allow you to configure quote characters once, generate output in several different character sets, and have Halibut constantly adapt to make the best use of the current encoding.) For example, you might write \c \cfg{quotes}{\u201c}{\u201d}{"}{"} and Halibut would use the Unicode matched double quote characters if possible, and fall back to ASCII double quotes otherwise. If the output character set were to contain U+201C but not U+201D, then Halibut would fall back to using the ASCII double quote character as \e{both} open and close quotes. (No known character set is that silly; I mention it only as an example.) \cw{\\cfg\{quotes\}} (and the backend-specific versions) apply to the \e{entire} output; it's not possible to change quote characters partway through the output. } In addition to these configuration commands, there are also configuration commands provided by each individual output format. These configuration commands are discussed along with each output format, in \k{output}. The \i{default settings} for the above options are: \c \cfg{chapter}{Chapter} \c \cfg{section}{Section} \c \cfg{appendix}{Appendix} \c \cfg{contents}{Contents} \c \cfg{index}{Index} \c \cfg{input-charset}{ASCII} The default for \cw{\\cfg\{input-charset\}} can be changed with the \cw{--input-charset} option; see \k{running-options}. The default settings for \cw{\\cfg\{quotes\}} are backend-specific; see \k{output}. \H{input-macro} Defining \i{macros} If there's a complicated piece of Halibut source which you think you're going to use a lot, you can define your own Halibut command to produce that piece of source. In \k{input-unicode}, there is a sample piece of code which prints a Euro sign, or replaces it with \q{EUR} if the Euro sign is not available: \c This is likely to cost \u20AC{EUR\_}2500 at least. If your document quotes a \e{lot} of prices in Euros, you might not want to spend all your time typing that out. So you could define a macro, using the \i\c{\\define} command: \c \define{eur} \u20AC{EUR\_} Your macro names may include Roman alphabetic characters (\c{a}-\c{z}, \c{A}-\c{Z}) and ordinary Arabic numerals (\c{0}-\c{9}), but nothing else. (This is general \I{command syntax}syntax for all of Halibut's commands, except for a few special ones such as \c{\\_} and \c{\\-} which consist of a single punctuation character only.) Then you can just write ... \c This is likely to cost \eur 2500 at least. ... except that that's not terribly good, because you end up with a space between the Euro sign and the number. (If you had written \c{\\eur2500}, Halibut would have tried to interpret it as a macro command called \c{eur2500}, which you didn't define.) In this case, it's helpful to use the special \i\c{\\.} command, which is defined to \I{NOP}\I{doing nothing}do nothing at all! But it acts as a separator between your macro and the next character: \c This is likely to cost \eur\.2500 at least. This way, you will see no space between the Euro sign and the number (although, of course, there will be space between \q{EUR} and the number if the Euro sign is not available, because the macro definition specifically asked for it). ����������������������������halibut-1.1/doc/intro.but���������������������������������������������������������������������������0000644�0001753�0001753�00000003362�12444773746�012374� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������\C{intro} Introduction to Halibut Halibut is a multi-format documentation processing system. What that means is that you write your document once, in Halibut's input format, and then the Halibut program processes it into several output formats which all contain the same text. So, for example, if you want your application to have a Windows help file, and you also want the same documentation available in HTML on your web site, Halibut can do that for you. \H{intro-formats} Output formats supported by Halibut Currently Halibut supports the following output formats: \b Plain ASCII text. \b HTML. \b Unix \cw{man} page format. \b GNU Info format. \b PDF. \b PostScript. \b Old-style Windows Help (\cw{.HLP}). (By setting suitable options, the HTML output can also be made suitable for feeding to the newer-style Windows HTML Help compiler.) \H{intro-features} Features supported by Halibut Here's a list of Halibut's notable features. \b Halibut automatically assigns sequential numbers to your chapters, sections and subsections, and keeps track of them for you. You supply a \e{keyword} for each section, and then you can generate cross-references to that section using the keyword, and Halibut will substitute the correct section number. Also, in any output format where it makes sense, the cross-references will be hyperlinks to that section of the document. \b Halibut has some support for Unicode: you can include arbitrary Unicode characters in your document, and specify fallback text in case any output format doesn't support that character. \b Halibut's indexing support is comprehensive and carefully designed. It's easy to use in the simple case, but has powerful features that should make it possible to maintain a high-quality and useful index. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/doc/licence.but�������������������������������������������������������������������������0000644�0001753�0001753�00000003525�12444773746�012644� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������\A{licence} Halibut Licence Halibut is copyright (c) 1999-2007 Simon Tatham. 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. Halibut contains font metrics derived from the \e{Font Metrics for PDF Core 14 Fonts}, which carry the following copyright notice and licence: \quote{ Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/doc/manpage.but�������������������������������������������������������������������������0000644�0001753�0001753�00000012221�12444773746�012643� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������\cfg{man-identity}{halibut}{1}{2004-04-08}{Halibut}{Simon Tatham} \cfg{man-mindepth}{1} \A{manpage} Halibut \cw{man} page \H{manpage-name} NAME \cw{halibut} \u2013{\u2212{-}} multi-format documentation formatting tool \H{manpage-synopsis} SYNOPSIS \c halibut [options] file1.but [file2.but ...] \e bbbbbbb iiiiiii iiiiiiiii iiiiiiiii \H{manpage-description} DESCRIPTION \c{halibut} reads the given set of input files, assembles them into a document, and outputs that document in one or more formats. The available command-line options can configure what formats Halibut should output in, and can also configure other things about the way Halibut works. \H{manpage-options} OPTIONS The command-line options supported by \c{halibut} are: \dt \cw{--text}[\cw{=}\e{filename}] \dd Makes Halibut generate an output file in plain text format. If the optional \e{filename} parameter is supplied, the output text file will be given that name. Otherwise, the name of the output text file will be as specified in the input files, or \c{output.txt} if none is specified at all. \dt \cw{--html}[\cw{=}\e{filename}] \dd Makes Halibut generate one or more output files in HTML format. If the optional \e{filename} parameter is supplied, there will be precisely one HTML output file with that name, containing the whole document. Otherwise, there may be one or more than one HTML file produced as output; this, and the file names, will be as specified in the input files, or given a set of default names starting with \c{Contents.html} if none is specified at all. \dt \cw{--winhelp}[\cw{=}\e{filename}] \dd Makes Halibut generate an output file in Windows Help format. If the optional \e{filename} parameter is supplied, the output help file will be given that name. Otherwise, the name of the output help file will be as specified in the input files, or \c{output.hlp} if none is specified at all. \lcont{ The output help file must have a name ending in \c{.hlp}; if it does not, \c{.hlp} will be added. A secondary contents file will be created alongside the main help file, with the same name except that it will end in \c{.cnt} (for example \c{output.cnt}, if the main file is \c{output.hlp}). } \dt \cw{--man}[\cw{=}\e{filename}] \dd Makes Halibut generate an output file in Unix \cw{man} page format. If the optional \e{filename} parameter is supplied, the output \cw{man} page will be given that name. Otherwise, the name of the output \cw{man} page will be as specified in the input files, or \c{output.1} if none is specified at all. \dt \cw{--info}[\cw{=}\e{filename}] \dd Makes Halibut generate an \c{info} file. If the optional \e{filename} parameter is supplied, the output \c{info} file will be given that name. Otherwise, the name of the output \c{info} file will be as specified in the input files, or \c{output.info} if none is specified at all. \lcont{ By default, unless configured otherwise using the \cw{\\cfg\{info-max-file-size\}\{0\}} directive, the \c{info} output will be split into multiple files. The main file will have the name you specify; the subsidiary files will have suffixes \c{-1}, \c{-2} etc. } \dt \cw{--pdf}[\cw{=}\e{filename}] \dd Makes Halibut generate an output file in PDF format. If the optional \e{filename} parameter is supplied, the PDF output file will be given that name. Otherwise, the name of the output PDF file will be as specified in the input files, or \c{output.pdf} if none is specified at all. \dt \cw{--ps}[\cw{=}\e{filename}] \dd Makes Halibut generate an output file in PostScript format. If the optional \e{filename} parameter is supplied, the PostScript output file will be given that name. Otherwise, the name of the output PostScript file will be as specified in the input files, or \c{output.ps} if none is specified at all. \dt \cw{-C}\e{word}\cw{:}\e{word}[\cw{:}\e{word}...] \dd Adds a configuration directive to the input processed by Halibut. Using this directive is exactly equivalent to appending an extra input file to the command line which contains the directive \cw{\\cfg\{}\e{word}\cw{\}\{}\e{word}\cw{\}\{}\e{word}...\cw{\}}. \dt \cw{--input-charset}\cw{=}\e{charset} \dd Changes the assumed character set for input files from the default of ASCII. \dt \cw{--list-charsets} \dd Makes Halibut list character sets known to it. \dt \cw{--list-fonts} \dd Makes Halibut list fonts known to it, either intrinsically or by being passed as input files. \dt \cw{--precise} \dd Makes Halibut report the column number as well as the line number when it encounters an error in an input file. \dt \cw{--help} \dd Makes Halibut display a brief summary of its command-line options. \dt \cw{--version} \dd Makes Halibut report its version number. \dt \cw{--licence} \dd Makes Halibut display its licence (MIT). \H{manpage-more-information} MORE INFORMATION For more information on Halibut, including full details of the input file format, look in the full manual. If this is not installed locally on your system, you can also find it at the Halibut web site: \W{http://www.chiark.greenend.org.uk/~sgtatham/halibut/}\cw{http://www.chiark.greenend.org.uk/~sgtatham/halibut/} \H{manpage-bugs} BUGS This man page isn't terribly complete. \versionid Halibut version 1.1 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/doc/output.but��������������������������������������������������������������������������0000644�0001753�0001753�00000223777�12444773746�012617� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������\C{output} Halibut output formats This chapter describes each of Halibut's current \i{output formats}. It gives some general information about the format, and also describes all the \i{configuration directives} which are specific to that format. \H{output-text} Plain text This output format generates the document as a single \i{plain text} file. No table of contents or index is generated. The precise formatting of the text file can be controlled by a variety of configuration directives. They are listed in the following subsections. \S{output-text-file} Output file name \dt \I{\cw{\\cfg\{text-filename\}}}\cw{\\cfg\{text-filename\}\{}\e{filename}\cw{\}} \dd Sets the \i{output file name} in which to store the text file. This directive is implicitly generated if you provide a file name parameter after the command-line option \i\c{--text} (see \k{running-options}). \S{output-text-dimensions} Indentation and line width This section describes the configuration directives which control the \i{horizontal dimensions} of the output text file: how much paragraphs are indented by and how long the lines are. \dt \I{\cw{\\cfg\{text-width\}}}\cw{\\cfg\{text-width\}\{}\e{width}\cw{\}} \dd Sets the \I{text width}width of the main part of the document, in characters. This width will be used for wrapping paragraphs and for centring titles (if you have asked for titles to be centred - see \k{output-text-headings}). This width does \e{not} include the left indentation set by \cw{\\cfg\{text-indent\}}; if you specify an indent of 8 and a width of 64, your maximum output line length will be 72. \dt \I{\cw{\\cfg\{text-indent\}}}\cw{\\cfg\{text-indent\}\{}\e{indent}\cw{\}} \dd Sets the left \i{indentation} for the document. If you set this to zero, your document will look like an ordinary text file as someone with a text editor might have written it; if you set it above zero, the text file will have a \i{margin} down the left in the style of some printed manuals, and you can then configure the section numbers to appear in this margin (see \k{output-text-headings}). \dt \I{\cw{\\cfg\{text-indent-code\}}}\cw{\\cfg\{text-indent-code\}\{}\e{indent}\cw{\}} \dd Specifies how many extra characters of indentation (on top of the normal left indent) should be given to \I{code paragraphs, indentation} code paragraphs. \dt \I{\cw{\\cfg\{text-list-indent\}}}\cw{\\cfg\{text-list-indent\}\{}\e{indent}\cw{\}} \dd Specifies how many extra spaces should be used to indent the bullet or number in a \I{bulletted list, indentation}bulletted or \I{numbered list, indentation}numbered \I{list, indentation}list. The actual body of the list item will be indented by this much \e{plus} the value configured by \cw{\\cfg\{text-listitem-indent\}}. \dt \I{\cw{\\cfg\{text-listitem-indent\}}}\cw{\\cfg\{text-listitem-indent\}\{}\e{indent}\cw{\}} \dd Specifies how many extra spaces should be used to indent the body of a list item, over and above the number configured in \cw{\\cfg\{text-list-indent\}}. \dt \I{\cw{\\cfg\{text-indent-preamble\}}}\cw{\\cfg\{text-indent-preamble\}\{}\e{boolean}\cw{\}} \dd When this is set to \c{true}, the document \i{preamble} (i.e. any paragraphs appearing before the first chapter heading) will be indented to the level specified by \cw{\\cfg\{text-indent\}}. If this setting is \c{false}, the document preamble will not be indented at all from the left margin. \S{output-text-headings} \ii{Configuring heading display} The directives in this section allow you to configure the appearance of the title, chapter and section headings in your text file. Several of the directives listed below specify the \i{alignment} of a heading. These alignment options have three possible values: \dt \i\c{left} \dd Align the heading to the very left of the text file (column zero). \dt \i\c{leftplus} \dd Align the section title to the left of the main display region (in other words, indented to the level specified by \cw{\\cfg\{text-indent\}}). The section \e{number} is placed to the left of that (so that it goes in the margin if there is room). \dt \i\c{centre} \dd Centre the heading. Also, several of the directives below specify how a title should be \I{underlining}underlined. The parameter to one of these directives should be either blank (\cw{\{\}}) or a piece of text which will be repeated to produce the underline. So you might want to specify, for example, \cw{\\text-title-underline\{=\}} but \cw{\\text-chapter-underline\{\-\}}. You can also specify more than one underline setting, and Halibut will choose the first one that the output character set supports. So, for example, you could write \cw{\\text-chapter-underline\{\\u203e\}\{\-\}}, and Halibut would use the Unicode \q{OVERLINE} character where possible and fall back to the ASCII minus sign otherwise. \dt \I{\cw{\\cfg\{text-title-align\}}}\cw{\\cfg\{text-title-align\}\{}\e{alignment}\cw{\}} \dd Specifies the alignment of the overall document title: \c{left}, \c{leftplus} or \c{centre}. \dt \I{\cw{\\cfg\{text-title-underline\}}}\cw{\\cfg\{text-title-underline\}\{}\e{underline-text}\cw{\}} \dd Specifies how the overall document title should be underlined. \dt \I{\cw{\\cfg\{text-chapter-align\}}}\cw{\\cfg\{text-chapter-align\}\{}\e{alignment}\cw{\}} \dd Specifies the alignment of chapter and appendix headings. \dt \I{\cw{\\cfg\{text-chapter-underline\}}}\cw{\\cfg\{text-chapter-underline\}\{}\e{underline-text}\cw{\}} \dd Specifies how chapter and appendix headings should be underlined. \dt \I{\cw{\\cfg\{text-chapter-numeric\}}}\cw{\\cfg\{text-chapter-numeric\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{true}, then chapter headings will not contain the word \q{Chapter} (or whatever other word you have defined in its place - see \k{input-sections} and \k{input-config}); they will just contain the chapter \e{number}, followed by the chapter title. If you set this to \c{false}, chapter headings will be prefixed by \q{Chapter} or equivalent. \dt \I{\cw{\\cfg\{text-chapter-shownumber\}}}\cw{\\cfg\{text-chapter-shownumber\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{false}, then chapter headings will \e{only} contain the chapter title: they will not contain the word \q{Chapter} (or whatever other word you have defined in its place), and neither will they contain the chapter number. If set to \c{false}, this overrides \cw{\\cfg\{text-chapter-numeric\}}. \dt \I{\cw{\\cfg\{text-chapter-suffix\}}}\cw{\\cfg\{text-chapter-suffix\}\{}\e{text}\cw{\}} \dd This specifies the suffix text to be appended to the chapter number, before displaying the chapter title. For example, if you set this to \cq{:\_}, then the chapter title might look something like \q{Chapter 2: Doing Things}. \dt \I{\cw{\\cfg\{text-section-align\}}}\cw{\\cfg\{text-section-align\}\{}\e{level}\cw{\}\{}\e{alignment}\cw{\}} \dd Specifies the alignment of section headings at a particular level. The \e{level} parameter specifies which level of section headings you want to affect: 0 means first-level headings (\c{\\H}), 1 means second-level headings (\c{\\S}), 2 means the level below that (\c{\\S2}), and so on. The \e{alignment} parameter is treated just like the other alignment directives listed above. \dt \I{\cw{\\cfg\{text-section-underline\}}}\cw{\\cfg\{text-section-underline\}\{}\e{level}\cw{\}\{}\e{underline-text}\cw{\}} \dd Specifies how to underline section headings at a particular level. \dt \I{\cw{\\cfg\{text-section-numeric\}}}\cw{\\cfg\{text-section-numeric\}\{}\e{level}\cw{\}\{}\e{boolean}\cw{\}} \dd Specifies whether section headings at a particular level should contain the word \q{Section} or equivalent (if \c{false}), or should be numeric only (if \c{true}). \dt \I{\cw{\\cfg\{text-section-shownumber\}}}\cw{\\cfg\{text-section-shownumber\}\{}\e{level}\cw{\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{false}, then section headings at the specified level will \e{only} contain the section title: they will not contain the word \q{Section} (or whatever other word you have defined in its place), and neither will they contain the section number. If set to \c{false}, this overrides \cw{\\cfg\{text-section-numeric\}}. \dt \I{\cw{\\cfg\{text-section-suffix\}}}\cw{\\cfg\{text-section-suffix\}\{}\e{level}\cw{\}\{}\e{text}\cw{\}} \dd Specifies the \I{suffix text, in section titles}suffix text to be appended to section numbers at a particular level, before displaying the section title. \S{output-text-characters} Configuring the characters used \dt \I\cw{\\cfg\{text-charset\}}\cw{\\cfg\{text-charset\}\{}\e{character set name}\cw{\}} \dd This tells Halibut what \i{character set} the output should be in. Any Unicode characters representable in this set will be output verbatim; any other characters will not be output and their \i{fallback text} (if any) will be used instead. \lcont{ The character set names are the same as for \cw{\\cfg\{input-charset\}} (see \k{input-config}). However, unlike \cw{\\cfg\{input-charset\}}, this directive affects the \e{entire} output; it's not possible to switch encodings halfway through. } \dt \I{\cw{\\cfg\{text-bullet\}}}\cw{\\cfg\{text-bullet\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}...\cw{\}}] \dd This specifies the text which should be used as the \i{bullet} in bulletted lists. It can be one character (\cw{\\cfg\{text-bullet\}\{-\}}), or more than one (\cw{\\cfg\{text-bullet\}\{(*)\}}). \lcont{ Like \cw{\\cfg\{quotes\}} (see \k{input-config}), you can specify multiple possible options after this command, and Halibut will choose the first one which the output character set supports. For example, you might write \cw{\\cfg\{text-bullet\}\{\\u2022\}\{\\u00b7\}\{*\}}, in which case Halibut would use the Unicode \q{BULLET} character where possible, fall back to the ISO-8859-1 \q{MIDDLE DOT} if that wasn't available, and resort to the ASCII asterisk if all else failed. } \dt \I{\cw{\\cfg\{text-rule\}}}\cw{\\cfg\{text-rule\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}...\cw{\}}] \dd This specifies the text which should be used for drawing \i{horizontal rules} (generated by \i\c{\\rule}; see \k{input-rule}). It can be one character, or more than one. The string you specify will be repeated to reach the required width, so you can specify something like \cq{-=} to get a rule that looks like \cw{-=-=-=}. \lcont{ Like \cw{\\cfg\{text-bullet\}}, you can specify multiple fallback options in this command. } \dt \I{\cw{\\cfg\{text-quotes\}}}\cw{\\cfg\{text-quotes\}\{}\e{open-quote}\cw{\}\{}\e{close-quote}\cw{\}}[\cw{\{}\e{open-quote}\cw{\}\{}\e{close-quote}...\cw{\}}] \dd This specifies a set of quote characters for the text backend, overriding any defined by \cw{\\cfg\{quotes\}}. It has the same syntax (see \k{input-config}). \lcont{ In this backend, these quotes will also be used to mark text enclosed in the \c{\\c} command (see \k{input-code}). } \dt \I{\cw{\\cfg\{text-emphasis\}}}\cw{\\cfg\{text-emphasis\}\{}\e{start-emph}\cw{\}\{}\e{end-emph}\cw{\}}[\cw{\{}\e{start-emph}\cw{\}\{}\e{end-emph}...\cw{\}}] \dd This specifies the characters which should be used to surround emphasised text (written using the \c{\\e} command; see \k{input-emph}). \dt \I{\cw{\\cfg\{text-strong\}}}\cw{\\cfg\{text-strong\}\{}\e{start-strong}\cw{\}\{}\e{end-strong}\cw{\}}[\cw{\{}\e{start-strong}\cw{\}\{}\e{end-strong}...\cw{\}}] \dd This specifies the characters which should be used to surround strong text (written using the \c{\\s} command; see \k{input-emph}). \lcont{ You should separately specify the start-emphasis and end-emphasis text, each of which can be more than one character if you want. Also, like \cw{\\cfg\{text-quotes\}}, you can specify multiple pairs of fallback options in this command, and Halibut will always use a matching pair. } \S{output-text-misc} Miscellaneous configuration options \dt \I{\cw{\\cfg\{text-list-suffix\}}}\cw{\\cfg\{text-list-suffix\}\{}\e{text}\cw{\}} \dd This text is appended to the number on a \i{numbered list} item (see \k{input-list-number}). So if you want to label your lists as \q{1)}, \q{2)} and so on, then you would write \cw{\\cfg\{text-list-suffix\}\{)\}}. \dt \I{\cw{\\cfg\{text-versionid\}}}\cw{\\cfg\{text-versionid\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{true}, \i{version ID paragraphs} (defined using the \i\c{\\versionid} command - see \k{input-blurb}) will be included at the bottom of the text file. If it is set to \c{false}, they will be omitted completely. \# FIXME: code indentation is configurable, therefore \quote \# indentation probably ought to be as well. \# FIXME: text-indent-* should be consistently named. \S{output-text-defaults} Default settings The \i{default settings} for Halibut's plain text output format are: \c \cfg{text-filename}{output.txt} \c \c \cfg{text-width}{68} \c \cfg{text-indent}{7} \c \cfg{text-indent-code}{2} \c \cfg{text-list-indent}{1} \c \cfg{text-listitem-indent}{3} \c \cfg{text-indent-preamble}{false} \c \c \cfg{text-title-align}{centre} \c \cfg{text-title-underline}{\u2550}{=} \c \c \cfg{text-chapter-align}{left} \c \cfg{text-chapter-underline}{\u203e}{-} \c \cfg{text-chapter-numeric}{false} \c \cfg{text-chapter-shownumber}{true} \c \cfg{text-chapter-suffix}{: } \c \c \cfg{text-section-align}{0}{leftplus} \c \cfg{text-section-underline}{0}{} \c \cfg{text-section-numeric}{0}{true} \c \cfg{text-section-shownumber}{0}{true} \c \cfg{text-section-suffix}{0}{ } \c \c \cfg{text-section-align}{1}{leftplus} \c \cfg{text-section-underline}{1}{} \c \cfg{text-section-numeric}{1}{true} \c \cfg{text-section-shownumber}{1}{true} \c \cfg{text-section-suffix}{1}{ } \c \c ... and so on for all section levels below this ... \e iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii \c \c \cfg{text-charset}{ASCII} \c \cfg{text-bullet}{\u2022}{-} \c \cfg{text-rule}{\u2500}{-} \c \cfg{text-quotes}{\u2018}{\u2019}{`}{'} \c \cfg{text-emphasis}{_}{_} \c \c \cfg{text-list-suffix}{.} \c \cfg{text-versionid}{true} \H{output-html} HTML This output format generates an \i{HTML} version of the document. By default, this will be in multiple files, starting with \c{Contents.html} and splitting the document into files by chapter and/or subsection. You can configure precisely how the text is split between HTML files using the configuration commands described in this section. In particular, you can configure Halibut to output one single HTML file instead of multiple ones. \I{\cw{\\cfg\{xhtml-anything\}}}Configuration directives with an \c{xhtml-} prefix are synonyms for those with an \c{html-} prefix. \S{output-html-file} Controlling the output file names \dt \I{\cw{\\cfg\{html-contents-filename\}}}\cw{\\cfg\{html-contents-filename\}\{}\e{filename}\cw{\}} \dd Sets the \i{output file name} in which to store the top-level contents page. Since this is the first page a user ought to see when beginning to read the document, a good choice in many cases might be \c{index.html} (although this is not the default, for historical reasons). \dt \I{\cw{\\cfg\{html-index-filename\}}}\cw{\\cfg\{html-index-filename\}\{}\e{filename}\cw{\}} \dd Sets the file name in which to store the document's index. \dt \I{\cw{\\cfg\{html-template-filename\}}}\cw{\\cfg\{html-template-filename\}\{}\e{template}\cw{\}} \dd Provides a \i{template} to be used when constructing the file names of each chapter or section of the document. This template should contain at least one \i\e{formatting command}, in the form of a per cent sign followed by a letter. (If you need a literal per cent sign, you can write \c{%%}.) \lcont{ The formatting commands used in this template are: \dt \I{%N-upper}\c{%N} \dd Expands to the visible title of the section, with white space removed. So in a chapter declared as \cq{\\C\{fish\} Catching Fish}, this formatting command would expand to \cq{CatchingFish}. \dt \i\c{%n} \dd Expands to the type and number of the section, without white space. So in chapter 1 this would expand to \cq{Chapter1}; in section A.4.3 it would expand to \cq{SectionA.4.3}, and so on. If the section has no number (an unnumbered chapter created using \c{\\U}), this directive falls back to doing the same thing as \c{%N}. \dt \i\c{%b} \dd Expands to the number of the section, in a format suitable for an HTML fragment name. The first character of the section type is prepended to the section number. So in chapter 1 this would expand to \cq{C1}; in section A.4.3 it would expand to \cq{SA.4.3}, and so on. If the section has no number (an unnumbered chapter created using \c{\\U}), this directive falls back to doing the same thing as \c{%N}. \dt \i\c{%k} \dd Expands to the internal keyword specified in the section title. So in a chapter declared as \cq{\\C\{fish\} Catching Fish}, this formatting command would expand to \cq{fish}. If the section has no keyword (an unnumbered chapter created using \c{\\U}), this directive falls back to doing the same thing as \c{%N}. These formatting directives can also be used in the \cw{\\cfg\{html-template-fragment\}} configuration directive (see \k{output-html-misc}). } \dt \I{\cw{\\cfg\{html-single-filename\}}}\cw{\\cfg\{html-single-filename\}\{}\e{filename}\cw{\}} \dd Sets the file name in which to store the entire document, if Halibut is configured (using \c{\\cfg\{html-leaf-level\}\{0\}}) to produce a single self-contained file. Both this directive \e{and} \c{\\cfg\{html-leaf-level\}\{0\}} are implicitly generated if you provide a file name parameter after the command-line option \i\c{--html} (see \k{running-options}). \S{output-html-split} Controlling the splitting into HTML files By default, the HTML output from Halibut is split into multiple files. Each file typically contains a single chapter or section and everything below it, unless subsections of that chapter are themselves split off into further files. Most files also contain a contents section, giving hyperlinks to the sections in the file and/or the sections below it. The configuration directives listed below allow you to configure the splitting into files, and the details of the contents sections. \dt \I{\cw{\\cfg\{html-leaf-level\}}}\cw{\\cfg\{html-leaf-level\}\{}\e{depth}\cw{\}} \dd This setting indicates the depth of section which should be given a \I{leaf file}\q{leaf} file (a file with no sub-files). So if you set it to 1, for example, then every chapter will be given its own HTML file, plus a top-level \i{contents file}. If you set this to 2, then each chapter \e{and} each \c{\\H} section will have a file, and the chapter files will mostly just contain links to their \i{sub-file}s. \lcont{ If you set this option to zero, then the whole document will appear in a single file. If you do this, Halibut will call that file \i\c{Manual.html} instead of \i\c{Contents.html} by default. This option is automatically set to zero if you provide a file name parameter after the command-line option \i\c{--html} (see \k{running-options}), because you have specified a single file name and so Halibut assumes you want the whole document to be placed in that file. You can also specify the special name \c{infinity} (or \c{infinite} or \c{inf}) if you want to ensure that \e{every} section and subsection ends up in a separate file no matter how deep you go. } \dt \I{\cw{\\cfg\{html-contents-depth\}}}\cw{\\cfg\{html-contents-depth\}\{}\e{level}\cw{\}\{}\e{depth}\cw{\}} \dd This directive allows you to specify how \I{depth of contents}deep any contents section in a particular level of file should go. \lcont{ The \e{level} parameter indicates which level of contents section you are dealing with. 0 denotes the main contents section in the topmost file \c{Contents.html}; 1 denotes a contents section in a chapter file; 2 is a contents section in a file containing a \c{\\H} heading, and so on. The \e{depth} parameter indicates the maximum depth of heading which will be shown in this contents section. Again, 1 denotes a chapter, 2 is a \c{\\H} heading, 3 is a \c{\\S} heading, and so on. So, for example: \cw{\\cfg\{html-contents-depth\}\{1\}\{3\}} instructs Halibut to put contents links in chapter files for all sections down to \c{\\S} level, but not to go into any more detail than that. For backwards compatibility, the alternative syntax \cw{\\cfg\{html-contents-depth-}\e{level}\cw{\}\{}\e{depth}\cw{\}} is also supported. } \dt \I{\cw{\\cfg\{html-leaf-contains-contents\}}}\cw{\\cfg\{html-leaf-contains-contents\}\{}\e{boolean}\cw{\}} \dd If you set this to \c{true}, then each leaf file will contain its own contents section which summarises the text within it. \dt \I{\cw{\\cfg\{html-leaf-smallest-contents\}}}\cw{\\cfg\{html-leaf-smallest-contents\}\{}\e{number}\cw{\}} \dd Contents sections in leaf files are not output at all if they contain very few entries (on the assumption that it just isn't worth bothering). This directive configures the minimum number of entries required in a leaf contents section to make Halibut bother generating it at all. \S{output-html-html} Including pieces of your own HTML The directives in this section allow you to supply pieces of \I{HTML}\i{verbatim HTML} code, which will be included in various parts of the output files. Note that none of Halibut's usual character set translation is applied to this code; it is assumed to already be in a suitable encoding for the target HTML files. \dt \I{\cw{\\cfg\{html-head-end\}}}\cw{\\cfg\{html-head-end\}\{}\e{HTML text}\cw{\}} \dd The text you provide in this directive is placed at the end of the \i\cw{<HEAD>} section of each output HTML file. So this is a good place to put, for example, a link to a \i{CSS} \i{stylesheet}. \dt \I{\cw{\\cfg\{html-local-head\}}}\cw{\\cfg\{html-local-head\}\{}\e{HTML text}\cw{\}} \dd This configuration directive is local: you specify it within a document section, and it acts on that section only. \lcont{ The text you provide in this directive is placed at the end of the \i\cw{<HEAD>} section of whichever output HTML file contains the section in which the directive was placed. You can specify this directive multiple times in multiple sections if you like. This directive is particularly useful for constructing \i{MacOS on-line help}, which is mostly normal HTML but which requires a special \i\cw{<META NAME="AppleTitle">} tag in the topmost source file. You can arrange this by placing this configuration directive in the preamble or the introduction section, something like this: \c \cfg{html-local-head}{<meta name="AppleTitle" \c content="MyApp Help">} } \dt \I{\cw{\\cfg\{html-body-tag\}}}\cw{\\cfg\{html-body-tag\}\{}\e{HTML text}\cw{\}} \dd The text you provide in this directive is used in place of the \i\cw{<BODY>} tag in each output file. So if you wanted to define a \i{background colour}, for example, you could write \cw{\\cfg\{html-body-tag\}\{<body bg="#123456">\}}. \dt \I{\cw{\\cfg\{html-body-start\}}}\cw{\\cfg\{html-body-start\}\{}\e{HTML text}\cw{\}} \dd The text you provide in this directive is placed at the beginning of the \i\cw{<BODY>} section of each output HTML file. So if you intend your HTML files to be part of a web site with a standard \i{house style}, and the style needs a \i{header} at the top of every page, this is where you can add that header. \dt \I{\cw{\\cfg\{html-body-end\}}}\cw{\\cfg\{html-body-end\}\{}\e{HTML text}\cw{\}} \dd The text you provide in this directive is placed at the end of the \i\cw{<BODY>} section of each output HTML file, before any address section. So if you intend your HTML files to be part of a web site with a standard \i{house style}, and the style needs a \i{footer} at the bottom of every page, this is where you can add that footer. \dt \I{\cw{\\cfg\{html-address-start\}}}\cw{\\cfg\{html-address-start\}\{}\e{HTML text}\cw{\}} \dd The text you provide in this directive is placed at the beginning of the \i\cw{<ADDRESS>} section at the bottom of each output HTML file. This might be a good place to put authors' \i{contact details}, for example. \dt \I{\cw{\\cfg\{html-address-end\}}}\cw{\\cfg\{html-address-end\}\{}\e{HTML text}\cw{\}} \dd The text you provide in this directive is placed at the end of the \i\cw{<ADDRESS>} section at the bottom of each output HTML file, after the version IDs (if present). \dt \I{\cw{\\cfg\{html-navigation-attributes\}}}\cw{\\cfg\{html-navigation-attributes\}\{}\e{HTML attributes}\cw{\}} \dd The text you provide in this directive is included inside the \cw{<P>} tag containing the \i{navigation links} at the top of each page (\i{\q{Previous}} / \i{\q{Contents}} / \i{\q{Next}}). So if you wanted the navigation links to have a particular CSS style, you could write \cw{\\cfg\{html-navigation-attributes\}\{class="foo"\}}, and the navigation-links paragraph would then begin with the tag \cw{<p class="foo">}. \S{output-html-headings} \ii{Configuring heading display} \dt \I{\cw{\\cfg\{html-chapter-numeric\}}}\cw{\\cfg\{html-chapter-numeric\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{true}, then chapter headings will not contain the word \q{Chapter} (or whatever other word you have defined in its place - see \k{input-sections} and \k{input-config}); they will just contain the chapter \e{number}, followed by the chapter title. If you set this to \c{false}, chapter headings will be prefixed by \q{Chapter} or equivalent. \dt \I{\cw{\\cfg\{html-chapter-shownumber\}}}\cw{\\cfg\{html-chapter-shownumber\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{false}, then chapter headings will \e{only} contain the chapter title: they will not contain the word \q{Chapter} (or whatever other word you have defined in its place), and neither will they contain the chapter number. If set to \c{false}, this overrides \cw{\\cfg\{html-chapter-numeric\}}. \dt \I{\cw{\\cfg\{html-chapter-suffix\}}}\cw{\\cfg\{html-chapter-suffix\}\{}\e{text}\cw{\}} \dd This specifies the suffix text to be appended to the chapter number, before displaying the chapter title. For example, if you set this to \cq{:\_}, then the chapter title might look something like \q{Chapter 2: Doing Things}. \dt \I{\cw{\\cfg\{html-section-numeric\}}}\cw{\\cfg\{html-section-numeric\}\{}\e{level}\cw{\}\{}\e{boolean}\cw{\}} \# {level} can be omitted (defaults to 0). Is this intentional? \dd Specifies whether section headings at a particular level should contain the word \q{Section} or equivalent (if \c{false}), or should be numeric only (if \c{true}). The \e{level} parameter specifies which level of section headings you want to affect: 0 means first-level headings (\c{\\H}), 1 means second-level headings (\c{\\S}), 2 means the level below that (\c{\\S2}), and so on. \dt \I{\cw{\\cfg\{html-section-shownumber\}}}\cw{\\cfg\{html-section-shownumber\}\{}\e{level}\cw{\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{false}, then section headings at the specified level will \e{only} contain the section title: they will not contain the word \q{Section} (or whatever other word you have defined in its place), and neither will they contain the section number. If set to \c{false}, this overrides \cw{\\cfg\{html-section-numeric\}}. \dt \I{\cw{\\cfg\{html-section-suffix\}}}\cw{\\cfg\{html-section-suffix\}\{}\e{level}\cw{\}\{}\e{text}\cw{\}} \# {level} can be omitted (defaults to 0). Is this intentional? \dd Specifies the suffix text to be appended to section numbers at a particular level, before displaying the section title. \S{output-html-names} Configuring standard text These directives let you fine-tune the names Halibut uses in places such as the navigation bar to refer to various parts of the document, and other standard pieces of text, for instance to change them to a different language. \dt \I{\cw{\\cfg\{html-preamble-text\}}}\cw{\\cfg\{html-preamble-text\}\{}\e{text}\cw{\}} \dt \I{\cw{\\cfg\{html-contents-text\}}}\cw{\\cfg\{html-contents-text\}\{}\e{text}\cw{\}} \dt \I{\cw{\\cfg\{html-index-text\}}}\cw{\\cfg\{html-index-text\}\{}\e{text}\cw{\}} \dd Text used to refer to the preamble (i.e., any paragraphs before the first chapter heading), contents, and index respectively, in the navigation bar, contents, and index. \lcont{ (\c{html-contents-text} and \c{html-index-text} override the cross-format configuration keywords \c{contents} and \c{index} (see \k{input-config}, if both appear. They are legacy keywords preserved for backwards compatibility; you should generally use \c{contents} and \c{index}.) } \dt \I{\cw{\\cfg\{html-title-separator\}}}\cw{\\cfg\{html-title-separator\}\{}\e{text}\cw{\}} \dd If multiple headings are used in a file's \cw{<TITLE>} tag, this text is used to separate them. \# Under what circumstances can this occur? \dt \I{\cw{\\cfg\{html-index-main-separator\}}}\cw{\\cfg\{html-index-main-separator\}\{}\e{text}\cw{\}} \dd Separator between index term and references in the index. \dt \I{\cw{\\cfg\{html-index-multiple-separator\}}}\cw{\\cfg\{html-index-multiple-separator\}\{}\e{text}\cw{\}} \dd Separator between multiple references for a single index term in the index. \dt \I{\cw{\\cfg\{html-pre-versionid\}}}\cw{\\cfg\{html-pre-versionid\}\{}\e{text}\cw{\}} \dt \I{\cw{\\cfg\{html-post-versionid\}}}\cw{\\cfg\{html-post-versionid\}\{}\e{text}\cw{\}} \dd Text surrounding each output \i{version ID paragraph}. \dt \I{\cw{\\cfg\{html-nav-prev-text\}}}\cw{\\cfg\{html-nav-prev-text\}\{}\e{text}\cw{\}} \dt \I{\cw{\\cfg\{html-nav-next-text\}}}\cw{\\cfg\{html-nav-next-text\}\{}\e{text}\cw{\}} \dt \I{\cw{\\cfg\{html-nav-up-text\}}}\cw{\\cfg\{html-nav-up-text\}\{}\e{text}\cw{\}} \dd The text used for the \q{previous page}, \q{next page}, and \q{up} links on the navigation bar. \dt \I{\cw{\\cfg\{html-nav-separator\}}}\cw{\\cfg\{html-nav-separator\}\{}\e{text}\cw{\}} \dd Separator between links in the navigation bar. \S{output-html-characters} Configuring the characters used Unlike the other backends, HTML does not have a single \i\cw{\\cfg\{html-charset\}} directive, as there are several levels of character encoding to consider. The character set names are the same as for \cw{\\cfg\{input-charset\}} (see \k{input-config}). However, unlike \cw{\\cfg\{input-charset\}}, these directives affect the \e{entire} output; it's not possible to switch encodings halfway through. \dt \I\cw{\\cfg\{html-output-charset\}}\cw{\\cfg\{html-output-charset\}\{}\e{character set name}\cw{\}} \dd The character encoding of the HTML file to be output. Unicode characters in this encoding's repertoire are included literally rather than as \i{HTML entities}. \dt \I\cw{\\cfg\{html-restrict-charset\}}\cw{\\cfg\{html-restrict-charset\}\{}\e{character set name}\cw{\}} \dd Only Unicode characters representable in this character set will be output; any others will be omitted and use their fallback text, if any. Characters not in \q{html-output-charset} will be represented as HTML numeric entities. \dt \I{\cw{\\cfg\{html-quotes\}}}\cw{\\cfg\{html-quotes\}\{}\e{open-quote}\cw{\}\{}\e{close-quote}\cw{\}}[\cw{\{}\e{open-quote}\cw{\}\{}\e{close-quote}...\cw{\}}] \dd Specifies the quotation marks to use, overriding any \cw{\\cfg\{quotes\}} directive. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-quotes\}} directive (see \k{output-text-characters}). \S{output-html-misc} Miscellaneous options \dt \I\cw{\\cfg\{html-version\}}\cw{\\cfg\{html-version\}\{}\e{version}\cw{\}} \dd Identifies the precise version of HTML that is output. This affects the declaration within the HTML, and also has minor effects on the body of the HTML so that it is valid for the declared version. The available variants are: \lcont{ \dt \cw{html3.2} \dd W3C HTML 3.2 \dt \cw{html4} \dd W3C HTML 4.01 Strict \dt \cw{iso-html} \dd ISO/IEC 15445:2000 \dt \cw{xhtml1.0transitional} \dd W3C XHTML 1.0 Transitional \dt \cw{xhtml1.0strict} \dd W3C XHTML 1.0 Strict } \dt \I{\cw{\\cfg\{html-template-fragment\}}}\cw{\\cfg\{html-template-fragment\}\{}\e{template}\cw{\}}[\cw{\{}\e{template}\cw{\}\{}...\cw{\}}] \dd This directive lets you specify a \i{template}, with exactly the same syntax used in \cw{\\cfg\{html-template-filename\}} (see \k{output-html-file}), to be used for the anchor names (\i\cw{<A NAME="...">}) used to allow URLs to refer to specific sections within a particular HTML file. So if you set this to \cq{%k}, for example, then each individual section in your document will be addressable by means of a URL ending in a \c{#} followed by your internal section keyword. \lcont{ If more than one template is specified, anchors are generated in all the specified formats; Halibut's own cross-references are generated with the first template. Characters that are not permitted in anchor names are stripped. If there are no valid characters left, or a fragment is non-unique, Halibut starts inventing fragment names and suffixes as appropriate. Note that there are potentially fragment names that are not controlled by this mechanism, such as index references. } \dt \I{\cw{\\cfg\{html-versionid\}}}\cw{\\cfg\{html-versionid\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{true}, \i{version ID paragraphs} (defined using the \i\c{\\versionid} command - see \k{input-blurb}) will be included visibly in the \i\cw{<ADDRESS>} section at the bottom of each HTML file. If it is set to \c{false}, they will only be included as HTML comments. \dt \I{\cw{\\cfg\{html-rellinks\}}}\cw{\\cfg\{html-rellinks\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{true}, machine-readable relational links will be emitted in each HTML file (\I{\cw{<LINK>} tags}\cw{<LINK REL="next">} and so on within the \i\cw{<HEAD>} section) providing links to related files. The same set of links are provided as in the navigation bar (with which this should not be confused). \lcont{ Some browsers make use of this semantic information, for instance to allow easy navigation through related pages, and to prefetch the next page. (Search engines can also make use of it.) However, many browsers ignore this markup, so it would be unwise to rely on it for navigation. The use and rendering of this information is entirely up to the browser; none of the other Halibut options for the navigation bar will have any effect. } \dt \I{\cw{\\cfg\{html-suppress-navlinks\}}}\cw{\\cfg\{html-suppress-navlinks\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{true}, the usual \i{navigation links} within the \e{body} of each HTML file (near the top of the rendered page) will be suppressed. \dt \I{\cw{\\cfg\{html-suppress-address\}}}\cw{\\cfg\{html-suppress-address\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{true}, the \i\cw{<ADDRESS>} section at the bottom of each HTML file will be omitted completely. (This will therefore also cause \i{version IDs} not to be included visibly.) \dt \I{\cw{\\cfg\{html-author\}}}\cw{\\cfg\{html-author\}\{}\e{text}\cw{\}} \dd The text supplied here goes in a \I{\cw{<META>} tags}\cw{<META name="author">} tag in the output HTML files, so that browsers which support this can automatically identify the \i{author} of the document. \dt \I{\cw{\\cfg\{html-description\}}}\cw{\\cfg\{html-description\}\{}\e{text}\cw{\}} \dd The text supplied here goes in a \I{\cw{<META>} tags}\cw{<META name="description">} tag in the output HTML files, so that browsers which support this can easily pick out a brief \I{description, of document}description of the document. \S{output-html-mshtmlhelp} Generating MS Windows \i{HTML Help} The HTML files output from Halibut's HTML back end can be used as input to the MS Windows HTML Help compiler. In order to do this, you also need some auxiliary files: a project file, and (probably) a contents file and an index file. Halibut can optionally generate those as well. To enable the generation of MS HTML Help auxiliary files, use the following configuration directives: \dt \I\cw{\\cfg\{html-mshtmlhelp-project\}}\cw{\\cfg\{html-mshtmlhelp-project\}\{}\e{filename}\cw{\}} \dd Instructs Halibut to output an HTML Help project file with the specified name. You will almost certainly want the filename to end in the extension \c{.hhp} (although Halibut will not enforce this). If you use this option, you must also use the \cw{html-mshtmlhelp-chm} option to specify the desired name of the compiled help file. \dt \I\cw{\\cfg\{html-mshtmlhelp-chm\}}\cw{\\cfg\{html-mshtmlhelp-chm\}\{}\e{filename}\cw{\}} \dd Specifies the desired name of the compiled HTML Help file. You will almost certainly want this to have the extension \c{.chm} (although Halibut will not enforce this). The name you specify here will be written into the help project file. If you specify this option, you must also use the \cw{html-mshtmlhelp-project} option to request a help project file in the first place. \dt \I\cw{\\cfg\{html-mshtmlhelp-contents\}}\cw{\\cfg\{html-mshtmlhelp-contents\}\{}\e{filename}\cw{\}} \dd Instructs Halibut to output an HTML Help contents file with the specified name, and refer to it in the help project file. You will almost certainly want the filename to end in the extension \c{.hhc} (although Halibut will not enforce this). This option will be ignored if you have not also specified a help project file. \lcont{ Creating a contents file like this causes the HTML Help viewer to display a contents tree in the pane to the left of the main text window. You can choose to generate an HTML Help project without this feature, in which case the user will still be able to navigate around the document by using the ordinary internal links in the HTML files themselves just as if it were a web page. However, using a contents file is recommended. } \dt \I\cw{\\cfg\{html-mshtmlhelp-index\}}\cw{\\cfg\{html-mshtmlhelp-index\}\{}\e{filename}\cw{\}} \dd Instructs Halibut to output an HTML Help index file with the specified name, and refer to it in the help project file. You will almost certainly want the filename to end in the extension \c{.hhk} (although Halibut will not enforce this). This option will be ignored if you have not also specified a help project file. \lcont{ Specifying this option suppresses the generation of an HTML-based index file (see \cw{\\cfg\{html-index-filename\}} in \k{output-html-file}). Creating an index file like this causes the HTML Help viewer to provide a list of index terms in a pane to the left of the main text window. You can choose to generate an HTML Help project without this feature, in which case a conventional HTML index will be generated instead (assuming you have any index terms at all defined) and the user will still be able to use that. However, using an index file is recommended. Halibut will not output an index file at all, or link to one from the help project file, if your document contains no index entries. } If you use the above options, Halibut will output a help project file which you should be able to feed straight to the command-line MS HTML Help compiler (\cw{HHC.EXE}), or load into the MS HTML Help Workshop (\cw{HHW.EXE}). You may also wish to alter other HTML configuration options to make the resulting help file look more like a help file and less like a web page. A suggested set of additional configuration options for HTML Help is as follows: \b \cw{\\cfg\{html-leaf-level\}\{infinite\}}, because HTML Help works best with lots of small files (\q{topics}) rather than a few large ones. In particular, the contents and index mechanisms can only reference files, not subsections within files. \b \cw{\\cfg\{html-leaf-contains-contents\}\{false\}}, to suppress the contents list above the main text of each bottom-level file. \b \cw{\\cfg\{html-suppress-navlinks\}\{true\}}, because HTML Help has its own navigation facilities and it looks a bit strange to duplicate them. \b \cw{\\cfg\{html-suppress-address\}\{true\}}, because the \cw{<ADDRESS>} section makes less sense in a help file than it does on a web page. \S{output-html-defaults} Default settings The \i{default settings} for Halibut's HTML output format are: \c \cfg{html-contents-filename}{Contents.html} \c \cfg{html-index-filename}{IndexPage.html} \c \cfg{html-template-filename}{%n.html} \c \cfg{html-single-filename}{Manual.html} \c \c \cfg{html-leaf-level}{2} \c \cfg{html-leaf-contains-contents}{false} \c \cfg{html-leaf-smallest-contents}{4} \c \cfg{html-contents-depth}{0}{2} \c \cfg{html-contents-depth}{1}{3} \c ... and so on for all section levels below this ... \e iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii \c \c \cfg{html-head-end}{} \c \cfg{html-body-tag}{<body>} \c \cfg{html-body-start}{} \c \cfg{html-body-end}{} \c \cfg{html-address-start}{} \c \cfg{html-address-end}{} \c \cfg{html-navigation-attributes}{} \c \c \cfg{html-chapter-numeric}{false} \c \cfg{html-chapter-shownumber}{true} \c \cfg{html-chapter-suffix}{: } \c \c \cfg{html-section-numeric}{0}{true} \c \cfg{html-section-shownumber}{0}{true} \c \cfg{html-section-suffix}{0}{ } \c \c \cfg{html-section-numeric}{1}{true} \c \cfg{html-section-shownumber}{1}{true} \c \cfg{html-section-suffix}{1}{ } \c \c ... and so on for all section levels below this ... \e iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii \c \c \cfg{html-preamble-text}{Preamble} \c \cfg{html-contents-text}{Contents} \c \cfg{html-index-text}{Index} \c \cfg{html-title-separator}{ - } \c \cfg{html-index-main-separator}{: } \c \cfg{html-index-multiple-separator}{, } \c \cfg{html-pre-versionid}{[} \c \cfg{html-post-versionid}{]} \c \cfg{html-nav-prev-text}{Previous} \c \cfg{html-nav-next-text}{Next} \c \cfg{html-nav-up-text}{Up} \c \cfg{html-nav-separator}{ | } \c \c \cfg{html-output-charset}{ASCII} \c \cfg{html-restrict-charset}{UTF-8} \c \cfg{html-quotes}{\u2018}{\u2019}{"}{"} \c \c \cfg{html-version}{html4} \c \cfg{html-template-fragment}{%b} \c \cfg{html-versionid}{true} \c \cfg{html-rellinks}{true} \c \cfg{html-suppress-navlinks{false} \c \cfg{html-suppress-address}{false} \c \cfg{html-author}{} \c \cfg{html-description}{} \H{output-whlp} Windows Help This output format generates data that can be used by the \i{Windows Help} program \cw{WINHLP32.EXE}. There are two actual files generated, one ending in \c{.hlp} and the other ending in \c{.cnt}. Note that as of 2006, MS is discontinuing the Windows Help format in favour of the newer HTML Help format (\c{.chm} files). Halibut is not currently able to generate \c{.chm} files directly, but its HTML back end can write out project files suitable for use as input to the MS HTML Help compiler. See \k{output-html-mshtmlhelp} for more information on this. Currently, the Windows Help output is hardcoded to be in the \q{\i{Win1252}} character set. (If anyone knows how character sets are encoded in Windows Help files, we'd appreciate help.) The Windows Help output format supports the following configuration directives: \S{output-whlp-file} Output file name \dt \I{\cw{\\cfg\{winhelp-filename\}}}\cw{\\cfg\{winhelp-filename\}\{}\e{filename}\cw{\}} \dd Sets the \i{output file name} in which to store the help file. This directive is implicitly generated if you provide a file name parameter after the command-line option \i\c{--winhelp} (see \k{running-options}). \lcont{ Your output file name should end with \c{.hlp}; if it doesn't, Halibut will append it. Halibut will also generate a contents file (ending in \c{.cnt}) alongside the file name you specify. } \S{output-whlp-characters} Configuring the characters used \dt \I{\cw{\\cfg\{winhelp-bullet\}}}\cw{\\cfg\{winhelp-bullet\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}\cw{\}}...] \dd Specifies the text to use as the \i{bullet} in bulletted lists. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-bullet\}} directive (see \k{output-text-characters}). \dt \I{\cw{\\cfg\{winhelp-quotes\}}}\cw{\\cfg\{winhelp-quotes\}\{}\e{open-quote}\cw{\}\{}\e{close-quote}\cw{\}}[\cw{\{}\e{open-quote}\cw{\}\{}\e{close-quote}...\cw{\}}] \dd Specifies the quotation marks to use, overriding any \cw{\\cfg\{quotes\}} directive. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-quotes\}} directive (see \k{output-text-characters}). \S{output-whlp-misc} Miscellaneous configuration options \dt \I{\cw{\\cfg\{winhelp-contents-titlepage\}}}\cw{\\cfg\{winhelp-contents-titlepage\}\{}\e{title}\cw{\}} \dd Sets the text used to describe the help page containing the blurb (see \k{input-blurb}) and table of contents. \dt \I{\cw{\\cfg\{winhelp-section-suffix\}}}\cw{\\cfg\{winhelp-section-suffix\}\{}\e{text}\cw{\}} \dd Specifies the \I{suffix text, in section titles}suffix text to be appended to section numbers, before displaying the section title. (Applies to all levels.) \dt \I{\cw{\\cfg\{winhelp-list-suffix\}}}\cw{\\cfg\{winhelp-list-suffix\}\{}\e{text}\cw{\}} \dd This text is appended to the number on a \i{numbered list} item, in exactly the same way as \cw{\\cfg\{text-list-suffix\}} (see \k{output-text-characters}). \dt \I{\cw{\\cfg\{winhelp-topic\}}}\cw{\\cfg\{winhelp-topic\}\{}\e{topic-name}\cw{\}} \dd This directive defines a Windows \i{Help topic} name in the current section. Topic names can be used by the program invoking \cw{WINHELP.EXE} to jump straight to a particular section. So you can use this for \i{context-sensitive help}. \lcont{ For example, if you used this directive in a particular section: \c \cfg{winhelp-topic}{savingfiles} then a Windows application could invoke Windows Help to jump to that particular section in the help file like this: \c WinHelp(hwnd, "mydoc.hlp", HELP_COMMAND, \c (DWORD)"JI(`',`savingfiles')"); You can use this configuration directive many times, in many different subsections of your document, in order to define a lot of different help contexts which you can use in this way. } \S{output-whlp-defaults} Default settings The \i{default settings} for the Windows Help output format are: \c \cfg{winhelp-filename}{output.hlp} \c \c \cfg{winhelp-bullet}{\u2022}{-} \c \cfg{winhelp-quotes}{\u2018}{\u2019}{"}{"} \c \c \cfg{winhelp-contents-titlepage}{Title page} \c \cfg{winhelp-section-suffix}{: } \c \cfg{winhelp-list-suffix}{.} and no \c{\\cfg\{winhelp-topic\}} directives anywhere. \H{output-man} Unix \cw{man} pages This output format generates a Unix \i{\cw{man} page}. That is to say, it generates \i\c{nroff} input designed to work with the \c{-mandoc} macro package. The available configuration options for this format are as follows: \S{output-man-file} Output file name \dt \I{\cw{\\cfg\{man-filename\}}}\cw{\\cfg\{man-filename\}\{}\e{filename}\cw{\}} \dd Sets the \i{output file name} in which to store the man page. This directive is implicitly generated if you provide a file name parameter after the command-line option \i\c{--man} (see \k{running-options}). \S{output-man-identity} Configuring headers and footers \dt \I{\cw{\\cfg\{man-identity\}}}\cw{\\cfg\{man-identity\}\{}\e{text}\cw{\}\{}\e{text...}\cw{\}} \dd This directive is used to generate the initial \i{\c{.TH} directive} that appears at the top of a \cw{man} page. It expects to be followed by some number of brace pairs containing text, which will be used in the \i{headers} and \i{footers} of the formatted output. \lcont{ A traditional order for the arguments appears to be: \n The name of the program. \n The (numeric) manual section. \n The date that the \cw{man} page was written. \n The name of any containing suite of which the program is a part. \n The name of the \i{author} of the \cw{man} page. For example, a typical \cw{man} page might contain \c \cfg{man-identity}{make-foo}{1}{June 2003}{foo-utils}{Fred \c Bloggs} } \S{output-man-headings} Configuring heading display \dt \I{\cw{\\cfg\{man-headnumbers\}}}\cw{\\cfg\{man-headnumbers\}\{}\e{boolean}\cw{\}} \dd If this is set to \c{true}, then \i{section headings} in the \cw{man} page will have their \i{section numbers} displayed as usual. If set to \c{false}, the section numbers will be omitted. (\cw{man} pages traditionally have section names such as \q{SYNOPSIS}, \q{OPTIONS} and \q{BUGS}, and do not typically number them, so \c{false} is the setting which conforms most closely to normal \cw{man} style.) \dt \I{\cw{\\cfg\{man-mindepth\}}}\cw{\\cfg\{man-mindepth\}\{}\e{depth}\cw{\}} \dd If this is set to a number greater than 0, then section headings \e{higher} than the given depth will not be displayed. If it is set to zero, all section headings will be displayed as normal. \lcont{ The point of this is so that you can use the same Halibut input file to generate a quick-reference \cw{man} page for a program, \e{and} to include that \cw{man} page as an appendix in your program's full manual. If you are to include the \cw{man} page as an appendix, then the internal headings within the page will probably need to be at \c{\\H} or \c{\\S} level; therefore, when you format that input file on its own to create the \cw{man} page itself, you will need to have defined a \c{\\C} and possibly a \c{\\H} heading beforehand, which you don't want to see displayed. Here's an example. You might have a file \c{appendix.but}, which simply says \c \A{manpages} \cw{man} pages for the Foo tool suite \c \c \cfg{man-mindepth}{2} Then you have a file \c{make-foo.but}, and probably others like it as well, each of which looks something like this: \c \cfg{man-identity}{make-foo}{1}{June 2003}{foo-utils}{Fred \c Bloggs} \c \c \H{man-foo} \cw{man} page for \c{make-foo} \c \c \S{man-foo-name} NAME \c \c \c{make-foo} - create Foo files for the Foo tool suite \c \c \S{man-foo-synopsis} SYNOPSIS \c \c ... and so on ... \e iiiiiiiiiiiiiiiii So when you're generating your main manual, you can include \c{appendix.but} followed by \c{make-foo.but} and any other \cw{man} pages you have, and your \cw{man} pages will be formatted neatly as part of an appendix. Then, in a separate run of Halibut, you can just do \c halibut appendix.but make-foo.but and this will generate a \cw{man} page \c{output.1}, in which the headings \q{\cw{man} pages for the Foo tool suite} and \q{\cw{man} page for \c{make-foo}} will not be displayed because of the \c{man-mindepth} directive. So the first visible heading in the output \cw{man} page will be \q{NAME}, exactly as a user would expect. } \S{output-man-characters} Configuring the characters used \dt \I{\cw{\\cfg\{man-charset\}}}\cw{\\cfg\{man-charset\}\{}\e{character set}\cw{\}} \dd Specifies what character set the output should be in, similarly to \cw{\\cfg\{text-charset\}} (see \k{output-text-characters}). \# FIXME: you're probably on your own in making sure that it's sensible to output man pages in that charset. \dt \I{\cw{\\cfg\{man-bullet\}}}\cw{\\cfg\{man-bullet\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}\cw{\}}...] \dd Specifies the text to use as the \i{bullet} in bulletted lists. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-bullet\}} directive (see \k{output-text-characters}). \dt \I{\cw{\\cfg\{man-rule\}}}\cw{\\cfg\{man-rule\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}...\cw{\}}] \dd This specifies the text which should be used for drawing \i{horizontal rules} (generated by \i\c{\\rule}; see \k{input-rule}) when the manual page is rendered into text. It should only be one character long, but otherwise it works like the \cw{\\cfg\{text-rule\}} directive (see \k{output-text-characters}). \dt \I{\cw{\\cfg\{man-quotes\}}}\cw{\\cfg\{man-quotes\}\{}\e{open-quote}\cw{\}\{}\e{close-quote}\cw{\}}[\cw{\{}\e{open-quote}\cw{\}\{}\e{close-quote}...\cw{\}}] \dd Specifies the quotation marks to use, overriding any \cw{\\cfg\{quotes\}} directive. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-quotes\}} directive (see \k{output-text-characters}). \S{output-man-defaults} Default settings The \i{default settings} for the \cw{man} page output format are: \c \cfg{man-filename}{output.1} \c \c \cfg{man-identity}{} \c \c \cfg{man-headnumbers}{false} \c \cfg{man-mindepth}{0} \c \c \cfg{man-charset}{ASCII} \c \cfg{man-bullet}{\u2022}{o} \c \cfg{man-rule}{\u2500}{-} \c \cfg{man-quotes}{\u2018}{\u2019}{"}{"} \H{output-info} GNU Info This output format generates files which can be used with the \i{GNU Info} program. There are typically multiple output files: a primary file whose name usually ends in \c{.info}, and one or more subsidiary files whose names have numbers on the end, so that they end in \c{.info-1}, \c{.info-2} and so on. Alternatively, this output format can be configured to output a single large file containing the whole document. The Info output format supports the following configuration directives: \S{output-info-file} Controlling the output filenames \dt \I{\cw{\\cfg\{info-filename\}}}\cw{\\cfg\{info-filename\}\{}\e{filename}\cw{\}} \dd Sets the output file name in which to store the Info file. This directive is implicitly generated if you provide a file name parameter after the command-line option \i\c{--info} (see \k{running-options}). \lcont{ The suffixes \c{-1}, \c{-2}, \c{-3} and so on will be appended to your output file name to produce any subsidiary files required. Note that Info files refer to their own names internally, so these files cannot be \I{renaming Info files}renamed after creation and remain useful. } \dt \I{\cw{\\cfg\{info-max-file-size\}}}\cw{\\cfg\{info-max-file-size\}\{}\e{bytes}\cw{\}} \dd Sets the preferred \i{maximum file size} for each subsidiary file. As a special case, if you set this to zero, there will be no subsidiary files and the whole document will be placed in a single self-contained output file. (However, note that this file can still not be renamed usefully.) \lcont{ The preferred maximum file size is only a guideline. Halibut may be forced to exceed it if a single section of the document is larger than the maximum size (since individual Info nodes may not be split between files). } \S{output-info-dimensions} Indentation and line width \dt \I{\cw{\\cfg\{info-width\}}}\cw{\\cfg\{info-width\}\{}\e{width}\cw{\}} \dd Sets the \I{text width}width of the main part of the document, in characters. Works exactly like the \cw{\\cfg\{text-width\}} directive (see \k{output-text-dimensions}). \dt \I{\cw{\\cfg\{info-indent-code\}}}\cw{\\cfg\{info-indent-code\}\{}\e{indent}\cw{\}} \dd Specifies the extra indentation for \I{code paragraphs, indentation} code paragraphs. Works exactly like the \cw{\\cfg\{text-indent-code\}} directive (see \k{output-text-dimensions}). \dt \I{\cw{\\cfg\{info-index-width\}}}\cw{\\cfg\{info-index-width\}\{}\e{width}\cw{\}} \dd Specifies how much horizontal space to leave in the index node for the text of \i{index terms}, before displaying the sections the terms occur in. \dt \I{\cw{\\cfg\{info-list-indent\}}}\cw{\\cfg\{info-list-indent\}\{}\e{indent}\cw{\}} \dd Specifies the extra indentation before the bullet or number in a \I{bulletted list, indentation}\I{numbered list, indentation}list item. Works exactly like the \cw{\\cfg\{text-list-indent\}} directive (see \k{output-text-dimensions}). \dt \I{\cw{\\cfg\{info-listitem-indent\}}}\cw{\\cfg\{info-listitem-indent\}\{}\e{indent}\cw{\}} \dd Specifies the additional indentation before the body of a list item. Works exactly like the \cw{\\cfg\{text-listitem-indent\}} directive (see \k{output-text-dimensions}). \S{output-info-headings} Configuring heading display \dt \I{\cw{\\cfg\{info-section-suffix\}}}\cw{\\cfg\{info-section-suffix\}\{}\e{text}\cw{\}} \dd Specifies the suffix text to be appended to each section number before displaying the section title. For example, if you set this to \cq{:\_}, then a typical section title might look something like \q{Section 3.1: Something Like This}. \dt \I{\cw{\\cfg\{info-title-underline\}}}\cw{\\cfg\{info-title-underline\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}\cw{\}}...] \dd Specifies the text to be used to \I{underlining}underline the overall document title. Works very much like the \cw{\\cfg\{text-title-underline\}} directive (see \k{output-text-headings}). You can specify more than one option, and Halibut will choose the first one supported by the character set. \dt \I{\cw{\\cfg\{info-chapter-underline\}}}\cw{\\cfg\{info-chapter-underline\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}\cw{\}}...] \dd Specifies how chapter and appendix headings should be underlined. \dt \I{\cw{\\cfg\{info-section-underline\}}}\cw{\\cfg\{info-section-underline\}\{}\e{level}\cw{\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}\cw{\}}...] \dd Specifies how to underline section headings at a particular level. The \e{level} parameter specifies which level of section headings you want to affect: 0 means first-level headings (\c{\\H}), 1 means second-level headings (\c{\\S}), 2 means the level below that (\c{\\S2}), and so on. \S{output-info-characters} Controlling the characters used \dt \I{\cw{\\cfg\{info-charset\}}}\cw{\\cfg\{info-charset\}\{}\e{character set}\cw{\}} \dd Specifies what character set the output should be in, similarly to \cw{\\cfg\{text-charset\}} (see \k{output-text-characters}). \# FIXME: if you try sufficiently hard, you can probably find an output encoding that will break the info format by trampling on its special characters. So either don't do that, or tell us what we should do about it. \dt \I{\cw{\\cfg\{info-bullet\}}}\cw{\\cfg\{info-bullet\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}\cw{\}}...] \dd Specifies the text to use as the \i{bullet} in bulletted lists. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-bullet\}} directive (see \k{output-text-characters}). \dt \I{\cw{\\cfg\{info-rule\}}}\cw{\\cfg\{info-rule\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}\cw{\}}...] \dd Specifies the text used to draw \i{horizontal rules}. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-rule\}} directive (see \k{output-text-characters}). \dt \I{\cw{\\cfg\{info-quotes\}}}\cw{\\cfg\{info-quotes\}\{}\e{open-quote}\cw{\}\{}\e{close-quote}\cw{\}}[\cw{\{}\e{open-quote}\cw{\}\{}\e{close-quote}...\cw{\}}] \dd Specifies the quotation marks to use, overriding any \cw{\\cfg\{quotes\}} directive. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-quotes\}} directive (see \k{output-text-characters}). \dt \I{\cw{\\cfg\{info-emphasis\}}}\cw{\\cfg\{info-emphasis\}\{}\e{start-emph}\cw{\}\{}\e{end-emph}\cw{\}}[\cw{\{}\e{start-emph}\cw{\}\{}\e{end-emph}...\cw{\}}] \dd Specifies how to display emphasised text. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-emphasis\}} directive (see \k{output-text-characters}). \dt \I{\cw{\\cfg\{info-strong\}}}\cw{\\cfg\{info-strong\}\{}\e{start-strong}\cw{\}\{}\e{end-strong}\cw{\}}[\cw{\{}\e{start-strong}\cw{\}\{}\e{end-strong}...\cw{\}}] \dd Specifies how to display strong text. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-emphasis\}} directive (see \k{output-text-characters}). \S{output-info-misc} Miscellaneous configuration options \dt \I{\cw{\\cfg\{info-list-suffix\}}}\cw{\\cfg\{info-list-suffix\}\{}\e{text}\cw{\}} \dd Specifies the text to append to the item numbers in a \i{numbered list}. Works exactly like the \cw{\\cfg\{text-list-suffix\}} directive (see \k{output-text-misc}). \dt \I{\cw{\\cfg\{info-dir-entry\}}}\cw{\\cfg\{info-dir-entry\}\{}\e{section}\cw{\}\{}\e{short name}\cw{\}\{}\e{long name}\cw{\}}[\cw{\{}\e{keyword}\cw{\}}] \dd Constructs an \i\cw{INFO-DIR-ENTRY} section and places it in the header of the Info file. This mechanism is used to automatically generate the \i{\c{dir} file} at the root of a Unix system's Info collection. \lcont{ The parameters to this directive are: \dt \e{section} \dd Specifies the section of the \c{dir} file in which you want your document referenced. For example, \q{Development}, or \q{Games}, or \q{Miscellaneous}. \dt \e{short name} \dd Specifies a short name for the directory entry, which will appear at the start of the menu line. \dt \e{long name} \dd Specifies a long name for the directory entry, which will appear at the end of the menu line. \dt \e{keyword} \dd This parameter is optional. If it is present, then the directory entry will cause a jump to a particular subsection of your document, rather than starting at the top. The subsection will be the one referred to by the given keyword (see \k{input-sections} for details about assigning keywords to document sections). For example, in a document describing many game programs, the configuration directive \c \cfg{info-dir-entry}{Games}{Chess}{Electronic chess \c game}{chess} might produce text in the \c{dir} file looking something like this: \c Games \c * Chess: (mygames)Chapter 3. Electronic chess game if the output file were called \c{mygames.info} and the keyword \c{chess} had been used to define Chapter 3 of the document. } \S{output-info-defaults} Default settings The \i{default settings} for the Info output format are: \c \cfg{info-filename}{output.info} \c \cfg{info-max-file-size}{65536} \c \c \cfg{info-width}{70} \c \cfg{info-indent-code}{2} \c \cfg{info-index-width}{40} \c \cfg{info-list-indent}{1} \c \cfg{info-listitem-indent}{3} \c \c \cfg{info-section-suffix}{: } \c \cfg{info-title-underline}{*} \c \cfg{info-chapter-underline}{=} \c \cfg{info-section-underline}{0}{-} \c \cfg{info-section-underline}{1}{.} \c \cfg{info-section-underline}{2}{.} \c ... and so on for all section levels below this ... \e iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii \c \c \cfg{info-charset}{ASCII} \c \cfg{info-bullet}{\u2022}{-} \c \cfg{info-rule}{\u2500}{-} \c \cfg{info-quotes}{\u2018}{\u2019}{`}{'} \c \cfg{info-emphasis}{_}{_} \c \cfg{info-strong}{*}{*} \c \c \cfg{info-list-suffix}{.} and no \cw{\\cfg\{info-dir-entry\}} directives. \H{output-paper} Paper formats These output formats (currently PDF and PostScript) generate printable manuals. As such, they share a number of configuration directives. \S{output-pdf} \i{PDF} This output format generates a printable manual in PDF format. In addition, it uses some PDF interactive features to provide an outline of all the document's sections and clickable cross-references between sections. There is one configuration option specific to PDF: \dt \I{\cw{\\cfg\{pdf-filename\}}}\cw{\\cfg\{pdf-filename\}\{}\e{filename}\cw{\}} \dd Sets the \i{output file name} in which to store the PDF file. This directive is implicitly generated if you provide a file name parameter after the command-line option \i\c{--pdf} (see \k{running-options}). The \i{default settings} for the PDF output format are: \c \cfg{pdf-filename}{output.pdf} \S{output-ps} \i{PostScript} This output format generates a printable manual in PostScript format. This should look exactly identical to the PDF output (see \k{output-ps}), and uses \i\c{pdfmark} to arrange that if converted to PDF it will contain the same interactive features. There is one configuration option specific to PostScript: \dt \I{\cw{\\cfg\{ps-filename\}}}\cw{\\cfg\{ps-filename\}\{}\e{filename}\cw{\}} \dd Sets the \i{output file name} in which to store the PostScript file. This directive is implicitly generated if you provide a file name parameter after the command-line option \i\c{--ps} (see \k{running-options}). The \i{default settings} for the PostScript output format are: \c \cfg{ps-filename}{output.ps} \S{output-paper-dimensions} Configuring layout and \i{measurements} All measurements are in PostScript \i{points} (72 points to the inch). \S2{output-paper-pagesize} Page properties \dt \I{\cw{\\cfg\{paper-page-width\}}}\cw{\\cfg\{paper-page-width\}\{}\e{points}\cw{\}} \dt \I{\cw{\\cfg\{paper-page-height\}}}\cw{\\cfg\{paper-page-height\}\{}\e{points}\cw{\}} \dd Specify the absolute limits of the paper. \dt \I{\cw{\\cfg\{paper-left-margin\}}}\cw{\\cfg\{paper-left-margin\}\{}\e{points}\cw{\}} \dt \I{\cw{\\cfg\{paper-top-margin\}}}\cw{\\cfg\{paper-top-margin\}\{}\e{points}\cw{\}} \dt \I{\cw{\\cfg\{paper-right-margin\}}}\cw{\\cfg\{paper-right-margin\}\{}\e{points}\cw{\}} \dt \I{\cw{\\cfg\{paper-bottom-margin\}}}\cw{\\cfg\{paper-bottom-margin\}\{}\e{points}\cw{\}} \dd Specify the margins. Most text appears within these margins, except: \lcont{ \b Section numbers, which appear in the left margin. \b The footer (containing page numbers), which appears in the bottom margin. } \S2{output-paper-line} Vertical spacing \dt \I{\cw{\\cfg\{paper-base-leading\}}}\cw{\\cfg\{paper-base-leading\}\{}\e{points}\cw{\}} \dd Specifies the amount of space between lines of text within a paragraph. (So, if the font size is 12pt and there is 2pt of leading, there will be 14pt between successive baselines.) \dt \I{\cw{\\cfg\{paper-base-para-spacing\}}}\cw{\\cfg\{paper-base-para-spacing\}\{}\e{points}\cw{\}} \dd Specifies the amount of vertical space between paragraphs. (The vertical space between paragraphs does \e{not} include \c{paper-base-leading}.) \S2{output-paper-indentation} Indentation \dt \I{\cw{\\cfg\{paper-list-indent\}}}\cw{\\cfg\{paper-list-indent\}\{}\e{points}\cw{\}} \dd Specifies the indentation of the bullet or number in a \I{bulletted list, indentation}bulletted or \I{numbered list, indentation}numbered \I{list, indentation}list, similarly to \cw{\\cfg\{text-list-indent\}} (see \k{output-text-dimensions}). \dt \I{\cw{\\cfg\{paper-listitem-indent\}}}\cw{\\cfg\{paper-listitem-indent\}\{}\e{points}\cw{\}} \dd Specifies the \e{extra} indentation for the body of a list item, over and above the amount configured in \cw{\\cfg\{paper-list-indent\}}. \# FIXME: doesn't actually work, AFAICT. \dt \I{\cw{\\cfg\{paper-quote-indent\}}}\cw{\\cfg\{paper-quote-indent\}\{}\e{points}\cw{\}} \dd Specifies the amount of indentation for a level of quoting. Used for \cw{\\quote} (see \k{input-quote}) and code quotes with \cw{\\c} (see \k{input-code}). \S2{output-paper-headings} Headings \dt \I{\cw{\\cfg\{paper-chapter-top-space\}}}\cw{\\cfg\{paper-chapter-top-space\}\{}\e{points}\cw{\}} \dd Specifies the space between the top margin and the top of the chapter heading. (Each chapter begins on a new page.) \dt \I{\cw{\\cfg\{paper-chapter-underline-thickness\}}}\cw{\\cfg\{paper-chapter-underline-thickness\}\{}\e{points}\cw{\}} \dd Specifies the vertical thickness of the black rule under chapter headings. \dt \I{\cw{\\cfg\{paper-chapter-underline-depth\}}}\cw{\\cfg\{paper-chapter-underline-depth\}\{}\e{points}\cw{\}} \dd Specifies the distance between the base of the chapter heading and the \e{base} of the underlying rule. \dt \I{\cw{\\cfg\{paper-sect-num-left-space\}}}\cw{\\cfg\{paper-sect-num-left-space\}\{}\e{points}\cw{\}} \dd Specifies the distance between the left margin and the \e{right} of section numbers (which are in the left margin). \S2{output-paper-index} Contents and index \dt \I{\cw{\\cfg\{paper-contents-indent-step\}}}\cw{\\cfg\{paper-contents-indent-step\}\{}\e{points}\cw{\}} \dd Specifies by how much to indent each entry in the table of contents per level of subdivision in the document. (In other words, chapter titles appear at the left of the table of contents, headings within the chapter are indented by the amount configured here, subheadings by twice that, and so on.) \dt \I{\cw{\\cfg\{paper-contents-margin\}}}\cw{\\cfg\{paper-contents-margin\}\{}\e{points}\cw{\}} \dd Specifies the amount of space on the right of the table of contents which should be reserved for page numbers only. Headings in the table of contents which extend into this space will be wrapped. \dt \I{\cw{\\cfg\{paper-leader-separation\}}}\cw{\\cfg\{paper-leader-separation\}\{}\e{points}\cw{\}} \dd Specifies the horizontal spacing between dots in \i\e{leaders} (the dotted lines that appear between section headings and page numbers in the table of contents). \dt \I{\cw{\\cfg\{paper-footer-distance\}}}\cw{\\cfg\{paper-footer-distance\}\{}\e{points}\cw{\}} \dd Specifies the distance between the bottom margin and the \e{base} of the footer (which contains page numbers). \dt \I{\cw{\\cfg\{paper-index-columns\}}}\cw{\\cfg\{paper-index-columns\}\{}\e{columns}\cw{\}} \dd Specifies the number of columns the index should be divided into. \# FIXME: with this set to 1, the right-alignment of some index entry page numbers in the Halibut manual is decidedly wonky. \dt \I{\cw{\\cfg\{paper-index-gutter\}}}\cw{\\cfg\{paper-index-gutter\}\{}\e{points}\cw{\}} \dd Specifies the amount of \I{gutter} horizontal space between index columns. \dt \I{\cw{\\cfg\{paper-index-minsep\}}}\cw{\\cfg\{paper-index-minsep\}\{}\e{points}\cw{\}} \dd Specifies the minimum allowable horizontal space between an index entry and its page number. If the gap is smaller, the page number is moved to the next line. \S2{output-paper-fonts} \ii{Fonts} The directives in this section control which fonts Halibut uses for various kinds of text. Directives for setting the font normally take three font names, the first of which is used for normal text, the second for emphasised text, and the third for code. Any fonts which aren't specified are left unchanged. Halibut intrinsically knows about some fonts, and these fonts are also built into all PDF and most PostScript implementations. These fonts can be used without further formality. Halibut can also use other fonts, and can \I{embedding fonts}embed them it its PDF and PostScript output. These other fonts are supplied to Halibut by simply adding them to the list of input files on its command line. To use a \i{Type 1 font} Halibut needs both the font file itself, in either hexadecimal (\I{PFA files}PFA) or IBM PC (\I{PFB files}PFB) format, and an \i{Adobe Font Metrics} (\I{AFM files}AFM) file. The AFM file must be specified first on the command line. If Halibut gets an AFM file without a corresponding Type 1 font file, the PostScript and PDF output files will still use that font, but they won't contain it. Using a \i{TrueType font} is rather simpler, and simply requires you to pass the font file to Halibut. Halibut does place a few restrictions on TrueType fonts, notably that they must include a \i{Unicode} mapping table and a PostScript name. Fonts are specified using their PostScript names. Running Halibut with the \i\cw{\-\-list-fonts} option causes it to display the PostScript names of all the fonts it intrinsically knows about, along with any fonts the were supplied as input files. \ii{Font sizes} are specified in PostScript \i{points} (72 to the inch). \dt \I{\cw{\\cfg\{paper-title-fonts\}}}\cw{\\cfg\{paper-title-fonts\}\{}\e{normal-font}\cw{\}}[\cw{\{}\e{emph-font}\cw{\}}[\cw{\{}\e{code-font}\cw{\}}]] \dd Specifies the fonts to use for text in the document title. \dt \I{\cw{\\cfg\{paper-title-font-size\}}}\cw{\\cfg\{paper-title-font-size\}\{}\e{points}\cw{\}} \dd Specifies the \i{font size} of the document title. \dt \I{\cw{\\cfg\{paper-chapter-fonts\}}}\cw{\\cfg\{paper-chapter-fonts\}\{}\e{normal-font}\cw{\}}[\cw{\{}\e{emph-font}\cw{\}}[\cw{\{}\e{code-font}\cw{\}}]] \dd Specifies the fonts to use for text in chapter titles. \dt \I{\cw{\\cfg\{paper-chapter-font-size\}}}\cw{\\cfg\{paper-chapter-font-size\}\{}\e{points}\cw{\}} \dd Specifies the \i{font size} of chapter titles. \dt \I{\cw{\\cfg\{paper-section-fonts\}}}\cw{\\cfg\{paper-section-fonts\}\{}\e{level}\cw{\}\{}\e{normal-font}\cw{\}}[\cw{\{}\e{emph-font}\cw{\}}[\cw{\{}\e{code-font}\cw{\}}]] \dd Specifies the fonts to use for text in section headings at the \e{level} specified. \dt \I{\cw{\\cfg\{paper-section-font-size\}}}\cw{\\cfg\{paper-section-font-size\}\{}\e{level}\cw{\}\{}\e{points}\cw{\}} \dd Specifies the \i{font size} of section headings at the \e{level} specified. \dt \I{\cw{\\cfg\{paper-base-fonts\}}}\cw{\\cfg\{paper-base-fonts\}\{}\e{normal-font}\cw{\}}[\cw{\{}\e{emph-font}\cw{\}}[\cw{\{}\e{code-font}\cw{\}}]] \dd Specifies the fonts to use for text in the body text. \dt \I{\cw{\\cfg\{paper-base-font-size\}}}\cw{\\cfg\{paper-base-font-size\}\{}\e{points}\cw{\}} \dd Specifies the \i{font size} of body text. \dt \I{\cw{\\cfg\{paper-code-fonts\}}}\cw{\\cfg\{paper-code-fonts\}\{}\e{bold-font}\cw{\}}[\cw{\{}\e{italic-font}\cw{\}}[\cw{\{}\e{normal-font}\cw{\}}]] \dd Specifies the fonts to use for text in code paragraphs. The \e{bold-font} is used for bold text, the \e{italic-font} for emphasised text, and the \e{normal-font} for normal code. \dt \I{\cw{\\cfg\{paper-code-font-size\}}}\cw{\\cfg\{paper-code-font-size\}\{}\e{points}\cw{\}} \dd Specifies the \i{font size} of text in code paragraphs. \dt \I{\cw{\\cfg\{paper-pagenum-font-size\}}}\cw{\\cfg\{paper-pagenum-font-size\}\{}\e{points}\cw{\}} \dd Specifies the font size to use for \i{page numbers}. \S2{output-paper-misc} Miscellaneous \dt \I{\cw{\\cfg\{paper-rule-thickness\}}}\cw{\\cfg\{paper-rule-thickness\}\{}\e{points}\cw{\}} \dd Specifies the vertical thickness of the rule produced by the \cw{\\rule} command (see \k{input-rule}). (Note that no extra space is reserved for thicker rules.) \S{output-paper-characters} Configuring the characters used \dt \I{\cw{\\cfg\{paper-bullet\}}}\cw{\\cfg\{paper-bullet\}\{}\e{text}\cw{\}}[\cw{\{}\e{text}\cw{\}}...] \dd Specifies the text to use as the \i{bullet} in bulletted lists. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-bullet\}} directive (see \k{output-text-characters}). \dt \I{\cw{\\cfg\{paper-quotes\}}}\cw{\\cfg\{paper-quotes\}\{}\e{open-quote}\cw{\}\{}\e{close-quote}\cw{\}}[\cw{\{}\e{open-quote}\cw{\}\{}\e{close-quote}...\cw{\}}] \dd Specifies the quotation marks to use, overriding any \cw{\\cfg\{quotes\}} directive. You can specify multiple fallback options. Works exactly like the \cw{\\cfg\{text-quotes\}} directive (see \k{output-text-characters}). \S{output-paper-defaults} Default settings for paper formats The default page size corresponds to 210\_\u00D7{x}\_297\_mm, i.e., \i{A4 paper}. \c \cfg{paper-page-width}{595} \c \cfg{paper-page-height}{842} \c \c \cfg{paper-left-margin}{72} \c \cfg{paper-top-margin}{72} \c \cfg{paper-right-margin}{72} \c \cfg{paper-bottom-margin}{108} \c \c \cfg{paper-base-leading}{1} \c \cfg{paper-base-para-spacing}{10} \c \c \cfg{paper-list-indent}{6} \c \cfg{paper-listitem-indent}{18} \c \cfg{paper-quote-indent}{18} \c \c \cfg{paper-chapter-top-space}{72} \c \cfg{paper-chapter-underline-thickness}{3} \c \cfg{paper-chapter-underline-depth}{14} \c \cfg{paper-sect-num-left-space}{12} \c \c \cfg{paper-contents-indent-step}{24} \c \cfg{paper-contents-margin}{84} \c \cfg{paper-leader-separation}{12} \c \cfg{paper-footer-distance}{32} \c \cfg{paper-index-columns}{2} \c \cfg{paper-index-gutter}{36} \c \cfg{paper-index-minsep}{18} \c \c \cfg{paper-base-fonts}{Times-Roman}{Times-Italic}{Courier} \c \cfg{paper-base-font-size}{12} \c \cfg{paper-code-fonts}{Courier-Bold}{Courier-Oblique}{Courier} \c \cfg{paper-code-font-size}{12} \c \cfg{paper-title-fonts}{Helvetica-Bold} \c {Helvetica-BoldOblique}{Courier-Bold} \c \cfg{paper-title-font-size}{24} \c \cfg{paper-chapter-fonts}{Helvetica-Bold} \c {Helvetica-BoldOblique}{Courier-Bold} \c \cfg{paper-chapter-font-size}{20} \c \cfg{paper-section-fonts}{0}{Helvetica-Bold} \c {Helvetica-BoldOblique}{Courier-Bold} \c \cfg{paper-section-font-size}{0}{16} \c \cfg{paper-section-fonts}{1}{Helvetica-Bold} \c {Helvetica-BoldOblique}{Courier-Bold} \c \cfg{paper-section-font-size}{1}{14} \c \cfg{paper-section-fonts}{2}{Helvetica-Bold} \c {Helvetica-BoldOblique}{Courier-Bold} \c \cfg{paper-section-font-size}{2}{13} \c ... and so on for all section levels below this ... \e iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii \c \c \cfg{paper-pagenum-font-size}{12} \c \c \cfg{paper-rule-thickness}{1} \c \c \cfg{paper-bullet}{\u2022}{-} \c \cfg{paper-quotes}{\u2018}{\u2019}{'}{'} �halibut-1.1/doc/running.but�������������������������������������������������������������������������0000644�0001753�0001753�00000020130�12444773746�012711� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������\C{running} Running Halibut \I{running Halibut}In the simplest case, running Halibut is very easy. You provide a set of input files on its \i{command line}, and it produces a set of output files. \c $ halibut intro.but gettingstarted.but reference.but index.but \e bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb This will generate a large set of \i{output files}: \b \i\c{output.txt} will be a \i{plain text} version of the input document. \b \i\c{output.hlp} and \i\c{output.cnt} will be an old-style \i{Windows Help} version of the same thing. (Most of the text is in \c{output.hlp}; \c{output.cnt} contains additional contents data used by the Windows help topic selector. If you lose the latter, the former should still be usable, but it will look less modern.) \lcont{ Note that to do this Halibut does not require any external software such as a \i{Help compiler}. It \e{directly} generates old-style Windows Help files, and therefore it doesn't need to be run on Windows to do so: it can generate them even when run from an automated script on a Unix machine. } \b \c{output.1} will be a Unix \i{\cw{man} page}. \b The set of files \c{*.html} will contain an \i{HTML} version of the document. If you have configured Halibut to generate more than one HTML file (the default), then the file \c{Contents.html} will be the topmost one that users should be directed to initially. If you have configured Halibut to generate a single file, it will be called \c{Manual.html}. \b \c{output.info}, and some additional files \c{output.info\-1}, \c{output.info\-2} etc., will be files suitable for use with GNU \c{info}. \b \c{output.pdf} will be a printable PDF manual. \b \c{output.ps} will be a printable PostScript manual. \H{running-options} \ii{Command-line options} Halibut supports command-line options in case you don't want to use all of Halibut's \i{output formats}, or you want to configure the names of your \i{output files}, or you want to supply additional configuration on the command line. The supported options are listed here. Firstly, there are options which indicate which of the output formats you want Halibut to generate: \dt \i\cw{--text}[\cw{=}\e{filename}] \dd Specifies that you want to generate plain text output. You can optionally specify a file name (e.g. \c{\-\-text=myfile.txt}), in which case Halibut will change the name of the output file as well. \dt \i\cw{--html}[\cw{=}\e{filename}] \dd Specifies that you want to generate HTML output. You can optionally specify a file name (e.g. \c{\-\-html=myfile.html}), in which case Halibut will change the name of the output file as well. Specifying a file name here will also cause the HTML to be output in \e{only} one file, instead of the usual behaviour of producing multiple files with links between them. If you want to produce multiple files and configure their names, you will need to use the more complete file name configuration directives given in \k{output-html-file} (although you may want to do so on the command line, using the \c{-C} option). \dt \i\cw{--xhtml}[\cw{=}\e{filename}] \dd Synonym for \c{--html}. \dt \i\cw{--winhelp}[\cw{=}\e{filename}] \dd Specifies that you want to generate old-style Windows Help output. You can optionally specify a file name (e.g. \c{\-\-winhelp=myfile.hlp}), in which case Halibut will change the name of the output file as well. \lcont{ Your output file name should end with \c{.hlp}; if it doesn't, Halibut will append it. Halibut will also generate a contents file (ending in \c{.cnt}) alongside the file name you specify. } \dt \i\cw{--whlp}[\cw{=}\e{filename}] \dd Synonym for \c{\-\-winhelp}. \dt \i\cw{--hlp}[\cw{=}\e{filename}] \dd Synonym for \c{\-\-winhelp}. \dt \i\cw{--man}[\cw{=}\e{filename}] \dd Specifies that you want to generate \cw{man} page output. You can optionally specify a file name (e.g. \c{\-\-man=myfile.5}), in which case Halibut will change the name of the output file as well. \dt \i\cw{--info}[\cw{=}\e{filename}] \dd Specifies that you want to generate GNU \c{info} output. You can optionally specify a file name (e.g. \c{\-\-info=myfile.info}), in which case Halibut will change the name of the output file as well. \lcont{ Unless the \c{info} output format is configured not to (see \k{output-info}), Halibut will divide the \c{info} output into many small files. The extra files will have numeric suffixes on their names; so, for example, \c{output.info} might be accompanied by additional files \c{output.info\-1}, \c{output.info\-2} and so on. } \dt \i\cw{--pdf}[\cw{=}\e{filename}] \dd Specifies that you want to generate PDF output. You can optionally specify a file name (e.g. \c{\-\-pdf=myfile.pdf}), in which case Halibut will change the name of the output file as well. \dt \i\cw{--ps}[\cw{=}\e{filename}] \dd Specifies that you want to generate PostScript output. You can optionally specify a file name (e.g. \c{\-\-ps=myfile.ps}), in which case Halibut will change the name of the output file as well. If you do not specify any of the above options, Halibut will simply produce \e{all} of its output formats. Also, there is an option which allows you to specify an arbitrary \i\c{\\cfg} configuration directive (see \k{input-config}): \dt \i\cw{-C}\e{config-directive}\cw{:}\e{value}[\cw{:}\e{value}...] \dd The text following \c{\-C} is expected to be a colon-separated list of strings. (If you need a literal colon, you can escape it with a backslash: \c{\\:}. If you need a literal \e{backslash}, you can do the same: \c{\\\\}.) These strings are used as the parts of a \c{\\cfg} directive. So, for example, the option \lcont{ \c -Ctext-section-align:2:leftplus will translate into the configuration directive \c \cfg{text-section-align}{2}{leftplus} (Note that your shell may also take an interest in backslashes, particularly under Unix. You may find that the backslash with which you escape a colon must be doubled in order to make the shell pass it to Halibut at all, and to pass a doubled backslash to Halibut you might have to type four backslashes on your shell command line. This is not part of Halibut's own behaviour, and it cannot do anything about it.) Configuration directives created in this way take effect after all other input has been processed. (In most cases, this has the effect of overriding any other instances of the directive in the input.) } The options which set the output file names actually work by implicitly generating these configuration directives. When you specify \c{\-\-text=myfile.txt}, for example, Halibut treats it identically to \c{\-\-text \-Ctext-filename:myfile.txt}. The Windows Help and man page formats work similarly. HTML is slightly different, since it also arranges for single-file output if you pass a filename to \c{\-\-html}; so \c{\-\-html=myfile.html} is equivalent to \c{\-\-html \-Chtml-single-filename:myfile.html \-Chtml-leaf-level:0}. (See \k{output} for explanations of all these configuration directives.) In addition to these, there are also a few other options: \dt \i\cw{--input-charset}\cw{=}\e{charset} \dd Changes the default assumed \i{character set} for all input files from ASCII to something else. (\cw{\-Cinput-charset} cannot be used for this, as \cw{\-C} directives are processed after all other input, so wouldn't affect any files.) \lcont{ Any \cw{\\cfg\{input-charset\}} directives within input files override this option. See \k{input-config} for more information about the input character set. } \dt \I{character sets, enumerating}\i\cw{--list-charsets} \dd List character sets known to Halibut. \dt \i\cw{--list-fonts} \dd List fonts known to Halibut, both those it intrinsically knows about and those found in its input files. \dt \i\cw{--help} \dd Print a brief help message and exit immediately. (Don't confuse this with \c{\-\-winhelp}!) \dt \i\cw{--version} \dd Print information about Halibut's version number and exit immediately. \dt \i\cw{--licence} \dd Display Halibut's licence (see also \k{licence}) and exit immediately. \dt \cw{--license} \dd US English alternative spelling of \c{\-\-licence}. \dt \i\cw{--precise} \dd Report column numbers as well as line numbers when reporting errors in the Halibut input files. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/inputs/���������������������������������������������������������������������������������0000755�0001753�0001753�00000000000�12444773746�011356� 5����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/inputs/errors.but�����������������������������������������������������������������������0000644�0001753�0001753�00000002074�12444773746�013331� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bogus keyword: \k{nonexist} \BR{nonexist2} [Foogle] \B{book} Foo McBar, "A Lot Of Rubbish", 1992. \B{book} The same book again. Isn't that odd? \IM{nonexist3} Logical impossibilities Fingly \i{eep}. \IM{eep} Thing: with a colon Flongly \i{eep:sping}. \define{macro} macro definition \define{macro} same macro again \c Foo \c Bar Bombadillo. Now get out of _that_. \unngh This is a bit of a bizarre paragraph, now isn't it? \C{unfinished-symphony \U{thisshouldn'tbehere} Unnumbered chapter. Or is it? \C Numbered chapter. Or _is_ it? \BR{two}{too}{many} [Which One?] \nocite{ooh} With some illegal text. Paragraph with {bizarre braces}. Another one } . Bogus in-para comment: \# foobar. Bogus xrefs: \k and \k{foo{}}. Nest those styles! \c{foo\e{bar}}. And \c{foo\W{file:/dev/null}\e{bar}}. And \e{foo\i\c{bar}}. And one without brace: \e. Bogus hyperlinks: \W and \W{file:/dev/null}bar. Nested index: \i{foo\i{bar}}. Broken styled index: \i\c. Complete twaddle: \twaddle. Unclosed brace: \c{foo. \U Spong, wimble: flomp. Comment to EOF: \#{ and here we go. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/inputs/errors2.but����������������������������������������������������������������������0000644�0001753�0001753�00000000166�12444773746�013413� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������\H{outofplace} Heading out of place. \C{chap} Chapter is fine \S{subsect} Subsection should have heading before it. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/inputs/test.but�������������������������������������������������������������������������0000644�0001753�0001753�00000024116�12444773746�012775� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������\define{eur} \u20AC{EUR } \title Halibut: A Test Document With A Stupidly Long Title (worth \eur\.1000) Just To See If Wrapping Titles Works OK. In Fact This Title Will Span Three Lines, Not Just Two. How's That For Ludicrous? More than that, though, we'd like to make it more than 255 characters long so that the PostScript backend has to treat it specially in order to pass it to pdfmark. \cfg{xhtml-leaf-smallest-contents}{2} \cfg{xhtml-leaf-contains-contents} {true} \cfg{info-dir-entry}{Sillinesses}{test.but}{Halibut test document} \cfg{info-dir-entry}{Florbles}{test.but}{Subsection of Halibut test document}{sub-sub} \cfg{info-section-underline}{2}{~} \cfg{info-charset}{utf-8} \cfg{man-headnumbers}{true} \cfg{contents}{Contents - edited title} \cfg{index}{Index - also edited title} This paragraph is not labelled \q{preamble}, but should still appear as it. \preamble This manual is a small joke effort, designed to use every feature \#{ comment } that Halibut's input format supports. Creation date \date{%Y.%m.%d} (default format is \date). \c Here is a code paragraph in the preamble, just to stress that all \c things are possible. Ooh! \copyright Copyright 1999 Simon \#{second comment}Tatham. All rights reserved. Here's another \i{preamble paragraph}, which goes after the copyright. \define{metacoopt} [this is a nested, multi-line macro, talking about \coopt a bit] \define{coopt} co\u00F6{-o}pt \versionid Arbitrary version id text \C{ch\\ap} First chapter title; for similar wrapping reasons this chapter title will be ludicrously long. I wonder how much more chapter title I can write before feeling silly. This is a para\#{another{} comment}graph of text. It has line\#{yet another one} breaks in between words, multiple spaces (ignored), \e{emphasised text} and \s{strong text} as well as \c{code fragments}. \#{This is an inline comment alone in a paragraph.} \cw{This} is weak code; \cq{this} is quoted code. And \k{head} contains some other stuff. \K{subhead} does too. To test the man page back end: .Directive 'Directive \cw{.Directive} \cw{'Directive} \\Sping\\Spong\\Spoing \H{head} First section title (very long again, no prizes for guessing the reason why this time, and here's yet more text to pad it out to three lines of output) \cfg{winhelp-topic}{M359HPEHGW} Here's a code paragraph: \c No leading spaces \c One leading space \c Two blank lines follow this one. \c \c \c Two blank lines precede this one. \c Two leading spaces \c We can use \ { and } with impunity here. \c We can use discretionary bold and italic in code paragraphs! \e bbbb iiiiii \c Isn't that ludicrous? \c \c man page tricky characters: command -o 'quoted' -o `backticks` This is a list: \b Ooh. \b Aah. \lcont{ This bulletted list contains a list continuation. This is an additional paragraph, or more than one, indented at the same level as the list items, and able to contain nested sublists and other features. For example, here's a code paragraph: \c spingle:~$ whoami \c spoggler And here's a sublist. Numbered, just for variety. \n One. \lcont{ \n 1a. \n 1b. \lcont{ \c Code \c Paragraph } \n 1c. \lcont{This is an even sillier one: a continuation of a list item in a continuation of a list item in a continuation of a list item!} } \n Two. \n Threeeee! } \b Eek. This is a horizontal rule: \rule This is a numbered list: \n Ooh. \n{keyword} Aah. \n Eek. \q{Aah} is point \k{keyword}. This is a description list: \dt FISH \dd A piscine creature, often to be found swimming aimlessly around in the sea eating things and not contributing to the global economy. \lcont{ Here's another of those funky list continuation things, just to keep Halibut on its toes. } \dt BADGER \dd A non-piscine creature, often to be found snuffling around on land, not contributing to the global economy, and not even swimming to make up for it. I don't know. These mammals. Pa-thetic. \dt "SAUSAGE SALESMAN" \dd An exemplary contributor to the global economy. Unless he's CMOT Dibbler. This is a much more interesting description list, testing consecutive \c{\\dt}s and consecutive \c{\\dd}s: \dt One \dt Two \dt Three \dd Ay \dt Four \dd Bee \dd Cee \dd Dee A-paragraph-full-of-hyphens-to-test-the-idea-that-word-wrapping-can-happen-somewhere-in-all-this-hyphenatory-nonsense. A\-paragraph\-full\-of\-nonbreaking\-hyphens\-to\-test\-the\-idea\-that\-word\-wrapping\-misses\-them. A\_paragraph\_full\_of\_nonbreaking\_spaces\_to\_test\_the\_idea\_that\_word\_wrapping\_misses\_them\_too. Use of macros: let's talk about \coopt. And about \coopt some more. And a nested macro: \metacoopt. A slightly more difficult macro: \eur\.2500. Test of input character set switching. \n 8859 character in ASCII mode: expect nothing useful. [coöpt] \cfg{input-charset}{ISO-8859-1} \n 8859 character in 8859 mode: expect the right thing. [coöpt] \cfg{input-charset}{UTF-8} \n 8859 character in UTF-8 mode: expect the wrong thing. [coöpt] \cfg{silliness}{coöpt} \n UTF-8 sequence in UTF-8 mode: expect the right thing again. [coöpt] \cfg{input-charset}{ASCII} Back to ASCII again. Oh, while I'm here: some special characters. The \\, \{ and \} characters, to be precise. And their code equivalents, \c{\\}, \i\c{\{}, \c{\}}. The ` and ' characters (grave and apostrophe) are special in some output formats. Now let's exercise the paper backends a little. This is the entire Adobe Standard Latin character set, which should be enough to cause us to need to encode the main font twice: \cfg{input-charset}{ISO-8859-1} A Æ Á Â Ä À Å Ã B C Ç D E É Ê Ë È Ð F G H I Í Î Ï Ì J K L \u0141 M N Ñ O Ó Ô Ö \u0152 Ò Ø Õ P Q R S \u0160 T Þ U Ú Û Ü Ù V W X Y Ý \u017d a á â ´ ä æ à & å ^ ~ * @ ã b \\ | \{ \} [ ] ¦ \u2022 c \u02c7 ç ¸ ¢ \u02c6 : , © ¤ d \u2020 \u2021 ° ¨ ÷ $ \u02d9 \u0131 e é ê ë è 8 \u2026 \u2014 \u2013 = ð ! ¡ f \ufb01 5 \ufb02 \u0192 4 \u2044 g ß \u2039 \u203a ` > « » h - \u02dd i í î ï ì j k l \u0142 < ¬ m \u2212 \u00B5 × n 9 ñ # o ó ô ö \u0153 ò 1 ½ ¼ ¹ ª º ø õ p \u00b6 ( ) % \u2030 . · + ± q ? ¿ " \u201e \u201c \u201d \u2018 \u2019 \u201a ' r ® \u02da s \u0161 \u00A7 ; 7 6 / £ t þ 3 ¾ ³ \u02dc \u2122 2 ² u ú û ü ù _ v w x y ý ÿ ¥ z \u017e 0 \cfg{input-charset}{ASCII} Testing ligatures in normal (fi), emphasised (\e{fi}), strong (\s{fi}), code (\c{fi}) and weak code (\cw{fi}). The latter two should not be ligated. \c Also in a code paragraph (fi) with bold (fi) and italic (fi). \e bb ii \c There should be no ligation there. The following pair of characters map to different glyphs with the same name in some Microsoft TrueType fonts: \u0394{(missing)} \u2206{(missing)} \S{subhead} First subheading So here's a \I{subheading}\I{subsection}subsection. Just incidentally, \q{this} is in quotes. \ii{Those} quotes had better work in all formats. We'll try for some Unicode here: \i{Schr\u00F6{oe}dinger}. An index tag containing non-alternatived Unicode: \i{\u00BFChe?} An invisible index tag: \I{she seems to have an invisible tag}yeah. An index tag inside another tag: jackdaws love my \e{big \i{sphinx}} of quartz. Similarly, we should support things like hyperlinks \e{\W{http://www.tartarus.org/}{at the beginning} of emphasised sections}, and \e{in the \W{http://www.tartarus.org/}{middle} of them}, and also \e{at the \W{http://home.att.net/~cecw/lastpage.htm}{end}}. Try that all over against with \c{\\s}: hyperlinks \s{\W{http://www.tartarus.org/}{at the beginning} of strong sections}, and \s{in the \W{http://www.tartarus.org/}{middle} of them}, and also \s{at the \W{http://home.att.net/~cecw/lastpage.htm}{end}}. Here's a hyperlink containing some special characters: \W{http://a<b&c>d/}{here}. (Not that it'll \e{work}, but you can at least determine that it's been correctly escaped by inspection of the output HTML.) \#{FIXME: Unfortunately, we still don't quite do the right thing with references: How about a \e{reference to \k{subhead} here}? And at \e{the end: \k{subhead}} and \e{\k{subhead}: the start}? } \S2{sub-sub}{Florble} Smaller heading still A tiny section. Awww. How cute. Actually, this one's a \e{florble}, and here's a reference to it: \k{sub-sub}. \A{app} Needless appendix \# \cfg{winhelp-topic}{Y5VQEXZQVJ} (uncomment this and it clashes) Here's an \i{appendix}, for no terribly good reason at all. See __\k{book}__ (please excuse those underscores, I'm testing whitespace). It also contains a \W{http://www.tartarus.org/}{hyperlink}. Also I'm going to index \i\c{-output} to ensure that its two components are displayed as a joined-up code fragment in the index. Here are \I{testone}some \I{testtwo}subsections \I{testthree}with silly chapter titles and interesting use of Unicode. The Unicode oddities are in the titles rather than the body text because that way I get to test their handling in the PDF document outline. \H{app-one} The 1024 \u00D7{x} 768 screen resolution Err. \H{app-two} How about Spongletech\u2122{(TM)}? Umm. \# I'm going to label one of these with a carefully chosen fragment \# name "i1", because I know this will also be generated as an index \# fragment name and this allows me to test the fragment name clash \# detection. \# \# To actually run this test you need to configure html-leaf-level \# to 0 and html-template-fragment to %k. \H{i1} Or just Erd\u0151{\u00F6{o}}s? Ahh. \H{app-\\two} Section with inconvenient keyword If you apply this file together with \cw{doc/chm.but}, this section should test \cw{html_sanitise_filename()}. \U Bibliography \B{book} Some text describing a book. \B{nocite} Some text describing a book. This text should appear in the document even though there is no \cw{\\k} citing it. \BR{book} [SillyCitation] \BR{uncited} Badger. \nocite{nocite} \B{uncited} If this text appears, there's an actual error. \# This is a comment. \# Now for the index section. \IM{she seems to have an invisible tag}{appendix} Invisible tags and/or appendices \# The display forms of these three index terms differ only in case. \# This is a fiddly special case in the Windows Help backend, \# because Windows Help's index mechanism is case-insensitive... \IM{testone} Test \IM{testtwo} TesT \IM{testthree} test ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/misc/�����������������������������������������������������������������������������������0000755�0001753�0001753�00000000000�12444773746�010767� 5����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/misc/halibut.el�������������������������������������������������������������������������0000644�0001753�0001753�00000011352�12444773746�012663� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������;; Halibut mode for emacs. ;; ;; Tested on GNU emacs 23.2.1. (defun halibut-mode-font-lock-extend-region () (save-excursion (let (new-beg new-end) (goto-char font-lock-beg) (if (re-search-backward "\n[ \t]*\n" nil 1) (goto-char (match-end 0))) (setq new-beg (point)) (goto-char font-lock-end) (re-search-forward "\n[ \t]*\n" nil 1) (setq new-end (point)) (if (and (= new-beg font-lock-beg) (= new-end font-lock-end)) nil ;; did nothing (setq font-lock-beg new-beg) (setq font-lock-end new-end) t)))) (defun halibut-mode-match-braced-comment (limit) ;; Look for a braced Halibut comment, which starts with \#{ and ends ;; with } but has to skip over matching unescaped braces in between. (if (not (search-forward "\\#{" limit t)) nil ;; didn't find the introducer string (let ((start (match-beginning 0)) (depth 1)) (goto-char (match-end 0)) ;; Repeatedly find the next unescaped brace and adjust depth. (while (and (> depth 0) (looking-at "\\([^\\\\{}]\\|\\\\.\\)*\\([{}]\\)") (< (match-end 2) limit)) (setq depth (if (string= (match-string 2) "{") (1+ depth) (1- depth))) (goto-char (match-end 2))) ;; If depth hit zero, we've stopped just after the closing ;; brace. If it didn't, we should stop at limit. (if (> depth 0) (goto-char limit)) ;; Now the string between 'start' and point is our match. (set-match-data (list start (point))) t))) (defun halibut-mode-match-paragraph-comment (limit) ;; Look for a whole-paragraph Halibut comment, which starts with \# ;; and then something other than an open brace, and ends at the next ;; paragraph break. (catch 'found-one (while (search-forward "\\#" limit t) (let ((start (match-beginning 0))) ;; For each \# we find, check to see if it's eligible. (when (and ;; It must not be followed by {. (not (looking-at "\\\\#{")) ;; It must be the first thing in its paragraph (either ;; because the chunk of whitespace immediately preceding it ;; contains more than one \n, or because that chunk of ;; whitespace terminates at the beginning of the file). (let ((this-line (line-number-at-pos))) (save-excursion (goto-char start) (skip-chars-backward "\n\t ") (or (= (point) (point-min)) (< (line-number-at-pos) (1- this-line)))))) ;; If those conditions are satisfied, we've found an ;; eligible \#. Search forward for the next paragraph end. (if (re-search-forward "\n[ \t]*\n" nil 1) (goto-char (match-beginning 0))) ;; Now the string between 'start' and point is our match. (set-match-data (list start (point))) ;; Terminate the while loop. (throw 'found-one t)))) ;; The loop terminated without finding anything. nil)) (defun halibut-mode-match-code-or-emphasis-line (char limit) ;; Look for a Halibut code line (starting with "\c " or containing ;; only "\c"). Either right here... (if (and (= (current-column) 0) (looking-at (concat "\\\\" char "[ \n]"))) (let ((start (match-beginning 0))) (end-of-line) (set-match-data (list start (min limit (point)))) t) ;; ... or further down... (if (re-search-forward (concat "\n\\\\" char "[ \n]") limit t) (let ((start (1+ (match-beginning 0)))) (goto-char start) (end-of-line) (set-match-data (list start (min limit (point)))) t) ;; and if neither of those, we didn't find one. nil))) (defun halibut-mode-match-code-line (limit) (halibut-mode-match-code-or-emphasis-line "c" limit)) (defun halibut-mode-match-emphasis-line (limit) (halibut-mode-match-code-or-emphasis-line "e" limit)) (defconst halibut-font-lock-keywords '((halibut-mode-match-braced-comment . font-lock-comment-face) (halibut-mode-match-paragraph-comment . font-lock-comment-face) (halibut-mode-match-code-line . font-lock-string-face) (halibut-mode-match-emphasis-line . font-lock-preprocessor-face) ("\\\\\\([-{}_\\\\]\\|u[0-9a-fA-F]*\\|[A-Za-tv-z][0-9A-Za-z]*\\)" . font-lock-keyword-face)) "Syntax highlighting for Halibut mode.") ;;;###autoload (define-derived-mode halibut-mode fundamental-mode "Halibut" "Major mode for editing Halibut documentation markup." (setq font-lock-defaults '(halibut-font-lock-keywords t)) (add-hook 'font-lock-extend-region-functions 'halibut-mode-font-lock-extend-region)) ;;;###autoload (add-to-list 'auto-mode-alist '("\\.but\\'" . halibut-mode)) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/misc/halibut.sl�������������������������������������������������������������������������0000644�0001753�0001753�00000006246�12444773746�012707� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������% Halibut mode for Jed. $1 = "Halibut"; create_syntax_table ($1); define_syntax ("\#", "", '%', $1); % Comment Syntax define_syntax ('\\', '\\', $1); % Quote character define_syntax ("{", "}", '(', $1); % are all these needed? define_syntax ("a-zA-Z0-9", 'w', $1); set_syntax_flags ($1, 8); #ifdef HAS_DFA_SYNTAX %enable_highlight_cache ("halibut.dfa", $1); % A braced comment in Halibut is \#{ ... }, where ... may contain % any correctly nested sequence of braces. Of course we can't match % that in a DFA rule, so we'll go down to a reasonable depth of 3 % instead. #ifexists dfa_define_highlight_rule dfa_define_highlight_rule ("\\\\#{[^{}]*({[^{}]*({[^}]*}[^{}]*)*}[^{}]*)*}", "Qcomment", $1); dfa_define_highlight_rule ("\\\\#.*$", "comment", $1); dfa_define_highlight_rule ("^\\\\c([ \t].*)?$", "string", $1); dfa_define_highlight_rule ("\\\\[\\\\{}\\-_]", "keyword0", $1); dfa_define_highlight_rule ("\\\\[A-Za-tv-z][A-Za-z0-9]*", "keyword0", $1); dfa_define_highlight_rule ("\\\\u[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]", "keyword0", $1); dfa_define_highlight_rule ("\\\\u[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]", "keyword1", $1); dfa_define_highlight_rule ("[{}]", "delimiter", $1); dfa_define_highlight_rule (".", "normal", $1); dfa_build_highlight_table ($1); #else define_highlight_rule ("\\\\#{[^{}]*({[^{}]*({[^}]*}[^{}]*)*}[^{}]*)*}", "Qcomment", $1); define_highlight_rule ("\\\\#.*$", "comment", $1); define_highlight_rule ("^\\\\c([ \t].*)?$", "string", $1); define_highlight_rule ("\\\\[\\\\{}\\-_]", "keyword0", $1); define_highlight_rule ("\\\\[A-Za-tv-z][A-Za-z0-9]*", "keyword0", $1); define_highlight_rule ("\\\\u[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]", "keyword0", $1); define_highlight_rule ("\\\\u[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]?[A-Fa-f0-9]", "keyword1", $1); define_highlight_rule ("[{}]", "delimiter", $1); define_highlight_rule (".", "normal", $1); build_highlight_table ($1); #endif #endif % This hook identifies lines containing comments as paragraph separator define halibut_is_comment() { bol (); while (ffind ("\\\\#")) go_right (3); ffind ("\\#"); % return value on stack } variable Halibut_Ignore_Comment = 0; % if true, line containing a comment % does not delimit a paragraph define halibut_paragraph_separator() { bol(); skip_white(); if (eolp()) return 1; if (looking_at("\\c ") or looking_at("\\c\t") or looking_at("\\c\n")) return 1; return not (Halibut_Ignore_Comment) and halibut_is_comment(); } define halibut_wrap_hook() { variable yep; push_spot (); yep = up_1 () and halibut_is_comment (); pop_spot (); if (yep) { push_spot (); bol_skip_white (); insert ("\\# "); pop_spot (); } } #ifexists mode_set_mode_info mode_set_mode_info("Halibut", "fold_info", "\\# {{{\r\\# }}}\r\r"); #endif define halibut_mode() { variable mode = "Halibut"; % use_keymap (mode); set_mode (mode, 0x1 | 0x20); set_buffer_hook ("par_sep", "halibut_paragraph_separator"); set_buffer_hook ("wrap_hook", "halibut_wrap_hook"); use_syntax_table (mode); runhooks ("halibut_mode_hook"); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/misc/halibut.spec�����������������������������������������������������������������������0000644�0001753�0001753�00000003465�12444773746�013223� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# David Leonard <dleonard%vintela.com>, 2004. # This file given to Simon Tatham to be released under the MIT licence # of the Halibut distribution. # # SGT: I have no RedHat machine on which to test this file, so I # cannot guarantee that it won't become out of date as the main # Halibut code develops. It was submitted to me on 2004-11-17. Name: halibut Version: 0.9 Release: 1 Source: http://www.chiark.greenend.org.uk/~sgtatham/halibut/%{name}-%{version}.tar.gz Group: Applications/Text Summary: TeX-like software manual tool License: MIT URL: http://www.chiark.greenend.org.uk/~sgtatham/halibut.html BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot %package vim Group: Applications/Editors Summary: Syntax file for the halibut manual tool PreReq: vim %description Halibut is yet another text formatting system, intended primarily for writing software documentation. It accepts a single source format and outputs a variety of formats, planned to include text, HTML, Texinfo, Windows Help, Windows HTMLHelp, PostScript and PDF. It has comprehensive indexing and cross-referencing support, and generates hyperlinks within output documents wherever possible. %description vim This package provides vim syntax support for Halibut input files (*.but). %prep %setup %build gmake VERSION="%{version}" (cd doc && gmake) %install mkdir -p %{buildroot}%{_bindir} install -m 555 build/halibut %{buildroot}%{_bindir}/halibut mkdir -p %{buildroot}%{_mandir}/man1 install -m 444 doc/halibut.1 %{buildroot}%{_mandir}/man1/halibut.1 VIMSYNTAX=%{_prefix}/share/vim/current/syntax mkdir -p $RPM_BUILD_ROOT/$VIMSYNTAX install -m 444 misc/halibut.vim %{buildroot}$VIMSYNTAX/halibut.vim %files %{_bindir}/halibut %{_mandir}/man1/halibut.1* %doc doc/halibut.txt doc/*.but doc/*.html LICENCE %files vim %{_prefix}/share/vim/current/syntax/halibut.vim �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/misc/halibut.st�������������������������������������������������������������������������0000644�0001753�0001753�00000003315�12444773746�012711� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- c -*- * Name: halibut * Description: Halibut document formatter. * Author: Simon Tatham <anakin@pobox.com> */ state halibut_paragraph extends Highlight { /^[[:space:]]*$/ { language_print($0); return; } } state halibut_nested_braces extends Highlight { BEGIN { nestlevel = 1; } /{/ { language_print($0); nestlevel++; } /}/ { language_print($0); nestlevel--; if (nestlevel == 0) return; } } state halibut extends HighlightEntry { /* one-non-letter commands */ /\\\\[-\\\\_{}.]/ { keyword_face(true); language_print($0); keyword_face(false); } /* code paragraphs */ /^\\\\c / { keyword_face(true); language_print($0); keyword_face(false); string_face(true); call(eat_one_line); string_face(false); } /* emphasis in code paragraphs */ /^\\\\e / { keyword_face(true); language_print($0); keyword_face(false); builtin_face(true); call(eat_one_line); builtin_face(false); } /* \uXXXX Unicode commands */ /\\\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]/ { keyword_face(true); language_print($0); keyword_face(false); } /* multi letter commands */ /\\\\[0-9a-tv-zA-Z][0-9a-zA-Z]*/ { keyword_face(true); language_print($0); keyword_face(false); } /* paragraph-type comments */ /\\\\#/ { comment_face(true); language_print($0); call(halibut_paragraph); comment_face(false); } /* intra-paragraph type comments */ /\\\\#{/ { comment_face(true); language_print($0); call(halibut_nested_braces); comment_face(false); } /* I want to have braces highlighted; they're *special* */ /[{}]/ { keyword_face(true); language_print($0); keyword_face(false); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/misc/halibut.vim������������������������������������������������������������������������0000644�0001753�0001753�00000015042�12444773746�013056� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������" Vim syntax file " Language: Halibut " Maintainer: Jacob Nevins <jacobn+vim@chiark.greenend.org.uk> " URL: http://www.chiark.greenend.org.uk/~sgtatham/halibut/ " Filenames: *.but " I've never been entirely comfortable with vim's syntax highlighting " facilities, so this may have all sorts of nasty loose ends, corner cases " etc, but it works for me. " I have no idea if it's compatible with vim <6.1. " Based on docs in Halibut CVS 2004-03-31 " FIXME: " - sync - last blank line, \quote, \lcont " - add "display" etc for speed? " Rune from vim 6.1 help " For version 5.x: Clear all syntax items " For version 6.x: Quit when a syntax file was already loaded if version < 600 syn clear elseif exists("b:current_syntax") finish endif " Halibut is case-sensitive. syn case match " Fallbacks -- if these characters are seen in text and not caught by " anything below, it's probably a syntax violation. syn match butIllegalChar "{" syn match butIllegalChar "}" syn match butIllegalChar "\\" " Simple-minded fallback to highlight any command we don't recognise, " and assume it has textual arguments. " (matches current iscmd() in input.c; there are some oddballs which " don't fit this handled specially below) syn match butCmdGeneric "\\[A-Za-z0-9]\+" nextgroup=butTextArg syn cluster butText contains=butLiteral,@butCmd,butTodo " The special one-character "commands". " XXX might want to split up? Can all these appear in \k{...}? syn match butLiteral "\\[-{}_.\\]" " This isn't specific to Halibut, but is often useful. syn keyword butTodo XXX FIXME TODO " Specific processing comes after the generic stuff above. " Paragraph level stuff. " Literals -- might need to come before \e{}, \c{} syn region butQuoteLit matchgroup=butCmdSpecific start="\\c\_s\@=" matchgroup=NONE end="$" syn region butQLEmph matchgroup=butCmdSpecific start="\\e\_s\@=" matchgroup=NONE end="$" contains=butQLEmphInv " Highlight invalid characters in emphasis line, cos I'll never remember. syn match butQLEmphInv "\S\@=[^bi]" contained " Paragraph level comment -- might need to come before inline comment. syn region butCommentPara start="\\#" end="^\s*$" contains=butTodo " Inline comments -- nested braces are honoured. syn region butComment matchgroup=Comment start="\\#{" skip="\\}" end="}" contains=butCommentBrace,butTodo syn region butCommentBrace start="{" skip="\\}" end="}" contains=butCommentBrace,butTodo contained transparent " Section headings - a bit hairy. Order wrt rest of file is important. syn match butCmdSpecific "\\\(S\d\|[CAHS]\)" nextgroup=butIdentArgH " butIdentArgH -> butTextArgH? -> this, which highlights the rest of the para: syn region butTextHeading start="" end="^\s*$" contained contains=@butText " Unadorned headings syn match butCmdSpecific "\\U\_s\@=" nextgroup=butTextHeading " ...and overall title syn match butCmdSpecific "\\title\_s\@=" nextgroup=butTextHeading " Bulleted lists -- arguments optional syn match butCmdSpecific "\\\(b\|n\|dd\)[^A-Za-z0-9]\@=" nextgroup=butIdentArg " Config syn match butCmdSpecific "\\cfg{\@=" nextgroup=butCfgArg " Index/biblio stuff syn match butCmdSpecific "\\IM{\@=" nextgroup=butIMArg syn match butCmdSpecific "\\BR\={\@=" nextgroup=butIdentArg syn match butCmdSpecific "\\nocite{\@=" nextgroup=butIdentArg " Macros syn match butCmdSpecific "\\define{\@=" nextgroup=butIdentArg " Specific inline commands " (Some of these are defined out of paranoia about clashes with code quotes.) " Indexing -- invisible entries. (includes \I\c, \I\cw; \I\e left; no \q, \cq) syn match butCmdSpecific "\\I\(\\cw\|\\c\)\={\@=" nextgroup=butIndexArg " Formatting. syn match butCmdSpecific "\\e{\@=" nextgroup=butEmphArg syn match butCmdSpecific "\\c{\@=" nextgroup=butTextArg syn match butCmdSpecific "\\cw{\@=" nextgroup=butTextArg syn match butCmdSpecific "\\cq{\@=" nextgroup=butTextArg syn match butCmdSpecific "\\W{\@=" nextgroup=butHyperArg " Xref commands syn match butCmdSpecific "\\[kK]{\@=" nextgroup=butIdentArg " Unicode literal -- a bit special. syn match butLiteral "\\u\x\{,4}" nextgroup=butTextArg " Command cluster. syn cluster butCmd contains=butCmdGeneric,butCmdSpecific,butComment,butQuoteLit,butQLEmph,butCommentPara,butLiteral " Types of argument. XXX is this cluster still useful? syn cluster butArgument contains=butTextArg,butIdentArg,butEmphArgmbutCfgArg,butIdentArgH,butTextArgH " Generic identifier. syn region butIdentArg matchgroup=butDelimiter start="{" skip="\\}" end="}" nextgroup=@butArgument contained contains=butLiteral " Specific chain for headings (needs to come after other heading material) syn region butTextArgH matchgroup=butDelimiter start="{" skip="\\}" end="}" nextgroup=butTextHeading contained contains=@butText syn region butIdentArgH matchgroup=butDelimiter start="{" skip="\\}" end="}" nextgroup=butTextArgH,butTextHeading contained contains=butLiteral " Specific hack for \cfg{} syn region butCfgArg matchgroup=butDelimiter start="{" skip="\\}" end="}" nextgroup=butCfgArg contained contains=butLiteral " Generic argument to be emphasised syn region butEmphArg matchgroup=butDelimiter start="{" skip="\\}" end="}" contained contains=@butText " Specific hack for \W{}{} syn region butHyperArg matchgroup=butDelimiter start="{" skip="\\}" end="}" contained nextgroup=butTextArg " Specific hack for \I{} syn region butIndexArg matchgroup=butDelimiter start="{" skip="\\}" end="}" contained contains=@butText " Specific hack for \IM{}{}... syn region butIMArg matchgroup=butDelimiter start="{" skip="\\}" end="}" contained nextgroup=butIMArg contains=@butText " Default argument (due to being last). syn region butTextArg matchgroup=butDelimiter start="{" skip="\\}" end="}" nextgroup=@butArgument contained contains=@butText transparent " Rune from vim 6.1 help if version >= 508 || !exists("did_halibut_syn_inits") if version < 508 let did_halibut_syn_inits = 1 command -nargs=+ HiLink hi link <args> else command -nargs=+ HiLink hi def link <args> endif HiLink butCmdGeneric Statement HiLink butCmdSpecific Statement HiLink butLiteral SpecialChar HiLink butQLEmphInv Error HiLink butIllegalChar Error HiLink butComment Comment HiLink butCommentPara Comment HiLink butDelimiter Delimiter HiLink butIdentArg Identifier HiLink butIdentArgH Identifier HiLink butCfgArg Identifier HiLink butEmphArg Underlined HiLink butHyperArg Underlined HiLink butIndexArg Identifier HiLink butIMArg Identifier HiLink butTextHeading Underlined HiLink butTodo Todo delcommand HiLink endif " b: local to current buffer let b:current_syntax = "halibut" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/misc/logalloc���������������������������������������������������������������������������0000755�0001753�0001753�00000003747�12444773746�012444� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl # # Reads a log file, containing lines of the four types # <file> <line> malloc(<number>) returns <pointer> # <file> <line> strdup(<number>) returns <pointer> # <file> <line> calloc(<number>*<number>) returns <pointer> # <file> <line> realloc(<pointer>,<number>) returns <pointer> # <file> <line> free(<pointer>) # # with optional line on the front saying # null pointer is <pointer> # # and produces a list of free()s and realloc()s of wrong pointers, # and also of malloc()s, calloc()s and realloc()s that never get free()d. $errors=0; while (<>) { $in=$out=""; ($file, $line, $call, $in, $out)=($1,$2,$3,"",$4) if /^(\S+) (\S+) (malloc|strdup)\(\S+\) returns (\S+)$/; ($file, $line, $call, $in, $out)=($1,$2,"calloc","",$5) if /^(\S+) (\S+) calloc\(\S+\*\S+\) returns (\S+)$/; ($file, $line, $call, $in, $out)=($1,$2,"realloc",$3,$4) if /^(\S+) (\S+) realloc\((\S+),\S+\) returns (\S+)$/; ($file, $line, $call, $in, $out)=($1,$2,"free",$3,"") if /^(\S+) (\S+) free\((\S+)\)$/; $null = $1, next if /^null pointer is (\S+)$/; if ($in ne "") { if (&null($in)) { $bad = "null pointer"; } elsif (defined $lastalloc{$in}) { $bad = "already-freed pointer (last alloc $lastalloc{$in}, last free $lastfree{$in})"; } else { $bad = "bad pointer"; } $errors=1, print "($.) $file:$line: $call() $bad\n" if $record{$in} eq ""; $lastfree{$in}="($.) $file:$line"; $record{$in}=""; } if ($out ne "" && !&null($out)) { $errors=1, print "($.) $file:$line: $call() returned already ". "allocated pointer\n" if $record{$out} ne ""; $record{$out}="($.) $file:$line: $call()"; $lastalloc{$out}="($.) $file:$line"; } } foreach $i (keys %record) { $errors=1, print "$record{$i} never got freed\n" if $record{$i} ne ""; } print "no problems\n" if !$errors; # determine if a string refers to a null pointer sub null { local ($_) = @_; $null ? $_ eq $null : /^((0x)?0+|\(nil\))$/; } �������������������������halibut-1.1/charset/��������������������������������������������������������������������������������0000755�0001753�0001753�00000000000�12444773746�011465� 5����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/LICENCE�������������������������������������������������������������������������0000644�0001753�0001753�00000002106�12444773746�012371� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������libcharset is copyright 2003-2004 Simon Tatham. Portions copyright Ben Harris. 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 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. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/Makefile������������������������������������������������������������������������0000644�0001753�0001753�00000017454�12444773746�013060� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- make -*- # # Makefile for libcharset. # This Makefile should be sufficient to build libcharset and its # demo application all on its own. However, it's also a valid # Makefile _fragment_ which can be linked in to another program # Makefile to allow libcharset to be built directly into its # binary. # To include this as part of another Makefile, you need to: # # - Define $(LIBCHARSET_SRCDIR) to be a directory prefix (i.e. # probably ending in a slash) which allows access to the # libcharset source files. # # - Define $(LIBCHARSET_OBJDIR) to be a directory prefix (i.e. # probably ending in a slash) which allows access to the # directory where the libcharset object files need to be put. # # - Define $(LIBCHARSET_OBJPFX) to be a filename prefix to be # applied to the libcharset object files (in case, for example, # the file names clash with those of the main application, and # you need to call them cs-*.o to resolve the clash). # # - Define $(LIBCHARSET_GENPFX) to be a prefix to be added to # targets such as `all' and `clean'. (Mostly the point of this # is to get those targets out of the way for the Makefile # fragment including us.) # # - If you need your compiler to use the -MD flag, define $(MD) to # be `-MD'. # # This Makefile fragment will then define rules for building each # object file, and will in turn define $(LIBCHARSET_OBJS) to be # what you need to add to your link line. $(LIBCHARSET_GENPFX)all: \ $(LIBCHARSET_OBJDIR)libcharset.a \ $(LIBCHARSET_OBJDIR)convcs \ $(LIBCHARSET_OBJDIR)cstable \ $(LIBCHARSET_OBJDIR)confuse $(LIBCHARSET_OBJDIR)convcs: $(LIBCHARSET_SRCDIR)test.c \ $(LIBCHARSET_OBJDIR)libcharset.a $(CC) $(CFLAGS) -o $(LIBCHARSET_OBJDIR)convcs \ $(LIBCHARSET_SRCDIR)test.c \ $(LIBCHARSET_OBJDIR)libcharset.a $(LIBCHARSET_OBJDIR)cstable: $(LIBCHARSET_SRCDIR)cstable.c \ $(LIBCHARSET_OBJDIR)libcharset.a $(CC) $(CFLAGS) -o $(LIBCHARSET_OBJDIR)cstable \ $(LIBCHARSET_SRCDIR)cstable.c \ $(LIBCHARSET_OBJDIR)libcharset.a $(LIBCHARSET_OBJDIR)confuse: $(LIBCHARSET_SRCDIR)confuse.c \ $(LIBCHARSET_OBJDIR)libcharset.a $(CC) $(CFLAGS) -o $(LIBCHARSET_OBJDIR)confuse \ $(LIBCHARSET_SRCDIR)confuse.c \ $(LIBCHARSET_OBJDIR)libcharset.a LIBCHARSET_OBJS = \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)big5enc.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)big5set.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)cns11643.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)cp949.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)emacsenc.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)euc.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)fromucs.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)gb2312.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)hz.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)iso2022.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)iso2022s.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)istate.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)jisx0208.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)jisx0212.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)ksx1001.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)locale.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)localenc.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)macenc.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)mimeenc.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)sbcs.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)sbcsdat.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)shiftjis.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)slookup.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)superset.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)toucs.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)utf16.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)utf7.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)utf8.o \ $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)xenc.o \ # end of list $(LIBCHARSET_OBJDIR)libcharset.a: $(LIBCHARSET_OBJS) ar rcs $@ $(LIBCHARSET_OBJS) $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)big5enc.o: \ $(LIBCHARSET_SRCDIR)big5enc.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)big5set.o: \ $(LIBCHARSET_SRCDIR)big5set.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)cns11643.o: \ $(LIBCHARSET_SRCDIR)cns11643.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)cp949.o: \ $(LIBCHARSET_SRCDIR)cp949.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)emacsenc.o: \ $(LIBCHARSET_SRCDIR)emacsenc.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)euc.o: \ $(LIBCHARSET_SRCDIR)euc.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)fromucs.o: \ $(LIBCHARSET_SRCDIR)fromucs.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)gb2312.o: \ $(LIBCHARSET_SRCDIR)gb2312.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)hz.o: \ $(LIBCHARSET_SRCDIR)hz.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)iso2022.o: \ $(LIBCHARSET_SRCDIR)iso2022.c \ $(LIBCHARSET_OBJDIR)sbcsdat.h $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)iso2022s.o: \ $(LIBCHARSET_SRCDIR)iso2022s.c \ $(LIBCHARSET_OBJDIR)sbcsdat.h $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)istate.o: \ $(LIBCHARSET_SRCDIR)istate.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)jisx0208.o: \ $(LIBCHARSET_SRCDIR)jisx0208.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)jisx0212.o: \ $(LIBCHARSET_SRCDIR)jisx0212.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)ksx1001.o: \ $(LIBCHARSET_SRCDIR)ksx1001.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)locale.o: \ $(LIBCHARSET_SRCDIR)locale.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)localenc.o: \ $(LIBCHARSET_SRCDIR)localenc.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)macenc.o: \ $(LIBCHARSET_SRCDIR)macenc.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)mimeenc.o: \ $(LIBCHARSET_SRCDIR)mimeenc.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)sbcs.o: \ $(LIBCHARSET_SRCDIR)sbcs.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)shiftjis.o: \ $(LIBCHARSET_SRCDIR)shiftjis.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)slookup.o: \ $(LIBCHARSET_SRCDIR)slookup.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)superset.o: \ $(LIBCHARSET_SRCDIR)superset.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)toucs.o: \ $(LIBCHARSET_SRCDIR)toucs.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)utf16.o: \ $(LIBCHARSET_SRCDIR)utf16.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)utf7.o: \ $(LIBCHARSET_SRCDIR)utf7.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)utf8.o: \ $(LIBCHARSET_SRCDIR)utf8.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)xenc.o: \ $(LIBCHARSET_SRCDIR)xenc.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< # This object file is special, because its source file is itself # generated - and therefore goes in the object directory. $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)sbcsdat.o: \ $(LIBCHARSET_OBJDIR)sbcsdat.c $(CC) $(CFLAGS) $(MD) -c -o $@ $< $(LIBCHARSET_OBJDIR)sbcsdat.c $(LIBCHARSET_OBJDIR)sbcsdat.h: \ $(LIBCHARSET_SRCDIR)sbcs.dat \ $(LIBCHARSET_SRCDIR)sbcsgen.pl perl $(LIBCHARSET_SRCDIR)sbcsgen.pl \ $(LIBCHARSET_SRCDIR)sbcs.dat \ $(LIBCHARSET_OBJDIR)sbcsdat.c \ $(LIBCHARSET_OBJDIR)sbcsdat.h $(LIBCHARSET_GENPFX)clean: rm -f $(LIBCHARSET_OBJDIR)$(LIBCHARSET_OBJPFX)*.o \ $(LIBCHARSET_OBJDIR)libcharset.a \ $(LIBCHARSET_OBJDIR)sbcsdat.c \ $(LIBCHARSET_OBJDIR)sbcsdat.h \ $(LIBCHARSET_OBJDIR)convcs ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/README��������������������������������������������������������������������������0000644�0001753�0001753�00000003305�12444773746�012266� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������This subdirectory contains a general character-set conversion library, used in Timber, and available for use in other software if it should happen to be useful. I intend to use this same library in other programs at some future date. (A cut-down version of it is already in use in some ports of PuTTY.) It is therefore a _strong_ design goal that this library should remain perfectly general, and not tied to particulars of Timber. It must not reference any code outside its own subdirectory; it should not have Timber-specific helper routines added to it unless they can be documented in a general manner which might make them useful in other circumstances as well. There are some multibyte character encodings which this library does not currently support. Those that I know of are: - Johab. There is no reason why we _shouldn't_ support this, but it wasn't immediately necessary at the time I did the initial coding. If anyone needs it, it shouldn't be too hard. The Unicode mapping table for the encoding is available at http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT - ISO-2022-JP-1 (RFC 2237), and ISO-2022-JP-2 (RFC 1554). These should be even easier if required - we already have the ISO 2022 machinery in place, and support all the underlying character sets. - ISO-2022-CN and ISO-2022-CN-EXT (RFC 1922). These are a little tricky as they allow use of both GB2312 (simplified Chinese) and CNS 11643 (traditional Chinese), so we may need some way to specify which to prefer. - The Hong Kong (HKSCS) extension to Big5. Again, mapping tables are available in the Unihan database. - Other Big Five extensions, which I don't have mapping tables for at all. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/big5enc.c�����������������������������������������������������������������������0000644�0001753�0001753�00000004060�12444773746�013065� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * big5enc.c - multibyte encoding of Big5 */ #ifndef ENUM_CHARSETS #include "charset.h" #include "internal.h" /* * Big5 has no associated data, so `charset' may be ignored. */ static void read_big5(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { UNUSEDARG(charset); /* * For reading Big5, state->s0 simply contains the single * stored lead byte when we are half way through a double-byte * character, or 0 if we aren't. */ if (state->s0 == 0) { if (input_chr >= 0xA1 && input_chr <= 0xFE) { /* * Lead byte. Just store it. */ state->s0 = input_chr; } else { /* * Anything else we pass straight through unchanged. */ emit(emitctx, input_chr); } } else { /* * We have a stored lead byte. We expect a valid followup * byte. */ if ((input_chr >= 0x40 && input_chr <= 0x7E) || (input_chr >= 0xA1 && input_chr <= 0xFE)) { emit(emitctx, big5_to_unicode(state->s0 - 0xA1, input_chr - 0x40)); } else { emit(emitctx, ERROR); } state->s0 = 0; } } /* * Big5 is a stateless multi-byte encoding (in the sense that just * after any character has been completed, the state is always the * same); hence when writing it, there is no need to use the * charset_state. */ static int write_big5(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { UNUSEDARG(charset); UNUSEDARG(state); if (input_chr == -1) return TRUE; /* stateless; no cleanup required */ if (input_chr < 0x80) { emit(emitctx, input_chr); return TRUE; } else { int r, c; if (unicode_to_big5(input_chr, &r, &c)) { emit(emitctx, r + 0xA1); emit(emitctx, c + 0x40); return TRUE; } else { return FALSE; } } } const charset_spec charset_CS_BIG5 = { CS_BIG5, read_big5, write_big5, NULL }; #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_BIG5) #endif /* ENUM_CHARSETS */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/big5set.c�����������������������������������������������������������������������0000644�0001753�0001753�00001103200�12444773746�013110� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Big5 implementation for libcharset. (This is the character set * itself, not any particular multibyte encoding of it. Multibyte * encodings of this character set are handled separately.) */ #include <assert.h> #include "charset.h" #include "internal.h" /* * These tables are generated from the Big5 <-> Unicode character * mapping found at * * http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT * * In the few cases where Big5 contains two characters whose * Unicode equivalents are the same, we map both to those * characters. */ /* * Mapping from Big5 to Unicode. For these purposes Big5 is * considered to be a 94x191 square array, with coordinates running * from (0,0) to (93,190). (In the multibyte encoding those * coordinates are offset by 0xA1 and 0x40 respectively, so they * run from (A1,40) to (FE,FE).) * * Generated by running the following sh+Perl over BIG5.TXT: cat BIG5.TXT | \ sed -e $'s/^\\(0xA15A\t\\)0xFFFD/\\10xFF3F/' \ -e $'s/^\\(0xA1FE\t\\)0xFFFD/\\10x2571/' \ -e $'s/^\\(0xA240\t\\)0xFFFD/\\10x2572/' \ -e $'s/^\\(0xA2CC\t\\)0xFFFD/\\10x5341/' \ -e $'s/^\\(0xA2CE\t\\)0xFFFD/\\10x5345/' \ -e '/^0xA1C3/d' -e '/^0xA1C5/d' | \ perl -ne '$a{hex$1,hex$2}=$3 if /^0x(\S\S)(\S\S)\s+(0x\S+)\s/;' \ -e 'END {for $r (0..93) { $o=" {"; for $c (0..190) {' \ -e '$k=$a{$r+161,$c+64}; $k=" ERROR" unless defined $k;' \ -e '$o .= ", " if $c > 0; (print "$o\n"), $o=" " if length $o > 70;' \ -e '$o .= $k; } print "$o},\n"; }}' */ static const unsigned short big5_forward[94][191] = { {0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2022, 0xFF1B, 0xFF1A, 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFF64, 0xFE52, 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31, 0x2014, 0xFE33, 0xFF3F, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, 0x32A3, 0x2105, 0x203E, ERROR, 0xFF3F, ERROR, 0xFE49, 0xFE4A, 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0x223C, 0x2229, 0x222A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0x2571}, {0x2572, 0xFF0F, 0xFF3C, 0xFF04, 0x00A5, 0x3012, 0x00A2, 0x00A3, 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, 0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, 0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x5341, 0x5344, 0x5345, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56}, {0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, 0x02CA, 0x02C7, 0x02CB, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B, 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F, 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, 0x5B53, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, 0x624D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B, 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4, 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6, 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA, 0x53CD, 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11, 0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, 0x5FC3, 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4, 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236, 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19}, {0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9, 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317, 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E, 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8, 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1, 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168}, {0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216, 0x52A3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F, 0x540C, 0x540A, 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D, 0x5408, 0x5403, 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, 0x5733, 0x5730, 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, 0x5919, 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, 0x5979, 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, 0x6210, 0x6263, 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070, 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C, 0x4F46, 0x4F63}, {0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59, 0x4F5D, 0x4F48, 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6, 0x51B7, 0x5225, 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, 0x52AC, 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426, 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B, 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436, 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA, 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740, 0x574D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF, 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996, 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F, 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77, 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292, 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750, 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760}, {0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81, 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70, 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E, 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076, 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2, 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3, 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093, 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2, 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E, 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88, 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD, 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, 0x5241, 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475}, {0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492, 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462, 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1, 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF, 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB, 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD, 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC, 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A}, {0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C, 0x676A, 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, 0x7238, 0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, 0x81FE, 0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, 0x82B9, 0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, 0x82BE, 0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644}, {0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192, 0x5191, 0x51A0, 0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B, 0x5247, 0x52C7, 0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B, 0x539A, 0x53DB, 0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8, 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9, 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2, 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950, 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA, 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, 0x5F8A, 0x5F8B, 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, 0x600E, 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C, 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC, 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7}, {0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545, 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, 0x6627, 0x662F, 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, 0x67D3, 0x67F1, 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, 0x67E9, 0x67EF, 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, 0x67DE, 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83, 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, 0x6D39, 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, 0x70AB, 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE, 0x70A4, 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, 0x73B7, 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D, 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2, 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3, 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC, 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946, 0x7949, 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB, 0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00, 0x7D09, 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8004}, {0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, 0x80C4, 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, 0x81F4, 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, 0x8304, 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, 0x82DC, 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, 0x90C3, 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, 0x964D, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, 0x98DB, 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, 0x525B, 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, 0x5510, 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, 0x5514, 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, 0x54EA}, {0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, 0x57C2, 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, 0x595A, 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, 0x5A20, 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0, 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, 0x5C51, 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, 0x6069, 0x606F, 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, 0x6096, 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817, 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843, 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7, 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95, 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93}, {0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9, 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8, 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA, 0x73DE, 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5, 0x75C7, 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8, 0x768B, 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, 0x7728, 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950, 0x7960, 0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4, 0x79E3, 0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88, 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102, 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108, 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210, 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354, 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343}, {0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3, 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18, 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16, 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77, 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7, 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095, 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD, 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2, 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A, 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, 0x5065, 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, 0x500F, 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2, 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, 0x5340, 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, 0x555E, 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, 0x552F, 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, 0x5806, 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920, 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40}, {0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2, 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3, 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367, 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B, 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F, 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551, 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA}, {0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, 0x786B, 0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, 0x7A95, 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, 0x7B2E, 0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, 0x7D39, 0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C}, {0x8386, 0x83A7, 0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4, 0x86B5, 0x86C6, 0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E, 0x8888, 0x88AB, 0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F, 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015, 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, 0x9014, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x90E8, 0x90ED, 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6, 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, 0x966A, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966C, 0x96C0, 0x96EA, 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B, 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C, 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F, 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589, 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, 0x58FA, 0x5960}, {0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, 0x5B71, 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C, 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43, 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C, 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1, 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, 0x6249, 0x63A3, 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, 0x63CD, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE, 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670, 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE, 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7, 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2, 0x68F2, 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9, 0x68DA, 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, 0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, 0x6E21, 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B, 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB}, {0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F, 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C, 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A, 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F, 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2, 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C, 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C, 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, 0x83E9, 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, 0x83EF, 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, 0x83FD, 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, 0x83D4, 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41}, {0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, 0x8CC0, 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, 0x8D81, 0x8DCE, 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, 0x920D, 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, 0x9685, 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3, 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F, 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F, 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1, 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, 0x5854, 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC}, {0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A, 0x610F, 0x6148, 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108, 0x614E, 0x614C, 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D, 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417, 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994, 0x696D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D, 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD, 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C, 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337, 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E, 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600, 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3, 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763}, {0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE, 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891, 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C, 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77, 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93, 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A, 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, 0x845B, 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, 0x865E, 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86FE, 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4, 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2, 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70, 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62, 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A, 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A}, {0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C, 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E, 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237, 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6, 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D, 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54, 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147}, {0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995, 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB, 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3, 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4, 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, 0x6F15, 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC, 0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B, 0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, 0x7B84, 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE, 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC}, {0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150, 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA, 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4, 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3, 0x8490, 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902, 0x88F4, 0x88F9, 0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, 0x8AA7, 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060, 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B, 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC}, {0x5287, 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E, 0x563B, 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E, 0x5657, 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, 0x589F, 0x589E, 0x58B3, 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, 0x5B09, 0x5AFB, 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, 0x5E61, 0x5EE2, 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, 0x5FB7, 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB, 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469, 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490, 0x64B0, 0x64A5, 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD, 0x64AB, 0x649A, 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, 0x6578, 0x66AE, 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, 0x6A1E, 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05, 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F, 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8, 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B, 0x7483}, {0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624, 0x7626, 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, 0x778C, 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5, 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E}, {0x8F25, 0x9069, 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, 0x9127, 0x9131, 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, 0x92B7, 0x92EA, 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, 0x981C, 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, 0x9B27, 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291, 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, 0x5664, 0x5678, 0x566A, 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, 0x5676, 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F, 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1}, {0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8, 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368, 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D, 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F, 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, 0x7E0A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09, 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3, 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E, 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932, 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB, 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02, 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93, 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B, 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8, 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A}, {0x9310, 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7, 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713, 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B, 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B, 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB, 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12, 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121, 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A, 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB, 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6, 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6, 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E, 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF, 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646, 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC}, {0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35, 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070, 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF, 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, 0x8587, 0x85A8, 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B, 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F, 0x907D, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E, 0x919C, 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, 0x9318, 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01}, {0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2, 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D, 0x61E3, 0x6233, 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7, 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE, 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A, 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A, 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076, 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9, 0x85B0, 0x85BA, 0x85B9, 0x85A6, 0x87EF, 0x87EC, 0x87F2, 0x87E0, 0x8986, 0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, 0x8D05, 0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6}, {0x97AD, 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA, 0x993E, 0x993F, 0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133, 0x56A5, 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5, 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D, 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, 0x97FB, 0x985E}, {0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, 0x9A19, 0x9B0D, 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, 0x9D72, 0x9D6A, 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56A8, 0x56B7, 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727, 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662, 0x7665, 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, 0x7E7C, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, 0x85F9, 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, 0x8815, 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4, 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952, 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, 0x5137, 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD, 0x61FC, 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04, 0x6AFA, 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, 0x77D3, 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823, 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74}, {0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B, 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957, 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D, 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9, 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61, 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, 0x896F, 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, 0x81E2, 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, 0x9460, 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, 0x9AD3, 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, 0x9EF4, 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92}, {0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x30FE, 0x309D, 0x309E, 0x3005, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7}, {0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723, 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73, 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210, 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF, 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B, 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A, 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74, 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E, 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B}, {0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F, 0x864D, 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64, 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33, 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, 0x5E88, 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0, 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA, 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, 0x628C, 0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x6537, 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747}, {0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, 0x675A, 0x674B, 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73, 0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD, 0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753A, 0x7539, 0x7594, 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, 0x8293, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F, 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F, 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87, 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, 0x4F4C, 0x4F97, 0x4F6A, 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, 0x4F9C, 0x4F94, 0x4F9E, 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, 0x51BC, 0x51BE, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, 0x530B, 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482, 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466, 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, 0x5774, 0x5762}, {0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, 0x59CF, 0x59CE, 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, 0x59D6, 0x59B1, 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, 0x5B93, 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF, 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7, 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19, 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D, 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, 0x600B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C, 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009, 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA, 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0, 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612, 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611, 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776, 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A, 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779, 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC, 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7, 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2}, {0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, 0x80AD, 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, 0x4FB2, 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, 0x5244, 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, 0x5399, 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, 0x54CF}, {0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, 0x54C6, 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, 0x54B0, 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B, 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4, 0x590D, 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD, 0x59FA, 0x59FD, 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB, 0x59E9, 0x59F3, 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3, 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5, 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6, 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541, 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, 0x661C, 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA}, {0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB, 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE, 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2, 0x67FC, 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA, 0x67C9, 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84, 0x6BB6, 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, 0x6D2D, 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07, 0x6D20, 0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F, 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241, 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4, 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC, 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB, 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC, 0x74EE, 0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA, 0x77E7, 0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F, 0x780E, 0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945, 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80}, {0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F, 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D, 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7, 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9, 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD, 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8, 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1, 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, 0x8674, 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, 0x89D3, 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, 0x90F1, 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, 0x90C8, 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, 0x964E, 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, 0x501C, 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, 0x525A, 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, 0x539E, 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, 0x551A, 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1}, {0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6, 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9, 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15, 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D, 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219, 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336, 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828, 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D, 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4}, {0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, 0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, 0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, 0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, 0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, 0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39, 0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5, 0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7277, 0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, 0x72F3, 0x72FB, 0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3, 0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7, 0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B, 0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, 0x79EE, 0x79ED, 0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10}, {0x7B04, 0x7B13, 0x7B05, 0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E, 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100, 0x8201, 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833F, 0x8341, 0x8326, 0x831C, 0x8322, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8342, 0x834E, 0x831B, 0x832A, 0x8308, 0x833C, 0x834D, 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, 0x8347, 0x8345, 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, 0x8653, 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687, 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1, 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843, 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F, 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57, 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, 0x8FFF, 0x8FFB, 0x9004, 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, 0x90E3, 0x90DF, 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150}, {0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC, 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E, 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041, 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, 0x5069, 0x506B, 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, 0x5057, 0x5051, 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, 0x52D3, 0x532D, 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, 0x5534, 0x552A, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D, 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2, 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8, 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5, 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C, 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58, 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F, 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52, 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C, 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72, 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A, 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F}, {0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, 0x638A, 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, 0x63AB, 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, 0x639C, 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, 0x6370, 0x6553, 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, 0x688F, 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, 0x6871, 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, 0x6878, 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, 0x6B37, 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9}, {0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, 0x70FA, 0x710D, 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104, 0x70F3, 0x7110, 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8, 0x70F6, 0x710B, 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, 0x727F, 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, 0x72FF, 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, 0x7401, 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, 0x740B, 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849, 0x784D, 0x784A, 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796A, 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7, 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30, 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9, 0x801F}, {0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, 0x8127, 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232, 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4, 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9, 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E, 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387, 0x83AE, 0x8376, 0x839A, 0x8659, 0x8656, 0x86BF, 0x86B7, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x86C2, 0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9, 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD, 0x86BE, 0x8852, 0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1, 0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC, 0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30, 0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021, 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB, 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC, 0x91F4, 0x91F1, 0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA}, {0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, 0x9586, 0x9588, 0x967C, 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, 0x508B, 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8, 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, 0x5588, 0x558F, 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6, 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, 0x5837, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, 0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, 0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, 0x5C0C, 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, 0x5D35, 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114}, {0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0, 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568, 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, 0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, 0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, 0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, 0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD, 0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD, 0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915, 0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97, 0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, 0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, 0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, 0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E}, {0x6E68, 0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39, 0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, 0x6E77, 0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, 0x7120, 0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, 0x7288, 0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335, 0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x741A, 0x7421, 0x742D, 0x7431, 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, 0x774D, 0x7745, 0x774A, 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, 0x785C, 0x786D, 0x7871, 0x786A, 0x786E, 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04, 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B3B, 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65}, {0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, 0x804F, 0x8050, 0x80FE, 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, 0x8147, 0x813D, 0x814D, 0x813A, 0x81E6, 0x81EE, 0x81F7, 0x81F8, 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, 0x8275, 0x833B, 0x83CF, 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7, 0x83E4, 0x83FC, 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, 0x8401, 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, 0x83F3, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x83C3, 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB, 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA, 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1, 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, 0x88B9, 0x88B8, 0x88C0, 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, 0x88B2, 0x8901, 0x88C9, 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, 0x8A4E, 0x8A4D, 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, 0x8A52, 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80, 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89, 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA}, {0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6, 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, 0x9034, 0x902F, 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, 0x90F9, 0x90FB, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915F, 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226, 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204, 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, 0x9688, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1, 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6, 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE, 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA, 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278, 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA, 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D, 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9, 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849, 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D, 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8, 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6}, {0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642F, 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, 0x641B, 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, 0x6971, 0x693F, 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, 0x6948, 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951, 0x6932, 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, 0x6B42, 0x6B48, 0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, 0x6BFC}, {0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, 0x6EC0, 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, 0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6, 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92, 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA, 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715D, 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, 0x7142, 0x7158, 0x7143, 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, 0x7291, 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD, 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769, 0x7767, 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F, 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13}, {0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, 0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70, 0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B, 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D, 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB, 0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B, 0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8144, 0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1, 0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D, 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437, 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439, 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447, 0x8436, 0x8433, 0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454, 0x846E, 0x8450, 0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D, 0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6, 0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4}, {0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F, 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81, 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66, 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, 0x9052, 0x903F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, 0x9111, 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, 0x9252, 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, 0x922E, 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, 0x926F, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, 0x9EFD, 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, 0x50DD, 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0}, {0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613, 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C, 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A, 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894, 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, 0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D, 0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7, 0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43, 0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, 0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, 0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, 0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, 0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, 0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C, 0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0, 0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9}, {0x69A0, 0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, 0x698E, 0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD, 0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993, 0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5, 0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25, 0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, 0x6F1A, 0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, 0x7500, 0x7502, 0x7503, 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, 0x7615, 0x7611, 0x760A, 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, 0x7782, 0x776E, 0x7780, 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, 0x787E, 0x78AB, 0x789E, 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, 0x798B, 0x7996, 0x7995, 0x7994, 0x7993}, {0x7997, 0x7988, 0x7992, 0x7990, 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, 0x7FDE, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186, 0x8183, 0x8187, 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, 0x84A1, 0x849F, 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, 0x84B4, 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7, 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF, 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4, 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719, 0x871B, 0x8743, 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732, 0x872A, 0x872D, 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, 0x88E7, 0x88F1, 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB}, {0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9, 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96, 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09, 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06, 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E, 0x8F0D, 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A, 0x9124, 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5, 0x92A4, 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, 0x92EE, 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, 0x928A, 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, 0x929D, 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, 0x5130, 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, 0x50FD, 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, 0x564C, 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658}, {0x565A, 0x5640, 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, 0x618B, 0x6183, 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, 0x6192, 0x61AA, 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, 0x6496, 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C, 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579, 0x657B, 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7, 0x66AA, 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15, 0x69F1, 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D, 0x69FE, 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, 0x69E7, 0x6A40, 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, 0x6A09, 0x6A04, 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, 0x69F4, 0x6A16, 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, 0x6BFF, 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92}, {0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96, 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57, 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67, 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, 0x6F77, 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, 0x719A, 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, 0x71AA, 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, 0x735E, 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628, 0x761B, 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789, 0x7788, 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8, 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2, 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F}, {0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253, 0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500, 0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C, 0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2, 0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9, 0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E, 0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9, 0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8756, 0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758, 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D, 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A, 0x876E, 0x875C, 0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767, 0x8769, 0x885A, 0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED, 0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E, 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27}, {0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, 0x912B, 0x9129, 0x912A, 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, 0x918A, 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC, 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD, 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, 0x92D3, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, 0x95AB, 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, 0x9702, 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, 0x981D, 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1, 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, 0x9B75, 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF, 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E}, {0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C, 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC, 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8, 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF, 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533, 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54, 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03, 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5, 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8}, {0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C, 0x7365, 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495, 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D, 0x7633, 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D, 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, 0x78DB, 0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, 0x7F7B, 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, 0x81B1, 0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, 0x81B4, 0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558}, {0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555, 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C, 0x8663, 0x8665, 0x8664, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785, 0x8790, 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789, 0x891E, 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, 0x9327, 0x931E, 0x9308, 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, 0x933C, 0x931B, 0x9323, 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324, 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C}, {0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD, 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9, 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97F0, 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, 0x9927, 0x9929, 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, 0x99E3, 0x99EA, 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, 0x9AFA, 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E, 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14, 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F, 0x9E88, 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, 0x9F12, 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52F4, 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, 0x5682, 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25, 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, 0x61C3, 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE, 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580, 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89, 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E}, {0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, 0x71E4, 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, 0x74AB, 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, 0x78FB, 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, 0x79A8, 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, 0x85A0, 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E}, {0x8577, 0x857C, 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, 0x8596, 0x8586, 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, 0x8668, 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937, 0x8942, 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8B18, 0x8B16, 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13, 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94, 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47, 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, 0x9364, 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, 0x9357, 0x9355, 0x9352, 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, 0x935E, 0x9363, 0x9367, 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0, 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720, 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C}, {0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A, 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933, 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1, 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB, 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1, 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33, 0x9D41, 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131, 0x512D, 0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699, 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6, 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC, 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005, 0x7014, 0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, 0x700A, 0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376}, {0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2, 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x78FF, 0x790C, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC, 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, 0x81D1, 0x81D2, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, 0x85CB, 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, 0x85B8, 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, 0x87EB, 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, 0x87D3, 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, 0x8C75, 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, 0x8E5C, 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67}, {0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5, 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B, 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395, 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4, 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3, 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850, 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, 0x9A0B, 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, 0x9A06, 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, 0x9B4A, 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, 0x9BB5, 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53, 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57, 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF, 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28, 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB, 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, 0x58DB, 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70}, {0x5FBF, 0x61FB, 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, 0x6584, 0x65DE, 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, 0x6ACB, 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60, 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x702A, 0x720C, 0x720A, 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, 0x72A1, 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, 0x7660, 0x77C9, 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7921, 0x791C, 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, 0x8264, 0x8261, 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, 0x85D1, 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, 0x8803, 0x87F6, 0x87F7, 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A, 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, 0x8961, 0x895C, 0x8958, 0x895D, 0x8959, 0x8988, 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, 0x8B53, 0x8B56, 0x8B54, 0x8B4B, 0x8B55}, {0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43, 0x8C77, 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, 0x91B0, 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, 0x93F9, 0x93EC, 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, 0x93EE, 0x93E3, 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93E7, 0x957D, 0x95DA, 0x95DB, 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, 0x9726, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE, 0x97DF, 0x985C, 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB, 0x98BE, 0x9948, 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, 0x9A25, 0x9A1D, 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, 0x9A1C, 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78, 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70, 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F, 0x9D79, 0x9D7F, 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC, 0x9F2D, 0x9F40, 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, 0x56B2}, {0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF, 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF, 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9, 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x7040, 0x703B, 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA, 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, 0x77CF, 0x77CD, 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48, 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80, 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x820B, 0x8268, 0x8269, 0x8622, 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, 0x8609, 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, 0x9428, 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, 0x9416, 0x9412, 0x93FA, 0x9409, 0x93F8, 0x940A, 0x93FF}, {0x93FC, 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, 0x972E, 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, 0x6B03, 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049, 0x7045, 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A, 0x77D0, 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, 0x7E87, 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, 0x861C, 0x8619, 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, 0x8625}, {0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A, 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45, 0x8B7A, 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, 0x8F5B, 0x8F5D, 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B, 0x9436, 0x9429, 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, 0x9437, 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, 0x973A, 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, 0x9956, 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD, 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18, 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6, 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A}, {0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634, 0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826, 0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84, 0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A, 0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C, 0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B, 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9A49, 0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33, 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35, 0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299, 0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C, 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830, 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, 0x8973, 0x89FE}, {0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64, 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, 0x9457, 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3, 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, 0x9F4F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, 0x5B4E, 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, 0x9C67, 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, 0x9E03, 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, 0x9E04, 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, 0x652E, 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A}, {0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648, 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5, 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74, 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D, 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874, 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, 0x8B9F, 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069, 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, }; /* * Mapping from Unicode back to Big5. * * This inverse is done the same way the SBCS ones are done: I * provide a list of Big5 positions, sorted into ascending order of * their Unicode values. Then we can binary-search through this * list, referring to the above table for each comparison, to find * the coordinates for a given code point. * * Generated by running the following sh+Perl over BIG5.TXT: cat BIG5.TXT | \ sed -e $'s/^\\(0xA15A\t\\)0xFFFD/\\10xFF3F/' \ -e $'s/^\\(0xA1FE\t\\)0xFFFD/\\10x2571/' \ -e $'s/^\\(0xA240\t\\)0xFFFD/\\10x2572/' \ -e $'s/^\\(0xA2CC\t\\)0xFFFD/\\10x5341/' \ -e $'s/^\\(0xA2CE\t\\)0xFFFD/\\10x5345/' \ -e '/^0xA1C3/d' -e '/^0xA1C5/d' | \ perl -ne '$a{$3}=[hex$1,hex$2] if /^0x(\S\S)(\S\S)\s+(0x\S+)\s/;' \ -e 'END {$o=" ";for $k (sort keys %a) { ($r,$c) = @{$a{$k}}; ' \ -e '$o .= $C; $C = ", "; (print "$o\n"), $o=" " if length $o > 70;' \ -e '$o .= sprintf "{%d,%d}", $r-161,$c-64; } print "$o\n"; }' */ static const struct { unsigned char r, c; } big5_backward[] = { {1,6}, {1,7}, {1,4}, {0,113}, {1,24}, {0,147}, {0,16}, {0,145}, {0,146}, {2,126}, {2,124}, {2,125}, {2,127}, {2,123}, {2,4}, {2,5}, {2,6}, {2,7}, {2,8}, {2,9}, {2,10}, {2,11}, {2,12}, {2,13}, {2,14}, {2,15}, {2,16}, {2,17}, {2,18}, {2,19}, {2,20}, {2,21}, {2,22}, {2,23}, {2,24}, {2,25}, {2,26}, {2,27}, {2,28}, {2,29}, {2,30}, {2,31}, {2,32}, {2,33}, {2,34}, {2,35}, {2,36}, {2,37}, {2,38}, {2,39}, {2,40}, {2,41}, {2,42}, {2,43}, {2,44}, {2,45}, {2,46}, {2,47}, {2,48}, {2,49}, {2,50}, {2,51}, {38,115}, {38,113}, {38,114}, {38,116}, {38,117}, {38,118}, {38,119}, {38,120}, {38,121}, {38,122}, {38,123}, {38,124}, {38,125}, {38,126}, {38,127}, {38,128}, {38,129}, {38,130}, {38,131}, {38,132}, {38,133}, {38,134}, {38,135}, {38,136}, {38,137}, {38,138}, {38,139}, {38,140}, {38,141}, {38,143}, {38,144}, {38,145}, {38,146}, {38,147}, {38,148}, {38,149}, {38,150}, {38,151}, {38,152}, {38,153}, {38,154}, {38,155}, {38,156}, {38,157}, {38,158}, {38,159}, {38,160}, {38,161}, {38,162}, {38,163}, {38,164}, {38,165}, {38,166}, {38,167}, {38,168}, {38,142}, {0,22}, {0,24}, {0,101}, {0,102}, {0,103}, {0,104}, {0,5}, {0,12}, {0,11}, {0,108}, {0,107}, {0,112}, {0,130}, {1,10}, {0,129}, {1,11}, {1,121}, {1,122}, {1,123}, {1,124}, {1,125}, {1,126}, {1,127}, {1,128}, {1,129}, {1,130}, {0,182}, {0,180}, {0,183}, {0,181}, {0,184}, {0,185}, {0,187}, {0,186}, {0,148}, {0,155}, {0,168}, {0,167}, {0,189}, {0,188}, {0,164}, {0,165}, {0,172}, {0,173}, {0,175}, {0,174}, {0,163}, {0,156}, {0,154}, {0,157}, {0,152}, {0,153}, {0,166}, {0,169}, {38,169}, {38,170}, {38,171}, {38,172}, {38,173}, {38,174}, {38,175}, {38,176}, {38,177}, {38,178}, {38,179}, {38,180}, {38,181}, {38,182}, {38,183}, {38,184}, {38,185}, {38,186}, {38,187}, {38,188}, {1,55}, {1,56}, {1,58}, {1,59}, {1,60}, {1,61}, {1,53}, {1,52}, {1,51}, {1,50}, {1,49}, {1,100}, {1,101}, {1,103}, {1,102}, {1,62}, {1,97}, {1,99}, {1,98}, {1,108}, {1,109}, {1,110}, {1,34}, {1,35}, {1,36}, {1,37}, {1,38}, {1,39}, {1,40}, {1,41}, {1,48}, {1,47}, {1,46}, {1,45}, {1,44}, {1,43}, {1,42}, {1,54}, {1,57}, {0,125}, {0,124}, {0,118}, {0,117}, {0,127}, {0,126}, {0,123}, {0,122}, {0,115}, {0,119}, {0,116}, {1,104}, {1,105}, {1,107}, {1,106}, {0,121}, {0,120}, {0,179}, {0,176}, {0,178}, {0,177}, {0,0}, {0,2}, {0,3}, {0,114}, {37,100}, {0,49}, {0,50}, {0,45}, {0,46}, {0,53}, {0,54}, {0,57}, {0,58}, {0,41}, {0,42}, {1,5}, {0,37}, {0,38}, {0,105}, {0,106}, {1,131}, {1,132}, {1,133}, {1,134}, {1,135}, {1,136}, {1,137}, {1,138}, {1,139}, {37,101}, {37,102}, {37,103}, {37,104}, {37,105}, {37,106}, {37,107}, {37,108}, {37,109}, {37,110}, {37,111}, {37,112}, {37,113}, {37,114}, {37,115}, {37,116}, {37,117}, {37,118}, {37,119}, {37,120}, {37,121}, {37,122}, {37,123}, {37,124}, {37,125}, {37,126}, {37,127}, {37,128}, {37,129}, {37,130}, {37,131}, {37,132}, {37,133}, {37,134}, {37,135}, {37,136}, {37,137}, {37,138}, {37,139}, {37,140}, {37,141}, {37,142}, {37,143}, {37,144}, {37,145}, {37,146}, {37,147}, {37,148}, {37,149}, {37,150}, {37,151}, {37,152}, {37,153}, {37,154}, {37,155}, {37,156}, {37,157}, {37,158}, {37,159}, {37,160}, {37,161}, {37,162}, {37,163}, {37,164}, {37,165}, {37,166}, {37,167}, {37,168}, {37,169}, {37,170}, {37,171}, {37,172}, {37,173}, {37,174}, {37,175}, {37,176}, {37,177}, {37,178}, {37,179}, {37,180}, {37,181}, {37,182}, {37,183}, {37,98}, {37,99}, {37,184}, {37,185}, {37,186}, {37,187}, {37,188}, {37,189}, {37,190}, {38,0}, {38,1}, {38,2}, {38,3}, {38,4}, {38,5}, {38,6}, {38,7}, {38,8}, {38,9}, {38,10}, {38,11}, {38,12}, {38,13}, {38,14}, {38,15}, {38,16}, {38,17}, {38,18}, {38,19}, {38,20}, {38,21}, {38,22}, {38,23}, {38,24}, {38,25}, {38,26}, {38,27}, {38,28}, {38,29}, {38,30}, {38,31}, {38,32}, {38,33}, {38,34}, {38,35}, {38,36}, {38,37}, {38,38}, {38,39}, {38,40}, {38,41}, {38,42}, {38,43}, {38,44}, {38,45}, {38,46}, {38,47}, {38,48}, {38,49}, {38,50}, {38,51}, {38,52}, {38,53}, {38,54}, {38,55}, {38,56}, {38,57}, {38,58}, {38,59}, {38,60}, {38,61}, {38,62}, {38,97}, {38,98}, {38,99}, {38,100}, {38,101}, {38,102}, {38,103}, {38,104}, {38,105}, {38,106}, {38,107}, {38,108}, {38,109}, {38,110}, {38,111}, {38,112}, {37,97}, {2,52}, {2,53}, {2,54}, {2,55}, {2,56}, {2,57}, {2,58}, {2,59}, {2,60}, {2,61}, {2,62}, {2,97}, {2,98}, {2,99}, {2,100}, {2,101}, {2,102}, {2,103}, {2,104}, {2,105}, {2,106}, {2,107}, {2,108}, {2,109}, {2,110}, {2,111}, {2,112}, {2,113}, {2,114}, {2,115}, {2,116}, {2,117}, {2,118}, {2,119}, {2,120}, {2,121}, {2,122}, {0,128}, {1,21}, {1,22}, {1,16}, {1,17}, {1,18}, {1,20}, {1,23}, {1,19}, {0,171}, {0,170}, {1,15}, {3,0}, {3,2}, {3,3}, {40,5}, {3,22}, {3,20}, {3,23}, {3,21}, {40,6}, {3,99}, {40,15}, {40,13}, {3,98}, {3,97}, {4,2}, {4,1}, {4,0}, {4,3}, {3,190}, {4,160}, {4,161}, {7,131}, {3,24}, {3,100}, {40,16}, {3,101}, {40,35}, {5,170}, {42,113}, {3,25}, {3,102}, {4,4}, {40,36}, {40,0}, {3,4}, {3,27}, {40,7}, {3,28}, {3,103}, {4,5}, {4,7}, {4,6}, {4,162}, {4,163}, {7,132}, {12,124}, {3,1}, {40,1}, {3,5}, {3,30}, {3,29}, {4,164}, {7,133}, {15,110}, {51,11}, {21,131}, {59,113}, {59,114}, {3,6}, {3,105}, {7,134}, {3,7}, {40,8}, {3,31}, {3,106}, {3,108}, {40,17}, {3,109}, {3,107}, {4,165}, {7,135}, {7,136}, {10,5}, {3,32}, {3,110}, {4,166}, {4,168}, {4,167}, {5,171}, {7,137}, {7,138}, {10,6}, {10,7}, {12,125}, {59,115}, {85,150}, {3,8}, {3,112}, {3,111}, {40,18}, {3,113}, {3,119}, {3,114}, {3,115}, {40,20}, {40,19}, {3,117}, {3,118}, {3,116}, {4,10}, {4,11}, {4,12}, {4,13}, {4,9}, {4,16}, {40,42}, {40,38}, {40,41}, {4,17}, {4,33}, {40,40}, {4,14}, {4,15}, {4,8}, {40,37}, {40,39}, {4,181}, {40,112}, {4,178}, {4,182}, {40,122}, {40,110}, {4,179}, {40,114}, {4,180}, {4,183}, {4,169}, {40,113}, {4,184}, {40,117}, {40,121}, {40,118}, {40,115}, {4,170}, {4,172}, {4,185}, {4,174}, {40,107}, {4,177}, {4,175}, {4,176}, {40,123}, {40,120}, {40,111}, {4,173}, {40,108}, {4,171}, {40,116}, {40,119}, {40,109}, {41,38}, {6,2}, {5,180}, {41,39}, {5,177}, {6,4}, {5,185}, {5,184}, {41,27}, {5,188}, {5,183}, {41,32}, {41,40}, {41,36}, {5,186}, {5,189}, {5,174}, {6,7}, {41,29}, {42,125}, {5,172}, {6,3}, {5,173}, {5,181}, {5,182}, {41,34}, {41,30}, {5,187}, {5,179}, {41,26}, {5,175}, {41,37}, {6,5}, {6,8}, {5,178}, {6,0}, {6,6}, {5,176}, {41,35}, {6,1}, {41,41}, {41,28}, {5,190}, {41,31}, {41,33}, {7,152}, {42,127}, {42,139}, {7,144}, {42,140}, {7,139}, {7,149}, {7,142}, {42,121}, {7,150}, {42,120}, {42,124}, {42,131}, {42,129}, {7,158}, {7,153}, {42,115}, {42,117}, {7,155}, {7,143}, {42,118}, {42,130}, {42,137}, {7,148}, {42,123}, {42,116}, {7,147}, {42,119}, {7,151}, {42,122}, {7,146}, {7,141}, {7,156}, {42,132}, {7,157}, {42,136}, {42,134}, {42,138}, {7,154}, {42,126}, {42,114}, {42,128}, {7,145}, {42,133}, {7,140}, {42,135}, {10,22}, {10,10}, {44,160}, {44,168}, {10,9}, {10,17}, {10,29}, {44,174}, {44,172}, {44,167}, {10,11}, {44,173}, {44,163}, {10,25}, {10,16}, {10,24}, {44,158}, {44,170}, {44,161}, {10,20}, {44,162}, {44,157}, {10,27}, {10,14}, {10,23}, {10,13}, {44,159}, {44,164}, {44,171}, {10,21}, {10,18}, {44,166}, {10,26}, {44,169}, {44,165}, {10,15}, {10,28}, {10,19}, {10,12}, {10,8}, {44,175}, {12,151}, {12,129}, {12,145}, {12,150}, {47,144}, {47,143}, {47,148}, {47,149}, {12,132}, {12,141}, {12,154}, {12,142}, {47,137}, {12,135}, {47,138}, {12,156}, {12,147}, {12,126}, {12,127}, {47,157}, {15,127}, {12,140}, {12,139}, {47,139}, {12,143}, {51,27}, {12,134}, {47,150}, {12,149}, {12,148}, {12,138}, {47,142}, {47,151}, {47,136}, {12,137}, {47,152}, {12,146}, {47,140}, {12,128}, {12,131}, {12,130}, {47,153}, {12,144}, {12,133}, {12,153}, {12,155}, {47,147}, {12,152}, {47,155}, {47,141}, {47,156}, {47,145}, {47,154}, {47,146}, {12,136}, {51,35}, {51,23}, {15,115}, {51,28}, {51,34}, {15,114}, {51,21}, {15,118}, {51,25}, {51,18}, {15,116}, {51,22}, {15,121}, {15,126}, {51,39}, {51,17}, {15,122}, {51,38}, {15,117}, {51,24}, {15,113}, {51,19}, {51,15}, {51,29}, {51,16}, {51,14}, {51,26}, {51,32}, {51,33}, {15,119}, {55,27}, {51,30}, {51,13}, {51,31}, {15,129}, {51,36}, {15,128}, {51,12}, {51,20}, {51,37}, {15,124}, {15,123}, {15,120}, {15,125}, {15,111}, {15,112}, {18,136}, {55,30}, {55,23}, {18,133}, {55,31}, {55,21}, {55,24}, {18,132}, {55,25}, {18,135}, {55,29}, {55,19}, {55,18}, {18,137}, {18,138}, {18,134}, {18,139}, {55,17}, {55,28}, {55,26}, {55,20}, {18,131}, {55,22}, {21,138}, {21,132}, {59,119}, {21,141}, {59,125}, {59,128}, {21,134}, {21,135}, {59,122}, {21,133}, {59,131}, {21,139}, {59,132}, {59,127}, {21,140}, {59,116}, {21,137}, {59,117}, {59,126}, {59,124}, {59,120}, {21,136}, {59,118}, {21,142}, {59,123}, {59,130}, {59,121}, {59,129}, {24,118}, {24,115}, {24,116}, {63,185}, {63,177}, {24,114}, {24,111}, {63,178}, {24,113}, {63,181}, {63,183}, {63,190}, {63,189}, {63,184}, {24,110}, {63,176}, {24,108}, {63,179}, {24,119}, {63,182}, {63,186}, {24,112}, {24,109}, {63,188}, {63,187}, {24,117}, {63,180}, {26,184}, {67,172}, {67,169}, {26,185}, {26,183}, {67,176}, {67,173}, {67,166}, {26,182}, {26,186}, {67,167}, {26,181}, {26,189}, {67,170}, {67,171}, {26,187}, {26,188}, {67,177}, {67,174}, {67,175}, {29,106}, {71,184}, {29,103}, {71,181}, {29,105}, {29,107}, {71,182}, {29,104}, {71,183}, {71,180}, {31,54}, {75,125}, {31,55}, {75,123}, {75,124}, {75,122}, {75,121}, {75,126}, {31,53}, {78,120}, {78,121}, {67,168}, {78,119}, {31,56}, {34,31}, {80,171}, {80,172}, {35,151}, {35,152}, {84,129}, {84,128}, {36,44}, {36,43}, {86,144}, {3,9}, {3,33}, {3,121}, {3,120}, {4,19}, {4,18}, {4,188}, {4,187}, {4,189}, {4,186}, {6,10}, {6,9}, {6,11}, {7,160}, {7,159}, {7,161}, {10,30}, {1,25}, {47,158}, {1,26}, {15,130}, {1,28}, {1,27}, {55,32}, {1,29}, {24,120}, {1,30}, {3,10}, {3,122}, {4,190}, {7,162}, {3,11}, {3,125}, {3,123}, {3,124}, {5,0}, {6,12}, {7,164}, {7,163}, {7,165}, {12,157}, {29,108}, {40,14}, {4,20}, {4,21}, {5,1}, {41,42}, {10,32}, {10,31}, {47,160}, {47,159}, {15,131}, {3,126}, {40,21}, {42,141}, {10,33}, {12,160}, {12,158}, {12,159}, {29,109}, {4,22}, {5,2}, {40,124}, {6,13}, {6,14}, {41,43}, {42,142}, {7,166}, {42,143}, {47,162}, {47,163}, {12,163}, {47,164}, {47,161}, {12,164}, {12,162}, {12,161}, {47,165}, {51,40}, {55,33}, {59,133}, {64,0}, {26,190}, {29,110}, {71,185}, {3,12}, {3,26}, {15,132}, {18,141}, {24,121}, {40,2}, {3,127}, {4,25}, {4,23}, {4,24}, {7,167}, {3,13}, {3,14}, {3,34}, {3,128}, {3,129}, {3,130}, {40,126}, {4,26}, {40,43}, {5,6}, {40,127}, {5,4}, {5,5}, {40,125}, {5,7}, {5,3}, {41,44}, {9,172}, {41,45}, {41,46}, {6,16}, {6,15}, {6,19}, {6,17}, {6,18}, {7,173}, {7,172}, {42,148}, {42,145}, {42,146}, {42,144}, {7,174}, {7,170}, {7,169}, {7,171}, {7,168}, {7,175}, {10,35}, {44,176}, {42,147}, {10,40}, {44,177}, {10,36}, {10,39}, {10,38}, {10,37}, {10,34}, {47,168}, {12,167}, {47,171}, {12,165}, {47,167}, {12,168}, {12,166}, {12,169}, {47,169}, {47,170}, {47,166}, {47,172}, {18,145}, {15,133}, {51,41}, {51,43}, {51,42}, {51,44}, {15,134}, {18,142}, {18,143}, {18,144}, {21,144}, {59,135}, {59,134}, {59,136}, {59,137}, {21,145}, {21,143}, {64,1}, {64,2}, {24,123}, {24,122}, {66,26}, {27,0}, {27,1}, {27,2}, {27,4}, {67,178}, {67,179}, {27,3}, {29,111}, {29,112}, {80,173}, {84,131}, {84,130}, {86,145}, {3,15}, {4,28}, {4,27}, {5,8}, {40,128}, {6,21}, {6,22}, {6,20}, {6,23}, {41,47}, {41,48}, {7,177}, {42,149}, {7,176}, {44,178}, {10,44}, {44,179}, {10,43}, {10,41}, {10,42}, {47,173}, {15,135}, {51,46}, {15,138}, {51,45}, {16,165}, {15,137}, {15,136}, {18,148}, {18,147}, {18,146}, {21,146}, {21,149}, {21,150}, {21,148}, {21,147}, {64,3}, {64,4}, {67,181}, {27,5}, {67,180}, {29,113}, {75,127}, {31,57}, {80,174}, {35,21}, {3,35}, {3,131}, {40,22}, {3,132}, {3,133}, {4,29}, {4,30}, {5,9}, {41,49}, {42,150}, {42,151}, {10,45}, {47,174}, {15,140}, {15,139}, {55,35}, {55,34}, {3,16}, {3,134}, {4,31}, {15,141}, {40,3}, {40,44}, {4,32}, {40,130}, {5,11}, {5,10}, {40,129}, {6,24}, {12,170}, {51,47}, {21,151}, {64,5}, {24,124}, {71,186}, {82,189}, {3,135}, {42,152}, {44,180}, {15,144}, {15,142}, {15,143}, {3,17}, {3,36}, {1,141}, {3,138}, {3,137}, {3,136}, {4,35}, {4,34}, {40,45}, {40,131}, {7,181}, {7,178}, {7,180}, {7,179}, {10,46}, {18,149}, {3,18}, {3,139}, {4,37}, {4,36}, {41,50}, {7,182}, {40,23}, {4,39}, {4,38}, {5,12}, {5,13}, {41,51}, {6,25}, {6,26}, {7,183}, {7,184}, {7,185}, {10,47}, {44,181}, {12,171}, {40,4}, {3,140}, {40,132}, {41,52}, {41,53}, {42,153}, {42,154}, {44,183}, {44,182}, {44,185}, {44,184}, {10,48}, {51,48}, {12,173}, {47,175}, {12,172}, {55,36}, {18,150}, {55,37}, {64,6}, {24,125}, {27,6}, {80,175}, {40,24}, {4,40}, {15,145}, {3,19}, {3,37}, {3,142}, {3,141}, {3,143}, {7,187}, {7,186}, {7,188}, {10,49}, {12,174}, {71,187}, {33,15}, {3,38}, {4,42}, {4,57}, {4,52}, {4,47}, {4,46}, {4,53}, {4,51}, {4,44}, {4,58}, {4,45}, {4,41}, {4,56}, {4,55}, {4,54}, {4,43}, {4,50}, {4,49}, {4,59}, {4,48}, {5,19}, {5,25}, {5,21}, {5,27}, {40,133}, {5,24}, {5,14}, {5,17}, {5,20}, {5,16}, {5,23}, {5,26}, {5,15}, {5,18}, {5,22}, {5,28}, {41,62}, {41,59}, {6,39}, {41,60}, {6,27}, {6,29}, {6,53}, {6,48}, {41,101}, {41,61}, {6,31}, {6,33}, {41,100}, {6,40}, {41,56}, {6,52}, {6,54}, {6,28}, {6,45}, {41,54}, {6,51}, {6,36}, {6,46}, {6,47}, {41,55}, {6,44}, {6,42}, {6,43}, {6,49}, {41,97}, {6,30}, {6,50}, {41,99}, {6,38}, {6,35}, {41,58}, {6,34}, {41,102}, {6,37}, {6,41}, {6,32}, {41,98}, {41,57}, {42,171}, {42,170}, {8,15}, {42,173}, {42,175}, {42,164}, {42,167}, {42,174}, {8,16}, {42,161}, {42,165}, {42,169}, {45,9}, {8,11}, {45,13}, {7,189}, {42,166}, {7,190}, {8,12}, {8,5}, {8,1}, {42,162}, {8,4}, {8,9}, {8,18}, {42,163}, {42,156}, {8,3}, {42,157}, {42,159}, {8,6}, {8,8}, {42,155}, {42,160}, {8,17}, {8,13}, {42,168}, {8,19}, {8,10}, {42,158}, {8,7}, {8,2}, {8,0}, {42,172}, {8,14}, {45,8}, {44,187}, {45,11}, {44,189}, {10,56}, {10,104}, {10,52}, {10,103}, {10,61}, {10,100}, {10,50}, {44,188}, {45,3}, {10,99}, {45,15}, {10,101}, {10,57}, {45,5}, {45,2}, {10,55}, {44,186}, {10,102}, {45,10}, {10,60}, {45,12}, {10,105}, {10,51}, {10,62}, {10,59}, {45,0}, {10,97}, {45,6}, {45,7}, {10,58}, {10,98}, {10,54}, {10,53}, {44,190}, {45,4}, {45,14}, {48,4}, {12,187}, {47,177}, {47,182}, {12,180}, {13,0}, {47,180}, {12,175}, {12,185}, {12,190}, {47,187}, {12,186}, {12,189}, {47,190}, {12,181}, {47,181}, {48,2}, {48,3}, {12,183}, {48,1}, {12,179}, {13,3}, {47,184}, {12,177}, {48,6}, {47,185}, {47,189}, {12,182}, {13,2}, {47,186}, {12,188}, {48,0}, {48,7}, {51,97}, {48,5}, {13,4}, {12,176}, {47,188}, {47,179}, {12,184}, {47,178}, {47,183}, {47,176}, {13,1}, {51,55}, {15,164}, {51,103}, {15,162}, {15,159}, {51,60}, {15,155}, {51,98}, {15,166}, {51,54}, {51,59}, {51,58}, {12,178}, {15,161}, {51,101}, {51,104}, {51,51}, {18,168}, {51,105}, {15,167}, {15,153}, {15,150}, {51,62}, {15,147}, {51,102}, {15,154}, {51,106}, {51,52}, {51,100}, {15,157}, {51,53}, {51,56}, {51,61}, {15,158}, {15,156}, {15,168}, {15,163}, {15,151}, {16,146}, {15,152}, {51,57}, {15,165}, {15,160}, {51,99}, {15,149}, {15,148}, {51,49}, {51,50}, {55,42}, {18,151}, {18,154}, {55,53}, {18,174}, {55,56}, {18,152}, {55,49}, {18,158}, {18,164}, {20,125}, {18,162}, {55,46}, {18,175}, {18,155}, {18,163}, {55,54}, {59,151}, {55,59}, {55,47}, {55,38}, {55,51}, {55,45}, {18,161}, {55,57}, {18,157}, {18,177}, {18,170}, {18,159}, {18,156}, {18,167}, {55,58}, {55,44}, {55,50}, {55,52}, {55,40}, {55,55}, {18,153}, {55,39}, {18,160}, {18,176}, {18,172}, {55,41}, {18,166}, {18,173}, {18,169}, {18,165}, {55,48}, {18,171}, {59,149}, {59,145}, {59,160}, {59,138}, {59,147}, {21,165}, {21,166}, {21,158}, {59,156}, {21,168}, {59,143}, {59,142}, {59,140}, {59,158}, {21,156}, {59,152}, {59,141}, {21,159}, {59,150}, {21,154}, {59,146}, {59,153}, {59,155}, {59,159}, {21,163}, {59,139}, {21,157}, {59,144}, {21,152}, {21,164}, {59,154}, {21,160}, {21,161}, {21,167}, {21,155}, {1,31}, {21,153}, {59,148}, {21,162}, {59,157}, {24,141}, {24,136}, {64,21}, {64,17}, {64,11}, {24,130}, {24,126}, {64,20}, {24,127}, {64,14}, {64,16}, {64,19}, {24,132}, {24,139}, {24,133}, {64,9}, {24,134}, {24,135}, {64,12}, {24,140}, {64,10}, {64,15}, {24,131}, {64,8}, {24,137}, {24,129}, {24,128}, {64,13}, {64,18}, {24,138}, {64,7}, {27,13}, {68,7}, {68,4}, {27,7}, {27,19}, {27,20}, {27,10}, {68,2}, {27,12}, {67,185}, {27,18}, {68,6}, {27,9}, {68,8}, {27,8}, {68,3}, {68,5}, {27,11}, {68,1}, {67,186}, {67,183}, {55,43}, {67,189}, {67,182}, {67,188}, {67,187}, {67,184}, {27,15}, {27,14}, {27,16}, {67,190}, {29,114}, {68,0}, {72,5}, {71,189}, {29,126}, {72,2}, {29,118}, {29,122}, {72,1}, {29,121}, {29,117}, {29,120}, {29,115}, {29,125}, {72,3}, {71,190}, {29,124}, {71,188}, {29,123}, {72,4}, {72,0}, {27,17}, {29,127}, {72,6}, {29,119}, {29,116}, {75,134}, {75,136}, {31,59}, {75,137}, {75,135}, {75,133}, {75,132}, {31,61}, {75,131}, {31,62}, {75,129}, {75,130}, {31,58}, {31,97}, {31,60}, {75,128}, {33,16}, {78,124}, {78,122}, {78,127}, {78,125}, {78,123}, {78,126}, {34,32}, {80,178}, {80,179}, {35,22}, {80,180}, {80,176}, {80,181}, {80,177}, {33,17}, {82,190}, {83,1}, {35,25}, {83,0}, {35,24}, {35,23}, {35,26}, {84,133}, {84,134}, {35,154}, {35,153}, {35,155}, {84,132}, {85,152}, {85,151}, {36,45}, {36,47}, {36,46}, {85,153}, {36,136}, {87,102}, {36,177}, {87,101}, {87,174}, {40,9}, {4,61}, {4,60}, {5,31}, {5,30}, {40,135}, {5,29}, {40,134}, {6,57}, {41,105}, {41,104}, {6,55}, {6,58}, {41,103}, {6,56}, {42,176}, {42,177}, {8,20}, {10,106}, {48,8}, {48,9}, {13,5}, {13,6}, {51,108}, {15,169}, {15,171}, {51,107}, {15,170}, {55,60}, {18,178}, {21,169}, {21,170}, {59,161}, {24,143}, {24,142}, {68,9}, {72,8}, {72,7}, {88,43}, {3,39}, {40,25}, {40,46}, {40,47}, {5,34}, {5,38}, {40,137}, {5,36}, {5,35}, {40,136}, {5,37}, {5,33}, {5,32}, {40,138}, {6,102}, {6,99}, {6,61}, {41,106}, {41,107}, {6,97}, {41,109}, {6,59}, {41,110}, {41,108}, {6,62}, {6,98}, {6,101}, {6,100}, {6,60}, {41,111}, {8,25}, {42,190}, {8,27}, {8,26}, {43,0}, {8,24}, {8,23}, {42,181}, {42,180}, {42,178}, {42,183}, {42,182}, {42,179}, {42,188}, {42,189}, {42,186}, {42,184}, {8,22}, {42,187}, {8,28}, {43,1}, {42,185}, {10,107}, {8,21}, {10,108}, {45,20}, {45,26}, {10,114}, {45,24}, {45,30}, {45,21}, {45,25}, {45,27}, {45,29}, {45,23}, {45,22}, {45,17}, {45,18}, {10,109}, {10,111}, {10,110}, {45,19}, {45,28}, {10,113}, {45,16}, {48,19}, {48,18}, {48,23}, {48,14}, {48,17}, {48,16}, {48,20}, {48,24}, {13,7}, {13,10}, {48,15}, {48,21}, {13,9}, {48,10}, {10,112}, {51,122}, {48,22}, {48,13}, {13,8}, {48,12}, {51,113}, {15,172}, {15,176}, {51,129}, {51,111}, {51,125}, {15,177}, {51,127}, {51,133}, {51,137}, {51,128}, {51,116}, {51,124}, {51,138}, {51,136}, {51,126}, {51,121}, {51,114}, {55,102}, {51,112}, {15,181}, {51,119}, {15,182}, {15,178}, {51,109}, {51,131}, {51,117}, {51,115}, {51,134}, {15,179}, {51,140}, {15,173}, {15,175}, {51,123}, {51,118}, {13,11}, {15,174}, {51,120}, {51,135}, {51,139}, {51,130}, {51,132}, {51,110}, {55,97}, {55,106}, {55,105}, {18,186}, {55,98}, {18,187}, {18,185}, {55,100}, {18,182}, {55,104}, {55,99}, {55,101}, {55,61}, {18,180}, {55,114}, {55,113}, {55,110}, {18,179}, {18,183}, {18,184}, {48,11}, {55,107}, {18,181}, {15,180}, {55,109}, {55,62}, {55,112}, {55,111}, {55,115}, {59,175}, {55,108}, {55,103}, {59,167}, {21,180}, {21,183}, {21,178}, {59,166}, {59,170}, {59,165}, {21,172}, {21,182}, {59,162}, {21,176}, {59,169}, {21,174}, {21,173}, {59,172}, {21,175}, {59,174}, {59,171}, {21,171}, {21,181}, {59,176}, {59,164}, {59,173}, {59,163}, {21,177}, {21,179}, {59,168}, {59,177}, {64,29}, {24,144}, {64,35}, {24,149}, {64,31}, {64,38}, {64,23}, {24,151}, {24,145}, {64,28}, {27,21}, {64,27}, {64,36}, {24,146}, {24,150}, {64,26}, {64,32}, {64,37}, {64,22}, {24,148}, {64,30}, {64,34}, {64,40}, {64,24}, {64,33}, {24,147}, {64,39}, {64,25}, {27,25}, {68,11}, {27,23}, {27,22}, {68,13}, {68,18}, {68,14}, {68,17}, {27,28}, {29,101}, {27,27}, {68,10}, {68,16}, {27,26}, {68,15}, {68,12}, {27,24}, {72,13}, {72,15}, {72,10}, {29,129}, {72,12}, {29,128}, {72,14}, {29,131}, {72,16}, {29,130}, {72,9}, {72,11}, {31,101}, {75,140}, {31,100}, {75,141}, {31,99}, {75,139}, {31,98}, {75,138}, {33,19}, {33,18}, {80,182}, {80,184}, {80,183}, {34,33}, {34,34}, {34,35}, {83,2}, {35,27}, {86,147}, {86,146}, {36,178}, {3,40}, {3,144}, {6,103}, {45,31}, {18,188}, {18,189}, {59,178}, {24,152}, {64,41}, {68,19}, {40,26}, {41,112}, {43,2}, {45,32}, {48,25}, {13,12}, {80,185}, {35,156}, {3,41}, {4,62}, {40,48}, {5,39}, {5,40}, {8,29}, {15,183}, {24,154}, {24,155}, {24,153}, {3,42}, {3,145}, {3,147}, {3,146}, {40,27}, {3,148}, {4,97}, {40,49}, {4,98}, {5,41}, {5,42}, {40,139}, {6,104}, {41,113}, {8,33}, {43,3}, {8,31}, {8,32}, {8,30}, {48,26}, {10,118}, {10,117}, {10,119}, {10,116}, {45,33}, {8,34}, {10,115}, {13,13}, {13,14}, {13,15}, {51,141}, {18,190}, {55,116}, {15,184}, {21,184}, {24,157}, {24,156}, {64,42}, {27,29}, {29,132}, {78,128}, {85,154}, {86,148}, {3,43}, {4,99}, {4,100}, {40,145}, {5,44}, {5,47}, {40,143}, {40,141}, {5,46}, {40,144}, {40,146}, {40,140}, {5,49}, {5,48}, {5,45}, {5,43}, {40,142}, {6,115}, {6,112}, {41,118}, {41,121}, {41,120}, {6,106}, {6,114}, {6,111}, {41,117}, {41,115}, {6,110}, {6,105}, {6,108}, {41,116}, {41,123}, {41,119}, {6,109}, {6,113}, {6,116}, {41,114}, {41,122}, {6,107}, {8,39}, {8,47}, {43,15}, {43,8}, {8,48}, {43,19}, {43,4}, {43,11}, {8,38}, {43,5}, {8,36}, {43,12}, {43,16}, {8,35}, {43,17}, {43,10}, {43,13}, {8,50}, {8,41}, {43,20}, {43,18}, {8,46}, {8,44}, {43,9}, {8,43}, {43,7}, {43,6}, {8,42}, {8,40}, {8,49}, {8,45}, {8,37}, {43,14}, {10,121}, {10,128}, {45,47}, {10,120}, {45,39}, {45,35}, {45,51}, {45,34}, {10,123}, {45,44}, {10,126}, {10,129}, {10,124}, {45,48}, {10,127}, {13,22}, {45,54}, {45,36}, {45,38}, {45,45}, {45,49}, {45,53}, {45,50}, {45,43}, {45,46}, {45,40}, {10,131}, {45,42}, {45,41}, {45,52}, {10,122}, {45,37}, {10,130}, {10,125}, {13,28}, {48,34}, {13,27}, {48,32}, {13,16}, {13,21}, {48,31}, {48,28}, {48,33}, {13,17}, {48,27}, {13,20}, {13,18}, {48,35}, {13,19}, {13,23}, {13,24}, {13,26}, {13,25}, {48,29}, {48,30}, {48,36}, {51,148}, {15,185}, {55,130}, {51,147}, {51,166}, {16,0}, {51,164}, {15,190}, {15,186}, {51,173}, {51,157}, {51,160}, {16,3}, {51,170}, {51,162}, {15,187}, {16,4}, {51,167}, {51,165}, {51,150}, {51,171}, {51,159}, {51,154}, {51,144}, {51,172}, {51,156}, {51,143}, {16,2}, {51,161}, {51,174}, {51,158}, {51,146}, {51,151}, {51,142}, {16,1}, {51,155}, {51,152}, {15,188}, {51,145}, {51,169}, {15,189}, {51,153}, {51,149}, {51,168}, {19,0}, {55,123}, {55,120}, {55,137}, {55,125}, {55,138}, {19,2}, {55,134}, {55,131}, {55,132}, {55,135}, {55,139}, {51,163}, {55,141}, {60,7}, {19,3}, {55,142}, {55,118}, {55,128}, {55,133}, {19,1}, {19,4}, {55,140}, {55,143}, {55,122}, {55,119}, {55,121}, {55,126}, {55,124}, {19,5}, {55,136}, {55,127}, {55,129}, {55,117}, {59,186}, {59,184}, {22,2}, {22,0}, {60,3}, {59,185}, {60,4}, {60,0}, {59,183}, {60,6}, {59,182}, {59,189}, {21,190}, {21,189}, {21,188}, {59,187}, {60,1}, {21,185}, {22,1}, {59,180}, {59,190}, {59,179}, {59,188}, {21,186}, {60,2}, {59,181}, {21,187}, {60,5}, {64,46}, {24,162}, {24,161}, {24,163}, {64,58}, {64,48}, {64,54}, {64,43}, {64,57}, {64,56}, {64,60}, {64,53}, {24,158}, {64,52}, {24,164}, {64,45}, {24,159}, {64,59}, {24,160}, {64,47}, {64,50}, {64,55}, {64,49}, {64,44}, {64,51}, {68,21}, {27,33}, {68,24}, {68,23}, {68,26}, {68,28}, {27,31}, {68,22}, {68,20}, {68,29}, {68,27}, {68,25}, {68,31}, {68,30}, {27,35}, {27,30}, {27,32}, {27,34}, {68,32}, {72,23}, {72,22}, {72,21}, {72,24}, {72,17}, {72,18}, {72,26}, {72,19}, {29,133}, {72,28}, {72,27}, {72,20}, {75,145}, {31,104}, {75,143}, {75,148}, {75,147}, {72,25}, {31,103}, {75,146}, {75,142}, {75,150}, {75,149}, {31,102}, {75,144}, {29,134}, {33,20}, {78,129}, {80,186}, {80,187}, {80,188}, {35,28}, {35,29}, {83,3}, {84,136}, {84,135}, {85,155}, {85,156}, {86,149}, {87,103}, {3,44}, {3,45}, {3,46}, {3,149}, {4,101}, {40,147}, {5,50}, {5,51}, {6,119}, {6,120}, {6,118}, {6,117}, {8,51}, {43,21}, {8,53}, {8,52}, {43,22}, {10,132}, {13,29}, {48,37}, {51,176}, {16,5}, {19,7}, {51,175}, {19,6}, {24,165}, {64,61}, {29,135}, {31,105}, {75,151}, {35,30}, {36,48}, {40,50}, {4,102}, {40,51}, {5,54}, {5,52}, {5,53}, {5,55}, {6,122}, {6,121}, {41,124}, {6,123}, {41,125}, {43,23}, {43,24}, {8,54}, {8,56}, {8,58}, {8,55}, {8,59}, {8,57}, {10,136}, {10,133}, {10,135}, {10,137}, {10,134}, {48,38}, {45,55}, {48,40}, {48,39}, {13,35}, {13,31}, {13,32}, {13,34}, {13,36}, {13,33}, {13,38}, {13,37}, {16,10}, {51,178}, {51,177}, {16,9}, {16,8}, {16,7}, {16,11}, {16,6}, {55,149}, {55,146}, {19,9}, {55,145}, {55,150}, {19,11}, {55,148}, {19,8}, {19,10}, {55,147}, {60,8}, {60,9}, {60,10}, {24,166}, {24,174}, {64,62}, {24,168}, {24,172}, {64,97}, {24,173}, {24,169}, {24,170}, {24,167}, {24,171}, {27,38}, {55,144}, {27,39}, {27,37}, {27,36}, {72,29}, {29,136}, {75,152}, {75,153}, {34,36}, {35,31}, {3,47}, {5,56}, {10,138}, {48,41}, {13,39}, {16,14}, {16,13}, {16,12}, {19,12}, {19,13}, {55,151}, {24,175}, {29,137}, {3,48}, {40,28}, {3,150}, {40,52}, {40,148}, {5,57}, {8,60}, {60,11}, {3,49}, {3,151}, {40,149}, {41,126}, {41,127}, {6,124}, {55,152}, {19,14}, {60,12}, {31,106}, {3,50}, {3,104}, {3,152}, {40,53}, {4,103}, {6,128}, {6,127}, {6,125}, {6,126}, {43,25}, {8,62}, {8,97}, {43,26}, {8,61}, {10,142}, {45,56}, {10,141}, {10,139}, {10,140}, {13,42}, {13,40}, {48,43}, {13,41}, {48,42}, {13,30}, {51,179}, {16,16}, {16,17}, {16,15}, {24,176}, {64,98}, {27,40}, {27,41}, {68,33}, {31,107}, {78,130}, {78,131}, {35,157}, {87,104}, {40,11}, {3,153}, {3,51}, {40,55}, {40,54}, {5,58}, {40,151}, {40,152}, {40,150}, {40,153}, {41,135}, {41,130}, {41,132}, {41,134}, {41,131}, {6,132}, {41,128}, {41,129}, {6,129}, {6,130}, {41,133}, {41,136}, {6,131}, {41,137}, {43,40}, {43,34}, {43,29}, {8,99}, {43,37}, {43,35}, {43,28}, {43,41}, {43,44}, {43,39}, {43,32}, {8,101}, {43,38}, {8,102}, {43,33}, {43,36}, {43,27}, {43,31}, {43,43}, {8,103}, {8,104}, {43,30}, {43,42}, {8,98}, {8,100}, {45,107}, {45,100}, {45,106}, {45,99}, {45,101}, {45,61}, {45,59}, {45,108}, {45,105}, {45,57}, {10,144}, {45,103}, {45,104}, {45,102}, {45,60}, {45,58}, {10,143}, {45,98}, {45,62}, {45,97}, {45,109}, {13,47}, {13,46}, {48,44}, {13,43}, {48,46}, {13,48}, {48,47}, {13,51}, {13,49}, {48,48}, {45,110}, {48,50}, {13,45}, {13,44}, {48,45}, {48,49}, {13,50}, {16,19}, {16,18}, {51,181}, {51,185}, {51,187}, {16,20}, {51,190}, {16,24}, {52,1}, {16,26}, {16,22}, {16,30}, {16,27}, {51,183}, {16,21}, {51,182}, {51,180}, {52,3}, {51,184}, {16,23}, {52,2}, {16,28}, {51,189}, {51,188}, {16,29}, {51,186}, {16,25}, {52,4}, {52,0}, {55,167}, {55,174}, {55,163}, {19,17}, {55,159}, {55,175}, {55,153}, {55,172}, {55,170}, {55,164}, {55,173}, {55,166}, {55,158}, {55,176}, {55,156}, {55,169}, {55,154}, {55,177}, {19,18}, {55,171}, {60,15}, {55,157}, {19,15}, {55,161}, {19,16}, {55,160}, {55,165}, {55,162}, {55,168}, {60,19}, {60,22}, {60,14}, {60,16}, {60,21}, {60,20}, {22,3}, {55,155}, {60,18}, {22,4}, {60,13}, {60,17}, {64,105}, {64,112}, {64,103}, {64,110}, {64,101}, {64,109}, {64,113}, {64,100}, {64,104}, {64,99}, {24,177}, {64,102}, {24,178}, {64,108}, {64,107}, {64,106}, {64,111}, {68,37}, {68,39}, {27,43}, {68,40}, {68,35}, {68,34}, {68,44}, {68,42}, {27,42}, {68,45}, {68,36}, {68,41}, {68,43}, {68,38}, {72,33}, {72,38}, {72,32}, {72,37}, {72,30}, {72,40}, {72,36}, {72,41}, {72,35}, {72,31}, {72,39}, {72,42}, {72,34}, {75,154}, {31,111}, {31,109}, {31,108}, {31,110}, {78,132}, {80,50}, {80,189}, {83,4}, {83,5}, {35,32}, {84,137}, {35,158}, {84,138}, {85,158}, {36,50}, {36,49}, {85,157}, {36,137}, {86,150}, {3,52}, {5,59}, {40,154}, {41,138}, {7,117}, {16,31}, {3,53}, {4,106}, {4,105}, {4,104}, {6,133}, {13,52}, {60,23}, {3,54}, {3,55}, {3,56}, {3,154}, {10,145}, {45,111}, {19,19}, {3,57}, {40,29}, {4,107}, {4,108}, {40,56}, {5,60}, {41,139}, {6,134}, {41,140}, {8,110}, {43,46}, {8,108}, {8,107}, {43,45}, {8,105}, {43,47}, {8,106}, {8,109}, {10,146}, {10,148}, {45,115}, {45,112}, {45,113}, {45,114}, {45,116}, {10,147}, {48,52}, {48,51}, {13,54}, {13,53}, {16,34}, {52,6}, {16,33}, {16,35}, {16,32}, {19,21}, {52,5}, {19,22}, {55,179}, {19,23}, {55,178}, {19,20}, {60,26}, {60,28}, {22,5}, {60,27}, {60,25}, {60,24}, {64,116}, {24,183}, {24,181}, {24,182}, {64,114}, {64,115}, {24,179}, {68,49}, {68,47}, {27,45}, {68,48}, {27,46}, {27,44}, {24,180}, {72,45}, {72,43}, {72,44}, {68,46}, {75,156}, {31,112}, {75,155}, {78,133}, {78,134}, {72,46}, {80,190}, {3,58}, {4,109}, {5,62}, {40,155}, {5,61}, {8,111}, {22,6}, {3,155}, {4,110}, {10,149}, {19,24}, {40,57}, {40,58}, {40,156}, {6,136}, {41,144}, {41,142}, {6,137}, {41,141}, {41,143}, {41,145}, {6,135}, {8,115}, {8,116}, {8,113}, {8,112}, {45,120}, {8,114}, {10,150}, {45,119}, {45,121}, {45,118}, {45,122}, {10,151}, {13,57}, {48,53}, {48,55}, {13,55}, {48,56}, {13,56}, {48,54}, {45,117}, {52,7}, {52,10}, {52,11}, {52,8}, {16,39}, {16,38}, {16,36}, {16,37}, {52,9}, {16,40}, {19,26}, {19,27}, {19,28}, {60,29}, {60,31}, {60,33}, {22,8}, {22,7}, {19,25}, {60,32}, {60,30}, {64,120}, {64,118}, {64,124}, {24,184}, {64,125}, {64,122}, {24,185}, {64,119}, {64,117}, {64,123}, {27,48}, {68,51}, {64,121}, {27,50}, {68,52}, {27,49}, {27,52}, {68,53}, {27,47}, {27,51}, {72,51}, {72,49}, {72,48}, {72,50}, {72,47}, {34,38}, {83,6}, {83,7}, {84,139}, {85,159}, {37,21}, {8,117}, {6,138}, {10,152}, {3,59}, {3,156}, {4,111}, {40,157}, {6,139}, {41,146}, {45,123}, {10,153}, {24,186}, {3,60}, {5,97}, {22,9}, {3,61}, {3,157}, {3,158}, {4,113}, {4,112}, {40,158}, {5,98}, {41,147}, {6,140}, {43,49}, {43,50}, {43,51}, {8,118}, {8,119}, {43,48}, {8,120}, {10,154}, {45,124}, {48,58}, {13,58}, {48,57}, {16,41}, {52,12}, {16,42}, {52,13}, {19,29}, {60,34}, {64,127}, {64,126}, {24,187}, {27,53}, {68,54}, {29,138}, {72,52}, {31,113}, {36,51}, {86,152}, {43,52}, {45,125}, {16,43}, {55,180}, {22,10}, {33,21}, {6,142}, {6,141}, {10,155}, {48,59}, {16,45}, {18,3}, {16,46}, {16,44}, {19,30}, {64,128}, {24,188}, {27,54}, {40,12}, {40,159}, {41,149}, {6,143}, {41,148}, {6,144}, {8,124}, {43,55}, {43,54}, {8,123}, {8,121}, {8,122}, {43,53}, {10,157}, {45,126}, {10,160}, {10,156}, {10,162}, {10,158}, {10,159}, {10,161}, {13,61}, {13,60}, {13,59}, {52,15}, {16,47}, {16,50}, {16,48}, {52,14}, {16,53}, {16,49}, {52,16}, {16,52}, {16,51}, {55,182}, {55,181}, {19,33}, {19,31}, {19,32}, {55,183}, {22,11}, {60,36}, {22,12}, {60,35}, {68,55}, {27,56}, {64,129}, {27,55}, {24,189}, {75,158}, {72,53}, {31,114}, {75,157}, {81,0}, {83,8}, {83,9}, {3,159}, {4,114}, {40,59}, {6,146}, {6,148}, {40,162}, {41,152}, {41,151}, {41,150}, {40,161}, {40,160}, {5,100}, {6,147}, {6,145}, {5,99}, {8,125}, {43,56}, {8,126}, {41,157}, {41,159}, {41,158}, {43,57}, {41,154}, {6,152}, {6,150}, {41,153}, {41,155}, {41,161}, {6,149}, {41,156}, {41,165}, {8,128}, {41,162}, {6,151}, {41,160}, {41,163}, {8,127}, {8,129}, {41,164}, {43,111}, {43,98}, {43,62}, {43,110}, {43,105}, {10,167}, {8,130}, {43,106}, {43,109}, {10,163}, {43,108}, {8,131}, {8,136}, {8,134}, {43,99}, {43,60}, {43,101}, {8,141}, {43,112}, {10,164}, {43,102}, {10,165}, {8,137}, {43,104}, {45,141}, {10,166}, {43,59}, {8,138}, {10,168}, {8,139}, {8,135}, {8,140}, {43,103}, {43,58}, {43,107}, {8,132}, {43,61}, {43,100}, {43,97}, {8,133}, {45,127}, {45,128}, {45,138}, {48,97}, {45,139}, {10,174}, {45,142}, {45,132}, {10,173}, {45,134}, {45,135}, {45,137}, {10,169}, {13,99}, {45,133}, {45,129}, {13,100}, {45,143}, {13,62}, {48,61}, {45,136}, {48,60}, {45,131}, {45,140}, {10,172}, {13,97}, {10,178}, {13,98}, {45,144}, {48,62}, {10,171}, {13,102}, {10,177}, {10,176}, {10,175}, {13,101}, {45,145}, {13,103}, {10,170}, {45,130}, {16,54}, {48,100}, {48,102}, {48,104}, {13,104}, {13,110}, {52,19}, {48,108}, {48,99}, {16,56}, {52,17}, {13,109}, {13,107}, {48,110}, {52,18}, {48,101}, {13,108}, {48,105}, {13,111}, {48,107}, {13,106}, {48,106}, {48,109}, {48,103}, {13,105}, {16,57}, {48,98}, {16,55}, {16,58}, {52,21}, {52,30}, {19,36}, {16,60}, {16,99}, {19,37}, {52,32}, {16,106}, {55,185}, {52,22}, {16,98}, {16,101}, {16,62}, {52,20}, {52,34}, {52,37}, {56,9}, {52,35}, {55,189}, {16,97}, {16,104}, {16,108}, {52,29}, {55,184}, {52,33}, {16,59}, {55,186}, {52,36}, {55,188}, {52,25}, {19,34}, {52,23}, {52,24}, {16,103}, {16,102}, {52,27}, {16,107}, {52,31}, {16,100}, {52,28}, {16,105}, {19,38}, {19,35}, {55,187}, {52,26}, {16,61}, {19,43}, {19,47}, {56,0}, {22,17}, {19,45}, {56,4}, {19,49}, {60,37}, {56,6}, {22,19}, {19,41}, {19,44}, {56,7}, {56,8}, {56,14}, {19,51}, {22,20}, {56,10}, {56,15}, {56,3}, {22,30}, {22,21}, {19,50}, {56,1}, {56,16}, {22,29}, {19,48}, {22,14}, {56,13}, {19,52}, {56,5}, {55,190}, {19,42}, {56,2}, {56,11}, {22,13}, {22,18}, {19,39}, {56,12}, {22,16}, {19,40}, {22,28}, {64,131}, {60,48}, {60,40}, {64,130}, {60,44}, {60,46}, {60,43}, {22,27}, {60,42}, {22,31}, {64,146}, {22,26}, {25,0}, {60,49}, {64,132}, {22,24}, {60,41}, {60,45}, {24,190}, {22,15}, {60,38}, {60,39}, {25,1}, {22,23}, {22,25}, {22,22}, {60,47}, {64,136}, {64,137}, {64,142}, {27,61}, {64,149}, {25,7}, {25,6}, {64,144}, {27,60}, {64,133}, {25,5}, {64,148}, {25,3}, {25,4}, {64,145}, {68,106}, {27,58}, {19,46}, {64,147}, {27,99}, {64,139}, {27,59}, {27,98}, {64,134}, {64,138}, {64,135}, {64,141}, {25,8}, {27,57}, {25,2}, {68,58}, {64,143}, {27,97}, {27,100}, {64,140}, {27,62}, {68,57}, {68,62}, {29,142}, {68,56}, {72,99}, {68,105}, {27,104}, {27,102}, {29,140}, {68,102}, {68,98}, {27,108}, {72,56}, {27,106}, {68,97}, {72,54}, {68,101}, {68,104}, {68,61}, {27,107}, {27,101}, {72,55}, {29,141}, {68,103}, {27,103}, {27,105}, {68,100}, {27,109}, {68,99}, {68,60}, {68,59}, {29,139}, {68,107}, {72,58}, {75,160}, {29,144}, {72,98}, {72,62}, {75,161}, {29,145}, {72,97}, {72,60}, {31,116}, {75,159}, {72,57}, {72,59}, {31,117}, {29,147}, {31,115}, {29,146}, {31,119}, {72,61}, {29,143}, {78,143}, {78,135}, {75,167}, {78,136}, {75,163}, {33,22}, {75,165}, {75,164}, {31,118}, {75,162}, {75,166}, {78,144}, {78,140}, {78,142}, {78,137}, {78,138}, {78,141}, {78,139}, {34,39}, {34,42}, {34,41}, {34,40}, {35,33}, {83,10}, {35,34}, {81,1}, {35,159}, {84,140}, {35,160}, {36,52}, {36,138}, {86,153}, {86,154}, {86,155}, {88,122}, {3,160}, {40,60}, {4,115}, {5,102}, {5,103}, {5,101}, {5,104}, {6,154}, {6,153}, {43,113}, {8,143}, {8,142}, {48,111}, {16,109}, {16,110}, {19,53}, {60,50}, {22,32}, {22,33}, {60,52}, {60,54}, {60,53}, {64,151}, {64,150}, {25,9}, {64,152}, {68,108}, {27,110}, {29,148}, {31,120}, {33,23}, {31,121}, {3,161}, {41,166}, {43,114}, {8,145}, {8,144}, {8,146}, {10,179}, {45,146}, {45,147}, {48,112}, {13,112}, {16,111}, {19,54}, {56,17}, {3,162}, {3,62}, {3,163}, {40,61}, {4,119}, {4,118}, {4,116}, {4,117}, {5,107}, {40,169}, {40,171}, {5,106}, {40,163}, {40,164}, {40,170}, {40,166}, {40,168}, {5,105}, {40,165}, {40,172}, {40,167}, {6,161}, {6,170}, {6,168}, {41,176}, {41,173}, {41,181}, {6,166}, {41,182}, {6,159}, {41,179}, {6,165}, {41,175}, {41,174}, {6,163}, {41,180}, {6,164}, {8,147}, {6,158}, {41,177}, {41,167}, {6,155}, {6,174}, {41,172}, {41,178}, {6,160}, {6,162}, {41,168}, {41,169}, {41,170}, {6,173}, {6,167}, {6,172}, {41,171}, {6,171}, {6,157}, {6,156}, {6,169}, {8,161}, {43,126}, {43,119}, {8,156}, {8,175}, {43,115}, {43,122}, {43,124}, {43,127}, {8,170}, {43,123}, {43,116}, {8,168}, {43,120}, {43,128}, {8,153}, {43,125}, {8,163}, {8,162}, {43,118}, {8,151}, {8,152}, {8,150}, {8,174}, {8,166}, {8,160}, {8,148}, {43,121}, {8,159}, {8,149}, {8,167}, {8,176}, {45,148}, {8,164}, {43,117}, {8,154}, {8,157}, {8,158}, {8,172}, {8,173}, {8,171}, {8,165}, {8,169}, {8,155}, {10,180}, {45,154}, {11,1}, {10,184}, {10,186}, {11,0}, {45,166}, {10,189}, {48,113}, {13,113}, {11,3}, {45,151}, {45,159}, {10,190}, {45,158}, {45,155}, {45,163}, {45,165}, {10,183}, {10,187}, {11,2}, {13,115}, {45,160}, {10,185}, {11,5}, {45,153}, {10,188}, {13,114}, {10,182}, {45,150}, {45,157}, {45,149}, {45,152}, {45,156}, {48,114}, {11,4}, {45,161}, {45,162}, {45,164}, {10,181}, {13,129}, {48,126}, {13,127}, {13,128}, {48,116}, {48,132}, {13,118}, {52,38}, {48,134}, {48,128}, {48,119}, {48,137}, {48,122}, {13,124}, {52,61}, {48,125}, {13,126}, {13,117}, {48,139}, {48,127}, {13,120}, {48,120}, {48,117}, {48,118}, {13,121}, {48,133}, {48,140}, {13,123}, {48,124}, {48,123}, {13,131}, {13,130}, {13,116}, {13,122}, {13,125}, {48,136}, {48,130}, {13,119}, {48,115}, {48,138}, {48,129}, {48,131}, {48,135}, {52,39}, {16,119}, {16,139}, {16,138}, {16,127}, {52,57}, {52,53}, {52,50}, {52,102}, {16,122}, {16,114}, {52,55}, {19,104}, {16,118}, {52,97}, {16,140}, {16,137}, {52,59}, {52,42}, {16,136}, {52,99}, {52,41}, {16,125}, {16,129}, {52,98}, {52,51}, {16,130}, {16,124}, {52,40}, {19,56}, {52,101}, {52,49}, {16,135}, {52,52}, {52,100}, {16,134}, {56,18}, {16,115}, {52,47}, {16,120}, {16,131}, {16,126}, {52,56}, {52,46}, {52,44}, {52,62}, {16,112}, {16,132}, {16,116}, {19,55}, {52,60}, {16,117}, {16,113}, {16,128}, {16,123}, {16,121}, {52,48}, {16,133}, {52,45}, {52,58}, {52,54}, {56,20}, {56,19}, {52,43}, {56,36}, {19,58}, {56,42}, {56,25}, {56,39}, {60,55}, {19,61}, {56,43}, {56,46}, {19,60}, {56,28}, {56,45}, {56,44}, {19,62}, {56,21}, {19,57}, {19,99}, {19,97}, {56,41}, {56,31}, {19,101}, {56,48}, {56,40}, {56,49}, {19,109}, {19,107}, {56,38}, {56,37}, {56,35}, {56,29}, {19,100}, {19,98}, {48,121}, {56,22}, {60,119}, {56,23}, {19,59}, {19,106}, {60,57}, {19,102}, {19,103}, {56,24}, {56,47}, {60,56}, {56,32}, {56,27}, {19,105}, {56,33}, {56,30}, {19,110}, {22,48}, {60,60}, {60,113}, {60,118}, {60,106}, {22,44}, {60,123}, {22,41}, {60,58}, {60,59}, {22,34}, {22,43}, {60,100}, {22,46}, {22,47}, {60,101}, {60,114}, {60,120}, {22,42}, {22,36}, {60,99}, {60,61}, {60,122}, {60,104}, {60,105}, {60,62}, {60,116}, {60,107}, {60,117}, {60,109}, {22,37}, {64,153}, {22,40}, {22,38}, {60,121}, {60,112}, {60,108}, {60,97}, {25,19}, {60,111}, {22,45}, {60,103}, {60,102}, {22,39}, {22,35}, {64,174}, {60,115}, {60,110}, {60,98}, {64,169}, {64,154}, {64,165}, {64,172}, {25,17}, {19,108}, {64,170}, {25,12}, {25,11}, {64,177}, {64,155}, {64,168}, {64,156}, {64,167}, {25,15}, {64,171}, {56,34}, {64,178}, {64,163}, {25,18}, {68,122}, {27,111}, {64,176}, {64,175}, {25,20}, {68,109}, {27,112}, {68,110}, {64,159}, {64,160}, {64,157}, {64,162}, {64,158}, {64,179}, {25,14}, {27,113}, {25,16}, {25,21}, {64,161}, {64,173}, {64,166}, {68,113}, {25,10}, {27,116}, {72,106}, {68,118}, {68,117}, {68,119}, {68,116}, {27,117}, {27,123}, {27,120}, {27,121}, {68,111}, {68,114}, {68,124}, {27,129}, {27,127}, {68,115}, {56,26}, {27,114}, {68,121}, {68,112}, {27,130}, {68,120}, {25,13}, {27,119}, {64,164}, {27,122}, {27,126}, {27,128}, {27,125}, {27,124}, {27,118}, {68,123}, {27,115}, {27,131}, {29,152}, {29,153}, {72,105}, {29,162}, {29,159}, {29,150}, {29,157}, {72,107}, {29,155}, {29,149}, {29,156}, {72,104}, {31,123}, {29,151}, {29,158}, {31,122}, {72,103}, {72,102}, {29,160}, {29,161}, {72,101}, {72,100}, {31,124}, {72,110}, {29,154}, {72,108}, {31,125}, {31,130}, {75,170}, {75,172}, {31,127}, {75,173}, {75,169}, {75,171}, {31,128}, {31,131}, {75,168}, {31,126}, {31,129}, {33,25}, {72,109}, {33,24}, {33,30}, {78,148}, {33,28}, {33,29}, {78,151}, {78,147}, {33,26}, {78,145}, {34,43}, {78,149}, {78,150}, {78,146}, {33,27}, {81,2}, {81,5}, {81,6}, {81,4}, {81,7}, {34,44}, {81,3}, {83,14}, {35,36}, {83,13}, {83,12}, {83,11}, {35,35}, {35,37}, {84,141}, {35,162}, {35,161}, {85,161}, {85,160}, {85,163}, {36,139}, {36,53}, {86,157}, {85,162}, {86,156}, {36,141}, {36,140}, {36,179}, {87,105}, {87,175}, {3,164}, {56,50}, {72,111}, {5,108}, {41,183}, {6,177}, {6,175}, {6,176}, {43,129}, {8,177}, {11,6}, {45,167}, {45,168}, {11,7}, {48,142}, {13,132}, {13,133}, {48,141}, {16,147}, {16,143}, {52,103}, {16,150}, {16,149}, {16,142}, {16,145}, {16,148}, {16,144}, {56,54}, {16,141}, {19,111}, {19,113}, {19,114}, {56,53}, {56,56}, {19,112}, {56,51}, {56,55}, {56,52}, {22,49}, {60,124}, {25,22}, {64,180}, {29,163}, {27,132}, {68,125}, {27,133}, {27,134}, {68,127}, {68,126}, {68,128}, {72,113}, {72,112}, {75,175}, {75,174}, {31,132}, {31,133}, {81,8}, {3,165}, {56,57}, {19,116}, {19,115}, {60,125}, {78,152}, {35,163}, {86,158}, {3,166}, {13,134}, {16,152}, {16,151}, {56,58}, {56,59}, {22,50}, {64,181}, {25,23}, {72,114}, {3,167}, {4,120}, {8,178}, {43,130}, {45,169}, {11,8}, {16,153}, {56,60}, {19,117}, {22,51}, {68,129}, {68,130}, {75,176}, {33,31}, {87,176}, {3,168}, {43,131}, {8,179}, {11,9}, {45,170}, {13,135}, {48,146}, {48,144}, {48,145}, {13,136}, {48,143}, {16,155}, {16,156}, {52,104}, {16,157}, {16,154}, {56,61}, {56,62}, {60,126}, {25,25}, {25,24}, {75,177}, {78,153}, {81,10}, {81,9}, {83,15}, {40,30}, {11,10}, {3,169}, {4,121}, {5,110}, {5,109}, {5,111}, {5,112}, {40,174}, {40,173}, {41,184}, {6,178}, {41,187}, {41,186}, {41,185}, {41,188}, {8,180}, {43,137}, {43,133}, {43,142}, {8,187}, {8,185}, {43,138}, {43,134}, {43,141}, {8,184}, {9,0}, {43,136}, {43,132}, {8,190}, {43,139}, {8,183}, {43,140}, {8,186}, {8,188}, {43,144}, {43,143}, {43,135}, {8,182}, {8,181}, {8,189}, {45,175}, {45,181}, {11,16}, {11,13}, {45,172}, {45,177}, {11,19}, {11,11}, {45,176}, {11,14}, {11,17}, {45,179}, {11,12}, {45,184}, {11,15}, {11,18}, {45,173}, {45,178}, {45,182}, {45,174}, {45,171}, {45,183}, {45,180}, {13,144}, {13,137}, {13,140}, {13,143}, {48,149}, {13,138}, {48,147}, {13,142}, {13,139}, {48,150}, {13,141}, {52,108}, {16,159}, {52,107}, {52,109}, {16,158}, {16,163}, {48,148}, {52,106}, {52,110}, {16,160}, {52,105}, {16,162}, {16,161}, {56,103}, {56,98}, {19,118}, {19,122}, {19,119}, {56,101}, {56,104}, {19,120}, {19,121}, {19,126}, {60,135}, {56,102}, {19,124}, {56,99}, {56,97}, {19,125}, {56,100}, {22,57}, {60,127}, {22,54}, {22,55}, {22,53}, {60,132}, {60,131}, {60,128}, {22,59}, {60,130}, {19,123}, {60,134}, {60,129}, {22,56}, {22,52}, {22,58}, {60,133}, {25,28}, {64,184}, {64,183}, {64,182}, {25,26}, {25,27}, {68,133}, {68,136}, {27,136}, {27,135}, {68,137}, {68,132}, {27,138}, {68,134}, {27,137}, {68,131}, {68,135}, {29,169}, {29,166}, {72,123}, {72,122}, {72,121}, {72,116}, {72,117}, {29,167}, {29,164}, {29,168}, {72,115}, {29,165}, {72,118}, {72,119}, {72,124}, {72,120}, {75,178}, {31,135}, {78,156}, {31,134}, {78,154}, {78,155}, {33,32}, {34,46}, {81,11}, {34,45}, {83,17}, {83,18}, {35,38}, {83,16}, {35,164}, {86,159}, {36,142}, {87,106}, {87,107}, {3,170}, {5,113}, {5,114}, {6,179}, {43,145}, {11,20}, {13,145}, {16,164}, {15,146}, {19,127}, {19,128}, {18,140}, {56,105}, {22,60}, {64,186}, {64,185}, {3,171}, {5,115}, {43,146}, {9,2}, {9,1}, {45,185}, {45,186}, {48,151}, {48,152}, {13,146}, {13,147}, {13,148}, {52,111}, {16,166}, {19,130}, {19,129}, {60,136}, {62,58}, {64,187}, {72,125}, {33,33}, {35,39}, {3,172}, {4,124}, {4,125}, {4,123}, {4,126}, {4,122}, {5,118}, {40,182}, {5,117}, {5,119}, {40,177}, {40,176}, {40,179}, {40,178}, {40,181}, {5,116}, {40,175}, {40,180}, {41,189}, {6,189}, {41,190}, {42,3}, {6,188}, {42,7}, {42,2}, {42,5}, {6,181}, {6,182}, {6,183}, {6,184}, {7,0}, {42,1}, {6,186}, {7,1}, {42,0}, {42,6}, {6,185}, {42,4}, {6,187}, {6,180}, {6,190}, {9,23}, {43,148}, {9,3}, {9,13}, {9,14}, {9,6}, {9,24}, {9,8}, {43,156}, {9,19}, {43,151}, {9,9}, {43,166}, {43,167}, {43,159}, {43,152}, {9,22}, {43,164}, {9,17}, {9,15}, {43,165}, {43,163}, {43,155}, {43,147}, {43,154}, {9,10}, {9,16}, {9,4}, {43,158}, {43,157}, {43,149}, {9,18}, {43,161}, {43,150}, {9,21}, {43,168}, {9,5}, {9,12}, {43,153}, {43,162}, {9,20}, {9,7}, {9,11}, {43,160}, {46,27}, {11,28}, {11,41}, {46,22}, {46,12}, {11,34}, {46,10}, {11,27}, {46,5}, {11,37}, {46,18}, {45,190}, {46,1}, {46,4}, {45,187}, {46,17}, {46,33}, {11,32}, {46,6}, {46,24}, {45,189}, {46,31}, {46,32}, {46,35}, {46,26}, {46,11}, {46,19}, {11,38}, {11,25}, {11,33}, {11,45}, {11,22}, {11,24}, {46,3}, {11,42}, {11,35}, {46,29}, {46,0}, {11,44}, {11,39}, {46,9}, {11,43}, {46,16}, {46,8}, {11,36}, {46,28}, {46,20}, {11,30}, {46,34}, {46,7}, {11,26}, {46,25}, {46,15}, {11,31}, {46,21}, {11,23}, {45,188}, {11,40}, {13,163}, {11,29}, {46,14}, {46,13}, {46,2}, {46,30}, {46,23}, {11,21}, {48,172}, {13,170}, {48,173}, {48,161}, {13,159}, {13,171}, {48,154}, {48,163}, {48,171}, {48,153}, {48,180}, {13,149}, {48,179}, {48,174}, {48,175}, {13,157}, {13,168}, {48,165}, {48,166}, {48,176}, {48,167}, {48,162}, {48,156}, {48,157}, {48,170}, {48,164}, {13,150}, {13,154}, {48,178}, {48,158}, {13,166}, {13,162}, {13,165}, {13,172}, {13,155}, {13,167}, {48,169}, {13,169}, {13,152}, {13,151}, {48,155}, {48,159}, {13,160}, {48,177}, {48,168}, {48,160}, {13,164}, {13,161}, {13,153}, {13,156}, {52,132}, {52,116}, {52,117}, {52,121}, {52,136}, {52,133}, {52,126}, {52,125}, {16,173}, {52,129}, {52,144}, {52,112}, {52,145}, {52,131}, {52,149}, {52,137}, {16,172}, {52,135}, {16,167}, {16,188}, {16,178}, {16,182}, {16,181}, {52,113}, {52,142}, {52,148}, {52,140}, {52,147}, {52,128}, {52,114}, {52,146}, {52,130}, {16,170}, {16,183}, {52,139}, {16,176}, {52,138}, {52,115}, {16,184}, {16,186}, {52,141}, {16,187}, {16,169}, {52,122}, {52,143}, {16,175}, {16,185}, {52,124}, {52,134}, {52,119}, {52,123}, {16,180}, {52,118}, {16,168}, {16,177}, {16,174}, {52,127}, {13,158}, {56,128}, {16,171}, {16,179}, {56,131}, {56,153}, {56,142}, {19,150}, {19,145}, {56,125}, {19,146}, {56,141}, {56,134}, {56,147}, {19,142}, {56,107}, {56,149}, {19,132}, {56,115}, {19,135}, {19,134}, {19,151}, {56,109}, {56,143}, {56,144}, {19,137}, {19,133}, {56,123}, {19,144}, {56,118}, {56,145}, {19,140}, {56,137}, {56,150}, {56,112}, {56,117}, {56,111}, {19,139}, {56,130}, {60,158}, {56,113}, {19,143}, {56,122}, {56,146}, {19,138}, {56,119}, {56,116}, {56,133}, {19,141}, {19,131}, {19,153}, {56,136}, {56,135}, {56,108}, {19,136}, {56,148}, {56,124}, {56,126}, {56,139}, {56,138}, {56,106}, {19,147}, {19,149}, {56,114}, {56,121}, {56,129}, {19,148}, {56,120}, {56,132}, {56,151}, {56,140}, {56,152}, {56,110}, {60,178}, {22,102}, {60,176}, {60,155}, {60,160}, {60,153}, {60,172}, {60,139}, {60,146}, {60,170}, {60,180}, {60,156}, {60,143}, {60,162}, {60,167}, {60,147}, {60,164}, {60,144}, {60,151}, {60,152}, {22,104}, {60,171}, {60,169}, {60,140}, {60,174}, {60,175}, {60,177}, {22,108}, {22,100}, {52,120}, {60,148}, {60,166}, {60,149}, {22,97}, {22,113}, {60,173}, {22,111}, {22,107}, {60,138}, {22,99}, {60,141}, {22,112}, {60,157}, {60,137}, {22,105}, {60,161}, {60,145}, {22,106}, {60,154}, {22,62}, {19,152}, {60,163}, {56,127}, {60,142}, {60,168}, {22,101}, {60,165}, {22,98}, {60,159}, {22,109}, {60,150}, {60,179}, {22,103}, {61,134}, {22,110}, {65,10}, {65,8}, {65,30}, {65,6}, {65,24}, {22,61}, {25,31}, {65,2}, {65,29}, {65,7}, {65,21}, {25,36}, {25,29}, {65,27}, {65,0}, {65,26}, {25,47}, {65,17}, {65,33}, {25,45}, {65,9}, {25,30}, {65,11}, {65,25}, {25,39}, {65,4}, {25,43}, {25,33}, {65,13}, {65,3}, {64,188}, {65,23}, {25,40}, {65,32}, {64,189}, {25,37}, {65,19}, {25,38}, {65,5}, {65,16}, {65,12}, {65,14}, {25,32}, {65,31}, {25,46}, {65,15}, {65,34}, {64,190}, {65,20}, {25,35}, {25,44}, {25,42}, {65,1}, {65,22}, {25,41}, {25,34}, {65,18}, {65,28}, {68,149}, {68,145}, {68,141}, {68,161}, {68,158}, {27,141}, {68,165}, {68,148}, {27,152}, {68,155}, {68,144}, {68,154}, {27,149}, {68,174}, {68,171}, {68,157}, {68,142}, {68,162}, {68,164}, {27,145}, {68,152}, {68,147}, {68,138}, {27,142}, {27,150}, {68,167}, {27,151}, {68,139}, {68,173}, {68,160}, {68,166}, {27,148}, {68,163}, {68,170}, {27,153}, {27,147}, {68,156}, {68,143}, {68,175}, {68,140}, {68,168}, {27,144}, {68,150}, {68,151}, {27,143}, {27,140}, {68,146}, {27,146}, {27,139}, {68,169}, {68,172}, {68,153}, {72,138}, {72,130}, {72,126}, {29,182}, {29,171}, {29,176}, {29,172}, {72,140}, {72,151}, {29,170}, {72,132}, {72,141}, {68,159}, {72,142}, {29,177}, {72,157}, {29,181}, {29,184}, {72,128}, {29,180}, {72,155}, {72,156}, {72,146}, {72,145}, {72,137}, {72,147}, {72,154}, {72,153}, {29,175}, {29,173}, {72,139}, {72,136}, {72,133}, {72,152}, {29,183}, {72,150}, {29,179}, {29,178}, {72,144}, {72,127}, {72,129}, {72,131}, {72,149}, {72,143}, {29,174}, {72,134}, {72,148}, {72,135}, {31,143}, {76,5}, {31,136}, {75,181}, {76,1}, {31,138}, {76,8}, {75,188}, {75,183}, {76,9}, {75,179}, {75,190}, {31,145}, {76,4}, {76,10}, {75,189}, {31,137}, {76,0}, {75,180}, {31,144}, {76,7}, {75,185}, {31,140}, {75,187}, {75,184}, {31,146}, {75,186}, {31,139}, {31,142}, {76,3}, {75,182}, {76,6}, {76,2}, {33,35}, {78,167}, {33,40}, {33,41}, {33,34}, {78,166}, {78,163}, {78,164}, {33,38}, {78,158}, {78,162}, {33,37}, {78,159}, {33,39}, {33,36}, {78,157}, {78,161}, {78,165}, {81,17}, {81,14}, {81,23}, {81,22}, {81,20}, {81,15}, {34,50}, {81,16}, {34,49}, {31,141}, {81,19}, {34,48}, {81,24}, {81,18}, {81,13}, {78,160}, {34,47}, {81,12}, {83,22}, {83,21}, {81,21}, {35,40}, {83,25}, {83,26}, {83,20}, {83,24}, {83,19}, {84,145}, {83,23}, {35,167}, {35,165}, {84,143}, {84,146}, {84,142}, {84,144}, {35,166}, {85,165}, {85,166}, {36,54}, {85,164}, {86,162}, {36,143}, {86,160}, {86,161}, {87,108}, {37,22}, {87,179}, {87,177}, {87,178}, {87,180}, {88,123}, {3,173}, {5,120}, {9,25}, {43,169}, {46,36}, {48,181}, {48,183}, {48,182}, {48,184}, {16,189}, {52,151}, {48,185}, {52,150}, {52,152}, {52,153}, {56,154}, {19,155}, {56,155}, {56,157}, {19,156}, {19,154}, {56,156}, {60,186}, {60,184}, {60,183}, {60,182}, {60,181}, {22,114}, {60,185}, {25,48}, {65,35}, {65,37}, {25,49}, {65,36}, {27,155}, {27,154}, {68,176}, {72,159}, {72,158}, {72,160}, {29,185}, {76,11}, {31,147}, {78,168}, {33,42}, {81,25}, {36,55}, {3,174}, {4,127}, {5,121}, {7,2}, {9,26}, {9,27}, {11,46}, {48,186}, {22,115}, {69,145}, {29,186}, {33,43}, {3,175}, {5,122}, {43,171}, {9,28}, {43,170}, {46,37}, {11,47}, {46,38}, {11,48}, {48,188}, {13,174}, {13,173}, {52,158}, {52,156}, {52,157}, {52,155}, {52,154}, {56,158}, {56,161}, {19,158}, {56,159}, {19,157}, {56,160}, {60,187}, {65,38}, {65,39}, {65,40}, {68,179}, {68,178}, {27,156}, {68,177}, {68,180}, {72,161}, {72,162}, {72,163}, {76,12}, {31,148}, {33,44}, {81,26}, {35,168}, {40,31}, {11,49}, {46,39}, {13,175}, {16,190}, {19,159}, {56,162}, {22,117}, {22,116}, {65,41}, {65,42}, {27,157}, {27,158}, {72,165}, {72,164}, {78,169}, {86,163}, {3,176}, {40,32}, {4,128}, {7,3}, {42,8}, {11,50}, {22,118}, {3,177}, {46,40}, {11,51}, {46,41}, {31,149}, {3,178}, {43,172}, {46,42}, {49,2}, {49,1}, {48,190}, {48,189}, {49,3}, {49,0}, {17,0}, {17,1}, {19,160}, {56,163}, {56,164}, {56,165}, {61,1}, {61,2}, {61,0}, {60,189}, {60,190}, {22,119}, {65,43}, {68,183}, {68,182}, {68,181}, {68,184}, {72,167}, {72,166}, {29,187}, {72,168}, {31,150}, {76,13}, {78,170}, {81,27}, {85,167}, {3,179}, {4,130}, {4,129}, {9,29}, {40,33}, {40,62}, {5,123}, {40,183}, {42,9}, {42,10}, {9,30}, {43,173}, {11,52}, {46,43}, {46,44}, {13,176}, {13,180}, {49,4}, {13,179}, {13,177}, {13,178}, {52,159}, {17,2}, {19,163}, {19,161}, {19,162}, {56,166}, {25,50}, {3,180}, {40,97}, {4,131}, {40,100}, {4,134}, {40,99}, {4,133}, {4,132}, {7,4}, {40,98}, {40,184}, {40,188}, {40,190}, {41,0}, {5,133}, {5,134}, {40,187}, {5,129}, {40,185}, {40,189}, {5,130}, {5,125}, {5,126}, {5,132}, {40,186}, {5,124}, {7,5}, {5,127}, {5,128}, {5,131}, {42,27}, {42,25}, {42,12}, {7,17}, {42,19}, {7,12}, {42,13}, {42,21}, {42,18}, {7,15}, {42,17}, {7,22}, {42,26}, {7,24}, {7,26}, {42,11}, {7,13}, {42,28}, {7,20}, {7,23}, {44,5}, {7,7}, {7,30}, {7,21}, {42,14}, {7,10}, {7,25}, {42,22}, {7,8}, {7,9}, {44,3}, {42,15}, {7,16}, {7,27}, {42,29}, {42,16}, {7,14}, {7,19}, {43,174}, {7,28}, {42,23}, {7,18}, {7,29}, {7,6}, {42,20}, {7,11}, {42,24}, {44,4}, {9,42}, {9,58}, {43,181}, {9,49}, {44,11}, {9,34}, {9,37}, {44,2}, {43,179}, {43,183}, {9,45}, {9,47}, {43,186}, {9,54}, {9,40}, {9,38}, {9,39}, {9,53}, {44,7}, {9,48}, {43,185}, {43,187}, {9,46}, {9,51}, {43,188}, {44,10}, {11,53}, {9,57}, {9,35}, {44,9}, {44,13}, {43,184}, {44,15}, {44,0}, {9,44}, {43,180}, {9,43}, {9,61}, {9,50}, {43,178}, {46,53}, {9,56}, {9,60}, {44,1}, {44,6}, {9,62}, {9,55}, {9,41}, {9,31}, {9,36}, {43,182}, {9,32}, {44,14}, {43,176}, {43,175}, {43,189}, {43,177}, {9,59}, {13,181}, {9,52}, {43,190}, {9,33}, {11,102}, {44,12}, {46,60}, {46,97}, {46,100}, {46,55}, {46,103}, {46,106}, {46,108}, {46,52}, {11,54}, {11,59}, {49,9}, {11,109}, {46,101}, {46,109}, {46,59}, {46,51}, {49,36}, {11,62}, {46,98}, {46,56}, {46,58}, {11,101}, {46,61}, {11,61}, {46,48}, {46,104}, {46,107}, {11,58}, {11,104}, {46,45}, {11,106}, {11,56}, {11,110}, {46,105}, {46,47}, {11,107}, {49,30}, {44,8}, {11,60}, {11,55}, {46,54}, {46,46}, {11,108}, {11,100}, {46,99}, {11,105}, {11,103}, {46,57}, {11,97}, {46,49}, {11,98}, {11,99}, {46,50}, {46,102}, {11,57}, {46,62}, {49,12}, {13,189}, {14,3}, {49,21}, {49,27}, {49,23}, {49,10}, {49,13}, {49,6}, {49,7}, {14,10}, {13,186}, {49,22}, {49,31}, {14,5}, {13,182}, {14,0}, {49,14}, {14,2}, {49,15}, {49,25}, {14,4}, {49,40}, {49,8}, {13,188}, {13,187}, {14,8}, {49,5}, {49,38}, {49,26}, {49,39}, {49,33}, {49,19}, {49,34}, {49,28}, {49,37}, {49,35}, {14,9}, {49,20}, {13,185}, {13,184}, {14,1}, {14,7}, {49,32}, {14,6}, {49,17}, {17,3}, {49,41}, {49,16}, {49,11}, {13,190}, {14,11}, {13,183}, {49,24}, {49,29}, {17,37}, {52,161}, {52,165}, {17,18}, {17,16}, {17,7}, {52,163}, {52,162}, {17,27}, {52,168}, {17,21}, {52,186}, {53,7}, {17,4}, {52,183}, {52,176}, {17,39}, {52,160}, {52,188}, {17,36}, {17,24}, {17,35}, {17,14}, {52,172}, {52,190}, {52,182}, {17,15}, {17,9}, {53,5}, {52,189}, {53,0}, {17,17}, {17,25}, {53,2}, {52,170}, {52,187}, {52,175}, {53,4}, {17,30}, {17,6}, {17,28}, {52,180}, {52,178}, {52,179}, {17,19}, {52,174}, {52,173}, {17,8}, {52,167}, {53,6}, {17,10}, {52,177}, {17,40}, {17,34}, {52,166}, {17,31}, {17,29}, {17,38}, {52,184}, {17,33}, {49,18}, {52,185}, {17,32}, {53,1}, {17,5}, {52,181}, {17,23}, {52,169}, {17,22}, {17,20}, {17,12}, {17,11}, {56,167}, {53,3}, {52,171}, {56,188}, {17,13}, {20,1}, {17,26}, {19,174}, {56,182}, {19,188}, {56,170}, {19,171}, {19,167}, {57,9}, {19,173}, {19,177}, {19,172}, {19,181}, {57,13}, {57,4}, {56,177}, {19,186}, {19,180}, {56,189}, {19,164}, {57,10}, {57,3}, {19,168}, {56,183}, {19,183}, {57,21}, {57,22}, {19,165}, {57,8}, {19,185}, {56,187}, {56,173}, {56,174}, {19,189}, {56,178}, {56,185}, {56,179}, {19,187}, {20,4}, {56,175}, {56,168}, {56,169}, {56,171}, {19,170}, {56,184}, {19,184}, {20,2}, {56,186}, {57,19}, {57,11}, {19,166}, {57,17}, {19,178}, {19,176}, {57,23}, {19,175}, {57,1}, {56,180}, {56,190}, {20,7}, {57,5}, {57,2}, {56,176}, {20,3}, {57,15}, {57,12}, {57,20}, {19,169}, {57,0}, {20,6}, {57,7}, {19,179}, {19,182}, {57,6}, {20,5}, {56,181}, {52,164}, {57,16}, {57,14}, {57,18}, {56,172}, {20,0}, {61,33}, {61,32}, {61,6}, {22,125}, {61,31}, {61,9}, {61,10}, {22,135}, {61,40}, {22,130}, {61,30}, {61,3}, {22,136}, {22,126}, {61,18}, {61,8}, {61,11}, {61,35}, {22,120}, {61,42}, {61,34}, {22,129}, {61,23}, {22,140}, {22,139}, {22,133}, {61,41}, {22,121}, {61,21}, {61,12}, {61,25}, {61,37}, {22,141}, {22,123}, {61,20}, {61,13}, {22,132}, {22,131}, {61,16}, {61,26}, {61,36}, {61,7}, {61,17}, {22,124}, {61,27}, {22,137}, {22,128}, {61,14}, {22,127}, {61,5}, {61,19}, {61,39}, {19,190}, {25,112}, {61,22}, {65,44}, {61,24}, {61,38}, {22,134}, {61,15}, {22,122}, {22,138}, {27,176}, {61,4}, {61,29}, {61,28}, {65,106}, {25,109}, {65,61}, {65,100}, {25,98}, {65,46}, {25,111}, {25,55}, {65,45}, {65,112}, {25,113}, {65,49}, {65,99}, {65,51}, {65,115}, {65,111}, {25,53}, {25,97}, {69,19}, {25,110}, {25,61}, {65,47}, {65,110}, {25,99}, {65,107}, {65,120}, {65,53}, {65,62}, {65,118}, {65,108}, {25,60}, {65,60}, {25,54}, {25,52}, {25,104}, {65,58}, {65,55}, {65,56}, {65,114}, {65,119}, {65,117}, {25,58}, {65,121}, {25,62}, {25,103}, {65,48}, {68,186}, {65,57}, {25,56}, {25,108}, {25,105}, {25,59}, {65,101}, {65,52}, {25,106}, {65,103}, {25,100}, {25,102}, {25,51}, {65,105}, {65,97}, {65,50}, {25,101}, {65,113}, {65,116}, {65,59}, {65,104}, {25,57}, {27,159}, {65,102}, {68,185}, {65,109}, {65,54}, {69,4}, {69,14}, {27,162}, {69,13}, {69,25}, {27,164}, {69,11}, {69,15}, {27,175}, {69,6}, {27,167}, {69,18}, {72,176}, {27,179}, {27,178}, {69,20}, {69,3}, {69,30}, {27,173}, {27,163}, {69,23}, {69,27}, {69,32}, {69,21}, {69,9}, {27,166}, {27,169}, {27,177}, {27,172}, {69,12}, {65,98}, {69,8}, {69,31}, {27,168}, {27,171}, {69,33}, {27,160}, {69,22}, {68,187}, {69,28}, {31,159}, {69,10}, {27,161}, {69,5}, {27,165}, {68,188}, {25,107}, {69,1}, {69,26}, {69,2}, {69,0}, {27,170}, {69,24}, {68,190}, {69,17}, {69,16}, {69,29}, {69,7}, {27,174}, {72,179}, {30,9}, {29,190}, {73,0}, {72,171}, {30,1}, {72,183}, {30,8}, {30,3}, {72,181}, {76,15}, {72,187}, {73,2}, {72,186}, {72,169}, {72,184}, {73,4}, {73,6}, {29,189}, {73,5}, {30,4}, {30,10}, {30,7}, {72,190}, {30,6}, {72,185}, {72,173}, {72,178}, {72,189}, {30,5}, {30,2}, {29,188}, {30,0}, {72,177}, {68,189}, {72,172}, {72,175}, {73,1}, {72,180}, {72,170}, {76,14}, {73,3}, {72,174}, {72,188}, {76,17}, {31,163}, {31,151}, {31,155}, {76,19}, {76,25}, {76,23}, {31,153}, {31,154}, {31,161}, {76,26}, {76,18}, {31,156}, {76,22}, {76,21}, {76,27}, {31,162}, {31,157}, {31,160}, {76,20}, {31,164}, {31,158}, {31,165}, {31,152}, {76,24}, {76,16}, {78,183}, {33,49}, {78,180}, {78,182}, {33,47}, {78,178}, {78,179}, {78,174}, {72,182}, {78,175}, {33,48}, {78,171}, {33,45}, {78,184}, {33,46}, {78,172}, {78,173}, {78,177}, {33,51}, {33,50}, {78,176}, {34,56}, {81,31}, {81,37}, {34,57}, {81,28}, {34,54}, {34,51}, {81,39}, {34,55}, {34,52}, {81,30}, {81,33}, {81,34}, {81,35}, {81,38}, {78,181}, {81,29}, {34,53}, {81,36}, {81,40}, {81,32}, {83,29}, {35,42}, {83,32}, {35,43}, {83,40}, {83,31}, {83,28}, {83,30}, {83,34}, {83,37}, {83,36}, {83,39}, {83,27}, {35,41}, {83,35}, {83,38}, {83,41}, {83,33}, {84,147}, {84,148}, {84,152}, {84,153}, {84,150}, {84,151}, {84,149}, {35,169}, {36,56}, {85,171}, {85,168}, {85,169}, {85,170}, {36,57}, {86,165}, {86,164}, {87,111}, {36,180}, {87,109}, {87,112}, {87,110}, {87,181}, {37,23}, {37,37}, {88,99}, {88,44}, {88,98}, {88,144}, {88,145}, {3,181}, {5,135}, {41,1}, {42,30}, {7,31}, {7,34}, {42,31}, {7,32}, {7,33}, {44,24}, {44,26}, {44,21}, {44,18}, {44,20}, {9,100}, {9,98}, {44,22}, {9,99}, {44,19}, {44,16}, {9,97}, {44,23}, {44,17}, {9,101}, {44,25}, {46,111}, {46,115}, {11,119}, {46,118}, {11,111}, {11,114}, {11,116}, {11,118}, {11,115}, {46,114}, {46,113}, {11,113}, {46,116}, {46,117}, {46,110}, {11,117}, {11,112}, {46,112}, {49,55}, {49,56}, {49,57}, {14,16}, {14,12}, {49,46}, {49,54}, {49,59}, {14,17}, {49,44}, {49,50}, {49,43}, {49,53}, {49,49}, {14,13}, {14,15}, {49,58}, {49,42}, {49,45}, {49,51}, {49,52}, {49,60}, {49,48}, {14,14}, {17,45}, {53,14}, {53,16}, {53,12}, {53,24}, {53,10}, {53,23}, {17,41}, {53,8}, {57,27}, {53,18}, {17,44}, {53,19}, {53,22}, {53,26}, {53,15}, {53,20}, {17,42}, {17,43}, {53,25}, {53,13}, {53,9}, {53,27}, {53,17}, {53,21}, {53,11}, {20,8}, {20,9}, {57,37}, {20,15}, {57,25}, {57,34}, {57,24}, {20,12}, {57,32}, {57,30}, {57,31}, {20,10}, {57,35}, {57,28}, {57,26}, {20,11}, {57,29}, {57,33}, {20,13}, {57,36}, {61,48}, {61,55}, {61,57}, {61,97}, {22,154}, {61,43}, {22,146}, {61,58}, {22,151}, {61,98}, {22,142}, {61,61}, {61,45}, {61,62}, {61,44}, {22,156}, {61,56}, {22,143}, {61,99}, {22,148}, {61,49}, {22,153}, {61,60}, {61,47}, {61,54}, {61,50}, {61,46}, {22,145}, {22,152}, {22,150}, {22,147}, {22,155}, {22,144}, {61,53}, {22,149}, {20,14}, {61,59}, {61,51}, {61,52}, {65,129}, {25,116}, {65,125}, {65,131}, {65,127}, {25,118}, {65,126}, {65,130}, {65,122}, {65,124}, {25,117}, {65,128}, {65,123}, {25,119}, {25,114}, {65,132}, {25,115}, {69,39}, {69,36}, {69,48}, {69,42}, {69,44}, {27,180}, {69,38}, {69,46}, {69,45}, {69,43}, {69,49}, {27,183}, {69,40}, {69,47}, {27,181}, {69,35}, {69,37}, {27,182}, {69,34}, {69,50}, {69,41}, {73,10}, {30,17}, {73,21}, {73,19}, {30,11}, {73,9}, {73,12}, {73,13}, {73,8}, {30,21}, {30,22}, {73,7}, {73,22}, {73,17}, {30,15}, {30,12}, {73,16}, {73,14}, {30,18}, {73,18}, {30,13}, {30,14}, {73,15}, {30,16}, {73,11}, {73,20}, {30,19}, {73,23}, {73,24}, {30,20}, {31,167}, {31,174}, {76,28}, {76,34}, {76,32}, {31,170}, {31,169}, {31,166}, {76,30}, {31,172}, {31,171}, {31,168}, {76,33}, {76,29}, {76,31}, {31,173}, {33,55}, {78,187}, {33,52}, {33,53}, {78,189}, {33,54}, {78,186}, {78,185}, {81,44}, {78,188}, {81,45}, {34,58}, {81,43}, {81,42}, {81,41}, {34,59}, {35,44}, {83,42}, {83,43}, {84,156}, {84,155}, {35,170}, {84,154}, {85,172}, {85,173}, {86,166}, {87,113}, {87,182}, {88,124}, {37,57}, {88,134}, {3,182}, {9,102}, {9,103}, {11,120}, {31,175}, {3,183}, {9,104}, {14,18}, {22,157}, {3,184}, {17,46}, {25,120}, {40,34}, {46,119}, {49,61}, {65,133}, {31,176}, {3,185}, {9,105}, {46,120}, {46,121}, {57,38}, {20,16}, {61,100}, {22,158}, {65,134}, {27,184}, {34,60}, {3,186}, {57,39}, {3,187}, {5,137}, {41,2}, {5,136}, {7,37}, {7,36}, {7,35}, {42,32}, {9,106}, {9,107}, {44,27}, {46,122}, {46,125}, {11,122}, {46,123}, {11,121}, {46,124}, {11,123}, {49,98}, {49,97}, {49,62}, {14,19}, {53,29}, {53,30}, {17,47}, {53,28}, {53,31}, {20,18}, {17,48}, {20,17}, {57,43}, {57,42}, {57,40}, {57,41}, {57,44}, {61,102}, {61,101}, {61,105}, {61,104}, {61,103}, {25,121}, {65,137}, {65,136}, {25,122}, {65,135}, {69,51}, {69,52}, {27,185}, {73,25}, {73,26}, {81,50}, {34,61}, {81,49}, {81,48}, {81,46}, {81,47}, {35,171}, {83,44}, {85,174}, {87,183}, {3,188}, {40,101}, {4,135}, {40,102}, {41,3}, {41,4}, {42,38}, {42,34}, {42,33}, {9,108}, {42,37}, {7,39}, {42,35}, {7,38}, {42,39}, {42,36}, {44,31}, {46,126}, {44,29}, {44,36}, {9,109}, {9,112}, {44,37}, {44,33}, {44,34}, {44,28}, {9,111}, {44,30}, {9,110}, {44,35}, {44,32}, {46,130}, {11,125}, {11,126}, {46,133}, {46,127}, {46,132}, {46,128}, {11,124}, {46,131}, {46,129}, {49,104}, {49,101}, {49,103}, {14,24}, {14,23}, {14,21}, {49,100}, {49,105}, {14,20}, {14,22}, {49,102}, {53,39}, {49,99}, {49,106}, {53,34}, {53,38}, {53,37}, {57,46}, {57,57}, {53,40}, {53,35}, {57,45}, {17,52}, {17,51}, {53,33}, {53,36}, {17,53}, {17,50}, {17,49}, {53,32}, {53,41}, {57,48}, {57,55}, {20,20}, {57,54}, {57,51}, {20,22}, {57,53}, {57,47}, {57,49}, {57,52}, {57,50}, {20,21}, {57,56}, {20,19}, {22,159}, {61,109}, {61,108}, {61,106}, {22,162}, {22,161}, {61,110}, {61,107}, {65,138}, {25,123}, {22,160}, {61,112}, {61,111}, {65,141}, {65,139}, {27,186}, {25,124}, {65,140}, {69,54}, {27,187}, {69,53}, {69,62}, {69,61}, {69,59}, {69,58}, {69,55}, {69,56}, {69,57}, {69,60}, {69,97}, {73,31}, {73,28}, {73,29}, {30,23}, {73,27}, {73,33}, {73,32}, {73,30}, {76,36}, {76,37}, {31,177}, {31,178}, {76,35}, {33,57}, {78,190}, {33,56}, {34,62}, {34,97}, {35,45}, {83,46}, {83,45}, {84,157}, {85,175}, {36,58}, {86,168}, {86,167}, {86,169}, {4,136}, {46,134}, {14,25}, {17,54}, {53,42}, {4,137}, {40,103}, {3,189}, {41,5}, {42,44}, {42,42}, {42,43}, {42,40}, {7,40}, {42,41}, {44,45}, {9,115}, {44,43}, {44,39}, {44,42}, {44,38}, {9,117}, {44,41}, {9,114}, {9,113}, {9,116}, {44,44}, {44,40}, {11,130}, {11,133}, {46,142}, {46,141}, {46,140}, {11,127}, {46,149}, {46,139}, {11,129}, {49,111}, {46,146}, {46,144}, {11,132}, {46,136}, {46,147}, {46,138}, {46,148}, {46,145}, {46,137}, {11,128}, {46,150}, {46,135}, {11,131}, {49,116}, {49,107}, {49,118}, {49,110}, {49,121}, {49,122}, {49,108}, {49,120}, {49,117}, {49,115}, {49,119}, {14,31}, {14,29}, {49,113}, {49,109}, {49,112}, {49,123}, {49,114}, {14,30}, {46,143}, {14,26}, {14,28}, {53,56}, {53,45}, {53,43}, {53,44}, {53,51}, {53,52}, {53,48}, {17,59}, {53,53}, {53,50}, {53,47}, {17,57}, {53,46}, {17,55}, {17,58}, {53,49}, {53,57}, {14,27}, {17,56}, {53,55}, {53,54}, {17,60}, {57,62}, {57,97}, {20,32}, {57,103}, {57,105}, {57,98}, {20,26}, {57,102}, {57,101}, {20,27}, {20,33}, {20,34}, {57,104}, {20,24}, {57,61}, {57,59}, {57,99}, {57,58}, {20,31}, {57,60}, {57,100}, {57,106}, {20,25}, {20,30}, {20,28}, {20,29}, {20,23}, {22,169}, {61,119}, {22,168}, {61,123}, {61,113}, {61,124}, {61,114}, {61,115}, {61,125}, {61,122}, {61,120}, {61,121}, {61,117}, {61,116}, {61,126}, {22,165}, {61,118}, {22,170}, {22,164}, {22,171}, {22,172}, {22,167}, {22,166}, {65,142}, {25,126}, {25,125}, {65,147}, {27,188}, {25,127}, {25,129}, {65,148}, {22,163}, {25,128}, {65,144}, {65,146}, {65,143}, {65,145}, {69,107}, {69,106}, {69,103}, {28,0}, {73,34}, {28,1}, {69,102}, {27,190}, {69,104}, {69,101}, {69,98}, {69,105}, {69,99}, {69,100}, {27,189}, {76,41}, {73,38}, {73,37}, {73,39}, {76,38}, {30,26}, {73,35}, {30,24}, {30,28}, {30,27}, {73,36}, {73,40}, {30,25}, {76,45}, {31,181}, {33,58}, {31,182}, {31,179}, {76,42}, {76,40}, {76,43}, {76,46}, {31,180}, {76,44}, {76,39}, {79,2}, {79,5}, {81,53}, {79,0}, {83,47}, {79,6}, {34,98}, {79,4}, {33,59}, {79,1}, {79,3}, {79,7}, {81,54}, {81,52}, {34,99}, {81,51}, {35,46}, {35,173}, {85,177}, {35,172}, {85,179}, {85,176}, {85,178}, {36,144}, {87,114}, {4,138}, {44,46}, {49,124}, {49,125}, {17,61}, {61,127}, {30,29}, {34,100}, {36,59}, {87,115}, {4,139}, {44,47}, {1,32}, {46,151}, {46,152}, {49,126}, {49,127}, {17,62}, {17,97}, {57,107}, {61,130}, {61,129}, {61,128}, {65,149}, {65,150}, {65,151}, {25,130}, {69,109}, {69,108}, {73,41}, {30,30}, {30,31}, {76,50}, {76,47}, {76,48}, {76,49}, {79,9}, {79,8}, {33,60}, {81,55}, {84,158}, {4,140}, {11,134}, {17,98}, {61,131}, {4,141}, {49,128}, {17,99}, {20,35}, {20,36}, {4,142}, {4,143}, {41,6}, {7,42}, {7,41}, {11,135}, {46,153}, {57,108}, {4,144}, {4,145}, {4,146}, {4,147}, {7,43}, {7,44}, {42,46}, {42,45}, {9,118}, {44,50}, {44,48}, {44,49}, {46,154}, {46,155}, {11,139}, {11,137}, {11,138}, {11,136}, {14,32}, {14,36}, {14,35}, {49,129}, {14,34}, {14,33}, {49,130}, {17,102}, {53,59}, {53,58}, {17,100}, {17,101}, {20,38}, {20,37}, {57,110}, {57,109}, {17,103}, {22,173}, {61,133}, {22,174}, {61,132}, {65,152}, {69,110}, {28,2}, {73,42}, {76,51}, {34,102}, {34,101}, {36,60}, {4,148}, {44,51}, {17,104}, {65,153}, {25,131}, {42,47}, {42,48}, {44,52}, {9,120}, {9,121}, {9,119}, {11,143}, {11,144}, {11,141}, {11,142}, {46,156}, {46,157}, {11,140}, {49,131}, {14,40}, {14,41}, {17,107}, {49,137}, {14,46}, {14,44}, {49,138}, {49,133}, {14,43}, {14,42}, {14,37}, {49,136}, {49,135}, {49,132}, {14,45}, {49,134}, {14,38}, {14,39}, {17,108}, {53,97}, {53,98}, {17,109}, {53,60}, {53,62}, {53,100}, {53,99}, {53,61}, {17,105}, {17,106}, {57,118}, {20,43}, {20,42}, {57,112}, {20,40}, {57,115}, {20,44}, {57,116}, {20,45}, {57,113}, {20,39}, {20,41}, {57,117}, {57,114}, {57,111}, {61,146}, {61,135}, {22,176}, {22,179}, {22,178}, {22,183}, {22,182}, {61,147}, {61,145}, {61,138}, {61,142}, {61,141}, {22,180}, {61,144}, {61,140}, {61,148}, {61,139}, {22,181}, {22,175}, {22,177}, {61,137}, {65,155}, {25,135}, {65,159}, {25,134}, {65,156}, {25,133}, {61,136}, {61,143}, {65,158}, {25,136}, {65,160}, {65,157}, {65,154}, {69,113}, {69,117}, {69,119}, {69,115}, {69,114}, {69,112}, {28,5}, {28,3}, {28,8}, {28,9}, {69,116}, {28,6}, {69,111}, {28,7}, {25,132}, {69,118}, {28,4}, {73,44}, {73,43}, {73,51}, {73,45}, {73,50}, {73,47}, {30,32}, {73,49}, {30,33}, {30,34}, {73,48}, {73,46}, {31,184}, {76,52}, {31,183}, {76,55}, {76,53}, {76,54}, {31,185}, {79,13}, {33,97}, {79,14}, {33,61}, {79,15}, {33,62}, {79,12}, {79,16}, {79,10}, {34,103}, {81,56}, {34,104}, {35,47}, {79,11}, {35,48}, {35,174}, {84,159}, {36,62}, {85,180}, {36,61}, {86,170}, {36,181}, {36,182}, {88,140}, {11,145}, {46,158}, {20,46}, {20,47}, {4,149}, {5,138}, {41,7}, {42,49}, {7,45}, {9,122}, {11,146}, {11,147}, {11,148}, {53,102}, {49,139}, {14,47}, {17,110}, {53,101}, {57,120}, {20,49}, {57,119}, {20,48}, {61,149}, {28,10}, {69,123}, {69,120}, {69,121}, {69,122}, {76,56}, {79,17}, {83,49}, {83,48}, {85,181}, {4,150}, {44,53}, {14,48}, {20,50}, {61,150}, {65,161}, {28,11}, {73,52}, {79,18}, {83,50}, {4,151}, {9,123}, {11,151}, {46,159}, {11,152}, {11,150}, {11,149}, {49,140}, {14,49}, {14,50}, {14,51}, {17,112}, {53,103}, {17,111}, {57,121}, {17,113}, {20,51}, {61,151}, {22,184}, {22,185}, {25,137}, {25,138}, {28,12}, {30,36}, {73,53}, {30,35}, {76,57}, {31,186}, {79,19}, {83,51}, {4,152}, {7,46}, {44,56}, {44,55}, {9,124}, {44,54}, {9,125}, {44,57}, {46,165}, {11,155}, {11,154}, {46,167}, {46,166}, {11,159}, {11,158}, {11,153}, {46,161}, {46,162}, {46,163}, {11,160}, {46,160}, {11,156}, {46,164}, {11,157}, {49,143}, {49,147}, {49,145}, {49,144}, {49,148}, {49,149}, {49,150}, {49,142}, {49,141}, {14,53}, {14,54}, {49,151}, {49,146}, {53,112}, {49,152}, {14,55}, {14,52}, {53,106}, {53,105}, {53,107}, {53,108}, {53,110}, {53,109}, {53,114}, {17,117}, {17,114}, {17,118}, {53,104}, {17,119}, {53,113}, {17,116}, {53,111}, {17,115}, {57,124}, {57,126}, {57,122}, {57,123}, {57,127}, {57,129}, {57,130}, {57,125}, {57,128}, {20,52}, {61,155}, {61,160}, {61,152}, {61,156}, {61,161}, {61,157}, {22,186}, {23,3}, {22,189}, {61,153}, {61,154}, {25,142}, {23,6}, {22,190}, {23,4}, {22,188}, {61,159}, {23,5}, {61,158}, {23,1}, {22,187}, {23,2}, {61,162}, {65,166}, {65,168}, {23,0}, {65,163}, {25,140}, {65,169}, {25,141}, {65,167}, {65,162}, {65,165}, {65,170}, {25,139}, {65,164}, {28,14}, {69,127}, {69,126}, {28,17}, {28,15}, {69,124}, {28,13}, {69,125}, {28,16}, {73,61}, {73,97}, {73,62}, {73,54}, {73,58}, {73,57}, {73,55}, {30,38}, {30,39}, {30,37}, {73,56}, {73,59}, {73,60}, {30,40}, {32,0}, {76,99}, {31,188}, {76,59}, {31,190}, {32,1}, {31,189}, {76,98}, {76,60}, {31,187}, {76,97}, {76,58}, {76,62}, {76,61}, {79,21}, {33,100}, {33,101}, {33,98}, {33,99}, {79,20}, {81,59}, {34,105}, {81,57}, {81,58}, {83,52}, {83,55}, {83,53}, {83,54}, {84,160}, {35,175}, {86,171}, {87,116}, {36,183}, {87,184}, {87,185}, {37,38}, {4,153}, {11,161}, {57,131}, {61,163}, {4,154}, {7,47}, {9,126}, {46,168}, {46,169}, {14,56}, {57,132}, {20,53}, {23,7}, {32,2}, {76,100}, {81,60}, {83,56}, {4,155}, {44,97}, {44,58}, {44,60}, {44,62}, {44,61}, {44,59}, {9,127}, {11,162}, {46,178}, {46,173}, {46,170}, {46,177}, {11,164}, {11,165}, {46,176}, {46,175}, {46,174}, {46,171}, {46,172}, {46,179}, {11,163}, {14,60}, {14,100}, {14,99}, {49,161}, {49,155}, {49,153}, {14,97}, {53,121}, {14,58}, {49,158}, {49,162}, {49,164}, {49,160}, {49,154}, {14,98}, {49,159}, {49,157}, {14,57}, {49,165}, {14,101}, {49,163}, {14,61}, {49,156}, {14,62}, {14,59}, {17,121}, {53,122}, {53,115}, {53,117}, {53,119}, {53,120}, {53,118}, {17,122}, {53,123}, {53,116}, {57,136}, {20,54}, {57,144}, {57,133}, {57,145}, {57,134}, {57,135}, {57,143}, {57,142}, {57,139}, {17,120}, {20,55}, {57,137}, {57,140}, {20,56}, {57,141}, {57,138}, {61,174}, {61,178}, {23,14}, {65,176}, {23,17}, {61,176}, {61,173}, {61,168}, {61,170}, {61,171}, {61,164}, {23,13}, {23,12}, {23,8}, {61,167}, {23,15}, {23,16}, {61,166}, {61,169}, {61,177}, {23,10}, {23,11}, {61,175}, {61,165}, {65,178}, {25,144}, {65,180}, {61,172}, {65,182}, {25,148}, {65,183}, {65,179}, {25,145}, {65,175}, {25,147}, {65,172}, {65,177}, {65,181}, {65,174}, {23,9}, {65,171}, {25,146}, {65,173}, {28,20}, {69,129}, {28,24}, {28,22}, {25,143}, {69,136}, {69,137}, {28,19}, {69,135}, {69,138}, {28,21}, {28,18}, {69,131}, {69,128}, {69,133}, {69,130}, {28,25}, {69,132}, {69,134}, {28,23}, {30,42}, {73,104}, {73,98}, {73,102}, {73,108}, {73,109}, {73,105}, {73,106}, {73,103}, {73,100}, {30,44}, {30,41}, {73,99}, {73,101}, {30,43}, {73,107}, {32,6}, {76,106}, {76,101}, {32,5}, {32,3}, {76,108}, {32,4}, {76,104}, {76,105}, {76,102}, {76,109}, {79,22}, {32,7}, {76,103}, {76,110}, {76,107}, {79,26}, {79,23}, {33,102}, {79,27}, {79,29}, {79,28}, {79,24}, {79,25}, {81,99}, {34,106}, {81,62}, {81,98}, {81,61}, {81,100}, {81,97}, {83,58}, {83,61}, {83,57}, {35,49}, {83,59}, {83,60}, {83,62}, {35,50}, {35,52}, {35,51}, {84,161}, {84,163}, {84,162}, {85,182}, {87,117}, {87,186}, {4,156}, {42,50}, {9,128}, {44,99}, {9,129}, {9,130}, {44,98}, {46,184}, {46,183}, {11,166}, {11,169}, {11,168}, {11,167}, {46,180}, {46,182}, {46,181}, {49,168}, {14,103}, {49,172}, {49,171}, {49,170}, {49,166}, {14,102}, {14,106}, {14,109}, {14,110}, {49,167}, {49,169}, {14,108}, {14,107}, {14,105}, {14,104}, {53,130}, {53,128}, {53,124}, {17,123}, {53,125}, {17,124}, {53,126}, {53,127}, {53,129}, {17,125}, {57,149}, {57,148}, {57,147}, {57,146}, {61,182}, {23,18}, {61,179}, {61,181}, {23,19}, {23,20}, {61,180}, {66,1}, {65,185}, {65,186}, {25,151}, {25,149}, {25,150}, {66,3}, {66,2}, {65,190}, {65,189}, {65,188}, {65,187}, {66,0}, {65,184}, {69,139}, {69,144}, {69,142}, {69,141}, {69,140}, {69,143}, {73,110}, {30,45}, {32,8}, {76,112}, {32,9}, {76,111}, {79,31}, {79,30}, {33,103}, {81,101}, {34,107}, {83,97}, {36,97}, {85,183}, {87,119}, {87,118}, {40,104}, {11,170}, {11,171}, {53,131}, {23,22}, {4,157}, {7,50}, {7,49}, {7,48}, {44,100}, {9,132}, {9,131}, {11,174}, {46,186}, {46,189}, {46,187}, {11,172}, {11,173}, {46,185}, {46,188}, {14,117}, {49,179}, {49,181}, {49,180}, {14,114}, {49,175}, {14,112}, {14,111}, {14,115}, {14,113}, {14,116}, {49,178}, {49,173}, {49,174}, {49,177}, {49,176}, {53,134}, {53,135}, {53,133}, {53,132}, {17,126}, {20,61}, {57,150}, {57,152}, {57,154}, {20,60}, {20,58}, {57,151}, {20,59}, {57,153}, {20,57}, {62,1}, {61,183}, {61,186}, {61,190}, {23,26}, {61,188}, {61,187}, {61,184}, {61,185}, {23,24}, {62,0}, {23,23}, {23,28}, {23,27}, {23,25}, {61,189}, {66,9}, {66,8}, {66,4}, {25,152}, {66,7}, {66,6}, {25,153}, {28,30}, {69,146}, {28,31}, {28,27}, {28,29}, {28,26}, {28,28}, {73,111}, {30,48}, {73,113}, {73,112}, {66,5}, {30,50}, {30,49}, {30,46}, {30,47}, {76,117}, {76,115}, {32,10}, {76,116}, {76,118}, {76,114}, {76,113}, {79,32}, {33,106}, {33,104}, {33,105}, {81,102}, {81,103}, {34,109}, {34,108}, {83,99}, {83,100}, {83,98}, {85,184}, {85,185}, {4,158}, {41,8}, {7,51}, {44,101}, {9,134}, {9,133}, {44,102}, {47,0}, {11,175}, {46,190}, {11,176}, {14,118}, {49,184}, {49,182}, {49,188}, {14,119}, {49,183}, {49,187}, {49,185}, {49,186}, {53,136}, {53,138}, {17,127}, {53,137}, {17,128}, {20,98}, {20,97}, {20,62}, {57,155}, {62,4}, {23,29}, {23,30}, {62,3}, {62,2}, {66,10}, {25,155}, {25,154}, {66,11}, {66,12}, {28,33}, {28,32}, {73,117}, {69,147}, {69,149}, {69,148}, {73,116}, {73,114}, {73,118}, {73,115}, {30,51}, {76,119}, {32,11}, {76,120}, {76,121}, {33,107}, {33,108}, {35,53}, {36,145}, {4,159}, {47,1}, {49,189}, {14,120}, {18,122}, {18,121}, {20,100}, {57,157}, {20,99}, {57,156}, {62,5}, {25,156}, {66,13}, {25,157}, {35,54}, {83,101}, {5,139}, {9,135}, {44,103}, {11,178}, {11,177}, {47,2}, {47,3}, {50,0}, {50,2}, {14,121}, {50,4}, {50,7}, {50,5}, {50,6}, {50,3}, {49,190}, {14,122}, {50,8}, {50,1}, {53,147}, {17,134}, {53,156}, {17,131}, {53,149}, {17,135}, {17,129}, {53,144}, {53,157}, {53,145}, {53,142}, {17,133}, {17,130}, {53,148}, {53,151}, {17,132}, {53,152}, {17,136}, {53,153}, {53,143}, {53,150}, {53,154}, {53,146}, {53,141}, {53,139}, {53,155}, {57,159}, {57,164}, {57,160}, {57,166}, {20,103}, {53,140}, {57,161}, {20,101}, {57,158}, {20,108}, {57,162}, {20,107}, {57,163}, {20,109}, {20,104}, {20,110}, {20,105}, {20,106}, {20,102}, {57,165}, {23,33}, {62,16}, {62,19}, {62,7}, {62,12}, {62,6}, {23,35}, {62,10}, {62,8}, {23,34}, {62,15}, {62,14}, {62,11}, {62,13}, {62,9}, {25,161}, {62,18}, {23,31}, {62,17}, {66,29}, {25,168}, {66,24}, {25,167}, {66,14}, {66,16}, {25,160}, {66,21}, {66,20}, {66,23}, {25,165}, {66,18}, {66,17}, {25,164}, {25,159}, {66,19}, {25,162}, {66,25}, {66,27}, {66,22}, {66,15}, {25,163}, {28,41}, {25,158}, {66,28}, {69,153}, {28,34}, {69,155}, {28,35}, {28,37}, {69,158}, {69,150}, {25,166}, {69,156}, {69,152}, {23,32}, {28,40}, {28,36}, {28,38}, {28,39}, {30,54}, {69,157}, {69,151}, {28,42}, {69,154}, {73,128}, {73,123}, {73,133}, {30,52}, {73,125}, {30,56}, {73,131}, {73,122}, {73,119}, {73,134}, {32,17}, {30,57}, {73,130}, {73,120}, {30,55}, {73,124}, {30,59}, {73,121}, {73,126}, {30,58}, {73,129}, {73,132}, {76,139}, {76,140}, {76,124}, {76,131}, {76,129}, {32,15}, {76,136}, {73,127}, {76,127}, {76,137}, {32,14}, {76,126}, {76,125}, {76,135}, {76,132}, {76,134}, {76,122}, {76,138}, {32,12}, {76,133}, {76,142}, {76,130}, {32,16}, {32,13}, {76,128}, {76,123}, {76,141}, {30,53}, {79,35}, {79,33}, {79,39}, {33,112}, {79,37}, {79,36}, {33,114}, {79,42}, {33,113}, {79,43}, {79,40}, {33,110}, {79,41}, {79,34}, {33,111}, {33,109}, {81,107}, {79,38}, {79,44}, {81,104}, {34,114}, {34,112}, {81,106}, {81,108}, {81,105}, {34,113}, {34,110}, {34,111}, {34,115}, {35,56}, {83,106}, {83,105}, {83,103}, {83,102}, {83,104}, {35,55}, {35,57}, {35,176}, {84,165}, {84,164}, {85,186}, {85,188}, {85,190}, {85,189}, {85,187}, {36,99}, {36,98}, {36,147}, {36,146}, {36,148}, {86,173}, {86,172}, {87,187}, {87,120}, {87,188}, {37,24}, {37,25}, {88,45}, {37,62}, {5,140}, {44,104}, {47,5}, {47,6}, {47,4}, {11,179}, {47,7}, {47,8}, {47,9}, {50,9}, {50,15}, {50,13}, {14,123}, {50,11}, {50,12}, {50,14}, {50,10}, {17,137}, {53,158}, {17,139}, {53,160}, {17,138}, {53,159}, {57,168}, {20,111}, {57,170}, {57,167}, {53,161}, {20,112}, {57,169}, {62,22}, {23,36}, {62,20}, {23,37}, {62,21}, {23,38}, {25,169}, {66,33}, {66,30}, {66,32}, {25,170}, {25,171}, {66,31}, {69,159}, {69,160}, {28,43}, {69,162}, {69,161}, {1,33}, {73,138}, {73,139}, {73,135}, {73,136}, {30,60}, {30,61}, {73,137}, {32,23}, {32,19}, {32,24}, {32,20}, {32,22}, {32,18}, {32,21}, {33,115}, {76,143}, {81,110}, {81,109}, {83,107}, {35,58}, {35,59}, {86,1}, {84,166}, {86,0}, {87,189}, {88,100}, {5,141}, {7,52}, {44,105}, {9,136}, {11,182}, {47,12}, {11,180}, {47,10}, {11,185}, {11,181}, {11,186}, {11,184}, {47,11}, {11,183}, {14,127}, {14,126}, {50,26}, {14,135}, {50,19}, {50,25}, {14,131}, {50,18}, {50,24}, {50,22}, {14,130}, {14,132}, {50,21}, {14,125}, {50,20}, {14,136}, {14,133}, {14,137}, {14,134}, {50,17}, {50,16}, {50,23}, {14,128}, {14,124}, {14,129}, {53,176}, {53,169}, {20,117}, {53,168}, {17,143}, {17,150}, {17,147}, {17,153}, {17,152}, {17,148}, {53,162}, {53,165}, {53,164}, {17,144}, {53,166}, {53,175}, {17,145}, {53,163}, {53,172}, {53,173}, {17,146}, {53,170}, {17,151}, {17,141}, {17,149}, {53,167}, {17,140}, {53,171}, {53,174}, {57,187}, {57,178}, {20,114}, {57,185}, {57,182}, {57,174}, {57,183}, {20,116}, {57,175}, {57,171}, {23,44}, {57,180}, {20,113}, {57,186}, {20,120}, {20,122}, {57,173}, {20,121}, {57,176}, {20,115}, {57,184}, {57,177}, {57,181}, {57,179}, {20,118}, {57,172}, {20,123}, {17,142}, {20,119}, {20,124}, {23,40}, {62,29}, {62,31}, {62,33}, {62,37}, {62,27}, {62,25}, {23,42}, {62,32}, {62,36}, {62,28}, {62,24}, {62,23}, {62,34}, {62,26}, {62,30}, {23,43}, {23,41}, {62,38}, {23,39}, {62,35}, {66,50}, {25,174}, {66,42}, {28,56}, {66,52}, {25,177}, {66,56}, {25,183}, {66,37}, {66,53}, {66,34}, {66,55}, {66,38}, {25,190}, {25,187}, {66,54}, {66,48}, {25,173}, {25,181}, {25,180}, {25,179}, {25,185}, {66,35}, {25,186}, {66,49}, {25,182}, {25,172}, {66,51}, {25,175}, {25,176}, {25,184}, {66,40}, {66,39}, {66,36}, {66,44}, {66,41}, {66,45}, {25,189}, {66,57}, {25,178}, {66,46}, {66,47}, {66,43}, {25,188}, {69,167}, {28,48}, {28,57}, {28,53}, {69,164}, {28,50}, {28,54}, {69,176}, {28,44}, {69,168}, {28,52}, {69,171}, {69,166}, {28,51}, {28,55}, {69,165}, {28,49}, {69,175}, {28,46}, {69,174}, {69,173}, {28,58}, {68,50}, {28,45}, {69,172}, {69,163}, {28,59}, {69,170}, {28,47}, {69,169}, {30,98}, {30,103}, {30,62}, {73,152}, {73,143}, {73,155}, {73,147}, {73,153}, {30,104}, {30,97}, {73,140}, {73,146}, {73,156}, {73,149}, {73,154}, {73,142}, {73,150}, {30,99}, {73,148}, {30,102}, {30,101}, {73,144}, {73,145}, {73,141}, {73,151}, {30,100}, {73,158}, {73,157}, {76,154}, {76,150}, {32,31}, {76,144}, {32,25}, {32,41}, {76,156}, {32,33}, {32,29}, {76,147}, {32,36}, {32,39}, {76,158}, {32,28}, {76,149}, {32,37}, {76,160}, {76,157}, {76,145}, {32,32}, {32,26}, {32,40}, {76,152}, {32,35}, {76,146}, {32,30}, {76,159}, {32,34}, {32,27}, {76,153}, {32,38}, {76,151}, {76,155}, {79,46}, {79,52}, {33,121}, {79,55}, {33,116}, {33,117}, {79,47}, {79,54}, {79,49}, {33,122}, {33,119}, {79,45}, {33,118}, {79,51}, {79,53}, {33,120}, {79,50}, {79,48}, {81,120}, {34,119}, {34,120}, {34,116}, {34,117}, {81,116}, {81,114}, {81,118}, {34,122}, {81,119}, {81,112}, {81,111}, {81,115}, {81,113}, {34,118}, {81,117}, {83,108}, {35,62}, {35,61}, {83,109}, {83,111}, {83,110}, {35,97}, {84,171}, {84,168}, {84,169}, {84,167}, {84,170}, {35,178}, {84,172}, {35,177}, {86,2}, {36,149}, {36,151}, {86,174}, {36,150}, {87,121}, {88,0}, {88,2}, {87,190}, {88,1}, {37,44}, {5,142}, {11,187}, {49,47}, {14,138}, {17,154}, {57,188}, {57,189}, {73,159}, {32,42}, {76,161}, {33,123}, {81,122}, {81,121}, {35,98}, {84,173}, {86,3}, {36,184}, {41,9}, {9,137}, {7,53}, {47,13}, {50,32}, {50,27}, {50,31}, {50,29}, {14,139}, {50,30}, {50,28}, {53,177}, {57,190}, {58,0}, {62,41}, {62,42}, {23,46}, {23,47}, {62,40}, {62,43}, {62,39}, {23,45}, {26,0}, {23,48}, {66,58}, {28,60}, {69,177}, {28,61}, {30,105}, {73,162}, {73,160}, {73,161}, {76,164}, {76,163}, {76,162}, {81,123}, {34,121}, {81,124}, {86,4}, {36,185}, {87,122}, {5,143}, {9,139}, {9,138}, {47,15}, {11,188}, {47,14}, {50,34}, {14,140}, {53,178}, {50,33}, {17,156}, {53,181}, {53,179}, {53,180}, {17,155}, {58,2}, {58,3}, {58,1}, {23,51}, {62,45}, {62,44}, {62,46}, {23,50}, {23,49}, {69,178}, {69,180}, {28,62}, {69,179}, {73,163}, {30,106}, {79,57}, {79,56}, {34,123}, {81,125}, {34,125}, {34,124}, {83,112}, {84,174}, {35,179}, {5,144}, {47,16}, {11,189}, {50,37}, {14,142}, {50,36}, {50,35}, {14,141}, {53,187}, {53,189}, {53,182}, {53,183}, {17,157}, {53,184}, {17,158}, {53,188}, {53,185}, {53,186}, {17,159}, {20,126}, {20,127}, {58,4}, {62,47}, {62,48}, {66,62}, {26,3}, {26,1}, {26,2}, {66,59}, {66,60}, {66,61}, {69,185}, {69,186}, {28,97}, {69,183}, {69,182}, {69,184}, {69,181}, {30,109}, {73,164}, {30,107}, {30,108}, {76,166}, {32,43}, {76,165}, {78,104}, {79,58}, {79,59}, {33,124}, {33,125}, {32,44}, {81,126}, {81,127}, {83,113}, {35,99}, {5,145}, {5,146}, {11,190}, {9,140}, {14,143}, {47,17}, {20,128}, {5,147}, {12,1}, {47,18}, {47,19}, {12,0}, {12,2}, {5,148}, {47,20}, {14,145}, {50,38}, {14,147}, {14,144}, {14,146}, {54,1}, {17,160}, {54,0}, {53,190}, {62,49}, {66,97}, {28,98}, {30,110}, {73,166}, {73,165}, {76,167}, {84,175}, {5,149}, {42,51}, {44,106}, {12,3}, {47,21}, {50,40}, {14,148}, {50,39}, {14,149}, {54,3}, {17,162}, {54,2}, {54,4}, {17,161}, {58,6}, {58,7}, {58,5}, {20,129}, {23,52}, {23,53}, {26,5}, {66,99}, {66,98}, {26,4}, {69,187}, {69,188}, {73,167}, {32,48}, {32,47}, {32,45}, {32,46}, {32,49}, {79,60}, {33,127}, {33,126}, {81,128}, {83,114}, {36,101}, {36,100}, {5,150}, {48,187}, {23,55}, {20,130}, {23,54}, {26,6}, {5,151}, {40,105}, {5,152}, {5,153}, {44,107}, {42,54}, {42,55}, {7,55}, {42,52}, {7,54}, {7,57}, {42,53}, {7,59}, {7,58}, {42,56}, {7,56}, {9,145}, {9,143}, {44,109}, {9,142}, {9,147}, {9,149}, {9,146}, {44,112}, {44,108}, {9,150}, {9,144}, {7,60}, {9,148}, {44,111}, {44,110}, {9,141}, {47,27}, {12,7}, {12,8}, {47,29}, {47,23}, {47,26}, {47,35}, {47,33}, {12,9}, {47,39}, {12,12}, {47,36}, {47,28}, {47,25}, {58,9}, {47,34}, {12,4}, {47,37}, {47,22}, {47,31}, {12,6}, {12,11}, {47,32}, {12,15}, {12,13}, {47,24}, {12,10}, {47,30}, {12,14}, {12,5}, {47,38}, {14,154}, {14,163}, {14,152}, {14,150}, {50,42}, {14,158}, {14,155}, {50,44}, {14,157}, {50,43}, {50,41}, {50,46}, {14,162}, {14,160}, {58,8}, {50,47}, {50,45}, {14,151}, {14,153}, {14,156}, {14,159}, {14,161}, {54,14}, {17,164}, {54,5}, {54,7}, {54,8}, {54,16}, {54,12}, {54,10}, {54,13}, {54,17}, {17,165}, {17,169}, {54,6}, {54,15}, {17,167}, {17,166}, {54,11}, {54,9}, {17,163}, {17,168}, {20,136}, {58,17}, {58,15}, {20,138}, {58,10}, {62,97}, {20,137}, {58,14}, {58,11}, {20,133}, {20,139}, {58,16}, {20,135}, {58,13}, {26,7}, {20,134}, {58,12}, {20,140}, {20,132}, {20,131}, {62,55}, {62,53}, {62,59}, {62,51}, {62,98}, {62,56}, {62,50}, {23,59}, {23,99}, {62,61}, {62,54}, {23,62}, {23,60}, {62,62}, {23,57}, {23,56}, {62,57}, {23,61}, {20,141}, {62,60}, {62,52}, {23,58}, {23,97}, {23,98}, {26,12}, {26,8}, {26,13}, {66,102}, {66,101}, {66,103}, {26,10}, {66,100}, {26,11}, {66,106}, {66,105}, {66,104}, {26,9}, {70,1}, {70,4}, {28,104}, {70,3}, {28,103}, {28,99}, {28,100}, {28,101}, {70,0}, {69,190}, {28,102}, {70,2}, {69,189}, {73,169}, {73,179}, {30,113}, {30,112}, {73,173}, {73,175}, {73,170}, {73,174}, {73,168}, {73,177}, {30,111}, {73,176}, {73,172}, {73,178}, {73,171}, {32,52}, {76,168}, {76,174}, {32,56}, {32,58}, {32,55}, {32,54}, {32,53}, {32,51}, {76,169}, {76,172}, {32,50}, {76,173}, {32,57}, {76,171}, {76,170}, {33,128}, {33,129}, {79,97}, {79,61}, {79,62}, {81,130}, {81,129}, {34,126}, {83,116}, {35,100}, {83,115}, {84,176}, {86,5}, {36,102}, {88,3}, {88,4}, {36,152}, {5,154}, {9,151}, {58,18}, {26,14}, {32,59}, {76,175}, {5,155}, {14,165}, {14,164}, {58,19}, {73,180}, {5,156}, {12,16}, {58,20}, {58,21}, {58,22}, {26,15}, {30,114}, {5,157}, {9,152}, {47,40}, {14,166}, {50,48}, {17,170}, {58,23}, {23,100}, {26,16}, {30,115}, {32,60}, {33,130}, {83,117}, {5,158}, {9,153}, {14,167}, {54,18}, {20,142}, {26,17}, {66,107}, {70,5}, {5,159}, {20,143}, {62,99}, {26,18}, {5,160}, {44,113}, {47,41}, {12,17}, {50,50}, {14,170}, {14,168}, {14,169}, {14,171}, {50,49}, {54,23}, {54,20}, {54,22}, {17,171}, {17,173}, {17,172}, {54,19}, {17,174}, {54,21}, {58,24}, {58,25}, {58,26}, {62,102}, {62,103}, {62,101}, {62,104}, {23,101}, {62,100}, {26,19}, {70,10}, {70,6}, {70,9}, {70,11}, {70,8}, {70,7}, {73,181}, {73,182}, {73,183}, {30,116}, {30,117}, {76,177}, {76,176}, {76,178}, {79,99}, {79,98}, {81,132}, {81,133}, {81,131}, {35,101}, {83,118}, {83,119}, {86,6}, {86,175}, {87,123}, {5,161}, {7,61}, {32,61}, {5,162}, {54,24}, {58,27}, {37,1}, {41,10}, {41,11}, {41,13}, {5,163}, {41,14}, {41,12}, {42,98}, {42,99}, {42,59}, {42,97}, {7,97}, {7,98}, {42,60}, {42,58}, {42,57}, {42,61}, {7,62}, {42,62}, {47,42}, {44,118}, {9,156}, {44,117}, {44,119}, {9,155}, {44,124}, {9,159}, {44,114}, {44,128}, {44,134}, {9,166}, {44,131}, {9,163}, {44,121}, {44,127}, {44,129}, {44,116}, {9,162}, {9,157}, {44,122}, {9,164}, {9,167}, {9,161}, {9,154}, {44,126}, {44,120}, {44,133}, {9,169}, {9,165}, {9,160}, {44,125}, {14,172}, {44,123}, {9,158}, {9,168}, {44,115}, {44,130}, {44,132}, {12,34}, {12,28}, {12,36}, {12,33}, {47,49}, {47,52}, {12,29}, {47,43}, {12,22}, {12,32}, {12,35}, {12,37}, {47,98}, {47,55}, {12,21}, {47,97}, {12,25}, {12,23}, {12,18}, {47,47}, {47,62}, {47,51}, {47,54}, {47,101}, {12,38}, {47,61}, {12,30}, {47,56}, {47,100}, {47,53}, {47,57}, {47,60}, {47,45}, {47,99}, {47,59}, {47,44}, {47,48}, {12,31}, {12,26}, {12,19}, {12,24}, {12,20}, {12,39}, {47,46}, {50,101}, {12,27}, {47,58}, {45,1}, {50,104}, {14,186}, {50,54}, {50,99}, {50,61}, {50,114}, {50,106}, {50,62}, {50,105}, {50,56}, {50,60}, {50,117}, {14,189}, {50,109}, {50,100}, {14,173}, {50,115}, {50,52}, {50,108}, {14,188}, {14,183}, {50,51}, {14,181}, {14,180}, {14,185}, {50,107}, {14,177}, {14,184}, {47,50}, {58,28}, {50,102}, {50,58}, {14,187}, {50,59}, {50,97}, {14,190}, {50,53}, {50,111}, {50,110}, {50,118}, {14,179}, {14,176}, {50,116}, {50,112}, {50,103}, {50,98}, {14,182}, {14,178}, {50,55}, {14,174}, {50,113}, {14,175}, {50,57}, {54,30}, {54,32}, {54,37}, {54,57}, {17,188}, {17,178}, {54,29}, {17,189}, {17,190}, {54,40}, {54,47}, {54,53}, {54,34}, {54,41}, {18,0}, {54,55}, {54,50}, {17,186}, {17,184}, {54,46}, {54,42}, {54,28}, {17,175}, {54,33}, {54,25}, {17,183}, {17,185}, {54,38}, {54,35}, {17,180}, {54,51}, {17,177}, {54,36}, {54,58}, {54,44}, {54,43}, {17,176}, {17,187}, {17,179}, {54,26}, {54,31}, {54,48}, {54,54}, {18,1}, {54,27}, {54,39}, {54,45}, {17,182}, {54,56}, {54,49}, {54,52}, {17,181}, {58,44}, {58,32}, {20,151}, {58,61}, {58,103}, {58,106}, {20,149}, {58,40}, {58,99}, {58,41}, {58,55}, {20,162}, {58,51}, {20,159}, {58,52}, {58,29}, {58,100}, {20,168}, {58,97}, {58,53}, {58,108}, {58,48}, {62,136}, {58,111}, {20,166}, {58,46}, {58,58}, {20,169}, {20,148}, {58,50}, {58,109}, {58,43}, {58,36}, {58,47}, {58,35}, {58,33}, {20,144}, {58,101}, {58,42}, {58,104}, {58,105}, {20,152}, {20,157}, {20,153}, {20,161}, {58,62}, {20,154}, {58,54}, {58,38}, {20,146}, {58,30}, {58,98}, {58,107}, {58,37}, {20,160}, {58,112}, {58,49}, {58,45}, {20,145}, {20,165}, {58,60}, {20,167}, {58,56}, {20,156}, {20,150}, {20,158}, {20,147}, {20,164}, {58,57}, {58,39}, {58,59}, {58,34}, {58,102}, {58,110}, {58,31}, {62,135}, {62,157}, {23,21}, {62,140}, {62,138}, {62,117}, {23,105}, {62,133}, {62,153}, {62,129}, {23,113}, {62,152}, {62,127}, {20,163}, {62,143}, {62,128}, {62,150}, {23,112}, {23,104}, {62,106}, {62,114}, {62,139}, {62,131}, {62,156}, {62,134}, {23,118}, {62,151}, {23,109}, {62,137}, {62,145}, {62,118}, {62,144}, {62,161}, {62,113}, {62,146}, {62,159}, {62,107}, {20,155}, {62,121}, {62,120}, {23,111}, {62,124}, {62,126}, {62,141}, {62,158}, {23,114}, {23,115}, {62,112}, {23,107}, {62,116}, {62,154}, {23,116}, {23,108}, {23,110}, {23,117}, {62,160}, {62,147}, {62,142}, {62,123}, {62,122}, {23,106}, {62,108}, {23,103}, {62,132}, {62,109}, {62,130}, {62,119}, {62,155}, {23,102}, {62,115}, {62,111}, {62,149}, {62,110}, {26,32}, {66,147}, {66,130}, {66,108}, {66,138}, {26,24}, {66,123}, {66,133}, {26,27}, {66,126}, {26,25}, {66,111}, {66,141}, {66,110}, {66,129}, {66,109}, {66,127}, {66,136}, {66,134}, {66,122}, {66,117}, {66,115}, {66,116}, {66,135}, {66,146}, {66,124}, {26,26}, {66,119}, {66,139}, {26,29}, {66,118}, {66,112}, {66,128}, {26,33}, {26,21}, {26,30}, {66,120}, {66,114}, {26,23}, {62,148}, {26,22}, {66,131}, {26,20}, {26,35}, {26,28}, {66,132}, {66,121}, {66,113}, {66,140}, {66,125}, {26,34}, {66,144}, {26,31}, {66,143}, {66,137}, {66,142}, {66,145}, {70,51}, {70,52}, {70,39}, {70,38}, {70,34}, {28,116}, {28,108}, {70,54}, {70,53}, {62,105}, {70,31}, {70,35}, {70,29}, {70,48}, {70,33}, {70,55}, {70,26}, {70,24}, {70,36}, {70,46}, {70,41}, {28,118}, {70,15}, {70,45}, {28,119}, {62,125}, {70,27}, {70,18}, {70,21}, {70,59}, {70,28}, {70,19}, {70,17}, {70,14}, {28,112}, {70,37}, {28,111}, {28,115}, {70,32}, {70,40}, {28,105}, {70,56}, {70,60}, {28,107}, {70,23}, {70,43}, {70,47}, {70,20}, {70,57}, {28,114}, {28,113}, {70,12}, {28,117}, {70,50}, {70,22}, {70,42}, {70,16}, {70,30}, {70,25}, {28,109}, {28,110}, {70,44}, {70,61}, {70,58}, {70,49}, {70,13}, {28,106}, {74,9}, {74,0}, {74,3}, {30,123}, {74,5}, {73,185}, {74,1}, {74,7}, {30,120}, {30,124}, {30,118}, {73,187}, {74,12}, {74,6}, {73,188}, {74,21}, {74,15}, {73,184}, {77,6}, {73,190}, {30,119}, {74,10}, {74,20}, {30,127}, {74,17}, {73,189}, {74,4}, {74,8}, {74,2}, {74,22}, {74,19}, {74,16}, {30,121}, {30,122}, {30,126}, {73,186}, {74,23}, {30,125}, {74,13}, {74,11}, {74,14}, {77,19}, {77,0}, {77,5}, {77,18}, {77,4}, {76,187}, {77,1}, {32,98}, {76,180}, {77,13}, {77,15}, {76,179}, {32,97}, {77,17}, {77,9}, {32,104}, {77,16}, {77,2}, {32,106}, {76,185}, {74,18}, {77,10}, {77,7}, {76,181}, {77,21}, {32,100}, {32,101}, {76,183}, {77,8}, {77,20}, {77,11}, {76,189}, {32,103}, {32,99}, {77,12}, {76,190}, {77,22}, {76,184}, {77,3}, {77,14}, {76,186}, {76,188}, {33,139}, {76,182}, {32,105}, {33,132}, {32,62}, {32,102}, {33,136}, {79,115}, {79,105}, {79,100}, {79,106}, {79,116}, {79,120}, {79,119}, {33,138}, {33,137}, {79,107}, {79,121}, {79,110}, {79,102}, {79,104}, {79,103}, {79,109}, {79,114}, {79,101}, {79,108}, {79,113}, {33,135}, {79,111}, {33,133}, {79,112}, {33,131}, {33,134}, {81,149}, {79,117}, {34,130}, {81,141}, {81,145}, {81,137}, {81,140}, {81,148}, {34,128}, {81,153}, {81,146}, {81,138}, {81,154}, {81,147}, {34,131}, {34,132}, {81,151}, {81,139}, {34,127}, {34,129}, {81,134}, {81,142}, {81,136}, {81,152}, {81,150}, {81,135}, {81,143}, {83,126}, {34,133}, {81,144}, {35,103}, {35,105}, {35,102}, {83,131}, {83,123}, {83,121}, {83,125}, {83,122}, {83,127}, {83,129}, {35,106}, {35,108}, {83,128}, {35,109}, {35,107}, {83,130}, {35,104}, {35,180}, {84,177}, {84,183}, {35,182}, {83,124}, {84,182}, {84,189}, {84,180}, {84,187}, {84,186}, {83,120}, {84,181}, {79,118}, {84,190}, {84,179}, {84,184}, {84,188}, {84,178}, {86,10}, {35,181}, {84,185}, {86,180}, {86,11}, {86,9}, {86,7}, {86,8}, {86,12}, {36,153}, {86,178}, {86,176}, {86,181}, {86,179}, {86,182}, {36,154}, {86,177}, {87,124}, {88,5}, {88,6}, {88,7}, {88,135}, {88,125}, {41,15}, {9,170}, {12,40}, {50,120}, {50,119}, {15,0}, {18,2}, {54,60}, {54,59}, {20,170}, {23,120}, {23,119}, {23,121}, {66,148}, {70,62}, {74,24}, {74,26}, {74,25}, {32,107}, {77,23}, {79,122}, {88,101}, {5,164}, {44,137}, {44,138}, {44,136}, {44,135}, {9,171}, {47,105}, {47,103}, {47,102}, {12,41}, {12,43}, {12,42}, {47,104}, {50,132}, {50,129}, {50,127}, {15,1}, {50,130}, {15,6}, {50,124}, {50,139}, {50,141}, {50,125}, {15,3}, {50,142}, {50,137}, {50,123}, {50,128}, {50,138}, {50,134}, {50,131}, {15,8}, {50,140}, {50,126}, {50,135}, {50,121}, {15,7}, {15,4}, {50,133}, {50,136}, {50,122}, {15,5}, {15,2}, {18,12}, {54,101}, {18,11}, {54,104}, {54,107}, {18,8}, {18,6}, {54,62}, {54,105}, {54,103}, {54,100}, {54,108}, {54,109}, {54,111}, {54,112}, {54,61}, {18,5}, {54,98}, {54,97}, {54,110}, {18,7}, {54,99}, {18,9}, {18,4}, {54,102}, {18,13}, {18,10}, {54,106}, {20,177}, {58,127}, {58,116}, {20,174}, {62,167}, {58,125}, {58,113}, {20,172}, {58,118}, {20,175}, {58,122}, {58,120}, {20,178}, {20,171}, {58,114}, {58,117}, {20,176}, {58,115}, {58,126}, {58,124}, {58,119}, {58,121}, {58,123}, {20,173}, {62,168}, {62,174}, {62,164}, {62,170}, {23,122}, {62,166}, {23,128}, {23,127}, {23,126}, {62,173}, {23,129}, {23,130}, {62,163}, {62,176}, {23,131}, {23,125}, {23,124}, {62,172}, {23,132}, {62,162}, {62,165}, {62,175}, {62,171}, {66,180}, {66,169}, {23,123}, {26,42}, {66,157}, {66,178}, {66,158}, {26,37}, {66,155}, {66,164}, {66,156}, {26,39}, {66,150}, {66,177}, {26,40}, {66,174}, {66,175}, {66,151}, {26,45}, {66,166}, {66,160}, {66,167}, {66,154}, {66,179}, {66,171}, {66,165}, {66,149}, {26,41}, {66,172}, {26,44}, {66,176}, {66,170}, {26,38}, {66,168}, {66,162}, {26,36}, {66,153}, {66,161}, {66,173}, {66,159}, {66,163}, {28,129}, {62,169}, {70,114}, {70,123}, {70,113}, {70,109}, {70,106}, {28,130}, {70,104}, {26,43}, {70,97}, {28,128}, {70,103}, {28,127}, {70,108}, {70,105}, {70,121}, {70,116}, {70,110}, {70,115}, {28,123}, {70,107}, {70,126}, {70,98}, {70,99}, {70,122}, {28,124}, {70,127}, {28,126}, {70,128}, {70,112}, {66,152}, {70,118}, {70,111}, {70,120}, {70,117}, {70,102}, {28,121}, {70,125}, {28,122}, {70,100}, {28,125}, {74,36}, {70,119}, {70,124}, {74,33}, {28,120}, {30,128}, {74,43}, {74,39}, {74,37}, {74,32}, {74,47}, {30,132}, {74,28}, {74,40}, {74,41}, {74,31}, {74,30}, {74,44}, {74,34}, {74,29}, {74,35}, {74,46}, {74,27}, {74,45}, {74,42}, {30,130}, {30,129}, {30,131}, {74,38}, {79,139}, {77,25}, {32,113}, {77,29}, {77,26}, {77,33}, {77,39}, {77,28}, {77,48}, {32,110}, {77,42}, {77,31}, {77,43}, {77,38}, {77,45}, {77,30}, {32,115}, {32,114}, {77,32}, {77,46}, {77,24}, {77,44}, {32,108}, {77,36}, {77,35}, {77,40}, {77,27}, {32,112}, {32,116}, {77,34}, {77,41}, {32,117}, {77,37}, {32,109}, {32,111}, {79,135}, {79,133}, {79,140}, {79,137}, {79,141}, {79,126}, {79,134}, {79,145}, {77,47}, {79,130}, {33,143}, {70,101}, {79,125}, {79,138}, {79,132}, {79,129}, {79,124}, {79,123}, {79,144}, {79,128}, {79,127}, {33,141}, {79,136}, {33,140}, {33,142}, {79,131}, {79,143}, {81,158}, {81,159}, {34,137}, {81,156}, {34,134}, {81,164}, {34,138}, {81,166}, {81,155}, {79,142}, {81,168}, {81,157}, {34,135}, {81,163}, {81,165}, {81,160}, {81,167}, {81,162}, {81,161}, {34,136}, {83,133}, {83,134}, {83,136}, {35,110}, {35,111}, {83,137}, {83,135}, {83,132}, {85,2}, {85,5}, {85,1}, {35,186}, {85,3}, {35,185}, {35,184}, {35,183}, {85,4}, {86,17}, {86,15}, {86,14}, {85,0}, {86,16}, {85,6}, {86,13}, {86,185}, {86,151}, {86,183}, {36,155}, {86,184}, {86,186}, {87,127}, {36,186}, {87,126}, {87,125}, {36,187}, {37,26}, {88,46}, {88,103}, {88,102}, {88,104}, {5,165}, {47,106}, {50,143}, {50,144}, {58,128}, {85,7}, {87,128}, {5,166}, {12,44}, {47,107}, {54,113}, {18,14}, {58,130}, {58,129}, {20,179}, {23,133}, {70,129}, {28,131}, {28,132}, {30,133}, {36,188}, {5,167}, {47,108}, {9,173}, {47,110}, {47,109}, {12,45}, {50,145}, {50,152}, {15,9}, {50,150}, {50,148}, {50,155}, {50,146}, {50,147}, {15,10}, {15,14}, {50,156}, {15,13}, {50,154}, {50,151}, {50,149}, {15,11}, {15,12}, {50,153}, {18,16}, {54,114}, {18,21}, {54,130}, {18,20}, {54,132}, {54,120}, {18,18}, {54,131}, {54,115}, {18,19}, {54,127}, {54,123}, {54,125}, {54,119}, {54,126}, {18,15}, {54,122}, {54,121}, {54,117}, {54,128}, {54,124}, {54,116}, {54,118}, {18,17}, {54,129}, {20,182}, {58,141}, {58,137}, {58,139}, {58,134}, {58,133}, {58,131}, {58,138}, {58,140}, {58,136}, {58,135}, {20,180}, {20,181}, {58,143}, {23,141}, {62,178}, {62,184}, {62,179}, {62,180}, {62,185}, {23,143}, {23,135}, {23,142}, {62,177}, {58,132}, {23,138}, {23,136}, {62,183}, {62,182}, {23,137}, {23,139}, {62,181}, {23,134}, {23,140}, {66,182}, {26,52}, {67,2}, {67,1}, {66,187}, {26,54}, {67,0}, {66,183}, {66,184}, {26,46}, {26,48}, {66,189}, {66,181}, {26,50}, {26,49}, {66,185}, {66,190}, {66,188}, {26,51}, {66,186}, {58,142}, {26,47}, {70,130}, {70,137}, {28,134}, {70,141}, {28,138}, {70,133}, {70,131}, {70,140}, {28,133}, {70,139}, {28,135}, {28,136}, {70,132}, {28,137}, {70,138}, {70,134}, {70,135}, {70,136}, {26,53}, {74,48}, {74,60}, {30,138}, {74,55}, {74,57}, {30,136}, {74,49}, {74,53}, {74,56}, {30,134}, {30,137}, {74,59}, {74,51}, {74,52}, {74,58}, {74,50}, {74,54}, {30,135}, {77,50}, {77,49}, {32,119}, {77,55}, {32,121}, {32,118}, {77,51}, {32,122}, {77,52}, {77,53}, {77,56}, {32,120}, {79,150}, {79,153}, {79,147}, {79,149}, {79,148}, {79,151}, {79,152}, {77,54}, {79,146}, {34,141}, {81,172}, {81,175}, {81,177}, {81,170}, {81,171}, {81,174}, {81,176}, {34,142}, {34,140}, {34,139}, {81,173}, {81,169}, {83,138}, {35,112}, {83,139}, {85,9}, {35,187}, {85,11}, {35,188}, {85,8}, {85,10}, {36,104}, {86,18}, {36,103}, {86,189}, {86,188}, {86,187}, {88,8}, {88,9}, {88,11}, {88,10}, {41,16}, {5,168}, {12,46}, {54,133}, {20,183}, {62,186}, {33,144}, {81,178}, {7,99}, {18,23}, {18,22}, {58,144}, {20,184}, {58,146}, {58,145}, {62,187}, {23,144}, {67,3}, {67,6}, {67,5}, {67,4}, {70,142}, {70,144}, {70,143}, {30,140}, {30,139}, {32,123}, {77,57}, {77,59}, {77,58}, {33,145}, {81,180}, {81,179}, {83,140}, {35,113}, {35,189}, {86,20}, {86,19}, {37,27}, {7,100}, {47,111}, {12,47}, {54,136}, {54,134}, {54,135}, {58,148}, {58,149}, {63,3}, {58,147}, {62,188}, {63,1}, {63,0}, {63,2}, {23,145}, {62,190}, {62,189}, {63,4}, {67,9}, {67,7}, {67,8}, {70,147}, {70,145}, {70,146}, {74,61}, {77,60}, {77,61}, {33,146}, {81,181}, {83,141}, {35,114}, {85,12}, {86,21}, {36,105}, {86,190}, {88,12}, {7,101}, {12,49}, {12,50}, {47,112}, {47,113}, {12,48}, {15,20}, {15,18}, {15,17}, {15,24}, {15,16}, {15,25}, {50,157}, {15,22}, {15,19}, {15,23}, {15,21}, {15,15}, {18,31}, {18,25}, {54,140}, {18,30}, {18,32}, {18,26}, {18,27}, {54,138}, {18,24}, {54,139}, {18,29}, {54,137}, {18,28}, {21,4}, {21,6}, {58,152}, {21,5}, {20,185}, {20,189}, {23,164}, {63,9}, {58,154}, {20,190}, {58,157}, {58,158}, {21,3}, {58,160}, {58,162}, {58,163}, {58,151}, {58,150}, {58,164}, {21,2}, {58,161}, {58,159}, {21,0}, {20,187}, {21,7}, {58,155}, {58,156}, {58,153}, {21,1}, {20,188}, {20,186}, {63,8}, {23,159}, {23,154}, {23,149}, {23,165}, {23,150}, {23,146}, {23,161}, {23,158}, {23,160}, {23,151}, {23,156}, {23,147}, {23,148}, {63,16}, {63,13}, {63,5}, {63,10}, {23,162}, {63,17}, {23,163}, {23,153}, {63,7}, {63,15}, {63,11}, {63,14}, {63,12}, {23,157}, {63,6}, {23,152}, {67,12}, {26,56}, {26,59}, {67,14}, {26,101}, {67,13}, {26,61}, {28,143}, {67,15}, {26,100}, {67,11}, {26,102}, {26,57}, {23,155}, {26,60}, {26,58}, {26,62}, {26,98}, {26,55}, {26,103}, {26,99}, {26,97}, {67,10}, {28,150}, {28,146}, {28,153}, {70,150}, {28,154}, {70,162}, {70,155}, {28,139}, {70,163}, {70,157}, {28,149}, {70,158}, {28,148}, {70,161}, {28,142}, {70,159}, {70,149}, {28,141}, {74,106}, {28,147}, {28,144}, {28,152}, {70,148}, {70,152}, {28,140}, {70,151}, {70,153}, {70,154}, {28,151}, {70,156}, {70,160}, {70,164}, {28,155}, {30,146}, {74,101}, {74,107}, {74,104}, {74,62}, {74,108}, {74,97}, {74,103}, {30,141}, {30,147}, {74,109}, {30,143}, {30,153}, {30,148}, {74,111}, {74,105}, {30,144}, {74,98}, {30,154}, {74,99}, {74,100}, {30,155}, {30,152}, {28,145}, {30,142}, {74,112}, {30,156}, {30,149}, {74,110}, {30,145}, {30,150}, {30,151}, {32,131}, {77,100}, {77,109}, {77,106}, {77,108}, {32,128}, {77,101}, {77,107}, {32,124}, {77,103}, {32,132}, {77,99}, {77,104}, {77,111}, {74,102}, {77,105}, {77,98}, {32,125}, {77,97}, {32,126}, {77,112}, {32,127}, {77,110}, {32,130}, {77,62}, {32,129}, {77,102}, {79,156}, {79,170}, {79,165}, {79,167}, {79,155}, {33,147}, {79,154}, {33,150}, {33,149}, {79,169}, {79,161}, {79,158}, {79,164}, {79,157}, {79,159}, {79,168}, {79,166}, {33,148}, {79,173}, {79,171}, {79,162}, {79,172}, {79,163}, {81,185}, {34,143}, {82,1}, {85,15}, {34,150}, {79,160}, {81,183}, {34,146}, {81,184}, {81,189}, {34,148}, {34,149}, {81,182}, {82,0}, {82,2}, {81,186}, {81,188}, {81,190}, {81,187}, {82,3}, {34,145}, {34,151}, {34,147}, {34,144}, {83,144}, {35,119}, {83,142}, {83,146}, {83,147}, {35,117}, {83,148}, {83,145}, {83,143}, {35,120}, {35,116}, {83,149}, {35,118}, {35,115}, {35,190}, {36,0}, {85,14}, {85,13}, {85,16}, {85,17}, {36,1}, {86,22}, {86,27}, {36,106}, {86,24}, {86,23}, {86,26}, {86,25}, {87,3}, {36,156}, {87,2}, {87,0}, {87,1}, {36,190}, {36,189}, {87,129}, {87,130}, {37,0}, {88,13}, {88,14}, {37,39}, {37,45}, {88,105}, {88,136}, {7,102}, {54,141}, {54,142}, {63,18}, {67,16}, {70,165}, {32,134}, {32,133}, {79,174}, {82,4}, {87,4}, {7,103}, {50,158}, {15,26}, {18,33}, {63,20}, {63,19}, {28,156}, {70,166}, {28,157}, {77,113}, {33,151}, {37,54}, {7,104}, {44,139}, {50,159}, {18,34}, {54,143}, {54,144}, {58,165}, {21,8}, {23,166}, {63,22}, {63,21}, {63,23}, {67,17}, {67,18}, {26,104}, {30,157}, {28,158}, {30,158}, {77,117}, {77,114}, {77,116}, {77,115}, {32,135}, {79,175}, {82,6}, {82,5}, {42,100}, {15,28}, {15,27}, {50,160}, {54,145}, {58,167}, {58,166}, {21,9}, {63,25}, {63,26}, {63,24}, {23,168}, {23,167}, {26,106}, {26,105}, {70,167}, {74,115}, {74,113}, {74,114}, {30,159}, {77,119}, {77,118}, {79,178}, {79,177}, {79,176}, {82,7}, {88,106}, {7,105}, {12,51}, {12,52}, {15,29}, {15,30}, {50,162}, {50,161}, {54,146}, {18,40}, {18,38}, {18,35}, {18,39}, {18,37}, {18,36}, {21,10}, {58,170}, {23,173}, {21,12}, {21,17}, {58,172}, {21,19}, {21,18}, {21,21}, {58,171}, {58,168}, {21,15}, {21,11}, {21,13}, {58,169}, {21,20}, {21,16}, {21,14}, {23,175}, {23,174}, {23,172}, {23,176}, {23,170}, {23,171}, {23,169}, {63,27}, {67,20}, {26,108}, {26,109}, {26,107}, {67,19}, {67,21}, {70,170}, {70,172}, {28,167}, {70,173}, {28,160}, {70,169}, {28,159}, {28,169}, {28,165}, {28,166}, {28,162}, {70,168}, {28,161}, {70,174}, {70,171}, {28,168}, {28,163}, {28,164}, {74,117}, {74,119}, {74,118}, {74,120}, {30,160}, {74,116}, {32,139}, {77,120}, {32,136}, {32,140}, {32,138}, {32,137}, {79,179}, {79,182}, {79,181}, {79,180}, {33,152}, {82,8}, {82,9}, {34,152}, {82,10}, {34,153}, {35,122}, {35,121}, {85,18}, {36,2}, {85,19}, {86,28}, {36,107}, {36,108}, {87,5}, {37,2}, {7,106}, {18,42}, {18,41}, {63,28}, {63,29}, {26,110}, {74,121}, {28,170}, {74,122}, {77,121}, {7,107}, {47,114}, {12,54}, {12,53}, {50,163}, {15,31}, {50,164}, {54,149}, {54,148}, {54,147}, {58,174}, {21,24}, {58,173}, {21,23}, {58,175}, {21,22}, {63,31}, {63,34}, {63,32}, {63,33}, {63,37}, {63,30}, {63,38}, {63,35}, {63,36}, {26,112}, {67,22}, {26,111}, {70,178}, {70,176}, {28,171}, {70,175}, {70,177}, {28,172}, {74,123}, {74,124}, {32,141}, {82,12}, {82,14}, {82,11}, {82,13}, {83,150}, {85,20}, {88,47}, {7,108}, {12,55}, {50,165}, {50,167}, {50,166}, {54,152}, {18,44}, {54,150}, {18,43}, {54,153}, {54,154}, {54,151}, {58,187}, {21,32}, {58,179}, {58,185}, {21,27}, {21,30}, {58,178}, {21,25}, {58,182}, {63,44}, {21,29}, {58,177}, {58,183}, {58,180}, {58,186}, {58,176}, {58,184}, {21,28}, {21,31}, {58,181}, {21,26}, {23,178}, {63,40}, {23,177}, {63,47}, {63,46}, {23,184}, {23,185}, {63,48}, {23,179}, {63,45}, {23,183}, {63,50}, {63,41}, {63,43}, {23,180}, {63,39}, {63,42}, {63,49}, {23,181}, {63,51}, {23,182}, {26,113}, {67,27}, {67,33}, {67,25}, {67,34}, {67,24}, {67,29}, {67,35}, {67,32}, {67,31}, {67,30}, {67,23}, {67,28}, {67,26}, {28,177}, {28,174}, {70,187}, {71,1}, {71,3}, {71,0}, {70,184}, {70,186}, {71,5}, {71,2}, {70,188}, {71,6}, {70,185}, {71,4}, {28,175}, {28,181}, {28,179}, {70,179}, {28,180}, {28,176}, {70,180}, {70,182}, {70,181}, {70,189}, {70,190}, {28,178}, {28,173}, {70,183}, {74,134}, {30,162}, {74,125}, {30,163}, {30,166}, {74,130}, {74,127}, {30,165}, {74,131}, {74,132}, {74,126}, {74,135}, {74,128}, {74,133}, {30,164}, {30,161}, {74,129}, {77,127}, {32,144}, {32,142}, {32,145}, {32,143}, {77,126}, {77,123}, {77,122}, {77,125}, {77,124}, {80,5}, {33,158}, {79,187}, {79,186}, {33,153}, {80,1}, {80,0}, {79,183}, {80,3}, {79,188}, {33,157}, {79,185}, {80,2}, {79,184}, {33,154}, {33,156}, {79,189}, {33,155}, {79,190}, {80,4}, {82,18}, {34,158}, {82,15}, {82,19}, {34,155}, {82,17}, {34,160}, {34,157}, {82,16}, {34,159}, {82,20}, {34,154}, {35,124}, {35,126}, {83,153}, {35,125}, {83,151}, {34,156}, {83,152}, {35,123}, {36,3}, {36,5}, {85,22}, {36,4}, {85,21}, {86,33}, {36,109}, {86,32}, {36,110}, {86,30}, {86,29}, {86,34}, {86,35}, {87,6}, {86,31}, {87,134}, {87,131}, {87,132}, {87,133}, {37,28}, {88,17}, {88,16}, {88,15}, {88,48}, {88,126}, {88,107}, {37,46}, {7,109}, {15,32}, {23,186}, {28,182}, {74,136}, {33,159}, {82,21}, {88,108}, {7,110}, {9,174}, {12,57}, {12,56}, {15,35}, {50,168}, {15,33}, {50,169}, {15,34}, {54,159}, {54,155}, {18,45}, {54,158}, {54,157}, {54,156}, {18,46}, {54,160}, {54,161}, {59,3}, {59,1}, {59,5}, {59,6}, {59,12}, {59,8}, {59,10}, {59,2}, {58,188}, {59,9}, {59,11}, {59,4}, {59,7}, {58,189}, {21,34}, {59,0}, {58,190}, {21,33}, {21,35}, {23,189}, {63,53}, {63,55}, {63,54}, {63,59}, {23,187}, {63,56}, {63,52}, {63,57}, {63,58}, {23,188}, {23,190}, {63,60}, {67,39}, {67,38}, {67,36}, {67,37}, {26,115}, {26,117}, {26,114}, {26,116}, {71,13}, {71,14}, {71,9}, {71,10}, {28,184}, {28,189}, {28,183}, {28,190}, {28,185}, {71,11}, {71,12}, {71,8}, {29,0}, {28,187}, {28,186}, {28,188}, {71,7}, {74,138}, {30,168}, {74,140}, {30,170}, {74,143}, {74,139}, {74,137}, {74,142}, {30,169}, {74,141}, {30,167}, {32,147}, {32,150}, {77,129}, {32,148}, {77,128}, {32,146}, {32,149}, {80,6}, {80,7}, {80,8}, {33,160}, {80,9}, {33,161}, {34,162}, {82,24}, {82,25}, {82,23}, {82,22}, {82,26}, {34,161}, {83,157}, {83,155}, {83,156}, {83,158}, {83,154}, {83,159}, {85,24}, {85,25}, {85,23}, {36,6}, {86,36}, {36,111}, {86,37}, {87,8}, {87,7}, {7,111}, {21,36}, {24,0}, {26,118}, {30,172}, {30,171}, {34,163}, {35,60}, {36,7}, {7,112}, {15,36}, {24,1}, {82,27}, {42,102}, {7,113}, {7,116}, {7,115}, {7,114}, {42,101}, {44,141}, {44,143}, {9,175}, {9,177}, {44,140}, {44,142}, {9,176}, {44,145}, {44,144}, {44,146}, {47,118}, {47,116}, {12,60}, {47,115}, {12,99}, {12,62}, {12,59}, {12,100}, {12,61}, {12,98}, {12,97}, {47,117}, {12,58}, {15,42}, {50,171}, {50,177}, {15,39}, {15,46}, {15,41}, {50,174}, {50,176}, {15,44}, {50,170}, {50,173}, {15,40}, {15,37}, {50,172}, {15,43}, {50,175}, {15,45}, {15,38}, {54,163}, {54,166}, {18,48}, {18,58}, {18,54}, {54,164}, {18,62}, {18,55}, {18,60}, {18,50}, {18,47}, {18,49}, {18,61}, {54,165}, {18,53}, {18,56}, {18,52}, {18,57}, {54,167}, {18,59}, {18,51}, {54,162}, {59,13}, {21,37}, {59,15}, {21,39}, {21,41}, {59,14}, {21,38}, {21,42}, {21,40}, {24,7}, {63,99}, {24,15}, {63,62}, {24,16}, {24,5}, {63,97}, {24,10}, {63,98}, {24,3}, {24,2}, {24,13}, {24,12}, {24,11}, {24,9}, {24,14}, {63,61}, {24,4}, {24,6}, {24,8}, {26,120}, {26,123}, {26,127}, {26,121}, {26,126}, {26,124}, {26,119}, {26,125}, {26,122}, {71,18}, {29,3}, {29,1}, {71,19}, {29,4}, {29,2}, {71,17}, {71,16}, {30,176}, {71,15}, {30,174}, {30,173}, {74,144}, {29,5}, {30,175}, {74,145}, {30,178}, {74,146}, {30,177}, {32,152}, {77,131}, {32,151}, {32,156}, {32,154}, {32,155}, {33,163}, {32,153}, {77,130}, {74,147}, {33,162}, {33,164}, {34,164}, {34,165}, {83,160}, {36,158}, {36,157}, {7,118}, {41,21}, {15,47}, {41,18}, {41,19}, {41,17}, {41,20}, {42,106}, {42,103}, {42,108}, {42,104}, {7,119}, {7,122}, {42,105}, {7,121}, {42,107}, {7,120}, {44,149}, {44,151}, {9,180}, {44,147}, {44,150}, {44,148}, {9,178}, {9,181}, {9,179}, {47,120}, {47,124}, {47,121}, {12,103}, {12,104}, {47,123}, {47,125}, {47,127}, {12,101}, {47,126}, {12,102}, {54,174}, {47,122}, {50,178}, {50,187}, {50,185}, {50,180}, {50,181}, {50,186}, {50,188}, {15,49}, {50,183}, {50,179}, {15,48}, {15,50}, {50,182}, {50,189}, {50,184}, {18,97}, {54,177}, {54,169}, {54,175}, {54,176}, {18,98}, {54,168}, {54,170}, {47,119}, {54,172}, {54,173}, {54,171}, {21,44}, {59,22}, {74,148}, {59,23}, {59,20}, {18,99}, {21,46}, {59,19}, {59,25}, {59,24}, {21,43}, {59,28}, {59,18}, {59,27}, {59,16}, {59,26}, {59,21}, {21,45}, {63,106}, {63,101}, {63,107}, {63,102}, {63,100}, {63,103}, {24,17}, {63,105}, {63,104}, {24,18}, {26,129}, {26,128}, {67,46}, {67,49}, {67,41}, {67,45}, {26,130}, {67,44}, {67,42}, {67,48}, {67,43}, {67,40}, {67,47}, {71,25}, {29,8}, {80,10}, {71,22}, {71,23}, {71,21}, {59,17}, {29,7}, {71,26}, {71,20}, {29,6}, {29,9}, {71,24}, {74,149}, {30,179}, {74,150}, {74,151}, {77,132}, {32,157}, {80,11}, {80,12}, {80,13}, {82,29}, {82,28}, {83,162}, {83,161}, {85,27}, {85,28}, {85,26}, {86,38}, {36,112}, {7,123}, {12,106}, {12,105}, {15,53}, {15,52}, {51,0}, {51,1}, {50,190}, {15,51}, {54,181}, {54,182}, {54,178}, {18,100}, {54,179}, {54,180}, {59,31}, {59,33}, {59,29}, {59,32}, {21,47}, {59,30}, {21,48}, {60,51}, {24,21}, {24,20}, {24,19}, {63,108}, {63,109}, {67,51}, {67,53}, {26,134}, {26,131}, {26,133}, {26,132}, {67,52}, {67,50}, {71,33}, {71,30}, {71,31}, {29,13}, {71,32}, {71,27}, {71,28}, {29,10}, {29,11}, {71,29}, {29,12}, {74,155}, {74,156}, {74,153}, {74,154}, {30,180}, {74,152}, {77,136}, {77,133}, {77,135}, {32,160}, {77,139}, {32,159}, {77,137}, {77,140}, {77,138}, {77,134}, {32,158}, {80,15}, {80,16}, {80,14}, {80,18}, {33,165}, {33,166}, {82,31}, {34,167}, {80,17}, {82,30}, {34,166}, {83,165}, {83,166}, {35,127}, {83,164}, {83,163}, {85,29}, {36,8}, {87,9}, {87,136}, {87,135}, {37,3}, {37,29}, {87,137}, {88,49}, {37,47}, {7,124}, {9,182}, {24,22}, {35,128}, {7,125}, {12,107}, {18,101}, {21,49}, {33,167}, {9,183}, {47,129}, {47,128}, {51,2}, {15,56}, {15,54}, {15,58}, {51,4}, {15,57}, {15,55}, {51,3}, {18,104}, {54,188}, {18,103}, {18,105}, {55,2}, {18,107}, {54,190}, {55,0}, {54,183}, {18,106}, {55,3}, {54,185}, {54,186}, {54,184}, {18,102}, {55,1}, {54,187}, {54,189}, {59,45}, {59,44}, {59,42}, {59,34}, {59,49}, {59,37}, {59,47}, {59,54}, {59,46}, {21,57}, {21,53}, {59,35}, {59,41}, {21,55}, {59,40}, {21,56}, {21,58}, {59,43}, {21,50}, {21,51}, {59,55}, {59,53}, {59,52}, {59,38}, {59,50}, {21,54}, {21,52}, {59,51}, {59,36}, {59,39}, {59,48}, {67,122}, {63,119}, {63,112}, {63,131}, {63,140}, {63,115}, {24,33}, {63,128}, {24,23}, {24,25}, {24,37}, {63,113}, {24,26}, {24,28}, {24,38}, {24,27}, {24,36}, {63,121}, {63,110}, {24,34}, {63,120}, {24,30}, {63,138}, {24,35}, {63,136}, {63,124}, {63,134}, {24,32}, {63,111}, {63,137}, {63,132}, {63,139}, {24,24}, {24,39}, {24,29}, {63,117}, {63,125}, {63,129}, {63,133}, {24,31}, {63,116}, {63,114}, {63,126}, {63,123}, {63,122}, {63,127}, {63,130}, {63,135}, {67,56}, {26,135}, {67,100}, {67,58}, {26,140}, {26,144}, {67,109}, {67,117}, {67,102}, {26,136}, {67,106}, {63,118}, {26,137}, {67,113}, {67,118}, {67,110}, {67,112}, {67,121}, {67,114}, {67,62}, {67,105}, {26,145}, {26,141}, {67,60}, {67,107}, {26,139}, {67,101}, {26,138}, {67,115}, {67,98}, {67,57}, {26,142}, {67,120}, {67,59}, {67,111}, {67,108}, {67,103}, {67,55}, {67,54}, {67,97}, {67,116}, {26,143}, {67,119}, {67,61}, {67,99}, {29,18}, {29,26}, {29,21}, {71,100}, {71,97}, {71,39}, {29,16}, {29,15}, {29,22}, {71,37}, {29,20}, {71,49}, {71,35}, {71,36}, {29,14}, {71,99}, {29,24}, {71,52}, {71,57}, {71,51}, {74,174}, {71,47}, {71,55}, {71,53}, {71,40}, {71,34}, {71,61}, {29,23}, {71,62}, {71,56}, {71,45}, {71,43}, {71,38}, {71,46}, {71,59}, {71,42}, {71,58}, {71,98}, {29,19}, {71,54}, {71,60}, {71,50}, {71,44}, {29,17}, {67,104}, {71,48}, {29,25}, {71,41}, {74,180}, {30,183}, {74,179}, {74,176}, {75,4}, {30,187}, {75,1}, {74,184}, {75,3}, {74,169}, {74,182}, {30,189}, {74,161}, {74,159}, {75,2}, {75,0}, {74,190}, {74,173}, {74,172}, {74,162}, {31,0}, {74,168}, {74,178}, {74,189}, {31,3}, {75,5}, {32,168}, {31,5}, {30,190}, {74,166}, {74,175}, {74,158}, {74,160}, {30,181}, {31,2}, {30,186}, {74,167}, {74,183}, {74,177}, {31,1}, {74,157}, {32,163}, {74,185}, {74,188}, {30,188}, {74,171}, {31,4}, {30,185}, {30,184}, {74,181}, {74,187}, {30,182}, {74,164}, {74,186}, {74,165}, {74,170}, {77,146}, {77,151}, {32,165}, {32,167}, {77,157}, {32,161}, {77,172}, {77,163}, {77,152}, {77,153}, {77,162}, {32,174}, {77,161}, {77,145}, {77,160}, {77,148}, {77,173}, {32,173}, {32,171}, {77,149}, {77,168}, {77,154}, {77,167}, {77,169}, {77,144}, {32,166}, {77,170}, {77,158}, {32,170}, {77,155}, {32,172}, {77,164}, {32,164}, {77,150}, {77,165}, {77,159}, {74,163}, {77,166}, {77,147}, {32,169}, {77,171}, {32,162}, {77,142}, {80,32}, {80,25}, {33,169}, {80,20}, {80,35}, {80,27}, {77,156}, {80,37}, {80,21}, {33,168}, {80,31}, {33,170}, {33,178}, {33,176}, {80,33}, {33,177}, {80,23}, {80,24}, {80,29}, {80,34}, {77,141}, {33,171}, {80,42}, {80,39}, {80,43}, {80,30}, {80,26}, {80,40}, {82,42}, {80,28}, {33,174}, {33,173}, {77,143}, {33,175}, {80,36}, {80,38}, {33,172}, {80,41}, {80,19}, {80,22}, {82,51}, {82,35}, {34,171}, {82,49}, {82,33}, {34,172}, {82,44}, {82,40}, {34,177}, {82,50}, {82,34}, {82,37}, {34,169}, {82,52}, {82,45}, {82,48}, {34,175}, {34,180}, {34,178}, {82,41}, {82,36}, {34,173}, {34,174}, {82,32}, {34,170}, {34,168}, {34,176}, {82,47}, {34,179}, {82,43}, {82,53}, {34,181}, {82,39}, {82,46}, {83,179}, {84,2}, {83,181}, {83,188}, {82,38}, {83,186}, {83,169}, {84,0}, {35,131}, {83,173}, {83,190}, {83,180}, {35,130}, {84,4}, {83,182}, {83,187}, {83,189}, {83,167}, {84,1}, {83,178}, {83,183}, {83,171}, {83,175}, {84,3}, {83,185}, {83,168}, {83,172}, {83,174}, {83,184}, {35,129}, {83,177}, {83,170}, {83,176}, {85,33}, {85,38}, {36,15}, {85,40}, {36,9}, {85,36}, {85,42}, {36,14}, {36,10}, {36,11}, {85,32}, {85,39}, {36,13}, {85,37}, {36,12}, {85,31}, {85,35}, {85,34}, {85,30}, {85,41}, {36,113}, {86,45}, {86,48}, {86,44}, {86,46}, {86,47}, {86,41}, {86,42}, {86,39}, {86,43}, {86,40}, {36,114}, {36,115}, {87,11}, {87,13}, {87,12}, {87,14}, {36,160}, {87,10}, {36,159}, {36,161}, {87,139}, {87,140}, {37,4}, {87,138}, {88,19}, {88,18}, {88,20}, {37,31}, {88,21}, {37,30}, {88,22}, {88,50}, {88,53}, {88,52}, {37,40}, {88,51}, {37,50}, {37,48}, {37,49}, {37,55}, {88,128}, {88,129}, {88,127}, {88,137}, {9,184}, {55,4}, {59,56}, {71,101}, {82,54}, {9,185}, {12,108}, {15,59}, {55,5}, {55,6}, {18,108}, {21,61}, {59,58}, {59,57}, {21,99}, {21,60}, {59,59}, {21,62}, {21,98}, {21,97}, {21,59}, {24,40}, {63,144}, {63,142}, {63,143}, {63,141}, {26,146}, {26,149}, {26,151}, {26,150}, {26,147}, {26,148}, {71,103}, {71,102}, {29,27}, {71,104}, {71,105}, {29,28}, {75,13}, {75,11}, {77,179}, {75,9}, {75,10}, {31,6}, {75,6}, {75,14}, {75,8}, {75,12}, {77,175}, {77,177}, {77,178}, {32,179}, {77,174}, {32,178}, {77,176}, {32,175}, {32,176}, {32,177}, {75,7}, {33,181}, {80,46}, {80,44}, {80,45}, {33,179}, {33,182}, {33,180}, {82,55}, {82,56}, {34,182}, {84,5}, {84,7}, {84,6}, {35,132}, {36,16}, {85,45}, {85,44}, {85,43}, {9,186}, {40,106}, {41,24}, {5,169}, {41,22}, {41,25}, {41,23}, {42,110}, {7,129}, {7,130}, {42,112}, {7,127}, {42,111}, {42,109}, {7,128}, {7,126}, {44,152}, {44,155}, {9,189}, {44,154}, {44,153}, {9,188}, {9,187}, {10,0}, {44,156}, {9,190}, {47,134}, {12,110}, {12,111}, {12,112}, {47,135}, {47,131}, {12,109}, {47,132}, {47,133}, {47,130}, {15,100}, {15,97}, {51,5}, {15,98}, {15,101}, {51,6}, {15,62}, {15,60}, {15,61}, {15,99}, {18,109}, {55,9}, {18,117}, {55,8}, {55,11}, {18,113}, {55,10}, {21,107}, {18,111}, {18,114}, {18,110}, {18,115}, {18,116}, {18,112}, {55,7}, {21,103}, {59,61}, {59,99}, {59,98}, {21,108}, {21,104}, {21,105}, {59,60}, {59,62}, {59,97}, {21,100}, {21,102}, {21,106}, {21,101}, {63,147}, {63,145}, {63,146}, {24,42}, {24,43}, {63,148}, {24,41}, {26,152}, {26,154}, {26,153}, {67,123}, {67,124}, {71,107}, {71,106}, {31,7}, {31,8}, {75,15}, {31,9}, {77,182}, {77,180}, {77,181}, {32,180}, {80,47}, {34,183}, {32,181}, {10,1}, {15,102}, {51,7}, {55,12}, {18,118}, {21,109}, {59,100}, {59,102}, {21,111}, {21,110}, {21,112}, {21,113}, {59,101}, {24,46}, {24,47}, {24,45}, {26,155}, {24,44}, {63,149}, {26,156}, {71,108}, {75,16}, {31,10}, {32,182}, {80,48}, {80,52}, {33,185}, {80,49}, {33,186}, {33,184}, {80,53}, {33,187}, {80,51}, {82,57}, {33,183}, {34,184}, {87,141}, {10,2}, {18,120}, {18,119}, {21,114}, {59,104}, {59,103}, {21,115}, {63,153}, {24,51}, {24,48}, {63,152}, {24,50}, {63,150}, {24,49}, {63,151}, {67,125}, {26,157}, {71,111}, {29,29}, {71,109}, {29,30}, {29,31}, {71,110}, {29,32}, {75,17}, {31,14}, {31,11}, {31,16}, {75,19}, {31,12}, {75,18}, {31,15}, {31,13}, {77,185}, {77,187}, {32,183}, {77,186}, {32,184}, {77,184}, {77,183}, {80,55}, {80,54}, {33,188}, {80,56}, {82,62}, {34,186}, {82,61}, {82,58}, {34,185}, {82,59}, {82,60}, {84,8}, {84,9}, {35,133}, {36,19}, {85,46}, {36,17}, {36,18}, {85,47}, {36,116}, {36,117}, {86,49}, {37,5}, {87,143}, {37,7}, {87,142}, {87,144}, {37,6}, {88,23}, {88,109}, {10,3}, {24,52}, {67,126}, {71,112}, {31,17}, {31,18}, {10,4}, {29,33}, {34,187}, {12,113}, {31,19}, {36,162}, {12,114}, {55,13}, {59,105}, {59,107}, {59,106}, {63,157}, {63,154}, {24,53}, {24,54}, {63,155}, {63,156}, {67,128}, {67,133}, {26,158}, {67,127}, {67,129}, {67,136}, {67,131}, {67,135}, {67,132}, {67,130}, {67,134}, {26,159}, {71,115}, {71,113}, {29,35}, {29,34}, {71,114}, {29,36}, {75,22}, {75,21}, {31,20}, {75,20}, {77,188}, {77,190}, {78,1}, {78,0}, {32,185}, {77,189}, {80,97}, {33,189}, {80,61}, {80,98}, {33,190}, {80,59}, {80,62}, {80,60}, {80,57}, {34,0}, {80,58}, {82,97}, {82,99}, {82,98}, {84,10}, {84,11}, {85,48}, {36,119}, {36,118}, {87,15}, {87,16}, {37,8}, {87,145}, {37,41}, {12,115}, {21,116}, {67,138}, {67,137}, {71,117}, {71,116}, {32,186}, {78,3}, {78,2}, {80,101}, {80,99}, {80,102}, {80,100}, {34,188}, {82,100}, {82,101}, {82,102}, {85,49}, {86,50}, {87,146}, {12,116}, {75,23}, {78,4}, {12,117}, {26,160}, {75,24}, {34,1}, {80,103}, {34,189}, {84,12}, {84,13}, {36,20}, {87,17}, {12,118}, {18,123}, {18,124}, {55,14}, {21,117}, {21,118}, {59,108}, {21,119}, {24,58}, {24,60}, {63,159}, {63,160}, {63,158}, {24,55}, {24,56}, {24,59}, {24,57}, {67,139}, {26,161}, {26,162}, {71,124}, {29,39}, {71,119}, {71,118}, {71,123}, {29,37}, {31,27}, {71,120}, {71,125}, {71,122}, {71,121}, {29,38}, {31,25}, {75,26}, {31,21}, {75,27}, {75,25}, {31,24}, {31,22}, {31,26}, {31,23}, {78,5}, {78,10}, {78,6}, {78,9}, {32,187}, {76,148}, {78,8}, {78,7}, {34,4}, {34,2}, {34,5}, {34,3}, {80,104}, {80,105}, {80,106}, {34,6}, {82,106}, {35,0}, {82,104}, {35,1}, {82,103}, {82,105}, {34,190}, {84,17}, {84,14}, {84,15}, {84,16}, {85,50}, {36,22}, {36,21}, {86,52}, {86,51}, {36,120}, {36,163}, {37,9}, {37,32}, {88,24}, {88,110}, {88,111}, {12,119}, {59,109}, {63,161}, {67,140}, {67,141}, {26,163}, {26,164}, {71,126}, {29,40}, {32,188}, {80,107}, {34,7}, {82,109}, {35,2}, {82,108}, {82,110}, {82,107}, {85,53}, {84,18}, {84,19}, {35,134}, {85,52}, {85,51}, {86,53}, {88,112}, {12,120}, {12,121}, {15,103}, {51,8}, {55,15}, {21,120}, {21,123}, {21,121}, {59,110}, {21,125}, {21,122}, {21,124}, {24,62}, {63,162}, {63,163}, {71,128}, {24,61}, {24,97}, {24,98}, {67,143}, {67,142}, {26,165}, {26,166}, {67,144}, {71,127}, {26,168}, {29,41}, {26,167}, {31,28}, {71,129}, {29,43}, {29,42}, {71,130}, {71,133}, {71,131}, {71,132}, {29,44}, {31,33}, {31,31}, {31,30}, {75,29}, {31,32}, {75,28}, {78,11}, {75,30}, {31,29}, {75,31}, {78,14}, {78,12}, {78,13}, {78,18}, {34,11}, {78,17}, {78,20}, {78,19}, {78,16}, {78,15}, {32,189}, {80,110}, {80,109}, {34,10}, {34,8}, {34,9}, {80,108}, {82,113}, {35,3}, {82,112}, {82,111}, {35,4}, {84,24}, {84,23}, {84,21}, {84,20}, {35,136}, {35,135}, {84,25}, {86,54}, {36,121}, {85,55}, {36,23}, {85,54}, {84,22}, {86,55}, {36,164}, {37,33}, {88,25}, {88,113}, {12,122}, {55,16}, {78,21}, {12,123}, {67,146}, {67,145}, {75,32}, {78,23}, {78,22}, {34,12}, {82,114}, {82,115}, {35,137}, {88,114}, {15,104}, {21,127}, {21,126}, {63,164}, {63,166}, {24,100}, {63,165}, {24,99}, {24,101}, {63,167}, {67,148}, {67,150}, {67,149}, {67,152}, {26,169}, {67,151}, {67,147}, {67,153}, {71,140}, {71,143}, {71,145}, {71,135}, {71,139}, {71,136}, {29,46}, {29,49}, {29,51}, {71,137}, {71,138}, {29,50}, {71,141}, {71,144}, {71,142}, {29,52}, {29,48}, {71,134}, {29,45}, {29,47}, {31,35}, {75,38}, {75,36}, {75,35}, {75,41}, {75,40}, {75,39}, {75,34}, {31,34}, {75,33}, {75,37}, {31,36}, {78,26}, {78,30}, {78,27}, {78,29}, {78,28}, {78,25}, {78,31}, {78,34}, {78,32}, {78,33}, {33,0}, {32,190}, {78,24}, {78,35}, {80,115}, {80,118}, {80,120}, {80,119}, {80,113}, {80,117}, {80,112}, {80,114}, {34,13}, {80,111}, {80,116}, {82,128}, {82,117}, {35,5}, {35,6}, {82,116}, {82,121}, {82,127}, {82,119}, {82,126}, {82,123}, {82,122}, {82,125}, {82,120}, {82,118}, {82,124}, {84,32}, {84,30}, {35,138}, {84,29}, {84,35}, {84,33}, {35,139}, {84,28}, {84,26}, {84,27}, {35,141}, {84,31}, {35,140}, {84,34}, {85,56}, {85,62}, {85,57}, {36,27}, {85,97}, {36,26}, {85,61}, {85,60}, {36,25}, {85,59}, {36,24}, {85,58}, {86,61}, {86,97}, {86,62}, {86,59}, {36,123}, {86,56}, {86,60}, {86,99}, {86,98}, {86,57}, {86,58}, {36,122}, {87,18}, {36,167}, {87,19}, {36,165}, {36,166}, {87,147}, {37,10}, {88,54}, {37,42}, {88,115}, {37,43}, {88,116}, {88,117}, {88,131}, {88,130}, {37,58}, {88,141}, {15,105}, {63,169}, {63,168}, {26,170}, {26,171}, {67,154}, {71,146}, {75,44}, {29,53}, {31,37}, {75,42}, {75,45}, {31,38}, {78,36}, {75,43}, {80,121}, {34,14}, {82,129}, {84,38}, {84,36}, {84,37}, {85,98}, {36,28}, {86,100}, {36,170}, {36,124}, {36,168}, {36,169}, {87,148}, {37,34}, {15,106}, {80,122}, {51,9}, {24,102}, {67,155}, {26,172}, {67,156}, {71,148}, {71,147}, {31,40}, {29,54}, {29,55}, {71,151}, {71,150}, {71,149}, {75,46}, {75,49}, {75,48}, {75,47}, {31,39}, {78,40}, {78,38}, {78,37}, {78,39}, {34,15}, {80,124}, {80,125}, {34,16}, {80,123}, {82,131}, {82,130}, {82,133}, {35,7}, {82,132}, {84,39}, {84,41}, {84,40}, {85,99}, {85,102}, {85,100}, {85,101}, {86,101}, {36,125}, {87,20}, {87,21}, {87,22}, {37,11}, {37,35}, {88,118}, {15,107}, {29,56}, {31,41}, {80,126}, {86,102}, {88,132}, {51,10}, {37,59}, {15,108}, {75,50}, {80,127}, {82,134}, {85,103}, {86,103}, {15,109}, {67,157}, {67,158}, {26,173}, {26,174}, {71,153}, {29,58}, {29,57}, {71,152}, {78,41}, {80,128}, {80,130}, {80,129}, {34,19}, {34,18}, {34,17}, {36,30}, {85,104}, {36,29}, {86,105}, {86,104}, {37,12}, {87,149}, {18,125}, {63,170}, {67,161}, {67,159}, {67,160}, {71,162}, {71,157}, {71,154}, {71,161}, {71,163}, {29,60}, {71,160}, {71,156}, {71,155}, {71,159}, {71,158}, {29,59}, {75,61}, {75,56}, {75,54}, {75,97}, {75,55}, {75,51}, {75,57}, {75,52}, {78,50}, {75,53}, {75,98}, {75,60}, {31,42}, {75,59}, {75,58}, {75,62}, {78,42}, {78,45}, {78,44}, {78,52}, {78,47}, {78,51}, {78,49}, {78,48}, {78,46}, {78,43}, {33,3}, {33,2}, {33,4}, {33,1}, {78,53}, {80,136}, {80,139}, {80,137}, {80,141}, {80,142}, {80,134}, {34,24}, {80,135}, {80,133}, {80,140}, {80,132}, {80,131}, {34,23}, {34,21}, {34,20}, {80,138}, {82,143}, {82,149}, {35,10}, {82,144}, {82,147}, {82,151}, {35,11}, {82,146}, {82,138}, {82,137}, {82,150}, {82,141}, {82,139}, {82,148}, {82,140}, {35,9}, {35,8}, {82,135}, {82,136}, {82,145}, {82,142}, {84,44}, {84,47}, {34,22}, {84,45}, {84,51}, {84,49}, {84,43}, {84,54}, {84,42}, {35,143}, {84,50}, {84,46}, {35,142}, {84,53}, {84,52}, {85,107}, {85,106}, {85,113}, {85,109}, {85,112}, {36,32}, {85,110}, {85,111}, {85,105}, {85,108}, {36,31}, {36,127}, {86,116}, {86,111}, {86,115}, {86,118}, {86,114}, {86,110}, {36,129}, {86,113}, {86,117}, {36,128}, {86,108}, {84,48}, {86,112}, {86,109}, {86,106}, {86,107}, {36,126}, {87,26}, {87,28}, {87,31}, {87,27}, {87,32}, {87,25}, {87,23}, {36,171}, {87,29}, {36,173}, {36,172}, {87,24}, {87,30}, {87,154}, {37,13}, {87,155}, {87,153}, {87,150}, {87,152}, {87,151}, {88,26}, {88,28}, {88,27}, {88,57}, {88,56}, {88,55}, {88,58}, {37,51}, {37,52}, {88,138}, {88,142}, {18,126}, {59,111}, {63,173}, {24,103}, {63,171}, {63,172}, {67,162}, {67,163}, {26,177}, {26,175}, {67,164}, {26,176}, {71,168}, {71,171}, {71,165}, {71,172}, {71,164}, {71,166}, {71,167}, {71,170}, {29,97}, {71,175}, {71,174}, {29,61}, {71,169}, {71,173}, {29,62}, {75,108}, {31,47}, {75,103}, {31,43}, {75,100}, {75,106}, {75,109}, {31,48}, {75,105}, {75,102}, {75,110}, {75,101}, {75,107}, {31,44}, {75,99}, {31,45}, {31,46}, {75,104}, {78,105}, {78,58}, {78,59}, {78,62}, {78,60}, {78,54}, {78,57}, {78,101}, {78,61}, {33,5}, {78,103}, {78,100}, {33,6}, {78,102}, {78,55}, {78,98}, {78,99}, {78,97}, {80,146}, {80,148}, {80,151}, {80,145}, {34,25}, {80,153}, {80,144}, {80,154}, {80,150}, {80,152}, {80,156}, {80,149}, {80,157}, {80,147}, {80,143}, {34,26}, {80,155}, {34,27}, {35,13}, {78,56}, {82,177}, {82,168}, {35,15}, {82,164}, {35,16}, {82,173}, {82,167}, {82,157}, {35,14}, {82,170}, {82,165}, {82,166}, {82,152}, {82,159}, {82,174}, {82,171}, {82,163}, {82,175}, {82,158}, {82,153}, {82,172}, {82,155}, {82,169}, {82,160}, {82,176}, {82,156}, {35,12}, {82,154}, {82,161}, {82,162}, {84,61}, {84,59}, {84,98}, {84,110}, {84,101}, {84,60}, {84,56}, {84,103}, {84,62}, {84,99}, {84,58}, {84,106}, {84,55}, {84,97}, {84,102}, {84,104}, {84,107}, {84,57}, {84,111}, {84,112}, {84,105}, {84,109}, {84,100}, {85,129}, {85,132}, {36,33}, {85,131}, {85,136}, {85,134}, {36,34}, {85,125}, {85,115}, {85,114}, {36,36}, {85,127}, {85,128}, {85,124}, {85,116}, {85,121}, {84,108}, {85,117}, {36,35}, {85,123}, {85,122}, {85,118}, {85,130}, {85,119}, {86,123}, {85,133}, {85,135}, {85,126}, {85,120}, {86,124}, {86,126}, {86,120}, {36,130}, {86,133}, {86,131}, {36,131}, {86,130}, {86,129}, {86,122}, {86,119}, {86,125}, {86,134}, {86,121}, {86,127}, {87,41}, {87,46}, {87,36}, {87,39}, {36,174}, {87,43}, {87,50}, {86,128}, {87,37}, {87,47}, {87,51}, {87,42}, {87,35}, {87,45}, {87,44}, {87,49}, {87,48}, {86,132}, {87,40}, {87,34}, {87,38}, {37,14}, {37,15}, {87,33}, {87,166}, {87,157}, {87,165}, {87,162}, {87,163}, {87,156}, {87,159}, {87,167}, {87,161}, {87,160}, {87,158}, {87,164}, {88,29}, {88,30}, {88,32}, {88,31}, {88,34}, {88,33}, {88,60}, {88,59}, {88,119}, {88,120}, {88,133}, {37,56}, {37,60}, {88,143}, {37,61}, {18,127}, {35,144}, {85,137}, {37,16}, {37,17}, {18,128}, {63,174}, {24,104}, {71,176}, {75,112}, {75,113}, {75,111}, {78,107}, {78,106}, {33,7}, {80,159}, {78,108}, {80,158}, {82,179}, {35,17}, {35,19}, {82,178}, {35,18}, {84,113}, {84,115}, {84,114}, {85,138}, {36,37}, {36,175}, {87,168}, {88,35}, {88,146}, {18,129}, {67,165}, {29,98}, {75,115}, {75,114}, {78,109}, {35,20}, {35,145}, {86,135}, {88,139}, {18,130}, {26,178}, {29,99}, {82,180}, {87,52}, {21,128}, {78,110}, {37,36}, {21,129}, {29,100}, {33,8}, {87,53}, {21,130}, {71,177}, {31,50}, {75,116}, {75,117}, {31,49}, {78,111}, {33,12}, {33,10}, {33,11}, {33,9}, {80,160}, {34,28}, {84,117}, {84,116}, {84,119}, {84,118}, {35,146}, {85,139}, {85,141}, {85,140}, {36,38}, {86,136}, {87,54}, {87,55}, {36,176}, {88,36}, {88,61}, {37,53}, {59,112}, {75,118}, {78,112}, {82,181}, {63,175}, {78,113}, {80,162}, {80,161}, {87,56}, {37,18}, {88,37}, {88,62}, {24,105}, {71,178}, {71,179}, {75,119}, {24,106}, {34,29}, {80,163}, {85,143}, {36,39}, {85,144}, {85,142}, {87,57}, {87,169}, {24,107}, {78,116}, {78,115}, {78,114}, {80,164}, {80,168}, {80,167}, {80,166}, {80,165}, {34,30}, {82,182}, {84,121}, {35,147}, {84,120}, {85,145}, {86,139}, {86,138}, {36,132}, {86,137}, {87,60}, {87,59}, {87,58}, {26,179}, {75,120}, {33,13}, {82,183}, {82,184}, {86,140}, {87,61}, {87,170}, {88,38}, {88,121}, {88,148}, {26,180}, {33,14}, {80,169}, {82,185}, {85,146}, {87,62}, {29,102}, {78,117}, {80,170}, {82,186}, {82,187}, {82,188}, {84,126}, {84,122}, {36,40}, {84,125}, {84,124}, {35,148}, {84,123}, {35,150}, {35,149}, {85,148}, {85,147}, {36,41}, {36,42}, {36,134}, {86,141}, {36,133}, {87,99}, {87,100}, {87,98}, {87,97}, {37,20}, {87,171}, {87,172}, {87,173}, {37,19}, {88,39}, {88,42}, {88,41}, {88,40}, {88,147}, {31,51}, {34,37}, {84,127}, {85,149}, {36,135}, {86,142}, {88,149}, {31,52}, {78,118}, {86,143}, {88,97}, {40,10}, {60,188}, {0,10}, {0,23}, {0,25}, {0,27}, {0,31}, {0,32}, {0,35}, {0,36}, {0,39}, {0,40}, {0,43}, {0,44}, {0,47}, {0,48}, {0,51}, {0,52}, {0,55}, {0,56}, {0,59}, {0,60}, {0,134}, {0,135}, {0,138}, {0,139}, {0,136}, {0,137}, {0,28}, {0,13}, {0,15}, {0,17}, {0,18}, {0,19}, {0,20}, {0,61}, {0,62}, {0,97}, {0,98}, {0,99}, {0,100}, {0,140}, {0,141}, {0,142}, {0,158}, {0,159}, {0,160}, {0,161}, {0,162}, {1,12}, {1,13}, {1,14}, {0,9}, {0,109}, {1,3}, {1,8}, {0,110}, {0,29}, {0,30}, {0,111}, {0,143}, {0,1}, {0,144}, {0,4}, {1,1}, {1,111}, {1,112}, {1,113}, {1,114}, {1,115}, {1,116}, {1,117}, {1,118}, {1,119}, {1,120}, {0,7}, {0,6}, {0,149}, {0,151}, {0,150}, {0,8}, {1,9}, {1,143}, {1,144}, {1,145}, {1,146}, {1,147}, {1,148}, {1,149}, {1,150}, {1,151}, {1,152}, {1,153}, {1,154}, {1,155}, {1,156}, {1,157}, {1,158}, {1,159}, {1,160}, {1,161}, {1,162}, {1,163}, {1,164}, {1,165}, {1,166}, {1,167}, {1,168}, {1,2}, {0,132}, {1,169}, {1,170}, {1,171}, {1,172}, {1,173}, {1,174}, {1,175}, {1,176}, {1,177}, {1,178}, {1,179}, {1,180}, {1,181}, {1,182}, {1,183}, {1,184}, {1,185}, {1,186}, {1,187}, {1,188}, {1,189}, {1,190}, {2,0}, {2,1}, {2,2}, {2,3}, {0,33}, {0,21}, {0,34}, {0,14} }; /* This returns ERROR if the code point doesn't exist. */ long int big5_to_unicode(int r, int c) { assert(r >= 0 && r < 94); assert(c >= 0 && c < 191); return big5_forward[r][c]; } /* This one returns 1 on success, 0 if the code point doesn't exist. */ int unicode_to_big5(long int unicode, int *r, int *c) { int rr, cc; long int uu; int i, j, k; i = -1; j = lenof(big5_backward); while (j - i > 1) { k = (i + j) / 2; rr = big5_backward[k].r; cc = big5_backward[k].c; uu = big5_forward[rr][cc]; if (unicode > uu) i = k; else if (unicode < uu) j = k; else { *r = rr; *c = cc; return 1; } } return 0; } #ifdef TESTMODE #include <stdio.h> int main(void) { int r, c, rr, cc, ret; long int u, uu; /* * N.B. Big5 <-> Unicode round-trip mapping is known not to * work, because of the various duplicate characters: * * - 0xA15A (0,26) and 0xA1C4 (0,132) are both U+FF3F * - 0xA1FE (0,190) and 0xA2AC (1,108) are both U+2571 * - 0xA240 (1,0) and 0xA2AD (1,109) are both U+2572 * - 0xA2CC (1,140) and 0xA451 (3,17) are both U+5341 * - 0xA2CE (1,142) and 0xA4CA (3,138) are both U+5345 */ for (r = 0; r < 94; r++) { for (c = 0; c < 191; c++) { u = big5_to_unicode(r, c); if (u != ERROR) { ret = unicode_to_big5(u, &rr, &cc); if (!ret) printf("(%d,%d) -> U-%08lx but didn't convert back\n", r, c, u); else if (rr != r || cc != c) printf("(%d,%d) -> U-%08lx -> (%d,%d)\n", r, c, u, rr, cc); } } } for (u = 0; u < 0x10000L; u++) { ret = unicode_to_big5(u, &r, &c); if (ret) { uu = big5_to_unicode(r, c); if (uu == ERROR) printf("U-%08lx -> (%d,%d) but didn't convert back\n", u, r, c); else if (uu != u) printf("U-%08lx -> (%d,%d) -> U-%08lx\n", u, r, c, uu); } } return 0; } #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/charset.h�����������������������������������������������������������������������0000644�0001753�0001753�00000017542�12444773746�013220� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * charset.h - header file for general character set conversion * routines. */ #ifndef charset_charset_h #define charset_charset_h #include <stddef.h> /* * Enumeration that lists all the multibyte or single-byte * character sets known to this library. */ typedef enum { CS_NONE, /* used for reporting errors, etc */ CS_ASCII, /* ordinary US-ASCII is worth having! */ CS_ISO8859_1, CS_ISO8859_1_X11, /* X font encoding with VT100 glyphs */ CS_ISO8859_2, CS_ISO8859_3, CS_ISO8859_4, CS_ISO8859_5, CS_ISO8859_6, CS_ISO8859_7, CS_ISO8859_8, CS_ISO8859_9, CS_ISO8859_10, CS_ISO8859_11, CS_ISO8859_13, CS_ISO8859_14, CS_ISO8859_15, CS_ISO8859_16, CS_CP437, CS_CP850, CS_CP852, CS_CP866, CS_CP874, CS_CP1250, CS_CP1251, CS_CP1252, CS_CP1253, CS_CP1254, CS_CP1255, CS_CP1256, CS_CP1257, CS_CP1258, CS_KOI8_R, CS_KOI8_U, CS_KOI8_RU, CS_JISX0201, CS_MAC_ROMAN, CS_MAC_TURKISH, CS_MAC_CROATIAN, CS_MAC_ICELAND, CS_MAC_ROMANIAN, CS_MAC_GREEK, CS_MAC_CYRILLIC, CS_MAC_THAI, CS_MAC_CENTEURO, CS_MAC_SYMBOL, CS_MAC_DINGBATS, CS_MAC_ROMAN_OLD, CS_MAC_CROATIAN_OLD, CS_MAC_ICELAND_OLD, CS_MAC_ROMANIAN_OLD, CS_MAC_GREEK_OLD, CS_MAC_CYRILLIC_OLD, CS_MAC_UKRAINE, CS_MAC_VT100, CS_MAC_VT100_OLD, CS_VISCII, CS_HP_ROMAN8, CS_DEC_MCS, CS_UTF8, CS_UTF7, CS_UTF7_CONSERVATIVE, CS_UTF16, CS_UTF16BE, CS_UTF16LE, CS_EUC_JP, CS_EUC_CN, CS_EUC_KR, CS_ISO2022_JP, CS_ISO2022_KR, CS_BIG5, CS_SHIFT_JIS, CS_HZ, CS_CP949, CS_PDF, CS_PSSTD, CS_CTEXT, CS_ISO2022, CS_BS4730, CS_DEC_GRAPHICS, CS_EUC_TW, CS_LIMIT /* dummy value indicating extent of enum */ } charset_t; typedef struct { unsigned long s0, s1; } charset_state; /* * This macro is used to initialise a charset_state structure: * * charset_state mystate = CHARSET_INIT_STATE; */ #define CHARSET_INIT_STATE { 0L, 0L } /* a suitable initialiser */ /* * This external variable contains the same data, but is provided * for easy structure-copy assignment: * * mystate = charset_init_state; */ extern const charset_state charset_init_state; /* * Routine to convert a MB/SB character set to Unicode. * * This routine accepts some number of bytes, updates a state * variable, and outputs some number of Unicode characters. There * are no guarantees. You can't even guarantee that at most one * Unicode character will be output per byte you feed in; for * example, suppose you're reading UTF-8, you've seen E1 80, and * then you suddenly see FE. Now you need to output _two_ error * characters - one for the incomplete sequence E1 80, and one for * the completely invalid UTF-8 byte FE. * * Returns the number of wide characters output; will never output * more than the size of the buffer (as specified on input). * Advances the `input' pointer and decrements `inlen', to indicate * how far along the input string it got. * * The sequence of `errlen' wide characters pointed to by `errstr' * will be used to indicate a conversion error. If `errstr' is * NULL, `errlen' will be ignored, and the library will choose * something sensible to do on its own. For Unicode, this will be * U+FFFD (REPLACEMENT CHARACTER). * * `output' may be NULL, in which case the entire translation will * be performed in theory (e.g. a dry run to work out how much * space needs to be allocated for the real thing). `outlen' may * also be negative, indicating an unlimited buffer length * (although this is almost certainly unwise if `output' is _not_ * NULL). */ int charset_to_unicode(const char **input, int *inlen, wchar_t *output, int outlen, int charset, charset_state *state, const wchar_t *errstr, int errlen); /* * Routine to convert Unicode to an MB/SB character set. * * This routine accepts some number of Unicode characters, updates * a state variable, and outputs some number of bytes. * * Returns the number of bytes output; will never output more than * the size of the buffer (as specified on input), and will never * output a partial MB character. Advances the `input' pointer and * decrements `inlen', to indicate how far along the input string * it got. * * If `error' is non-NULL and a character is found which cannot be * expressed in the output charset, conversion will terminate at * that character (so `input' points to the offending character) * and `*error' will be set to TRUE; if `error' is non-NULL and no * difficult characters are encountered, `*error' will be set to * FALSE. If `error' is NULL, difficult characters will simply be * ignored. * * If `input' is NULL, this routine will output the necessary bytes * to reset the encoding state in any way which might be required * at the end of an output piece of text. * * `output' may be NULL, in which case the entire translation will * be performed in theory (e.g. a dry run to work out how much * space needs to be allocated for the real thing). `outlen' may * also be negative, indicating an unlimited buffer length * (although this is almost certainly unwise if `output' is _not_ * NULL). */ int charset_from_unicode(const wchar_t **input, int *inlen, char *output, int outlen, int charset, charset_state *state, int *error); /* * Convert X11 encoding names to and from our charset identifiers. */ const char *charset_to_xenc(int charset); int charset_from_xenc(const char *name); /* * Convert MIME encoding names to and from our charset identifiers. */ const char *charset_to_mimeenc(int charset); int charset_from_mimeenc(const char *name); /* * Convert our own encoding names to and from our charset * identifiers. */ const char *charset_to_localenc(int charset); int charset_from_localenc(const char *name); int charset_localenc_nth(int n); /* * Convert Mac OS script/region/font to our charset identifiers. */ int charset_from_macenc(int script, int region, int sysvers, const char *fontname); /* * Convert GNU Emacs coding system symbol to and from our charset * identifiers. */ const char *charset_to_emacsenc(int charset); int charset_from_emacsenc(const char *name); /* * Upgrade a charset identifier to a superset charset which is * often confused with it. For example, people whose MUAs report * their mail as ASCII or ISO8859-1 often in practice turn out to * be using CP1252 quote characters, so when parsing incoming mail * it is prudent to treat ASCII and ISO8859-1 as aliases for CP1252 * - and since it's a superset of both, this will cause no * genuinely correct mail to be parsed wrongly. */ int charset_upgrade(int charset); /* * This function returns TRUE if the input charset is a vaguely * sensible superset of ASCII. That is, it returns FALSE for 7-bit * encoding formats such as HZ and UTF-7. */ int charset_contains_ascii(int charset); /* * This function tries to deduce the CS_* identifier of the charset * used in the current C locale. It falls back to CS_ASCII if it * can't figure it out at all, so it will always return a valid * charset. * * (Note that you should have already called setlocale(LC_CTYPE, * "") to guarantee that this function will do the right thing.) */ int charset_from_locale(void); /* * This function simply reports whether a charset identifier * corresponds to an actually usable charset. Not everything in the * above enum does: CS_NONE, for a start, and occasionally other slots * in the enum are reserved before they actually go into service. * * This function permits clients to iterate over _all_ supported * charsets by means of a loop such as * * for (cs = 0; cs < CS_LIMIT; cs++) * if (charset_exists(cs)) * do_stuff_with(cs); */ int charset_exists(int charset); #endif /* charset_charset_h */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/cns11643.c����������������������������������������������������������������������0000644�0001753�0001753�00003476737�12444773746�012766� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * CNS 11643 implementation for libcharset. (This is the character set * itself, not any particular multibyte encoding of it. Multibyte * encodings of this character set are handled separately.) */ #include <assert.h> #include "charset.h" #include "internal.h" /* * There are two versions of CNS 11643, the 1986 one and the 1992 one. * The 1986 version has three 94x94 planes of characters; the 1992 version * has seven. * * Planes 1 and 2 appear to be identical between them. Plane 3 in the * 1992 version was apparently derived from plane 14 in the 1986 one, * but had more characters. * * Code tables for the 1992 standard are available from the ISO-IR. * * The 1992 standard contains: * Plane 1: 5401 hanzi, plus some other stuff * Plane 2: 7650 hanzi * Plane 3: 6148 hanzi * Plane 4: 7298 hanzi * Plane 5: 8603 hanzi * Plane 6: 6388 hanzi * Plane 7: 6539 hanzi * * There are two sources of Unicode conversion tables: * http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/CNS11643.TXT * and * http://www.unicode.org/Public/UNIDATA/Unihan.txt * * CNS11643.TXT is for the 1986 standard, so it only covers the first * two and a bit planes. Unihan (in its kIRG_TSource tag) covers all * seven planes of the 1992 standard, but only worries about the * hanzi. We thus use both. * * One code point in CNS 11643, 0x46E3B, is referenced twice in Unihan, at * U+4695 and U+278AE. We map it to the former. * * IRG source T3 includes not only plane 3 but also "some additional * characters". We filter out the latter. * * First, extract the non-hanzi from CNS11643.TXT: grep -v '^#' CNS11643.TXT | grep -v '<CJK>' > CNS.TXT * Then, extract the hanzi from Unihan.txt, converting to the usual * Unicode format as we go: grep -v '^#' Unihan.txt | sed -n \ 's/^U+\([0-9A-F]*\).kIRG_TSource.\([0-9A-F]\)-\([0-9A-F]*\)$/0x\2\3 0x\1/p' \ | grep -v ' 0x278AE$' | grep -v '^0x36[4567]' >> CNS.TXT * Mappings that are claimed as duplicates in CNS11643.TXT, but which have * compatibility mappings now. cat <<EOF >> CNS.TXT 0x1243E 0x3038 # HANGZHOU NUMERAL TEN 0x1243F 0x3039 # HANGZHOU NUMERAL TWENTY 0x12440 0x303A # HANGZHOU NUMERAL THIRTY EOF perl -e 'map printf("0x%05X\t0x%04X\n",$_+0x12721,$_+0x2F00),(0..6)'>>CNS.TXT perl -e 'map printf("0x%05X\t0x%04X\n",$_+0x12721,$_+0x2F00),(8..13)'>>CNS.TXT perl -e 'map printf("0x%05X\t0x%04X\n",$_+0x12721,$_+0x2F00),(15..18)'>>CNS.TXT perl -e 'map printf("0x%05X\t0x%04X\n",$_+0x12721,$_+0x2F00),(20..32)'>>CNS.TXT perl -e 'map printf("0x%05X\t0x%04X\n",$_+0x12721,$_+0x2F01),(33..93)'>>CNS.TXT perl -e 'map printf("0x%05X\t0x%04X\n",$_+0x12821,$_+0x2F5F),(0..93)'>>CNS.TXT perl -e 'map printf("0x%05X\t0x%04X\n",$_+0x12921,$_+0x2FBD),(0..24)'>>CNS.TXT */ /* * These tables are generated from CNS.TXT generated above. */ /* * I'm about to rely on the magic value ERROR not being above 0xFFFF. */ enum { compile_time_assertion = 1 / ((ERROR &~ 0xFFFF) == 0) }; /* * Mapping from CNS 11643 to Unicode. For these purposes each plane is * considered to be a 94x94 square array, with coordinates running * from (0,0) to (93,93). * * Since Unicode values used in this character set are bounded * above by 0x30000, we can store 18 rather than 32 bits per entry. * We do this by having two separate tables, one storing 16 bits * per entry and another storing 2. * * The first table is generated by running the following sh+Perl * over CNS.TXT: cat CNS.TXT | \ perl -ne '$a{$1,hex$2,hex$3}=hex$4 if /^0x(\S)(\S\S)(\S\S)\s+0x(\S+)\s/;' \ -e 'END {$o=" "; for $p (0..6) { for $r (0..93) { for $c (0..93) {' \ -e '$k=$a{$p+1,$r+33,$c+33};' \ -e '$o .= (defined $k ? sprintf"0x%04x, ", $k & 0xFFFF : " ERROR, ");' \ -e '(print "$o\n"), $o=" " if length $o > 70; } } } print "$o\n"; }' */ static const unsigned short cns11643_forward_16[7*94*94] = { 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x30fb, 0xff1b, 0xff1a, 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xfe51, 0xfe52, 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xfe31, 0x2014, 0xfe32, 0x2013, ERROR, ERROR, ERROR, ERROR, 0xff08, 0xff09, 0xfe35, 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39, 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d, 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41, 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, 0x301e, 0x2032, 0x2035, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105, 0x203e, ERROR, 0xff3f, ERROR, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e, 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7, 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267, 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe66, 0xfe65, 0x223c, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2192, 0x2190, 0x2196, 0x2197, 0x2199, 0x2198, 0x2016, 0xff5c, 0xff0f, 0xff3c, 0x2215, 0xfe68, 0xff04, 0xffe5, 0x3012, 0xffe0, 0xffe1, 0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5, 0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4, 0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7, 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a, 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500, 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x256e, 0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3, 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x3038, 0x3039, 0x303a, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02d9, 0x02c9, 0x02ca, 0x02c7, 0x02cb, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x2f00, 0x2f01, 0x2f02, 0x2f03, 0x2f04, 0x2f05, 0x2f06, 0x4ea0, 0x2f08, 0x2f09, 0x2f0a, 0x2f0b, 0x2f0c, 0x2f0d, 0x51ab, 0x2f0f, 0x2f10, 0x2f11, 0x2f12, 0x52f9, 0x2f14, 0x2f15, 0x2f16, 0x2f17, 0x2f18, 0x2f19, 0x2f1a, 0x2f1b, 0x2f1c, 0x2f1d, 0x2f1e, 0x2f1f, 0x2f20, 0x2f22, 0x2f23, 0x2f24, 0x2f25, 0x2f26, 0x2f27, 0x2f28, 0x2f29, 0x2f2a, 0x2f2b, 0x2f2c, 0x2f2d, 0x2f2e, 0x2f2f, 0x2f30, 0x2f31, 0x2f32, 0x2f33, 0x2f34, 0x2f35, 0x2f36, 0x2f37, 0x2f38, 0x2f39, 0x2f3a, 0x2f3b, 0x2f3c, 0x2f3d, 0x2f3e, 0x2f3f, 0x2f40, 0x2f41, 0x2f42, 0x2f43, 0x2f44, 0x2f45, 0x2f46, 0x2f47, 0x2f48, 0x2f49, 0x2f4a, 0x2f4b, 0x2f4c, 0x2f4d, 0x2f4e, 0x2f4f, 0x2f50, 0x2f51, 0x2f52, 0x2f53, 0x2f54, 0x2f55, 0x2f56, 0x2f57, 0x2f58, 0x2f59, 0x2f5a, 0x2f5b, 0x2f5c, 0x2f5d, 0x2f5e, 0x2f5f, 0x2f60, 0x2f61, 0x2f62, 0x2f63, 0x2f64, 0x2f65, 0x2f66, 0x2f67, 0x2f68, 0x2f69, 0x2f6a, 0x2f6b, 0x2f6c, 0x2f6d, 0x2f6e, 0x2f6f, 0x2f70, 0x2f71, 0x2f72, 0x2f73, 0x2f74, 0x2f75, 0x2f76, 0x2f77, 0x2f78, 0x2f79, 0x2f7a, 0x2f7b, 0x2f7c, 0x2f7d, 0x2f7e, 0x2f7f, 0x2f80, 0x2f81, 0x2f82, 0x2f83, 0x2f84, 0x2f85, 0x2f86, 0x2f87, 0x2f88, 0x2f89, 0x2f8a, 0x2f8b, 0x2f8c, 0x2f8d, 0x2f8e, 0x2f8f, 0x2f90, 0x2f91, 0x2f92, 0x2f93, 0x2f94, 0x2f95, 0x2f96, 0x2f97, 0x2f98, 0x2f99, 0x2f9a, 0x2f9b, 0x2f9c, 0x2f9d, 0x2f9e, 0x2f9f, 0x2fa0, 0x2fa1, 0x2fa2, 0x2fa3, 0x2fa4, 0x2fa5, 0x2fa6, 0x2fa7, 0x2fa8, 0x2fa9, 0x2faa, 0x2fab, 0x2fac, 0x2fad, 0x2fae, 0x2faf, 0x2fb0, 0x2fb1, 0x2fb2, 0x2fb3, 0x2fb4, 0x2fb5, 0x2fb6, 0x2fb7, 0x2fb8, 0x2fb9, 0x2fba, 0x2fbb, 0x2fbc, 0x2fbd, 0x2fbe, 0x2fbf, 0x2fc0, 0x2fc1, 0x2fc2, 0x2fc3, 0x2fc4, 0x2fc5, 0x2fc6, 0x2fc7, 0x2fc8, 0x2fc9, 0x2fca, 0x2fcb, 0x2fcc, 0x2fcd, 0x2fce, 0x2fcf, 0x2fd0, 0x2fd1, 0x2fd2, 0x2fd3, 0x2fd4, 0x2fd5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, 0x2408, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x240e, 0x240f, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415, 0x2416, 0x2417, 0x2418, 0x2419, 0x241a, 0x241b, 0x241c, 0x241d, 0x241e, 0x241f, 0x2421, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x4e00, 0x4e59, 0x4e01, 0x4e03, 0x4e43, 0x4e5d, 0x4e86, 0x4e8c, 0x4eba, 0x513f, 0x5165, 0x516b, 0x51e0, 0x5200, 0x5201, 0x529b, 0x5315, 0x5341, 0x535c, 0x53c8, 0x4e09, 0x4e0b, 0x4e08, 0x4e0a, 0x4e2b, 0x4e38, 0x51e1, 0x4e45, 0x4e48, 0x4e5f, 0x4e5e, 0x4e8e, 0x4ea1, 0x5140, 0x5203, 0x52fa, 0x5343, 0x53c9, 0x53e3, 0x571f, 0x58eb, 0x5915, 0x5927, 0x5973, 0x5b50, 0x5b51, 0x5b53, 0x5bf8, 0x5c0f, 0x5c22, 0x5c38, 0x5c71, 0x5ddd, 0x5de5, 0x5df1, 0x5df2, 0x5df3, 0x5dfe, 0x5e72, 0x5efe, 0x5f0b, 0x5f13, 0x624d, 0x4e11, 0x4e10, 0x4e0d, 0x4e2d, 0x4e30, 0x4e39, 0x4e4b, 0x5c39, 0x4e88, 0x4e91, 0x4e95, 0x4e92, 0x4e94, 0x4ea2, 0x4ec1, 0x4ec0, 0x4ec3, 0x4ec6, 0x4ec7, 0x4ecd, 0x4eca, 0x4ecb, 0x4ec4, 0x5143, 0x5141, 0x5167, 0x516d, 0x516e, 0x516c, 0x5197, 0x51f6, 0x5206, 0x5207, 0x5208, 0x52fb, 0x52fe, 0x52ff, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, 0x535e, 0x5384, 0x53cb, 0x53ca, 0x53cd, 0x58ec, 0x5929, 0x592b, 0x592a, 0x592d, 0x5b54, 0x5c11, 0x5c24, 0x5c3a, 0x5c6f, 0x5df4, 0x5e7b, 0x5eff, 0x5f14, 0x5f15, 0x5fc3, 0x6208, 0x6236, 0x624b, 0x624e, 0x652f, 0x6587, 0x6597, 0x65a4, 0x65b9, 0x65e5, 0x66f0, 0x6708, 0x6728, 0x6b20, 0x6b62, 0x6b79, 0x6bcb, 0x6bd4, 0x6bdb, 0x6c0f, 0x6c34, 0x706b, 0x722a, 0x7236, 0x723b, 0x7247, 0x7259, 0x725b, 0x72ac, 0x738b, 0x4e19, 0x4e16, 0x4e15, 0x4e14, 0x4e18, 0x4e3b, 0x4e4d, 0x4e4f, 0x4e4e, 0x4ee5, 0x4ed8, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ee3, 0x4ee4, 0x4ed9, 0x4ede, 0x5145, 0x5144, 0x5189, 0x518a, 0x51ac, 0x51f9, 0x51fa, 0x51f8, 0x520a, 0x52a0, 0x529f, 0x5305, 0x5306, 0x5317, 0x531d, 0x4edf, 0x534a, 0x5349, 0x5361, 0x5360, 0x536f, 0x536e, 0x53bb, 0x53ef, 0x53e4, 0x53f3, 0x53ec, 0x53ee, 0x53e9, 0x53e8, 0x53fc, 0x53f8, 0x53f5, 0x53eb, 0x53e6, 0x53ea, 0x53f2, 0x53f1, 0x53f0, 0x53e5, 0x53ed, 0x53fb, 0x56db, 0x56da, 0x5916, 0x592e, 0x5931, 0x5974, 0x5976, 0x5b55, 0x5b83, 0x5c3c, 0x5de8, 0x5de7, 0x5de6, 0x5e02, 0x5e03, 0x5e73, 0x5e7c, 0x5f01, 0x5f18, 0x5f17, 0x5fc5, 0x620a, 0x6253, 0x6254, 0x6252, 0x6251, 0x65a5, 0x65e6, 0x672e, 0x672c, 0x672a, 0x672b, 0x672d, 0x6b63, 0x6bcd, 0x6c11, 0x6c10, 0x6c38, 0x6c41, 0x6c40, 0x6c3e, 0x72af, 0x7384, 0x7389, 0x74dc, 0x74e6, 0x7518, 0x751f, 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758b, 0x767d, 0x76ae, 0x76bf, 0x76ee, 0x77db, 0x77e2, 0x77f3, 0x793a, 0x79be, 0x7a74, 0x7acb, 0x4e1e, 0x4e1f, 0x4e52, 0x4e53, 0x4e69, 0x4e99, 0x4ea4, 0x4ea6, 0x4ea5, 0x4eff, 0x4f09, 0x4f19, 0x4f0a, 0x4f15, 0x4f0d, 0x4f10, 0x4f11, 0x4f0f, 0x4ef2, 0x4ef6, 0x4efb, 0x4ef0, 0x4ef3, 0x4efd, 0x4f01, 0x4f0b, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0x5171, 0x518d, 0x51b0, 0x5217, 0x5211, 0x5212, 0x520e, 0x5216, 0x52a3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540f, 0x540c, 0x540a, 0x5410, 0x5401, 0x540b, 0x5404, 0x5411, 0x540d, 0x5408, 0x5403, 0x540e, 0x5406, 0x5412, 0x56e0, 0x56de, 0x56dd, 0x5733, 0x5730, 0x5728, 0x572d, 0x572c, 0x572f, 0x5729, 0x5919, 0x591a, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597d, 0x5979, 0x5982, 0x5981, 0x5b57, 0x5b58, 0x5b87, 0x5b88, 0x5b85, 0x5b89, 0x5bfa, 0x5c16, 0x5c79, 0x5dde, 0x5e06, 0x5e76, 0x5e74, 0x5f0f, 0x5f1b, 0x5fd9, 0x5fd6, 0x620e, 0x620c, 0x620d, 0x6210, 0x6263, 0x625b, 0x6258, 0x6536, 0x65e9, 0x65e8, 0x65ec, 0x65ed, 0x66f2, 0x66f3, 0x6709, 0x673d, 0x6734, 0x6731, 0x6735, 0x6b21, 0x6b64, 0x6b7b, 0x6c16, 0x6c5d, 0x6c57, 0x6c59, 0x6c5f, 0x6c60, 0x6c50, 0x6c55, 0x6c61, 0x6c5b, 0x6c4d, 0x6c4e, 0x7070, 0x725f, 0x725d, 0x767e, 0x7af9, 0x7c73, 0x7cf8, 0x7f36, 0x7f8a, 0x7fbd, 0x8001, 0x8003, 0x800c, 0x8012, 0x8033, 0x807f, 0x8089, 0x808b, 0x808c, 0x81e3, 0x81ea, 0x81f3, 0x81fc, 0x820c, 0x821b, 0x821f, 0x826e, 0x8272, 0x827e, 0x866b, 0x8840, 0x884c, 0x8863, 0x897f, 0x9621, 0x4e32, 0x4ea8, 0x4f4d, 0x4f4f, 0x4f47, 0x4f57, 0x4f5e, 0x4f34, 0x4f5b, 0x4f55, 0x4f30, 0x4f50, 0x4f51, 0x4f3d, 0x4f3a, 0x4f38, 0x4f43, 0x4f54, 0x4f3c, 0x4f46, 0x4f63, 0x4f5c, 0x4f60, 0x4f2f, 0x4f4e, 0x4f36, 0x4f59, 0x4f5d, 0x4f48, 0x4f5a, 0x514c, 0x514b, 0x514d, 0x5175, 0x51b6, 0x51b7, 0x5225, 0x5224, 0x5229, 0x522a, 0x5228, 0x52ab, 0x52a9, 0x52aa, 0x52ac, 0x5323, 0x5373, 0x5375, 0x541d, 0x542d, 0x541e, 0x543e, 0x5426, 0x544e, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541b, 0x5429, 0x544a, 0x5439, 0x543b, 0x5438, 0x542e, 0x5435, 0x5436, 0x5420, 0x543c, 0x5440, 0x5431, 0x542b, 0x541f, 0x542c, 0x56ea, 0x56f0, 0x56e4, 0x56eb, 0x574a, 0x5751, 0x5740, 0x574d, 0x5747, 0x574e, 0x573e, 0x5750, 0x574f, 0x573b, 0x58ef, 0x593e, 0x599d, 0x5992, 0x59a8, 0x599e, 0x59a3, 0x5999, 0x5996, 0x598d, 0x59a4, 0x5993, 0x598a, 0x59a5, 0x5b5d, 0x5b5c, 0x5b5a, 0x5b5b, 0x5b8c, 0x5b8b, 0x5b8f, 0x5c2c, 0x5c40, 0x5c41, 0x5c3f, 0x5c3e, 0x5c90, 0x5c91, 0x5c94, 0x5c8c, 0x5deb, 0x5e0c, 0x5e8f, 0x5e87, 0x5e8a, 0x5ef7, 0x5f04, 0x5f1f, 0x5f64, 0x5f62, 0x5f77, 0x5f79, 0x5fd8, 0x5fcc, 0x5fd7, 0x5fcd, 0x5ff1, 0x5feb, 0x5ff8, 0x5fea, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626d, 0x628a, 0x627c, 0x627e, 0x6279, 0x6273, 0x6292, 0x626f, 0x6298, 0x626e, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653b, 0x6538, 0x65f1, 0x66f4, 0x675f, 0x674e, 0x674f, 0x6750, 0x6751, 0x675c, 0x6756, 0x675e, 0x6749, 0x6746, 0x6760, 0x6753, 0x6757, 0x6b65, 0x6bcf, 0x6c42, 0x6c5e, 0x6c99, 0x6c81, 0x6c88, 0x6c89, 0x6c85, 0x6c9b, 0x6c6a, 0x6c7a, 0x6c90, 0x6c70, 0x6c8c, 0x6c68, 0x6c96, 0x6c92, 0x6c7d, 0x6c83, 0x6c72, 0x6c7e, 0x6c74, 0x6c86, 0x6c76, 0x6c8d, 0x6c94, 0x6c98, 0x6c82, 0x7076, 0x707c, 0x707d, 0x7078, 0x7262, 0x7261, 0x7260, 0x72c4, 0x72c2, 0x7396, 0x752c, 0x752b, 0x7537, 0x7538, 0x7682, 0x76ef, 0x77e3, 0x79c1, 0x79c0, 0x79bf, 0x7a76, 0x7cfb, 0x7f55, 0x8096, 0x8093, 0x809d, 0x8098, 0x809b, 0x809a, 0x80b2, 0x826f, 0x8292, 0x828b, 0x828d, 0x898b, 0x89d2, 0x8a00, 0x8c37, 0x8c46, 0x8c55, 0x8c9d, 0x8d64, 0x8d70, 0x8db3, 0x8eab, 0x8eca, 0x8f9b, 0x8fb0, 0x8fc2, 0x8fc6, 0x8fc5, 0x8fc4, 0x5de1, 0x9091, 0x90a2, 0x90aa, 0x90a6, 0x90a3, 0x9149, 0x91c6, 0x91cc, 0x9632, 0x962e, 0x9631, 0x962a, 0x962c, 0x4e26, 0x4e56, 0x4e73, 0x4e8b, 0x4e9b, 0x4e9e, 0x4eab, 0x4eac, 0x4f6f, 0x4f9d, 0x4f8d, 0x4f73, 0x4f7f, 0x4f6c, 0x4f9b, 0x4f8b, 0x4f86, 0x4f83, 0x4f70, 0x4f75, 0x4f88, 0x4f69, 0x4f7b, 0x4f96, 0x4f7e, 0x4f8f, 0x4f91, 0x4f7a, 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51bd, 0x51fd, 0x523b, 0x5238, 0x5237, 0x523a, 0x5230, 0x522e, 0x5236, 0x5241, 0x52be, 0x52bb, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53d6, 0x53d4, 0x53d7, 0x5473, 0x5475, 0x5496, 0x5478, 0x5495, 0x5480, 0x547b, 0x5477, 0x5484, 0x5492, 0x5486, 0x547c, 0x5490, 0x5471, 0x5476, 0x548c, 0x549a, 0x5462, 0x5468, 0x548b, 0x547d, 0x548e, 0x56fa, 0x5783, 0x5777, 0x576a, 0x5769, 0x5761, 0x5766, 0x5764, 0x577c, 0x591c, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59be, 0x59bb, 0x59d4, 0x59b9, 0x59ae, 0x59d1, 0x59c6, 0x59d0, 0x59cd, 0x59cb, 0x59d3, 0x59ca, 0x59af, 0x59b3, 0x59d2, 0x59c5, 0x5b5f, 0x5b64, 0x5b63, 0x5b97, 0x5b9a, 0x5b98, 0x5b9c, 0x5b99, 0x5b9b, 0x5c1a, 0x5c48, 0x5c45, 0x5c46, 0x5cb7, 0x5ca1, 0x5cb8, 0x5ca9, 0x5cab, 0x5cb1, 0x5cb3, 0x5e18, 0x5e1a, 0x5e16, 0x5e15, 0x5e1b, 0x5e11, 0x5e78, 0x5e9a, 0x5e97, 0x5e9c, 0x5e95, 0x5e96, 0x5ef6, 0x5f26, 0x5f27, 0x5f29, 0x5f80, 0x5f81, 0x5f7f, 0x5f7c, 0x5fdd, 0x5fe0, 0x5ffd, 0x5ff5, 0x5fff, 0x600f, 0x6014, 0x602f, 0x6035, 0x6016, 0x602a, 0x6015, 0x6021, 0x6027, 0x6029, 0x602b, 0x601b, 0x6216, 0x6215, 0x623f, 0x623e, 0x6240, 0x627f, 0x62c9, 0x62cc, 0x62c4, 0x62bf, 0x62c2, 0x62b9, 0x62d2, 0x62db, 0x62ab, 0x62d3, 0x62d4, 0x62cb, 0x62c8, 0x62a8, 0x62bd, 0x62bc, 0x62d0, 0x62d9, 0x62c7, 0x62cd, 0x62b5, 0x62da, 0x62b1, 0x62d8, 0x62d6, 0x62d7, 0x62c6, 0x62ac, 0x62ce, 0x653e, 0x65a7, 0x65bc, 0x65fa, 0x6614, 0x6613, 0x660c, 0x6606, 0x6602, 0x660e, 0x6600, 0x660f, 0x6615, 0x660a, 0x6607, 0x670d, 0x670b, 0x676d, 0x678b, 0x6795, 0x6771, 0x679c, 0x6773, 0x6777, 0x6787, 0x679d, 0x6797, 0x676f, 0x6770, 0x677f, 0x6789, 0x677e, 0x6790, 0x6775, 0x679a, 0x6793, 0x677c, 0x676a, 0x6772, 0x6b23, 0x6b66, 0x6b67, 0x6b7f, 0x6c13, 0x6c1b, 0x6ce3, 0x6ce8, 0x6cf3, 0x6cb1, 0x6ccc, 0x6ce5, 0x6cb3, 0x6cbd, 0x6cbe, 0x6cbc, 0x6ce2, 0x6cab, 0x6cd5, 0x6cd3, 0x6cb8, 0x6cc4, 0x6cb9, 0x6cc1, 0x6cae, 0x6cd7, 0x6cc5, 0x6cf1, 0x6cbf, 0x6cbb, 0x6ce1, 0x6cdb, 0x6cca, 0x6cac, 0x6cef, 0x6cdc, 0x6cd6, 0x6ce0, 0x7095, 0x708e, 0x7092, 0x708a, 0x7099, 0x722c, 0x722d, 0x7238, 0x7248, 0x7267, 0x7269, 0x72c0, 0x72ce, 0x72d9, 0x72d7, 0x72d0, 0x73a9, 0x73a8, 0x739f, 0x73ab, 0x73a5, 0x753d, 0x759d, 0x7599, 0x759a, 0x7684, 0x76c2, 0x76f2, 0x76f4, 0x77e5, 0x77fd, 0x793e, 0x7940, 0x7941, 0x79c9, 0x79c8, 0x7a7a, 0x7a79, 0x7afa, 0x7cfe, 0x7f54, 0x7f8c, 0x7f8b, 0x8005, 0x80ba, 0x80a5, 0x80a2, 0x80b1, 0x80a1, 0x80ab, 0x80a9, 0x80b4, 0x80aa, 0x80af, 0x81e5, 0x81fe, 0x820d, 0x82b3, 0x829d, 0x8299, 0x82ad, 0x82bd, 0x829f, 0x82b9, 0x82b1, 0x82ac, 0x82a5, 0x82af, 0x82b8, 0x82a3, 0x82b0, 0x82be, 0x82b7, 0x864e, 0x8671, 0x521d, 0x8868, 0x8ecb, 0x8fce, 0x8fd4, 0x8fd1, 0x90b5, 0x90b8, 0x90b1, 0x90b6, 0x91c7, 0x91d1, 0x9577, 0x9580, 0x961c, 0x9640, 0x963f, 0x963b, 0x9644, 0x9642, 0x96b9, 0x96e8, 0x9752, 0x975e, 0x4e9f, 0x4ead, 0x4eae, 0x4fe1, 0x4fb5, 0x4faf, 0x4fbf, 0x4fe0, 0x4fd1, 0x4fcf, 0x4fdd, 0x4fc3, 0x4fb6, 0x4fd8, 0x4fdf, 0x4fca, 0x4fd7, 0x4fae, 0x4fd0, 0x4fc4, 0x4fc2, 0x4fda, 0x4fce, 0x4fde, 0x4fb7, 0x5157, 0x5192, 0x5191, 0x51a0, 0x524e, 0x5243, 0x524a, 0x524d, 0x524c, 0x524b, 0x5247, 0x52c7, 0x52c9, 0x52c3, 0x52c1, 0x530d, 0x5357, 0x537b, 0x539a, 0x53db, 0x54ac, 0x54c0, 0x54a8, 0x54ce, 0x54c9, 0x54b8, 0x54a6, 0x54b3, 0x54c7, 0x54c2, 0x54bd, 0x54aa, 0x54c1, 0x54c4, 0x54c8, 0x54af, 0x54ab, 0x54b1, 0x54bb, 0x54a9, 0x54a7, 0x54bf, 0x56ff, 0x5782, 0x578b, 0x57a0, 0x57a3, 0x57a2, 0x57ce, 0x57ae, 0x5793, 0x5955, 0x5951, 0x594f, 0x594e, 0x5950, 0x59dc, 0x59d8, 0x59ff, 0x59e3, 0x59e8, 0x5a03, 0x59e5, 0x59ea, 0x59da, 0x59e6, 0x5a01, 0x59fb, 0x5b69, 0x5ba3, 0x5ba6, 0x5ba4, 0x5ba2, 0x5ba5, 0x5c01, 0x5c4e, 0x5c4f, 0x5c4d, 0x5c4b, 0x5cd9, 0x5cd2, 0x5df7, 0x5e1d, 0x5e25, 0x5e1f, 0x5e7d, 0x5ea0, 0x5ea6, 0x5efa, 0x5f08, 0x5f2d, 0x5f65, 0x5f88, 0x5f85, 0x5f8a, 0x5f8b, 0x5f87, 0x5f8c, 0x5f89, 0x6012, 0x601d, 0x6020, 0x6025, 0x600e, 0x6028, 0x604d, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606c, 0x606b, 0x606a, 0x6064, 0x6241, 0x62dc, 0x6316, 0x6309, 0x62fc, 0x62ed, 0x6301, 0x62ee, 0x62fd, 0x6307, 0x62f1, 0x62f7, 0x62ef, 0x62ec, 0x62fe, 0x62f4, 0x6311, 0x6302, 0x653f, 0x6545, 0x65ab, 0x65bd, 0x65e2, 0x6625, 0x662d, 0x6620, 0x6627, 0x662f, 0x661f, 0x6628, 0x6631, 0x6624, 0x66f7, 0x67ff, 0x67d3, 0x67f1, 0x67d4, 0x67d0, 0x67ec, 0x67b6, 0x67af, 0x67f5, 0x67e9, 0x67ef, 0x67c4, 0x67d1, 0x67b4, 0x67da, 0x67e5, 0x67b8, 0x67cf, 0x67de, 0x67f3, 0x67b0, 0x67d9, 0x67e2, 0x67dd, 0x67d2, 0x6b6a, 0x6b83, 0x6b86, 0x6bb5, 0x6bd2, 0x6bd7, 0x6c1f, 0x6cc9, 0x6d0b, 0x6d32, 0x6d2a, 0x6d41, 0x6d25, 0x6d0c, 0x6d31, 0x6d1e, 0x6d17, 0x6d3b, 0x6d3d, 0x6d3e, 0x6d36, 0x6d1b, 0x6cf5, 0x6d39, 0x6d27, 0x6d38, 0x6d29, 0x6d2e, 0x6d35, 0x6d0e, 0x6d2b, 0x70ab, 0x70ba, 0x70b3, 0x70ac, 0x70af, 0x70ad, 0x70b8, 0x70ae, 0x70a4, 0x7230, 0x7272, 0x726f, 0x7274, 0x72e9, 0x72e0, 0x72e1, 0x73b7, 0x73ca, 0x73bb, 0x73b2, 0x73cd, 0x73c0, 0x73b3, 0x751a, 0x752d, 0x754f, 0x754c, 0x754e, 0x754b, 0x75ab, 0x75a4, 0x75a5, 0x75a2, 0x75a3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76c8, 0x76c6, 0x76c3, 0x76c5, 0x7701, 0x76f9, 0x76f8, 0x7709, 0x770b, 0x76fe, 0x76fc, 0x7707, 0x77dc, 0x7802, 0x7814, 0x780c, 0x780d, 0x7946, 0x7949, 0x7948, 0x7947, 0x79b9, 0x79ba, 0x79d1, 0x79d2, 0x79cb, 0x7a7f, 0x7a81, 0x7aff, 0x7afd, 0x7c7d, 0x7d02, 0x7d05, 0x7d00, 0x7d09, 0x7d07, 0x7d04, 0x7d06, 0x7f38, 0x7f8e, 0x7fbf, 0x8010, 0x800d, 0x8011, 0x8036, 0x80d6, 0x80e5, 0x80da, 0x80c3, 0x80c4, 0x80cc, 0x80e1, 0x80db, 0x80ce, 0x80de, 0x80e4, 0x80dd, 0x81f4, 0x8222, 0x82e7, 0x8303, 0x8305, 0x82e3, 0x82db, 0x82e6, 0x8304, 0x82e5, 0x8302, 0x8309, 0x82d2, 0x82d7, 0x82f1, 0x8301, 0x82dc, 0x82d4, 0x82d1, 0x82de, 0x82d3, 0x82df, 0x82ef, 0x8306, 0x8650, 0x8679, 0x867b, 0x867a, 0x884d, 0x886b, 0x8981, 0x89d4, 0x8a08, 0x8a02, 0x8a03, 0x8c9e, 0x8ca0, 0x8d74, 0x8d73, 0x8db4, 0x8ecd, 0x8ecc, 0x8ff0, 0x8fe6, 0x8fe2, 0x8fea, 0x8fe5, 0x8fed, 0x8feb, 0x8fe4, 0x8fe8, 0x90ca, 0x90ce, 0x90c1, 0x90c3, 0x914b, 0x914a, 0x91cd, 0x9582, 0x9650, 0x964b, 0x964c, 0x964d, 0x9762, 0x9769, 0x97cb, 0x97ed, 0x97f3, 0x9801, 0x98a8, 0x98db, 0x98df, 0x9996, 0x9999, 0x4e58, 0x4eb3, 0x500c, 0x500d, 0x5023, 0x4fef, 0x5026, 0x5025, 0x4ff8, 0x5029, 0x5016, 0x5006, 0x503c, 0x501f, 0x501a, 0x5012, 0x5011, 0x4ffa, 0x5000, 0x5014, 0x5028, 0x4ff1, 0x5021, 0x500b, 0x5019, 0x5018, 0x4ff3, 0x4fee, 0x502d, 0x502a, 0x4ffe, 0x502b, 0x5009, 0x517c, 0x51a4, 0x51a5, 0x51a2, 0x51cd, 0x51cc, 0x51c6, 0x51cb, 0x5256, 0x525c, 0x5254, 0x525b, 0x525d, 0x532a, 0x537f, 0x539f, 0x539d, 0x53df, 0x54e8, 0x5510, 0x5501, 0x5537, 0x54fc, 0x54e5, 0x54f2, 0x5506, 0x54fa, 0x5514, 0x54e9, 0x54ed, 0x54e1, 0x5509, 0x54ee, 0x54ea, 0x54e6, 0x5527, 0x5507, 0x54fd, 0x550f, 0x5703, 0x5704, 0x57c2, 0x57d4, 0x57cb, 0x57c3, 0x5809, 0x590f, 0x5957, 0x5958, 0x595a, 0x5a11, 0x5a18, 0x5a1c, 0x5a1f, 0x5a1b, 0x5a13, 0x59ec, 0x5a20, 0x5a23, 0x5a29, 0x5a25, 0x5a0c, 0x5a09, 0x5b6b, 0x5c58, 0x5bb0, 0x5bb3, 0x5bb6, 0x5bb4, 0x5bae, 0x5bb5, 0x5bb9, 0x5bb8, 0x5c04, 0x5c51, 0x5c55, 0x5c50, 0x5ced, 0x5cfd, 0x5cfb, 0x5cea, 0x5ce8, 0x5cf0, 0x5cf6, 0x5d01, 0x5cf4, 0x5dee, 0x5e2d, 0x5e2b, 0x5eab, 0x5ead, 0x5ea7, 0x5f31, 0x5f92, 0x5f91, 0x5f90, 0x6059, 0x6063, 0x6065, 0x6050, 0x6055, 0x606d, 0x6069, 0x606f, 0x6084, 0x609f, 0x609a, 0x608d, 0x6094, 0x608c, 0x6085, 0x6096, 0x6247, 0x62f3, 0x6308, 0x62ff, 0x634e, 0x633e, 0x632f, 0x6355, 0x6342, 0x6346, 0x634f, 0x6349, 0x633a, 0x6350, 0x633d, 0x632a, 0x632b, 0x6328, 0x634d, 0x634c, 0x6548, 0x6549, 0x6599, 0x65c1, 0x65c5, 0x6642, 0x6649, 0x664f, 0x6643, 0x6652, 0x664c, 0x6645, 0x6641, 0x66f8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68b3, 0x6817, 0x684c, 0x6851, 0x683d, 0x67f4, 0x6850, 0x6840, 0x683c, 0x6843, 0x682a, 0x6845, 0x6813, 0x6818, 0x6841, 0x6b8a, 0x6b89, 0x6bb7, 0x6c23, 0x6c27, 0x6c28, 0x6c26, 0x6c24, 0x6cf0, 0x6d6a, 0x6d95, 0x6d88, 0x6d87, 0x6d66, 0x6d78, 0x6d77, 0x6d59, 0x6d93, 0x6d6c, 0x6d89, 0x6d6e, 0x6d5a, 0x6d74, 0x6d69, 0x6d8c, 0x6d8a, 0x6d79, 0x6d85, 0x6d65, 0x6d94, 0x70ca, 0x70d8, 0x70e4, 0x70d9, 0x70c8, 0x70cf, 0x7239, 0x7279, 0x72fc, 0x72f9, 0x72fd, 0x72f8, 0x72f7, 0x7386, 0x73ed, 0x7409, 0x73ee, 0x73e0, 0x73ea, 0x73de, 0x7554, 0x755d, 0x755c, 0x755a, 0x7559, 0x75be, 0x75c5, 0x75c7, 0x75b2, 0x75b3, 0x75bd, 0x75bc, 0x75b9, 0x75c2, 0x75b8, 0x768b, 0x76b0, 0x76ca, 0x76cd, 0x76ce, 0x7729, 0x771f, 0x7720, 0x7728, 0x77e9, 0x7830, 0x7827, 0x7838, 0x781d, 0x7834, 0x7837, 0x7825, 0x782d, 0x7820, 0x781f, 0x7832, 0x7955, 0x7950, 0x7960, 0x795f, 0x7956, 0x795e, 0x795d, 0x7957, 0x795a, 0x79e4, 0x79e3, 0x79e7, 0x79df, 0x79e6, 0x79e9, 0x79d8, 0x7a84, 0x7a88, 0x7ad9, 0x7b06, 0x7b11, 0x7c89, 0x7d21, 0x7d17, 0x7d0b, 0x7d0a, 0x7d20, 0x7d22, 0x7d14, 0x7d10, 0x7d15, 0x7d1a, 0x7d1c, 0x7d0d, 0x7d19, 0x7d1b, 0x7f3a, 0x7f5f, 0x7f94, 0x7fc5, 0x7fc1, 0x8006, 0x8004, 0x8018, 0x8015, 0x8019, 0x8017, 0x803d, 0x803f, 0x80f1, 0x8102, 0x80f0, 0x8105, 0x80ed, 0x80f4, 0x8106, 0x80f8, 0x80f3, 0x8108, 0x80fd, 0x810a, 0x80fc, 0x80ef, 0x81ed, 0x81ec, 0x8200, 0x8210, 0x822a, 0x822b, 0x8228, 0x822c, 0x82bb, 0x832b, 0x8352, 0x8354, 0x834a, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834f, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, 0x8654, 0x868a, 0x86aa, 0x8693, 0x86a4, 0x86a9, 0x868c, 0x86a3, 0x869c, 0x8870, 0x8877, 0x8881, 0x8882, 0x887d, 0x8879, 0x8a18, 0x8a10, 0x8a0e, 0x8a0c, 0x8a15, 0x8a0a, 0x8a17, 0x8a13, 0x8a16, 0x8a0f, 0x8a11, 0x8c48, 0x8c7a, 0x8c79, 0x8ca1, 0x8ca2, 0x8d77, 0x8eac, 0x8ed2, 0x8ed4, 0x8ecf, 0x8fb1, 0x9001, 0x9006, 0x8ff7, 0x9000, 0x8ffa, 0x8ff4, 0x9003, 0x8ffd, 0x9005, 0x8ff8, 0x9095, 0x90e1, 0x90dd, 0x90e2, 0x9152, 0x914d, 0x914c, 0x91d8, 0x91dd, 0x91d7, 0x91dc, 0x91d9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965b, 0x965d, 0x9664, 0x9658, 0x965e, 0x96bb, 0x98e2, 0x99ac, 0x9aa8, 0x9ad8, 0x9b25, 0x9b32, 0x9b3c, 0x4e7e, 0x507a, 0x507d, 0x505c, 0x5047, 0x5043, 0x504c, 0x505a, 0x5049, 0x5065, 0x5076, 0x504e, 0x5055, 0x5075, 0x5074, 0x5077, 0x504f, 0x500f, 0x506f, 0x506d, 0x515c, 0x5195, 0x51f0, 0x526a, 0x526f, 0x52d2, 0x52d9, 0x52d8, 0x52d5, 0x5310, 0x530f, 0x5319, 0x533f, 0x5340, 0x533e, 0x53c3, 0x66fc, 0x5546, 0x556a, 0x5566, 0x5544, 0x555e, 0x5561, 0x5543, 0x554a, 0x5531, 0x5556, 0x554f, 0x5555, 0x552f, 0x5564, 0x5538, 0x552e, 0x555c, 0x552c, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570b, 0x5709, 0x57df, 0x5805, 0x580a, 0x5806, 0x57e0, 0x57e4, 0x57fa, 0x5802, 0x5835, 0x57f7, 0x57f9, 0x5920, 0x5962, 0x5a36, 0x5a41, 0x5a49, 0x5a66, 0x5a6a, 0x5a40, 0x5a3c, 0x5a62, 0x5a5a, 0x5a46, 0x5a4a, 0x5b70, 0x5bc7, 0x5bc5, 0x5bc4, 0x5bc2, 0x5bbf, 0x5bc6, 0x5c09, 0x5c08, 0x5c07, 0x5c60, 0x5c5c, 0x5c5d, 0x5d07, 0x5d06, 0x5d0e, 0x5d1b, 0x5d16, 0x5d22, 0x5d11, 0x5d29, 0x5d14, 0x5d19, 0x5d24, 0x5d27, 0x5d17, 0x5de2, 0x5e38, 0x5e36, 0x5e33, 0x5e37, 0x5eb7, 0x5eb8, 0x5eb6, 0x5eb5, 0x5ebe, 0x5f35, 0x5f37, 0x5f57, 0x5f6c, 0x5f69, 0x5f6b, 0x5f97, 0x5f99, 0x5f9e, 0x5f98, 0x5fa1, 0x5fa0, 0x5f9c, 0x607f, 0x60a3, 0x6089, 0x60a0, 0x60a8, 0x60cb, 0x60b4, 0x60e6, 0x60bd, 0x60c5, 0x60bb, 0x60b5, 0x60dc, 0x60bc, 0x60d8, 0x60d5, 0x60c6, 0x60df, 0x60b8, 0x60da, 0x60c7, 0x621a, 0x621b, 0x6248, 0x63a0, 0x63a7, 0x6372, 0x6396, 0x63a2, 0x63a5, 0x6377, 0x6367, 0x6398, 0x63aa, 0x6371, 0x63a9, 0x6389, 0x6383, 0x639b, 0x636b, 0x63a8, 0x6384, 0x6388, 0x6399, 0x63a1, 0x63ac, 0x6392, 0x638f, 0x6380, 0x637b, 0x6369, 0x6368, 0x637a, 0x655d, 0x6556, 0x6551, 0x6559, 0x6557, 0x555f, 0x654f, 0x6558, 0x6555, 0x6554, 0x659c, 0x659b, 0x65ac, 0x65cf, 0x65cb, 0x65cc, 0x65ce, 0x665d, 0x665a, 0x6664, 0x6668, 0x6666, 0x665e, 0x66f9, 0x52d7, 0x671b, 0x6881, 0x68af, 0x68a2, 0x6893, 0x68b5, 0x687f, 0x6876, 0x68b1, 0x68a7, 0x6897, 0x68b0, 0x6883, 0x68c4, 0x68ad, 0x6886, 0x6885, 0x6894, 0x689d, 0x68a8, 0x689f, 0x68a1, 0x6882, 0x6b32, 0x6bba, 0x6beb, 0x6bec, 0x6c2b, 0x6d8e, 0x6dbc, 0x6df3, 0x6dd9, 0x6db2, 0x6de1, 0x6dcc, 0x6de4, 0x6dfb, 0x6dfa, 0x6e05, 0x6dc7, 0x6dcb, 0x6daf, 0x6dd1, 0x6dae, 0x6dde, 0x6df9, 0x6db8, 0x6df7, 0x6df5, 0x6dc5, 0x6dd2, 0x6e1a, 0x6db5, 0x6dda, 0x6deb, 0x6dd8, 0x6dea, 0x6df1, 0x6dee, 0x6de8, 0x6dc6, 0x6dc4, 0x6daa, 0x6dec, 0x6dbf, 0x6de6, 0x70f9, 0x7109, 0x710a, 0x70fd, 0x70ef, 0x723d, 0x727d, 0x7281, 0x731c, 0x731b, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740a, 0x7403, 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 0x74f7, 0x751c, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758f, 0x75d4, 0x75d5, 0x75b5, 0x75ca, 0x75cd, 0x768e, 0x76d4, 0x76d2, 0x76db, 0x7737, 0x773e, 0x773c, 0x7736, 0x7738, 0x773a, 0x786b, 0x7843, 0x784e, 0x7965, 0x7968, 0x796d, 0x79fb, 0x7a92, 0x7a95, 0x7b20, 0x7b28, 0x7b1b, 0x7b2c, 0x7b26, 0x7b19, 0x7b1e, 0x7b2e, 0x7c92, 0x7c97, 0x7c95, 0x7d46, 0x7d43, 0x7d71, 0x7d2e, 0x7d39, 0x7d3c, 0x7d40, 0x7d30, 0x7d33, 0x7d44, 0x7d2f, 0x7d42, 0x7d32, 0x7d31, 0x7f3d, 0x7f9e, 0x7f9a, 0x7fcc, 0x7fce, 0x7fd2, 0x801c, 0x804a, 0x8046, 0x812f, 0x8116, 0x8123, 0x812b, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838e, 0x839e, 0x8398, 0x8378, 0x83a2, 0x8396, 0x83bd, 0x83ab, 0x8392, 0x838a, 0x8393, 0x8389, 0x83a0, 0x8377, 0x837b, 0x837c, 0x8386, 0x83a7, 0x8655, 0x5f6a, 0x86c7, 0x86c0, 0x86b6, 0x86c4, 0x86b5, 0x86c6, 0x86cb, 0x86b1, 0x86af, 0x86c9, 0x8853, 0x889e, 0x8888, 0x88ab, 0x8892, 0x8896, 0x888d, 0x888b, 0x8993, 0x898f, 0x8a2a, 0x8a1d, 0x8a23, 0x8a25, 0x8a31, 0x8a2d, 0x8a1f, 0x8a1b, 0x8a22, 0x8c49, 0x8c5a, 0x8ca9, 0x8cac, 0x8cab, 0x8ca8, 0x8caa, 0x8ca7, 0x8d67, 0x8d66, 0x8dbe, 0x8dba, 0x8edb, 0x8edf, 0x9019, 0x900d, 0x901a, 0x9017, 0x9023, 0x901f, 0x901d, 0x9010, 0x9015, 0x901e, 0x9020, 0x900f, 0x9022, 0x9016, 0x901b, 0x9014, 0x90e8, 0x90ed, 0x90fd, 0x9157, 0x91ce, 0x91f5, 0x91e6, 0x91e3, 0x91e7, 0x91ed, 0x91e9, 0x9589, 0x966a, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966c, 0x96c0, 0x96ea, 0x96e9, 0x7ae0, 0x7adf, 0x9802, 0x9803, 0x9b5a, 0x9ce5, 0x9e75, 0x9e7f, 0x9ea5, 0x9ebb, 0x50a2, 0x508d, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509a, 0x6700, 0x51f1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52de, 0x52dd, 0x52db, 0x535a, 0x53a5, 0x557b, 0x5580, 0x55a7, 0x557c, 0x558a, 0x559d, 0x5598, 0x5582, 0x559c, 0x55aa, 0x5594, 0x5587, 0x558b, 0x5583, 0x55b3, 0x55ae, 0x559f, 0x553e, 0x55b2, 0x559a, 0x55bb, 0x55ac, 0x55b1, 0x557e, 0x5589, 0x55ab, 0x5599, 0x570d, 0x582f, 0x582a, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581d, 0x5820, 0x58f9, 0x58fa, 0x5960, 0x5a77, 0x5a9a, 0x5a7f, 0x5a92, 0x5a9b, 0x5aa7, 0x5b73, 0x5b71, 0x5bd2, 0x5bcc, 0x5bd3, 0x5bd0, 0x5c0a, 0x5c0b, 0x5c31, 0x5d4c, 0x5d50, 0x5d34, 0x5d47, 0x5dfd, 0x5e45, 0x5e3d, 0x5e40, 0x5e43, 0x5e7e, 0x5eca, 0x5ec1, 0x5ec2, 0x5ec4, 0x5f3c, 0x5f6d, 0x5fa9, 0x5faa, 0x5fa8, 0x60d1, 0x60e1, 0x60b2, 0x60b6, 0x60e0, 0x611c, 0x6123, 0x60fa, 0x6115, 0x60f0, 0x60fb, 0x60f4, 0x6168, 0x60f1, 0x610e, 0x60f6, 0x6109, 0x6100, 0x6112, 0x621f, 0x6249, 0x63a3, 0x638c, 0x63cf, 0x63c0, 0x63e9, 0x63c9, 0x63c6, 0x63cd, 0x63d2, 0x63e3, 0x63d0, 0x63e1, 0x63d6, 0x63ed, 0x63ee, 0x6376, 0x63f4, 0x63ea, 0x63db, 0x6452, 0x63da, 0x63f9, 0x655e, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65af, 0x666e, 0x6670, 0x6674, 0x6676, 0x666f, 0x6691, 0x667a, 0x667e, 0x6677, 0x66fe, 0x66ff, 0x671f, 0x671d, 0x68fa, 0x68d5, 0x68e0, 0x68d8, 0x68d7, 0x6905, 0x68df, 0x68f5, 0x68ee, 0x68e7, 0x68f9, 0x68d2, 0x68f2, 0x68e3, 0x68cb, 0x68cd, 0x690d, 0x6912, 0x690e, 0x68c9, 0x68da, 0x696e, 0x68fb, 0x6b3e, 0x6b3a, 0x6b3d, 0x6b98, 0x6b96, 0x6bbc, 0x6bef, 0x6c2e, 0x6c2f, 0x6c2c, 0x6e2f, 0x6e38, 0x6e54, 0x6e21, 0x6e32, 0x6e67, 0x6e4a, 0x6e20, 0x6e25, 0x6e23, 0x6e1b, 0x6e5b, 0x6e58, 0x6e24, 0x6e56, 0x6e6e, 0x6e2d, 0x6e26, 0x6e6f, 0x6e34, 0x6e4d, 0x6e3a, 0x6e2c, 0x6e43, 0x6e1d, 0x6e3e, 0x6ecb, 0x6e89, 0x6e19, 0x6e4e, 0x6e63, 0x6e44, 0x6e72, 0x6e69, 0x6e5f, 0x7119, 0x711a, 0x7126, 0x7130, 0x7121, 0x7136, 0x716e, 0x711c, 0x724c, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743a, 0x742a, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742f, 0x741b, 0x7426, 0x7428, 0x7525, 0x7526, 0x756b, 0x756a, 0x75e2, 0x75db, 0x75e3, 0x75d9, 0x75d8, 0x75de, 0x75e0, 0x767b, 0x767c, 0x7696, 0x7693, 0x76b4, 0x76dc, 0x774f, 0x77ed, 0x785d, 0x786c, 0x786f, 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 0x7a97, 0x7a96, 0x7ae5, 0x7ae3, 0x7b49, 0x7b56, 0x7b46, 0x7b50, 0x7b52, 0x7b54, 0x7b4d, 0x7b4b, 0x7b4f, 0x7b51, 0x7c9f, 0x7ca5, 0x7d5e, 0x7d50, 0x7d68, 0x7d55, 0x7d2b, 0x7d6e, 0x7d72, 0x7d61, 0x7d66, 0x7d62, 0x7d70, 0x7d73, 0x5584, 0x7fd4, 0x7fd5, 0x800b, 0x8052, 0x8085, 0x8155, 0x8154, 0x814b, 0x8151, 0x814e, 0x8139, 0x8146, 0x813e, 0x814c, 0x8153, 0x8174, 0x8212, 0x821c, 0x83e9, 0x8403, 0x83f8, 0x840d, 0x83e0, 0x83c5, 0x840b, 0x83c1, 0x83ef, 0x83f1, 0x83f4, 0x8457, 0x840a, 0x83f0, 0x840c, 0x83cc, 0x83fd, 0x83f2, 0x83ca, 0x8438, 0x840e, 0x8404, 0x83dc, 0x8407, 0x83d4, 0x83df, 0x865b, 0x86df, 0x86d9, 0x86ed, 0x86d4, 0x86db, 0x86e4, 0x86d0, 0x86de, 0x8857, 0x88c1, 0x88c2, 0x88b1, 0x8983, 0x8996, 0x8a3b, 0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41, 0x8a54, 0x8a5b, 0x8a50, 0x8a46, 0x8a34, 0x8a3a, 0x8a36, 0x8a56, 0x8c61, 0x8c82, 0x8caf, 0x8cbc, 0x8cb3, 0x8cbd, 0x8cc1, 0x8cbb, 0x8cc0, 0x8cb4, 0x8cb7, 0x8cb6, 0x8cbf, 0x8cb8, 0x8d8a, 0x8d85, 0x8d81, 0x8dce, 0x8ddd, 0x8dcb, 0x8dda, 0x8dd1, 0x8dcc, 0x8ddb, 0x8dc6, 0x8efb, 0x8ef8, 0x8efc, 0x8f9c, 0x902e, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90f5, 0x9109, 0x90fe, 0x9163, 0x9165, 0x91cf, 0x9214, 0x9215, 0x9223, 0x9209, 0x921e, 0x920d, 0x9210, 0x9207, 0x9211, 0x9594, 0x958f, 0x958b, 0x9591, 0x9593, 0x9592, 0x958e, 0x968a, 0x968e, 0x968b, 0x967d, 0x9685, 0x9686, 0x968d, 0x9672, 0x9684, 0x96c1, 0x96c5, 0x96c4, 0x96c6, 0x96c7, 0x96ef, 0x96f2, 0x97cc, 0x9805, 0x9806, 0x9808, 0x98e7, 0x98ea, 0x98ef, 0x98e9, 0x98f2, 0x98ed, 0x99ae, 0x99ad, 0x9ec3, 0x9ecd, 0x9ed1, 0x4e82, 0x50ad, 0x50b5, 0x50b2, 0x50b3, 0x50c5, 0x50be, 0x50ac, 0x50b7, 0x50bb, 0x50af, 0x50c7, 0x527f, 0x5277, 0x527d, 0x52df, 0x52e6, 0x52e4, 0x52e2, 0x52e3, 0x532f, 0x55df, 0x55e8, 0x55d3, 0x55e6, 0x55ce, 0x55dc, 0x55c7, 0x55d1, 0x55e3, 0x55e4, 0x55ef, 0x55da, 0x55e1, 0x55c5, 0x55c6, 0x55e5, 0x55c9, 0x5712, 0x5713, 0x585e, 0x5851, 0x5858, 0x5857, 0x585a, 0x5854, 0x586b, 0x584c, 0x586d, 0x584a, 0x5862, 0x5852, 0x584b, 0x5967, 0x5ac1, 0x5ac9, 0x5acc, 0x5abe, 0x5abd, 0x5abc, 0x5ab3, 0x5ac2, 0x5ab2, 0x5d69, 0x5d6f, 0x5e4c, 0x5e79, 0x5ec9, 0x5ec8, 0x5f12, 0x5f59, 0x5fac, 0x5fae, 0x611a, 0x610f, 0x6148, 0x611f, 0x60f3, 0x611b, 0x60f9, 0x6101, 0x6108, 0x614e, 0x614c, 0x6144, 0x614d, 0x613e, 0x6134, 0x6127, 0x610d, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643e, 0x641e, 0x642a, 0x642d, 0x643d, 0x642c, 0x640f, 0x641c, 0x6414, 0x640d, 0x6436, 0x6416, 0x6417, 0x6406, 0x656c, 0x659f, 0x65b0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668d, 0x6703, 0x6994, 0x696d, 0x695a, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694a, 0x6968, 0x696b, 0x695e, 0x6953, 0x6979, 0x6986, 0x695d, 0x6963, 0x695b, 0x6b47, 0x6b72, 0x6bc0, 0x6bbf, 0x6bd3, 0x6bfd, 0x6ea2, 0x6eaf, 0x6ed3, 0x6eb6, 0x6ec2, 0x6e90, 0x6e9d, 0x6ec7, 0x6ec5, 0x6ea5, 0x6e98, 0x6ebc, 0x6eba, 0x6eab, 0x6ed1, 0x6e96, 0x6e9c, 0x6ec4, 0x6ed4, 0x6eaa, 0x6ea7, 0x6eb4, 0x714e, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715c, 0x716c, 0x7166, 0x714c, 0x7165, 0x715e, 0x7146, 0x7168, 0x7156, 0x723a, 0x7252, 0x7337, 0x7345, 0x733f, 0x733e, 0x746f, 0x745a, 0x7455, 0x745f, 0x745e, 0x7441, 0x743f, 0x7459, 0x745b, 0x745c, 0x7576, 0x7578, 0x7600, 0x75f0, 0x7601, 0x75f2, 0x75f1, 0x75fa, 0x75ff, 0x75f4, 0x75f3, 0x76de, 0x76df, 0x775b, 0x776b, 0x7766, 0x775e, 0x7763, 0x7779, 0x776a, 0x776c, 0x775c, 0x7765, 0x7768, 0x7762, 0x77ee, 0x788e, 0x78b0, 0x7897, 0x7898, 0x788c, 0x7889, 0x787c, 0x7891, 0x7893, 0x787f, 0x797a, 0x797f, 0x7981, 0x842c, 0x79bd, 0x7a1c, 0x7a1a, 0x7a20, 0x7a14, 0x7a1f, 0x7a1e, 0x7a9f, 0x7aa0, 0x7b77, 0x7bc0, 0x7b60, 0x7b6e, 0x7b67, 0x7cb1, 0x7cb3, 0x7cb5, 0x7d93, 0x7d79, 0x7d91, 0x7d81, 0x7d8f, 0x7d5b, 0x7f6e, 0x7f69, 0x7f6a, 0x7f72, 0x7fa9, 0x7fa8, 0x7fa4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 0x8179, 0x817a, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843d, 0x8431, 0x8475, 0x8466, 0x846b, 0x8449, 0x846c, 0x845b, 0x843c, 0x8435, 0x8461, 0x8463, 0x8469, 0x846d, 0x8446, 0x865e, 0x865c, 0x865f, 0x86f9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86fe, 0x86fb, 0x8702, 0x8703, 0x8706, 0x870a, 0x8859, 0x88df, 0x88d4, 0x88d9, 0x88dc, 0x88d8, 0x88dd, 0x88e1, 0x88ca, 0x88d5, 0x88d2, 0x899c, 0x89e3, 0x8a6b, 0x8a72, 0x8a73, 0x8a66, 0x8a69, 0x8a70, 0x8a87, 0x8a7c, 0x8a63, 0x8aa0, 0x8a71, 0x8a85, 0x8a6d, 0x8a62, 0x8a6e, 0x8a6c, 0x8a79, 0x8a7b, 0x8a3e, 0x8a68, 0x8c62, 0x8c8a, 0x8c89, 0x8cca, 0x8cc7, 0x8cc8, 0x8cc4, 0x8cb2, 0x8cc3, 0x8cc2, 0x8cc5, 0x8de1, 0x8ddf, 0x8de8, 0x8def, 0x8df3, 0x8dfa, 0x8dea, 0x8de4, 0x8de6, 0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a, 0x8f9f, 0x8fb2, 0x904b, 0x904a, 0x9053, 0x9042, 0x9054, 0x903c, 0x9055, 0x9050, 0x9047, 0x904f, 0x904e, 0x904d, 0x9051, 0x903e, 0x9041, 0x9112, 0x9117, 0x916c, 0x916a, 0x9169, 0x91c9, 0x9237, 0x9257, 0x9238, 0x923d, 0x9240, 0x923e, 0x925b, 0x924b, 0x9264, 0x9251, 0x9234, 0x9249, 0x924d, 0x9245, 0x9239, 0x923f, 0x925a, 0x9598, 0x9698, 0x9694, 0x9695, 0x96cd, 0x96cb, 0x96c9, 0x96ca, 0x96f7, 0x96fb, 0x96f9, 0x96f6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980a, 0x9812, 0x980c, 0x98fc, 0x98f4, 0x98fd, 0x98fe, 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e, 0x9f13, 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da, 0x50d5, 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, 0x51f3, 0x5283, 0x5282, 0x5331, 0x53ad, 0x55fe, 0x5600, 0x561b, 0x5617, 0x55fd, 0x5614, 0x5606, 0x5609, 0x560d, 0x560e, 0x55f7, 0x5616, 0x561f, 0x5608, 0x5610, 0x55f6, 0x5718, 0x5716, 0x5875, 0x587e, 0x5883, 0x5893, 0x588a, 0x5879, 0x5885, 0x587d, 0x58fd, 0x5925, 0x5922, 0x5924, 0x596a, 0x5969, 0x5ae1, 0x5ae6, 0x5ae9, 0x5ad7, 0x5ad6, 0x5ad8, 0x5ae3, 0x5b75, 0x5bde, 0x5be7, 0x5be1, 0x5be5, 0x5be6, 0x5be8, 0x5be2, 0x5be4, 0x5bdf, 0x5c0d, 0x5c62, 0x5d84, 0x5d87, 0x5e5b, 0x5e63, 0x5e55, 0x5e57, 0x5e54, 0x5ed3, 0x5ed6, 0x5f0a, 0x5f46, 0x5f70, 0x5fb9, 0x6147, 0x613f, 0x614b, 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158, 0x6175, 0x622a, 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f, 0x647a, 0x6451, 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1, 0x65d7, 0x65d6, 0x66a2, 0x66a8, 0x669d, 0x699c, 0x69a8, 0x6995, 0x69c1, 0x69ae, 0x69d3, 0x69cb, 0x699b, 0x69b7, 0x69bb, 0x69ab, 0x69b4, 0x69d0, 0x69cd, 0x69ad, 0x69cc, 0x69a6, 0x69c3, 0x69a3, 0x6b49, 0x6b4c, 0x6c33, 0x6f33, 0x6f14, 0x6efe, 0x6f13, 0x6ef4, 0x6f29, 0x6f3e, 0x6f20, 0x6f2c, 0x6f0f, 0x6f02, 0x6f22, 0x6eff, 0x6eef, 0x6f06, 0x6f31, 0x6f38, 0x6f32, 0x6f23, 0x6f15, 0x6f2b, 0x6f2f, 0x6f88, 0x6f2a, 0x6eec, 0x6f01, 0x6ef2, 0x6ecc, 0x6ef7, 0x7194, 0x7199, 0x717d, 0x718a, 0x7184, 0x7192, 0x723e, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746a, 0x7470, 0x746d, 0x7504, 0x7591, 0x7627, 0x760d, 0x760b, 0x7609, 0x7613, 0x76e1, 0x76e3, 0x7784, 0x777d, 0x777f, 0x7761, 0x78c1, 0x789f, 0x78a7, 0x78b3, 0x78a9, 0x78a3, 0x798e, 0x798f, 0x798d, 0x7a2e, 0x7a31, 0x7aaa, 0x7aa9, 0x7aed, 0x7aef, 0x7ba1, 0x7b95, 0x7b8b, 0x7b75, 0x7b97, 0x7b9d, 0x7b94, 0x7b8f, 0x7bb8, 0x7b87, 0x7b84, 0x7cb9, 0x7cbd, 0x7cbe, 0x7dbb, 0x7db0, 0x7d9c, 0x7dbd, 0x7dbe, 0x7da0, 0x7dca, 0x7db4, 0x7db2, 0x7db1, 0x7dba, 0x7da2, 0x7dbf, 0x7db5, 0x7db8, 0x7dad, 0x7dd2, 0x7dc7, 0x7dac, 0x7f70, 0x7fe0, 0x7fe1, 0x7fdf, 0x805e, 0x805a, 0x8087, 0x8150, 0x8180, 0x818f, 0x8188, 0x818a, 0x817f, 0x8182, 0x81e7, 0x81fa, 0x8207, 0x8214, 0x821e, 0x824b, 0x84c9, 0x84bf, 0x84c6, 0x84c4, 0x8499, 0x849e, 0x84b2, 0x849c, 0x84cb, 0x84b8, 0x84c0, 0x84d3, 0x8490, 0x84bc, 0x84d1, 0x84ca, 0x873f, 0x871c, 0x873b, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88f3, 0x8902, 0x88f4, 0x88f9, 0x88f8, 0x88fd, 0x88e8, 0x891a, 0x88ef, 0x8aa6, 0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, 0x8aaa, 0x8aa5, 0x8aa8, 0x8a98, 0x8a91, 0x8a9a, 0x8aa7, 0x8c6a, 0x8c8d, 0x8c8c, 0x8cd3, 0x8cd1, 0x8cd2, 0x8d6b, 0x8d99, 0x8d95, 0x8dfc, 0x8f14, 0x8f12, 0x8f15, 0x8f13, 0x8fa3, 0x9060, 0x9058, 0x905c, 0x9063, 0x9059, 0x905e, 0x9062, 0x905d, 0x905b, 0x9119, 0x9118, 0x911e, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x92ac, 0x9280, 0x9285, 0x9298, 0x9296, 0x927b, 0x9293, 0x929c, 0x92a8, 0x927c, 0x9291, 0x95a1, 0x95a8, 0x95a9, 0x95a3, 0x95a5, 0x95a4, 0x9699, 0x969c, 0x969b, 0x96cc, 0x96d2, 0x9700, 0x977c, 0x9785, 0x97f6, 0x9817, 0x9818, 0x98af, 0x98b1, 0x9903, 0x9905, 0x990c, 0x9909, 0x99c1, 0x9aaf, 0x9ab0, 0x9ae6, 0x9b41, 0x9b42, 0x9cf4, 0x9cf6, 0x9cf3, 0x9ebc, 0x9f3b, 0x9f4a, 0x5104, 0x5100, 0x50fb, 0x50f5, 0x50f9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51dc, 0x5287, 0x5288, 0x5289, 0x528d, 0x528a, 0x52f0, 0x53b2, 0x562e, 0x563b, 0x5639, 0x5632, 0x563f, 0x5634, 0x5629, 0x5653, 0x564e, 0x5657, 0x5674, 0x5636, 0x562f, 0x5630, 0x5880, 0x589f, 0x589e, 0x58b3, 0x589c, 0x58ae, 0x58a9, 0x58a6, 0x596d, 0x5b09, 0x5afb, 0x5b0b, 0x5af5, 0x5b0c, 0x5b08, 0x5bee, 0x5bec, 0x5be9, 0x5beb, 0x5c64, 0x5c65, 0x5d9d, 0x5d94, 0x5e62, 0x5e5f, 0x5e61, 0x5ee2, 0x5eda, 0x5edf, 0x5edd, 0x5ee3, 0x5ee0, 0x5f48, 0x5f71, 0x5fb7, 0x5fb5, 0x6176, 0x6167, 0x616e, 0x615d, 0x6155, 0x6182, 0x617c, 0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, 0x61ac, 0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, 0x6479, 0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, 0x64a5, 0x6493, 0x6495, 0x64a9, 0x6492, 0x64ae, 0x64ad, 0x64ab, 0x649a, 0x64ac, 0x6499, 0x64a2, 0x64b3, 0x6575, 0x6577, 0x6578, 0x66ae, 0x66ab, 0x66b4, 0x66b1, 0x6a23, 0x6a1f, 0x69e8, 0x6a01, 0x6a1e, 0x6a19, 0x69fd, 0x6a21, 0x6a13, 0x6a0a, 0x69f3, 0x6a02, 0x6a05, 0x69ed, 0x6a11, 0x6b50, 0x6b4e, 0x6ba4, 0x6bc5, 0x6bc6, 0x6f3f, 0x6f7c, 0x6f84, 0x6f51, 0x6f66, 0x6f54, 0x6f86, 0x6f6d, 0x6f5b, 0x6f78, 0x6f6e, 0x6f8e, 0x6f7a, 0x6f70, 0x6f64, 0x6f97, 0x6f58, 0x6ed5, 0x6f6f, 0x6f60, 0x6f5f, 0x719f, 0x71ac, 0x71b1, 0x71a8, 0x7256, 0x729b, 0x734e, 0x7357, 0x7469, 0x748b, 0x7483, 0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626, 0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c, 0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, 0x78be, 0x78d5, 0x78bc, 0x78d0, 0x7a3f, 0x7a3c, 0x7a40, 0x7a3d, 0x7a37, 0x7a3b, 0x7aaf, 0x7aae, 0x7bad, 0x7bb1, 0x7bc4, 0x7bb4, 0x7bc6, 0x7bc7, 0x7bc1, 0x7ba0, 0x7bcc, 0x7cca, 0x7de0, 0x7df4, 0x7def, 0x7dfb, 0x7dd8, 0x7dec, 0x7ddd, 0x7de8, 0x7de3, 0x7dda, 0x7dde, 0x7de9, 0x7d9e, 0x7dd9, 0x7df2, 0x7df9, 0x7f75, 0x7f77, 0x7faf, 0x7fe9, 0x8026, 0x819b, 0x819c, 0x819d, 0x81a0, 0x819a, 0x8198, 0x8517, 0x853d, 0x851a, 0x84ee, 0x852c, 0x852d, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84ec, 0x8525, 0x84ff, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874c, 0x8753, 0x885b, 0x885d, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, 0x890a, 0x8abc, 0x8ad2, 0x8ac7, 0x8ac4, 0x8a95, 0x8acb, 0x8af8, 0x8ab2, 0x8ac9, 0x8ac2, 0x8abf, 0x8ab0, 0x8ad6, 0x8acd, 0x8ab6, 0x8ab9, 0x8adb, 0x8c4c, 0x8c4e, 0x8c6c, 0x8ce0, 0x8cde, 0x8ce6, 0x8ce4, 0x8cec, 0x8ced, 0x8ce2, 0x8ce3, 0x8cdc, 0x8cea, 0x8ce1, 0x8d6d, 0x8d9f, 0x8da3, 0x8e2b, 0x8e10, 0x8e1d, 0x8e22, 0x8e0f, 0x8e29, 0x8e1f, 0x8e21, 0x8e1e, 0x8eba, 0x8f1d, 0x8f1b, 0x8f1f, 0x8f29, 0x8f26, 0x8f2a, 0x8f1c, 0x8f1e, 0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, 0x912d, 0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, 0x92bb, 0x92b7, 0x92ea, 0x92e4, 0x92c1, 0x92b3, 0x92bc, 0x92d2, 0x92c7, 0x92f0, 0x92b2, 0x95ad, 0x95b1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978d, 0x978b, 0x978f, 0x9821, 0x982b, 0x981c, 0x98b3, 0x990a, 0x9913, 0x9912, 0x9918, 0x99dd, 0x99d0, 0x99df, 0x99db, 0x99d1, 0x99d5, 0x99d2, 0x99d9, 0x9ab7, 0x9aee, 0x9aef, 0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, 0x9d09, 0x9d03, 0x9ea9, 0x9ebe, 0x9ece, 0x58a8, 0x9f52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51aa, 0x51dd, 0x5291, 0x5293, 0x52f3, 0x5659, 0x566b, 0x5679, 0x5669, 0x5664, 0x5678, 0x566a, 0x5668, 0x5665, 0x5671, 0x566f, 0x566c, 0x5662, 0x5676, 0x58c1, 0x58be, 0x58c7, 0x58c5, 0x596e, 0x5b1d, 0x5b34, 0x5b78, 0x5bf0, 0x5c0e, 0x5f4a, 0x61b2, 0x6191, 0x61a9, 0x618a, 0x61cd, 0x61b6, 0x61be, 0x61ca, 0x61c8, 0x6230, 0x64c5, 0x64c1, 0x64cb, 0x64bb, 0x64bc, 0x64da, 0x64c4, 0x64c7, 0x64c2, 0x64cd, 0x64bf, 0x64d2, 0x64d4, 0x64be, 0x6574, 0x66c6, 0x66c9, 0x66b9, 0x66c4, 0x66c7, 0x66b8, 0x6a3d, 0x6a38, 0x6a3a, 0x6a59, 0x6a6b, 0x6a58, 0x6a39, 0x6a44, 0x6a62, 0x6a61, 0x6a4b, 0x6a47, 0x6a35, 0x6a5f, 0x6a48, 0x6b59, 0x6b77, 0x6c05, 0x6fc2, 0x6fb1, 0x6fa1, 0x6fc3, 0x6fa4, 0x6fc1, 0x6fa7, 0x6fb3, 0x6fc0, 0x6fb9, 0x6fb6, 0x6fa6, 0x6fa0, 0x6fb4, 0x71be, 0x71c9, 0x71d0, 0x71d2, 0x71c8, 0x71d5, 0x71b9, 0x71ce, 0x71d9, 0x71dc, 0x71c3, 0x71c4, 0x7368, 0x749c, 0x74a3, 0x7498, 0x749f, 0x749e, 0x74e2, 0x750c, 0x750d, 0x7634, 0x7638, 0x763a, 0x76e7, 0x76e5, 0x77a0, 0x779e, 0x779f, 0x77a5, 0x78e8, 0x78da, 0x78ec, 0x78e7, 0x79a6, 0x7a4d, 0x7a4e, 0x7a46, 0x7a4c, 0x7a4b, 0x7aba, 0x7bd9, 0x7c11, 0x7bc9, 0x7be4, 0x7bdb, 0x7be1, 0x7be9, 0x7be6, 0x7cd5, 0x7cd6, 0x7e0a, 0x7e11, 0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, 0x7f79, 0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, 0x81a8, 0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856d, 0x856a, 0x855e, 0x8783, 0x879f, 0x879e, 0x87a2, 0x878d, 0x8861, 0x892a, 0x8932, 0x8925, 0x892b, 0x8921, 0x89aa, 0x89a6, 0x8ae6, 0x8afa, 0x8aeb, 0x8af1, 0x8b00, 0x8adc, 0x8ae7, 0x8aee, 0x8afe, 0x8b01, 0x8b02, 0x8af7, 0x8aed, 0x8af3, 0x8af6, 0x8afc, 0x8c6b, 0x8c6d, 0x8c93, 0x8cf4, 0x8e44, 0x8e31, 0x8e34, 0x8e42, 0x8e39, 0x8e35, 0x8f3b, 0x8f2f, 0x8f38, 0x8f33, 0x8fa8, 0x8fa6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907c, 0x907a, 0x9134, 0x9192, 0x9320, 0x9336, 0x92f8, 0x9333, 0x932f, 0x9322, 0x92fc, 0x932b, 0x9304, 0x931a, 0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7, 0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713, 0x970f, 0x975b, 0x975c, 0x9766, 0x9798, 0x9830, 0x9838, 0x983b, 0x9837, 0x982d, 0x9839, 0x9824, 0x9910, 0x9928, 0x991e, 0x991b, 0x9921, 0x991a, 0x99ed, 0x99e2, 0x99f1, 0x9ab8, 0x9abc, 0x9afb, 0x9aed, 0x9b28, 0x9b91, 0x9d15, 0x9d23, 0x9d26, 0x9d28, 0x9d12, 0x9d1b, 0x9ed8, 0x9ed4, 0x9f8d, 0x9f9c, 0x512a, 0x511f, 0x5121, 0x5132, 0x52f5, 0x568e, 0x5680, 0x5690, 0x5685, 0x5687, 0x568f, 0x58d5, 0x58d3, 0x58d1, 0x58ce, 0x5b30, 0x5b2a, 0x5b24, 0x5b7a, 0x5c37, 0x5c68, 0x5dbc, 0x5dba, 0x5dbd, 0x5db8, 0x5e6b, 0x5f4c, 0x5fbd, 0x61c9, 0x61c2, 0x61c7, 0x61e6, 0x61cb, 0x6232, 0x6234, 0x64ce, 0x64ca, 0x64d8, 0x64e0, 0x64f0, 0x64e6, 0x64ec, 0x64f1, 0x64e2, 0x64ed, 0x6582, 0x6583, 0x66d9, 0x66d6, 0x6a80, 0x6a94, 0x6a84, 0x6aa2, 0x6a9c, 0x6adb, 0x6aa3, 0x6a7e, 0x6a97, 0x6a90, 0x6aa0, 0x6b5c, 0x6bae, 0x6bda, 0x6c08, 0x6fd8, 0x6ff1, 0x6fdf, 0x6fe0, 0x6fdb, 0x6fe4, 0x6feb, 0x6fef, 0x6f80, 0x6fec, 0x6fe1, 0x6fe9, 0x6fd5, 0x6fee, 0x6ff0, 0x71e7, 0x71df, 0x71ee, 0x71e6, 0x71e5, 0x71ed, 0x71ec, 0x71f4, 0x71e0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74a9, 0x74b0, 0x74a6, 0x74a8, 0x7646, 0x7642, 0x764c, 0x76ea, 0x77b3, 0x77aa, 0x77b0, 0x77ac, 0x77a7, 0x77ad, 0x77ef, 0x78f7, 0x78fa, 0x78f4, 0x78ef, 0x7901, 0x79a7, 0x79aa, 0x7a57, 0x7abf, 0x7c07, 0x7c0d, 0x7bfe, 0x7bf7, 0x7c0c, 0x7be0, 0x7ce0, 0x7cdc, 0x7cde, 0x7ce2, 0x7cdf, 0x7cd9, 0x7cdd, 0x7e2e, 0x7e3e, 0x7e46, 0x7e37, 0x7e32, 0x7e43, 0x7e2b, 0x7e3d, 0x7e31, 0x7e45, 0x7e41, 0x7e34, 0x7e39, 0x7e48, 0x7e35, 0x7e3f, 0x7e2f, 0x7f44, 0x7ff3, 0x7ffc, 0x8071, 0x8072, 0x8070, 0x806f, 0x8073, 0x81c6, 0x81c3, 0x81ba, 0x81c2, 0x81c0, 0x81bf, 0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, 0x8271, 0x85aa, 0x8584, 0x857e, 0x859c, 0x8591, 0x8594, 0x85af, 0x859b, 0x8587, 0x85a8, 0x858a, 0x85a6, 0x8667, 0x87c0, 0x87d1, 0x87b3, 0x87d2, 0x87c6, 0x87ab, 0x87bb, 0x87ba, 0x87c8, 0x87cb, 0x893b, 0x8936, 0x8944, 0x8938, 0x893d, 0x89ac, 0x8b0e, 0x8b17, 0x8b19, 0x8b1b, 0x8b0a, 0x8b20, 0x8b1d, 0x8b04, 0x8b10, 0x8c41, 0x8c3f, 0x8c73, 0x8cfa, 0x8cfd, 0x8cfc, 0x8cf8, 0x8cfb, 0x8da8, 0x8e49, 0x8e4b, 0x8e48, 0x8e4a, 0x8f44, 0x8f3e, 0x8f42, 0x8f45, 0x8f3f, 0x907f, 0x907d, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91a3, 0x919e, 0x919c, 0x934d, 0x9382, 0x9328, 0x9375, 0x934a, 0x9365, 0x934b, 0x9318, 0x937e, 0x936c, 0x935b, 0x9370, 0x935a, 0x9354, 0x95ca, 0x95cb, 0x95cc, 0x95c8, 0x95c6, 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0, 0x97d3, 0x9846, 0x98b6, 0x9935, 0x9a01, 0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, 0x9d3b, 0x9d3f, 0x9e8b, 0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, 0x9f3e, 0x9f4b, 0x53e2, 0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, 0x5f5e, 0x61e3, 0x6233, 0x64f4, 0x64f2, 0x64fe, 0x6506, 0x64fa, 0x64fb, 0x64f7, 0x65b7, 0x66dc, 0x6726, 0x6ab3, 0x6aac, 0x6ac3, 0x6abb, 0x6ab8, 0x6ac2, 0x6aae, 0x6aaf, 0x6b5f, 0x6b78, 0x6baf, 0x7009, 0x700b, 0x6ffe, 0x7006, 0x6ffa, 0x7011, 0x700f, 0x71fb, 0x71fc, 0x71fe, 0x71f8, 0x7377, 0x7375, 0x74a7, 0x74bf, 0x7515, 0x7656, 0x7658, 0x7652, 0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, 0x79ae, 0x7a61, 0x7a62, 0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, 0x7c2a, 0x7c1e, 0x7c23, 0x7c21, 0x7ce7, 0x7e54, 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52, 0x7e59, 0x7f48, 0x7ff9, 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf, 0x820a, 0x85cf, 0x85a9, 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba, 0x85b9, 0x87ef, 0x87ec, 0x87f2, 0x87e0, 0x8986, 0x89b2, 0x89f4, 0x8b28, 0x8b39, 0x8b2c, 0x8b2b, 0x8c50, 0x8d05, 0x8e59, 0x8e63, 0x8e66, 0x8e64, 0x8e5f, 0x8e55, 0x8ec0, 0x8f49, 0x8f4d, 0x9087, 0x9083, 0x9088, 0x91ab, 0x91ac, 0x91d0, 0x9394, 0x938a, 0x9396, 0x93a2, 0x93b3, 0x93ae, 0x93ac, 0x93b0, 0x9398, 0x939a, 0x9397, 0x95d4, 0x95d6, 0x95d0, 0x95d5, 0x96e2, 0x96dc, 0x96d9, 0x96db, 0x96de, 0x9724, 0x97a3, 0x97a6, 0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, 0x98ba, 0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, 0x9b03, 0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, 0x9bc9, 0x9bfd, 0x9bc8, 0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, 0x9f15, 0x9f2c, 0x5133, 0x56a5, 0x56a8, 0x58de, 0x58df, 0x58e2, 0x5bf5, 0x9f90, 0x5eec, 0x61f2, 0x61f7, 0x61f6, 0x61f5, 0x6500, 0x650f, 0x66e0, 0x66dd, 0x6ae5, 0x6add, 0x6ada, 0x6ad3, 0x701b, 0x701f, 0x7028, 0x701a, 0x701d, 0x7015, 0x7018, 0x7206, 0x720d, 0x7258, 0x72a2, 0x7378, 0x737a, 0x74bd, 0x74ca, 0x74e3, 0x7587, 0x7586, 0x765f, 0x7661, 0x77c7, 0x7919, 0x79b1, 0x7a6b, 0x7a69, 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d, 0x7c37, 0x7c40, 0x7e6b, 0x7e6d, 0x7e79, 0x7e69, 0x7e6a, 0x7e73, 0x7f85, 0x7fb6, 0x7fb9, 0x7fb8, 0x81d8, 0x85e9, 0x85dd, 0x85ea, 0x85d5, 0x85e4, 0x85e5, 0x85f7, 0x87fb, 0x8805, 0x880d, 0x87f9, 0x87fe, 0x8960, 0x895f, 0x8956, 0x895e, 0x8b41, 0x8b5c, 0x8b58, 0x8b49, 0x8b5a, 0x8b4e, 0x8b4f, 0x8b46, 0x8b59, 0x8d08, 0x8d0a, 0x8e7c, 0x8e72, 0x8e87, 0x8e76, 0x8e6c, 0x8e7a, 0x8e74, 0x8f54, 0x8f4e, 0x8fad, 0x908a, 0x908b, 0x91b1, 0x91ae, 0x93e1, 0x93d1, 0x93df, 0x93c3, 0x93c8, 0x93dc, 0x93dd, 0x93d6, 0x93e2, 0x93cd, 0x93d8, 0x93e4, 0x93d7, 0x93e8, 0x95dc, 0x96b4, 0x96e3, 0x972a, 0x9727, 0x9761, 0x97dc, 0x97fb, 0x985e, 0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, 0x9a16, 0x9a19, 0x9b0d, 0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, 0x9d61, 0x9d72, 0x9d6a, 0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, 0x52f8, 0x56b7, 0x56b6, 0x56b4, 0x56bc, 0x58e4, 0x5b40, 0x5b43, 0x5b7d, 0x5bf6, 0x5dc9, 0x61f8, 0x61fa, 0x6518, 0x6514, 0x6519, 0x66e6, 0x6727, 0x6aec, 0x703e, 0x7030, 0x7032, 0x7210, 0x737b, 0x74cf, 0x7662, 0x7665, 0x7926, 0x792a, 0x792c, 0x792b, 0x7ac7, 0x7af6, 0x7c4c, 0x7c43, 0x7c4d, 0x7cef, 0x7cf0, 0x8fae, 0x7e7d, 0x7e7c, 0x7e82, 0x7f4c, 0x8000, 0x81da, 0x8266, 0x85fb, 0x85f9, 0x8611, 0x85fa, 0x8606, 0x860b, 0x8607, 0x860a, 0x8814, 0x8815, 0x8964, 0x89ba, 0x89f8, 0x8b70, 0x8b6c, 0x8b66, 0x8b6f, 0x8b5f, 0x8b6b, 0x8d0f, 0x8d0d, 0x8e89, 0x8e81, 0x8e85, 0x8e82, 0x91b4, 0x91cb, 0x9418, 0x9403, 0x93fd, 0x95e1, 0x9730, 0x98c4, 0x9952, 0x9951, 0x99a8, 0x9a2b, 0x9a30, 0x9a37, 0x9a35, 0x9c13, 0x9c0d, 0x9e79, 0x9eb5, 0x9ee8, 0x9f2f, 0x9f5f, 0x9f63, 0x9f61, 0x5137, 0x5138, 0x56c1, 0x56c0, 0x56c2, 0x5914, 0x5c6c, 0x5dcd, 0x61fc, 0x61fe, 0x651d, 0x651c, 0x6595, 0x66e9, 0x6afb, 0x6b04, 0x6afa, 0x6bb2, 0x704c, 0x721b, 0x72a7, 0x74d6, 0x74d4, 0x7669, 0x77d3, 0x7c50, 0x7e8f, 0x7e8c, 0x7fbc, 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821, 0x881f, 0x896a, 0x896c, 0x89bd, 0x8b74, 0x8b77, 0x8b7d, 0x8d13, 0x8e8a, 0x8e8d, 0x8e8b, 0x8f5f, 0x8faf, 0x91ba, 0x942e, 0x9433, 0x9435, 0x943a, 0x9438, 0x9432, 0x942b, 0x95e2, 0x9738, 0x9739, 0x9732, 0x97ff, 0x9867, 0x9865, 0x9957, 0x9a45, 0x9a43, 0x9a40, 0x9a3e, 0x9acf, 0x9b54, 0x9b51, 0x9c2d, 0x9c25, 0x9daf, 0x9db4, 0x9dc2, 0x9db8, 0x9e9d, 0x9eef, 0x9f19, 0x9f5c, 0x9f66, 0x9f67, 0x513c, 0x513b, 0x56c8, 0x56ca, 0x56c9, 0x5b7f, 0x5dd4, 0x5dd2, 0x5f4e, 0x61ff, 0x6524, 0x6b0a, 0x6b61, 0x7051, 0x7058, 0x7380, 0x74e4, 0x758a, 0x766e, 0x766c, 0x79b3, 0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, 0x8972, 0x896f, 0x89fc, 0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, 0x8f61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973d, 0x973e, 0x97c3, 0x97c1, 0x986b, 0x9955, 0x9a55, 0x9a4d, 0x9ad2, 0x9b1a, 0x9c49, 0x9c31, 0x9c3e, 0x9c3b, 0x9dd3, 0x9dd7, 0x9f34, 0x9f6c, 0x9f6a, 0x9f94, 0x56cc, 0x5dd6, 0x6200, 0x6523, 0x652b, 0x652a, 0x66ec, 0x6b10, 0x74da, 0x7aca, 0x7c64, 0x7c63, 0x7c65, 0x7e93, 0x7e96, 0x7e94, 0x81e2, 0x8638, 0x863f, 0x8831, 0x8b8a, 0x9090, 0x908f, 0x9463, 0x9460, 0x9464, 0x9768, 0x986f, 0x995c, 0x9a5a, 0x9a5b, 0x9a57, 0x9ad3, 0x9ad4, 0x9ad1, 0x9c54, 0x9c57, 0x9c56, 0x9de5, 0x9e9f, 0x9ef4, 0x56d1, 0x58e9, 0x652c, 0x705e, 0x7671, 0x7672, 0x77d7, 0x7f50, 0x7f88, 0x8836, 0x8839, 0x8862, 0x8b93, 0x8b92, 0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, 0x9748, 0x9744, 0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, 0x9df9, 0x9dfa, 0x9e7c, 0x9e7d, 0x9f07, 0x9f77, 0x9f72, 0x5ef3, 0x6b16, 0x7063, 0x7c6c, 0x7c6e, 0x883b, 0x89c0, 0x8ea1, 0x91c1, 0x9472, 0x9470, 0x9871, 0x995e, 0x9ad6, 0x9b23, 0x9ecc, 0x7064, 0x77da, 0x8b9a, 0x9477, 0x97c9, 0x9a62, 0x9a65, 0x7e9c, 0x8b9c, 0x8eaa, 0x91c5, 0x947d, 0x947e, 0x947c, 0x9c77, 0x9c78, 0x9ef7, 0x8c54, 0x947f, 0x9e1a, 0x7228, 0x9a6a, 0x9b31, 0x9e1b, 0x9e1e, 0x7c72, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47, 0x4e8d, 0x56d7, 0x5c6e, 0x5f73, 0x4e0f, 0x5187, 0x4e0e, 0x4e2e, 0x4e93, 0x4ec2, 0x4ec9, 0x4ec8, 0x5198, 0x52fc, 0x536c, 0x53b9, 0x5720, 0x5903, 0x592c, 0x5c10, 0x5dff, 0x65e1, 0x6bb3, 0x6bcc, 0x6c14, 0x723f, 0x4e31, 0x4e3c, 0x4ee8, 0x4edc, 0x4ee9, 0x4ee1, 0x4edd, 0x4eda, 0x520c, 0x5209, 0x531c, 0x534c, 0x5722, 0x5723, 0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73, 0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 0x6c36, 0x6c43, 0x6c3f, 0x6c3b, 0x72ae, 0x72b0, 0x738a, 0x79b8, 0x808a, 0x961e, 0x4f0e, 0x4f18, 0x4f2c, 0x4ef5, 0x4f14, 0x4ef1, 0x4f00, 0x4ef7, 0x4f08, 0x4f1d, 0x4f02, 0x4f05, 0x4f22, 0x4f13, 0x4f04, 0x4ef4, 0x4f12, 0x51b1, 0x5213, 0x5210, 0x52a6, 0x5322, 0x531f, 0x534d, 0x538a, 0x5407, 0x56e1, 0x56df, 0x572e, 0x572a, 0x5734, 0x593c, 0x5980, 0x597c, 0x5985, 0x597b, 0x597e, 0x5977, 0x597f, 0x5b56, 0x5c15, 0x5c25, 0x5c7c, 0x5c7a, 0x5c7b, 0x5c7e, 0x5ddf, 0x5e75, 0x5e84, 0x5f02, 0x5f1a, 0x5f74, 0x5fd5, 0x5fd4, 0x5fcf, 0x625c, 0x625e, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, 0x6260, 0x625a, 0x6265, 0x6537, 0x65ef, 0x65ee, 0x673e, 0x6739, 0x6738, 0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, 0x6c46, 0x6c52, 0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b, 0x6c4c, 0x7071, 0x725e, 0x72b4, 0x72b5, 0x738e, 0x752a, 0x767f, 0x7a75, 0x7f51, 0x8278, 0x827c, 0x8280, 0x827d, 0x827f, 0x864d, 0x897e, 0x9099, 0x9097, 0x9098, 0x909b, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4f56, 0x4f3b, 0x4f62, 0x4f49, 0x4f53, 0x4f64, 0x4f3e, 0x4f67, 0x4f52, 0x4f5f, 0x4f41, 0x4f58, 0x4f2d, 0x4f33, 0x4f3f, 0x4f61, 0x518f, 0x51b9, 0x521c, 0x521e, 0x5221, 0x52ad, 0x52ae, 0x5309, 0x5363, 0x5372, 0x538e, 0x538f, 0x5430, 0x5437, 0x542a, 0x5454, 0x5445, 0x5419, 0x541c, 0x5425, 0x5418, 0x543d, 0x544f, 0x5441, 0x5428, 0x5424, 0x5447, 0x56ee, 0x56e7, 0x56e5, 0x5741, 0x5745, 0x574c, 0x5749, 0x574b, 0x5752, 0x5906, 0x5940, 0x59a6, 0x5998, 0x59a0, 0x5997, 0x598e, 0x59a2, 0x5990, 0x598f, 0x59a7, 0x59a1, 0x5b8e, 0x5b92, 0x5c28, 0x5c2a, 0x5c8d, 0x5c8f, 0x5c88, 0x5c8b, 0x5c89, 0x5c92, 0x5c8a, 0x5c86, 0x5c93, 0x5c95, 0x5de0, 0x5e0a, 0x5e0e, 0x5e8b, 0x5e89, 0x5e8c, 0x5e88, 0x5e8d, 0x5f05, 0x5f1d, 0x5f78, 0x5f76, 0x5fd2, 0x5fd1, 0x5fd0, 0x5fed, 0x5fe8, 0x5fee, 0x5ff3, 0x5fe1, 0x5fe4, 0x5fe3, 0x5ffa, 0x5fef, 0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, 0x6283, 0x628c, 0x628e, 0x628f, 0x6294, 0x6287, 0x6271, 0x627b, 0x627a, 0x6270, 0x6281, 0x6288, 0x6277, 0x627d, 0x6272, 0x6274, 0x65f0, 0x65f4, 0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747, 0x6759, 0x6755, 0x674c, 0x6748, 0x675d, 0x674d, 0x675a, 0x674b, 0x6bd0, 0x6c19, 0x6c1a, 0x6c78, 0x6c67, 0x6c6b, 0x6c84, 0x6c8b, 0x6c8f, 0x6c71, 0x6c6f, 0x6c69, 0x6c9a, 0x6c6d, 0x6c87, 0x6c95, 0x6c9c, 0x6c66, 0x6c73, 0x6c65, 0x6c7b, 0x6c8e, 0x7074, 0x707a, 0x7263, 0x72bf, 0x72bd, 0x72c3, 0x72c6, 0x72c1, 0x72ba, 0x72c5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753a, 0x7539, 0x7594, 0x7595, 0x7681, 0x793d, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809c, 0x8290, 0x828f, 0x8285, 0x828e, 0x8291, 0x8293, 0x828a, 0x8283, 0x8284, 0x8c78, 0x8fc9, 0x8fbf, 0x909f, 0x90a1, 0x90a5, 0x909e, 0x90a7, 0x90a0, 0x9630, 0x9628, 0x962f, 0x962d, 0x4e33, 0x4f98, 0x4f7c, 0x4f85, 0x4f7d, 0x4f80, 0x4f87, 0x4f76, 0x4f74, 0x4f89, 0x4f84, 0x4f77, 0x4f4c, 0x4f97, 0x4f6a, 0x4f9a, 0x4f79, 0x4f81, 0x4f78, 0x4f90, 0x4f9c, 0x4f94, 0x4f9e, 0x4f92, 0x4f82, 0x4f95, 0x4f6b, 0x4f6e, 0x519e, 0x51bc, 0x51be, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52bc, 0x530a, 0x530b, 0x533c, 0x5392, 0x5394, 0x5487, 0x547f, 0x5481, 0x5491, 0x5482, 0x5488, 0x546b, 0x547a, 0x547e, 0x5465, 0x546c, 0x5474, 0x5466, 0x548d, 0x546f, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56f7, 0x56f9, 0x576f, 0x5772, 0x576d, 0x576b, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577b, 0x5773, 0x5774, 0x5762, 0x5768, 0x577d, 0x590c, 0x5945, 0x59b5, 0x59ba, 0x59cf, 0x59ce, 0x59b2, 0x59cc, 0x59c1, 0x59b6, 0x59bc, 0x59c3, 0x59d6, 0x59b1, 0x59bd, 0x59c0, 0x59c8, 0x59b4, 0x59c7, 0x5b62, 0x5b65, 0x5b93, 0x5b95, 0x5c44, 0x5c47, 0x5cae, 0x5ca4, 0x5ca0, 0x5cb5, 0x5caf, 0x5ca8, 0x5cac, 0x5c9f, 0x5ca3, 0x5cad, 0x5ca2, 0x5caa, 0x5ca7, 0x5c9d, 0x5ca5, 0x5cb6, 0x5cb0, 0x5ca6, 0x5e17, 0x5e14, 0x5e19, 0x5f28, 0x5f22, 0x5f23, 0x5f24, 0x5f54, 0x5f82, 0x5f7e, 0x5f7d, 0x5fde, 0x5fe5, 0x602d, 0x6026, 0x6019, 0x6032, 0x600b, 0x6034, 0x600a, 0x6017, 0x6033, 0x601a, 0x601e, 0x602c, 0x6022, 0x600d, 0x6010, 0x602e, 0x6013, 0x6011, 0x600c, 0x6009, 0x601c, 0x6214, 0x623d, 0x62ad, 0x62b4, 0x62d1, 0x62be, 0x62aa, 0x62b6, 0x62ca, 0x62ae, 0x62b3, 0x62af, 0x62bb, 0x62a9, 0x62b0, 0x62b8, 0x653d, 0x65a8, 0x65bb, 0x6609, 0x65fc, 0x6604, 0x6612, 0x6608, 0x65fb, 0x6603, 0x660b, 0x660d, 0x6605, 0x65fd, 0x6611, 0x6610, 0x66f6, 0x670a, 0x6785, 0x676c, 0x678e, 0x6792, 0x6776, 0x677b, 0x6798, 0x6786, 0x6784, 0x6774, 0x678d, 0x678c, 0x677a, 0x679f, 0x6791, 0x6799, 0x6783, 0x677d, 0x6781, 0x6778, 0x6779, 0x6794, 0x6b25, 0x6b80, 0x6b7e, 0x6bde, 0x6c1d, 0x6c93, 0x6cec, 0x6ceb, 0x6cee, 0x6cd9, 0x6cb6, 0x6cd4, 0x6cad, 0x6ce7, 0x6cb7, 0x6cd0, 0x6cc2, 0x6cba, 0x6cc3, 0x6cc6, 0x6ced, 0x6cf2, 0x6cd2, 0x6cdd, 0x6cb4, 0x6c8a, 0x6c9d, 0x6c80, 0x6cde, 0x6cc0, 0x6d30, 0x6ccd, 0x6cc7, 0x6cb0, 0x6cf9, 0x6ccf, 0x6ce9, 0x6cd1, 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709a, 0x7083, 0x726a, 0x72d6, 0x72cb, 0x72d8, 0x72c9, 0x72dc, 0x72d2, 0x72d4, 0x72da, 0x72cc, 0x72d1, 0x73a4, 0x73a1, 0x73ad, 0x73a6, 0x73a2, 0x73a0, 0x73ac, 0x739d, 0x74dd, 0x74e8, 0x753f, 0x7540, 0x753e, 0x758c, 0x7598, 0x76af, 0x76f3, 0x76f1, 0x76f0, 0x76f5, 0x77f8, 0x77fc, 0x77f9, 0x77fb, 0x77fa, 0x77f7, 0x7942, 0x793f, 0x79c5, 0x7a78, 0x7a7b, 0x7afb, 0x7c75, 0x7cfd, 0x8035, 0x808f, 0x80ae, 0x80a3, 0x80b8, 0x80b5, 0x80ad, 0x8220, 0x82a0, 0x82c0, 0x82ab, 0x829a, 0x8298, 0x829b, 0x82b5, 0x82a7, 0x82ae, 0x82bc, 0x829e, 0x82ba, 0x82b4, 0x82a8, 0x82a1, 0x82a9, 0x82c2, 0x82a4, 0x82c3, 0x82b6, 0x82a2, 0x8670, 0x866f, 0x866d, 0x866e, 0x8c56, 0x8fd2, 0x8fcb, 0x8fd3, 0x8fcd, 0x8fd6, 0x8fd5, 0x8fd7, 0x90b2, 0x90b4, 0x90af, 0x90b3, 0x90b0, 0x9639, 0x963d, 0x963c, 0x963a, 0x9643, 0x4fcd, 0x4fc5, 0x4fd3, 0x4fb2, 0x4fc9, 0x4fcb, 0x4fc1, 0x4fd4, 0x4fdc, 0x4fd9, 0x4fbb, 0x4fb3, 0x4fdb, 0x4fc7, 0x4fd6, 0x4fba, 0x4fc0, 0x4fb9, 0x4fec, 0x5244, 0x5249, 0x52c0, 0x52c2, 0x533d, 0x537c, 0x5397, 0x5396, 0x5399, 0x5398, 0x54ba, 0x54a1, 0x54ad, 0x54a5, 0x54cf, 0x54c3, 0x830d, 0x54b7, 0x54ae, 0x54d6, 0x54b6, 0x54c5, 0x54c6, 0x54a0, 0x5470, 0x54bc, 0x54a2, 0x54be, 0x5472, 0x54de, 0x54b0, 0x57b5, 0x579e, 0x579f, 0x57a4, 0x578c, 0x5797, 0x579d, 0x579b, 0x5794, 0x5798, 0x578f, 0x5799, 0x57a5, 0x579a, 0x5795, 0x58f4, 0x590d, 0x5953, 0x59e1, 0x59de, 0x59ee, 0x5a00, 0x59f1, 0x59dd, 0x59fa, 0x59fd, 0x59fc, 0x59f6, 0x59e4, 0x59f2, 0x59f7, 0x59db, 0x59e9, 0x59f3, 0x59f5, 0x59e0, 0x59fe, 0x59f4, 0x59ed, 0x5ba8, 0x5c4c, 0x5cd0, 0x5cd8, 0x5ccc, 0x5cd7, 0x5ccb, 0x5cdb, 0x5cde, 0x5cda, 0x5cc9, 0x5cc7, 0x5cca, 0x5cd6, 0x5cd3, 0x5cd4, 0x5ccf, 0x5cc8, 0x5cc6, 0x5cce, 0x5cdf, 0x5cf8, 0x5df9, 0x5e21, 0x5e22, 0x5e23, 0x5e20, 0x5e24, 0x5eb0, 0x5ea4, 0x5ea2, 0x5e9b, 0x5ea3, 0x5ea5, 0x5f07, 0x5f2e, 0x5f56, 0x5f86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605e, 0x6045, 0x6053, 0x6047, 0x6049, 0x605b, 0x604c, 0x6040, 0x6042, 0x605f, 0x6024, 0x6044, 0x6058, 0x6066, 0x606e, 0x6242, 0x6243, 0x62cf, 0x630d, 0x630b, 0x62f5, 0x630e, 0x6303, 0x62eb, 0x62f9, 0x630f, 0x630c, 0x62f8, 0x62f6, 0x6300, 0x6313, 0x6314, 0x62fa, 0x6315, 0x62fb, 0x62f0, 0x6541, 0x6543, 0x65aa, 0x65bf, 0x6636, 0x6621, 0x6632, 0x6635, 0x661c, 0x6626, 0x6622, 0x6633, 0x662b, 0x663a, 0x661d, 0x6634, 0x6639, 0x662e, 0x670f, 0x6710, 0x67c1, 0x67f2, 0x67c8, 0x67ba, 0x67dc, 0x67bb, 0x67f8, 0x67d8, 0x67c0, 0x67b7, 0x67c5, 0x67eb, 0x67e4, 0x67df, 0x67b5, 0x67cd, 0x67b3, 0x67f7, 0x67f6, 0x67ee, 0x67e3, 0x67c2, 0x67b9, 0x67ce, 0x67e7, 0x67f0, 0x67b2, 0x67fc, 0x67c6, 0x67ed, 0x67cc, 0x67ae, 0x67e6, 0x67db, 0x67fa, 0x67c9, 0x67ca, 0x67c3, 0x67ea, 0x67cb, 0x6b28, 0x6b82, 0x6b84, 0x6bb6, 0x6bd6, 0x6bd8, 0x6be0, 0x6c20, 0x6c21, 0x6d28, 0x6d34, 0x6d2d, 0x6d1f, 0x6d3c, 0x6d3f, 0x6d12, 0x6d0a, 0x6cda, 0x6d33, 0x6d04, 0x6d19, 0x6d3a, 0x6d1a, 0x6d11, 0x6d00, 0x6d1d, 0x6d42, 0x6d01, 0x6d18, 0x6d37, 0x6d03, 0x6d0f, 0x6d40, 0x6d07, 0x6d20, 0x6d2c, 0x6d08, 0x6d22, 0x6d09, 0x6d10, 0x70b7, 0x709f, 0x70be, 0x70b1, 0x70b0, 0x70a1, 0x70b4, 0x70b5, 0x70a9, 0x7241, 0x7249, 0x724a, 0x726c, 0x7270, 0x7273, 0x726e, 0x72ca, 0x72e4, 0x72e8, 0x72eb, 0x72df, 0x72ea, 0x72e6, 0x72e3, 0x7385, 0x73cc, 0x73c2, 0x73c8, 0x73c5, 0x73b9, 0x73b6, 0x73b5, 0x73b4, 0x73eb, 0x73bf, 0x73c7, 0x73be, 0x73c3, 0x73c6, 0x73b8, 0x73cb, 0x74ec, 0x74ee, 0x752e, 0x7547, 0x7548, 0x75a7, 0x75aa, 0x7679, 0x76c4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770a, 0x76f7, 0x76fb, 0x76fa, 0x77e7, 0x77e8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780f, 0x780e, 0x7809, 0x7803, 0x7813, 0x794a, 0x794c, 0x794b, 0x7945, 0x7944, 0x79d5, 0x79cd, 0x79cf, 0x79d6, 0x79ce, 0x7a80, 0x7a7e, 0x7ad1, 0x7b00, 0x7b01, 0x7c7a, 0x7c78, 0x7c79, 0x7c7f, 0x7c80, 0x7c81, 0x7d03, 0x7d08, 0x7d01, 0x7f58, 0x7f91, 0x7f8d, 0x7fbe, 0x8007, 0x800e, 0x800f, 0x8014, 0x8037, 0x80d8, 0x80c7, 0x80e0, 0x80d1, 0x80c8, 0x80c2, 0x80d0, 0x80c5, 0x80e3, 0x80d9, 0x80dc, 0x80ca, 0x80d5, 0x80c9, 0x80cf, 0x80d7, 0x80e6, 0x80cd, 0x81ff, 0x8221, 0x8294, 0x82d9, 0x82fe, 0x82f9, 0x8307, 0x82e8, 0x8300, 0x82d5, 0x833a, 0x82eb, 0x82d6, 0x82f4, 0x82ec, 0x82e1, 0x82f2, 0x82f5, 0x830c, 0x82fb, 0x82f6, 0x82f0, 0x82ea, 0x82e4, 0x82e0, 0x82fa, 0x82f3, 0x82ed, 0x8677, 0x8674, 0x867c, 0x8673, 0x8841, 0x884e, 0x8867, 0x886a, 0x8869, 0x89d3, 0x8a04, 0x8a07, 0x8d72, 0x8fe3, 0x8fe1, 0x8fee, 0x8fe0, 0x90f1, 0x90bd, 0x90bf, 0x90d5, 0x90c5, 0x90be, 0x90c7, 0x90cb, 0x90c8, 0x91d4, 0x91d3, 0x9654, 0x964f, 0x9651, 0x9653, 0x964a, 0x964e, 0x501e, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501b, 0x4ff5, 0x4ff4, 0x5033, 0x5037, 0x502c, 0x4ff6, 0x4ff7, 0x5017, 0x501c, 0x5020, 0x5027, 0x5035, 0x502f, 0x5031, 0x500e, 0x515a, 0x5194, 0x5193, 0x51ca, 0x51c4, 0x51c5, 0x51c8, 0x51ce, 0x5261, 0x525a, 0x5252, 0x525e, 0x525f, 0x5255, 0x5262, 0x52cd, 0x530e, 0x539e, 0x5526, 0x54e2, 0x5517, 0x5512, 0x54e7, 0x54f3, 0x54e4, 0x551a, 0x54ff, 0x5504, 0x5508, 0x54eb, 0x5511, 0x5505, 0x54f1, 0x550a, 0x54fb, 0x54f7, 0x54f8, 0x54e0, 0x550e, 0x5503, 0x550b, 0x5701, 0x5702, 0x57cc, 0x5832, 0x57d5, 0x57d2, 0x57ba, 0x57c6, 0x57bd, 0x57bc, 0x57b8, 0x57b6, 0x57bf, 0x57c7, 0x57d0, 0x57b9, 0x57c1, 0x590e, 0x594a, 0x5a19, 0x5a16, 0x5a2d, 0x5a2e, 0x5a15, 0x5a0f, 0x5a17, 0x5a0a, 0x5a1e, 0x5a33, 0x5b6c, 0x5ba7, 0x5bad, 0x5bac, 0x5c03, 0x5c56, 0x5c54, 0x5cec, 0x5cff, 0x5cee, 0x5cf1, 0x5cf7, 0x5d00, 0x5cf9, 0x5e29, 0x5e28, 0x5ea8, 0x5eae, 0x5eaa, 0x5eac, 0x5f33, 0x5f30, 0x5f67, 0x605d, 0x605a, 0x6067, 0x6041, 0x60a2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609d, 0x6083, 0x6095, 0x609b, 0x6097, 0x6087, 0x609c, 0x608e, 0x6219, 0x6246, 0x62f2, 0x6310, 0x6356, 0x632c, 0x6344, 0x6345, 0x6336, 0x6343, 0x63e4, 0x6339, 0x634b, 0x634a, 0x633c, 0x6329, 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632d, 0x6347, 0x6333, 0x635a, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654a, 0x6546, 0x65c6, 0x65c3, 0x65c4, 0x65c2, 0x664a, 0x665f, 0x6647, 0x6651, 0x6712, 0x6713, 0x681f, 0x681a, 0x6849, 0x6832, 0x6833, 0x683b, 0x684b, 0x684f, 0x6816, 0x6831, 0x681c, 0x6835, 0x682b, 0x682d, 0x682f, 0x684e, 0x6844, 0x6834, 0x681d, 0x6812, 0x6814, 0x6826, 0x6828, 0x682e, 0x684d, 0x683a, 0x6825, 0x6820, 0x6b2c, 0x6b2f, 0x6b2d, 0x6b31, 0x6b34, 0x6b6d, 0x8082, 0x6b88, 0x6be6, 0x6be4, 0x6be8, 0x6be3, 0x6be2, 0x6be7, 0x6c25, 0x6d7a, 0x6d63, 0x6d64, 0x6d76, 0x6d0d, 0x6d61, 0x6d92, 0x6d58, 0x6d62, 0x6d6d, 0x6d6f, 0x6d91, 0x6d8d, 0x6def, 0x6d7f, 0x6d86, 0x6d5e, 0x6d67, 0x6d60, 0x6d97, 0x6d70, 0x6d7c, 0x6d5f, 0x6d82, 0x6d98, 0x6d2f, 0x6d68, 0x6d8b, 0x6d7e, 0x6d80, 0x6d84, 0x6d16, 0x6d83, 0x6d7b, 0x6d7d, 0x6d75, 0x6d90, 0x70dc, 0x70d3, 0x70d1, 0x70dd, 0x70cb, 0x7f39, 0x70e2, 0x70d7, 0x70d2, 0x70de, 0x70e0, 0x70d4, 0x70cd, 0x70c5, 0x70c6, 0x70c7, 0x70da, 0x70ce, 0x70e1, 0x7242, 0x7278, 0x7277, 0x7276, 0x7300, 0x72fa, 0x72f4, 0x72fe, 0x72f6, 0x72f3, 0x72fb, 0x7301, 0x73d3, 0x73d9, 0x73e5, 0x73d6, 0x73bc, 0x73e7, 0x73e3, 0x73e9, 0x73dc, 0x73d2, 0x73db, 0x73d4, 0x73dd, 0x73da, 0x73d7, 0x73d8, 0x73e8, 0x74de, 0x74df, 0x74f4, 0x74f5, 0x7521, 0x755b, 0x755f, 0x75b0, 0x75c1, 0x75bb, 0x75c4, 0x75c0, 0x75bf, 0x75b6, 0x75ba, 0x768a, 0x76c9, 0x771d, 0x771b, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771a, 0x7722, 0x7727, 0x7823, 0x782c, 0x7822, 0x7835, 0x782f, 0x7828, 0x782e, 0x782b, 0x7821, 0x7829, 0x7833, 0x782a, 0x7831, 0x7954, 0x795b, 0x794f, 0x795c, 0x7953, 0x7952, 0x7951, 0x79eb, 0x79ec, 0x79e0, 0x79ee, 0x79ed, 0x79ea, 0x79dc, 0x79de, 0x79dd, 0x7a86, 0x7a89, 0x7a85, 0x7a8b, 0x7a8c, 0x7a8a, 0x7a87, 0x7ad8, 0x7b10, 0x7b04, 0x7b13, 0x7b05, 0x7b0f, 0x7b08, 0x7b0a, 0x7b0e, 0x7b09, 0x7b12, 0x7c84, 0x7c91, 0x7c8a, 0x7c8c, 0x7c88, 0x7c8d, 0x7c85, 0x7d1e, 0x7d1d, 0x7d11, 0x7d0e, 0x7d18, 0x7d16, 0x7d13, 0x7d1f, 0x7d12, 0x7d0f, 0x7d0c, 0x7f5c, 0x7f61, 0x7f5e, 0x7f60, 0x7f5d, 0x7f5b, 0x7f96, 0x7f92, 0x7fc3, 0x7fc2, 0x7fc0, 0x8016, 0x803e, 0x8039, 0x80fa, 0x80f2, 0x80f9, 0x80f5, 0x8101, 0x80fb, 0x8100, 0x8201, 0x822f, 0x8225, 0x8333, 0x832d, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833f, 0x8341, 0x8326, 0x831c, 0x8322, 0x8342, 0x834e, 0x831b, 0x832a, 0x8308, 0x833c, 0x834d, 0x8316, 0x8324, 0x8320, 0x8337, 0x832f, 0x8329, 0x8347, 0x8345, 0x834c, 0x8353, 0x831e, 0x832c, 0x834b, 0x8327, 0x8348, 0x8653, 0x8652, 0x86a2, 0x86a8, 0x8696, 0x868d, 0x8691, 0x869e, 0x8687, 0x8697, 0x8686, 0x868b, 0x869a, 0x8685, 0x86a5, 0x8699, 0x86a1, 0x86a7, 0x8695, 0x8698, 0x868e, 0x869d, 0x8690, 0x8694, 0x8843, 0x8844, 0x886d, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887f, 0x886f, 0x8883, 0x887e, 0x8874, 0x887c, 0x8a12, 0x8c47, 0x8c57, 0x8c7b, 0x8ca4, 0x8ca3, 0x8d76, 0x8d78, 0x8db5, 0x8db7, 0x8db6, 0x8ed1, 0x8ed3, 0x8ffe, 0x8ff5, 0x9002, 0x8fff, 0x8ffb, 0x9004, 0x8ffc, 0x8ff6, 0x90d6, 0x90e0, 0x90d9, 0x90da, 0x90e3, 0x90df, 0x90e5, 0x90d8, 0x90db, 0x90d7, 0x90dc, 0x90e4, 0x9150, 0x914e, 0x914f, 0x91d5, 0x91e2, 0x91da, 0x965c, 0x965f, 0x96bc, 0x98e3, 0x9adf, 0x9b2f, 0x4e7f, 0x5070, 0x506a, 0x5061, 0x505e, 0x5060, 0x5053, 0x504b, 0x505d, 0x5072, 0x5048, 0x504d, 0x5041, 0x505b, 0x504a, 0x5062, 0x5015, 0x5045, 0x505f, 0x5069, 0x506b, 0x5063, 0x5064, 0x5046, 0x5040, 0x506e, 0x5073, 0x5057, 0x5051, 0x51d0, 0x526b, 0x526d, 0x526c, 0x526e, 0x52d6, 0x52d3, 0x532d, 0x539c, 0x5575, 0x5576, 0x553c, 0x554d, 0x5550, 0x5534, 0x552a, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x550c, 0x5532, 0x5565, 0x554e, 0x5539, 0x5548, 0x552d, 0x553b, 0x5540, 0x554b, 0x570a, 0x5707, 0x57fb, 0x5814, 0x57e2, 0x57f6, 0x57dc, 0x57f4, 0x5800, 0x57ed, 0x57fd, 0x5808, 0x57f8, 0x580b, 0x57f3, 0x57cf, 0x5807, 0x57ee, 0x57e3, 0x57f2, 0x57e5, 0x57ec, 0x57e1, 0x580e, 0x57fc, 0x5810, 0x57e7, 0x5801, 0x580c, 0x57f1, 0x57e9, 0x57f0, 0x580d, 0x5804, 0x595c, 0x5a60, 0x5a58, 0x5a55, 0x5a67, 0x5a5e, 0x5a38, 0x5a35, 0x5a6d, 0x5a50, 0x5a5f, 0x5a65, 0x5a6c, 0x5a53, 0x5a64, 0x5a57, 0x5a43, 0x5a5d, 0x5a52, 0x5a44, 0x5a5b, 0x5a48, 0x5a8e, 0x5a3e, 0x5a4d, 0x5a39, 0x5a4c, 0x5a70, 0x5a69, 0x5a47, 0x5a51, 0x5a56, 0x5a42, 0x5a5c, 0x5b72, 0x5b6e, 0x5bc1, 0x5bc0, 0x5c59, 0x5d1e, 0x5d0b, 0x5d1d, 0x5d1a, 0x5d20, 0x5d0c, 0x5d28, 0x5d0d, 0x5d26, 0x5d25, 0x5d0f, 0x5d30, 0x5d12, 0x5d23, 0x5d1f, 0x5d2e, 0x5e3e, 0x5e34, 0x5eb1, 0x5eb4, 0x5eb9, 0x5eb2, 0x5eb3, 0x5f36, 0x5f38, 0x5f9b, 0x5f96, 0x5f9f, 0x608a, 0x6090, 0x6086, 0x60be, 0x60b0, 0x60ba, 0x60d3, 0x60d4, 0x60cf, 0x60e4, 0x60d9, 0x60dd, 0x60c8, 0x60b1, 0x60db, 0x60b7, 0x60ca, 0x60bf, 0x60c3, 0x60cd, 0x60c0, 0x6332, 0x6365, 0x638a, 0x6382, 0x637d, 0x63bd, 0x639e, 0x63ad, 0x639d, 0x6397, 0x63ab, 0x638e, 0x636f, 0x6387, 0x6390, 0x636e, 0x63af, 0x6375, 0x639c, 0x636d, 0x63ae, 0x637c, 0x63a4, 0x633b, 0x639f, 0x6378, 0x6385, 0x6381, 0x6391, 0x638d, 0x6370, 0x6553, 0x65cd, 0x6665, 0x6661, 0x665b, 0x6659, 0x665c, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689c, 0x686d, 0x686e, 0x68ae, 0x68ab, 0x6956, 0x686f, 0x68a3, 0x68ac, 0x68a9, 0x6875, 0x6874, 0x68b2, 0x688f, 0x6877, 0x6892, 0x687c, 0x686b, 0x6872, 0x68aa, 0x6880, 0x6871, 0x687e, 0x689b, 0x6896, 0x688b, 0x68a0, 0x6889, 0x68a4, 0x6878, 0x687b, 0x6891, 0x688c, 0x688a, 0x687d, 0x6b36, 0x6b33, 0x6b37, 0x6b38, 0x6b91, 0x6b8f, 0x6b8d, 0x6b8e, 0x6b8c, 0x6c2a, 0x6dc0, 0x6dab, 0x6db4, 0x6db3, 0x6e74, 0x6dac, 0x6de9, 0x6de2, 0x6db7, 0x6df6, 0x6dd4, 0x6e00, 0x6dc8, 0x6de0, 0x6ddf, 0x6dd6, 0x6dbe, 0x6de5, 0x6ddc, 0x6ddd, 0x6ddb, 0x6df4, 0x6dca, 0x6dbd, 0x6ded, 0x6df0, 0x6dba, 0x6dd5, 0x6dc2, 0x6dcf, 0x6dc9, 0x6dd0, 0x6df2, 0x6dd3, 0x6dfd, 0x6dd7, 0x6dcd, 0x6de3, 0x6dbb, 0x70fa, 0x710d, 0x70f7, 0x7117, 0x70f4, 0x710c, 0x70f0, 0x7104, 0x70f3, 0x7110, 0x70fc, 0x70ff, 0x7106, 0x7113, 0x7100, 0x70f8, 0x70f6, 0x710b, 0x7102, 0x710e, 0x727e, 0x727b, 0x727c, 0x727f, 0x731d, 0x7317, 0x7307, 0x7311, 0x7318, 0x730a, 0x7308, 0x72ff, 0x730f, 0x731e, 0x7388, 0x73f6, 0x73f8, 0x73f5, 0x7404, 0x7401, 0x73fd, 0x7407, 0x7400, 0x73fa, 0x73fc, 0x73ff, 0x740c, 0x740b, 0x73f4, 0x7408, 0x7564, 0x7563, 0x75ce, 0x75d2, 0x75cf, 0x75cb, 0x75cc, 0x75d1, 0x75d0, 0x768f, 0x7689, 0x76d3, 0x7739, 0x772f, 0x772d, 0x7731, 0x7732, 0x7734, 0x7733, 0x773d, 0x7725, 0x773b, 0x7735, 0x7848, 0x7852, 0x7849, 0x784d, 0x784a, 0x784c, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796a, 0x7963, 0x796b, 0x7961, 0x79bb, 0x79fa, 0x79f8, 0x79f6, 0x79f7, 0x7a8f, 0x7a94, 0x7a90, 0x7b35, 0x7b3b, 0x7b34, 0x7b25, 0x7b30, 0x7b22, 0x7b24, 0x7b33, 0x7b18, 0x7b2a, 0x7b1d, 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f, 0x7b32, 0x7b38, 0x7b1a, 0x7b23, 0x7c94, 0x7c98, 0x7c96, 0x7ca3, 0x7d35, 0x7d3d, 0x7d38, 0x7d36, 0x7d3a, 0x7d45, 0x7d2c, 0x7d29, 0x7d41, 0x7d47, 0x7d3e, 0x7d3f, 0x7d4a, 0x7d3b, 0x7d28, 0x7f63, 0x7f95, 0x7f9c, 0x7f9d, 0x7f9b, 0x7fca, 0x7fcb, 0x7fcd, 0x7fd0, 0x7fd1, 0x7fc7, 0x7fcf, 0x7fc9, 0x801f, 0x801e, 0x801b, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811b, 0x812d, 0x811f, 0x812c, 0x811e, 0x8121, 0x8115, 0x8127, 0x811d, 0x8122, 0x8211, 0x8238, 0x8233, 0x823a, 0x8234, 0x8232, 0x8274, 0x8390, 0x83a3, 0x83a8, 0x838d, 0x837a, 0x8373, 0x83a4, 0x8374, 0x838f, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83a9, 0x837d, 0x8383, 0x838c, 0x839d, 0x839b, 0x83aa, 0x838b, 0x837e, 0x83a5, 0x83af, 0x8388, 0x8397, 0x83b0, 0x837f, 0x83a6, 0x8387, 0x83ae, 0x8376, 0x8659, 0x8656, 0x86bf, 0x86b7, 0x86c2, 0x86c1, 0x86c5, 0x86ba, 0x86b0, 0x86c8, 0x86b9, 0x86b3, 0x86b8, 0x86cc, 0x86b4, 0x86bb, 0x86bc, 0x86c3, 0x86bd, 0x86be, 0x8852, 0x8889, 0x8895, 0x88a8, 0x88a2, 0x88aa, 0x889a, 0x8891, 0x88a1, 0x889f, 0x8898, 0x88a7, 0x8899, 0x889b, 0x8897, 0x88a4, 0x88ac, 0x888c, 0x8893, 0x888e, 0x8982, 0x89d6, 0x89d9, 0x89d5, 0x8a30, 0x8a27, 0x8a2c, 0x8a1e, 0x8c39, 0x8c3b, 0x8c5c, 0x8c5d, 0x8c7d, 0x8ca5, 0x8d7d, 0x8d7b, 0x8d79, 0x8dbc, 0x8dc2, 0x8db9, 0x8dbf, 0x8dc1, 0x8ed8, 0x8ede, 0x8edd, 0x8edc, 0x8ed7, 0x8ee0, 0x8ee1, 0x9024, 0x900b, 0x9011, 0x901c, 0x900c, 0x9021, 0x90ef, 0x90ea, 0x90f0, 0x90f4, 0x90f2, 0x90f3, 0x90d4, 0x90eb, 0x90ec, 0x90e9, 0x9156, 0x9158, 0x915a, 0x9153, 0x9155, 0x91ec, 0x91f4, 0x91f1, 0x91f3, 0x91f8, 0x91e4, 0x91f9, 0x91ea, 0x91eb, 0x91f7, 0x91e8, 0x91ee, 0x957a, 0x9586, 0x9588, 0x967c, 0x966d, 0x966b, 0x9671, 0x966f, 0x96bf, 0x976a, 0x9804, 0x98e5, 0x9997, 0x509b, 0x5095, 0x5094, 0x509e, 0x508b, 0x50a3, 0x5083, 0x508c, 0x508e, 0x509d, 0x5068, 0x509c, 0x5092, 0x5082, 0x5087, 0x515f, 0x51d4, 0x5312, 0x5311, 0x53a4, 0x53a7, 0x5591, 0x55a8, 0x55a5, 0x55ad, 0x5577, 0x5645, 0x55a2, 0x5593, 0x5588, 0x558f, 0x55b5, 0x5581, 0x55a3, 0x5592, 0x55a4, 0x557d, 0x558c, 0x55a6, 0x557f, 0x5595, 0x55a1, 0x558e, 0x570c, 0x5829, 0x5837, 0x5819, 0x581e, 0x5827, 0x5823, 0x5828, 0x57f5, 0x5848, 0x5825, 0x581c, 0x581b, 0x5833, 0x583f, 0x5836, 0x582e, 0x5839, 0x5838, 0x582d, 0x582c, 0x583b, 0x5961, 0x5aaf, 0x5a94, 0x5a9f, 0x5a7a, 0x5aa2, 0x5a9e, 0x5a78, 0x5aa6, 0x5a7c, 0x5aa5, 0x5aac, 0x5a95, 0x5aae, 0x5a37, 0x5a84, 0x5a8a, 0x5a97, 0x5a83, 0x5a8b, 0x5aa9, 0x5a7b, 0x5a7d, 0x5a8c, 0x5a9c, 0x5a8f, 0x5a93, 0x5a9d, 0x5bea, 0x5bcd, 0x5bcb, 0x5bd4, 0x5bd1, 0x5bca, 0x5bce, 0x5c0c, 0x5c30, 0x5d37, 0x5d43, 0x5d6b, 0x5d41, 0x5d4b, 0x5d3f, 0x5d35, 0x5d51, 0x5d4e, 0x5d55, 0x5d33, 0x5d3a, 0x5d52, 0x5d3d, 0x5d31, 0x5d59, 0x5d42, 0x5d39, 0x5d49, 0x5d38, 0x5d3c, 0x5d32, 0x5d36, 0x5d40, 0x5d45, 0x5e44, 0x5e41, 0x5f58, 0x5fa6, 0x5fa5, 0x5fab, 0x60c9, 0x60b9, 0x60cc, 0x60e2, 0x60ce, 0x60c4, 0x6114, 0x60f2, 0x610a, 0x6116, 0x6105, 0x60f5, 0x6113, 0x60f8, 0x60fc, 0x60fe, 0x60c1, 0x6103, 0x6118, 0x611d, 0x6110, 0x60ff, 0x6104, 0x610b, 0x624a, 0x6394, 0x63b1, 0x63b0, 0x63ce, 0x63e5, 0x63e8, 0x63ef, 0x63c3, 0x649d, 0x63f3, 0x63ca, 0x63e0, 0x63f6, 0x63d5, 0x63f2, 0x63f5, 0x6461, 0x63df, 0x63be, 0x63dd, 0x63dc, 0x63c4, 0x63d8, 0x63d3, 0x63c2, 0x63c7, 0x63cc, 0x63cb, 0x63c8, 0x63f0, 0x63d7, 0x63d9, 0x6532, 0x6567, 0x656a, 0x6564, 0x655c, 0x6568, 0x6565, 0x658c, 0x659d, 0x659e, 0x65ae, 0x65d0, 0x65d2, 0x667c, 0x666c, 0x667b, 0x6680, 0x6671, 0x6679, 0x666a, 0x6672, 0x6701, 0x690c, 0x68d3, 0x6904, 0x68dc, 0x692a, 0x68ec, 0x68ea, 0x68f1, 0x690f, 0x68d6, 0x68f7, 0x68eb, 0x68e4, 0x68f6, 0x6913, 0x6910, 0x68f3, 0x68e1, 0x6907, 0x68cc, 0x6908, 0x6970, 0x68b4, 0x6911, 0x68ef, 0x68c6, 0x6914, 0x68f8, 0x68d0, 0x68fd, 0x68fc, 0x68e8, 0x690b, 0x690a, 0x6917, 0x68ce, 0x68c8, 0x68dd, 0x68de, 0x68e6, 0x68f4, 0x68d1, 0x6906, 0x68d4, 0x68e9, 0x6915, 0x6925, 0x68c7, 0x6b39, 0x6b3b, 0x6b3f, 0x6b3c, 0x6b94, 0x6b97, 0x6b99, 0x6b95, 0x6bbd, 0x6bf0, 0x6bf2, 0x6bf3, 0x6c30, 0x6dfc, 0x6e46, 0x6e47, 0x6e1f, 0x6e49, 0x6e88, 0x6e3c, 0x6e3d, 0x6e45, 0x6e62, 0x6e2b, 0x6e3f, 0x6e41, 0x6e5d, 0x6e73, 0x6e1c, 0x6e33, 0x6e4b, 0x6e40, 0x6e51, 0x6e3b, 0x6e03, 0x6e2e, 0x6e5e, 0x6e68, 0x6e5c, 0x6e61, 0x6e31, 0x6e28, 0x6e60, 0x6e71, 0x6e6b, 0x6e39, 0x6e22, 0x6e30, 0x6e53, 0x6e65, 0x6e27, 0x6e78, 0x6e64, 0x6e77, 0x6e55, 0x6e79, 0x6e52, 0x6e66, 0x6e35, 0x6e36, 0x6e5a, 0x7120, 0x711e, 0x712f, 0x70fb, 0x712e, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711f, 0x7128, 0x713a, 0x711b, 0x724b, 0x725a, 0x7288, 0x7289, 0x7286, 0x7285, 0x728b, 0x7312, 0x730b, 0x7330, 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732d, 0x7326, 0x7323, 0x7335, 0x730c, 0x742e, 0x742c, 0x7430, 0x742b, 0x7416, 0x741a, 0x7421, 0x742d, 0x7431, 0x7424, 0x7423, 0x741d, 0x7429, 0x7420, 0x7432, 0x74fb, 0x752f, 0x756f, 0x756c, 0x75e7, 0x75da, 0x75e1, 0x75e6, 0x75dd, 0x75df, 0x75e4, 0x75d7, 0x7695, 0x7692, 0x76da, 0x7746, 0x7747, 0x7744, 0x774d, 0x7745, 0x774a, 0x774e, 0x774b, 0x774c, 0x77de, 0x77ec, 0x7860, 0x7864, 0x7865, 0x785c, 0x786d, 0x7871, 0x786a, 0x786e, 0x7870, 0x7869, 0x7868, 0x785e, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7a02, 0x7a0a, 0x7a03, 0x7a0c, 0x7a04, 0x7a99, 0x7ae6, 0x7ae4, 0x7b4a, 0x7b47, 0x7b44, 0x7b48, 0x7b4c, 0x7b4e, 0x7b40, 0x7b58, 0x7b45, 0x7ca2, 0x7c9e, 0x7ca8, 0x7ca1, 0x7d58, 0x7d6f, 0x7d63, 0x7d53, 0x7d56, 0x7d67, 0x7d6a, 0x7d4f, 0x7d6d, 0x7d5c, 0x7d6b, 0x7d52, 0x7d54, 0x7d69, 0x7d51, 0x7d5f, 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65, 0x7f66, 0x7fa2, 0x7fa0, 0x7fa1, 0x7fd7, 0x8051, 0x804f, 0x8050, 0x80fe, 0x80d4, 0x8143, 0x814a, 0x8152, 0x814f, 0x8147, 0x813d, 0x814d, 0x813a, 0x81e6, 0x81ee, 0x81f7, 0x81f8, 0x81f9, 0x8204, 0x823c, 0x823d, 0x823f, 0x8275, 0x833b, 0x83cf, 0x83f9, 0x8423, 0x83c0, 0x83e8, 0x8412, 0x83e7, 0x83e4, 0x83fc, 0x83f6, 0x8410, 0x83c6, 0x83c8, 0x83eb, 0x83e3, 0x83bf, 0x8401, 0x83dd, 0x83e5, 0x83d8, 0x83ff, 0x83e1, 0x83cb, 0x83ce, 0x83d6, 0x83f5, 0x83c9, 0x8409, 0x840f, 0x83de, 0x8411, 0x8406, 0x83c2, 0x83f3, 0x83d5, 0x83fa, 0x83c7, 0x83d1, 0x83ea, 0x8413, 0x839a, 0x83c3, 0x83ec, 0x83ee, 0x83c4, 0x83fb, 0x83d7, 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8, 0x86e2, 0x86e6, 0x86d3, 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb, 0x86dc, 0x86ec, 0x86e9, 0x86d7, 0x86e8, 0x86d1, 0x8848, 0x8856, 0x8855, 0x88ba, 0x88d7, 0x88b9, 0x88b8, 0x88c0, 0x88be, 0x88b6, 0x88bc, 0x88b7, 0x88bd, 0x88b2, 0x8901, 0x88c9, 0x8995, 0x8998, 0x8997, 0x89dd, 0x89da, 0x89db, 0x8a4e, 0x8a4d, 0x8a39, 0x8a59, 0x8a40, 0x8a57, 0x8a58, 0x8a44, 0x8a45, 0x8a52, 0x8a48, 0x8a51, 0x8a4a, 0x8a4c, 0x8a4f, 0x8c5f, 0x8c81, 0x8c80, 0x8cba, 0x8cbe, 0x8cb0, 0x8cb9, 0x8cb5, 0x8d84, 0x8d80, 0x8d89, 0x8dd8, 0x8dd3, 0x8dcd, 0x8dc7, 0x8dd6, 0x8ddc, 0x8dcf, 0x8dd5, 0x8dd9, 0x8dc8, 0x8dd7, 0x8dc5, 0x8eef, 0x8ef7, 0x8efa, 0x8ef9, 0x8ee6, 0x8eee, 0x8ee5, 0x8ef5, 0x8ee7, 0x8ee8, 0x8ef6, 0x8eeb, 0x8ef1, 0x8eec, 0x8ef4, 0x8ee9, 0x902d, 0x9034, 0x902f, 0x9106, 0x912c, 0x9104, 0x90ff, 0x90fc, 0x9108, 0x90f9, 0x90fb, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915f, 0x9162, 0x9160, 0x9201, 0x920a, 0x9225, 0x9203, 0x921a, 0x9226, 0x920f, 0x920c, 0x9200, 0x9212, 0x91ff, 0x91fd, 0x9206, 0x9204, 0x9227, 0x9202, 0x921c, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957b, 0x958d, 0x958c, 0x9590, 0x9687, 0x967e, 0x9688, 0x9689, 0x9683, 0x9680, 0x96c2, 0x96c8, 0x96c3, 0x96f1, 0x96f0, 0x976c, 0x9770, 0x976e, 0x9807, 0x98a9, 0x98eb, 0x9ce6, 0x9ef9, 0x4e83, 0x4e84, 0x4eb6, 0x50bd, 0x50bf, 0x50c6, 0x50ae, 0x50c4, 0x50ca, 0x50b4, 0x50c8, 0x50c2, 0x50b0, 0x50c1, 0x50ba, 0x50b1, 0x50cb, 0x50c9, 0x50b6, 0x50b8, 0x51d7, 0x527a, 0x5278, 0x527b, 0x527c, 0x55c3, 0x55db, 0x55cc, 0x55d0, 0x55cb, 0x55ca, 0x55dd, 0x55c0, 0x55d4, 0x55c4, 0x55e9, 0x55bf, 0x55d2, 0x558d, 0x55cf, 0x55d5, 0x55e2, 0x55d6, 0x55c8, 0x55f2, 0x55cd, 0x55d9, 0x55c2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584f, 0x584d, 0x5849, 0x586f, 0x5855, 0x584e, 0x585d, 0x5859, 0x5865, 0x585b, 0x583d, 0x5863, 0x5871, 0x58fc, 0x5ac7, 0x5ac4, 0x5acb, 0x5aba, 0x5ab8, 0x5ab1, 0x5ab5, 0x5ab0, 0x5abf, 0x5ac8, 0x5abb, 0x5ac6, 0x5ab7, 0x5ac0, 0x5aca, 0x5ab4, 0x5ab6, 0x5acd, 0x5ab9, 0x5a90, 0x5bd6, 0x5bd8, 0x5bd9, 0x5c1f, 0x5c33, 0x5d71, 0x5d63, 0x5d4a, 0x5d65, 0x5d72, 0x5d6c, 0x5d5e, 0x5d68, 0x5d67, 0x5d62, 0x5df0, 0x5e4f, 0x5e4e, 0x5e4a, 0x5e4d, 0x5e4b, 0x5ec5, 0x5ecc, 0x5ec6, 0x5ecb, 0x5ec7, 0x5f40, 0x5faf, 0x5fad, 0x60f7, 0x6149, 0x614a, 0x612b, 0x6145, 0x6136, 0x6132, 0x612e, 0x6146, 0x612f, 0x614f, 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63c5, 0x63f1, 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433, 0x6443, 0x641f, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640c, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642f, 0x640a, 0x641a, 0x6440, 0x6425, 0x6427, 0x640b, 0x63e7, 0x641b, 0x642e, 0x6421, 0x640e, 0x656f, 0x6592, 0x65d3, 0x6686, 0x668c, 0x6695, 0x6690, 0x668b, 0x668a, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695f, 0x6938, 0x694e, 0x6962, 0x6971, 0x693f, 0x6945, 0x696a, 0x6939, 0x6942, 0x6957, 0x6959, 0x697a, 0x6948, 0x6949, 0x6935, 0x696c, 0x6933, 0x693d, 0x6965, 0x68f0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696f, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694c, 0x693b, 0x694b, 0x6937, 0x695c, 0x694f, 0x6951, 0x6932, 0x6952, 0x692f, 0x697b, 0x693c, 0x6b46, 0x6b45, 0x6b43, 0x6b42, 0x6b48, 0x6b41, 0x6b9b, 0x6bfb, 0x6bfc, 0x6bf9, 0x6bf7, 0x6bf8, 0x6e9b, 0x6ed6, 0x6ec8, 0x6e8f, 0x6ec0, 0x6e9f, 0x6e93, 0x6e94, 0x6ea0, 0x6eb1, 0x6eb9, 0x6ec6, 0x6ed2, 0x6ebd, 0x6ec1, 0x6e9e, 0x6ec9, 0x6eb7, 0x6eb0, 0x6ecd, 0x6ea6, 0x6ecf, 0x6eb2, 0x6ebe, 0x6ec3, 0x6edc, 0x6ed8, 0x6e99, 0x6e92, 0x6e8e, 0x6e8d, 0x6ea4, 0x6ea1, 0x6ebf, 0x6eb3, 0x6ed0, 0x6eca, 0x6e97, 0x6eae, 0x6ea3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715d, 0x7162, 0x7172, 0x7178, 0x716a, 0x7161, 0x7142, 0x7158, 0x7143, 0x714b, 0x7170, 0x715f, 0x7150, 0x7153, 0x7144, 0x714d, 0x715a, 0x724f, 0x728d, 0x728c, 0x7291, 0x7290, 0x728e, 0x733c, 0x7342, 0x733b, 0x733a, 0x7340, 0x734a, 0x7349, 0x7444, 0x744a, 0x744b, 0x7452, 0x7451, 0x7457, 0x7440, 0x744f, 0x7450, 0x744e, 0x7442, 0x7446, 0x744d, 0x7454, 0x74e1, 0x74ff, 0x74fe, 0x74fd, 0x751d, 0x7579, 0x7577, 0x6983, 0x75ef, 0x760f, 0x7603, 0x75f7, 0x75fe, 0x75fc, 0x75f9, 0x75f8, 0x7610, 0x75fb, 0x75f6, 0x75ed, 0x75f5, 0x75fd, 0x7699, 0x76b5, 0x76dd, 0x7755, 0x775f, 0x7760, 0x7752, 0x7756, 0x775a, 0x7769, 0x7767, 0x7754, 0x7759, 0x776d, 0x77e0, 0x7887, 0x789a, 0x7894, 0x788f, 0x7884, 0x7895, 0x7885, 0x7886, 0x78a1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787b, 0x797c, 0x7982, 0x797d, 0x7979, 0x7a11, 0x7a18, 0x7a19, 0x7a12, 0x7a17, 0x7a15, 0x7a22, 0x7a13, 0x7a1b, 0x7a10, 0x7aa3, 0x7aa2, 0x7a9e, 0x7aeb, 0x7b66, 0x7b64, 0x7b6d, 0x7b74, 0x7b69, 0x7b72, 0x7b65, 0x7b73, 0x7b71, 0x7b70, 0x7b61, 0x7b78, 0x7b76, 0x7b63, 0x7cb2, 0x7cb4, 0x7caf, 0x7d88, 0x7d86, 0x7d80, 0x7d8d, 0x7d7f, 0x7d85, 0x7d7a, 0x7d8e, 0x7d7b, 0x7d83, 0x7d7c, 0x7d8c, 0x7d94, 0x7d84, 0x7d7d, 0x7d92, 0x7f6d, 0x7f6b, 0x7f67, 0x7f68, 0x7f6c, 0x7fa6, 0x7fa5, 0x7fa7, 0x7fdb, 0x7fdc, 0x8021, 0x8164, 0x8160, 0x8177, 0x815c, 0x8169, 0x815b, 0x8162, 0x8172, 0x6721, 0x815e, 0x8176, 0x8167, 0x816f, 0x8144, 0x8161, 0x821d, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84f1, 0x843f, 0x8456, 0x8476, 0x8479, 0x848f, 0x848d, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844d, 0x847d, 0x845a, 0x8459, 0x8474, 0x8473, 0x845d, 0x8507, 0x845e, 0x8437, 0x843a, 0x8434, 0x847a, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83d9, 0x844b, 0x842f, 0x8442, 0x842d, 0x845f, 0x8470, 0x8439, 0x844e, 0x844c, 0x8452, 0x846f, 0x84c5, 0x848e, 0x843b, 0x8447, 0x8436, 0x8433, 0x8468, 0x847e, 0x8444, 0x842b, 0x8460, 0x8454, 0x846e, 0x8450, 0x870b, 0x8704, 0x86f7, 0x870c, 0x86fa, 0x86d6, 0x86f5, 0x874d, 0x86f8, 0x870e, 0x8709, 0x8701, 0x86f6, 0x870d, 0x8705, 0x88d6, 0x88cb, 0x88cd, 0x88ce, 0x88de, 0x88db, 0x88da, 0x88cc, 0x88d0, 0x8985, 0x899b, 0x89df, 0x89e5, 0x89e4, 0x89e1, 0x89e0, 0x89e2, 0x89dc, 0x89e6, 0x8a76, 0x8a86, 0x8a7f, 0x8a61, 0x8a3f, 0x8a77, 0x8a82, 0x8a84, 0x8a75, 0x8a83, 0x8a81, 0x8a74, 0x8a7a, 0x8c3c, 0x8c4b, 0x8c4a, 0x8c65, 0x8c64, 0x8c66, 0x8c86, 0x8c84, 0x8c85, 0x8ccc, 0x8d68, 0x8d69, 0x8d91, 0x8d8c, 0x8d8e, 0x8d8f, 0x8d8d, 0x8d93, 0x8d94, 0x8d90, 0x8d92, 0x8df0, 0x8de0, 0x8dec, 0x8df1, 0x8dee, 0x8dd0, 0x8de9, 0x8de3, 0x8de2, 0x8de7, 0x8df2, 0x8deb, 0x8df4, 0x8f06, 0x8eff, 0x8f01, 0x8f00, 0x8f05, 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 0x9044, 0x9049, 0x903d, 0x9110, 0x910d, 0x910f, 0x9111, 0x9116, 0x9114, 0x910b, 0x910e, 0x916e, 0x916f, 0x9248, 0x9252, 0x9230, 0x923a, 0x9266, 0x9233, 0x9265, 0x925e, 0x9283, 0x922e, 0x924a, 0x9246, 0x926d, 0x926c, 0x924f, 0x9260, 0x9267, 0x926f, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924e, 0x9253, 0x924c, 0x9256, 0x9232, 0x959f, 0x959c, 0x959e, 0x959b, 0x9692, 0x9693, 0x9691, 0x9697, 0x96ce, 0x96fa, 0x96fd, 0x96f8, 0x96f5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980f, 0x980d, 0x980e, 0x98ac, 0x98f6, 0x98f9, 0x99af, 0x99b2, 0x99b0, 0x99b5, 0x9aad, 0x9aab, 0x9b5b, 0x9cea, 0x9ced, 0x9ce7, 0x9e80, 0x9efd, 0x50e6, 0x50d4, 0x50d7, 0x50e8, 0x50f3, 0x50db, 0x50ea, 0x50dd, 0x50e4, 0x50d3, 0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0, 0x51d8, 0x5280, 0x5281, 0x52e9, 0x52eb, 0x5330, 0x53ac, 0x5627, 0x5615, 0x560c, 0x5612, 0x55fc, 0x560f, 0x561c, 0x5601, 0x5613, 0x5602, 0x55fa, 0x561d, 0x5604, 0x55ff, 0x55f9, 0x5889, 0x587c, 0x5890, 0x5898, 0x5886, 0x5881, 0x587f, 0x5874, 0x588b, 0x587a, 0x5887, 0x5891, 0x588e, 0x5876, 0x5882, 0x5888, 0x587b, 0x5894, 0x588f, 0x58fe, 0x596b, 0x5adc, 0x5aee, 0x5ae5, 0x5ad5, 0x5aea, 0x5ada, 0x5aed, 0x5aeb, 0x5af3, 0x5ae2, 0x5ae0, 0x5adb, 0x5aec, 0x5ade, 0x5add, 0x5ad9, 0x5ae8, 0x5adf, 0x5b77, 0x5be0, 0x5be3, 0x5c63, 0x5d82, 0x5d80, 0x5d7d, 0x5d86, 0x5d7a, 0x5d81, 0x5d77, 0x5d8a, 0x5d89, 0x5d88, 0x5d7e, 0x5d7c, 0x5d8d, 0x5d79, 0x5d7f, 0x5e58, 0x5e59, 0x5e53, 0x5ed8, 0x5ed1, 0x5ed7, 0x5ece, 0x5edc, 0x5ed5, 0x5ed9, 0x5ed2, 0x5ed4, 0x5f44, 0x5f43, 0x5f6f, 0x5fb6, 0x612c, 0x6128, 0x6141, 0x615e, 0x6171, 0x6173, 0x6152, 0x6153, 0x6172, 0x616c, 0x6180, 0x6174, 0x6154, 0x617a, 0x615b, 0x6165, 0x613b, 0x616a, 0x6161, 0x6156, 0x6229, 0x6227, 0x622b, 0x642b, 0x644d, 0x645b, 0x645d, 0x6474, 0x6476, 0x6472, 0x6473, 0x647d, 0x6475, 0x6466, 0x64a6, 0x644e, 0x6482, 0x645e, 0x645c, 0x644b, 0x6453, 0x6460, 0x6450, 0x647f, 0x643f, 0x646c, 0x646b, 0x6459, 0x6465, 0x6477, 0x6573, 0x65a0, 0x66a1, 0x66a0, 0x669f, 0x6705, 0x6704, 0x6722, 0x69b1, 0x69b6, 0x69c9, 0x69a0, 0x69ce, 0x6996, 0x69b0, 0x69ac, 0x69bc, 0x6991, 0x6999, 0x698e, 0x69a7, 0x698d, 0x69a9, 0x69be, 0x69af, 0x69bf, 0x69c4, 0x69bd, 0x69a4, 0x69d4, 0x69b9, 0x69ca, 0x699a, 0x69cf, 0x69b3, 0x6993, 0x69aa, 0x69a1, 0x699e, 0x69d9, 0x6997, 0x6990, 0x69c2, 0x69b5, 0x69a5, 0x69c6, 0x6b4a, 0x6b4d, 0x6b4b, 0x6b9e, 0x6b9f, 0x6ba0, 0x6bc3, 0x6bc4, 0x6bfe, 0x6ece, 0x6ef5, 0x6ef1, 0x6f03, 0x6f25, 0x6ef8, 0x6f37, 0x6efb, 0x6f2e, 0x6f09, 0x6f4e, 0x6f19, 0x6f1a, 0x6f27, 0x6f18, 0x6f3b, 0x6f12, 0x6eed, 0x6f0a, 0x6f36, 0x6f73, 0x6ef9, 0x6eee, 0x6f2d, 0x6f40, 0x6f30, 0x6f3c, 0x6f35, 0x6eeb, 0x6f07, 0x6f0e, 0x6f43, 0x6f05, 0x6efd, 0x6ef6, 0x6f39, 0x6f1c, 0x6efc, 0x6f3a, 0x6f1f, 0x6f0d, 0x6f1e, 0x6f08, 0x6f21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718f, 0x717b, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734d, 0x7351, 0x734c, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746e, 0x7500, 0x7502, 0x7503, 0x757d, 0x7590, 0x7616, 0x7608, 0x760c, 0x7615, 0x7611, 0x760a, 0x7614, 0x76b8, 0x7781, 0x777c, 0x7785, 0x7782, 0x776e, 0x7780, 0x776f, 0x777e, 0x7783, 0x78b2, 0x78aa, 0x78b4, 0x78ad, 0x78a8, 0x787e, 0x78ab, 0x789e, 0x78a5, 0x78a0, 0x78ac, 0x78a2, 0x78a4, 0x7998, 0x798a, 0x798b, 0x7996, 0x7995, 0x7994, 0x7993, 0x7997, 0x7988, 0x7992, 0x7990, 0x7a2b, 0x7a4a, 0x7a30, 0x7a2f, 0x7a28, 0x7a26, 0x7aa8, 0x7aab, 0x7aac, 0x7aee, 0x7b88, 0x7b9c, 0x7b8a, 0x7b91, 0x7b90, 0x7b96, 0x7b8d, 0x7b8c, 0x7b9b, 0x7b8e, 0x7b85, 0x7b98, 0x5284, 0x7b99, 0x7ba4, 0x7b82, 0x7cbb, 0x7cbf, 0x7cbc, 0x7cba, 0x7da7, 0x7db7, 0x7dc2, 0x7da3, 0x7daa, 0x7dc1, 0x7dc0, 0x7dc5, 0x7d9d, 0x7dce, 0x7dc4, 0x7dc6, 0x7dcb, 0x7dcc, 0x7daf, 0x7db9, 0x7d96, 0x7dbc, 0x7d9f, 0x7da6, 0x7dae, 0x7da9, 0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 0x8024, 0x805d, 0x805c, 0x8189, 0x8186, 0x8183, 0x8187, 0x818d, 0x818c, 0x818b, 0x8215, 0x8497, 0x84a4, 0x84a1, 0x849f, 0x84ba, 0x84ce, 0x84c2, 0x84ac, 0x84ae, 0x84ab, 0x84b9, 0x84b4, 0x84c1, 0x84cd, 0x84aa, 0x849a, 0x84b1, 0x84d0, 0x849d, 0x84a7, 0x84bb, 0x84a2, 0x8494, 0x84c7, 0x84cc, 0x849b, 0x84a9, 0x84af, 0x84a8, 0x84d6, 0x8498, 0x84b6, 0x84cf, 0x84a0, 0x84d7, 0x84d4, 0x84d2, 0x84db, 0x84b0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876b, 0x8740, 0x872e, 0x871e, 0x8721, 0x8719, 0x871b, 0x8743, 0x872c, 0x8741, 0x873e, 0x8746, 0x8720, 0x8732, 0x872a, 0x872d, 0x873c, 0x8712, 0x873a, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871a, 0x8730, 0x8711, 0x88f7, 0x88e7, 0x88f1, 0x88f2, 0x88fa, 0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb, 0x88f0, 0x88ec, 0x88eb, 0x899d, 0x89a1, 0x899f, 0x899e, 0x89e9, 0x89eb, 0x89e8, 0x8aab, 0x8a99, 0x8a8b, 0x8a92, 0x8a8f, 0x8a96, 0x8c3d, 0x8c68, 0x8c69, 0x8cd5, 0x8ccf, 0x8cd7, 0x8d96, 0x8e09, 0x8e02, 0x8dff, 0x8e0d, 0x8dfd, 0x8e0a, 0x8e03, 0x8e07, 0x8e06, 0x8e05, 0x8dfe, 0x8e00, 0x8e04, 0x8f10, 0x8f11, 0x8f0e, 0x8f0d, 0x9123, 0x911c, 0x9120, 0x9122, 0x911f, 0x911d, 0x911a, 0x9124, 0x9121, 0x911b, 0x917a, 0x9172, 0x9179, 0x9173, 0x92a5, 0x92a4, 0x9276, 0x929b, 0x927a, 0x92a0, 0x9294, 0x92aa, 0x928d, 0x92a6, 0x929a, 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e, 0x9282, 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286, 0x928c, 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, 0x928b, 0x922d, 0x969e, 0x96a1, 0x96ff, 0x9758, 0x977d, 0x977a, 0x977e, 0x9783, 0x9780, 0x9782, 0x977b, 0x9784, 0x9781, 0x977f, 0x97ce, 0x97cd, 0x9816, 0x98ad, 0x98ae, 0x9902, 0x9900, 0x9907, 0x999d, 0x999c, 0x99c3, 0x99b9, 0x99bb, 0x99ba, 0x99c2, 0x99bd, 0x99c7, 0x9ab1, 0x9ae3, 0x9ae7, 0x9b3e, 0x9b3f, 0x9b60, 0x9b61, 0x9b5f, 0x9cf1, 0x9cf2, 0x9cf5, 0x9ea7, 0x50ff, 0x5103, 0x5130, 0x50f8, 0x5106, 0x5107, 0x50f6, 0x50fe, 0x510b, 0x510c, 0x50fd, 0x510a, 0x528b, 0x528c, 0x52f1, 0x52ef, 0x5648, 0x5642, 0x564c, 0x5635, 0x5641, 0x564a, 0x5649, 0x5646, 0x5658, 0x565a, 0x5640, 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a, 0x563a, 0x571a, 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af, 0x58ac, 0x58a5, 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7, 0x5af6, 0x5b03, 0x5af8, 0x5b02, 0x5af9, 0x5b01, 0x5b07, 0x5b05, 0x5b0f, 0x5c67, 0x5d99, 0x5d97, 0x5d9f, 0x5d92, 0x5da2, 0x5d93, 0x5d95, 0x5da0, 0x5d9c, 0x5da1, 0x5d9a, 0x5d9e, 0x5e69, 0x5e5d, 0x5e60, 0x5e5c, 0x7df3, 0x5edb, 0x5ede, 0x5ee1, 0x5f49, 0x5fb2, 0x618b, 0x6183, 0x6179, 0x61b1, 0x61b0, 0x61a2, 0x6189, 0x619b, 0x6193, 0x61af, 0x61ad, 0x619f, 0x6192, 0x61aa, 0x61a1, 0x618d, 0x6166, 0x61b3, 0x622d, 0x646e, 0x6470, 0x6496, 0x64a0, 0x6485, 0x6497, 0x649c, 0x648f, 0x648b, 0x648a, 0x648c, 0x64a3, 0x649f, 0x6468, 0x64b1, 0x6498, 0x6576, 0x657a, 0x6579, 0x657b, 0x65b2, 0x65b3, 0x66b5, 0x66b0, 0x66a9, 0x66b2, 0x66b7, 0x66aa, 0x66af, 0x6a00, 0x6a06, 0x6a17, 0x69e5, 0x69f8, 0x6a15, 0x69f1, 0x69e4, 0x6a20, 0x69ff, 0x69ec, 0x69e2, 0x6a1b, 0x6a1d, 0x69fe, 0x6a27, 0x69f2, 0x69ee, 0x6a14, 0x69f7, 0x69e7, 0x6a40, 0x6a08, 0x69e6, 0x69fb, 0x6a0d, 0x69fc, 0x69eb, 0x6a09, 0x6a04, 0x6a18, 0x6a25, 0x6a0f, 0x69f6, 0x6a26, 0x6a07, 0x69f4, 0x6a16, 0x6b51, 0x6ba5, 0x6ba3, 0x6ba2, 0x6ba6, 0x6c01, 0x6c00, 0x6bff, 0x6c02, 0x6f41, 0x6f26, 0x6f7e, 0x6f87, 0x6fc6, 0x6f92, 0x6f8d, 0x6f89, 0x6f8c, 0x6f62, 0x6f4f, 0x6f85, 0x6f5a, 0x6f96, 0x6f76, 0x6f6c, 0x6f82, 0x6f55, 0x6f72, 0x6f52, 0x6f50, 0x6f57, 0x6f94, 0x6f93, 0x6f5d, 0x6f00, 0x6f61, 0x6f6b, 0x6f7d, 0x6f67, 0x6f90, 0x6f53, 0x6f8b, 0x6f69, 0x6f7f, 0x6f95, 0x6f63, 0x6f77, 0x6f6a, 0x6f7b, 0x71b2, 0x71af, 0x719b, 0x71b0, 0x71a0, 0x719a, 0x71a9, 0x71b5, 0x719d, 0x71a5, 0x719e, 0x71a4, 0x71a1, 0x71aa, 0x719c, 0x71a7, 0x71b3, 0x7298, 0x729a, 0x7358, 0x7352, 0x735e, 0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, 0x7362, 0x7487, 0x7489, 0x748a, 0x7486, 0x7481, 0x747d, 0x7485, 0x7488, 0x747c, 0x7479, 0x7508, 0x7507, 0x757e, 0x7625, 0x761e, 0x7619, 0x761d, 0x761c, 0x7623, 0x761a, 0x7628, 0x761b, 0x769c, 0x769d, 0x769e, 0x769b, 0x778d, 0x778f, 0x7789, 0x7788, 0x78cd, 0x78bb, 0x78cf, 0x78cc, 0x78d1, 0x78ce, 0x78d4, 0x78c8, 0x78c3, 0x78c4, 0x78c9, 0x799a, 0x79a1, 0x79a0, 0x799c, 0x79a2, 0x799b, 0x6b76, 0x7a39, 0x7ab2, 0x7ab4, 0x7ab3, 0x7bb7, 0x7bcb, 0x7bbe, 0x7bac, 0x7bce, 0x7baf, 0x7bb9, 0x7bca, 0x7bb5, 0x7cc5, 0x7cc8, 0x7ccc, 0x7ccb, 0x7df7, 0x7ddb, 0x7dea, 0x7de7, 0x7dd7, 0x7de1, 0x7e03, 0x7dfa, 0x7de6, 0x7df6, 0x7df1, 0x7df0, 0x7dee, 0x7ddf, 0x7f76, 0x7fac, 0x7fb0, 0x7fad, 0x7fed, 0x7feb, 0x7fea, 0x7fec, 0x7fe6, 0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f, 0x819e, 0x8195, 0x81a2, 0x8199, 0x8197, 0x8216, 0x824f, 0x8253, 0x8252, 0x8250, 0x824e, 0x8251, 0x8524, 0x853b, 0x850f, 0x8500, 0x8529, 0x850e, 0x8509, 0x850d, 0x851f, 0x850a, 0x8527, 0x851c, 0x84fb, 0x852b, 0x84fa, 0x8508, 0x850c, 0x84f4, 0x852a, 0x84f2, 0x8515, 0x84f7, 0x84eb, 0x84f3, 0x84fc, 0x8512, 0x84ea, 0x84e9, 0x8516, 0x84fe, 0x8528, 0x851d, 0x852e, 0x8502, 0x84fd, 0x851e, 0x84f6, 0x8531, 0x8526, 0x84e7, 0x84e8, 0x84f0, 0x84ef, 0x84f9, 0x8518, 0x8520, 0x8530, 0x850b, 0x8519, 0x852f, 0x8662, 0x8756, 0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b, 0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750, 0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, 0x876e, 0x875c, 0x8765, 0x874f, 0x877b, 0x8775, 0x8762, 0x8767, 0x8769, 0x885a, 0x8905, 0x890c, 0x8914, 0x890b, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890e, 0x8909, 0x89a2, 0x89a4, 0x89a3, 0x89ed, 0x89f0, 0x89ec, 0x8acf, 0x8ac6, 0x8ab8, 0x8ad3, 0x8ad1, 0x8ad4, 0x8ad5, 0x8abb, 0x8ad7, 0x8abe, 0x8ac0, 0x8ac5, 0x8ad8, 0x8ac3, 0x8aba, 0x8abd, 0x8ad9, 0x8c3e, 0x8c4d, 0x8c8f, 0x8ce5, 0x8cdf, 0x8cd9, 0x8ce8, 0x8cda, 0x8cdd, 0x8ce7, 0x8da0, 0x8d9c, 0x8da1, 0x8d9b, 0x8e20, 0x8e23, 0x8e25, 0x8e24, 0x8e2e, 0x8e15, 0x8e1b, 0x8e16, 0x8e11, 0x8e19, 0x8e26, 0x8e27, 0x8e14, 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c, 0x8f24, 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073, 0x9070, 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, 0x912a, 0x9132, 0x9126, 0x912e, 0x9185, 0x9186, 0x918a, 0x9181, 0x9182, 0x9184, 0x9180, 0x92d0, 0x92c3, 0x92c4, 0x92c0, 0x92d9, 0x92b6, 0x92cf, 0x92f1, 0x92df, 0x92d8, 0x92e9, 0x92d7, 0x92dd, 0x92cc, 0x92ef, 0x92c2, 0x92e8, 0x92ca, 0x92c8, 0x92ce, 0x92e6, 0x92cd, 0x92d5, 0x92c9, 0x92e0, 0x92de, 0x92e7, 0x92d1, 0x92d3, 0x92b5, 0x92e1, 0x9325, 0x92c6, 0x92b4, 0x957c, 0x95ac, 0x95ab, 0x95ae, 0x95b0, 0x96a4, 0x96a2, 0x96d3, 0x9705, 0x9708, 0x9702, 0x975a, 0x978a, 0x978e, 0x9788, 0x97d0, 0x97cf, 0x981e, 0x981d, 0x9826, 0x9829, 0x9828, 0x9820, 0x981b, 0x9827, 0x98b2, 0x9908, 0x98fa, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99dc, 0x99cd, 0x99cf, 0x99d3, 0x99d4, 0x99ce, 0x99c9, 0x99d6, 0x99d8, 0x99cb, 0x99d7, 0x99cc, 0x9ab3, 0x9aec, 0x9aeb, 0x9af3, 0x9af2, 0x9af1, 0x9b46, 0x9b43, 0x9b67, 0x9b74, 0x9b71, 0x9b66, 0x9b76, 0x9b75, 0x9b70, 0x9b68, 0x9b64, 0x9b6c, 0x9cfc, 0x9cfa, 0x9cfd, 0x9cff, 0x9cf7, 0x9d07, 0x9d00, 0x9cf9, 0x9cfb, 0x9d08, 0x9d05, 0x9d04, 0x9e83, 0x9ed3, 0x9f0f, 0x9f10, 0x511c, 0x5113, 0x5117, 0x511a, 0x5111, 0x51de, 0x5334, 0x53e1, 0x5670, 0x5660, 0x566e, 0x5673, 0x5666, 0x5663, 0x566d, 0x5672, 0x565e, 0x5677, 0x571c, 0x571b, 0x58c8, 0x58bd, 0x58c9, 0x58bf, 0x58ba, 0x58c2, 0x58bc, 0x58c6, 0x5b17, 0x5b19, 0x5b1b, 0x5b21, 0x5b14, 0x5b13, 0x5b10, 0x5b16, 0x5b28, 0x5b1a, 0x5b20, 0x5b1e, 0x5bef, 0x5dac, 0x5db1, 0x5da9, 0x5da7, 0x5db5, 0x5db0, 0x5dae, 0x5daa, 0x5da8, 0x5db2, 0x5dad, 0x5daf, 0x5db4, 0x5e67, 0x5e68, 0x5e66, 0x5e6f, 0x5ee9, 0x5ee7, 0x5ee6, 0x5ee8, 0x5ee5, 0x5f4b, 0x5fbc, 0x5fbb, 0x619d, 0x61a8, 0x6196, 0x61c5, 0x61b4, 0x61c6, 0x61c1, 0x61cc, 0x61ba, 0x61bf, 0x61b8, 0x618c, 0x64d7, 0x64d6, 0x64d0, 0x64cf, 0x64c9, 0x64bd, 0x6489, 0x64c3, 0x64db, 0x64f3, 0x64d9, 0x6533, 0x657f, 0x657c, 0x65a2, 0x66c8, 0x66be, 0x66c0, 0x66ca, 0x66cb, 0x66cf, 0x66bd, 0x66bb, 0x66ba, 0x66cc, 0x6723, 0x6a34, 0x6a66, 0x6a49, 0x6a67, 0x6a32, 0x6a68, 0x6a3e, 0x6a5d, 0x6a6d, 0x6a76, 0x6a5b, 0x6a51, 0x6a28, 0x6a5a, 0x6a3b, 0x6a3f, 0x6a41, 0x6a6a, 0x6a64, 0x6a50, 0x6a4f, 0x6a54, 0x6a6f, 0x6a69, 0x6a60, 0x6a3c, 0x6a5e, 0x6a56, 0x6a55, 0x6a4d, 0x6a4e, 0x6a46, 0x6b55, 0x6b54, 0x6b56, 0x6ba7, 0x6baa, 0x6bab, 0x6bc8, 0x6bc7, 0x6c04, 0x6c03, 0x6c06, 0x6fad, 0x6fcb, 0x6fa3, 0x6fc7, 0x6fbc, 0x6fce, 0x6fc8, 0x6f5e, 0x6fc4, 0x6fbd, 0x6f9e, 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba, 0x6fac, 0x6faa, 0x6fcf, 0x6fbf, 0x6fb8, 0x6fa2, 0x6fc9, 0x6fab, 0x6fcd, 0x6faf, 0x6fb2, 0x6fb0, 0x71c5, 0x71c2, 0x71bf, 0x71b8, 0x71d6, 0x71c0, 0x71c1, 0x71cb, 0x71d4, 0x71ca, 0x71c7, 0x71cf, 0x71bd, 0x71d8, 0x71bc, 0x71c6, 0x71da, 0x71db, 0x729d, 0x729e, 0x7369, 0x7366, 0x7367, 0x736c, 0x7365, 0x736b, 0x736a, 0x747f, 0x749a, 0x74a0, 0x7494, 0x7492, 0x7495, 0x74a1, 0x750b, 0x7580, 0x762f, 0x762d, 0x7631, 0x763d, 0x7633, 0x763c, 0x7635, 0x7632, 0x7630, 0x76bb, 0x76e6, 0x779a, 0x779d, 0x77a1, 0x779c, 0x779b, 0x77a2, 0x77a3, 0x7795, 0x7799, 0x7797, 0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, 0x78e3, 0x78db, 0x78e1, 0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, 0x7a44, 0x7a48, 0x7a47, 0x7ab6, 0x7ab8, 0x7ab5, 0x7ab1, 0x7ab7, 0x7bde, 0x7be3, 0x7be7, 0x7bdd, 0x7bd5, 0x7be5, 0x7bda, 0x7be8, 0x7bf9, 0x7bd4, 0x7bea, 0x7be2, 0x7bdc, 0x7beb, 0x7bd8, 0x7bdf, 0x7cd2, 0x7cd4, 0x7cd7, 0x7cd0, 0x7cd1, 0x7e12, 0x7e21, 0x7e17, 0x7e0c, 0x7e1f, 0x7e20, 0x7e13, 0x7e0e, 0x7e1c, 0x7e15, 0x7e1a, 0x7e22, 0x7e0b, 0x7e0f, 0x7e16, 0x7e0d, 0x7e14, 0x7e25, 0x7e24, 0x7f43, 0x7f7b, 0x7f7c, 0x7f7a, 0x7fb1, 0x7fef, 0x802a, 0x8029, 0x806c, 0x81b1, 0x81a6, 0x81ae, 0x81b9, 0x81b5, 0x81ab, 0x81b0, 0x81ac, 0x81b4, 0x81b2, 0x81b7, 0x81a7, 0x81f2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856b, 0x854d, 0x8553, 0x8561, 0x8558, 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, 0x8575, 0x8555, 0x8567, 0x8560, 0x858c, 0x8566, 0x855d, 0x8554, 0x8565, 0x856c, 0x8663, 0x8665, 0x8664, 0x87a4, 0x879b, 0x878f, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87a3, 0x8785, 0x8790, 0x8791, 0x879d, 0x8784, 0x8794, 0x879c, 0x879a, 0x8789, 0x891e, 0x8926, 0x8930, 0x892d, 0x892e, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892f, 0x892c, 0x891f, 0x89f1, 0x8ae0, 0x8ae2, 0x8af2, 0x8af4, 0x8af5, 0x8add, 0x8b14, 0x8ae4, 0x8adf, 0x8af0, 0x8ac8, 0x8ade, 0x8ae1, 0x8ae8, 0x8aff, 0x8aef, 0x8afb, 0x8c91, 0x8c92, 0x8c90, 0x8cf5, 0x8cee, 0x8cf1, 0x8cf0, 0x8cf3, 0x8d6c, 0x8d6e, 0x8da5, 0x8da7, 0x8e33, 0x8e3e, 0x8e38, 0x8e40, 0x8e45, 0x8e36, 0x8e3c, 0x8e3d, 0x8e41, 0x8e30, 0x8e3f, 0x8ebd, 0x8f36, 0x8f2e, 0x8f35, 0x8f32, 0x8f39, 0x8f37, 0x8f34, 0x9076, 0x9079, 0x907b, 0x9086, 0x90fa, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918d, 0x918f, 0x9327, 0x931e, 0x9308, 0x931f, 0x9306, 0x930f, 0x937a, 0x9338, 0x933c, 0x931b, 0x9323, 0x9312, 0x9301, 0x9346, 0x932d, 0x930e, 0x930d, 0x92cb, 0x931d, 0x92fa, 0x9313, 0x92f9, 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329, 0x9339, 0x9335, 0x932a, 0x9314, 0x930c, 0x930b, 0x92fe, 0x9309, 0x9300, 0x92fb, 0x9316, 0x95bc, 0x95cd, 0x95be, 0x95b9, 0x95ba, 0x95b6, 0x95bf, 0x95b5, 0x95bd, 0x96a9, 0x96d4, 0x970b, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97f0, 0x97f8, 0x9835, 0x982f, 0x9832, 0x9924, 0x991f, 0x9927, 0x9929, 0x999e, 0x99ee, 0x99ec, 0x99e5, 0x99e4, 0x99f0, 0x99e3, 0x99ea, 0x99e9, 0x99e7, 0x9ab9, 0x9abf, 0x9ab4, 0x9abb, 0x9af6, 0x9afa, 0x9af9, 0x9af7, 0x9b33, 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e, 0x9b7b, 0x9b82, 0x9b93, 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 0x9b7d, 0x9b88, 0x9d25, 0x9d17, 0x9d20, 0x9d1e, 0x9d14, 0x9d29, 0x9d1d, 0x9d18, 0x9d22, 0x9d10, 0x9d19, 0x9d1f, 0x9e88, 0x9e86, 0x9e87, 0x9eae, 0x9ead, 0x9ed5, 0x9ed6, 0x9efa, 0x9f12, 0x9f3d, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52f4, 0x5693, 0x568c, 0x568d, 0x5686, 0x5684, 0x5683, 0x567e, 0x5682, 0x567f, 0x5681, 0x58d6, 0x58d4, 0x58cf, 0x58d2, 0x5b2d, 0x5b25, 0x5b32, 0x5b23, 0x5b2c, 0x5b27, 0x5b26, 0x5b2f, 0x5b2e, 0x5b7b, 0x5bf1, 0x5bf2, 0x5db7, 0x5e6c, 0x5e6a, 0x5fbe, 0x61c3, 0x61b5, 0x61bc, 0x61e7, 0x61e0, 0x61e5, 0x61e4, 0x61e8, 0x61de, 0x64ef, 0x64e9, 0x64e3, 0x64eb, 0x64e4, 0x64e8, 0x6581, 0x6580, 0x65b6, 0x65da, 0x66d2, 0x6a8d, 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b, 0x6aa1, 0x6a9e, 0x6a87, 0x6a93, 0x6a8e, 0x6a95, 0x6a83, 0x6aa8, 0x6aa4, 0x6a91, 0x6a7f, 0x6aa6, 0x6a9a, 0x6a85, 0x6a8c, 0x6a92, 0x6b5b, 0x6bad, 0x6c09, 0x6fcc, 0x6fa9, 0x6ff4, 0x6fd4, 0x6fe3, 0x6fdc, 0x6fed, 0x6fe7, 0x6fe6, 0x6fde, 0x6ff2, 0x6fdd, 0x6fe2, 0x6fe8, 0x71e1, 0x71f1, 0x71e8, 0x71f2, 0x71e4, 0x71f0, 0x71e2, 0x7373, 0x736e, 0x736f, 0x7497, 0x74b2, 0x74ab, 0x7490, 0x74aa, 0x74ad, 0x74b1, 0x74a5, 0x74af, 0x7510, 0x7511, 0x7512, 0x750f, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76a4, 0x76e9, 0x77b5, 0x77ab, 0x77b2, 0x77b7, 0x77b6, 0x77b4, 0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, 0x7902, 0x78fb, 0x78fc, 0x78ff, 0x78f2, 0x7905, 0x78f9, 0x78fe, 0x7904, 0x79ab, 0x79a8, 0x7a5c, 0x7a5b, 0x7a56, 0x7a58, 0x7a54, 0x7a5a, 0x7abe, 0x7ac0, 0x7ac1, 0x7c05, 0x7c0f, 0x7bf2, 0x7c00, 0x7bff, 0x7bfb, 0x7c0e, 0x7bf4, 0x7c0b, 0x7bf3, 0x7c02, 0x7c09, 0x7c03, 0x7c01, 0x7bf8, 0x7bfd, 0x7c06, 0x7bf0, 0x7bf1, 0x7c10, 0x7c0a, 0x7ce8, 0x7e2d, 0x7e3c, 0x7e42, 0x7e33, 0x9848, 0x7e38, 0x7e2a, 0x7e49, 0x7e40, 0x7e47, 0x7e29, 0x7e4c, 0x7e30, 0x7e3b, 0x7e36, 0x7e44, 0x7e3a, 0x7f45, 0x7f7f, 0x7f7e, 0x7f7d, 0x7ff4, 0x7ff2, 0x802c, 0x81bb, 0x81c4, 0x81cc, 0x81ca, 0x81c5, 0x81c7, 0x81bc, 0x81e9, 0x825b, 0x825a, 0x825c, 0x8583, 0x8580, 0x858f, 0x85a7, 0x8595, 0x85a0, 0x858b, 0x85a3, 0x857b, 0x85a4, 0x859a, 0x859e, 0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, 0x8578, 0x8557, 0x858e, 0x8596, 0x8586, 0x858d, 0x8599, 0x859d, 0x8581, 0x85a2, 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859f, 0x8668, 0x87be, 0x87aa, 0x87ad, 0x87c5, 0x87b0, 0x87ac, 0x87b9, 0x87b5, 0x87bc, 0x87ae, 0x87c9, 0x87c3, 0x87c2, 0x87cc, 0x87b7, 0x87af, 0x87c4, 0x87ca, 0x87b4, 0x87b6, 0x87bf, 0x87b8, 0x87bd, 0x87de, 0x87b2, 0x8935, 0x8933, 0x893c, 0x893e, 0x8941, 0x8952, 0x8937, 0x8942, 0x89ad, 0x89af, 0x89ae, 0x89f2, 0x89f3, 0x8b1e, 0x8b18, 0x8b16, 0x8b11, 0x8b05, 0x8b0b, 0x8b22, 0x8b0f, 0x8b12, 0x8b15, 0x8b07, 0x8b0d, 0x8b08, 0x8b06, 0x8b1c, 0x8b13, 0x8b1a, 0x8c4f, 0x8c70, 0x8c72, 0x8c71, 0x8c6f, 0x8c95, 0x8c94, 0x8cf9, 0x8d6f, 0x8e4e, 0x8e4d, 0x8e53, 0x8e50, 0x8e4c, 0x8e47, 0x8f43, 0x8f40, 0x9085, 0x907e, 0x9138, 0x919a, 0x91a2, 0x919b, 0x9199, 0x919f, 0x91a1, 0x919d, 0x91a0, 0x93a1, 0x9383, 0x93af, 0x9364, 0x9356, 0x9347, 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355, 0x9352, 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363, 0x9367, 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3, 0x95c5, 0x95b7, 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718, 0x971d, 0x9719, 0x979a, 0x97a1, 0x979c, 0x979e, 0x979d, 0x97d5, 0x97d4, 0x97f1, 0x9841, 0x9844, 0x984a, 0x9849, 0x9845, 0x9843, 0x9925, 0x992b, 0x992c, 0x992a, 0x9933, 0x9932, 0x992f, 0x992d, 0x9931, 0x9930, 0x9998, 0x99a3, 0x99a1, 0x9a02, 0x99fa, 0x99f4, 0x99f7, 0x99f9, 0x99f8, 0x99f6, 0x99fb, 0x99fd, 0x99fe, 0x99fc, 0x9a03, 0x9abe, 0x9afe, 0x9afd, 0x9b01, 0x9afc, 0x9b48, 0x9b9a, 0x9ba8, 0x9b9e, 0x9b9b, 0x9ba6, 0x9ba1, 0x9ba5, 0x9ba4, 0x9b86, 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41, 0x9d67, 0x9d36, 0x9d2e, 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 0x9d45, 0x9d42, 0x9d43, 0x9d3e, 0x9d37, 0x9d40, 0x9d3d, 0x7ff5, 0x9d2d, 0x9e8a, 0x9e89, 0x9e8d, 0x9eb0, 0x9ec8, 0x9eda, 0x9efb, 0x9eff, 0x9f24, 0x9f23, 0x9f22, 0x9f54, 0x9fa0, 0x5131, 0x512d, 0x512e, 0x5698, 0x569c, 0x5697, 0x569a, 0x569d, 0x5699, 0x5970, 0x5b3c, 0x5c69, 0x5c6a, 0x5dc0, 0x5e6d, 0x5e6e, 0x61d8, 0x61df, 0x61ed, 0x61ee, 0x61f1, 0x61ea, 0x61f0, 0x61eb, 0x61d6, 0x61e9, 0x64ff, 0x6504, 0x64fd, 0x64f8, 0x6501, 0x6503, 0x64fc, 0x6594, 0x65db, 0x66da, 0x66db, 0x66d8, 0x6ac5, 0x6ab9, 0x6abd, 0x6ae1, 0x6ac6, 0x6aba, 0x6ab6, 0x6ab7, 0x6ac7, 0x6ab4, 0x6aad, 0x6b5e, 0x6bc9, 0x6c0b, 0x7007, 0x700c, 0x700d, 0x7001, 0x7005, 0x7014, 0x700e, 0x6fff, 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201, 0x71ff, 0x71f9, 0x7203, 0x71fd, 0x7376, 0x74b8, 0x74c0, 0x74b5, 0x74c1, 0x74be, 0x74b6, 0x74bb, 0x74c2, 0x7514, 0x7513, 0x765c, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765a, 0x76a6, 0x76bd, 0x76ec, 0x77c2, 0x77ba, 0x790c, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79ad, 0x79ac, 0x7a5f, 0x7c1c, 0x7c29, 0x7c19, 0x7c20, 0x7c1f, 0x7c2d, 0x7c1d, 0x7c26, 0x7c28, 0x7c22, 0x7c25, 0x7c30, 0x7e5c, 0x7e50, 0x7e56, 0x7e63, 0x7e58, 0x7e62, 0x7e5f, 0x7e51, 0x7e60, 0x7e57, 0x7e53, 0x7fb5, 0x7fb3, 0x7ff7, 0x7ff8, 0x8075, 0x81d1, 0x81d2, 0x81d0, 0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, 0x85c3, 0x85c2, 0x85b3, 0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, 0x85cb, 0x85ce, 0x85c8, 0x85c5, 0x85b1, 0x85b6, 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be, 0x8669, 0x87e7, 0x87e6, 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5, 0x87df, 0x87f3, 0x87e4, 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8, 0x87e3, 0x87d7, 0x87d9, 0x8801, 0x87f4, 0x87e8, 0x87dd, 0x8953, 0x894b, 0x894f, 0x894c, 0x8946, 0x8950, 0x8951, 0x8949, 0x8b2a, 0x8b27, 0x8b23, 0x8b33, 0x8b30, 0x8b35, 0x8b47, 0x8b2f, 0x8b3c, 0x8b3e, 0x8b31, 0x8b25, 0x8b37, 0x8b26, 0x8b36, 0x8b2e, 0x8b24, 0x8b3b, 0x8b3d, 0x8b3a, 0x8c42, 0x8c75, 0x8c99, 0x8c98, 0x8c97, 0x8cfe, 0x8d04, 0x8d02, 0x8d00, 0x8e5c, 0x8e62, 0x8e60, 0x8e57, 0x8e56, 0x8e5e, 0x8e65, 0x8e67, 0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, 0x8f47, 0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, 0x91a5, 0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, 0x9392, 0x93b7, 0x939b, 0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, 0x939e, 0x93a6, 0x9395, 0x9388, 0x9399, 0x939f, 0x9380, 0x938d, 0x93b1, 0x9391, 0x93b2, 0x93a4, 0x93a8, 0x93b4, 0x93a3, 0x95d2, 0x95d3, 0x95d1, 0x96b3, 0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, 0x96dd, 0x9723, 0x9722, 0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, 0x97a4, 0x97aa, 0x97a2, 0x97a5, 0x97d7, 0x97d9, 0x97d6, 0x97d8, 0x97fa, 0x9850, 0x9851, 0x9852, 0x98b8, 0x9941, 0x993c, 0x993a, 0x9a0f, 0x9a0b, 0x9a09, 0x9a0d, 0x9a04, 0x9a11, 0x9a0a, 0x9a05, 0x9a07, 0x9a06, 0x9ac0, 0x9adc, 0x9b08, 0x9b04, 0x9b05, 0x9b29, 0x9b35, 0x9b4a, 0x9b4c, 0x9b4b, 0x9bc7, 0x9bc6, 0x9bc3, 0x9bbf, 0x9bc1, 0x9bb5, 0x9bb8, 0x9bd3, 0x9bb6, 0x9bc4, 0x9bb9, 0x9bbd, 0x9d5c, 0x9d53, 0x9d4f, 0x9d4a, 0x9d5b, 0x9d4b, 0x9d59, 0x9d56, 0x9d4c, 0x9d57, 0x9d52, 0x9d54, 0x9d5f, 0x9d58, 0x9d5a, 0x9e8e, 0x9e8c, 0x9edf, 0x9f01, 0x9f00, 0x9f16, 0x9f25, 0x9f2b, 0x9f2a, 0x9f29, 0x9f28, 0x9f4c, 0x9f55, 0x5134, 0x5135, 0x5296, 0x52f7, 0x53b4, 0x56ab, 0x56ad, 0x56a6, 0x56a7, 0x56aa, 0x56ac, 0x58da, 0x58dd, 0x58db, 0x5912, 0x5b3d, 0x5b3e, 0x5b3f, 0x5dc3, 0x5e70, 0x5fbf, 0x61fb, 0x6507, 0x6510, 0x650d, 0x6509, 0x650c, 0x650e, 0x6584, 0x65de, 0x65dd, 0x66de, 0x6ae7, 0x6ae0, 0x6acc, 0x6ad1, 0x6ad9, 0x6acb, 0x6adf, 0x6adc, 0x6ad0, 0x6aeb, 0x6acf, 0x6acd, 0x6ade, 0x6b60, 0x6bb0, 0x6c0c, 0x7019, 0x7027, 0x7020, 0x7016, 0x702b, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701c, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, 0x72a6, 0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, 0x74b7, 0x74c3, 0x7516, 0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, 0x791d, 0x791b, 0x7921, 0x791c, 0x7917, 0x791e, 0x79b0, 0x7a67, 0x7a68, 0x7c33, 0x7c3c, 0x7c39, 0x7c2c, 0x7c3b, 0x7cec, 0x7cea, 0x7e76, 0x7e75, 0x7e78, 0x7e70, 0x7e77, 0x7e6f, 0x7e7a, 0x7e72, 0x7e74, 0x7e68, 0x7f4b, 0x7f4a, 0x7f83, 0x7f86, 0x7fb7, 0x7ffd, 0x7ffe, 0x8078, 0x81d7, 0x81d5, 0x820b, 0x8264, 0x8261, 0x8263, 0x85eb, 0x85f1, 0x85ed, 0x85d9, 0x85e1, 0x85e8, 0x85da, 0x85d7, 0x85ec, 0x85f2, 0x85f8, 0x85d8, 0x85df, 0x85e3, 0x85dc, 0x85d1, 0x85f0, 0x85e6, 0x85ef, 0x85de, 0x85e2, 0x8800, 0x87fa, 0x8803, 0x87f6, 0x87f7, 0x8809, 0x880c, 0x880b, 0x8806, 0x87fc, 0x8808, 0x87ff, 0x880a, 0x8802, 0x8962, 0x895a, 0x895b, 0x8957, 0x8961, 0x895c, 0x8958, 0x895d, 0x8959, 0x8988, 0x89b7, 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40, 0x8b53, 0x8b56, 0x8b54, 0x8b4b, 0x8b55, 0x8b51, 0x8b42, 0x8b52, 0x8b57, 0x8c43, 0x8c77, 0x8c76, 0x8c9a, 0x8d06, 0x8d07, 0x8d09, 0x8dac, 0x8daa, 0x8dad, 0x8dab, 0x8e6d, 0x8e78, 0x8e73, 0x8e6a, 0x8e6f, 0x8e7b, 0x8ec2, 0x8f52, 0x8f51, 0x8f4f, 0x8f50, 0x8f53, 0x8fb4, 0x9140, 0x913f, 0x91b0, 0x91ad, 0x93de, 0x93c7, 0x93cf, 0x93c2, 0x93da, 0x93d0, 0x93f9, 0x93ec, 0x93cc, 0x93d9, 0x93a9, 0x93e6, 0x93ca, 0x93d4, 0x93ee, 0x93e3, 0x93d5, 0x93c4, 0x93ce, 0x93c0, 0x93d2, 0x93a5, 0x93e7, 0x957d, 0x95da, 0x95db, 0x96e1, 0x9729, 0x972b, 0x972c, 0x9728, 0x9726, 0x97b3, 0x97b7, 0x97b6, 0x97dd, 0x97de, 0x97df, 0x985c, 0x9859, 0x985d, 0x9857, 0x98bf, 0x98bd, 0x98bb, 0x98be, 0x9948, 0x9947, 0x9943, 0x99a6, 0x99a7, 0x9a1a, 0x9a15, 0x9a25, 0x9a1d, 0x9a24, 0x9a1b, 0x9a22, 0x9a20, 0x9a27, 0x9a23, 0x9a1e, 0x9a1c, 0x9a14, 0x9ac2, 0x9b0b, 0x9b0a, 0x9b0e, 0x9b0c, 0x9b37, 0x9bea, 0x9beb, 0x9be0, 0x9bde, 0x9be4, 0x9be6, 0x9be2, 0x9bf0, 0x9bd4, 0x9bd7, 0x9bec, 0x9bdc, 0x9bd9, 0x9be5, 0x9bd5, 0x9be1, 0x9bda, 0x9d77, 0x9d81, 0x9d8a, 0x9d84, 0x9d88, 0x9d71, 0x9d80, 0x9d78, 0x9d86, 0x9d8b, 0x9d8c, 0x9d7d, 0x9d6b, 0x9d74, 0x9d75, 0x9d70, 0x9d69, 0x9d85, 0x9d73, 0x9d7b, 0x9d82, 0x9d6f, 0x9d79, 0x9d7f, 0x9d87, 0x9d68, 0x9e94, 0x9e91, 0x9ec0, 0x9efc, 0x9f2d, 0x9f40, 0x9f41, 0x9f4d, 0x9f56, 0x9f57, 0x9f58, 0x5337, 0x56b2, 0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, 0x5dc7, 0x5eee, 0x5eef, 0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65df, 0x66e8, 0x66e3, 0x66e4, 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9, 0x6af1, 0x6aee, 0x6aef, 0x703c, 0x7035, 0x702f, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703f, 0x703a, 0x7039, 0x702a, 0x7040, 0x703b, 0x7033, 0x7041, 0x7213, 0x7214, 0x72a8, 0x737d, 0x737c, 0x74ba, 0x76ab, 0x76aa, 0x76be, 0x76ed, 0x77cc, 0x77ce, 0x77cf, 0x77cd, 0x77f2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79b2, 0x7a6e, 0x7a6c, 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47, 0x7c45, 0x7cee, 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff, 0x8079, 0x81db, 0x81d9, 0x8268, 0x8269, 0x8622, 0x85ff, 0x8601, 0x85fe, 0x861b, 0x8600, 0x85f6, 0x8604, 0x8609, 0x8605, 0x860c, 0x85fd, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89b9, 0x89f7, 0x8b60, 0x8b6a, 0x8b5d, 0x8b68, 0x8b63, 0x8b65, 0x8b67, 0x8b6d, 0x8dae, 0x8e86, 0x8e88, 0x8e84, 0x8f59, 0x8f56, 0x8f57, 0x8f55, 0x8f58, 0x8f5a, 0x908d, 0x9143, 0x9141, 0x91b7, 0x91b5, 0x91b2, 0x91b3, 0x940b, 0x9413, 0x93fb, 0x9420, 0x940f, 0x9414, 0x93fe, 0x9415, 0x9410, 0x9428, 0x9419, 0x940d, 0x93f5, 0x9400, 0x93f7, 0x9407, 0x940e, 0x9416, 0x9412, 0x93fa, 0x9409, 0x93f8, 0x943c, 0x940a, 0x93ff, 0x93fc, 0x940c, 0x93f6, 0x9411, 0x9406, 0x95de, 0x95e0, 0x95df, 0x972e, 0x972f, 0x97b9, 0x97bb, 0x97fd, 0x97fe, 0x9860, 0x9862, 0x9863, 0x985f, 0x98c1, 0x98c2, 0x9950, 0x994e, 0x9959, 0x994c, 0x994b, 0x9953, 0x9a32, 0x9a34, 0x9a31, 0x9a2c, 0x9a2a, 0x9a36, 0x9a29, 0x9a2e, 0x9a38, 0x9a2d, 0x9ac7, 0x9aca, 0x9ac6, 0x9b10, 0x9b12, 0x9b11, 0x9c0b, 0x9c08, 0x9bf7, 0x9c05, 0x9c12, 0x9bf8, 0x9c40, 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f, 0x9d99, 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 0x9da0, 0x9d94, 0x9d9c, 0x9daa, 0x9d97, 0x9da1, 0x9d9a, 0x9da2, 0x9da8, 0x9d9e, 0x9da3, 0x9dbf, 0x9da9, 0x9d96, 0x9da6, 0x9da7, 0x9e99, 0x9e9b, 0x9e9a, 0x9ee5, 0x9ee4, 0x9ee7, 0x9ee6, 0x9f30, 0x9f2e, 0x9f5b, 0x9f60, 0x9f5e, 0x9f5d, 0x9f59, 0x9f91, 0x513a, 0x5139, 0x5298, 0x5297, 0x56c3, 0x56bd, 0x56be, 0x5b48, 0x5b47, 0x5dcb, 0x5dcf, 0x5ef1, 0x61fd, 0x651b, 0x6b02, 0x6afc, 0x6b03, 0x6af8, 0x6b00, 0x7043, 0x7044, 0x704a, 0x7048, 0x7049, 0x7045, 0x7046, 0x721d, 0x721a, 0x7219, 0x737e, 0x7517, 0x766a, 0x77d0, 0x792d, 0x7931, 0x792f, 0x7c54, 0x7c53, 0x7cf2, 0x7e8a, 0x7e87, 0x7e88, 0x7e8b, 0x7e86, 0x7e8d, 0x7f4d, 0x7fbb, 0x8030, 0x81dd, 0x8618, 0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, 0x862e, 0x8621, 0x8620, 0x8629, 0x861e, 0x8625, 0x8829, 0x881d, 0x881b, 0x8820, 0x8824, 0x881c, 0x882b, 0x884a, 0x896d, 0x8969, 0x896e, 0x896b, 0x89fa, 0x8b79, 0x8b78, 0x8b45, 0x8b7a, 0x8b7b, 0x8d10, 0x8d14, 0x8daf, 0x8e8e, 0x8e8c, 0x8f5e, 0x8f5b, 0x8f5d, 0x9146, 0x9144, 0x9145, 0x91b9, 0x943f, 0x943b, 0x9436, 0x9429, 0x943d, 0x9430, 0x9439, 0x942a, 0x9437, 0x942c, 0x9440, 0x9431, 0x95e5, 0x95e4, 0x95e3, 0x9735, 0x973a, 0x97bf, 0x97e1, 0x9864, 0x98c9, 0x98c6, 0x98c0, 0x9958, 0x9956, 0x9a39, 0x9a3d, 0x9a46, 0x9a44, 0x9a42, 0x9a41, 0x9a3a, 0x9a3f, 0x9acd, 0x9b15, 0x9b17, 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b, 0x9c1d, 0x9c1c, 0x9c2c, 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21, 0x9db7, 0x9db6, 0x9dbc, 0x9dc1, 0x9dc7, 0x9dca, 0x9dcf, 0x9dbe, 0x9dc5, 0x9dc3, 0x9dbb, 0x9db5, 0x9dce, 0x9db9, 0x9dba, 0x9dac, 0x9dc8, 0x9db1, 0x9dad, 0x9dcc, 0x9db3, 0x9dcd, 0x9db2, 0x9e7a, 0x9e9c, 0x9eeb, 0x9eee, 0x9eed, 0x9f1b, 0x9f18, 0x9f1a, 0x9f31, 0x9f4e, 0x9f65, 0x9f64, 0x9f92, 0x4eb9, 0x56c6, 0x56c5, 0x56cb, 0x5971, 0x5b4b, 0x5b4c, 0x5dd5, 0x5dd1, 0x5ef2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6b0b, 0x6b08, 0x6b09, 0x6c0d, 0x7055, 0x7056, 0x7057, 0x7052, 0x721e, 0x721f, 0x72a9, 0x737f, 0x74d8, 0x74d5, 0x74d9, 0x74d7, 0x766d, 0x76ad, 0x7935, 0x79b4, 0x7a70, 0x7a71, 0x7c57, 0x7c5c, 0x7c59, 0x7c5b, 0x7c5a, 0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, 0x7f87, 0x81de, 0x826b, 0x8634, 0x8635, 0x8633, 0x862c, 0x8632, 0x8636, 0x882c, 0x8828, 0x8826, 0x882a, 0x8825, 0x8971, 0x89bf, 0x89be, 0x89fb, 0x8b7e, 0x8b84, 0x8b82, 0x8b86, 0x8b85, 0x8b7f, 0x8d15, 0x8e95, 0x8e94, 0x8e9a, 0x8e92, 0x8e90, 0x8e96, 0x8e97, 0x8f60, 0x8f62, 0x9147, 0x944c, 0x9450, 0x944a, 0x944b, 0x944f, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973f, 0x97e3, 0x986a, 0x9869, 0x98cb, 0x9954, 0x995b, 0x9a4e, 0x9a53, 0x9a54, 0x9a4c, 0x9a4f, 0x9a48, 0x9a4a, 0x9a49, 0x9a52, 0x9a50, 0x9ad0, 0x9b19, 0x9b2b, 0x9b3b, 0x9b56, 0x9b55, 0x9c46, 0x9c48, 0x9c3f, 0x9c44, 0x9c39, 0x9c33, 0x9c41, 0x9c3c, 0x9c37, 0x9c34, 0x9c32, 0x9c3d, 0x9c36, 0x9ddb, 0x9dd2, 0x9dde, 0x9dda, 0x9dcb, 0x9dd0, 0x9ddc, 0x9dd1, 0x9ddf, 0x9de9, 0x9dd9, 0x9dd8, 0x9dd6, 0x9df5, 0x9dd5, 0x9ddd, 0x9eb6, 0x9ef0, 0x9f35, 0x9f33, 0x9f32, 0x9f42, 0x9f6b, 0x9f95, 0x9fa2, 0x513d, 0x5299, 0x58e8, 0x58e7, 0x5972, 0x5b4d, 0x5dd8, 0x882f, 0x5f4f, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66eb, 0x6b11, 0x6b12, 0x6b0f, 0x6bca, 0x705b, 0x705a, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77d4, 0x7c67, 0x7c66, 0x7e95, 0x826c, 0x863a, 0x8640, 0x8639, 0x863c, 0x8631, 0x863b, 0x863e, 0x8830, 0x8832, 0x882e, 0x8833, 0x8976, 0x8974, 0x8973, 0x89fe, 0x8b8c, 0x8b8e, 0x8b8b, 0x8b88, 0x8c45, 0x8d19, 0x8e98, 0x8f64, 0x8f63, 0x91bc, 0x9462, 0x9455, 0x945d, 0x9457, 0x945e, 0x97c4, 0x97c5, 0x9800, 0x9a56, 0x9a59, 0x9b1e, 0x9b1f, 0x9b20, 0x9c52, 0x9c58, 0x9c50, 0x9c4a, 0x9c4d, 0x9c4b, 0x9c55, 0x9c59, 0x9c4c, 0x9c4e, 0x9dfb, 0x9df7, 0x9def, 0x9de3, 0x9deb, 0x9df8, 0x9de4, 0x9df6, 0x9de1, 0x9dee, 0x9de6, 0x9df2, 0x9df0, 0x9de2, 0x9dec, 0x9df4, 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3, 0x9f06, 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 0x9f71, 0x9f70, 0x9f6e, 0x9f6f, 0x56d3, 0x56cd, 0x5b4e, 0x5c6d, 0x652d, 0x66ed, 0x66ee, 0x6b13, 0x705f, 0x7061, 0x705d, 0x7060, 0x7223, 0x74db, 0x74e5, 0x77d5, 0x7938, 0x79b7, 0x79b6, 0x7c6a, 0x7e97, 0x7f89, 0x826d, 0x8643, 0x8838, 0x8837, 0x8835, 0x884b, 0x8b94, 0x8b95, 0x8e9e, 0x8e9f, 0x8ea0, 0x8e9d, 0x91be, 0x91bd, 0x91c2, 0x946b, 0x9468, 0x9469, 0x96e5, 0x9746, 0x9743, 0x9747, 0x97c7, 0x97e5, 0x9a5e, 0x9ad5, 0x9b59, 0x9c63, 0x9c67, 0x9c66, 0x9c62, 0x9c5e, 0x9c60, 0x9e02, 0x9dfe, 0x9e07, 0x9e03, 0x9e06, 0x9e05, 0x9e00, 0x9e01, 0x9e09, 0x9dff, 0x9dfd, 0x9e04, 0x9ea0, 0x9f1e, 0x9f46, 0x9f74, 0x9f75, 0x9f76, 0x56d4, 0x652e, 0x65b8, 0x6b18, 0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, 0x77d9, 0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a, 0x7e98, 0x7e9b, 0x7e99, 0x81e0, 0x81e1, 0x8646, 0x8647, 0x8648, 0x8979, 0x897a, 0x897c, 0x897b, 0x89ff, 0x8b98, 0x8b99, 0x8ea5, 0x8ea4, 0x8ea3, 0x946e, 0x946d, 0x946f, 0x9471, 0x9473, 0x9749, 0x9872, 0x995f, 0x9c68, 0x9c6e, 0x9c6d, 0x9e0b, 0x9e0d, 0x9e10, 0x9e0f, 0x9e12, 0x9e11, 0x9ea1, 0x9ef5, 0x9f09, 0x9f47, 0x9f78, 0x9f7b, 0x9f7a, 0x9f79, 0x571e, 0x7066, 0x7c6f, 0x883c, 0x8db2, 0x8ea6, 0x91c3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9a60, 0x9b2e, 0x9c74, 0x9c73, 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x9fa4, 0x7068, 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e, 0x8c9c, 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, 0x9961, 0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, 0x9f48, 0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, 0x9481, 0x9a69, 0x9a68, 0x9e19, 0x864b, 0x8b9f, 0x9483, 0x9c79, 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a, 0x7229, 0x9ea4, 0x9f7e, 0x9f49, 0x9f98, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x4e28, 0x4e36, 0x4e3f, 0x4e85, 0x4e05, 0x4e04, 0x5182, 0x5196, 0x5338, 0x5369, 0x53b6, 0x4e2a, 0x4e87, 0x4e49, 0x51e2, 0x4e46, 0x4e8f, 0x4ebc, 0x4ebe, 0x5166, 0x51e3, 0x5204, 0x529c, 0x5344, 0x5902, 0x590a, 0x5b80, 0x5ddb, 0x5e7a, 0x5e7f, 0x5ef4, 0x5f50, 0x5f51, 0x5f61, 0x961d, 0x000b, 0x4e63, 0x4e62, 0x4ea3, 0x5185, 0x4ec5, 0x4ecf, 0x4ece, 0x4ecc, 0x5184, 0x5186, 0xf817, 0x34c5, 0x51e4, 0x5205, 0x529e, 0x529d, 0x52fd, 0x5300, 0x533a, 0x3539, 0x5346, 0x535d, 0x5386, 0x53b7, 0x3555, 0x53cc, 0x355b, 0x53ce, 0x5721, 0x37a2, 0x5e00, 0x5f0c, 0x6237, 0x6238, 0x6534, 0x6535, 0x65e0, 0x3e26, 0x738d, 0x4e97, 0x4ee0, 0x3432, 0x01a9, 0x4ee7, 0x3433, 0x4ee6, 0x3434, 0x36a2, 0x3431, 0x34b0, 0x56d8, 0x518b, 0x518c, 0x5199, 0x51e5, 0xf850, 0x520b, 0x34dc, 0x361e, 0x5304, 0x5303, 0x5307, 0xf82a, 0x531e, 0x535f, 0x536d, 0x5389, 0x53ba, 0x53d0, 0x3565, 0x53f6, 0x53f7, 0x53f9, 0x3564, 0x53f4, 0x361d, 0x3626, 0x5724, 0x5904, 0x5918, 0x5932, 0x5930, 0x5934, 0x368e, 0x5975, 0x374a, 0x5b82, 0x5bf9, 0x5c14, 0x378b, 0x37a6, 0x37a4, 0x37a5, 0x37a7, 0x382f, 0x3832, 0x5e81, 0x5e83, 0x5f0d, 0x5f52, 0x38d4, 0x5fca, 0x5fc7, 0x6239, 0x39c5, 0x624f, 0x65e7, 0x672f, 0x6b7a, 0x6c39, 0x3cba, 0x3cb9, 0x6c37, 0x6c44, 0x6c45, 0x738c, 0x7592, 0x7676, 0x9093, 0x9092, 0x48b3, 0x49ba, 0x4e21, 0x4e20, 0x4e22, 0x4e68, 0x4e89, 0x4e98, 0x4ef9, 0x4eef, 0x343b, 0x343c, 0x4ef8, 0x4f06, 0x4f03, 0x4efc, 0x4eee, 0x4f16, 0x3439, 0x4f28, 0x4f1c, 0x4f07, 0x4f1a, 0x4efa, 0x4f17, 0x514a, 0x34b2, 0x5172, 0xf815, 0x51b4, 0x51b3, 0x51b2, 0x34c7, 0x51e8, 0x342b, 0x5214, 0x520f, 0x5215, 0x5218, 0x52a8, 0xf82c, 0x534b, 0x534f, 0x353b, 0x5350, 0x3544, 0x538b, 0x3542, 0x53be, 0x355c, 0x53d2, 0x5416, 0x53ff, 0x3567, 0x5400, 0x3566, 0x5405, 0x5413, 0x5415, 0xf83b, 0x361f, 0x56e3, 0x5735, 0x5736, 0x5731, 0x5732, 0x58ee, 0x5905, 0x4e54, 0x368f, 0x5936, 0x3690, 0x36a8, 0x36a4, 0x597a, 0x36a3, 0x5986, 0x373d, 0x374c, 0x5b86, 0x5f53, 0x5c18, 0x378c, 0x5c3d, 0x5c78, 0x37a8, 0x37ad, 0x37af, 0x1d46, 0x5c80, 0x3829, 0x5e08, 0x3836, 0x3871, 0x3870, 0x386f, 0x5ef5, 0x5f0e, 0x38a9, 0x38aa, 0x38fb, 0x5fd3, 0x5fda, 0x38fc, 0x5fdb, 0x39ae, 0x620f, 0x625d, 0x625f, 0x6267, 0x6257, 0x9f50, 0x3ac3, 0x65eb, 0x65ea, 0x3b30, 0x6737, 0x3b41, 0x6732, 0x6736, 0x6b22, 0x6bce, 0x3c8c, 0x6c58, 0x6c51, 0x6c77, 0x6c3c, 0x3cbb, 0x6c5a, 0x3c86, 0x6c53, 0x706f, 0x7072, 0x706e, 0xf835, 0x3da1, 0x7073, 0x72b1, 0x72b2, 0x3ea8, 0x738f, 0x3eaa, 0x3eab, 0x4096, 0x793c, 0x41c2, 0x808d, 0x808e, 0x4493, 0x827b, 0x4494, 0x8d71, 0x8fb9, 0x9096, 0x909a, 0x49bb, 0x4e24, 0x4e71, 0xf81b, 0x4e9c, 0x4f45, 0x4f4a, 0x4f39, 0x4f37, 0x3443, 0x4f32, 0x4f42, 0x3442, 0x4f44, 0x4f4b, 0x3444, 0x4f40, 0x4f35, 0x4f31, 0x5151, 0xf80e, 0x5150, 0x514e, 0x34b3, 0x34b7, 0x519d, 0x34c8, 0x51b5, 0x51b8, 0x51ec, 0x5223, 0x5227, 0x5226, 0x521f, 0x522b, 0x5220, 0x52b4, 0x52b3, 0x3518, 0x5325, 0x533b, 0x5374, 0x3547, 0x3546, 0x3545, 0x356b, 0x3569, 0x544d, 0x3572, 0x3571, 0x543a, 0x356c, 0x356f, 0x5444, 0x544c, 0x5423, 0x541a, 0x5432, 0x544b, 0x5421, 0x3573, 0x5434, 0x5449, 0x5450, 0x5422, 0x543f, 0x5451, 0x545a, 0x542f, 0x3576, 0x56e9, 0x56f2, 0x56f3, 0x56ef, 0x56ed, 0x56ec, 0x56e6, 0x5748, 0x3627, 0x5744, 0x573f, 0x573c, 0x5753, 0x5756, 0x3630, 0x575f, 0x5743, 0x5758, 0x5757, 0x3629, 0x362a, 0x362f, 0x5746, 0x362c, 0x573d, 0x362d, 0x5742, 0x5754, 0x5755, 0x58f1, 0x58f2, 0x58f0, 0x590b, 0x9ea6, 0x56f1, 0x593d, 0x3693, 0x5994, 0x598c, 0x36ad, 0x599c, 0x36ac, 0x36ab, 0x599f, 0x36a9, 0x599b, 0x36ae, 0x5989, 0x599a, 0x36aa, 0x6588, 0x374e, 0x5b8d, 0x3750, 0x5bfe, 0x5bff, 0x5bfd, 0x5c2b, 0x37b2, 0x5c84, 0x5c8e, 0x5c9c, 0x37b5, 0x37b6, 0x5c85, 0x5df5, 0x5e09, 0x3839, 0x383b, 0x5e0b, 0x3872, 0x5e92, 0x5e90, 0x5f03, 0x38ac, 0x5f1e, 0x5f63, 0x3908, 0x5fe7, 0x5ffe, 0x5fe6, 0x5fdc, 0x5fce, 0x3903, 0x5ffc, 0x5fdf, 0x5fec, 0x5ff6, 0x25d7, 0x5ff2, 0x5ff0, 0x5ff9, 0x390b, 0x6213, 0x39af, 0xf8b2, 0x623b, 0x623c, 0x6282, 0x39ce, 0x39cb, 0x39cc, 0x6278, 0x628b, 0x39cd, 0x629e, 0x62a5, 0x629b, 0x629c, 0x6299, 0x628d, 0x6285, 0x629d, 0x6275, 0x3a80, 0x3aaf, 0x3ad3, 0x65f6, 0x3ad5, 0x3ad4, 0x3ad7, 0x66f5, 0x675b, 0x3b42, 0x6754, 0x6752, 0x3b44, 0x6758, 0x6744, 0x674a, 0x6761, 0x3cc6, 0x6c7f, 0x6c91, 0x6c9e, 0x3cc0, 0x6c6e, 0x6c7c, 0x6c9f, 0x6c75, 0x3cbe, 0x6c56, 0x6ca2, 0x6c79, 0x3cca, 0x6ca1, 0x3cc4, 0x6caa, 0x6ca0, 0x3cc2, 0x7079, 0x7077, 0x707e, 0x3da4, 0x7075, 0x707b, 0x7264, 0x3e29, 0x72bb, 0x72bc, 0x72c7, 0x72b9, 0x72be, 0x72b6, 0x3e60, 0x3e5e, 0x7398, 0x3ead, 0x3eae, 0x3eac, 0x3f57, 0x7593, 0x7680, 0x3fdd, 0x7683, 0x76c0, 0x76c1, 0x400e, 0x4097, 0x77f4, 0x77f5, 0x4127, 0x7acc, 0x7acd, 0x7cfa, 0x809f, 0x8091, 0x8097, 0x8094, 0x4495, 0x8286, 0x828c, 0xf98f, 0x8295, 0x4498, 0x866c, 0x459d, 0x8fb5, 0x8fbe, 0x8fc7, 0x488a, 0x8fc1, 0x90a9, 0x90a4, 0x48b5, 0x48b6, 0x48b7, 0x90a8, 0x9627, 0x9626, 0x962b, 0x9633, 0x9634, 0x9629, 0x4e3d, 0x3428, 0x4e9d, 0x4f93, 0x4f8a, 0x344d, 0x3449, 0x4f6d, 0x4f8e, 0x4fa0, 0x4fa2, 0x4fa1, 0x4f9f, 0x4fa3, 0x0209, 0x4f72, 0x3451, 0x4f8c, 0x5156, 0xf80f, 0xf811, 0x5190, 0x34cb, 0x34ca, 0x34cc, 0x51ed, 0x51fe, 0x522f, 0x06ec, 0x523c, 0x5234, 0x5239, 0x52b9, 0x52b5, 0x52bf, 0x5355, 0x353d, 0x5376, 0x537a, 0x5393, 0x3548, 0x53c1, 0x53c2, 0x53d5, 0x5485, 0x3578, 0x545f, 0x5493, 0x5489, 0x5479, 0x9efe, 0x548f, 0x5469, 0x546d, 0x357a, 0x5494, 0x546a, 0x548a, 0x3577, 0x56fd, 0x56fb, 0x56f8, 0x3621, 0x56fc, 0x56f6, 0x5765, 0x5781, 0x5763, 0x5767, 0x3631, 0x576e, 0x5778, 0x577f, 0x3633, 0x3634, 0x58f3, 0x594b, 0x594c, 0x36c1, 0x36b0, 0x36b4, 0x59ad, 0x36b8, 0x59c4, 0x36bc, 0x59c2, 0x59b0, 0x36bf, 0x36b5, 0x36b1, 0x36bd, 0x59bf, 0x36bb, 0x59c9, 0x59b8, 0x59ac, 0x36b3, 0x36b6, 0x36ba, 0x59b7, 0x59d7, 0x36b7, 0x5b60, 0x3740, 0x5b96, 0x5b9e, 0x5b94, 0x5b9f, 0x5b9d, 0x3752, 0x5c00, 0x5c19, 0x3790, 0x3791, 0x5c49, 0x5c4a, 0x37be, 0x5cbb, 0x5cc1, 0x37c0, 0x37c1, 0x37b9, 0x5cb9, 0x5c9e, 0x5cb4, 0x5cba, 0x5df6, 0x5e13, 0x5e12, 0x5e77, 0x3879, 0x5e98, 0x387b, 0x5e99, 0x5e9d, 0x5ef8, 0x38a0, 0x5ef9, 0x3429, 0x5f06, 0x5f21, 0x38ae, 0x5f25, 0x5f55, 0x38cd, 0x38cb, 0x38d9, 0x5f84, 0x5f83, 0x6030, 0x6007, 0x390c, 0x6036, 0x3901, 0x3905, 0x3902, 0x5fe9, 0x603d, 0x6008, 0x3913, 0x3911, 0x62ba, 0x62b2, 0x39e4, 0x62b7, 0x62e4, 0x62a7, 0x39da, 0x39d5, 0x39d3, 0x62d5, 0x62e1, 0x62dd, 0x62a6, 0x62c1, 0x62c5, 0x62c0, 0x62df, 0x62e0, 0x62de, 0x39d6, 0x6589, 0x3ab4, 0x65a6, 0x65ba, 0x3ad9, 0x65ff, 0x3ad8, 0x6617, 0x6618, 0x6601, 0x65fe, 0x3b33, 0x670c, 0x3b48, 0x676b, 0x6796, 0x6782, 0x678a, 0x3b47, 0x67a3, 0x3b4b, 0x67a2, 0x678f, 0x3b4a, 0x67f9, 0x6780, 0x6b26, 0x6b27, 0x6b68, 0x6b69, 0x3c5a, 0x6b81, 0x6bb4, 0x6bd1, 0x3c8e, 0x3cb4, 0x6c1c, 0x3ccd, 0x3ccc, 0x3ccf, 0x3ccb, 0x3cce, 0x6c97, 0x6c6c, 0x6cdf, 0x3cd2, 0x6cea, 0x3cd1, 0x6ce4, 0x6cd8, 0x6cb2, 0x6cce, 0x6cc8, 0x3da6, 0x708b, 0x7088, 0x7090, 0x708f, 0x3daa, 0x7087, 0x7089, 0x708d, 0x7081, 0x3da8, 0x708c, 0x3e13, 0x3e1a, 0x7240, 0x3e1d, 0x3e1e, 0x7265, 0x7266, 0x7268, 0x3e65, 0x3e66, 0x72cd, 0x72d3, 0x72db, 0x3e64, 0x72cf, 0x73a7, 0x73a3, 0x739e, 0x3eb0, 0x73af, 0x3eb3, 0x3eb5, 0x73aa, 0x739c, 0x3f19, 0x7542, 0x7544, 0x753b, 0x7541, 0x233f, 0x759b, 0x759e, 0x3f75, 0x79c4, 0x79c3, 0x79c6, 0x412b, 0x412c, 0x79c7, 0x412d, 0x79ca, 0x592e, 0x41c3, 0x7acf, 0x7c76, 0x7c74, 0x7cff, 0x7cfc, 0x34ba, 0x4350, 0x7f59, 0x80a8, 0x43d3, 0x43d0, 0x80b0, 0x43dc, 0x80b3, 0x43d2, 0x80a4, 0x80b6, 0x80a7, 0x80ac, 0x43db, 0x80a6, 0x5367, 0x820e, 0x82c4, 0x833e, 0x829c, 0x44a5, 0x449f, 0x449a, 0x449c, 0x44a2, 0x82aa, 0x449b, 0x82c9, 0x44a3, 0x449d, 0x82a6, 0x82b2, 0x4588, 0x461a, 0x488d, 0x8fcc, 0x8fd9, 0x8fca, 0x8fd8, 0x8fcf, 0x90b7, 0x48b8, 0x90ad, 0x90b9, 0x9637, 0x49c3, 0x9641, 0x963e, 0x96b6, 0x9751, 0x9763, 0x4e57, 0x4e79, 0x4eb2, 0x4eb0, 0x4eaf, 0x4eb1, 0x4fd2, 0x4fd5, 0x345d, 0x4fbe, 0x4fb8, 0x4fb0, 0x4fb1, 0x4fc8, 0x345a, 0x3457, 0x4fc6, 0x4fcc, 0x4fe5, 0x4fe3, 0x4fb4, 0x516a, 0x34b8, 0x519f, 0x34c2, 0x51c1, 0x34cf, 0x51c2, 0x51c3, 0x5245, 0x5248, 0x34e7, 0x34e9, 0x524f, 0x4452, 0x34e8, 0x52c5, 0x52ca, 0x52c4, 0x5327, 0x5358, 0x537d, 0x354a, 0x53dd, 0x53dc, 0x53da, 0x53d9, 0x54b9, 0x3580, 0x54d0, 0x54b4, 0x54ca, 0x3587, 0x54a3, 0x54da, 0x54a4, 0x3584, 0x54b2, 0x549e, 0x549f, 0x54b5, 0x3582, 0x3581, 0x54cd, 0x3583, 0x54cc, 0x3622, 0x5700, 0x57ac, 0x5791, 0x578e, 0x578d, 0x5792, 0x57a1, 0x5790, 0x57a6, 0x57a8, 0x363b, 0x579c, 0x5796, 0x57a7, 0x363a, 0x3638, 0x3639, 0x3636, 0x58f5, 0x3685, 0x5909, 0x5908, 0x3c54, 0x5952, 0x369a, 0x36c4, 0x59df, 0x36c5, 0x59eb, 0x59ef, 0x59f0, 0x59d5, 0x5a0d, 0x5a04, 0x59f9, 0x5a02, 0x59f8, 0x59e2, 0x59d9, 0x59e7, 0x5b6a, 0x3754, 0x3755, 0x5bab, 0x3756, 0x5c1b, 0x5c2f, 0x3796, 0x663c, 0x3795, 0x3794, 0x37c4, 0x5cd1, 0x5cdc, 0x5ce6, 0x5ce1, 0x5ccd, 0xf87a, 0x5ce2, 0x5cdd, 0x5ce5, 0x5dfb, 0x5dfa, 0x5e1e, 0x3844, 0x5ea1, 0x387d, 0x387e, 0x5efc, 0x5efb, 0x5f2f, 0x38b2, 0x38b6, 0x5f66, 0xf899, 0x38dc, 0x38df, 0x605c, 0x3928, 0x604e, 0x6051, 0x3919, 0x3910, 0x6023, 0x6031, 0x607c, 0x6052, 0x392c, 0x6060, 0x604a, 0x6061, 0x391b, 0x6218, 0x39c2, 0x39ef, 0x39e3, 0x39e5, 0x39ea, 0x39e6, 0x39ee, 0x631f, 0x6317, 0x62ea, 0x6321, 0x6304, 0x6305, 0x39e8, 0x6531, 0x6544, 0x6540, 0x3a85, 0x6542, 0x65be, 0x3ae0, 0x6629, 0x661b, 0x3add, 0x6623, 0x662c, 0x661a, 0x6630, 0x663b, 0x661e, 0x6637, 0x6638, 0x3ae1, 0x670e, 0x3b51, 0x3b55, 0x67e8, 0x67d6, 0x3b52, 0x67c7, 0x67bc, 0x6852, 0x67bf, 0x67d5, 0x67fe, 0x8363, 0x67fb, 0xf8df, 0x67b1, 0x6801, 0x6805, 0x6800, 0x67d7, 0x409e, 0x6b2a, 0x6b6b, 0x3c52, 0x3c5e, 0x3c60, 0x3c5f, 0x6be1, 0x3c92, 0x3cd6, 0x6d23, 0x6cff, 0x6d14, 0x6d05, 0x6d13, 0x6d06, 0x6d21, 0x3cde, 0x6d15, 0x6caf, 0x6cf4, 0x6d02, 0x6d45, 0xf8fe, 0x6d26, 0x3cd9, 0x6d44, 0x3cdd, 0x6d24, 0x70a5, 0x3dac, 0x70a3, 0x3db0, 0x70a2, 0x70bb, 0x70a0, 0x70aa, 0x3daf, 0x3dae, 0x70a8, 0x70b6, 0x70b2, 0x70a7, 0x3dad, 0x3dab, 0x70b9, 0x722e, 0x3e16, 0x723c, 0x3e30, 0x726d, 0x3e33, 0x3e31, 0x72e7, 0x72ed, 0x3e6e, 0x72ec, 0x72e5, 0x72e2, 0x3eb1, 0x73c4, 0x73bd, 0x73cf, 0x73c9, 0x73c1, 0x73d0, 0x3eb7, 0x73ce, 0x74ed, 0x74eb, 0x3f1a, 0x74ef, 0x7549, 0x7550, 0x7546, 0x754a, 0x3f59, 0x754d, 0x75a6, 0x3f7a, 0x3f78, 0x3f7b, 0x75a8, 0x3fde, 0x3fec, 0x76c7, 0x76ff, 0x401e, 0x76fd, 0x77e6, 0x780a, 0x409b, 0x7804, 0x780b, 0x7807, 0x409d, 0x7815, 0x7808, 0x40fd, 0x79d3, 0x79d4, 0x79d0, 0x79d7, 0x7a7c, 0x4194, 0x4193, 0x7a7d, 0x7a83, 0x7a82, 0x41c6, 0x7ad4, 0x7ad5, 0x7ad3, 0x7ad0, 0x7ad2, 0x7afe, 0x7afc, 0x7c77, 0x7c7c, 0x7c7b, 0x42b8, 0xf96a, 0x42b7, 0x42b9, 0x4353, 0x5133, 0x4352, 0x4351, 0x7f8f, 0x80d3, 0x43e3, 0x80cb, 0x80d2, 0x43e2, 0x8109, 0x80e2, 0x80df, 0x80c6, 0x4463, 0x8224, 0x82f7, 0x82d8, 0x82dd, 0x44aa, 0x44a6, 0x82f8, 0x82fc, 0x44a8, 0x44a9, 0x82e9, 0x44ab, 0x82ee, 0x44ac, 0x82d0, 0x830e, 0x82e2, 0x830b, 0x82fd, 0x5179, 0x8676, 0x459e, 0x8678, 0x459f, 0x45a0, 0x8675, 0x867d, 0x460f, 0x8842, 0x8866, 0x461c, 0x898c, 0x8a05, 0x46ae, 0x8a06, 0x46b0, 0x8c9f, 0x47d4, 0x8ff1, 0x8fe7, 0x8fe9, 0x8fef, 0x90c2, 0x90bc, 0x48bb, 0x90c6, 0x90c0, 0x48c1, 0x48c2, 0x90cd, 0x90c9, 0x48be, 0x90c4, 0x48e5, 0x9581, 0x49c6, 0x9cec, 0x5032, 0x4ff9, 0x501d, 0x4fff, 0x5004, 0x4ff0, 0x5003, 0x462e, 0x5002, 0x4ffc, 0x4ff2, 0x5024, 0x5008, 0x5036, 0x502e, 0x3465, 0x5010, 0x5038, 0x5039, 0x4ffd, 0x5056, 0x4ffb, 0x51a3, 0x51a6, 0x51a1, 0x34d1, 0x34d0, 0x51c7, 0x51c9, 0x5260, 0x5264, 0x5259, 0x5265, 0x5267, 0x5257, 0x5263, 0x34ee, 0x5253, 0x34ef, 0x52cf, 0x351e, 0x52ce, 0x52d0, 0x52d1, 0x52cc, 0x354b, 0x354d, 0x3556, 0x550d, 0x54f4, 0x3592, 0x5513, 0x54ef, 0x54f5, 0x54f9, 0x5502, 0x5500, 0x3593, 0x3590, 0x5518, 0x54f0, 0x54f6, 0xf841, 0x3597, 0x5519, 0x3623, 0x5705, 0x57c9, 0x363f, 0x57b7, 0x57cd, 0x3643, 0x3642, 0x3644, 0x57be, 0x57bb, 0x3645, 0x57db, 0x57c8, 0x57c4, 0x57c5, 0x57d1, 0x57ca, 0x57c0, 0x36d9, 0x36de, 0x5a21, 0x5a2a, 0x36cf, 0x5a1d, 0x36cd, 0x5a0b, 0x36dd, 0x36ce, 0x36d3, 0x36d6, 0x5a22, 0x36dc, 0x36d1, 0x5a24, 0x36d0, 0x5a14, 0x5a31, 0x36d5, 0x5a2f, 0x5a1a, 0x5a12, 0x36d4, 0x36db, 0x5a26, 0x172e, 0x3743, 0x5bbc, 0x5bbb, 0x5bb7, 0x5c05, 0x5c06, 0x5c52, 0x5c53, 0x37cd, 0x37d1, 0x5cfa, 0x5ceb, 0x37ca, 0x5cf3, 0x5cf5, 0x5ce9, 0x5cef, 0x37d4, 0x5e2a, 0x5e30, 0x5e2e, 0x5e2c, 0x5e2f, 0x5eaf, 0x5ea9, 0x3886, 0x5efd, 0x5f32, 0x5f8e, 0x5f93, 0x5f8f, 0x604f, 0x6099, 0x3933, 0x607e, 0x3937, 0x6074, 0x604b, 0x6073, 0x6075, 0x392a, 0x391f, 0x6056, 0x60a9, 0x608b, 0x60a6, 0x3939, 0x6093, 0x60ae, 0x609e, 0x60a7, 0x6245, 0x39f2, 0x39f8, 0x632e, 0x39f7, 0x6352, 0x6330, 0x635b, 0x39f4, 0x6319, 0x631b, 0x39f1, 0x6331, 0x635d, 0x6337, 0x6335, 0x6353, 0x39f5, 0x635c, 0x633f, 0x654b, 0x3a87, 0x4369, 0x658b, 0x3ab6, 0x659a, 0x6650, 0x6646, 0x664e, 0x6640, 0x3ae9, 0x664b, 0x6648, 0x3aeb, 0x6660, 0x6644, 0x664d, 0x3b34, 0x6837, 0x6824, 0x3b62, 0x3b5c, 0x681b, 0x6836, 0x3b60, 0x682c, 0x6819, 0x6856, 0x6847, 0x683e, 0x681e, 0xf8e1, 0x6815, 0x6822, 0x6827, 0x6859, 0x6858, 0x6855, 0x6830, 0x6823, 0x6b2e, 0x6b2b, 0x6b30, 0x6b6c, 0x3c61, 0x6b8b, 0x3c7f, 0x6be9, 0x6bea, 0x6be5, 0x6d6b, 0x3ce5, 0x3ce6, 0x6d73, 0x6d57, 0x3ce9, 0x3cf3, 0x6d5d, 0x6d56, 0x6d8f, 0x6d5b, 0x6d1c, 0x6d9a, 0x6d9b, 0x6d99, 0x3cee, 0x6d81, 0x6d71, 0x3ced, 0x3cec, 0x6d72, 0x6d5c, 0x6d96, 0x70c4, 0x70db, 0x70cc, 0x70d0, 0x70e3, 0x70df, 0x3db3, 0x70d6, 0x70ee, 0x70d5, 0x3db5, 0x3e27, 0x3e35, 0x3e36, 0x727a, 0x3e71, 0x72f5, 0x7302, 0x3eb8, 0x3ec2, 0x73e2, 0x73ec, 0x73d5, 0x73f9, 0x73df, 0x73e6, 0x3ec8, 0x3ec0, 0x3ec1, 0x3ec4, 0x73e4, 0x73e1, 0x74f3, 0x3f1f, 0x3f1c, 0x3f1d, 0x3f4d, 0x7556, 0x7555, 0x7558, 0x7557, 0x755e, 0x75c3, 0x3f87, 0x3f82, 0x75b4, 0x3f7d, 0x75b1, 0x3fdf, 0x4000, 0x76cb, 0x76cc, 0x772a, 0x4020, 0x7716, 0x770f, 0x4022, 0x4024, 0x773f, 0x772b, 0x770e, 0x7724, 0x4021, 0x7721, 0x7718, 0x77dd, 0x40a4, 0x40a5, 0x7824, 0x7836, 0x4101, 0x7958, 0x7959, 0x4103, 0x7962, 0x79da, 0x79d9, 0x4137, 0x79e1, 0x79e5, 0x79e8, 0x79db, 0x4138, 0x79e2, 0x79f0, 0x4199, 0x4198, 0x4197, 0x41c9, 0x7ada, 0x7add, 0x41c7, 0x7adb, 0x7adc, 0x41d9, 0x41db, 0x7b0d, 0x7b0b, 0x7b14, 0x7c8e, 0x7c86, 0x427b, 0x7c87, 0x7c83, 0x7c8b, 0x427c, 0x42bd, 0x42bc, 0x42c3, 0x7d24, 0x42c1, 0x42bf, 0x42c4, 0x7d25, 0x7f62, 0x7f93, 0x7f99, 0x7f97, 0x437e, 0x437f, 0x7fc4, 0x7fc6, 0x800a, 0x43b4, 0x43b3, 0x8040, 0x803c, 0x803b, 0x80f6, 0x80ff, 0x80ee, 0x8104, 0x8103, 0x8107, 0xf983, 0x43e6, 0x80f7, 0x4459, 0x445a, 0x822d, 0x4464, 0x8227, 0x8229, 0x831f, 0x8357, 0x44b4, 0x44b9, 0x44b7, 0x44b5, 0x8321, 0x44c1, 0x44b1, 0x8318, 0x8358, 0x44b3, 0x44ba, 0x458c, 0x458b, 0x458d, 0x8684, 0x869f, 0x869b, 0x8689, 0x86a6, 0x8692, 0x868f, 0x86a0, 0x884f, 0x8878, 0x887a, 0x886e, 0x887b, 0x8884, 0x8873, 0x4678, 0x4677, 0x8a0d, 0x8a0b, 0x8a19, 0x46b2, 0x47d6, 0x8ed0, 0x4845, 0x4892, 0x4895, 0x8ff9, 0x9009, 0x9008, 0x48c6, 0x90de, 0x9151, 0x48e7, 0x48e8, 0x91db, 0x91df, 0x91de, 0x91d6, 0x91e0, 0x9585, 0x9660, 0x9659, 0x49cb, 0x9656, 0x49cd, 0x49f1, 0x96bd, 0x4b22, 0x3421, 0x5042, 0x5059, 0x346f, 0x5044, 0x5066, 0x5052, 0x5054, 0x5071, 0x5050, 0x507b, 0x507c, 0x5058, 0x3470, 0x3464, 0x5079, 0x506c, 0x5078, 0x51a8, 0x51d1, 0x51cf, 0x5268, 0x5276, 0x52d4, 0x352d, 0x53a0, 0x53c4, 0x3558, 0x5558, 0x554c, 0x5568, 0x35a6, 0x5549, 0x35a4, 0x359f, 0x555d, 0x5529, 0x0dae, 0x5554, 0x5553, 0x35a3, 0x555a, 0x35a0, 0x553a, 0x553f, 0x552b, 0x57ea, 0x364a, 0x57ef, 0x3647, 0x3648, 0x57dd, 0x57fe, 0xf855, 0x57de, 0x57e6, 0x3649, 0x57e8, 0x57ff, 0x5803, 0x58f7, 0x68a6, 0x591f, 0x369e, 0x595b, 0x595d, 0x595e, 0x1637, 0x36e8, 0x5a2b, 0x36ec, 0x5a3b, 0x36ed, 0x36e6, 0x5a61, 0x5a3a, 0x5a6e, 0x5a4b, 0x5a6b, 0x36eb, 0x36e7, 0x5a45, 0x5a4e, 0x5a68, 0x5a3d, 0x5a71, 0x5a3f, 0x5a6f, 0x5a75, 0x36e9, 0x5a73, 0x5a2c, 0x5a59, 0x5a54, 0x5a4f, 0x5a63, 0x375c, 0x375d, 0x5bc8, 0x3760, 0x5bc3, 0x375b, 0x5c5b, 0x5c61, 0x3799, 0x5d21, 0x5d0a, 0x5d09, 0x37d8, 0x5d2c, 0x5d08, 0x37da, 0x37dd, 0x5d2a, 0x5d15, 0x37e0, 0x5d10, 0x5d13, 0x37e5, 0x5d2f, 0x5d18, 0x37d7, 0x5de3, 0x5e39, 0x5e35, 0x5e3a, 0x5e32, 0x384e, 0x388c, 0x3888, 0xf88d, 0x5ebb, 0x5eba, 0x5f34, 0x5f39, 0x38ce, 0xf89c, 0x38e5, 0x38e6, 0x6098, 0x3932, 0x60d0, 0x3940, 0x3947, 0x394c, 0x60d7, 0x60aa, 0x3935, 0x60a1, 0x60a4, 0x3930, 0x60ee, 0x3943, 0x60e7, 0x394d, 0x60e8, 0x60de, 0x39b7, 0x39f3, 0x637e, 0x638b, 0x3a02, 0x3a0b, 0x6379, 0x6386, 0x6393, 0x3a04, 0x6373, 0x636a, 0xf8ba, 0x636c, 0x3a08, 0x637f, 0x39fc, 0x63b2, 0x63ba, 0x39ff, 0x3a00, 0x6366, 0x6374, 0x3a8b, 0x655a, 0x3a8d, 0x654e, 0x654d, 0x658d, 0x658e, 0x65ad, 0x3aca, 0x65c7, 0x65ca, 0x3acb, 0x65c9, 0xf8cb, 0x65e3, 0x6657, 0x3af3, 0x6663, 0x6667, 0x671a, 0x6719, 0x6716, 0x3b36, 0x3b6a, 0x689e, 0x68b6, 0x6898, 0x6873, 0x3b6b, 0x689a, 0x688e, 0x68b7, 0x68db, 0x68a5, 0x686c, 0x68c1, 0x6884, 0x3b71, 0x3b68, 0x6895, 0x687a, 0x6899, 0x3b72, 0x68b8, 0x68b9, 0x6870, 0x3c2e, 0x6b35, 0x3c62, 0x6b90, 0x6bbb, 0x6bed, 0x3c98, 0x3cb5, 0x3ceb, 0x6dc1, 0x6dc3, 0x6dce, 0x3cfb, 0x3cf8, 0x6dad, 0x6e04, 0x3cf5, 0x6db9, 0x3d08, 0x6de7, 0xf907, 0x6e08, 0x6e06, 0x3d0a, 0x6e0a, 0x6db0, 0x3d06, 0x6df8, 0x6e0c, 0x3cfd, 0x6db1, 0x3cfa, 0x6e02, 0x6e07, 0x6e09, 0x6e01, 0x6e17, 0x6dff, 0x6e12, 0x3dba, 0x3db9, 0x7103, 0x7107, 0x7101, 0x70f5, 0x70f1, 0x7108, 0x70f2, 0x710f, 0x3dbb, 0x70fe, 0x3e18, 0x3e40, 0x3e3d, 0x731a, 0x7310, 0x730e, 0x7402, 0x73f3, 0x3ecd, 0x3ec9, 0x73fb, 0x3ecb, 0x3eca, 0x3ece, 0x751b, 0x7523, 0x7561, 0x7568, 0x3f5e, 0x7567, 0x75d3, 0x3f91, 0x3f8c, 0x7690, 0x3fe1, 0x4002, 0x76d5, 0x76d7, 0x76d6, 0x7730, 0x402b, 0x7726, 0x402a, 0x7740, 0x3e14, 0x771e, 0x40ad, 0x40a3, 0x40ab, 0x7847, 0x40af, 0x784b, 0x7851, 0x784f, 0x7842, 0x7846, 0x4104, 0x796e, 0x796c, 0x79f2, 0x4144, 0x79f1, 0x79f5, 0x79f3, 0x79f9, 0x413d, 0x4147, 0x419c, 0x7a9a, 0x7a93, 0x7a91, 0x7ae1, 0x41e0, 0x41e4, 0x7b21, 0x7b1c, 0x7b16, 0x7b17, 0x7b36, 0x7b1f, 0x4280, 0x7c93, 0x7c99, 0x7c9a, 0x7c9c, 0x42ca, 0x7d49, 0x42d4, 0x7d34, 0x7d37, 0x42d2, 0x7d2d, 0x42cb, 0x7d4c, 0x42ce, 0x42d3, 0x7d48, 0x4344, 0x4348, 0x7f3b, 0x4345, 0x4381, 0x4386, 0x4385, 0x8008, 0x801a, 0x43a3, 0x801d, 0x43b5, 0x8049, 0x8045, 0x8044, 0x7c9b, 0x43fa, 0x43f9, 0x812a, 0x812e, 0x43fb, 0x43f2, 0x8131, 0x43ef, 0x811a, 0x8134, 0x8117, 0x445b, 0x4466, 0x44ce, 0x831d, 0x8371, 0x8384, 0x8380, 0x8372, 0x83a1, 0x35b4, 0x8379, 0x8391, 0x44c8, 0x839f, 0x83ad, 0x44d1, 0x44c5, 0x8323, 0x44d2, 0x8385, 0x839c, 0x83b7, 0x8658, 0x865a, 0x458f, 0x8657, 0x86b2, 0x45a7, 0x86ae, 0x45a5, 0x45a4, 0x4611, 0x8845, 0x889c, 0x8894, 0x88a3, 0x888f, 0x88a5, 0x88a9, 0x88a6, 0x888a, 0x88a0, 0x8890, 0x8992, 0x8991, 0x8994, 0x46b5, 0x8a26, 0x8a32, 0x8a28, 0x46b4, 0x46bd, 0x8a1c, 0x46bb, 0x8a2b, 0x8a20, 0x46b9, 0x8a29, 0x46c2, 0x46be, 0x46ba, 0x8a21, 0x8c3a, 0x3ab7, 0x8c5b, 0x8c58, 0x8c7c, 0x4758, 0x8ca6, 0x8cae, 0x8cad, 0x8d65, 0x479b, 0x8d7e, 0x479c, 0x8d7c, 0x8d7f, 0x8d7a, 0x8dbd, 0x47da, 0x47de, 0x8dc0, 0x8dbb, 0x8ead, 0x8eaf, 0x8ed6, 0x484d, 0x4846, 0x4847, 0x484b, 0x484c, 0x8ed9, 0x4848, 0x4899, 0x9012, 0x900e, 0x9025, 0x489b, 0x9013, 0x90ee, 0x48ce, 0x90ab, 0x90f7, 0x48eb, 0x9159, 0x9154, 0x91f2, 0x91f0, 0x91e5, 0x91f6, 0x491c, 0x498c, 0x9587, 0x49d1, 0x965a, 0x49d6, 0x49d3, 0x966e, 0x49d4, 0x49d0, 0x49d5, 0x9679, 0x4a0b, 0x98e1, 0x98e6, 0x4bc6, 0x9ec4, 0x9ed2, 0x4e80, 0x3424, 0x4e81, 0x508f, 0x5097, 0x5088, 0x5089, 0x3474, 0x347a, 0x5081, 0x5160, 0x0564, 0x34c3, 0x5e42, 0x51d3, 0x34d4, 0x34d5, 0x51d2, 0x51d6, 0x5273, 0x34fb, 0x5270, 0x34f7, 0x3532, 0xf833, 0x53a8, 0x53a6, 0x53c5, 0x5597, 0x55de, 0x35ba, 0x35bf, 0x5596, 0x55b4, 0x35c7, 0x5585, 0x35b7, 0x559b, 0x55a0, 0x35b9, 0x5559, 0x35c3, 0x5586, 0x35bd, 0x35d0, 0x55af, 0x557a, 0x35c1, 0x35be, 0x35cd, 0x559e, 0x35cb, 0x55a9, 0x570f, 0x570e, 0x581a, 0x364f, 0x581f, 0x3653, 0x583c, 0x5818, 0x583e, 0x5826, 0x3655, 0x583a, 0x1364, 0x5822, 0x3651, 0x58fb, 0x5963, 0x5964, 0x369f, 0x5aa8, 0x5aa3, 0x5a82, 0x5a88, 0x5aa1, 0x5a85, 0x5a98, 0x36fe, 0x5a99, 0x36fb, 0x5a89, 0x5a81, 0x5a96, 0x5a80, 0x36f1, 0x36f5, 0x5a91, 0x36ef, 0x3704, 0x3703, 0x36f4, 0x5acf, 0x36f3, 0x3702, 0x36f7, 0x36fa, 0x36fd, 0x36ee, 0x5a87, 0x5aa0, 0x36f0, 0x5a79, 0x36f2, 0x5a86, 0x5aab, 0x5aaa, 0x5aa4, 0x5a8d, 0x5a7e, 0x3744, 0x5bd5, 0x3762, 0x3777, 0x3dc9, 0x5c1e, 0x5c5f, 0x5c5e, 0x5d44, 0x5d3e, 0x37e8, 0x5d48, 0x5d1c, 0x37ef, 0x5d5b, 0x5d4d, 0x37e6, 0x37ed, 0x5d57, 0x37e7, 0x5d53, 0x5d4f, 0x37eb, 0x5d3b, 0x5d46, 0x382d, 0x3855, 0x5e46, 0x5e47, 0x3853, 0x5e48, 0x5ec0, 0x5ebd, 0x5ebf, 0x3890, 0x5f11, 0x38be, 0x5f3e, 0x5f3b, 0x38bd, 0x5f3a, 0x38cf, 0x38d0, 0x38ec, 0x5fa7, 0x394b, 0x60ea, 0x3948, 0x6107, 0x6122, 0x610c, 0x3955, 0x3951, 0x60b3, 0x60d6, 0x60d2, 0x394e, 0x60e3, 0x60e5, 0x60e9, 0x396b, 0x395e, 0x6111, 0x60fd, 0x3960, 0x3967, 0x611e, 0x6120, 0x6121, 0x621e, 0x39b8, 0x63e2, 0x63de, 0x63e6, 0x3a14, 0x3a0f, 0x3a07, 0x3a13, 0x63f8, 0x3a17, 0x63fe, 0x63c1, 0x63bf, 0x63f7, 0x63d1, 0x655f, 0x6560, 0x6561, 0x3a9a, 0x3ab8, 0x65d1, 0x3af7, 0x3af8, 0x667d, 0x666b, 0x667f, 0x3afd, 0x3af5, 0x6673, 0x6681, 0x666d, 0x6669, 0x3afa, 0x3b38, 0x671e, 0x68ed, 0x3b87, 0x3b80, 0x3b88, 0x3b79, 0x6903, 0x3b7c, 0x68fe, 0x68e5, 0x691e, 0x6902, 0x3b83, 0x3b85, 0x6909, 0x68ca, 0x6900, 0xf8e5, 0x6901, 0x6918, 0x68e2, 0x68cf, 0x3b7b, 0x692e, 0x68c5, 0x68ff, 0x3b86, 0x691c, 0x68c3, 0x3c34, 0x6b6f, 0x3c55, 0x6b6e, 0x3c68, 0x6bbe, 0x3c9c, 0x6bf4, 0x6c2d, 0x3cfc, 0x6db6, 0x6e75, 0x6e1e, 0x3d1a, 0x6e18, 0x3d17, 0x6e48, 0x3d1b, 0x6e4f, 0x3d13, 0x6e42, 0x6e6a, 0x6e70, 0x6dfe, 0x3d05, 0x3d07, 0x6e6d, 0x3d1c, 0x6e7b, 0x6e7e, 0x6e59, 0x3d11, 0x6e57, 0x3d16, 0x6e80, 0x6e50, 0x3d15, 0x6e29, 0x6e76, 0x6e2a, 0x6e4c, 0x712a, 0x3dcb, 0x7135, 0x712c, 0x7137, 0x711d, 0x3dc5, 0x3dc2, 0x7138, 0x3dcd, 0x7134, 0x712b, 0x7133, 0x7127, 0x7124, 0x3dca, 0x712d, 0x7232, 0x7283, 0x7282, 0x7287, 0x7306, 0x7324, 0x7338, 0x732a, 0x732c, 0x732b, 0x3e83, 0x732f, 0x7328, 0x7417, 0x3ed6, 0x3ed5, 0x7419, 0x7438, 0x3ed1, 0x741f, 0x7414, 0x743c, 0x73f7, 0x741c, 0x7415, 0x7418, 0x7439, 0x74f9, 0x7524, 0xf934, 0x3f52, 0x3f5f, 0x756e, 0x756d, 0x7571, 0x758e, 0x3f95, 0x75e5, 0x3f9d, 0x3f98, 0x3f9e, 0x3f96, 0x7694, 0x76b3, 0x4003, 0x76d9, 0x402f, 0x7748, 0x7749, 0x7743, 0x4031, 0x4033, 0x7742, 0x77df, 0x40b4, 0x7863, 0x7876, 0x40b0, 0x785f, 0x7866, 0x7966, 0x7971, 0x4108, 0x4107, 0x7976, 0x7984, 0x7975, 0x79ff, 0x7a07, 0x414e, 0x7a0e, 0x7a09, 0x4150, 0x4152, 0x41a1, 0x41a3, 0x41a5, 0x41cc, 0x7ae7, 0x7ae2, 0x7b55, 0x41ef, 0x41ea, 0x7b43, 0x7b57, 0x7b6c, 0x7b42, 0x7b53, 0x41ed, 0x7b41, 0x4285, 0x4284, 0x7ca7, 0x7ca0, 0x7ca6, 0x7ca4, 0x7d74, 0x42db, 0x7d59, 0x42d9, 0x7d60, 0x7d57, 0x7d6c, 0x7d7e, 0x7d64, 0x42d7, 0x7d5a, 0x7d5d, 0x42da, 0x42de, 0x42d8, 0x7d76, 0x7d4d, 0x7d75, 0x42d5, 0x7fd3, 0x7fd6, 0x439c, 0x439d, 0x8060, 0x804e, 0x8145, 0x813b, 0x43fe, 0x8148, 0x8142, 0x8149, 0x8140, 0x8114, 0x8141, 0x4407, 0x81ef, 0x81f6, 0x8203, 0x446a, 0x83ed, 0x44e7, 0x83da, 0x8418, 0x83d2, 0x8408, 0x44e2, 0x8400, 0x44df, 0x44e1, 0x44e5, 0x8417, 0x8346, 0x8414, 0x83d3, 0x8405, 0x841f, 0x8402, 0x8416, 0x83cd, 0x83e6, 0x4591, 0x865d, 0x86d5, 0x86e1, 0x45b4, 0x45b0, 0x45b5, 0x45ae, 0x86ee, 0x8847, 0x8846, 0x462d, 0x462c, 0x88bb, 0x462b, 0x88bf, 0x88b4, 0x4629, 0x88b5, 0x467f, 0x899a, 0x8a43, 0x46c9, 0x46cb, 0x8a5a, 0x46c5, 0x46c6, 0x46ca, 0x8a35, 0x8a38, 0x8a42, 0x8a49, 0x8a5d, 0x8a4b, 0x8a3d, 0x46d2, 0x46d0, 0x472d, 0x4735, 0x8c60, 0x8c5e, 0x8c7f, 0x8c7e, 0x8c83, 0x476c, 0x8cb1, 0x8d87, 0x479d, 0x47a0, 0x8d88, 0x8d83, 0x47a2, 0x479f, 0x8d86, 0x8d8b, 0x8d82, 0x8dca, 0x8dd2, 0x47eb, 0x47e2, 0x8dd4, 0x8dc9, 0x8eb0, 0x4836, 0x4832, 0x4850, 0x8ef2, 0x8ee4, 0x8ef3, 0x8eea, 0x484f, 0x8efd, 0x4852, 0x8f9d, 0x902b, 0x902a, 0x489e, 0x9028, 0x9029, 0x902c, 0x48a0, 0x489c, 0x903a, 0x9030, 0x9037, 0x903b, 0x48d1, 0x910a, 0x48ef, 0x48f0, 0x48f1, 0x91fe, 0x9220, 0x491d, 0x920b, 0x491f, 0x9218, 0x9222, 0x491e, 0x921b, 0x9208, 0x4920, 0x920e, 0x9213, 0x498e, 0x4991, 0x9595, 0x8cdd, 0x4990, 0x49d7, 0x968c, 0x967b, 0x967f, 0x9681, 0x49d9, 0x9682, 0x49f4, 0x49f6, 0x3560, 0x49f5, 0x49f3, 0x96ee, 0x96ed, 0x4a0c, 0x96ec, 0x975f, 0x976f, 0x4a51, 0x976d, 0x4aa6, 0x4aa7, 0x4aa8, 0x4b27, 0x4b24, 0x4b25, 0x98f0, 0x4b2a, 0x4b74, 0x4bc7, 0x9aa9, 0x4be7, 0x4bed, 0x9ae0, 0x4eb7, 0x342e, 0x347b, 0x50cc, 0x50bc, 0x347c, 0x50aa, 0x50b9, 0x347d, 0x50ab, 0x50c3, 0x50cd, 0x517e, 0x527e, 0x5279, 0x34fd, 0xf823, 0x52e1, 0x52e0, 0x52e7, 0x5380, 0x53ab, 0x53aa, 0x53a9, 0x53e0, 0x55ea, 0x35da, 0x55d7, 0x35d6, 0x35db, 0x55c1, 0x5715, 0x365b, 0x586c, 0x365c, 0x585c, 0x5850, 0x5861, 0x586a, 0x5869, 0x5856, 0x5860, 0x5866, 0x585f, 0x5923, 0x5966, 0x5968, 0x3706, 0x370b, 0x5ace, 0x370d, 0x5ac5, 0x5ac3, 0x370a, 0x3713, 0x5ad0, 0x3710, 0x3712, 0x3709, 0x3708, 0x3711, 0x370f, 0x5b74, 0x5b76, 0x5bdc, 0x5bd7, 0x5bda, 0x5bdb, 0x3767, 0x5c20, 0x5d6d, 0x5d66, 0x37f6, 0x5d64, 0x5d6e, 0xf87e, 0x5d60, 0x5f42, 0x5f5a, 0x5f6e, 0x3964, 0x396c, 0x6130, 0x613a, 0x612a, 0x6143, 0x6119, 0x6131, 0x396d, 0x613d, 0x397a, 0x3975, 0x3a0d, 0x6408, 0x6432, 0x6438, 0x3a1e, 0x6431, 0x3a1b, 0x6419, 0x3a2a, 0x6411, 0x3a1f, 0x3a22, 0x6429, 0x641d, 0x3a25, 0x3a27, 0x3a29, 0x643c, 0x3a24, 0x6446, 0x6447, 0x3a28, 0x3a26, 0x643a, 0x6407, 0x3a23, 0x656b, 0x3a9f, 0x6570, 0x656d, 0x3ab1, 0x65e4, 0x6693, 0x3b03, 0x3b07, 0x3b0c, 0x3b06, 0x668f, 0x3b04, 0x3b09, 0x6692, 0x3b05, 0x668e, 0x3b08, 0x6946, 0x3b96, 0x3b9c, 0x3b9f, 0x3b9b, 0x3b98, 0x3b99, 0x3b94, 0x6931, 0x3b8d, 0x3ba3, 0x693e, 0x3b93, 0x697c, 0x6943, 0x3b92, 0x6973, 0xf8e8, 0x6955, 0x3b8e, 0x3b8c, 0x6985, 0x694d, 0x6950, 0x6947, 0x6967, 0x6936, 0x6964, 0x6961, 0x3b9a, 0x697d, 0x6b44, 0x6b40, 0x6b71, 0x6b73, 0x6b9c, 0x3c6a, 0x3c6d, 0x3c84, 0x6bc1, 0x3ca0, 0x6bfa, 0x6c31, 0x6c32, 0x3d1d, 0x3d26, 0x6eb8, 0x6ea8, 0x3d33, 0x6e91, 0x6ebb, 0x3d38, 0x6e9a, 0x3d30, 0x3d28, 0x6ea9, 0x3d27, 0x3d2a, 0x6eb5, 0x6e6c, 0x6ee8, 0x3d31, 0x6edd, 0x6eda, 0x6ee6, 0x6eac, 0x3d34, 0x3d2e, 0x3d3b, 0x6ed9, 0x6ee3, 0x6ee9, 0x6edb, 0x3d29, 0x716f, 0x3dd2, 0x3dd8, 0x7148, 0x3dcf, 0x714a, 0x716b, 0x3dd9, 0x714f, 0x7157, 0x7174, 0x3dce, 0x3dd3, 0x3dd0, 0x7145, 0x7151, 0x716d, 0x3ba1, 0x7251, 0x7250, 0x724e, 0x3e47, 0x7341, 0x3e8b, 0x732e, 0x7346, 0x3ed4, 0x7427, 0x3ede, 0x7448, 0x7453, 0x743d, 0x3edf, 0x745d, 0x7456, 0x3ed7, 0x741e, 0x7447, 0x7443, 0x7458, 0x7449, 0x3ee1, 0x744c, 0x7445, 0x743e, 0x3f2f, 0x7501, 0x751e, 0x3f62, 0x3f63, 0x757a, 0x75ee, 0x7602, 0x7697, 0x7698, 0x3fe2, 0x4004, 0x4043, 0x775d, 0x7764, 0x7753, 0x7758, 0x7882, 0x7890, 0x788a, 0x40be, 0x787a, 0x787d, 0x40ba, 0x788b, 0x7878, 0x40bc, 0xf94e, 0x788d, 0x7888, 0x7892, 0x7881, 0x797e, 0x7983, 0x410d, 0x410e, 0x4111, 0x7980, 0x410f, 0x4112, 0x4155, 0x7a0f, 0x4159, 0x415b, 0x7a1d, 0x4157, 0x7aa1, 0x7aa4, 0x41ce, 0x7ae9, 0x7aea, 0x41fe, 0x7b62, 0x7b6b, 0x41fc, 0x7b5e, 0x41f5, 0x7b79, 0x41f9, 0x41fa, 0x7b6f, 0x7b68, 0x4288, 0x4289, 0x7cae, 0x428a, 0x4287, 0x428b, 0x7cb0, 0x42e6, 0x7d90, 0x42ed, 0x7d8a, 0x42e5, 0x7d8b, 0x7d99, 0x7d95, 0x42e0, 0x7d87, 0x7d78, 0x7d97, 0x7d89, 0x7d98, 0x42e1, 0x435b, 0x435c, 0x7fa3, 0x438f, 0x438b, 0x438d, 0x7fdd, 0x8057, 0x43b9, 0x8163, 0x816a, 0x816c, 0x440f, 0x4419, 0x4413, 0x815d, 0x8175, 0x4418, 0x815f, 0x4416, 0x817d, 0x816d, 0x4453, 0xf98d, 0x8241, 0x844f, 0x8484, 0x44f6, 0x847f, 0x44f5, 0x8448, 0x842a, 0x847b, 0x8472, 0x8464, 0x842e, 0x845c, 0x8453, 0x44f7, 0x8441, 0x84c8, 0x44f0, 0x8462, 0x8480, 0x843e, 0x8483, 0x8471, 0x44f9, 0x844a, 0x8455, 0x8458, 0x4592, 0x4595, 0x4596, 0x86fc, 0x86fd, 0x8715, 0x45b9, 0x8716, 0x86ff, 0x45bd, 0x45b8, 0x4612, 0x8858, 0x88cf, 0x88e0, 0x4680, 0x4681, 0x469a, 0x4698, 0x89e7, 0x8a6a, 0x8a80, 0x46d4, 0x8a6f, 0x8a65, 0x46da, 0x8a78, 0x8a7d, 0x8a88, 0x46d6, 0x46db, 0x8a64, 0x8a7e, 0x46dc, 0x8a67, 0x8c63, 0x8c88, 0x4771, 0x8ccd, 0x4772, 0x8cc9, 0x47a8, 0x8ded, 0x47f0, 0xf9db, 0x47f1, 0x47fd, 0x4838, 0x4837, 0x4839, 0x8eb1, 0x4855, 0x4853, 0x8f04, 0x8f9e, 0x8fa0, 0x9043, 0x9046, 0x9048, 0x9045, 0x9040, 0x904c, 0x48d5, 0x48bd, 0x910c, 0x9113, 0x9115, 0x48f5, 0x916b, 0x9167, 0x925d, 0x9255, 0x9235, 0x4921, 0x9259, 0x922f, 0x923c, 0x928f, 0x925c, 0x926a, 0x9262, 0x925f, 0x926b, 0x926e, 0x923b, 0x9244, 0x9241, 0x959a, 0x4992, 0x9599, 0x49de, 0x49db, 0x49da, 0x968f, 0x49df, 0x9696, 0x49f9, 0x49f8, 0x49fa, 0x96f4, 0x96fc, 0x4a0e, 0x9755, 0x4a43, 0x9779, 0x4a56, 0x4a53, 0x4a9e, 0x97ee, 0x97f5, 0x4aa9, 0x980b, 0x4afa, 0x98f3, 0x4b31, 0x4b30, 0x98f7, 0x98ff, 0x98f5, 0x4b32, 0x98ec, 0x98f1, 0x4b29, 0x4b2e, 0x999a, 0x4b76, 0x9ae2, 0x9b3d, 0x9b5d, 0x9ce8, 0x4ca5, 0x9ceb, 0x9cef, 0x9cee, 0x9e81, 0x9f14, 0x50d0, 0x50d9, 0x50dc, 0x50d8, 0x348c, 0x50e1, 0x50eb, 0x348b, 0x3489, 0x50f4, 0x50e2, 0x50de, 0x348d, 0x3486, 0x34d7, 0x51f4, 0x3504, 0x3507, 0x3503, 0x52ed, 0x52ea, 0x3522, 0x5332, 0x3551, 0x53ae, 0x53b0, 0x3561, 0x55fb, 0x5603, 0x560b, 0x35e9, 0x5607, 0x35e5, 0x55f8, 0x35e4, 0x5628, 0x561e, 0x35e3, 0x5618, 0x5611, 0x5651, 0x5605, 0x5717, 0x5892, 0x3665, 0x588c, 0x3663, 0x5878, 0x5884, 0x5873, 0x58ad, 0x5897, 0x5895, 0x5877, 0x5872, 0x5896, 0x588d, 0x5910, 0x368c, 0x596c, 0x371a, 0x5ae7, 0x3715, 0x5ae4, 0x3720, 0x3721, 0x5aef, 0x5626, 0x371c, 0x371b, 0x5af0, 0x5d7b, 0x37fe, 0x5d83, 0x3804, 0x3801, 0x5d8b, 0x5d8c, 0x3800, 0x5d78, 0x5e52, 0x386d, 0x3893, 0x5ed0, 0x5ecf, 0x38a1, 0x5fb3, 0x5fb4, 0x3976, 0x3979, 0x3972, 0x617b, 0x3983, 0x616f, 0x6181, 0x613c, 0x6142, 0x6138, 0x6133, 0xf8a6, 0x6160, 0x6169, 0x617d, 0x6186, 0x622c, 0x6228, 0x3a38, 0x644c, 0x3a30, 0x6457, 0x647c, 0x3a34, 0x3a3a, 0x6455, 0x6462, 0x6471, 0x646a, 0x6456, 0x643b, 0x6481, 0x3a35, 0x644f, 0x647e, 0x6464, 0x3a3f, 0x3a40, 0x3a32, 0x3a31, 0x3a36, 0x6571, 0x30ba, 0x3b0f, 0x66a5, 0x669a, 0x669c, 0x3b10, 0x66a6, 0x3b0d, 0x66a4, 0x698f, 0x69c5, 0x69c8, 0x6992, 0x69b2, 0x3ba9, 0x3bb4, 0x3bac, 0x69e3, 0x69c0, 0x69d6, 0x69d1, 0x699f, 0x69a2, 0x69d2, 0x3bb8, 0x3bae, 0x35f3, 0x69e1, 0x69d5, 0x699d, 0x3bb3, 0x3bba, 0x6998, 0x3c3f, 0x6b74, 0x6ba1, 0x3d3c, 0x6ef0, 0x6ef3, 0x3d42, 0x3d40, 0x6f1b, 0x6f0c, 0x6f1d, 0x6f34, 0x6f28, 0x6f17, 0x3d3e, 0x6f44, 0x6f42, 0x6f04, 0x6f11, 0x6efa, 0x6f4a, 0x7191, 0x718e, 0x3de1, 0x718b, 0x718d, 0x717f, 0x718c, 0x717e, 0x717c, 0x7183, 0x3de6, 0x7188, 0x3de0, 0x3e15, 0x7294, 0x3e93, 0x7355, 0x7353, 0x734f, 0x7354, 0x746c, 0x7465, 0x7466, 0x7461, 0x746b, 0x7468, 0x7476, 0x3ee7, 0x7460, 0x4a0f, 0x7474, 0x7506, 0x760e, 0x3fad, 0x7607, 0x3fae, 0x3fe3, 0x76b9, 0x3ff5, 0x76b7, 0x76e2, 0x4006, 0x7774, 0x7777, 0x7776, 0x7775, 0x404f, 0x7778, 0x7771, 0x4054, 0x777a, 0x715b, 0x777b, 0x78a6, 0x78ae, 0x78b8, 0x40cb, 0x40e3, 0x40c9, 0x78b1, 0x78af, 0x4113, 0x7989, 0x7987, 0x4115, 0x4161, 0x7a29, 0x4166, 0x7a2a, 0x4164, 0x7a2d, 0x7a2c, 0x4160, 0x7a32, 0x4163, 0x7aec, 0x7af0, 0x7b81, 0x7b9e, 0x7b83, 0x420a, 0x7b92, 0x4204, 0x7ba3, 0x7b9f, 0x7b93, 0x4207, 0x7b86, 0x7cb8, 0x7cb7, 0x428d, 0x428f, 0x4290, 0x4292, 0x42ec, 0x7dc8, 0x7db6, 0xf96c, 0x7dd1, 0x42e7, 0x7da8, 0x7dab, 0x42f2, 0x7db3, 0x7dcd, 0x42ee, 0x7dcf, 0x7da4, 0x42ef, 0x434c, 0x7f41, 0x7f6f, 0x7f71, 0x435e, 0x435f, 0x4376, 0x4374, 0x4372, 0x4390, 0x8023, 0x805b, 0x43be, 0x8061, 0x805f, 0x8181, 0x4426, 0x4425, 0x8184, 0x8213, 0x4474, 0x824a, 0x824c, 0x44fd, 0x4505, 0x4501, 0x84bd, 0x8495, 0x4509, 0x8492, 0x84c3, 0x450c, 0x8496, 0x84a5, 0x84b5, 0x84b3, 0x84a3, 0x84e4, 0x84d8, 0x84d5, 0x450d, 0x84b7, 0x84ad, 0x84da, 0x8493, 0x8736, 0x45c0, 0x45c5, 0x45c9, 0x873d, 0x872b, 0x8747, 0x8739, 0x45d5, 0x8745, 0x871d, 0x4641, 0x88ff, 0x88ea, 0x4633, 0x88f5, 0x463a, 0x8900, 0x88ed, 0x8903, 0x88e9, 0x4640, 0x4642, 0x89ea, 0x46e8, 0x8a9b, 0x8a8e, 0x8aa2, 0x46e4, 0x8a9c, 0x8a94, 0x8a90, 0x8aa9, 0x8aac, 0x46e7, 0x8a9f, 0x46e6, 0x46e1, 0x8a9d, 0x4739, 0x8c67, 0x475c, 0x4775, 0x8cd0, 0x8cd6, 0x8cd4, 0x8d98, 0x8d9a, 0x8d97, 0x47ae, 0x47b0, 0x47fa, 0x8e0b, 0x8e08, 0x8e01, 0x8eb4, 0x8eb3, 0x485b, 0x8fa1, 0x8fa2, 0x48a5, 0x905a, 0x48a2, 0x9061, 0x905f, 0x48db, 0x48da, 0x9125, 0x917b, 0x9176, 0x917c, 0x4924, 0x9289, 0x92f6, 0x92b1, 0x92ad, 0x9292, 0x9281, 0x9284, 0x4926, 0x92ae, 0x9290, 0x929e, 0x4998, 0x4996, 0x499a, 0x95a2, 0x95a7, 0x4997, 0x49e1, 0x49e0, 0x49e3, 0x49e2, 0x96a0, 0x969d, 0x969f, 0x96d0, 0x49fb, 0x96d1, 0x4a12, 0x4a14, 0x9759, 0x4a45, 0x9764, 0x4a5c, 0x4a5d, 0x4ab8, 0x9819, 0x4aba, 0x9814, 0x9815, 0x981a, 0x4b03, 0x4b35, 0x4b36, 0x4b39, 0x9906, 0x4b2d, 0x98f8, 0x9901, 0x4b7a, 0x99be, 0x99bc, 0x99b7, 0x99b6, 0x99c0, 0x4b78, 0x99b8, 0x4b7b, 0x4b7c, 0x4b7e, 0x99c4, 0x4b7d, 0x99bf, 0x4bc9, 0x9ada, 0x9ae4, 0x9ae9, 0x9ae8, 0x9aea, 0x9ae5, 0x4bf3, 0x9b26, 0x4c1a, 0x4c19, 0x9b40, 0x4c1f, 0x4ca6, 0x4ca7, 0x4ca8, 0x4cab, 0x4ca9, 0x4d2e, 0x9ebd, 0x4d5e, 0x3495, 0x3493, 0x3492, 0x510e, 0x3496, 0x50f7, 0x3497, 0x50fc, 0x510d, 0x5101, 0x51da, 0x51d9, 0x51db, 0x5286, 0x528e, 0x52ee, 0x5333, 0x53b1, 0x35f5, 0x5647, 0x562d, 0x5654, 0x35ea, 0x564b, 0x5652, 0x5631, 0x5644, 0x5656, 0x5650, 0x562b, 0x35f3, 0x564d, 0x5637, 0x564f, 0x58a2, 0x58b7, 0x3669, 0x58b2, 0x366b, 0x58aa, 0x58b5, 0x58b0, 0x366c, 0x58b4, 0x58a4, 0x58a7, 0x3668, 0x5926, 0x5afe, 0x3728, 0x5b04, 0x3726, 0x5afc, 0x3725, 0x5b06, 0x5b0a, 0x5afa, 0x5b0d, 0x5b00, 0x5b0e, 0x376b, 0x380f, 0x3808, 0x5d91, 0x380c, 0x5d8f, 0x5d90, 0x5d98, 0x5da4, 0x5d9b, 0x5da3, 0x5d96, 0x5de4, 0x5e5a, 0x3860, 0x3862, 0x5e5e, 0x3898, 0x5fb8, 0x6157, 0x615c, 0x61a6, 0x6195, 0x6188, 0x398a, 0x61a3, 0x618f, 0x3984, 0x6164, 0x397f, 0x6159, 0x6178, 0x3982, 0x6185, 0x6187, 0x619e, 0x3996, 0x3989, 0x6198, 0x619c, 0x398d, 0x39bc, 0x622f, 0x6480, 0x649b, 0x648e, 0x648d, 0x6494, 0x64c6, 0x3a44, 0x64a8, 0x6483, 0x3a3c, 0x64b9, 0x6486, 0x64b4, 0x64af, 0x6491, 0x3a4e, 0x64aa, 0x64a1, 0x64a7, 0x66b6, 0x66b3, 0x3b14, 0x66bc, 0x66ac, 0x3b15, 0x66ad, 0x6a0e, 0x3bce, 0x6a1c, 0x6a1a, 0x3be0, 0x3bc2, 0x6a0b, 0x3bbf, 0x69ef, 0x6a0c, 0x69f0, 0x6a22, 0x3bc4, 0x69d8, 0x3bcf, 0x6a12, 0x69fa, 0x3bc8, 0x6a2a, 0x3bcc, 0x6a10, 0x3bcd, 0x3bc7, 0x6a29, 0x69f9, 0x69ea, 0x6a2c, 0x6a24, 0x4cb7, 0x69e9, 0x6b52, 0x6b4f, 0x6b53, 0x3c43, 0x3cb6, 0x6f10, 0x6f65, 0x6f75, 0x3d51, 0x3d4a, 0x3d4d, 0x3d56, 0x6fd0, 0x3d53, 0x6f5c, 0x6f3d, 0x6f71, 0x3d59, 0x6f91, 0x6f0b, 0x6f79, 0x6f81, 0x6f8f, 0x3d4e, 0x6f59, 0x6f74, 0x3dee, 0x71ae, 0x3dec, 0x71a3, 0x71ad, 0x3deb, 0x3def, 0x71ab, 0x71a6, 0x71a2, 0x3ded, 0x52f2, 0x7257, 0x7255, 0x7299, 0x734b, 0x747a, 0x3ef2, 0x3eef, 0x3ef1, 0x748c, 0x7484, 0x3eed, 0x3ef0, 0x7482, 0x7493, 0x747b, 0x3eee, 0x7509, 0x4c1b, 0x3f50, 0x3f66, 0x3684, 0x3fb8, 0x3ff6, 0x778a, 0x4057, 0x7790, 0x405e, 0x78c6, 0x78d3, 0x78c0, 0x78d2, 0x78c7, 0x78c2, 0x4119, 0x799f, 0x799d, 0x799e, 0x4170, 0x7a41, 0x416e, 0x7a38, 0x7a3a, 0x7a42, 0x4172, 0x4176, 0x7a3e, 0x7ab0, 0x7bae, 0x7bb3, 0x4212, 0x421f, 0x7bbf, 0x4211, 0x4216, 0x7bcd, 0x4219, 0x7bb2, 0x4224, 0x4214, 0x4225, 0x4295, 0x4296, 0x4293, 0x4294, 0x7cc4, 0x7ccd, 0x7cc2, 0x7cc6, 0x7cc3, 0x7cc9, 0x7cc7, 0x42a0, 0x7df8, 0x42fb, 0x7ded, 0x7de2, 0x42fc, 0x4300, 0x42f8, 0x7ddc, 0x7e02, 0x7e01, 0x42f9, 0x7dd6, 0x4304, 0x7de4, 0x7dfe, 0x4303, 0x7e00, 0x7dfc, 0x7dfd, 0x42f3, 0x7df5, 0x7dff, 0x42fa, 0x7deb, 0x7de5, 0x7f78, 0x7fae, 0x7fe7, 0x43bf, 0x8065, 0x806a, 0x8066, 0x8068, 0x806b, 0x8194, 0x81a1, 0x8192, 0x8196, 0x8193, 0x4479, 0x4510, 0x8501, 0x4514, 0x84f8, 0x450e, 0x84f5, 0x451a, 0x8504, 0x4519, 0x4521, 0x4523, 0x451f, 0x851b, 0x8503, 0x8533, 0x8534, 0x84ed, 0x4525, 0x452b, 0x8535, 0x4516, 0x8505, 0x4522, 0x451b, 0x45ce, 0x45cf, 0x877d, 0x45cb, 0x45d1, 0x45cc, 0x8771, 0x4617, 0x885c, 0x88e6, 0x890f, 0x891b, 0x4651, 0x89a9, 0x89a5, 0x89ee, 0x8ab1, 0x46ed, 0x8acc, 0x8ace, 0x46f4, 0x8ab7, 0x46f1, 0x8ab5, 0x8ae9, 0x8ab4, 0x46f8, 0x8ab3, 0x8ac1, 0x8aaf, 0x8aca, 0x8ad0, 0x472f, 0x475e, 0x475d, 0x8c8e, 0x4776, 0x4777, 0x8ce9, 0x8cdb, 0x477e, 0x8ceb, 0x8da4, 0x47b6, 0x8da2, 0x8d9d, 0x47b3, 0x47fc, 0x4803, 0x4800, 0x8e2a, 0x8e28, 0x480a, 0x4802, 0x8eb8, 0x8eb6, 0x8eb9, 0x8eb7, 0x8f22, 0x8f2b, 0x8f27, 0x8f19, 0x8fa4, 0x4887, 0x8fb3, 0x48a6, 0x9071, 0x906a, 0x48a9, 0x48de, 0x9188, 0x918c, 0x92bf, 0x92b8, 0x92be, 0x92dc, 0x92e5, 0x492e, 0x492d, 0x92d4, 0x92d6, 0x4930, 0x92da, 0x92ed, 0x92f3, 0x92db, 0x492b, 0x92b9, 0x92e2, 0x92eb, 0x95af, 0x499e, 0x95b2, 0x95b3, 0x499f, 0x49e5, 0x49e4, 0x96a3, 0x96a5, 0x49fd, 0x49fc, 0x4a17, 0x4a19, 0x970a, 0x4a18, 0x9787, 0x9789, 0x978c, 0x97ef, 0x982a, 0x9822, 0x4abf, 0x981f, 0x4b3c, 0x9919, 0x4b6b, 0x99ca, 0x99da, 0x4b83, 0x4b81, 0x4b80, 0x99de, 0x99c8, 0x99e0, 0x4bca, 0x9ab6, 0x9ab5, 0x4bce, 0x9af4, 0x4bf6, 0x9b6b, 0x9b69, 0x9b72, 0x9b63, 0x4c39, 0x9d0d, 0x4cae, 0x9d01, 0x9d0c, 0x4cb5, 0x9cf8, 0x4cb3, 0x4cb4, 0x9cfe, 0x9d02, 0x9e84, 0x4d22, 0x9eab, 0x9eaa, 0x511d, 0x5116, 0x3499, 0x512b, 0x511e, 0x511b, 0x5290, 0x5294, 0x5314, 0x0b89, 0x3602, 0x5667, 0x3601, 0x567b, 0x36a1, 0x565f, 0x5661, 0x35fd, 0x3673, 0x3674, 0x3670, 0x3676, 0x3675, 0x3672, 0x58c3, 0x58ca, 0x58bb, 0x58c0, 0x58c4, 0x5901, 0x5b1f, 0x5b18, 0x5b11, 0x5b15, 0x3729, 0x5b12, 0x5b1c, 0x372a, 0x5b22, 0x5b79, 0x5da6, 0x3816, 0x5db3, 0x5dab, 0x5eea, 0x3899, 0x5f5b, 0x38d3, 0x38f5, 0x61b7, 0x61ce, 0x61b9, 0x61bd, 0x61cf, 0x61c0, 0x6199, 0x6197, 0x3994, 0x61bb, 0x61d0, 0x61c4, 0x6231, 0x3a56, 0x64d3, 0x64c0, 0x3a59, 0x3a58, 0x3a55, 0x3a52, 0x64dc, 0x64d1, 0x64c8, 0x3a57, 0x64d5, 0x66c3, 0x3b1b, 0x3b1c, 0x66bf, 0x66c5, 0x3b19, 0x66cd, 0x66c1, 0x6706, 0x3b3f, 0x6724, 0x6a63, 0x6a42, 0x6a52, 0x3bdb, 0x6a43, 0x6a33, 0x3be2, 0x6a6c, 0x6a57, 0x3bd7, 0x6a4c, 0x6a6e, 0x3bde, 0x3be5, 0x3be4, 0x3be6, 0x3bd6, 0x6a37, 0x3bdf, 0x6a71, 0x6a4a, 0x6a36, 0x3bdc, 0x6a53, 0x3bda, 0x6a45, 0x6a70, 0x3bd3, 0x3bd0, 0x6a5c, 0x6b58, 0x6b57, 0x3c86, 0x3c87, 0x3cad, 0x3cb7, 0x3d58, 0x3d6a, 0x6fbb, 0x3d62, 0x3d61, 0x6fbe, 0x3d69, 0x3d6c, 0x3d65, 0x6fb5, 0x6fd3, 0x6f9f, 0x3d66, 0x6fb7, 0x6ff5, 0x71b7, 0x3df5, 0x71bb, 0x3df4, 0x71d1, 0x3df7, 0x71ba, 0x3df8, 0x71b6, 0x71cc, 0x3dfb, 0x3dfc, 0x71d3, 0x749b, 0x3ef5, 0x3ef8, 0x7496, 0x74a2, 0x749d, 0x750a, 0x750e, 0x3f3c, 0x7581, 0x762c, 0x7637, 0x7636, 0x763b, 0x3fc5, 0x76a1, 0x4062, 0x4063, 0x7798, 0x4067, 0x7796, 0x4066, 0x40d9, 0x40db, 0x78d6, 0x78eb, 0x40d8, 0x78dc, 0x411b, 0x79a5, 0x79a9, 0x9834, 0x7a53, 0x7a45, 0x4179, 0x7a4f, 0x417d, 0x7abd, 0x7abb, 0x7af1, 0x422c, 0x4237, 0x7bec, 0x7bed, 0x4230, 0x429a, 0x7cd3, 0x4a00, 0x7ce1, 0x4305, 0x7e19, 0x4307, 0x4309, 0x430a, 0x7e27, 0x7e26, 0x4379, 0x43c2, 0x806e, 0x81af, 0x4438, 0x4437, 0x81ad, 0x4421, 0x81aa, 0x8218, 0x445e, 0x453d, 0x4537, 0x4540, 0x856f, 0x854c, 0x451d, 0x8542, 0x4533, 0x855c, 0x8570, 0x855f, 0x4535, 0x855a, 0x854b, 0x853f, 0x878a, 0x45d8, 0x878b, 0x87a1, 0x878e, 0x45dc, 0x45de, 0x8799, 0x885e, 0x885f, 0x8924, 0x89a7, 0x8aea, 0x8afd, 0x8af9, 0x8ae3, 0x8ae5, 0x46fa, 0x46fb, 0x8aec, 0x473d, 0x473b, 0x473f, 0x475f, 0x8cf2, 0x477f, 0x8cef, 0x4784, 0x8da6, 0x47bc, 0x4814, 0x480f, 0x8e3b, 0x8e43, 0x480e, 0x8e32, 0x8f31, 0x8f30, 0x4860, 0x8f2d, 0x8f3c, 0x8fa7, 0x8fa5, 0x48ab, 0x48ac, 0x48aa, 0x9137, 0x9195, 0x918e, 0x4904, 0x9196, 0x4908, 0x9345, 0x930a, 0x4933, 0x4934, 0x92fd, 0x9317, 0x931c, 0x9307, 0x9331, 0x9332, 0x932c, 0x9330, 0x9303, 0x9305, 0x49a2, 0x95c2, 0x49a4, 0x95b8, 0x49a5, 0x95c1, 0x49a7, 0x49a6, 0x49e7, 0x96ab, 0x96b7, 0x49ff, 0x49fe, 0x9715, 0x9714, 0x4a1d, 0x4a1c, 0x970c, 0x9717, 0x4a67, 0x9793, 0x4a94, 0x97d2, 0x4ac5, 0x4ac8, 0x9836, 0x9831, 0x9833, 0x983c, 0x982e, 0x983a, 0x4ac9, 0x983d, 0x4ac7, 0x98b5, 0x9922, 0x9923, 0x9920, 0x991c, 0x991d, 0x4b6c, 0x99a0, 0x4b8a, 0x99ef, 0x99e8, 0x99eb, 0x4b88, 0x4b87, 0x4b86, 0x99e1, 0x99e6, 0x4bcf, 0x4bd0, 0x9af8, 0x9af5, 0x4c1c, 0x4c23, 0x9b83, 0x9b94, 0x9b84, 0x4c49, 0x9b8b, 0x9b8f, 0x4c43, 0x9b8c, 0x4c48, 0x9b89, 0x4c47, 0x9b8e, 0x4c46, 0x4c3f, 0x4c44, 0x9d24, 0x9d0f, 0x4cbe, 0x9d13, 0x9d0a, 0x4cc2, 0x4cba, 0x4cbc, 0x4cc6, 0x9d2a, 0x9d1a, 0x4cc8, 0x9d27, 0x9d16, 0x9d21, 0x4d23, 0x9e85, 0x9eac, 0x9ec6, 0x9ec5, 0x9ed7, 0x9f53, 0x349d, 0x5128, 0x5127, 0x51df, 0x3524, 0x5335, 0x53b3, 0x3607, 0x568a, 0x567d, 0x5689, 0x3679, 0x58cd, 0x58d0, 0x3678, 0x5b2b, 0x5b33, 0x5b29, 0x5b35, 0x5b31, 0x5b37, 0x5c36, 0x5dbe, 0x3819, 0x5db9, 0x381c, 0x5dbb, 0x3818, 0x61e2, 0x61db, 0x61dd, 0x61dc, 0x61da, 0xf8af, 0x61d9, 0x39bd, 0x3a5d, 0x64df, 0x3a5a, 0x3a5e, 0x64e1, 0x3a5c, 0x64ee, 0x3a5b, 0x65b5, 0x66d4, 0x66d5, 0x3b21, 0x66d0, 0x66d1, 0x66ce, 0x66d7, 0x3b20, 0x3b32, 0x6a7d, 0x6a8a, 0x3bf2, 0x6aa7, 0x3bf5, 0x6a99, 0x6a82, 0x6a88, 0x3bee, 0x3bec, 0x6a86, 0x3bea, 0x6a98, 0x6a9d, 0x3bed, 0x3bf3, 0x6a8f, 0x3bf6, 0x6aaa, 0x3c48, 0x6b5d, 0x3c49, 0x6c0a, 0x3d75, 0x6fd7, 0x6fd6, 0x6fe5, 0x3d6f, 0x3d7b, 0x3d73, 0x6fd9, 0x6fda, 0x6fea, 0x3d70, 0x6ff6, 0x4039, 0x3d78, 0x71e3, 0x3dfe, 0x71e9, 0x3e00, 0x71eb, 0x71ef, 0x71f3, 0x71ea, 0x3e01, 0xf921, 0x3e55, 0x3e56, 0x3e9d, 0x7371, 0x3ef9, 0x74ae, 0x3eff, 0x74b3, 0x3efd, 0x74ac, 0x3f43, 0x3f41, 0x7583, 0x7645, 0x764e, 0x7644, 0x76a3, 0x76a5, 0x77a6, 0x77a4, 0x406f, 0x77a9, 0x77af, 0x408a, 0x40e5, 0x40e6, 0x78f0, 0x78f8, 0x78f1, 0x417f, 0x7a49, 0x41b5, 0x41b6, 0x41bb, 0x7ac2, 0x7af2, 0x7af3, 0x7bfa, 0x4240, 0x7bf6, 0x7bfc, 0x7c18, 0x7c08, 0x7c12, 0x429d, 0x429c, 0x7cdb, 0x7cda, 0x430f, 0x4311, 0x430d, 0x7e2c, 0x7e4d, 0x4314, 0x4313, 0x7f46, 0x7ff6, 0x802b, 0x8074, 0x81b8, 0x81c8, 0x4482, 0x4483, 0x454d, 0x8592, 0x8593, 0x454f, 0x857f, 0x85ab, 0x8597, 0x454c, 0x4551, 0x85ac, 0x45ee, 0x45e8, 0x4ccb, 0x87ce, 0x45eb, 0x87cd, 0x45e2, 0x45e6, 0x87c1, 0x87b1, 0x87c7, 0x45ec, 0x8940, 0x4659, 0x893f, 0x8939, 0x465d, 0x8943, 0x4657, 0x465b, 0x4656, 0x89ab, 0x46fe, 0x8b1f, 0x8b09, 0x8b0c, 0x4700, 0x4701, 0x8c40, 0x4742, 0x8c96, 0x4760, 0x8cf6, 0x8cf7, 0x481d, 0x8e46, 0x8e4f, 0x483e, 0x4869, 0x4865, 0x8f3d, 0x8f41, 0x9366, 0x9378, 0x935d, 0x9369, 0x9374, 0x937d, 0x936e, 0x9372, 0x9373, 0x9362, 0x9348, 0x9353, 0x935f, 0x9368, 0x4938, 0x937f, 0x936b, 0x49ae, 0x95c4, 0x49ad, 0x96af, 0x96ad, 0x96b2, 0x4a02, 0x4a1f, 0x971a, 0x971b, 0x4a22, 0x4a20, 0xf9f5, 0x4a6c, 0x979b, 0x979f, 0x4a68, 0x4a6d, 0x4a6e, 0x4aa0, 0x4ace, 0x4ad0, 0x4ad1, 0x4acb, 0x9840, 0x4ad2, 0x9847, 0x4ad3, 0x98b7, 0x4b20, 0x4b4e, 0x4b4b, 0x4b72, 0x4b70, 0x99a2, 0x4b92, 0x4b8f, 0x9a00, 0x99f3, 0x4b90, 0x9937, 0x99f5, 0x4bd9, 0x4bd5, 0x9abd, 0x9b00, 0x9b02, 0x4bfa, 0x9b34, 0x9b49, 0x9b9f, 0x4c4b, 0x9ba3, 0x9bcd, 0x9b99, 0x9b9d, 0x4cd0, 0x4cce, 0x9d39, 0x4ccf, 0x9d44, 0x4cc4, 0x4ccc, 0x9d35, 0x4cd2, 0x4d35, 0x9eaf, 0x3e03, 0x512f, 0x349e, 0x34af, 0x9f8e, 0x360c, 0x569f, 0x569b, 0x569e, 0x5696, 0x5694, 0x56a0, 0x367c, 0x5b3b, 0x3730, 0x3731, 0x5b3a, 0x5dc1, 0x5f4d, 0x5f5d, 0x61f3, 0x39a1, 0x399e, 0x3a68, 0x3a61, 0x64f6, 0x64e5, 0x64ea, 0x64e7, 0x6505, 0x3a65, 0x64f9, 0x3a66, 0x3a6a, 0x3aab, 0x6aab, 0x6aed, 0x6ab2, 0x6ab0, 0x6ab5, 0x6abe, 0x6ac1, 0x6ac8, 0x3bf9, 0x6ac0, 0x6abc, 0x6ab1, 0x6ac4, 0x6abf, 0x3c58, 0x3c8a, 0x7008, 0x7003, 0x6ffd, 0x7010, 0x7002, 0x7013, 0x3e04, 0x71fa, 0x7200, 0x74b9, 0x74bc, 0x3f02, 0x765b, 0x7651, 0x764f, 0x76eb, 0x77b8, 0x4079, 0x77b9, 0x77c1, 0x77c0, 0x77be, 0x790b, 0x40eb, 0x7907, 0x790a, 0x7908, 0x40e9, 0x790d, 0x7906, 0x7915, 0x79af, 0x4120, 0x4121, 0x4181, 0x7af5, 0x424d, 0x4259, 0x7c2e, 0x4258, 0x7c1b, 0x5cd1, 0x7c1a, 0x7c24, 0x42a5, 0x42a9, 0x7ce6, 0x7ce3, 0x431a, 0x4319, 0x7e5d, 0x7e4f, 0x7e66, 0x7e5b, 0x7f47, 0x7fb4, 0x4396, 0x4398, 0x4397, 0x7ffa, 0x802e, 0x65df, 0x43c8, 0x81ce, 0x4443, 0x4445, 0x8219, 0x4552, 0x4557, 0x85cc, 0x85b2, 0x4555, 0x85bb, 0x85c1, 0x4556, 0x4558, 0x45f2, 0x87e9, 0x87ee, 0x87f0, 0x87d6, 0x880e, 0x87da, 0x8948, 0x894a, 0x894e, 0x894d, 0x89b1, 0x89b0, 0x89b3, 0x4707, 0x8b38, 0x8b32, 0x4708, 0x8b2d, 0x470a, 0x8b34, 0x431b, 0x8b29, 0x8c74, 0x4761, 0x4762, 0x8d03, 0x47c2, 0x47c6, 0x8da9, 0x8e58, 0x481e, 0x4825, 0x8ebf, 0x8ec1, 0x8f4a, 0x8fac, 0x48b0, 0x9089, 0x913d, 0x913c, 0x91a9, 0x93a0, 0x493d, 0x9390, 0x493e, 0x9393, 0x938b, 0x93ad, 0x93bb, 0x93b8, 0x4946, 0x4945, 0x939c, 0x95d8, 0x95d7, 0x4a03, 0x4a26, 0x4a27, 0x975d, 0x97a9, 0x97da, 0x4a98, 0x4aad, 0x4ad5, 0x4ada, 0x9854, 0x4ad9, 0x9855, 0x984b, 0x4add, 0x983f, 0x98b9, 0x4b15, 0x4b16, 0x4b17, 0x4b21, 0x9938, 0x9936, 0x9940, 0x4b4c, 0x993b, 0x9939, 0x99a4, 0x4b96, 0x4b98, 0x9a08, 0x9a0c, 0x4b9b, 0x9a10, 0x4bff, 0x9b07, 0x4c25, 0x9bd2, 0x4c4f, 0x9bc2, 0x9bbb, 0x9bcc, 0x9bcb, 0x4c56, 0x4c54, 0x9d4d, 0x9d63, 0x9d4e, 0x4cd8, 0x9d50, 0x9d55, 0x4cd7, 0x9d5e, 0x4d26, 0x9e90, 0x9eb2, 0x9eb1, 0x4d38, 0x9eca, 0x9f02, 0x9f27, 0x9f26, 0x4d8a, 0x56af, 0x58e0, 0x58dc, 0x3734, 0x5b39, 0x3735, 0xf86a, 0x5b7c, 0x5bf3, 0xf870, 0x37a1, 0x5c6b, 0x5dc4, 0x650b, 0x6508, 0x650a, 0x3a6c, 0x3a6d, 0x65dc, 0x3b29, 0x3b2a, 0x66e1, 0x66df, 0x6ace, 0x6ad4, 0x6ae3, 0x6ad7, 0x6ae2, 0x3c00, 0x3c08, 0x3c06, 0x3c05, 0x6ad8, 0x6ad5, 0x6ad2, 0x3cb1, 0x3d88, 0x701e, 0x702c, 0x7025, 0x6ff3, 0x7204, 0x7208, 0x7215, 0x3e09, 0x74c4, 0x74c9, 0x74c7, 0x74c8, 0x76a9, 0x77c6, 0x77c5, 0x7918, 0x791a, 0x7920, 0x4122, 0x7a66, 0x7a64, 0x7a6a, 0x41d5, 0x4261, 0x425d, 0x4262, 0x424f, 0x4260, 0x7c35, 0x7c34, 0x42aa, 0x4322, 0x7e6c, 0x4321, 0x7e6e, 0x7e71, 0x4446, 0x81d4, 0x81d6, 0x821a, 0x8262, 0x8265, 0x8276, 0x85db, 0x85d6, 0x4562, 0x85e7, 0x4560, 0x4564, 0x85f4, 0xf9b6, 0x87fd, 0x87d5, 0x8807, 0x45f6, 0x880f, 0x87f8, 0xf9c1, 0x4619, 0x8987, 0x4691, 0x89b5, 0x89f5, 0x470d, 0x8b3f, 0x8b43, 0x8b4c, 0x4765, 0x8d0b, 0x8e6b, 0x8e68, 0x8e70, 0x8e75, 0x8e77, 0x483f, 0x8ec3, 0x494b, 0x93e9, 0x93ea, 0x93cb, 0x93c5, 0x93c6, 0x4948, 0x93ed, 0x93d3, 0x4952, 0x93e5, 0x494a, 0x4951, 0x93db, 0x93eb, 0x93e0, 0x93c1, 0x4950, 0x494c, 0x95dd, 0x49ee, 0x4a04, 0x4a06, 0x4a2d, 0x4a2e, 0x4a2f, 0x4a7b, 0x4a78, 0x4a77, 0x97b2, 0x97b4, 0x97b1, 0x97b5, 0x97f2, 0x4aa2, 0x4aa1, 0x4ae3, 0x9856, 0x4b1a, 0x4b19, 0x4b57, 0x9944, 0x4b9e, 0x9a26, 0x9a1f, 0x9a18, 0x9a21, 0x9a17, 0x4bdd, 0x9b09, 0x4c05, 0x4c28, 0x9bc5, 0x9bdf, 0x4c60, 0x9be3, 0x4c66, 0x9be9, 0x9bee, 0x4c67, 0x4c68, 0x9d66, 0x9d7a, 0x4cde, 0x9d6e, 0x9d91, 0x9d83, 0x9d76, 0x9d7e, 0x9d6d, 0x4ce1, 0x9e95, 0x9ee3, 0x4d69, 0x4d77, 0x9f03, 0x9f04, 0xfa19, 0x9f17, 0x34a6, 0x5136, 0x34a5, 0x5336, 0x3614, 0x5b42, 0x3736, 0x3738, 0x5b44, 0x5b46, 0x5b7e, 0x5dca, 0x5dc8, 0x5dcc, 0x5ef0, 0x3a70, 0x6585, 0x66e5, 0x66e7, 0x3b2b, 0x3c11, 0x3c0a, 0x6af4, 0x3c0d, 0x6ae9, 0x3c16, 0x3c10, 0x3c09, 0x3c0e, 0x3c7a, 0x703d, 0x3d8c, 0x7036, 0x3d91, 0x7216, 0x3e0a, 0x7212, 0x720f, 0x7217, 0x7211, 0x720b, 0x3e08, 0x3e0b, 0x74cd, 0x74d0, 0x74cc, 0x74ce, 0x74d1, 0x3f07, 0x7589, 0x40f2, 0x7a6f, 0x7c4b, 0x7c44, 0x7c55, 0x42ae, 0x4324, 0x4326, 0x4327, 0x7e7f, 0x8b71, 0x4399, 0x802f, 0x807a, 0x807b, 0x807c, 0x455f, 0x456a, 0x4571, 0x85fc, 0x8610, 0x8602, 0x456c, 0x456f, 0x85ee, 0x8603, 0x4568, 0x860d, 0x8613, 0x8608, 0x860f, 0x8818, 0x8812, 0x4601, 0x4668, 0x8967, 0x8965, 0x89bb, 0x8b69, 0x8b62, 0x4713, 0x8b6e, 0x4716, 0x8b61, 0x4718, 0x8b64, 0x8b4d, 0x8c51, 0x4789, 0x47c8, 0x8e83, 0x8ec6, 0x4884, 0x941f, 0x4954, 0x9404, 0x9417, 0x9408, 0x9405, 0x4956, 0x93f3, 0x941e, 0x9402, 0x941a, 0x941b, 0x9427, 0x941c, 0x495a, 0x96b5, 0x4a05, 0x4a07, 0x9733, 0x4a31, 0x9734, 0x9731, 0x97b8, 0x97ba, 0x4aa3, 0x97fc, 0x4aeb, 0x4b1c, 0x98c3, 0x4b5a, 0x994d, 0x4b5b, 0x9a2f, 0x4ba6, 0x4baa, 0x4ba5, 0x9ac9, 0x4be1, 0x9ac8, 0x9ac4, 0x9b2a, 0x9b38, 0x9b50, 0x4c2a, 0x9c0a, 0x9bfb, 0x9c04, 0x9bfc, 0x9bfe, 0x4c72, 0x4c6f, 0x4c73, 0x9c02, 0x9bf6, 0x9c1b, 0x9bf9, 0x9c15, 0x9c10, 0x9bff, 0x9c00, 0x9c0c, 0x4c6b, 0x4ce6, 0x9d95, 0x9da5, 0x4ce9, 0x4cec, 0x4ce8, 0x4cf0, 0x9e98, 0x9ec1, 0x4d8c, 0x9f5a, 0x5164, 0x56bb, 0x3615, 0x58e6, 0x5b49, 0x5bf7, 0x3771, 0x3826, 0x5dd0, 0x38c6, 0x5fc2, 0x39a8, 0x6511, 0x3a73, 0x6aff, 0x6afe, 0x6afd, 0x3c15, 0x6b01, 0x3d98, 0x3d97, 0x704b, 0x704d, 0x7047, 0x74d3, 0x7668, 0x7667, 0x3fd7, 0x4080, 0x77d1, 0x7930, 0x7932, 0x792e, 0x4188, 0x9f9d, 0x7ac9, 0x7ac8, 0x4269, 0x7c56, 0x7c51, 0x426b, 0x4329, 0x4328, 0x7e85, 0x7e89, 0x7e8e, 0x7e84, 0x445f, 0x826a, 0x862b, 0x862f, 0x8628, 0x4574, 0x8616, 0x8615, 0x861d, 0x881a, 0x4602, 0x466a, 0x4694, 0x89bc, 0x8b75, 0x8b7c, 0x478a, 0x8d11, 0x8d12, 0x8f5c, 0x91bb, 0x4964, 0x93f4, 0x495e, 0x4961, 0x942d, 0x4965, 0x4966, 0x96e4, 0x9737, 0x9736, 0x9767, 0x97be, 0x97bd, 0x97e2, 0x9868, 0x9866, 0x98c8, 0x98ca, 0x98c7, 0x98dc, 0x4b5f, 0x994f, 0x99a9, 0x9a3c, 0x4baf, 0x9a3b, 0x9ace, 0x4c0d, 0x9b14, 0x9b53, 0x4c7c, 0x9c2e, 0x4c7a, 0x9c1f, 0x4c76, 0x4c79, 0x4c7d, 0x4c77, 0x9db0, 0x9dbd, 0x4cf6, 0x4cf1, 0x9dae, 0x9dc4, 0x9e7b, 0x400b, 0x4d29, 0x9e9e, 0x4d6f, 0x9f05, 0x4d9a, 0x9f69, 0x9fa1, 0x56c7, 0x571d, 0x5b4a, 0x5dd3, 0x3869, 0x5f72, 0x6202, 0x39ab, 0x6235, 0x6527, 0x651e, 0x651f, 0x3b2c, 0x3b2d, 0x6b07, 0x6b06, 0x3c17, 0x3d9a, 0x7054, 0x721c, 0x7220, 0x7af8, 0x426e, 0x7c5d, 0x7c58, 0x432c, 0x7e92, 0x7f4e, 0x43ca, 0x4578, 0x4606, 0x8827, 0x4607, 0x8b81, 0x8b83, 0x4720, 0x8c44, 0x4753, 0x47ce, 0x487a, 0x4879, 0x9442, 0x944d, 0x9454, 0x944e, 0x496b, 0x9443, 0x4967, 0x496d, 0x973c, 0x9740, 0x97c0, 0x4a85, 0x4ab0, 0x4af3, 0x4b63, 0x995a, 0x9a51, 0x4bb6, 0x9add, 0x4c82, 0x4c7f, 0x9c38, 0x4c86, 0x9c45, 0x9c3a, 0x4c84, 0x9c35, 0x4cfc, 0x4cfd, 0x4cfa, 0x9ef1, 0x4d87, 0x9f93, 0x529a, 0x361a, 0x3619, 0x8641, 0x5dd7, 0x3a75, 0x6528, 0x3c1a, 0x3c1b, 0x3c19, 0x7053, 0x7059, 0x3d9c, 0x7221, 0x3e10, 0x766f, 0x7937, 0x79b5, 0x7c62, 0x7c5e, 0x7cf5, 0x457b, 0x457c, 0x863d, 0x4608, 0x882d, 0x8989, 0x8b8d, 0x8b87, 0x8b90, 0x8d1a, 0x8e99, 0x4841, 0x48e3, 0x4972, 0x945f, 0x4973, 0x4968, 0x9456, 0x9461, 0x945b, 0x945a, 0x945c, 0x9465, 0x4a35, 0x9741, 0x4a88, 0x4a9d, 0x986e, 0x986c, 0x986d, 0x4275, 0x99aa, 0x9a5c, 0x9a58, 0x9ade, 0x4c8f, 0x9c4f, 0x9c51, 0x4c8e, 0x9c53, 0x4d05, 0x4d04, 0x4cff, 0x9dfc, 0x9f39, 0x4d9e, 0x513e, 0x3554, 0x56d2, 0x3681, 0x5b4f, 0x6b14, 0x40fa, 0x7a72, 0x7a73, 0x4332, 0x4670, 0x466e, 0x8b91, 0xf9d6, 0x487c, 0x91bf, 0x4975, 0x946c, 0x4974, 0x4977, 0x96e6, 0x9745, 0x4a37, 0x97c8, 0x97e4, 0x995d, 0x4bba, 0x9b21, 0x4c11, 0x9b2c, 0x9b57, 0x4c92, 0x4c99, 0x9c5d, 0x9c61, 0x9c65, 0x9e08, 0x4d0a, 0x4d2a, 0x4d2b, 0x4d44, 0x4d79, 0x9f45, 0x34aa, 0x3748, 0x6205, 0x66ef, 0x6b1b, 0x6b1d, 0x7225, 0x7224, 0x7c6d, 0x42b4, 0x8642, 0x8649, 0x460d, 0x8978, 0x898a, 0x8b97, 0x4754, 0x8c9b, 0x8d1c, 0x4830, 0x8ea2, 0x4a09, 0x4a38, 0x4a36, 0x4a8b, 0x4af7, 0x4b66, 0x4bbd, 0x4c1e, 0x9c6c, 0x4c96, 0x9c6f, 0x4d0d, 0x9e0e, 0x4d73, 0x9f08, 0x9f1d, 0x9fa3, 0x373b, 0x373c, 0x5f60, 0x6b1c, 0x3da0, 0x40fb, ERROR, 0x7cf3, 0x4581, 0x8b9b, 0x8ea7, 0x91c4, 0x4978, 0x947a, 0x4a8d, 0x4b73, 0x9a61, 0x9a63, 0x9ad7, 0x9c76, 0x4da6, 0x9fa5, 0x39ad, 0x7067, 0x3e11, 0x72ab, 0x864a, 0x897d, 0x8b9d, 0x8c53, 0x8f65, 0x947b, 0x4a39, 0x98cd, 0x98dd, 0x4bbf, 0x9b30, 0x9e16, 0x4d0f, 0x4da7, 0x4db5, 0x3fdc, 0x4831, 0x96e7, 0x9e18, 0x9ea2, 0x4da8, 0x9f7c, 0x4125, 0x7e9e, 0x9484, 0x4bc1, 0x9e1c, 0x4190, 0x7c71, 0x97ca, 0x4696, 0x487f, 0x4d10, 0x9ea3, 0x4a0a, 0x9c7b, 0x9f97, 0x4d12, 0x4a3a, 0x9750, 0x4a3b, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x0086, 0x4e40, 0x4e41, 0x4e5a, 0x1fe8, 0x4e02, 0x4e29, 0x010e, 0x0627, 0x5202, 0x353e, 0x5ddc, 0x053c, 0x0675, 0xf828, 0x5342, 0x536a, 0x5b52, 0x193c, 0xf875, 0xf878, 0x5fc4, 0x624c, 0x72ad, 0x4e12, 0x4e2f, 0x4e96, 0x4ed0, 0x5142, 0x5183, 0xf819, 0x06a5, 0x06aa, 0x090f, 0x0a0e, 0x5383, 0x53b8, 0x0b9c, 0x0b9b, 0x123c, 0x5928, 0x1bc2, 0x5c23, 0x5e01, 0x5f00, 0x33b4, 0x3cb8, 0x706c, 0x722b, 0x5188, 0x8279, 0x8fb6, 0x4e17, 0x0065, 0x340c, 0x01b2, 0x3430, 0x4ee2, 0x4edb, 0x0477, 0x0542, 0x51ad, 0x0633, 0x51f7, 0x34da, 0x06af, 0x0836, 0x3513, 0x531b, 0x5388, 0x5387, 0x0b22, 0x53cf, 0x53fd, 0x3563, 0x53e7, 0x56dc, 0x11a3, 0x56d9, 0x5725, 0x5727, 0x5933, 0x5c13, 0x1c25, 0x1c24, 0x5c75, 0x2052, 0x2189, 0x24bf, 0x39c4, 0x39c3, 0x66f1, 0x33b5, 0x574c, 0x7f52, 0x8e14, 0x8e12, 0x3401, 0x00a3, 0x00a2, 0x4e51, 0x4e6a, 0x01b6, 0x4f0c, 0x01b5, 0x01b4, 0x4efe, 0x4f1b, 0x01c2, 0x01b8, 0x343a, 0x0479, 0x34ab, 0x5173, 0x0508, 0x518e, 0x057a, 0x05b6, 0x06bd, 0x06b7, 0x06bc, 0x34dd, 0x06c4, 0x06c9, 0x52a5, 0x3515, 0x52a7, 0x52a4, 0x0930, 0x0983, 0x0985, 0x0a12, 0x0a34, 0x53bd, 0x0ae4, 0x0ade, 0x0b2a, 0x5402, 0x0baf, 0x0bb4, 0x0bb3, 0x0bb1, 0x572b, 0x591b, 0x5935, 0x15de, 0x36a7, 0x36a5, 0x16b8, 0x16b0, 0x36a6, 0x19c2, ERROR, 0x5c17, 0x377c, 0x1c2a, 0x5c70, 0x5c7d, 0x37a9, 0x1fe9, 0x5de9, 0x2057, 0x3834, 0x3835, 0x21b6, 0x21d7, 0x21de, 0x38a8, 0x5f19, 0x5f1c, 0x5f75, 0x24c2, 0x25ab, 0x38ff, 0x5fc8, 0x298f, 0x39c7, 0x39c6, 0x39c8, 0x2a6d, 0x2eb5, 0x3ad0, 0x3ad1, 0x33c0, 0x33bf, 0x3c59, 0x39b9, 0x3b1c, 0x6c12, 0x3cbd, 0x3c80, 0x4184, 0x4185, 0x3e28, 0x72b3, 0x4724, 0x3ea9, 0x7390, 0x7536, 0x634c, 0x43cc, 0x6af6, 0x8281, 0x8fb8, 0x8670, 0x48b4, 0x8675, 0x8e17, 0x4e23, 0x3416, 0x342c, 0x01f1, 0x4f2e, 0x01da, 0x514f, 0x05b9, 0x51ba, 0x34df, 0x34e0, 0x5222, 0x06ce, 0x06d2, 0x06d0, 0x3517, 0x0843, 0x52af, 0x52b0, 0x52b1, 0x084d, 0x0934, 0x352f, 0x09d9, 0x5364, 0x0a18, 0x53d3, 0x0b38, 0x356a, 0x0bd7, 0x3570, 0x356d, 0x0bdc, 0x0bcb, 0x0bd6, 0x0bd8, 0x356e, 0x0bd1, 0xf83e, 0xf83c, 0x0bd2, 0x362b, 0x3628, 0x1259, ERROR, 0x593f, 0x15e5, 0x15e6, 0x3692, 0x15e8, 0x598b, 0x16bd, 0x5991, 0x5995, 0x16be, 0x1949, 0x373f, 0x19cd, 0x5b8a, 0x374f, 0x3774, 0x1b5e, 0x1bd0, 0x377d, 0x1d06, 0x37b7, 0x37a3, 0x37b0, 0x37b1, 0x5c87, 0x37ab, 0x1d7c, 0x1d71, 0x1fef, 0x383a, 0x3837, 0x5e0d, 0x3838, 0x3840, 0x218d, 0x21b7, 0x5e8e, 0x389f, 0x2333, 0x237f, 0x5f7a, 0x25f2, 0x3904, 0x3909, 0x3906, 0x38fd, 0x390a, 0x3907, 0x2a2a, 0x2a8b, 0x39ca, 0x2a83, 0x2a8a, 0x6290, 0x39c9, 0x2a8e, 0x629a, 0x2eb6, 0x653c, 0x653a, 0x3a7f, 0x6598, 0x30d8, 0x3ad2, 0x3156, 0x33d2, 0x6765, 0xf8db, 0x3b43, 0x33c2, 0x3887, 0x3881, 0x39c2, 0x39bc, 0x3b23, 0x3cc1, 0x3c93, 0x3cc5, 0x3da3, 0x418d, 0x418e, 0x3e2a, 0x3e5f, 0x473b, 0x474d, 0x3e5d, 0x4734, 0x4731, 0x48f2, 0x48f0, 0x3f17, 0x4c15, 0x4d28, 0x3f71, 0x3f72, 0x4f25, 0x50e7, 0x400f, 0x50e9, 0x5417, 0x79c2, 0x4191, 0x626c, 0x6280, 0x634b, 0x43b2, 0x43cf, 0x43ce, 0x809e, 0x68de, 0x68fb, 0x81eb, 0x6951, 0x8289, 0x4496, 0x6b01, 0x6b02, 0x8296, 0x6b05, 0x8287, 0x6b03, 0x4497, 0x8451, 0x8fc0, 0x488b, 0x8fc3, 0x8453, 0x867a, 0x8678, 0x8676, 0x8679, 0x868f, 0x867c, 0x9578, 0x8e1b, 0x8e1c, 0x9625, 0x3d92, 0x4e75, 0x4e74, 0x012e, 0x012c, 0x342d, 0x020c, 0x4f99, 0x020b, 0x3450, 0x344b, 0x0205, 0x344f, 0x344c, 0xf805, 0x4f71, 0x5153, 0x51bf, 0x05c2, 0x05c3, 0x51c0, 0x0648, 0x51ee, 0x0646, 0x34e4, 0x34e3, 0x06ea, 0x34e1, 0x06eb, 0x34e2, 0x06ee, 0x523d, 0x3519, 0x52bd, 0x530c, 0x08d8, 0x4c1e, 0x09df, 0x09de, 0x3541, 0x7f37, 0x0a4f, 0x53c0, 0x355e, 0x0c0d, 0x0c08, 0x3579, 0x0c09, 0x546e, 0x5483, 0x0c12, 0x0c65, 0x545e, 0x545d, 0x577e, 0x5779, 0x1289, 0x577a, 0x576c, 0x1284, 0x129e, 0x128b, 0x3632, 0x5787, 0x1562, 0x591d, 0x3694, 0x5946, 0x3697, 0x15f9, 0x5943, 0x15f7, 0x3696, 0x3698, 0x1606, 0x16dd, 0x36b2, 0x16d9, 0x16df, 0x16e2, 0x36b9, 0x5b61, 0x5b66, 0x00f1, 0x5b90, 0x3775, 0x377f, 0x377e, 0x5c29, 0x378f, 0x1c3f, 0x1c3e, 0x1d0b, 0x37bd, 0x5cb2, 0x1d83, 0x37bb, 0x37bc, 0x1d86, 0x5cc0, 0x207c, 0x383d, 0x383e, 0x3874, 0x21f7, 0x387a, 0x3876, 0x3878, 0x3875, 0x21fb, 0x233b, 0x38af, 0x38b0, 0x38c7, 0x38cc, 0x25f9, 0x25ca, 0x3916, 0x25ff, 0x3912, 0x391d, 0x2609, 0x2603, 0x3915, 0x390f, 0x3914, 0x601f, 0x5fe2, 0x2610, 0x299a, 0x299f, 0x39b0, 0x39bf, 0x39c0, 0x2a87, 0x39d2, 0x39d9, 0x2eb7, 0x3a7a, 0x2f08, 0x2ef9, 0x3a81, 0x3a82, 0x2ef4, 0x6616, 0x65f9, 0x3ada, 0x6657, 0x6788, 0x33d6, 0x679b, 0xf8de, 0x676e, 0x679e, 0x33d4, 0x3c22, 0x3c1f, 0x3890, 0x388d, 0x3c21, 0x6b24, 0x3960, 0x39ce, 0x39cf, 0x3c5c, 0x6b7d, 0x39d1, 0x3c7d, 0x3c8d, 0x3c8f, 0x6ce6, 0x3cca, 0x6ccb, 0x3cd0, 0x3cb7, 0x3cd8, 0x3cb2, 0x3cbb, 0x3cb9, 0x6cb5, 0x3da7, 0x419e, 0x7097, 0x41b2, 0x709b, 0x3e12, 0x456f, 0x45ac, 0x3e2f, 0x4623, 0x726b, 0x3e2e, 0x3e2c, 0x3e5c, 0x476c, 0x72d5, 0x4732, 0x475e, 0x3e62, 0x3e67, 0x3eb4, 0x48fb, 0x4b29, 0x4bbd, 0x4c1f, 0x7543, 0x2341, 0x4c1d, 0x759c, 0x4d31, 0x4d2f, 0x3fea, 0x5043, 0x3ffb, 0x5041, 0x4014, 0x50f5, 0x4013, 0x4012, 0x4010, 0x4011, 0x50f2, 0x4086, 0x77e4, 0x4098, 0x541e, 0x5754, 0x412a, 0x5756, 0x5929, 0x5927, 0x5928, 0x7ace, 0x42b5, 0x6279, 0x627e, 0x64b6, 0x64b7, 0x8013, 0x43d6, 0x43d8, 0x80b7, 0x43d9, 0x43d4, 0x43d7, 0xf981, 0x80b9, ERROR, 0x664d, 0x81e4, 0x81fd, 0x820f, 0x4460, 0x6a09, 0x6a08, 0x449e, 0x44a1, 0x6b1e, 0x6b1a, 0x6b23, 0x6b15, 0x6b19, 0x6b16, 0x82bf, 0x82ca, 0x6b14, 0x6b18, 0x82c1, 0x44a0, 0x721f, 0x75dd, 0x75df, 0x8469, 0x8fd0, ERROR, 0x846c, 0x48b9, 0x8693, 0x90ae, 0x8695, 0x8694, 0x8691, 0x8697, 0x8e30, 0x49c1, 0x49c2, 0x9638, 0xfa18, 0x341c, 0x0231, 0x345e, 0x4fbc, 0x3459, 0x345c, 0x0236, 0x345f, 0x4fe9, 0x4fbd, 0x4fe2, 0x5158, 0x05c9, 0x05ca, 0x34ce, 0x0718, 0x0712, 0x0719, 0x0710, 0x0716, 0x52c6, 0x085f, 0x52c8, 0x08df, 0x0917, 0x5328, 0x093c, 0x5329, 0x09ea, 0x09e9, 0x0a1c, 0x0a58, 0x0a64, 0x0af3, 0x355f, 0x0c97, 0x3585, 0x0c5a, 0x0c59, 0x3586, 0x0c8e, 0x57b4, 0x12bc, 0x57a9, 0x3687, 0x160d, 0x15fc, 0x160c, 0x1707, 0x170a, 0x36ca, 0x1702, 0x36c3, 0x1726, 0x1708, 0x171d, 0x36c2, 0x5b68, 0x194e, 0x3741, 0x19ed, 0x19ee, 0x19ef, 0x3780, 0x3781, 0x1c50, 0x1c4c, 0x3793, 0x3792, 0x1c4f, 0x37c5, 0x1dd4, ERROR, 0x1db0, 0x3846, 0x3841, 0x3845, 0x3842, 0x383f, 0x20a5, 0x2209, 0x3882, 0x3881, 0x387f, 0x38a5, 0x5f2b, 0x38b3, 0x38b5, 0x23f3, 0x23d7, 0x5f8d, 0x38da, 0x24dc, 0x38db, 0x390d, 0x6018, 0x390e, 0x260b, 0x391e, 0x3925, 0x3926, 0x391c, 0x3921, 0x6057, 0x6048, 0x3927, 0x391a, 0x263a, 0x260d, 0x2611, 0x6038, 0x2620, 0x2601, 0x3924, 0x2637, 0xf8a3, 0x6071, 0x29aa, 0x39c1, 0x39e1, 0x2ae7, 0x2ae8, 0x6312, 0x39eb, 0x2af5, 0x39e2, 0x39d7, 0x39e9, 0x2b35, 0x2ae6, 0x630a, 0x2af8, 0x6323, 0x2af1, 0x3a84, 0x2f14, 0x2f15, 0x2f09, 0x3ab5, 0x3abc, 0x3adc, 0x3ade, 0x3adf, 0x317b, 0x662a, 0x317e, 0x3366, 0x3367, 0x340a, 0x3b54, 0x67e0, 0x67be, 0x3b53, 0x3c24, 0x3c25, 0x6b29, 0x3c28, 0x3c27, 0x389c, 0x3962, 0x39e1, 0x39de, 0x39df, 0x39e9, 0x3c8b, 0x3ce4, 0x3cf7, 0x3cdc, 0x6d43, 0x3cea, 0x3cf6, 0x3d12, 0xf901, 0x70a6, 0x3db2, 0x70c0, 0x41d9, 0x722f, 0x455f, 0x3e1b, 0x4573, 0x3e32, 0x7271, 0x463f, 0x4778, 0x3e6b, 0x477d, 0x3e6c, 0x3e6d, 0x4912, 0x3eb9, 0x3eba, 0x3f09, 0x3f0a, 0x4b2f, 0x74ea, 0x3f1b, 0x4b30, 0x4bdb, 0x7520, 0x3f58, 0x4c29, 0x3f5a, 0xf936, 0x4d40, 0x3f77, 0x4d3d, 0x4d3e, 0x3f79, 0x75a9, 0x4d38, 0x7685, 0x4f48, 0x3feb, 0x4fd0, 0x3ffd, 0x3ffc, 0x7706, 0x4015, 0x4018, 0x76f6, 0x4016, 0x4017, 0x4019, 0x7700, 0x401b, 0x510e, 0x5109, 0x7702, 0x5107, 0x4087, 0x535f, 0x5360, 0x409c, 0x542a, 0x409a, 0x5429, 0x40ff, 0x40fe, 0x564d, 0x4131, 0x412e, 0x4130, 0x4132, 0x576c, ERROR, 0x412f, 0x5767, 0x4195, 0x4196, 0x5939, 0x5934, 0x5a59, 0x41c5, 0x427a, 0x6223, 0x4342, 0x6282, 0x4354, 0x6283, 0x62a8, 0x6355, 0x63f9, 0x63f8, 0x63fc, 0x63fa, 0x8009, 0xf97a, 0x439f, 0x43a0, 0x43a2, 0x43e0, 0x6674, 0x43e1, 0x666b, 0x6671, 0x43df, 0x6676, 0x6a0e, 0x4462, 0x4461, 0x6a10, 0x6a0f, 0x44a7, 0x6b38, 0x6b39, 0x6b3a, 0x82da, 0x6b37, 0x6b3e, 0x830a, 0x4589, 0x719c, 0x722a, 0x723a, 0x722b, 0x7228, 0x75aa, 0x760f, 0x461d, 0x7610, 0x77e6, 0x472a, 0x7d25, 0x7e8e, 0x47d3, 0x4842, 0x4843, 0x848b, 0x4891, 0x848c, 0x849a, 0x4890, 0x48bf, 0x86b3, 0x48bc, 0x86b2, 0x48c0, 0x49c7, 0x49c5, 0x9655, 0x8e44, 0x9652, 0x4e35, 0x0158, 0x02a7, 0x5034, 0x5001, 0x0263, 0x500a, 0x3466, 0x026a, 0x0265, 0x026b, 0x34ad, 0x04ed, 0x05d9, 0x073b, 0x0732, 0x5258, 0x0735, 0x0731, 0x073e, 0x0743, 0x0736, 0x086d, 0x351d, 0x08e4, 0x3531, 0x532b, 0x09f4, 0x354c, 0x0a69, 0x0a6b, 0x3595, 0x3591, 0x3594, 0x0cbf, 0x0cc3, 0x0cae, 0x358f, 0x54ec, 0x0cb1, 0x5515, 0x54fe, 0x0cbb, 0x0caf, 0x0cb0, 0x54e3, 0x5516, 0x3640, 0x12ef, 0x3641, 0x12ed, 0x57d3, 0x12f0, 0x1593, 0x1634, 0x162b, 0x5959, 0x5a27, 0x36d8, 0x36d2, 0x36da, 0x5a28, 0x5a10, 0x36d7, 0x5a0e, 0x3742, 0x3757, 0x1a04, 0x1a03, 0x1a02, 0x5baf, 0x1a05, 0x5bba, 0x5bb1, 0x1a00, 0x1b74, 0x3778, 0x3782, 0x3797, 0x1c65, 0x1c63, 0x37c9, 0x1dd7, 0x37c8, 0x37d6, 0x37cc, 0x1de8, 0x37d0, 0x1ddb, 0x1dd8, 0x37ce, 0x37c7, 0x5cfc, 0x1e09, 0x37cf, 0x37cb, 0x5cf2, 0x5cfe, 0x1de5, 0x1de7, 0x5df8, 0x203f, 0x3847, 0x20c0, 0x3848, 0x20b9, 0x20ba, 0x3883, 0x3885, 0x3884, 0x2220, 0x234f, 0x5f2c, 0x38b8, 0x38bc, 0x2491, 0x2490, 0x24ee, 0x24f3, 0x24ec, 0x24f1, 0x24eb, 0x24f2, 0x24f4, 0x24ed, 0x2641, 0x2648, 0x2645, 0x3931, 0x3934, 0x3936, 0x6082, 0x267f, 0x268b, 0x3923, 0x263b, 0x264e, 0x393a, 0x6091, 0x608f, 0x267c, 0x39b4, 0x39b5, 0x39ed, 0x39ec, 0x39d8, 0x2af0, 0x2b36, 0x2b3f, 0x2b43, 0x2b31, 0x2b34, 0x2b46, 0x39f6, 0x39e7, 0x2b2f, 0x2ec3, 0x3a7c, 0x3a7b, 0x2f36, 0x3a88, 0x6547, 0x654c, 0x2f21, 0xf8c8, 0x658a, 0x3073, 0x3abe, 0x30e6, 0x3ae7, 0x3ae5, 0x3aee, 0x67e1, 0x684a, 0x343f, 0x3b59, 0x3b5e, 0x346b, 0x3b5a, 0x683f, 0x3b61, 0x3b58, 0x3b5b, 0x67bd, 0x3471, 0x3b5f, 0xf8e2, 0x3c2a, 0x3c2d, 0x38b0, 0x3c23, 0x3c2b, 0x3c2c, 0x39f3, 0x3c7e, 0xf8f5, 0x3c93, 0x3c99, 0x3b61, 0x3b5f, 0x3cb3, 0x3ce7, 0x3cea, 0x3d28, 0x3d1e, 0x3d29, 0xf902, 0x3ceb, 0x3d66, 0x3db4, 0x41f6, 0x70c9, 0x3e17, 0x4560, 0x4577, 0x45bb, 0x3e21, 0x45bc, 0x3e38, 0x3e37, 0x3e74, 0x3e73, 0x3e75, 0x47a2, 0x47b2, 0x479e, 0x3e76, 0x3e78, 0x493a, 0x4938, 0x73ba, 0x3f0c, 0x3f20, 0x3f1e, 0x4c4d, 0x3f5b, 0x4c5e, 0x3f5c, 0x4d17, 0x3f83, 0x75c6, 0x3f80, 0x3f81, 0x3f7e, 0x3f88, 0x3f85, 0x3f89, 0x3f7f, 0x3f8e, 0x4d64, 0x4d67, 0x3f84, 0x75b7, 0x768c, 0x4f59, 0x768d, 0x4fda, 0x3fee, 0x3fed, 0x3ffe, 0x5051, 0x3fff, 0x5055, 0x513b, 0x5134, 0x4023, 0x5137, 0x7717, 0x5131, 0x771c, 0x401f, 0x513f, 0x5159, 0x7714, 0x5361, 0x408f, 0x4090, 0x5458, 0x5462, 0x5450, 0x40a0, 0x5451, 0x40a6, 0x409f, 0x5446, 0x40a7, 0x40a1, 0x562d, 0x4102, 0x4136, 0x5948, 0x5951, 0x594a, 0x594f, 0x5950, 0x5949, 0x5a63, 0x41c8, 0x5a66, 0x5a60, 0x41d8, 0x7b0c, 0x41dd, 0x41dc, 0x5af1, 0x41d7, 0x5b07, 0x41da, 0x42ba, 0x5f9b, 0x5fa3, 0x5f9d, 0x42be, 0x42c2, 0x42bb, 0x42c0, 0x5fa9, 0x5fa7, 0x5fa4, 0x7d23, 0x5fba, 0x21c1, 0x6226, 0x4343, 0x4355, 0x6294, 0x6293, 0x4357, 0x4368, 0x7f98, 0x7f90, 0x6407, 0x640d, 0x6402, 0x640c, 0x6409, 0x6408, 0x6413, 0x43a1, 0x64d2, 0x803a, 0x653e, 0x653c, 0x6667, 0x669e, 0x43ea, 0x66ad, 0x43e7, 0x66d9, 0x6642, 0x66a3, 0x66a0, 0x43e8, 0x43e9, 0x667c, 0x6904, 0x4454, 0x6958, 0x6960, 0x69c9, 0x69c8, 0x8226, 0x4465, 0x6a1c, 0x6a1a, 0x448a, 0x6b74, 0x44b0, 0x6b6e, 0x6b6f, 0x6b79, 0x44bc, 0x832e, 0x6b77, 0x8355, 0x831a, 0x44b8, 0x833d, 0x6b7c, 0x44b2, 0x6b70, 0x8330, 0x44bd, 0x6b7a, 0x6b82, 0x458a, 0x8651, 0x45a1, 0x7244, 0x45a2, 0x7243, 0x8688, 0x7245, 0x4615, 0x7625, 0x761f, 0x4620, 0x4673, 0x77e8, 0x898e, 0x898d, 0x7809, 0x78b7, 0x78b9, 0x7964, 0x7963, 0x8a09, 0x8a14, 0x46b1, 0x7962, 0x7965, 0x472b, 0x7bac, 0x4745, 0x7d2a, 0x4797, 0x4798, 0x7e96, 0x47d5, 0x7fc2, 0xf9de, 0x4893, 0x4896, 0x9007, 0x4894, 0x84aa, 0x84b0, 0x48c7, 0x48c5, 0x86d4, 0x86cd, 0x86d6, 0x48c4, 0x87f0, 0x9579, 0x9584, 0x49ce, 0x49ca, 0x49cc, 0x9657, 0x49c9, 0x96ba, ERROR, 0x9d4b, 0x0162, 0x346e, 0x02b7, 0x5067, 0x02ac, 0x02ab, 0x3471, 0x02c1, 0x34bb, 0x34d3, 0x05e8, 0x0769, 0x075d, 0x075f, 0x34f3, 0x34ed, 0x34f5, 0x0764, 0x0762, 0x34f1, 0x34f2, 0x34f6, 0x3520, 0x08f9, 0x3528, 0x08ee, 0x5318, 0x532c, 0x5359, 0x09ab, 0x09ac, 0x09aa, 0x5368, 0x537e, 0x0a86, 0x0a7a, 0x53a1, 0x0d28, 0x35a1, 0x555b, 0x35aa, 0x35a9, 0x0d31, 0x35b5, 0x35a5, 0x35a8, 0x5542, 0x35a7, 0x5547, 0x0d2d, 0xf843, 0x553d, 0x0d2b, 0x0d32, 0x5560, 0x57eb, 0x1329, 0x1326, 0x1353, 0x364d, 0x1333, 0x1334, 0x159d, 0x369c, 0x595f, 0x1641, 0x36ea, 0x36e5, 0x1791, 0x1769, 0x5b6f, 0x1a22, 0x375e, 0x1a34, 0xf86d, 0x1b2e, 0x3786, 0x3784, 0x1bf4, 0x5c5a, 0x1e28, 0x37d9, 0x1e1c, 0x37de, 0x1e11, 0x1e24, 0x1e15, 0x37db, 0x1e16, 0x1e54, 0x1e23, 0x1fff, 0x3831, 0x20cf, 0x20d0, 0x384b, 0x20ce, 0x3849, 0x384a, 0x384c, 0x21c7, 0x225c, 0x388a, 0x2236, 0x3889, 0x388b, 0x2243, 0x38bb, 0x5fa2, 0x5f9d, 0x38e4, 0x252a, 0x2501, 0x5fa3, 0x250b, 0x250f, 0x393b, 0x392e, 0x393e, 0x3946, 0x3953, 0x26df, 0x3944, 0x26d2, 0x393f, 0x3942, 0x394f, 0x26cd, 0x3952, 0x394a, 0x60c2, 0x26db, 0x395a, 0x60a5, 0x3949, 0x26cf, 0x621c, 0x29c0, 0x621d, 0x3a03, 0x2b81, 0x2b82, 0x2b8a, 0x2ba8, 0x2b8c, 0x6395, 0x639a, 0x3a01, 0x3a06, 0x39fb, 0x39f9, 0x2b8e, 0x3a05, 0x39fa, 0x2b8b, 0x63a6, 0x2b96, 0x39fe, 0x2bcc, 0x3a7d, 0x3a8c, 0x2f4f, 0x2f4a, 0x6550, 0x3a8e, 0x2f4b, 0x2f3d, 0x6552, 0x2f44, 0x2f49, 0x309e, 0x30f3, 0x65c8, 0x30f5, 0x3af0, 0x3af2, 0x31b3, 0x6658, 0x3af1, 0x3ae6, 0x31e5, 0x31b6, 0xf8d8, 0x6888, 0x3486, 0x3b6f, 0x3b6d, 0x3b69, 0x34b6, 0x3485, 0x3b6e, 0x34ab, 0x3c2f, 0x3c30, 0x3c63, 0x3a0d, 0x3a8b, 0x3a8c, 0x6bb8, 0x3c80, 0x6bb9, 0x3c9a, 0x3c94, 0x3c96, 0x3c95, 0x3c97, 0x3b72, 0x3cf4, 0x3cfe, 0x3d8f, 0x3d01, 0x3d79, 0x3d02, 0x3d77, 0x3cf9, 0x3d90, 0x3d88, 0x3d80, 0x3d9e, 0x3cf6, 0x3cf7, 0x3d82, 0x3d34, 0x3d89, 0x3cff, 0x3d85, 0x3d7e, 0x3d7a, 0x3da6, 0x6e0b, 0x3db5, 0x41f4, 0x3dbf, 0x3dbc, 0x7105, 0x4229, 0x4226, 0x422a, 0x3dbe, 0x3dc0, 0x457e, 0x3e3b, 0x3e39, 0x465b, 0x4661, 0x4660, 0x3e3c, 0x479b, 0x7314, 0x7304, 0x47c3, 0x3e7d, 0x47cd, 0x3e7f, 0x3e7a, 0x3e7c, 0x7305, 0x3e7e, 0x7315, 0x730d, 0x3e80, 0x3ebf, 0x3ec3, 0x4954, 0x4959, 0x3ecc, 0x3f0e, 0x3f0d, 0x4af5, 0x3f26, 0x3f24, 0x3f25, 0x3f23, 0x3f21, 0x3f29, 0x4c69, 0x4c65, 0x3f8f, 0x3f8d, 0x4d7c, 0x3f8b, 0x3f92, 0x4d80, 0x3f90, 0x4f65, 0x3fef, 0x3ff0, 0x4fdf, 0x5060, 0x4001, 0x505e, 0x402e, 0x402d, 0x772e, 0x4028, 0x4029, 0x402c, 0x518f, 0x5161, 0x515a, 0x7741, 0x4088, 0x5367, 0x4092, 0x4091, 0x77ea, 0x53bb, 0x7844, 0x40a9, 0x40ac, 0x40ae, 0x40aa, 0x4106, 0x4105, 0x414a, 0x413e, 0x413c, 0x413b, 0x579b, 0x4142, 0x4141, 0x4143, 0x57a9, 0x4145, 0x5966, 0x419a, 0x419b, 0x419f, 0x419e, 0x5a72, 0x5a76, 0x5b14, 0x41de, 0x41e2, 0x41e6, 0x5b0f, 0x7b29, 0x41e3, 0x7b27, 0x41df, 0x5e41, 0x5e46, 0x7c9d, 0x5e4b, 0x5e43, 0x427e, 0x42c9, 0x42cc, 0x5fc6, 0x42d1, 0x5fc7, 0x42d0, 0x5fce, 0x42cf, 0x42c8, 0x5fc9, 0x42cd, 0x5fcb, 0x5fc5, 0x4349, 0x4347, 0x4358, 0x436b, 0x436c, 0x436a, 0x6369, 0x4380, 0x4382, 0x4384, 0x7fc8, 0x4383, 0x641e, 0x64ba, 0x43b6, 0x6552, 0x6551, 0x6553, 0x669f, 0x66db, 0x8126, 0x43f1, 0x66e3, 0x43f6, 0x43f3, 0x43f0, 0x811c, 0x66d7, 0x66e9, 0x8128, 0x43f5, 0x43f4, 0x43f7, 0x66de, 0x66dc, 0x693c, 0xf98b, 0x4455, 0x6a22, 0x6a32, 0x6a23, 0x448b, 0x44cb, 0x44c2, 0x6bd4, 0x6bc8, 0x6bbc, 0x44ca, 0x44cc, 0x6bcd, 0x44c7, 0x44c9, 0x8370, 0x6bbe, 0x44c6, 0x6c40, 0x6bd6, 0x44c3, 0x8382, 0x6bbd, 0x83ac, 0x6bba, 0x44c4, 0x6bc0, 0xf99b, 0xf99d, 0x6bc1, 0x71a6, 0x71a5, 0x71a8, 0x45a9, 0x86ad, 0x45a8, 0x45a6, 0x725f, 0x7270, 0x726a, 0x7265, 0x7267, 0x726f, 0x7287, 0x86ca, 0x8851, 0x763d, 0x7643, 0x4622, 0x7640, 0x4626, 0x4624, 0x4625, 0x889d, 0x462a, 0x4674, 0x7818, 0x4679, 0x8990, 0x467a, 0x7819, 0x78c1, 0x89d8, 0x89d7, 0x4697, 0x78bc, 0x78c8, 0x8a2e, 0x7971, 0x46bc, 0x796e, 0x46b3, 0x7978, 0x46bf, 0x46b7, 0xf9cd, 0x797a, 0x7bb1, 0x7baf, 0x7bb0, 0x4734, 0x4746, 0x4748, 0x8c59, 0x7ca8, 0x7ca6, 0x4756, 0x4767, 0x7d48, 0x7d45, 0x4768, 0x4799, 0x479a, 0x7ea0, 0x7ea4, 0x47d8, 0x7fd4, 0x47db, 0x47dc, 0x47dd, 0x47d7, 0x7fd2, 0x8222, 0x4849, 0x484a, 0x8eda, 0x82b7, 0x82cc, 0x9033, 0x84e6, 0x9018, 0x489a, 0x84c8, 0x48cd, 0x48ca, 0x86f4, 0x48cb, 0x86ed, 0x48cf, 0x867e, 0xf9e3, 0x48cc, 0x48ea, 0x48ed, 0x87f9, 0x87fd, 0x48e9, 0x8807, 0x491a, 0x91ef, 0x498d, 0x49d2, 0x8e78, 0x8e7a, 0x8e79, 0x8f8a, 0x49f2, 0x907b, 0x91d5, 0x91e9, 0x4a3d, 0x91eb, 0x4a3e, 0x4af8, 0x4b23, 0x9ad9, 0x4eb4, 0x016c, 0x50a0, 0x5090, 0x3475, 0x5086, 0x5084, 0x02fa, 0x508a, 0x3476, 0x3473, 0x509f, 0x50a1, 0x0318, 0x5093, 0x34bd, 0x05f6, 0x51d5, 0x078a, 0x0789, 0x34f9, 0x077f, 0x0788, 0x34fa, 0x0783, 0x0784, 0x0798, 0x0763, 0x0787, 0x3521, 0xf827, 0x3529, 0x08f5, 0x0950, 0x3538, 0x354e, 0x0a87, 0x0a8a, 0x0b65, 0x0db7, 0x0dc1, 0x0dc7, 0x35c8, 0x35bc, 0x0dc5, 0x0dcb, 0x5590, 0x0dd1, 0x35bb, 0x35c2, 0x35c0, 0x0db8, 0x0dca, 0x35ca, 0x0dde, 0x35c9, 0x0dce, 0x35b8, 0x5710, 0x5817, 0x1368, 0x364e, 0x136b, 0x5844, 0x3650, 0x582b, 0x136a, 0x5845, 0x1366, 0x1377, 0x1396, 0x136e, 0xf856, 0x368a, 0x1657, 0x5965, 0x1656, 0x179c, 0x179e, 0x36fc, 0x36f9, 0x17a1, 0x3763, 0x1a42, 0x5bcf, 0x1a46, 0x1a3e, 0x1b33, 0x3787, 0x3788, 0x1bfa, 0x379a, 0x1c97, 0x1c9b, 0x1caa, 0x5d56, 0x1e73, 0x1e7c, 0x37e9, 0x1e86, 0x37ea, 0x5d54, 0x3850, 0x20f3, 0x20f0, 0x3856, 0x3852, 0x384f, 0x3854, 0x3851, 0x20ec, 0x22af, 0x388e, 0x388f, 0x2264, 0x2268, 0x235a, 0x5f3d, 0x251f, 0x2525, 0x38ed, 0x38eb, 0x5fa4, 0x26c6, 0x26d6, 0x26c3, 0x3962, 0x272c, 0x395d, 0x272e, 0x275e, 0x2733, 0x3961, 0x3965, 0x395c, 0x272d, 0x2746, 0x395f, 0x26c1, 0x273a, 0x29cc, 0x2b9d, 0x2b83, 0x2bf6, 0x63ec, 0x3a16, 0x3a0a, 0x2bf8, 0x3a0e, 0x3a12, 0x2bfe, 0x2bf3, 0x3a11, 0x2beb, 0x2bfa, 0x3a10, 0x2c07, 0x2bfc, 0x3a09, 0x63fa, 0x3a15, 0x63d4, 0x2f72, 0x2f73, 0x2f74, 0x3a91, 0x3a95, 0x3a93, 0x3a92, 0x3a8f, 0x2f5f, 0x2f60, 0x30aa, 0x3134, 0x3af6, 0x31b4, 0x3afb, 0x31f0, 0x6675, 0x3af9, 0x320d, 0x31f3, 0x320f, 0x671c, 0x3b7d, 0x34c9, 0x3b7a, 0x3b7f, 0x34c5, 0x3b78, 0x34d7, 0x34cc, 0x68d9, 0x34e7, 0x3b70, 0x3b82, 0x34c1, 0x3b84, 0x34e8, 0x3c33, 0x38cb, 0x3c32, 0x3c36, 0x38c8, 0x397a, 0x3c56, 0x3979, 0x397e, 0x3c67, 0x3a1b, 0x3c65, 0x3c64, 0x3c66, 0x3a1f, 0x3a19, 0x3c81, 0x3c82, 0x3c83, 0x3c9e, 0x3b89, 0x6bf1, 0x3c9d, 0x3b8b, 0x3d0f, 0x3d12, 0x3e09, 0x3dfe, 0x3e00, 0x3d10, 0x3d18, 0x3e0b, 0x3d14, 0x3d19, 0x6e37, ERROR, 0x3e4a, 0x6e7d, 0x6e86, 0x3dc8, 0x3dc4, 0x3dc6, 0x4279, 0x3dc7, 0x3dc3, 0x426c, 0x4299, 0xf91b, 0x4262, 0x4514, 0x3e19, 0x3e1c, 0x45c8, 0x45d7, 0x460c, 0x3e41, 0x4670, 0x3e42, 0x3e43, 0x4671, 0x47df, 0x47e4, 0x3e82, 0x47e7, 0x3e81, 0x3e94, 0x3e84, 0x4990, 0x3ed2, 0x3f0f, 0x3f22, 0x4b4c, 0x3f27, 0x3f2a, 0x74fa, 0x3f28, 0x4b4f, 0x3f60, 0x4c7d, 0x4c7e, 0x4c7c, 0x7572, 0x4c8d, 0x4d19, 0x3f9b, 0x3f9c, 0x4dc0, 0x3f93, 0x3f94, 0x75dc, 0x3fa0, 0x3f99, 0x4db6, 0x3fa1, 0x4da8, 0x3ff1, 0x4feb, 0x4fe7, 0x506f, 0x51c7, 0x4036, 0x519f, 0x4037, 0x403f, 0x403c, 0x51c4, 0x4034, 0x4039, 0x403b, 0x4035, 0x4030, 0x4032, 0x4038, 0x403e, 0x403a, 0x519b, 0x5197, 0x51c5, 0x536b, 0x53ce, 0x40b6, 0x7867, 0x54b1, 0x54ae, 0x54b0, 0x40b3, 0x4109, 0x7977, 0x573e, 0x57b5, 0x57ba, 0x414c, 0x57b2, 0x57b4, 0x4153, 0x414d, 0x4151, 0x414f, 0x7a9b, 0x5977, 0x41a2, 0x5986, 0x597b, 0x41cd, 0x5a7e, 0x5b2e, 0x41e7, 0x5b2f, 0x41f0, 0x5b37, 0x41e9, 0x41ec, 0x5b32, 0x41e8, 0x41ee, 0x4202, 0x5b36, 0x5b39, 0x5b35, 0x5e5c, 0x4282, 0x4283, 0x4286, 0x5e7b, 0x5e61, 0x5fee, 0x5feb, 0x5fef, 0x6020, 0x7d2a, 0x7d65, 0x434a, 0x6230, 0x435a, 0x7f64, 0x62be, 0x436e, 0x6367, 0x637c, 0x4370, 0x436f, 0x6424, 0x438a, 0x4387, 0x4388, 0x6429, 0x64ef, 0x8020, 0x43b7, 0x43fd, 0x8120, 0x670d, 0x4405, 0x813c, 0x4408, 0x4403, 0x4402, 0x4404, 0x3b39, 0x4409, 0x43ff, 0x6764, 0x813f, 0x6715, 0x43fc, 0x4401, 0x440a, 0x81f0, 0x81f5, 0x446b, 0x446c, 0x6a35, 0x6a36, 0x6a34, 0x6a37, 0x6c47, 0x6c2b, 0x44de, 0x6c41, 0x6c43, 0x44db, 0x6c42, 0x44dd, 0x44e3, 0x6c32, 0x44e0, 0x44d9, 0x44d8, 0x44e4, 0x6c44, 0x6c4a, 0x44da, 0x44ef, 0xf9a0, 0x8415, 0x83be, 0x6c54, 0x6c6e, 0x6c52, 0x44d7, 0x45b3, 0x45bb, 0x86e5, 0x45b2, 0x86d2, 0x45ad, 0x7292, 0x45af, 0xf9b8, 0x86e0, 0x72bf, 0x4616, 0x4628, 0x4623, 0x88b3, 0x7641, 0x7669, 0x7665, 0x4675, 0x467e, 0x467c, 0x7822, 0x781d, 0x78d2, 0x78da, 0x78db, 0x46ce, 0x46cd, 0x46cf, 0x8a53, 0x79a4, 0x799e, 0x8a37, 0x8a47, 0x8a5c, 0x799d, 0x46c4, 0x46cc, 0x46c8, 0x46c7, 0x79ad, 0x79a6, 0x79a7, 0x7bb3, 0x7be0, 0x7c35, 0x7c37, 0x475a, 0x476a, 0x7d4a, 0x476b, 0x476d, 0x476f, 0x7e5e, 0x479e, 0x7ec0, 0x47a4, 0x47a3, 0x47e4, 0x47e8, 0x47e9, 0x47e0, 0x47e3, 0x7ff9, 0x47ea, 0x47e1, 0x47ed, 0x4834, 0x4835, 0x4851, 0x8ef0, 0x84f0, 0x489d, 0x84f3, 0x851b, 0x84f2, 0x84fb, 0x871c, 0x8713, 0x48d0, 0x870f, 0x48ee, 0x8816, 0x8811, 0x8812, 0x48f2, 0x880e, 0x921d, 0x4988, 0x8c67, 0x8cf2, 0x8cda, 0x498f, 0x8cdc, 0x49d8, 0x8f94, 0x8f9b, 0x8f92, 0x8f9a, 0x9088, 0x9086, 0x4a3f, 0x91ef, 0x4a52, 0x976b, 0x925e, 0x4a50, 0x9458, 0x4ab1, 0x9456, 0x9454, 0x4af9, 0x959b, 0x9696, 0x96a4, 0x4b26, 0x4b28, 0x969a, 0x9a12, 0x3480, 0x50c0, 0x3481, 0x036b, 0x347e, 0x347f, 0x0337, 0x033c, 0xf80a, 0x04f7, 0x34be, 0x0566, 0x34d6, 0x07a9, 0x07ae, 0x07ad, 0x07c8, 0x07a5, 0x07b0, 0x0895, 0x52e5, 0x0925, 0x3534, 0x0a99, 0x53af, 0x0b74, 0x0b70, 0x0b6f, 0x0e41, 0x0e54, 0x35d5, 0x35d8, 0x0e40, 0x0e38, 0x35d4, 0x55d8, 0x35d9, 0x0e52, 0x0e3a, 0x0e57, 0xf84a, 0x0e59, 0x5711, 0x5867, 0x13b4, 0x13c0, 0x365d, 0x5843, 0x365e, 0x3659, 0x1375, 0x365a, 0x36a0, 0x1660, 0x1647, 0x3705, 0x17f0, 0x3707, 0x17ef, 0x370e, 0x370c, 0x17ec, 0x1983, 0x3745, 0x1984, 0x198f, 0x3764, 0x1a61, 0x3765, 0x1a69, 0x5bdd, 0x3766, 0x1a62, 0x3789, 0x37ec, 0x37f1, 0x5d70, 0x5d6a, 0x37f0, 0x37f8, 0x5d74, 0x5d5f, 0x1eae, 0x5d61, 0x5d73, 0x1eb2, 0x37f2, 0x37f4, 0x210b, 0x3858, 0x2110, 0x210d, 0x385a, 0x3859, 0x3857, 0x385b, 0x5e50, 0x227f, 0x2281, 0x38a6, 0x38c2, 0x38c1, 0x5f3f, 0x240b, 0x254e, 0x38ef, 0x5fb0, 0x27ea, 0x2745, 0x3968, 0x6135, 0x612d, 0x3973, 0x396e, 0x3974, 0x6102, 0x3966, 0x2728, 0x275d, 0x29dc, 0x39b9, 0x6226, 0x29d4, 0x3a0c, 0x2c64, 0x2c68, 0x3a20, 0x2c62, 0x3a1d, 0x2c61, 0x3a1c, 0x2c66, 0x3a21, 0x3a1a, 0x3a19, 0x2bf2, 0x2c69, 0x2c67, 0x3a7e, 0x2f9a, 0x2f9b, 0x2f85, 0x2f9c, 0x3a9d, 0x2fa4, 0x3a9e, 0x3a9c, 0x656e, 0x2f99, 0x2f86, 0x2f90, 0x3081, 0x30ae, 0x65b1, 0x65d4, 0x3acd, 0x3138, 0x3b0b, 0x3b0a, 0x6685, 0x353b, 0x3b8f, 0x6972, 0x3b95, 0x3b90, 0x3b91, 0x354c, 0x693a, 0x3bb9, 0x3547, 0x3535, 0x3b97, 0x3b9e, 0x3533, 0x3b8b, 0x3582, 0x3540, 0x3c3b, 0x3c3a, 0x3c3c, 0x3c3d, 0x3c39, 0x3c3e, 0x3c6b, 0x3c6c, 0x3a36, 0x3b0e, 0x3ca2, 0x3ca1, 0x3c9f, 0x3bad, 0x3baa, 0x3e17, 0x3d2d, 0x3e67, 0x3d36, 0x3d2b, 0x3e72, 0x3d37, 0xf90a, 0x3e61, 0x3eb0, 0x6ead, 0x3d25, 0x3d2f, 0x3d2c, 0x3e6e, 0x3e64, 0x3d32, 0x3e8c, 0x3e66, 0x6e95, 0x3e6b, 0x3e5f, 0x3e74, 0x3e65, 0x42bb, 0x42be, 0x3dd5, 0x42b9, 0x3dd4, 0x3dd6, 0x42ef, 0x3dd1, 0x7243, 0x45da, 0x3e46, 0x728f, 0x4690, 0x47e9, 0x3e8c, 0x3e8a, 0x3e88, 0x4811, 0x480d, 0x47ed, 0x4821, 0x3edd, 0x4981, 0x49b1, 0x4b01, 0x3f2d, 0x4b5e, 0x4b62, 0x3f2e, 0x3f2c, 0x3f2b, 0x3f30, 0x4b5b, 0x3f4e, 0x4c96, 0x4c93, 0x3f64, 0x3f61, 0x4c92, 0x7575, 0xf939, 0x3f70, 0x3fa6, 0x3fa4, 0x4dc4, 0x4dc7, 0x4dc3, 0x3fa8, 0x3fa2, 0x4dc8, 0x3fa7, 0x75ec, 0x3fa5, 0x4dca, 0x3fa9, 0x4dc5, 0x4dcf, 0x4ddc, 0x4f7c, 0x5001, 0x403d, 0x51d3, 0x51dc, 0x4044, 0x4045, 0x4046, 0x51d4, 0x7757, 0x51cc, 0x4047, 0x4048, 0x4042, 0x51d6, 0x51db, 0x4041, 0x51d5, 0x53d9, 0x4094, 0x53dd, 0x53dc, 0x53e0, 0x54cc, 0x40c0, 0x40b8, 0x40c1, 0x40c2, 0x40bb, 0x40bd, 0x40bf, 0x40b9, 0x40b7, 0x54d2, 0x40c7, 0x54d3, 0x410c, 0x410b, 0x797b, 0x4110, 0x568d, 0x415d, 0x7a21, 0x415a, 0x4158, 0x4156, 0x57d8, 0x4154, 0x7a16, 0x57bc, 0x41a8, 0x41a7, 0x41cf, 0x41d0, 0x5a8a, 0x7ae8, 0x5a8b, 0x5a8d, 0x41d1, 0x41eb, 0x5b53, 0x41fb, 0x7b6a, 0x5b59, 0x41fd, 0x41f8, 0x41f7, 0x4200, 0x5b56, 0x5b57, 0x41f6, 0x7b5f, 0x5e73, 0x601b, 0x42df, 0x6021, 0x6016, 0x6018, 0x42e2, 0x42e4, 0x6044, 0x7d82, 0x6026, 0x42e3, 0x6236, 0x4359, 0x4371, 0x438e, 0x438c, 0x643a, 0x43a4, 0x64f4, 0x8055, 0x4414, 0x6762, 0x675b, 0x676a, 0x4411, 0x6768, 0x441b, 0x4412, 0x440e, 0x4415, 0x8168, 0x4410, 0x6781, 0x4417, 0x8246, 0x8243, 0x4470, 0x44ed, 0x6ce7, 0x44ee, 0x6ce6, 0x6cd1, 0x6d11, 0x8481, 0x6cd0, 0x6cd9, 0x6d0a, 0x44f4, 0x6cda, 0x6cdd, 0x6cc8, 0x6ce2, 0x6ce9, 0x6ccb, 0x847c, 0x6ccc, 0x6cc1, 0x846a, 0x6cde, 0x8488, 0x44f2, 0x44f8, 0x44f3, 0x6d51, 0x6d12, 0x44fa, 0x6ce0, 0x6d2b, 0xf9b4, 0x72d8, 0x72d1, 0x8710, 0x72d2, 0x72cd, 0x871f, 0x45b6, 0x45b7, 0x733d, 0x870f, 0x72ca, 0x45ba, 0x72cb, 0x45bc, 0x72d7, 0x75f4, 0x463b, 0x88d3, 0x462f, 0x7687, 0x768b, 0x7683, 0x4637, 0x4699, 0x79c5, 0x79d2, 0x79c6, 0x79d3, 0x46d9, 0x46d8, 0x46d7, 0x79f0, 0x79cd, 0x79cc, 0x79dc, 0x79d6, 0x4736, 0x7be6, 0x7c41, 0x7c3f, 0x8c87, 0x7cc5, 0x7cc0, 0x7cc6, 0x7cbe, 0x7cbf, 0x8cc6, 0x4770, 0x7d63, 0x7ed3, 0x7eda, 0x7ed5, 0x47a5, 0x47a6, 0x47a9, 0x47ee, 0x4854, 0x82ee, 0x4857, 0x82fc, 0x8414, 0x48a1, 0x8523, 0x8522, 0x8530, 0x86b5, 0x48d3, 0x8738, 0x48d4, 0x873f, 0x48d7, 0x90cc, 0x916d, 0x9170, 0x48f7, 0x48f6, 0x48f9, 0x48f8, 0x9258, 0x9242, 0x9268, 0x9269, 0x8968, 0x8967, 0x9243, 0x8965, 0x9247, 0x498a, 0x8c75, 0x8cf7, 0x8cf3, 0x8cf6, 0x4994, 0x8d00, 0x4993, 0x8cff, 0x8cf5, 0x959d, 0x49dd, 0x49dc, 0x49f7, 0x96cf, 0x9092, 0x9206, 0x4a42, 0x9207, 0x926b, 0x4a54, 0x926c, 0x4a55, 0x9393, 0x4a8f, 0x9394, 0x97f4, 0x4ab4, 0x4ab3, 0x9462, 0x9463, 0x9809, 0x945f, 0x9464, 0x945b, 0x9459, 0x4afb, 0x4afd, 0x95a4, 0x95ac, 0x98ab, 0x4afc, 0x96b5, 0x4b2c, 0x4b2f, 0x96ae, 0x4b2b, 0x96c5, 0x4b33, 0x4b34, 0x98fb, 0x983b, 0x9aac, 0x9aae, 0x9aaa, 0x4be8, 0x9abf, 0x9c2b, 0x9c84, 0x9c80, 0x9d4d, 0x9d4f, 0x9b5c, 0x9d4c, 0x9f92, 0x4d5d, 0x50d2, 0x3485, 0x3488, 0x03ae, 0x0379, 0x348e, 0x3484, 0x0371, 0x50df, 0x03b3, 0x3483, 0x032c, 0x0377, 0x052f, 0x07c3, 0x3502, 0x07cd, 0x3506, 0x3505, 0x07c9, 0x34fe, 0x3501, 0x3500, 0x07ce, 0x08a5, 0x08a0, 0x08fe, 0x0959, 0x0a9a, 0x35e7, 0x5619, 0x0ee4, 0x0ed7, 0x0edc, 0x35e6, 0x0ee7, 0x35ed, 0x35e2, 0x35eb, 0x0ee5, 0x35e8, 0x35ec, 0x560a, 0x3624, 0x589a, 0x1414, 0x3662, 0x13f1, 0x3661, 0x3660, 0x3664, 0x368b, 0x15b6, 0x166e, 0x166c, 0x1681, 0x1842, 0x3719, 0x3716, 0x3718, 0x3722, 0x181a, 0x371d, 0x3717, 0x371e, 0x1827, 0x1825, 0x1817, 0x181c, 0x183d, 0x1820, 0x3769, 0x376a, 0x1a81, 0x376c, 0x377a, 0x378a, 0x1c09, 0x1cc6, 0x1cc4, 0x379c, 0x1cc5, 0x37fd, 0x37f9, 0x1eef, 0x37ff, 0x1edf, 0x1ede, 0x1eee, 0x1ef5, 0x1eec, 0x37fc, 0x1edd, 0x5d85, 0x37fb, 0x3802, 0x385f, 0x5e56, 0x385e, 0x385d, 0x385c, 0x2122, 0x5e51, 0x3892, 0x2297, 0x2295, 0x3894, 0x3895, 0x38d1, 0x24a9, 0x38f1, 0x2553, 0x5fb1, 0x2556, 0x2555, 0x3977, 0x396f, 0x27e3, 0x27e2, 0x3987, 0x397d, 0x397c, 0x397e, 0x3985, 0x398b, 0x3986, 0x3980, ERROR, 0x27a9, 0x3978, 0xf8ab, 0x2833, 0x280a, 0x39ba, 0x2a59, 0x3a33, 0x2cbc, 0x3a2d, 0x2cc4, 0x2cc7, 0x2cc6, 0x3a37, 0x645a, 0x6463, 0x2cb8, 0x2cda, 0x3a2e, 0x2cb7, 0x2cc0, 0x3a3d, 0x2ccd, 0x3aa0, 0x2fbc, 0x2fab, 0x3aa3, 0x3086, 0x669b, 0x325a, 0x66a3, 0x3b0e, 0x669e, 0x3343, 0x3bb6, 0x35ac, 0x3bab, 0x3bad, 0x3ba6, 0x35be, 0x69b8, 0x3baa, 0x69ba, 0x3bb1, 0x35ab, 0x3ba8, 0x3baf, 0x3bb0, 0x3ba7, 0x3bb2, 0x3b9d, 0x3ba5, 0x3bb5, 0x1b3e, 0x69c7, 0x69d7, 0x38f9, 0x3c41, 0x38f3, 0x38f7, 0x6b70, 0x3a45, 0x3a48, 0x3c72, 0x6b9d, 0x3c6f, 0x3c71, 0x3a44, 0x3c85, 0x3aaf, 0x3ab1, 0x3ca4, 0x3ca5, 0x3ca6, 0x3bcf, 0x3ca8, 0x3bcb, 0x3bcd, 0x3ca3, 0x3c50, 0x3eec, 0x3f1a, 0x6f16, 0x6f24, 0x3ed8, 0x3d43, 0x3ed0, 0x3ed1, 0x3d3d, 0x3d45, 0x3e7b, 0x3ed2, 0x3d44, 0x3ed4, 0x3ee7, 0x3edf, 0x3ede, 0x6f45, 0x3ed9, 0x3ecf, 0x430d, 0x3de3, 0x7179, ERROR, 0x3ddf, 0x3de4, 0x717a, 0x3de5, 0x4338, 0x7254, 0x3e22, 0x3e4a, 0x46a9, 0x3e49, 0x3e44, 0x3e4b, 0x3e87, 0x3e89, 0x3e92, 0x3e91, 0x3e90, 0x3e8e, 0x483e, 0x4846, 0x49ed, 0xf930, 0x3f12, 0x3f10, 0x3f11, 0x4b6c, 0x3f32, 0x3f34, 0x3f37, 0x3f33, 0x3f36, 0x3f35, 0x3f65, 0x4cac, 0x757c, 0x757b, 0x4dc9, 0x7612, 0x3fb0, 0x4e12, 0x3faf, 0x3faa, 0x4dfd, 0x4e01, 0x4e11, 0x3fab, 0x4e89, 0x4e05, 0x4dfe, 0x4e0b, 0x4e20, 0x4e04, 0x4f88, 0x3ff3, 0x5002, 0x3ff4, 0x5003, 0x76b6, 0x76e0, 0x4008, 0x404e, 0x4055, 0x404b, 0x5229, 0x523b, 0x404d, 0x7773, 0x5206, 0x4052, 0x7772, 0x404c, 0x7770, 0x4050, 0x4053, 0x5203, 0x4051, 0x5378, 0x5379, 0x537d, 0x4089, 0x537f, 0x4095, 0x40cc, 0x40c8, 0x40ce, 0x5532, 0x40ca, 0x5500, 0x789d, 0x5522, 0x40cd, 0x56a9, 0x415c, 0x4167, 0x4169, 0x4165, 0x4162, 0x5804, 0x7a27, 0x7a35, 0xf959, 0x41aa, 0x59b8, 0x5a9b, 0x41d2, 0x7ba2, 0x4203, 0x420c, 0x5b92, 0x4209, 0x4206, 0x4205, 0x7b89, 0x5b8f, 0x420b, 0x4208, 0x5b98, 0x7ba5, 0x5bae, 0x428e, 0x5e9d, 0x7cb6, 0x42e8, 0x6049, 0x6050, 0x6046, 0x42ea, 0x604e, 0x7da5, 0x7dc3, 0x6055, 0x42e9, 0x42eb, 0x6064, 0x42f0, 0x6238, 0x434b, 0x7fab, 0x4373, 0x4375, 0x4392, 0x4391, 0x4393, 0x8025, 0x43a7, 0x43a6, 0x43a8, 0x43aa, 0x64fe, 0x43a9, 0x8059, 0x43bb, 0x43bc, 0x43ba, 0x43bd, 0x4427, 0x8185, 0x67a6, 0x4424, 0x441e, 0x441f, 0x441d, 0x4420, 0x4423, 0x4429, 0x4422, 0x679c, 0x6799, 0x441c, 0x818e, 0x4428, 0x67b5, 0x67a3, 0x67a0, 0x67a7, 0x679b, 0x69df, 0x69e1, 0x4471, 0x4473, 0x4472, 0x6a4d, 0x4502, 0x6df3, 0x6d6f, 0x6d69, 0x44fe, 0x84be, 0x6d6b, 0x6d78, 0x6d87, 0x4508, 0x6d85, 0x6d82, 0x6d90, 0x4507, 0x4504, 0x6d80, 0x6d67, 0x4500, 0x44fc, 0x6d61, 0x4544, 0x6d93, 0x44f1, 0x6df2, 0x6d86, 0x84a6, 0x4506, 0x71cd, 0x71c4, 0x45c6, 0x45c3, 0x45c1, 0x45c2, 0x730f, 0x45c4, 0x45c7, 0x730d, 0x45bf, 0x45d2, 0x7373, 0x45ca, 0xf9ba, 0x730a, 0x872f, 0x7308, 0x7313, 0x4613, 0x75f8, 0x4630, 0x463e, 0x4639, 0x76ab, 0x76a8, 0x463c, 0x463f, 0x76a5, 0x4634, 0x463d, 0x76c3, 0x76a4, 0x4638, 0x76d4, 0x76ba, 0x77f1, 0x89a0, 0x4682, 0x783f, 0x4683, 0x78ea, 0x469b, 0x79f7, 0x46e0, 0x46dd, 0x79fa, 0x79f5, 0x46de, 0x79fe, 0x46e3, 0x46e5, 0x7a00, 0x8a97, 0x46e2, 0x7a02, 0x79fb, 0x7a07, 0x46df, 0x7a1a, 0x472e, 0x7bb8, 0x4737, 0x4738, 0x7be9, 0x7beb, 0x7c50, 0x7c4f, 0x8c8b, 0x7d86, 0x3562, 0x7d8e, 0x4794, 0x4793, 0x47ab, 0x47ad, 0x7ef0, 0x7efb, 0x47f5, 0x47f7, 0x8042, 0x47f6, 0x47f8, 0x8085, 0x47fb, 0x47f9, 0x4858, 0x485a, 0x8305, 0x4859, 0x8f0f, 0x4885, 0x48a4, 0x48d8, 0x48d9, 0x874b, 0x48dd, 0x48c8, 0x8763, 0x48fa, 0x48fb, 0x9275, 0x4927, 0x929f, 0x492a, 0x4925, 0x8999, 0x4928, 0x8c81, 0x8d17, 0x8d10, 0x8d12, 0x95a6, 0x4995, 0x969a, 0x8efa, 0x8ef3, 0x8ef2, 0x8ef5, 0x8ef6, 0x8fbb, 0x8fc2, 0x90a7, 0x4a0f, 0x4a11, 0x90a8, 0x90a3, 0x4a10, 0x90aa, 0x4a15, 0x4a13, 0x9757, 0x91dc, 0x4a47, 0x4a46, 0x920f, 0x4a59, 0x4a5b, 0x9279, 0x4a5e, 0x927f, 0x9285, 0x4a5a, 0x4a91, 0x4a92, 0x4a90, 0x4a93, 0x941b, 0x97f7, 0x4abe, 0x9477, 0x9476, 0x9498, 0x4abc, 0x4abb, 0x4ab7, 0x4ab9, 0x947a, 0x4b01, 0x4afe, 0x95bc, 0x95ba, 0x4b02, 0x95b6, 0x4aff, 0x98b0, 0x95b4, 0x4b00, 0x96cf, 0x4b37, 0x4b3a, 0x4b6f, 0x4b77, 0x4b79, 0x99c6, 0x987b, 0x4bc8, 0x9a1c, 0x9a21, 0x9a1d, 0x9ac0, 0x4bf2, 0x9aff, 0x4bf1, 0x4bf0, 0x9b62, 0x9d56, 0x4c34, 0x9fa1, 0x9fa2, 0x9fa6, 0xa256, 0xa257, 0x4d2c, 0x4d2d, 0xa301, 0xa3ed, 0xfa1c, 0xa5f2, 0x50fa, 0x03b8, 0x3491, 0x03c0, 0x3494, 0x03b7, 0x03e1, 0x34c4, 0x350a, 0x07e8, 0x5285, 0x08b2, 0x3552, 0x0aae, 0x3559, 0x366f, 0x0f7e, 0x35f2, 0x35f4, 0x5643, 0x0f76, 0x35f1, 0x563c, 0x0f96, 0x366a, 0x1420, 0x1421, 0x1423, 0x1429, 0x1677, 0x1851, 0x3724, 0x1856, 0x3723, 0x1888, 0x1859, 0x1855, 0x3727, 0x1997, 0x1998, 0x376d, 0x5bed, 0x376e, 0x376f, 0x1aa1, 0x1aa3, 0x5c35, 0x379f, 0x380a, 0x3806, 0x380e, 0x1f0a, 0x380d, 0x3805, 0x1f3d, 0x1f0c, 0x380b, 0x3810, 0x382e, 0x213d, 0x2139, 0x22b0, 0x22b2, 0x22ae, 0x3896, 0x3897, 0x38c4, 0x5f47, 0x38c5, 0x2420, 0x38d2, 0x256e, 0x256d, 0x256a, 0x3981, 0x2832, 0x398e, 0x3990, 0x398f, 0x2839, 0x3991, 0x3995, 0x3993, 0x27a3, 0x616d, 0x287f, 0x2835, 0x283d, 0x29f4, 0x29f5, 0x3a3b, 0x3a48, 0x2d48, 0x2d28, 0x3a46, 0x3a47, 0x2d27, 0x2d32, 0x2d2c, 0x3a4c, 0x2d2e, 0x3a4a, 0x3a50, 0x3a43, 0x2d23, 0x2d31, 0xf8c5, 0x3a49, 0x3aa6, 0x3aa5, 0x3aa4, 0x2fc9, 0x3089, 0x3ab9, 0x30bb, 0x3ace, 0x3acf, 0x3b13, 0x3397, 0x3393, 0x3628, 0x3bc6, 0x3bc5, 0x3bca, 0x3bd9, 0x3bc1, 0x3618, 0x363b, 0x69f5, 0x3627, 0x3624, 0x361b, 0x3631, 0x3bcb, 0x3626, 0x36a3, 0x363f, 0x3622, 0x3619, 0x6a03, 0x3641, 0x362b, 0x6a65, 0x3c42, 0x390c, 0x6b75, 0x3c74, 0x3c73, 0x3a4e, 0x3ab9, 0x3afa, 0x3be9, 0x3be8, 0x3be4, 0x6f8a, 0x6f56, 0x3d52, 0x3f5f, 0x3f5d, 0x3f52, 0x3d50, 0x3f74, 0x3d4b, 0x3f46, 0x3d4c, 0x3d6d, 0x3faa, 0x6f98, 0x3f4a, 0x3f59, 0x3f4b, 0x3d4f, 0x6f68, 0x3df0, 0x4350, 0x7234, 0x7245, 0x3e4d, 0x3e4c, 0x46d0, 0x3e4f, 0x3e4e, 0x3e50, 0x46cc, 0x735c, 0x3e96, 0x7356, 0x4864, 0x4865, 0x3e97, 0x3e95, 0x3e98, 0x485c, 0x4a15, 0x3eec, 0x3eeb, 0x3f13, 0x3f14, 0x3f38, 0x3f3a, 0x3f39, 0x4b79, 0x3f68, 0x3f67, 0x4cc5, 0x4cb8, 0x4e2c, 0x3fbe, 0x3fbc, 0x4e37, 0x4e35, 0x4e31, 0x3fbb, 0x4e2f, 0x3fba, 0x4e2b, 0x3fb9, 0x3fb7, 0x4e2d, 0x4e2a, 0x3fc1, 0x4f95, 0x3ff7, 0x523e, 0x4060, 0x5247, 0x5245, 0x4059, 0x405c, 0x405a, 0x4058, 0x5252, 0x405b, 0x5270, 0x5250, 0x5258, 0x5251, 0x523d, 0x405d, 0x5241, 0x520c, 0x523c, 0x5386, 0x5383, 0x5389, 0x53f3, 0x40d4, 0x40d3, 0x78bf, 0x40d2, 0x78bd, 0x552d, 0x40d7, 0x40d1, 0x78e4, 0x40d5, 0x56c5, 0xf955, 0x416d, 0x416f, 0x7a34, 0x4175, 0x416c, 0x4174, 0x5843, 0x4173, 0x5837, 0x5845, 0x7a36, 0x41ac, 0x59e5, 0x5aa6, 0x5bdb, 0x4210, 0x5bda, 0x5be6, 0x7bba, 0x7bbc, 0x420f, 0x7bc8, 0x4223, 0x7bc3, 0x421d, 0x7bb6, 0x420e, 0x5bf8, 0x5be9, 0x4215, 0x7bc2, 0x4213, 0x5be8, 0x5bf6, 0x421b, 0x7bc5, 0x4222, 0x4226, 0x5be7, 0x7bbd, 0x7bb0, 0x4221, 0x421c, 0x4217, 0x5bd5, 0x421a, 0x7bbb, 0x5ed3, 0x5ec7, 0x5ed1, 0x4299, 0x5ec3, 0x4297, 0x6080, 0x6098, 0x42fd, 0x6084, 0x42f6, 0x42fe, 0x42f5, 0x42ff, 0x42f7, 0x6097, 0x6083, 0x6081, 0x4301, 0x7e04, 0x608c, 0x6242, 0x63ab, 0x4377, 0x63a3, 0x63a6, 0x645c, 0x6469, 0x6467, 0x43ab, 0x658b, 0x65a8, 0x43c0, 0x67d8, 0x4431, 0x442e, 0xf989, 0x67dc, 0x442c, 0x67e0, 0x67e5, 0x4432, 0x442f, 0x442b, 0x442d, 0x4433, 0x6918, 0x6919, 0x81f1, 0x4457, 0x445c, 0x447b, 0x6a5f, 0x6a5e, 0x447a, 0x6e02, 0x8522, 0x4513, 0x451e, 0x4517, 0x4520, 0x452a, 0x4511, 0x4515, 0x450f, 0x4518, 0x8538, 0x6e12, 0x6e36, 0x452c, 0x8532, 0xf9a8, 0x8510, 0x6e23, 0x6e03, 0x451c, 0x6e00, 0x4529, 0x6e46, 0x6e61, 0x4512, 0x854f, 0x4597, 0x7384, 0x8772, 0x736b, 0x7362, 0x7356, 0x736a, 0x7352, 0x7355, 0x45d4, 0x45d0, 0x877c, 0x7361, 0xf9bb, 0x7358, 0x7377, 0x45d3, 0x4614, 0x76d7, 0x4646, 0x4645, 0x76de, 0x4643, 0x76df, 0x890d, 0x4644, 0x4648, 0x76d1, 0x4647, 0x76e2, 0x76e1, 0x76dd, 0x8908, 0x4649, 0x4685, 0x784b, 0x4684, 0x784e, 0x469d, 0x78fc, 0x469e, 0x46a0, 0x78fa, 0x469c, 0x78fb, 0x469f, 0x78fe, 0x46f7, 0x46ea, 0x7a31, 0x46ef, 0x46e9, 0x46f3, 0x46f0, 0x46eb, 0x7a38, 0x46ec, 0x46f2, 0x46f5, 0x46ee, 0x7a3a, 0x7bbb, 0x473a, 0x474b, 0x7c59, 0x474a, 0x474c, 0x7cdb, 0x7cdf, 0x7ce2, 0x4779, 0x477b, 0x4778, 0x7d9e, 0x7da1, 0x47b5, 0x7f10, 0x47b4, 0x47b7, 0x8d9e, 0x4809, 0x47fe, 0x4808, 0x4807, 0x8076, 0x807f, 0x807d, 0x4806, 0x4804, 0x4805, 0x47ff, 0x480b, 0x8082, 0x8257, 0x483b, 0x485d, 0x485c, 0x485f, 0x485e, 0x8f28, 0x832e, 0x8f21, 0x4883, 0x858b, 0x858d, 0x48a7, 0x9066, 0x906c, 0x8590, 0x48a8, 0x86ec, 0x876f, 0x876b, 0x8771, 0x8778, 0x90f6, 0x48e0, 0x48df, 0x48fe, 0x48fc, 0x48ff, 0x48fd, 0x89ad, 0x492c, 0x92ec, 0x92ba, 0x92e3, 0x92bd, 0x499d, 0x8d2f, 0x95b4, 0x8f78, 0x4a40, 0x91f8, 0x9219, 0x4a5f, 0x929b, 0x9294, 0x9297, 0x9299, 0x93a6, 0x93a4, 0x93a7, 0x97d1, 0x9495, 0x4ac0, 0x9823, 0x9490, 0x4ac1, 0x4ac6, 0x949b, 0x95c4, 0x4b04, 0x4b05, 0x95c6, 0x990b, 0x4b3e, 0x4b3d, 0x4b40, 0x4b3f, 0x96e3, 0x4b42, 0x96df, 0x96dd, 0x96e7, 0x4b84, 0x4b82, 0x4b7f, 0x4b85, 0x9a2d, 0x9a2c, 0x4bcc, 0x9ab2, 0x4bcb, 0x4bcd, 0x9a34, 0x9a38, 0x9adb, 0x9b1d, 0x4bf5, 0x9b1a, 0x9b1b, 0x9b14, 0x9af0, 0x9b17, 0x9c21, 0x4c20, 0x4c21, 0x9caa, 0x9ca1, 0x4c37, 0x4c3e, 0x9b73, 0x4c3d, 0x9b6e, 0x9d63, 0x9d79, 0x9d60, 0x9b65, 0x9d62, 0x4c3c, 0x9d61, 0x4c38, 0x9b6a, 0x9d70, 0x9b6d, 0x9d6a, 0x4c3b, 0x9fc8, 0x4cb0, 0x9fc5, 0x9fbe, 0x9fc2, 0x4cad, 0x4cb2, 0x4cb8, 0x9d0b, 0x9fc7, 0x4caf, 0x9fb0, 0x9fca, 0x4d1a, 0x9e76, 0x4d20, 0x4d21, 0x4d30, 0x9ea8, 0x4d2f, 0xa30d, 0xa307, 0xa396, 0xa3ef, 0x4d5f, 0x4d60, 0xa41e, 0xa41d, 0x9f11, 0xa590, 0x03eb, 0x348a, 0x5119, 0x349c, 0x03ee, 0x349a, 0x03ef, 0x03ec, 0x07fa, 0x350c, 0x350b, 0x350d, 0x5292, 0x0904, 0x0fd3, 0x35fe, 0x0fd1, 0x0ffa, 0x35ff, 0x35fb, 0x35fc, 0x3609, 0x0fc8, 0x3600, 0x0fd5, 0x5675, 0x0fcd, 0x0fd2, 0x0ffb, 0x122a, 0x1488, 0x1461, 0x3671, 0x1463, 0x1462, 0x596f, 0x0057, 0x18c8, 0x1898, 0x372b, 0x1ac1, 0x1f3f, 0x1f41, 0x3814, 0x3811, 0x3812, 0x2152, 0x3863, 0x215e, 0x386e, 0x389a, 0x22c7, 0x389b, 0x2370, 0x2427, 0x38c8, 0x2471, 0x24b0, 0x38f6, 0x2842, 0x2843, 0x61a5, 0x398c, 0x3997, 0x39a2, 0x61a0, 0x2857, 0x289d, 0x2d89, 0x2d8d, 0x2d8b, 0x2d80, 0x2d92, 0x2d8a, 0x2dc8, 0x3a54, 0x2d8f, 0x2d93, 0x2d91, 0x3aa8, 0x2ff2, 0x2fde, 0x3aa9, 0x30c8, 0x65b4, 0x65d8, 0x66c2, 0x3b18, 0x3b17, 0x3b1d, 0x32a7, 0x32a1, 0x3b31, 0x368c, 0x367f, 0x3bd8, 0x3bd5, 0x367b, 0x3695, 0x3699, 0x3be1, 0x368e, 0x3bd4, 0x36da, 0x368a, 0x369c, 0x3be3, 0x367e, 0x3c44, 0x3c45, 0x391a, 0x3a55, 0x3c76, 0x3c75, 0x3a60, 0x6ba8, 0x3c88, 0x3caa, 0x3bfb, 0x3cab, 0x3cac, 0x3bfd, 0x3d57, 0x6f83, 0x3d60, 0x3d5d, 0x3d6b, 0x3fd0, 0x3d63, 0x3d67, 0x3fc5, 0x3d5e, 0x3fd2, 0x4011, 0x6fc5, 0x71cd, 0x3df9, 0x3df3, 0x43ad, 0x43a4, 0x43a9, 0x43b0, 0x439d, 0x3df6, 0x4598, 0x729c, 0x3e51, 0x3e53, 0x3e52, 0x4892, 0x3e9b, 0x488a, 0x3e9c, 0x488d, 0x4896, 0x3ef7, 0x7499, 0x748f, 0x7491, 0x4a45, 0x4a4b, 0x4b0f, 0x4b16, 0x3f3b, 0x4b8a, 0x3f3e, 0x3f3d, 0x4cc9, 0x3f69, 0x4cc8, 0x4cca, 0x4e64, 0x3fc3, 0x3fc4, 0x3fc7, 0x4e5d, 0x4e63, 0x7639, 0x3fc6, 0x762e, 0x3fc8, 0x4e88, 0x4f3a, 0x4f39, 0x769f, 0x76a0, 0x3fe6, 0x3ff8, 0x5017, 0x5093, 0x4007, 0x5095, 0x4064, 0x4068, 0x5276, 0x7794, 0x4065, 0x77ae, 0x5280, 0x527b, 0x4069, 0x5248, 0x52a8, 0x5288, 0x538b, 0x538a, 0x538c, 0x53fc, 0x40da, 0x40e0, 0x78e6, 0x5558, 0x40de, 0x5551, 0x5555, 0x5553, 0x411c, 0x411d, 0x411a, 0x56dc, 0x417b, 0x417a, 0x417c, 0x585c, 0x4178, 0x4177, 0x5865, 0xf95a, 0x41b1, 0x59ee, 0x41b2, 0x41b0, 0x59f0, 0x7abc, 0x59f2, 0x4236, 0x5c35, 0x422e, 0x5c22, 0x7bd6, 0x5c20, 0x4234, 0x5c2d, 0x5c28, 0x5c26, 0x5c3c, 0x422a, 0x5c38, 0x4233, 0x422d, 0x422f, 0x4231, 0x422b, 0x4232, 0x5c2a, 0x4235, 0x5c1a, 0x5c30, 0x5be3, 0x5c19, 0x5ee9, 0x5ee7, 0x7ccf, 0x60d6, 0x60c4, 0x4308, 0x6087, 0x4306, 0x60c7, 0x60d9, 0x7e18, 0x60df, 0x434d, 0x4361, 0x630a, 0x6301, 0x63b1, 0x4378, 0x63c1, 0x4394, 0x4395, 0x6476, 0x650d, 0x650e, 0x43c1, 0x43c3, 0x806d, 0x6807, 0x4439, 0x6809, 0x6816, 0x443a, 0x443b, 0x4435, 0x4436, 0x680e, 0x443c, 0x8190, 0x6806, 0x691e, 0x694a, 0x4458, 0x447c, 0x447d, 0x448d, 0x448c, 0x6ea6, 0x6e91, 0x453b, 0x453f, 0x6eb8, 0x6e96, 0x4532, 0x452d, 0x6ec5, 0x452f, 0x4539, 0x452e, 0x453a, 0x6f0a, 0x4536, 0x4531, 0x453e, 0x4538, 0x8552, 0x4534, 0x6eb2, 0x4541, 0x6eb7, 0x6eb4, 0x6e89, 0x6e8d, 0x4530, 0x6e87, 0x6ec2, 0x6e9c, 0x6e92, 0x4543, 0x6eca, 0x8550, 0x6e8a, 0x71e0, 0x4598, 0x71e6, 0x71e5, 0x87a0, 0x73a5, 0x73b3, 0x8786, 0x45da, 0x45d7, 0x73b5, 0x73af, 0x8795, 0x73b0, 0x73cc, 0x878c, 0x73a2, 0x73be, 0x73c6, 0x73ac, 0x73ae, 0x4618, 0x8860, 0xf9c3, 0x7708, 0x7705, 0x4652, 0x8928, 0x76fe, 0x464e, 0x8920, 0x7700, 0x464f, 0x4650, 0x7864, 0x7868, 0x89a8, 0x4686, 0x4687, 0x4689, 0x786a, 0x7869, 0x790d, 0x7912, 0x46a2, 0x46a3, 0x790f, 0x46a1, 0x7a67, 0x7a79, 0x7a72, 0x7a66, 0x7a7c, 0x46f9, 0x46fd, 0x7a68, 0x7a85, 0x7a76, 0x7a74, 0x7a71, 0x7a64, 0x473e, 0x473c, 0x7bf8, 0x474d, 0x7c6c, 0x474e, 0x7ceb, 0x4781, 0x4783, 0x4782, 0x7db8, 0x4780, 0x4788, 0x7f2d, 0x7f2e, 0x7f28, 0x7f29, 0x7f31, 0x47b9, 0x7f2f, 0x7f2a, 0x8e3a, 0x80a4, 0x80b7, 0x80bf, 0x4811, 0x480d, 0x4810, 0x4813, 0x8263, 0x483c, 0x4862, 0x4863, 0x8367, 0x85be, 0xf9e0, 0x8795, 0x879c, 0x4903, 0x4906, 0x4902, 0x4901, 0x8871, 0x8872, 0x4905, 0x886f, 0x9194, 0x9311, 0x89f1, 0x9337, 0x4936, 0x89e8, 0x4935, 0x9343, 0xf9ea, 0x49a1, 0x49a3, 0x8d49, 0x8d64, 0x49a0, 0x8d48, 0x49ea, 0x96a6, 0x49e8, 0x8f2c, 0x8fe1, 0x8fef, 0x90c0, 0x4a21, 0x4a1b, 0x90d7, 0x90d4, 0x4a49, 0x4a48, 0x92ad, 0x9795, 0x4a62, 0x4a61, 0x4a64, 0x4a60, 0x4a63, 0x92ae, 0x92ac, 0x9796, 0x4a66, 0x4aac, 0x4aab, 0x9427, 0x94ae, 0x4ac3, 0x94b0, 0x4ac4, 0x9825, 0x94c0, 0x94c4, 0x4b08, 0x4b09, 0x4b0a, 0x4b06, 0x4b07, 0x4b41, 0x9707, 0x4b45, 0x96fd, 0x4b43, 0x4b44, 0x9926, 0x9934, 0x4b47, 0xfa04, 0x981b, 0x981c, 0x4b71, 0x98b2, 0x98b4, 0x98b7, 0x98b1, 0x98b3, 0x98ae, 0x4b8b, 0x4bd4, 0x4bd3, 0x4bd1, 0x9aba, 0x4bd2, 0x9a3f, 0x9b36, 0x4bf7, 0x4bf8, 0x9b31, 0x9b3b, 0x9b35, 0x9b3a, 0x9b37, 0x9c22, 0x9c36, 0x9c32, 0x4c22, 0x9cc0, 0x4c45, 0x4c41, 0x9b81, 0x4c40, 0x9b8a, 0x9d85, 0x9b7f, 0x4c42, 0x9d89, 0x4cc1, 0x4cc5, 0x9fe1, 0x4cbb, 0x4cb9, 0x4cbd, 0x4cc9, 0xa00a, 0x9d11, 0xa009, 0x4cbf, 0x4cc7, 0x9fe8, 0x4cc3, 0x4d24, 0x4d31, 0x4d33, 0xa318, 0x4d32, 0x4d34, 0x4d52, 0x4d61, 0x9ed9, 0x4d7a, 0x4d82, 0x9f3c, 0xa5c5, 0x5123, 0x040d, 0x040c, 0x0421, 0x512c, 0x0616, 0x080e, 0x350f, 0x5295, 0x0817, 0x3523, 0x3525, 0x1048, 0x3606, 0x3608, 0x5688, 0x1055, 0x1049, 0x104c, 0x568b, 0x104f, 0x103d, 0x367a, 0x3677, 0x148a, 0x14a8, 0x168a, 0x372e, 0x18cb, 0x372f, 0x18d5, 0x21d4, 0x381b, 0x3813, 0x1f5c, 0x1f75, 0x3866, 0x2161, 0x3865, 0x1696, 0x38f7, 0x258a, 0x28d0, 0x61e1, 0x61d7, 0x2849, 0x28cf, 0x399c, 0x2dd6, 0x2d7f, 0x3a53, 0x2dd2, 0x2dcf, 0x3006, 0x3009, 0x3aba, 0x65a3, 0x3b22, 0x66d3, 0x3706, 0x36f1, 0x3704, 0x6a8b, 0x36fa, 0x36f4, 0x3beb, 0x3bdd, 0x36f9, 0x3bef, 0x368b, 0x3703, 0x3c47, 0x3c46, 0x39a2, 0x3c78, 0x6bac, 0x3c89, 0x3c0c, 0x3c0b, 0x3d68, 0x3d76, 0x3d74, 0x3d79, 0x4024, 0x3d7a, 0x3d77, 0xf914, 0x3d71, 0x4025, 0x3d72, 0x43f6, 0x3dff, 0x43fb, 0x3e05, 0x4532, 0x45fb, 0x3e54, 0x46f2, 0x46f3, 0x3e9e, 0x3e9f, 0x7374, 0x489c, 0x4a72, 0x3efa, 0x4a74, 0x3f44, 0x3f3f, 0x3f40, 0x4b86, 0x3f42, 0x4b8e, 0x4b90, 0x3f51, 0x4bcd, 0x4bf7, 0x4cd6, 0x4e84, 0x4e95, 0x4e8a, 0x7640, 0x3fca, 0x4e97, 0x7641, 0x3fce, 0x3fc9, 0x4fa0, 0x4fa1, 0x5022, 0x50a6, 0x50a4, 0x4009, 0x76e8, 0x406c, 0x406e, 0x4070, 0x406d, 0x406b, 0x4071, 0x4072, 0x52af, 0x52b0, 0x52bd, 0x408c, 0x40e4, 0x5576, 0x40e1, 0x557b, 0x5579, 0x78f6, 0x40e7, 0x7900, 0x40e2, 0x411f, 0x56ee, 0x56f1, 0x417e, 0x5894, 0x4180, 0x7a59, 0x7a55, 0x5891, 0x41b9, 0x41b7, 0x41b8, 0x5a10, 0x41ba, 0x7af4, 0x5aaf, 0x41d3, 0x423f, 0x7c04, 0x4245, 0x4241, 0x7c15, 0x4242, 0x4243, 0x423b, 0x4238, 0x5c7b, 0x5c77, 0x423a, 0x7bf5, 0x5c80, 0x5cc6, 0x423c, 0x5c7c, 0x5c90, 0x423e, 0x5ca3, 0x5c7d, 0x5cbd, 0x429e, 0x429f, 0x42a1, 0x5f13, 0x429b, 0x4312, 0x6111, 0x6144, 0x610d, 0x4318, 0x430c, 0x6314, 0x4362, 0x63b8, 0x437a, 0x63b7, 0x6483, 0x43ae, 0x43af, 0x6514, 0x43ad, 0x651c, 0x43c4, 0x43c7, 0x43c6, 0x43c5, 0x65d4, 0x65d5, 0x81c1, 0x4440, 0x6843, 0x6842, 0x443f, 0x4441, 0xf98a, 0x6841, 0x694e, 0x447f, 0x6a87, 0x4486, 0x4481, 0x4480, 0x448e, 0x454a, 0x6f39, 0x4547, 0x6f8f, 0x6f2a, 0x454b, 0x4546, 0x454e, 0x857d, 0x6f2b, 0x85a5, 0x6f50, 0x4548, 0x6f6e, 0x4545, 0x6f3b, 0x6f53, 0x6f5f, 0x6f2f, 0x6f30, 0x6f38, 0x6f4c, 0x71f1, 0x45db, 0x45e7, 0x45e4, 0x7407, 0x7416, 0x45e1, 0x7414, 0x45e9, 0x73fb, 0x45e5, 0x45e0, 0x45e3, 0x73f8, 0x7410, 0x741d, 0x73ff, 0x740b, 0x7404, 0x45ea, 0x73fe, 0x75ff, 0x893a, 0x4654, 0x4658, 0x465c, 0x7723, 0x4655, 0x468b, 0x468c, 0x46a6, 0x46a5, 0x792a, 0x7aa0, 0x7a98, 0x7a9c, 0x46ff, 0x7a9e, 0x7aa6, 0x7ab5, 0x7ab0, 0x4730, 0x4740, 0x4741, 0x7cf9, 0x7cf5, 0x4786, 0x7dd2, 0x47bf, 0x47bd, 0x7f50, 0x7f4e, 0x7f4b, 0x7f52, 0x7f4d, 0x47be, 0x4819, 0x80e4, 0x481c, 0x80da, 0x481b, 0x4817, 0x4818, 0x8e51, 0x80df, 0x80e8, 0x483d, 0x486a, 0x4866, 0x8370, 0x8372, 0x4867, 0x8377, 0x4868, 0x48ad, 0x48ae, 0x85e6, 0x87aa, 0x48d6, 0x4909, 0x888c, 0x9198, 0x8889, 0x490c, 0x490a, 0x8a32, 0x493b, 0x493a, 0x9384, 0x9381, 0x8a7a, 0x936f, 0x8c9e, 0x8ca0, 0x8d70, 0x49af, 0x49aa, 0x49ab, 0x8d6e, 0x8d66, 0x49b1, 0x8d65, 0x49ac, 0x49ec, 0x8f7f, 0x8fe0, 0x4a01, 0x8fff, 0x90f6, 0x90f7, 0x90f5, 0x4a23, 0x90fc, 0x4a24, 0x4a1e, 0x90f9, 0x4a4a, 0x4a65, 0x4a6a, 0x92ca, 0x92c3, 0x92c6, 0x4a69, 0x93b8, 0x93bd, 0x4a95, 0x93bc, 0x9405, 0x94e0, 0x94e9, 0x9842, 0x94df, 0x94ec, 0x4acc, 0x94e5, 0x94de, 0xfa00, 0x4acf, 0x94f0, 0x94e3, 0x4b0f, 0x95ec, 0x4b0e, 0x4b0b, 0x4b10, 0x4b0d, 0x4b0c, 0x95f2, 0x95ef, 0x95e9, 0x96fb, 0x4b46, 0x4b48, 0x9937, 0x4b49, 0x9737, 0x98de, 0x4b91, 0x4b8e, 0x98da, 0x4bd8, 0x4bd6, 0x9a4b, 0x4bda, 0x9a49, 0x4bd7, 0x9ad5, 0x9aff, 0x4bf9, 0x9b52, 0x9b47, 0x4bfc, 0x9b48, 0x9ccc, 0x9cd0, 0x9ba9, 0x4c4a, 0x9ba7, 0x4c4e, 0x9bb3, 0x9bac, 0x9bb0, 0x9d86, 0x9da7, 0x9da3, 0x9b9c, 0x9db6, 0x9dad, 0xa013, 0x9d3c, 0x9d1c, 0x9d3a, 0x4cd3, 0x4ccd, 0x4cd1, 0xa017, 0xa022, 0x9d32, 0x9d34, 0xa049, 0xa026, 0xfa0c, 0xa03c, 0xa028, 0xa2a8, 0x9ec7, 0xa3fb, 0x4d62, 0xa432, 0xa4d6, 0xa548, 0x4d83, 0x9f3f, 0xa5c6, 0x4d92, 0x349f, 0x34a0, 0x0425, 0x0426, 0x0424, 0x0433, 0x0570, 0x3527, 0x0b90, 0x360b, 0x1095, 0x10a1, 0x1092, 0x108f, 0x109f, 0x1096, 0x1098, 0x109d, 0x10a0, 0x368d, 0x1697, 0x18eb, 0x3770, 0x1f87, 0x5eeb, 0x2432, 0x399a, 0x399f, 0x399d, 0x28d8, 0x28fb, 0x2906, 0x399b, 0x28d1, 0x61d5, 0xf8b0, 0x3a60, 0x3a64, 0x3a69, 0x3a63, 0x3a67, 0x3a62, 0x2df6, 0x2e04, 0x2dfe, 0x6502, 0x2dff, 0x2df7, 0x3018, 0x3aac, 0x3014, 0x30cd, 0x3120, 0x32de, 0x3b26, 0x3b23, 0x3b25, 0x3745, 0x3753, 0x3bf8, 0x374b, 0x3755, 0x3741, 0x3bf7, 0x3bfb, 0x3bfa, 0x375c, 0x3754, 0x3a71, 0x3ad0, 0x3cb0, 0x3caf, 0x3c53, 0x4029, 0x407e, 0x3d7e, 0x4079, 0x3d7d, 0x3d80, 0x4070, 0x406a, 0x3d7f, 0x3d86, 0x4085, 0x4064, 0x7012, 0x4078, 0x3d81, 0x4432, 0x4427, 0x442f, 0x3e24, 0x3e58, 0x3e57, 0x3ea0, 0x48ba, 0x3efe, 0x4a71, 0x4a8c, 0x3f15, 0x4b1a, 0x3f47, 0x3f46, 0x4b98, 0x4ce4, 0x3f6b, 0x3f6c, 0x7585, 0x7654, 0x4ec2, 0x3fcc, 0x4eba, 0x7655, 0x4ec8, 0x3fcb, 0x76a7, 0x76a8, 0x3ff9, 0x50b9, 0x50b8, 0x50a5, 0x52e2, 0x4078, 0x407a, 0x4075, 0x52d9, 0x4076, 0x4077, 0x52ac, 0x52dd, 0x40ea, 0x40ee, 0x40ed, 0x559d, 0x40ec, 0x790f, 0x5711, 0x5703, 0x4184, 0x4185, 0x4183, 0x58ee, 0x41bc, 0x41bd, 0x41d4, 0x5ca4, 0x5cd8, 0x5cdd, 0x5cde, 0x4255, 0x5ce7, 0x4250, 0x424c, 0x4248, 0x5cd4, 0x4253, 0x5cce, 0x4257, 0x4254, 0x424e, 0x424a, 0x4251, 0x5cf1, 0x5cd3, 0x4249, 0x424b, 0x4263, 0x5cca, 0x5ce9, 0x42a7, 0x42a6, 0x42a4, 0x5f1a, 0x5f41, 0xf968, 0x7ce4, 0x7ce5, 0x613d, 0x6140, 0x7e65, 0x7e4e, 0x4317, 0x6143, 0x4316, 0x613f, 0x613c, 0x4363, 0x6321, 0x6320, 0x7f82, 0x63c6, 0x437b, 0x437c, 0x63d1, 0x63ca, 0x648e, 0x6491, 0x43b0, 0x802d, 0x65e3, 0x6888, 0x4442, 0x6870, 0x4444, 0x699d, 0x6a9d, 0x6a91, 0x6a98, 0x6a99, 0x4488, 0x448f, 0x4553, 0x455b, 0x6fbf, 0x4559, 0x6fae, 0x6fb1, 0x6fcc, 0x7004, 0x85ca, 0x7016, 0x6fcd, 0x4554, 0x85bc, 0x6fe0, 0x6fcb, 0x6fd4, 0x6fc9, 0x71ff, 0x4599, 0x71fd, 0x7457, 0x7452, 0x7450, 0x7445, 0x744d, 0x45f1, 0x7453, 0x45ef, 0x7482, 0x7444, 0x75ce, 0x75cf, 0x75d2, 0x7602, 0x774f, 0x7758, 0x4662, 0x7743, 0x4663, 0x7752, 0x4660, 0x4661, 0x465f, 0x7749, 0x7753, 0x774d, 0x468d, 0x7884, 0x468e, 0x7883, 0x7932, 0x7ae2, 0x4709, 0x7ae4, 0x7ad3, 0x4705, 0x7ad5, 0x7add, 0x4703, 0x4706, 0x7aec, 0x7ae6, 0x7ad2, 0x7afa, 0x7ada, 0x4731, 0x7c06, 0x7c04, 0x474f, 0x7c7b, 0x7d04, 0x7d02, 0x4766, 0x8cff, 0x47c4, 0x7f60, 0x47c3, 0x47c1, 0x47c5, 0x8107, 0x8105, 0x810c, 0x4821, 0x815a, 0x481f, 0x4822, 0x811a, 0x4827, 0x4820, 0x838a, 0x486d, 0x486c, 0x486b, 0x486f, 0x4870, 0x838c, 0x8609, 0x88a6, 0x91a6, 0x88ac, 0x88a9, 0x4942, 0x8a8b, 0x93b6, 0x8a8c, 0x4944, 0x4940, 0x8a88, 0x8a89, 0x493f, 0x8a93, 0x93ab, 0x498b, 0x8d83, 0x8f4f, 0x4a25, 0x4a28, 0x9120, 0x9721, 0x9236, 0x92e2, 0x4a75, 0x4a72, 0x92ee, 0x4a6f, 0x92e7, 0x92e9, 0x4a76, 0x4a71, 0x97a7, 0x92df, 0x4a97, 0x93c7, 0x4ad7, 0x9509, 0x4ad6, 0x9501, 0x4ad8, 0x4adc, 0x4adb, 0x4ad4, 0x983e, 0x4b13, 0x4b11, 0x4b14, 0x9605, 0x960c, 0x9778, 0x975d, 0x4b51, 0x4b50, 0x4b53, 0x4b54, 0x4b52, 0x975e, 0x9760, 0x9767, 0x4b6d, 0xfa05, 0x98f4, 0x4b95, 0x4b99, 0x98f1, 0x4b9a, 0x98fa, 0x4b93, 0x4b97, 0x98f8, 0x98f9, 0x9909, 0x98fd, 0x98f7, 0x4bdc, 0x9a59, 0x4bfd, 0x9b60, 0x9b68, 0x4bfe, 0x4c00, 0x4c02, 0x4c01, 0x4c03, 0x9b6a, 0x9c14, 0x9c3e, 0x9ce4, 0x4c27, 0x4c26, 0x4c24, 0x4c4c, 0x9bbc, 0x4c50, 0x4c55, 0x4c53, 0x9bb7, 0x4c52, 0x9dd2, 0x4c57, 0x9bbe, 0x4c58, 0x4cd6, 0xa058, 0xa050, 0x4cd4, 0xa05c, 0x4cda, 0x4cd9, 0x8119, 0x9d62, 0x4cd5, 0x4ce4, 0xfa0e, 0x4cdc, 0x4d1b, 0x9e8f, 0x4d37, 0x4d36, 0x4d4b, 0x9ecb, 0x4d66, 0x4d76, 0xa4df, 0x4d7e, 0x4d7d, 0x4d7f, 0x4d84, 0x4d8b, 0xa5d9, 0x4d94, 0x34a1, 0x3511, 0x0966, 0x3610, 0x56a9, 0x10e1, 0x10ef, 0x10e8, 0x1233, 0x5913, 0x18fe, 0x3732, 0x5bf4, 0x1aef, 0x1aec, 0x1cec, 0x1f9c, 0x3820, 0x1f99, 0x2170, 0x216e, 0x389d, 0x2441, 0x61ec, 0x61ef, 0x2902, 0x2901, 0x39a5, 0x2a1b, 0x2e23, 0x2e25, 0x2e24, 0x2e26, 0x2e33, 0x2e2f, 0x308f, 0x3356, 0x3c02, 0x3bfe, 0x3c01, 0x6ad6, 0x3c03, 0x3bff, 0x3799, 0x3c04, 0xf8ed, 0x3c4a, 0x3ad9, 0x3d87, 0x40b7, 0x3d84, 0x40b6, 0x3d85, 0x7209, 0x4454, 0x4457, 0x447a, 0x3e59, 0x7379, 0x4a8e, 0x74c6, 0x4a90, 0x4ab9, 0x3f04, 0x3f49, 0x3f48, 0x4cef, 0x3f6d, 0x3fd2, 0x3fd3, 0x4ee2, 0x3fd1, 0x4ed6, 0x4ed8, 0x4eda, 0x4ede, 0x3fe7, 0x400a, 0x77c3, 0x5308, 0x5304, 0x530a, 0x530b, 0x5302, 0x40f0, 0x55aa, 0x55c1, 0x791f, 0x58d7, 0x58d9, 0x7a65, 0x58de, 0x58da, 0x41be, 0x41bf, 0x5a2a, 0x7ac6, 0x7c3a, 0x5d31, 0x7c36, 0x5d2b, 0x5d2c, 0x5d29, 0x5d2e, 0x425e, 0x5d27, 0x5d28, 0x425b, 0x5d5f, 0x5d30, 0x5d24, 0x7ceb, 0x42ab, 0x5f3a, 0x42ac, 0x5f39, 0x5f40, 0x6180, 0x6184, 0x431f, 0x431d, 0x6175, 0x6176, 0x431c, 0x617c, 0x431e, 0x6178, 0x619b, 0x617e, 0x625a, 0x4364, 0x632c, 0x7f84, 0x649c, 0x6847, 0x688a, 0x4448, 0x4447, 0x6927, 0x704a, 0x455e, 0x4561, 0x7027, 0x85e0, 0x85f3, 0x702e, 0x7026, 0x7208, 0x45f7, 0x74bd, 0x7496, 0x45f4, 0x45f8, 0x881e, 0x74be, 0x748e, 0x7774, 0x4664, 0x7780, 0x4692, 0x468f, 0x4690, 0x89b4, 0x4693, 0x46a8, 0x793c, 0x793d, 0x46a9, 0x793a, 0x7942, 0x89f9, 0x7b24, 0x7b06, 0x8b44, 0x470e, 0x7b15, 0x470f, 0x7b02, 0x7b0c, 0x470b, 0x7b08, 0x7b0a, 0x7b05, 0x7b1c, 0x4710, 0x4751, 0x7c82, 0x4750, 0x7c86, 0x4763, 0x7e03, 0x7f7b, 0x47c7, 0x7f7a, 0x8e71, 0x4824, 0x4826, 0x8e6e, 0x8180, 0x8e79, 0x8158, 0x8ec4, 0x4874, 0x4873, 0x4872, 0x83aa, 0x83ab, 0x8436, 0x844a, 0x48b1, 0x908c, 0x87d6, 0x490e, 0x4911, 0x4910, 0x490f, 0x4912, 0x4949, 0x93c9, 0x494f, 0x494d, 0x8b03, 0x8acf, 0x4955, 0x8d9f, 0x8da2, 0x902a, 0x902f, 0x9144, 0x9140, 0x4a2c, 0x4a2b, 0x9311, 0x930f, 0x4a79, 0x930d, 0x9307, 0x9303, 0x4a7a, 0x97b0, 0x4a99, 0x4a9a, 0x9435, 0x4aae, 0x4aaf, 0x9504, 0x4ae4, 0x4ae1, 0x4ade, 0x4ae6, 0x4adf, 0x9526, 0x4ae7, 0x4ae2, 0x4ae0, 0x951e, 0x4ae5, 0x985a, 0x960e, 0x4b18, 0x961d, 0x961e, 0x961f, 0x4b56, 0x9788, 0x9946, 0x978d, 0x9791, 0x9780, 0x4b6e, 0x9854, 0x9855, 0x4b9d, 0x4ba0, 0x4b9c, 0x9925, 0x991a, 0x4ba1, 0x4ba2, 0x4b9f, 0x4bdf, 0x4bde, 0x9ac3, 0x4bea, 0x9b88, 0x4c06, 0x9b7a, 0x4c04, 0x9b0f, 0x9b80, 0x9d1e, 0x9dfc, 0x9e25, 0x4c5f, 0x9bf4, 0x9bfa, 0x4c5c, 0x9e0b, 0x4c5e, 0x9e06, 0x9e04, 0x9bdd, 0x4c59, 0x9df9, 0x9e00, 0x4c64, 0x4c5d, 0x4c62, 0x9e02, 0x4c65, 0x9e07, 0x9bed, 0x4c5b, 0x9bef, 0xa0b5, 0x4cdd, 0xa087, 0x4cdf, 0xa093, 0xfa0f, 0x4ce2, 0xa0be, 0xa266, 0x4d27, 0xa2c7, 0xa2cf, 0x9e96, 0x4d3a, 0x4d3c, 0xa33d, 0x4d39, 0xa33c, 0xa347, 0x4d3d, 0x4d3b, 0x9eb3, 0x4d4c, 0xa3c3, 0x4d68, 0x9ee2, 0xa51b, 0x4d80, 0x4d85, 0xa5c9, 0x4d95, 0xa5dd, 0x4d96, 0xa693, 0x9f8f, 0x043d, 0x34a4, 0x3512, 0x56b1, 0x3625, 0x14e6, 0x5b41, 0x3737, 0x1af7, 0x1fb0, 0x1fae, ERROR, 0x3868, 0x3867, 0x389e, 0x259f, 0x259e, 0x2930, 0x39aa, 0x294f, 0x39a9, 0x39a4, 0x2927, 0x2951, 0x3a71, 0x3a6f, 0x2e51, 0x2e54, 0x2e56, 0x3027, 0x3aad, 0x3024, 0x6af6, 0x3c0c, 0x6af2, 0x3c0b, 0x37ec, 0x37c4, 0x3c0f, 0x3c79, 0x40f8, 0x40f6, 0x40f7, 0x40ed, 0x3d8d, 0x3d8f, 0x40f4, 0x40ef, 0x3d8e, 0x3e0c, 0x447f, 0x44a2, 0x447e, 0x3ea6, 0x48c5, 0x3ea3, 0x3ea4, 0x3ea5, 0x7588, 0x3f6e, 0x4ef1, 0x4ef2, 0x3ffa, 0x502f, 0x407c, 0x407e, 0x407b, 0x407d, 0x5323, 0x5329, 0x408d, 0x40f4, 0x40f3, 0x571b, 0x58eb, 0x4189, 0x58ea, 0x5a33, 0x41c0, 0x5d63, 0x4265, 0x5d92, 0x5d65, 0x42ad, 0x4325, 0x61a0, 0xf970, 0x625e, 0x43c9, 0x68aa, 0x444a, 0x68a9, 0x8267, 0x4489, 0x709c, 0x4566, 0x4570, 0x7092, 0x456d, 0x4569, 0x4567, 0x7086, 0x4572, 0x860e, 0x456e, 0x7083, 0x459c, 0x45fc, 0x45fd, 0x4604, 0x45ff, 0xf9c2, 0x45fe, 0x4600, 0x74ce, 0x4666, 0x4669, 0x7793, 0x46aa, 0x46ab, 0x4717, 0x7b2e, 0x7b27, 0x7b28, 0x4715, 0x8b5e, 0x4712, 0x8d0e, 0x7e18, 0x7e16, 0x7f8d, 0x47ca, 0x7f8e, 0x47c9, 0x47cb, 0x7f90, 0x7f8f, 0x8181, 0x4829, 0x4828, 0x818a, 0x818c, 0x828d, 0x4840, 0x4875, 0x4876, 0x83b2, 0x4888, 0x87d9, 0x91b6, 0x4957, 0x9401, 0x8b0d, 0x495f, 0x8b13, 0x941d, 0x4958, 0x495b, 0x8b1b, 0x942f, 0x8dac, 0x49b3, 0x8db3, 0x49ef, 0x915e, 0x4a30, 0x9160, 0x9168, 0x9163, 0x9169, 0x9167, 0x4a41, 0x4a4b, 0x9328, 0x4a7d, 0x932e, 0x9330, 0x4a7c, 0x9326, 0x9331, 0x9341, 0x97e0, 0x93da, 0x97db, 0xf9fa, 0x940b, 0x9861, 0x9534, 0x9533, 0x4ae8, 0x4aea, 0x4ae9, 0x9539, 0x953b, 0x9540, 0x9630, 0x4b1b, 0x9632, 0x9637, 0x4b55, 0x994a, 0x4b59, 0x4b58, 0x9781, 0x979f, 0x97a7, 0x4ba4, 0x4ba3, 0x9944, 0x9947, 0x9948, 0x993d, 0x9a33, 0x4ba7, 0x9949, 0x4be0, 0x9a80, 0x9ba0, 0x9b9d, 0x4c08, 0x4c0a, 0x4c09, 0x9b9c, 0x9c47, 0x9d07, 0x4c71, 0x9c0f, 0x4c6c, 0x9e49, 0x9c11, 0x9e44, 0x9c03, 0x9c01, 0x4c6e, 0x9edf, 0x9c16, 0x9e4c, ERROR, 0x9e4f, 0x4ce0, 0x4cee, 0xa0c1, 0x4ceb, 0xa0b9, 0xa0cb, 0xa0cf, 0xa0c4, 0x9d93, 0x4cea, 0x4cef, 0x4ce7, 0xa0ca, 0xa0c3, 0xa2d0, 0xa351, 0x4d48, 0x4d49, 0xa3a8, 0xa3c7, 0xa3c6, 0x4d4d, 0xa3ca, 0xa402, 0x4d55, 0xa45d, 0xa45a, 0x4d6a, 0x4d6c, 0xa459, 0x4d6b, 0xa4cc, 0xa51c, 0xa5cc, 0x4d98, 0x4d99, 0x4d97, 0xa5e8, 0xa5ec, 0xa5ea, 0xa6ad, 0xa6b0, 0x045f, 0x0458, 0x0457, 0x535b, 0x0b93, 0x3616, 0x113b, 0x56bf, 0x1134, 0x14f2, 0x3739, 0x1afd, 0x1c1d, 0x3825, 0x5dce, 0x2304, 0x2448, 0x2958, 0x2e4f, 0x3a74, 0x2e6e, 0x2e72, 0x3aae, 0x302e, 0x37fc, 0x37f4, 0x3c36, 0x410e, 0x3d92, 0x3d94, 0x4114, 0x3d95, 0x4119, 0x3e0d, 0x44a6, 0x3e25, 0x4ac9, 0x4ac0, 0x4acc, 0x4b1b, 0x4baa, 0x4ba8, 0x4f03, 0x3fd5, 0x3fd6, 0x76ac, 0x3fe8, 0x5035, 0x407f, 0x77d2, 0x40f5, 0x40f6, 0x40f7, 0x55d9, 0x4124, 0x418d, 0x418a, 0x5a3f, 0x5a3d, 0x426c, 0x4266, 0x426a, 0x5d8b, 0x4267, 0x426d, 0x4268, 0x7c52, 0x5d68, 0x5d8a, 0x5f58, 0x5f57, 0x61ce, 0x61bc, 0x61c0, 0x61c1, 0x61bf, 0x61ab, 0x625f, 0x4365, 0x64a6, 0x439a, 0x6529, 0x43b1, 0x444b, 0x444d, 0x444c, 0x444e, 0x68b8, 0x4573, 0x4575, 0x70dd, 0x70d6, 0xf9b1, 0x70d5, 0x70e7, 0x70d8, 0x74ec, 0x4603, 0x7500, 0x7507, 0x74fd, 0x74f1, 0x74ff, 0x77aa, 0x77b0, 0x7b48, 0x471e, 0x7b53, 0x8b73, 0x7b4d, 0x4719, 0x471c, 0x471a, 0x471d, 0x8b76, 0x7b43, 0x7b50, 0x4743, 0x4752, 0x7c8c, 0x7e27, 0x4795, 0x7f99, 0x47cc, 0x81b1, 0x482b, 0x81b0, 0x81aa, 0x81ac, 0x482a, 0x8ec7, 0x4877, 0x83c8, 0x83ca, 0x8642, 0x87e0, 0x88e7, 0x88e8, 0x88e6, 0x4913, 0x4914, 0x9434, 0x8b5b, 0x8b56, 0x495d, 0x8b5a, 0x4960, 0x943e, 0x4962, 0x8cb8, 0x8dc5, 0x49b2, 0x49f0, 0x9048, 0x917d, 0x917c, 0x9181, 0x9182, 0x9162, 0x4a4c, 0x9345, 0x4a82, 0x97bc, 0x4a81, 0x4a9b, 0x93e3, 0x4aa4, 0x4aee, 0x4aec, 0x9550, 0x4aed, 0x954f, 0x4af0, 0x4aef, 0x9639, 0x4b1d, 0x963a, 0x4b60, 0x4b5e, 0x4b5d, 0x97c1, 0x994e, 0x996e, 0x4bb1, 0x4bab, 0x4bac, 0x4bad, 0x9971, 0x4bae, 0x9a8c, 0x9a89, 0x4be2, 0x9ae5, 0x9bb3, 0x9bb6, 0x9bb4, 0x9c4d, 0x9b39, 0x9d13, 0x9e78, 0x9c2a, 0x4c7b, 0x9c26, 0x4c78, 0x4c75, 0x9c27, 0x9e72, 0x4cf2, 0x4cf4, 0x4cf3, 0x9dc0, 0x9dc9, 0xa275, 0xa2da, 0xa2d7, 0x4d3f, 0x4d3e, 0x4d40, 0x4d4e, 0x4d57, 0x4d59, 0x4d58, 0x4d56, 0xa469, 0xa467, 0x4d6e, 0xa466, 0xa46f, 0xa471, 0x9eec, 0xa4cf, 0xa523, 0x4d81, 0x4d86, 0xa5a5, 0x4d8f, 0xa5fe, 0xa5fb, 0xa5fd, 0x9f68, 0x4d9b, 0x4db1, 0x4db3, 0x116d, 0x373a, 0x1b05, 0x1c20, 0x3827, 0x1fc8, 0x1fc9, 0x386a, 0x39ac, 0x3127, 0x3c18, 0x381e, 0x3936, 0x3c4c, 0x413d, 0x3d96, 0x48d7, 0x3f4a, 0x4bad, 0x4d00, 0x4081, 0x533a, 0x4083, 0x40f9, 0x40f8, 0x5726, 0x418e, 0x418f, 0x41c1, 0x5db7, 0x5db6, 0x5dc0, 0x4270, 0x5d9b, 0x4271, 0x61d8, 0x432a, 0x432d, 0x437d, 0x8032, 0x8031, 0x68c0, 0x444f, 0x68bf, 0x6abf, 0x4490, 0x7120, 0x70d0, 0x710e, 0x4579, 0x711d, 0x711e, 0x7115, 0x7114, 0x751e, 0x752c, 0x4605, 0x77b9, 0x77b8, 0x77b6, 0x789e, 0x789c, 0x794d, 0x89fd, 0x7b6e, 0x7b60, 0x4721, 0x7b64, 0x7b62, 0x61e5, 0x4732, 0x7fa3, 0x47cd, 0x47cf, 0x83d2, 0x83d5, 0x908e, 0x4916, 0x4915, 0x49b5, 0x4a08, 0x9055, 0x4a32, 0x9193, 0x4a33, 0x4a34, 0x4a3c, 0x9356, 0x97c2, 0x93e9, 0x4a9c, 0x9445, 0x4af4, 0x4af2, 0x967c, 0x4b62, 0x97d3, 0x4b61, 0x4b64, 0x4bb5, 0x9a4b, 0x4bb4, 0x998e, 0x9a97, 0x4be3, 0x9a9b, 0x9a99, 0x9b1c, 0x4c0e, 0x9bcf, 0x9b1b, 0x9c59, 0x4c2c, 0x4c2b, 0x9d20, 0x9d23, 0x9d2a, 0x4c85, 0x4c81, 0x4c7e, 0x4c83, 0x4c80, 0x9eb0, 0x9c42, 0xa12f, 0x9dd4, 0x4cfb, 0x4cf7, 0xa132, 0xa143, 0xa13f, 0xa139, 0x4cf8, 0xa130, 0xa2dd, 0xa3da, 0xa3db, 0x4d5a, 0xa484, 0xa47f, 0xa472, 0xa480, 0xa4ee, 0x4d78, 0xa52a, 0xa522, 0xa571, 0xa5cd, 0x4d9d, 0x4d9c, 0xa60f, 0xa618, 0x046a, 0x34a9, 0x34bf, 0x56d0, 0x56cf, 0x1b0c, 0x5dda, 0x25a6, 0x3a77, 0x3a76, 0x3037, 0x3abb, 0x66ea, 0x3ae2, 0x3d9b, 0x44bc, 0x3e0f, 0x3e5b, 0x4ad5, 0x3f4c, 0x3f6f, 0x3fd9, 0x4f12, 0x4082, 0x534b, 0x5341, 0x53a1, 0x55ec, 0x4274, 0x4272, 0x5dd4, 0x5dd8, 0x5dd9, 0x4273, 0x5dda, 0x5f6c, 0x5f6d, 0x42b1, 0x432e, 0x61e7, 0x61eb, 0x61ec, 0x6262, 0x434e, 0x652b, 0x660d, 0x68cd, 0x6ac3, 0x713f, 0x713c, 0x713e, 0x713d, 0x713a, 0x7138, 0x7544, 0x7545, 0x460b, 0x7548, 0x7550, 0x466c, 0x8b89, 0x7b78, 0x7b79, 0x478b, 0x7e3e, 0x47d0, 0x482d, 0x8654, 0x48e4, 0x4971, 0x8bb9, 0x9458, 0x496f, 0x905f, 0x4a87, 0x4aa5, 0x9572, 0x9575, 0x4b1e, 0x4b65, 0x4bb9, 0x4bb7, 0x4bb8, 0x4be4, 0x9aa3, 0x9aa5, 0x9bdc, 0x9bdd, 0x9c5a, 0x4c8c, 0x4c89, 0x4c8a, 0x9edb, 0x9edc, 0x4c8b, 0xa1ab, 0xa184, 0xa176, 0x4d01, 0x4cfe, 0x9de7, 0x4d03, 0x4d06, 0xa183, 0x9dea, 0x9df1, 0xa27f, 0x4d1d, 0x4d43, 0xa373, 0xa3ad, 0xa3b0, 0x4d4f, 0xa40f, 0xa40c, 0x4d5b, 0x4d70, 0xa579, 0x4d88, 0xa577, 0xa57a, 0x4d89, 0x9f44, 0xa632, 0xa627, 0xa62a, 0xa62c, 0x9f6d, 0xa628, 0xa629, 0xa638, 0x082f, 0x117b, 0x1b0d, 0x5dd9, 0x1fd6, 0x1fd5, 0x2ea1, 0x384c, 0x3d9e, 0x3d9f, 0x3ea7, 0x3f4b, 0x3fdb, 0x3fda, 0x4fc0, 0x77d6, 0x408e, 0x4276, 0x5df4, 0x4330, 0x432f, 0x61f0, 0x4366, 0x633f, 0x457e, 0x755d, 0x7572, 0x7562, 0x883a, 0x7566, 0x8975, 0x466f, 0x7b88, 0x47d1, 0x482f, 0x81e8, 0x81e4, 0x48b2, 0x4918, 0x4917, 0x88ff, 0x4976, 0x91af, 0x91ae, 0x4a4f, 0x4a89, 0x93f2, 0x9448, 0x9581, 0x957e, 0x4af5, 0x4b1f, 0x9652, 0x97ef, 0x9a5d, 0x4be5, 0x9aad, 0x9be6, 0x4c10, 0x9bed, 0x4c0f, 0x9be9, 0x9c61, 0x9c60, 0x9d33, 0x4c2f, 0x4c30, 0x9c64, 0x9f0b, 0x9f08, 0x4c93, 0x4c94, 0x9f07, 0x4d07, 0x4d09, 0x4d08, 0xa1ca, 0x4d0b, 0xa1c6, 0x9e0a, 0xa284, 0xa2eb, 0xa37d, 0x4d50, 0x4d71, 0xa49b, 0xa4a2, 0xa4a1, 0xa4a0, 0xa49c, 0x4d7b, 0x4d7c, 0xa580, 0x9f73, 0xa640, 0x4da1, 0xa639, 0xa63c, 0x4da0, 0x4da2, 0x08ca, 0x361b, 0x1189, 0x3682, 0x303c, 0x3940, 0x4163, 0x4169, 0x3fe9, 0x5353, 0x4084, 0x77e1, 0x5917, 0x591a, 0x5e00, 0x42b3, 0x4334, 0x4333, 0x4580, 0x756f, 0x78ab, 0x46ad, 0x7b91, 0x4744, 0x4755, 0x7fb1, 0x47d2, 0x81ef, 0x8df1, 0x8df2, 0x91b7, 0x91b5, 0x4a8a, 0x9586, 0x965a, 0x4b67, 0x99c6, 0x99cb, 0x4be6, 0x9ab2, 0x4c13, 0x9bf3, 0x9b2d, 0x9f27, 0x4c97, 0x9e0c, 0xa1d5, 0xa1d8, 0x4d0c, 0xa1ec, 0xa287, 0xa2f2, 0x4d46, 0x4d5c, 0x4d74, 0x4d72, 0xa4ad, 0xa4b0, 0xa4fd, 0x9f1f, 0xa587, 0xa64a, 0x4da4, 0x4da3, 0xa64e, 0xa649, 0xa651, 0xa64d, 0x4db4, 0x0472, 0x3536, 0x1b16, 0x386d, 0x3941, 0x3cb2, 0x4171, 0x4174, 0x3f16, 0x7c70, 0x4277, 0x5f7c, 0x457f, 0x718a, 0x7956, 0x487d, 0x9479, 0x8bfa, 0x974a, 0x4a8c, 0x965b, 0x4b68, 0x4bbe, 0x4c15, 0xa1f5, 0xa1f0, 0xa2f3, 0xa37f, 0xa413, 0x4d75, 0x4da5, 0x1b19, 0x2985, 0x2eb0, 0x4177, 0x55ff, 0x4278, 0x4335, 0x7e9d, 0x4582, 0x7187, 0x4583, 0x718b, 0x4671, 0x7b9e, 0x487e, 0x4a8e, 0x958f, 0x9960, 0x4b69, 0x9839, 0x99d4, 0x9af1, 0x9c02, 0x9c6b, 0x9d40, 0x4c9a, 0x4c9b, 0xa210, 0xa4be, 0xa4b9, 0x4d90, 0xa664, 0x9f9e, 0x4ae9, 0x7190, 0x4586, 0x4585, 0x721c, 0x460e, 0x7592, 0x4695, 0x7ba3, 0x4919, 0x91c9, 0x4bc0, 0x99d8, 0x9d44, 0xa224, 0x9ef8, 0x9f3a, 0x9f7d, 0xa670, 0xa6d3, 0x400d, 0x4c16, 0xa4c3, 0x4da9, 0x4daa, 0x4085, 0x5e21, 0x6aca, 0x759c, 0x9c73, 0xa386, 0xa5c1, 0x9c09, 0x9f96, 0xa6d5, 0x4bc2, 0x4c31, 0x4d11, 0x4dab, 0x4c9c, 0x91d4, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x00d1, 0x00cb, 0x00c9, 0x010c, 0x0000, 0x0087, 0x010d, 0x010f, 0xf81d, 0x2398, 0x00d2, 0x0111, 0x007e, 0x0ad3, 0x1552, 0x1cfe, 0x25a9, 0x3942, 0x0009, 0x00d6, 0x04dd, 0x04dc, 0x0502, 0x0573, 0x0676, 0x06a7, 0x06a8, 0x0833, 0x08cc, 0x0a0d, 0x0a2c, 0x0b1b, 0x355a, 0x0b1d, 0x0b99, 0x123e, 0x1d2d, 0x1d2f, 0x2399, 0x33b3, 0x39b6, 0x3b1b, 0x44ef, 0x48e9, 0x0014, 0x0094, 0x00e1, 0x0506, 0x054a, 0x0544, 0x0631, 0x067a, 0x06ad, 0x06ae, 0x06b1, 0x0838, 0x0837, 0x097d, 0x097e, 0x0a2d, 0x0a32, 0x0b23, 0x0b26, 0xf83a, 0x0ba0, 0x16a8, 0x193f, 0x19bc, 0x1bc4, 0x1d3b, 0x2019, 0x2018, 0x21b3, 0x23aa, 0x24be, 0x25ac, 0x2a25, 0x2a66, 0x2a6b, 0x3943, 0x39b5, 0x3aec, 0x3c76, 0x3cbc, 0x4614, 0x15dc, 0x471c, 0x471d, 0x64d0, 0x6612, 0x6af3, 0x8669, 0x49b9, 0x8e11, 0x8e15, 0x8e10, 0x8e13, 0x00a4, 0x00a5, 0x01d0, 0x01ba, 0x01cb, 0x057b, 0x0686, 0x06bb, 0x06ba, 0x06c3, 0x06b9, 0x06c0, 0x34de, 0x0839, 0x083b, 0x0841, 0x08d1, 0x08cf, 0x08d2, 0x092e, 0x096e, 0x098c, 0x0988, 0x0a35, 0x3543, 0x0a3a, 0x0a3b, 0x0a38, 0x0a39, 0x0b2e, 0x0b2c, 0x0bc8, 0x0bb5, 0x0bad, 0x0bb0, 0x0bab, 0x11b3, 0x11a9, 0x16bb, 0x16b9, 0x1b5a, 0x1bcd, 0x1c2b, 0x1d05, 0x37ac, 0x37aa, 0x1d51, 0x1d4b, 0x1fea, 0x1fed, 0x2036, 0x2062, 0x2056, 0x2055, 0x2064, 0x2058, 0x5e07, 0x21da, 0x21d8, 0x23ad, 0x23ab, 0x24c0, 0x24c3, 0x25b3, 0x25b7, 0x25ba, 0x5fcb, 0x38fe, 0x25c7, 0x25b5, 0x298e, 0x2a73, 0x2a6c, 0x2a74, 0xf8b4, 0x2a72, 0x2a71, 0x2a82, 0x2a70, 0x313f, 0x33ba, 0x33b8, 0x39b7, 0x4723, 0x4721, 0x472b, 0x4726, 0x4722, 0x4d25, 0x50e4, 0x5415, 0x64e4, 0x6633, 0x662a, 0x6632, 0x6629, 0x6afb, 0x795b, 0x795c, 0x7c28, 0x866f, 0x866d, 0x866b, 0x866e, 0x8e16, 0x0022, 0x0116, 0x0148, 0x01d8, 0x0200, 0x3441, 0x0480, 0x04e4, 0x34b4, 0x04e7, 0x050c, 0x0553, 0x05b7, 0x0ae8, 0x06d1, 0x06e5, 0x06d8, 0x06d6, 0x06da, 0x06d9, 0x06d5, 0x06e6, 0x06d4, 0x06d3, 0x0844, 0x08d6, 0x08d7, 0x0913, ERROR, 0x0970, 0x0992, 0x09db, 0x09da, 0x0a41, 0x0a43, 0x0b33, 0x0bf6, 0x0bd4, 0x0bdd, 0x0bd0, 0x0c04, 0x0bd9, 0x0bdb, 0x0c05, 0x0bd3, 0x0be1, 0x1280, 0x1277, 0x1281, 0x1282, 0x1283, 0xf85c, 0x1561, 0x1560, 0x16d8, 0x16d6, 0x16d7, 0x4605, 0x194d, 0x1948, 0x1bd6, 0x1bcf, 0x1bd9, 0x1bd8, 0x1c3d, 0x37b3, 0x1d54, 0x1d5b, 0x1d5c, 0x37b4, 0x1d59, 0x1d58, 0x1d5a, 0x1d55, 0x1d56, 0x1d82, 0x1ff0, 0x201c, 0x206a, 0x2069, 0x2071, 0x2067, 0x206c, 0x206e, 0x2079, 0x218b, 0x21b8, 0x21e7, 0x21e8, 0x21e4, 0x21e6, 0x21e5, 0x21f0, 0x2383, 0x23b7, 0x23bb, 0x23b9, 0x23c5, 0x2453, 0x24c4, 0x24c6, 0x24cb, 0x25c8, 0xf89f, 0x25c9, 0x25db, 0x2994, 0x2a95, 0x2a88, 0x2a8d, 0x2eec, 0x2eee, 0x2ef1, 0x312e, 0x3149, 0x335f, 0x33d1, 0x33cb, 0x3885, 0x3c1d, 0x394a, 0x3947, 0x394b, 0x39bb, 0x39c4, 0x3c7c, 0x3b02, 0x3c82, 0x3c91, 0x3c8f, 0x3c92, 0x418f, 0x4191, 0x41b4, 0x4192, 0x44f4, 0x45aa, 0x4735, 0x4737, 0x473d, 0x473c, 0x472f, 0x4730, 0x48f8, 0x48ef, 0x4b26, 0x3f55, 0x4d26, 0x4d27, 0x4f41, 0x4fc6, 0x4fc7, 0x50eb, 0x50e8, 0x50ea, 0x541a, 0x5419, 0x4126, 0x5923, 0x5924, 0x5e25, 0x6635, 0x6634, 0x6a07, 0x721d, 0x77e1, 0x7bab, 0x8460, 0x8677, 0x867d, 0x49bc, 0x8e1e, 0x8e1a, 0x8e1d, 0x006b, 0x012d, 0x014c, 0x022a, 0x344a, 0x0215, 0x022c, 0x0206, 0x0208, 0x020a, 0x344e, 0x0556, 0x0584, 0x34c9, 0x05c6, 0x06f5, 0x0709, 0x06f8, 0x06e8, 0x06fb, 0x06e9, 0x06f6, 0x52b7, 0x52b8, 0x0852, 0x52b6, 0x52ba, 0x0854, 0x0851, 0x0939, 0x093a, 0x0998, 0x0a4e, 0x357b, 0x0c36, 0x0c0c, 0x0c10, 0x0c32, 0x0c11, 0x0c18, 0x0c1c, 0x0c1a, 0x0c19, 0x0c0b, 0x0c0f, 0x0c1d, 0x0c21, 0x0c13, 0x0c1b, 0x0c15, 0x3620, 0x11d1, 0x11c8, 0x128d, 0x12b5, 0x3689, 0x3695, 0x15f8, 0x16e0, 0x16e1, 0x36be, 0x16de, 0x16fe, 0x16dc, 0x1701, 0x16fd, 0x1700, 0x19d7, 0x19d6, 0x19d9, 0x1b65, 0x1bd2, 0x1bdc, 0x1be1, 0x1bde, 0x1c42, 0x1c4b, 0x37c3, 0x1d8e, 0x1d91, 0x1d8b, 0x1d90, 0x1d88, 0x1d89, 0x1d84, 0x1daa, 0x208d, 0x208f, 0x207d, 0x207f, 0x207b, 0x2080, 0x207e, 0x2083, 0x2081, 0x2086, 0x208a, 0x21bd, 0x21be, 0x3877, 0x21f4, 0x21f3, 0x2202, 0x21f6, 0x21f5, 0x21f2, 0x2204, 0x233d, 0x23c6, 0x2489, 0x24d4, 0x24d6, 0x24d2, 0x25fa, 0x2606, 0x260c, 0x260a, 0x260f, 0x2a2f, 0x39d4, 0x2ab7, 0x2abe, 0x2abc, 0x2ae2, 0x2f06, 0x2ef7, 0x2f07, 0x2ef6, 0x3b35, 0x315f, 0x3165, 0x3164, 0x3161, 0x315a, 0x315d, 0xf8d7, 0x33d7, 0x33d5, 0x33de, 0x33e1, 0x33e0, 0x33d9, 0x3b4c, 0x33da, 0x33df, 0x33f6, 0x3403, 0x3c20, 0x3893, 0x388b, 0x3891, 0x3892, 0x388a, 0x3889, 0x388f, 0x3956, 0x3959, 0x39ca, 0x39cc, 0x3c5b, 0x39d0, 0x39cd, 0x39d6, 0x39cb, 0x3a83, 0x3a82, 0x3b06, 0x3b2a, 0x3b2c, 0x3b2b, 0x3b29, 0x3cbd, 0x3cb3, 0x3cbe, 0x3cc0, 0x3cb5, 0x3cb6, 0x419d, 0x419f, 0x4620, 0x3e2d, 0x461e, 0x461c, 0x4632, 0x461f, 0x462b, 0x4621, 0x4626, 0x4624, 0x461d, 0x4627, 0x475b, 0x4759, 0x4780, 0x4755, 0x4750, 0x475a, 0x4756, 0x4763, 0x4752, 0x4758, 0x3e63, 0x4739, 0x48f9, 0x4b28, 0x3f18, 0x4bbc, 0x4bd6, 0x4c05, 0x4c20, 0x3f74, 0x4d33, 0x4f46, 0x4f42, 0x4f43, 0x4f47, 0x4fcb, 0x5042, 0x5045, 0x50fd, 0x50f4, 0x50f9, 0x50fa, 0x535e, 0x541d, 0x4128, 0x5758, 0x5755, 0x5a57, 0x5a58, 0x5ad9, 0x5adc, 0x5adb, 0x5e27, 0x5f85, 0x5f87, 0x5f8a, 0x628b, 0x634f, 0x6530, 0x652f, 0x6668, 0x6649, 0x43da, 0x6648, 0x663f, 0x664b, 0x665c, 0x6646, 0x6640, 0x6a0d, 0x6b1b, 0x6b1d, 0x6b17, 0x44a4, 0x6b22, 0x75a7, 0x7608, 0x7806, 0x847d, 0x488e, 0x8463, 0x8464, 0x847f, 0x846b, 0x847c, 0x8468, 0x8465, 0x846a, 0x8698, 0x8699, 0x86ae, 0x8e2b, 0x8e2d, 0x8e31, 0x8e2e, 0x8e2f, 0x006d, 0x0131, 0x022d, 0x0239, 0x0238, 0x345b, 0x023a, 0x0235, 0x0262, 0x04ea, 0x04eb, 0x0515, 0x05cc, 0x05c8, 0x05cd, 0x05db, 0x05cb, 0x0711, 0x0726, 0x0862, 0x085e, 0x0861, 0x0941, 0x093f, 0x0975, 0x3965, 0x0b49, 0x09eb, 0x0a1a, 0x0a57, 0x0c6b, 0x0ca9, 0x0c54, 0x0c62, 0x0caa, 0x0c58, 0x0c72, 0x0c63, 0x0c73, 0x0c8b, 0x0c8c, 0x0c5c, 0x0c51, 0x0c16, 0x0c60, 0x0c61, 0x0c5e, 0x0c5d, 0x0c64, 0x0c53, 0x0c5f, 0x0c5b, 0x0c6e, 0x0c55, 0x0c52, 0x0c68, 0x11d2, 0x11d6, 0x11d3, 0x12b8, 0x12bb, 0x12eb, 0x12e8, 0x12b6, 0x12ea, 0x12e7, 0x12e9, 0x1591, 0x1610, 0x160e, 0x160f, 0x170b, 0x1703, 0x172b, 0x1709, 0x1728, 0x172c, 0x1725, 0x1727, 0x170f, 0x19e9, 0x19ec, 0x3753, 0x1b27, 0x1b73, 0x1be2, 0x1be6, 0xf876, 0x1c61, 0x1c51, 0x1d12, 0x1d0e, 0x1dad, 0x1daf, 0x1db1, 0x1dd3, 0x2094, 0x2092, 0x2090, 0x209d, 0x2093, 0x2095, 0x2098, 0x2097, 0x3880, 0xf88a, 0x2207, 0x220b, 0x2208, 0x23d9, 0x23d5, 0x24d7, 0x24df, 0x38dd, 0x24de, 0x24e3, 0x24e2, 0x38de, 0x2647, 0x3922, 0x263d, 0x2638, 0x2a44, 0x2a3a, 0x2ab8, 0x2b2a, 0x2b00, 0x2af3, 0x2af2, 0x2aeb, 0x2afa, 0x2aed, 0x2aec, 0x2aff, 0x2afb, 0x6306, 0x2b4e, 0x2aef, 0x2af7, 0x2f10, 0x2f11, 0x2f0c, 0x2f0b, 0x30dd, 0x3130, 0x3adb, 0x317a, 0x3177, 0x3328, 0x3327, 0x3365, 0x340e, 0x340b, 0x3441, 0x3413, 0x340f, 0x3412, 0x3430, 0x38a0, 0x38a3, 0x389e, 0x3897, 0x38a1, 0x389d, 0x389b, 0x3963, 0x39e3, 0x39e4, 0x39e6, 0x39e7, 0x39dd, 0x6b85, 0x39ec, 0x39e5, 0x39f1, 0x3b3b, 0x3b39, 0x3b3a, 0x3b3c, 0x3b3d, 0x3b47, 0x3b3f, 0x3b44, 0x3c48, 0x3c49, 0x3c60, 0x3ce3, 0x3ce9, 0x3cf0, 0x3cda, 0x3cdb, 0x3cf2, 0x3ced, 0x3cec, 0x3ce6, 0x3d16, 0x3cd7, 0x41bc, 0x41be, 0x41c0, 0x41e0, 0x4500, 0x4502, 0x44fe, 0x455e, 0x45b3, 0x45b7, 0x463a, 0x4639, 0x463e, 0x4638, 0x463d, 0x464f, 0x476e, 0x475f, 0x4781, 0x4782, 0x4771, 0x477b, 0x4779, 0x4777, 0x4773, 0x476f, 0x4797, 0x477e, 0x48fc, 0x4911, 0x4932, 0x4931, 0x4910, 0x4aec, 0x4aeb, 0x4b2c, 0x4b2d, 0x4bda, 0x4c2e, 0x4c2c, 0x4c2a, 0x4c33, 0x4c4b, 0x4d18, 0x4d42, 0x4d3b, 0x4d3f, 0x4d41, 0x4d43, 0x4d3c, 0x4f4c, 0x4f4a, 0x4f49, 0x4f56, 0x4fcf, 0x5047, 0x5048, 0x5046, 0x511b, 0x5111, 0x5114, 0x511d, 0x5117, 0x511e, 0x510b, 0x511c, 0x5112, 0x5116, 0x510d, 0x5115, 0x5113, 0x5118, 0x401a, 0x53ac, 0x5444, 0x542c, 0x5445, 0x5766, 0x576e, 0x5765, 0x5768, 0x5784, 0x5938, 0x593b, 0x593a, 0x593f, 0x5adf, 0x5add, 0x5ade, 0x5ae2, 0x41d6, 0x5e2c, 0x5e2f, 0x5f8f, 0x5f90, 0x5f8c, 0x5f93, 0x6225, 0x6288, 0x62a7, 0x63f7, 0x64bb, 0x6538, 0x6539, 0x6537, 0x6614, 0x666e, 0x667b, 0x43de, 0x666c, 0x667f, 0x6678, 0x667a, 0x666f, 0x43e5, 0x68fe, 0x6b48, 0x6b4b, 0x6b41, 0x6b49, 0x6b3b, 0x722d, 0x75e3, 0x761a, 0x760d, 0x7613, 0x7611, 0x761c, 0x4672, 0x78b5, 0x46af, 0x7c29, 0x7ca1, 0x7d24, 0x7fbb, 0x82a1, 0x8483, 0x848d, 0x8487, 0x8485, 0x848a, 0x84a3, 0x8489, 0x8484, 0x84a2, 0x86b1, 0x86b0, 0x86af, 0x86b6, 0x86c9, 0x86ca, 0x86c8, 0x86b4, 0x8c59, 0x8cc9, 0x8e41, 0x8e4c, 0x49c4, 0x8e45, 0x8e5a, 0x00b9, 0x0294, 0x026e, 0x02a2, 0x0267, 0x3463, 0x02a3, 0x0276, 0x026c, 0x0264, 0x02a5, 0x0230, 0x02a6, 0x0269, 0x02a4, 0x0490, 0x055f, 0x0560, 0x05da, 0x05d8, 0x05dd, 0x34ec, 0x0759, 0x075b, 0x075a, 0x0739, 0x0734, 0x0744, 0x0733, 0x073c, 0x0758, 0x076a, 0x086f, 0x0872, 0x0870, 0x0871, 0x086e, 0x08f0, 0x08eb, 0x0949, 0x094c, 0x09f5, 0x0a20, 0x0a6a, 0x0a72, 0x0b4b, 0x0b5d, 0x0c50, 0x0cf9, 0x0cfa, 0x0cfb, 0x0d23, 0x0cb7, 0x0d22, 0x0cb5, 0x0cc4, 0x0cb4, 0x0cef, 0x3598, 0x0ccd, 0x0cf0, 0x0cb8, 0x0ccb, 0x0cf1, 0x0cba, 0x0d03, 0x0cf8, 0x0cb6, 0x0cbc, 0x0cb3, 0x0d21, 0x0cf7, 0x0cc2, 0x0cbe, 0x0cc9, 0x0cbd, 0x0cce, 0x0cb9, 0x0cc7, 0x0cca, 0x0ccc, 0x0d26, 0x11e4, 0x11e0, 0x11f0, 0x12ec, 0x1324, 0x1318, 0x132f, 0x1325, 0x1528, 0x1522, 0x156a, 0x0157, 0x1594, 0x1592, 0x159c, 0x1622, 0x1630, 0x161d, 0x1623, 0x1735, 0x1733, 0x172f, 0x174d, 0x1731, 0x175b, 0x175a, 0x1732, 0x175c, 0x1759, 0x175d, 0x1969, 0x196d, 0x2232, 0x3758, 0x1a0a, 0x1a20, 0x1a1f, 0x1a0d, 0x1be8, 0x1bec, 0x1c77, 0x1c70, 0x1c71, 0x1df8, 0x1dd6, 0x1dd9, 0x1dde, 0x1dd5, 0x1de1, 0x37d3, 0x1de2, 0x1ddd, 0x1de0, 0x1e0e, 0x1e08, 0x1ddc, 0x1e0a, 0x1e0c, 0x20b4, 0x20b1, 0x20b6, 0x20bc, 0x221d, 0x2224, 0x2219, 0x221b, 0x2222, 0x221a, 0x221c, 0x2221, 0x23e6, 0x23e4, 0x23e7, 0x23ea, 0x38e2, 0xf89b, 0x24f0, 0x24f5, 0x24ef, 0x2642, 0x266e, 0x263c, 0x2697, 0x268c, 0x2681, 0x2671, 0x26ce, 0x26ba, 0x267a, 0x267e, 0x3954, 0x2672, 0x26bb, 0x392f, 0x2673, 0x2682, 0x39b6, 0x29ba, 0x29b8, 0x2a4b, 0x2a48, 0x2b2b, 0x2af4, 0x2b2c, 0x2b42, 0x2b48, 0x2b44, 0x2b45, 0x2b3c, 0x2b37, 0x2b33, 0x2b41, 0x2b32, 0x2b87, 0x2f27, 0x2f23, 0x2f2d, 0x2f1f, 0x2f2c, 0x2f28, 0x3075, 0x3074, 0x30e7, 0x3132, 0x3131, 0x3199, 0x3196, 0x3198, 0x319d, 0x3192, 0x3194, 0x3195, 0x3197, 0x66b9, 0x3b35, 0x3411, 0x343b, 0x3479, 0x3442, 0x3443, 0x3b5d, 0x3478, 0x38ac, 0x3c29, 0x38b1, 0x38b4, 0x38b3, 0x38af, 0x38aa, 0x38b2, 0x3968, 0x39f2, 0x39fe, 0x39f8, 0x39f9, 0x39ff, 0x39f5, 0x39f7, 0x39fd, 0x3a00, 0x3a88, 0x3b6e, 0x3b5d, 0x3b63, 0x3b60, 0x3c61, 0x3d37, 0x3d71, 0x3d23, 0x3d22, 0x3d1f, 0x3d25, 0x41fd, 0x4211, 0x4223, 0x41f0, 0x41ef, 0x450e, 0x450c, 0x45ba, 0x3e1f, 0x4652, 0x4655, 0x4653, 0x4654, 0x4651, 0x4658, 0x47b0, 0x479f, 0x3e72, 0x47a1, 0x479a, 0x47be, 0x47a0, 0x4937, 0x3f0b, 0x4af1, 0x4af2, 0x4b34, 0x4b37, 0x4b35, 0x238c, 0x4bdf, 0x4c4c, 0x4c4e, 0x4c64, 0x4c63, 0x4c36, 0x4d58, 0x4d68, 0x4d5b, 0x4d5f, 0x4d59, 0x4d65, 0x4d60, 0x4d5e, 0x4fd5, 0x4fd6, 0x504e, 0x5052, 0x5135, 0x5139, 0x5158, 0x5141, 0x5157, 0x5138, 0x513d, 0x5132, 0x5144, 0xf944, 0x5363, 0x5362, 0x53b8, 0x53b0, 0x53b1, 0x544d, 0x5463, 0x5470, 0x544b, 0x544f, 0x544e, 0x5453, 0x5447, 0x40a2, 0x5454, 0x5452, 0x5459, 0x547e, 0x562b, 0x562e, 0x577f, 0x577e, 0x5781, 0x5783, 0x5947, 0x5954, 0x594d, 0x594c, 0x594b, 0x5957, 0x5a65, 0x5a64, 0x5a61, 0x5a62, 0x5af0, 0x5af3, 0x5af9, 0x5af4, 0x5af5, 0x5aef, 0x5af8, 0x5afc, 0x5af7, 0x5afd, 0x5b17, 0x5e34, 0x5e36, 0x5e38, 0x5faf, 0x5fae, 0x5fac, 0x5fa2, 0x6228, 0x2ec2, 0x629c, 0x62b3, 0x6290, 0x6406, 0x6404, 0x640b, 0x6405, 0x6540, 0x654f, 0x66ab, 0x669d, 0x66b8, 0x66b2, 0x66d2, 0x66cf, 0x66a2, 0x43ec, 0x66a5, 0x66a9, 0x66a7, 0x66d0, 0x6902, 0x69cf, 0x69d0, 0x6a16, 0x6a19, 0x6b75, 0x6b71, 0x6b91, 0x6b72, 0x6b8e, 0x6b6d, 0x6b88, 0x6b73, 0x44bb, 0x6b81, 0x6b76, 0x6b7b, 0x6b7f, 0x6b90, 0x6b78, 0x724b, 0x7248, 0x725b, 0x7251, 0x723d, 0x7240, 0x7246, 0x724d, 0x723b, 0x724a, 0x7241, 0x723e, 0x724e, 0x75ac, 0x75e6, 0x75e9, 0x7629, 0x4621, 0x7633, 0x762e, 0x761e, 0x461f, 0xf9c5, 0x7622, 0x7627, 0x77e7, 0x780b, 0x7966, 0x7bad, 0x7bae, 0x8c38, 0x7c2b, 0x7c2a, 0x7d2c, 0x7d2d, 0x4791, 0x4796, 0x7e8f, 0x7e93, 0x7fc6, 0x7fc5, 0x8215, 0x8213, 0x82b1, 0x82a9, 0x8ece, 0x84a8, 0x84ab, 0x84be, 0x84ac, 0x84a9, 0x84a6, 0x84c1, 0x86cc, 0x86d1, 0x86d3, 0x86e4, 0x86cb, 0x86e1, 0x86d2, 0x86e3, 0x86cf, 0x86d0, 0x86e5, 0x870e, 0x8ccc, 0x8cca, 0x8ccb, 0x8e5c, 0x8e61, 0x8e5d, 0x8e59, 0x9077, 0x9684, 0x0041, 0x00fd, 0x011a, 0x0163, 0x02b6, 0x02b2, 0x02e9, 0x02e7, 0x02d6, 0x0330, 0x02ec, 0x02dd, 0x02e8, 0x02b0, 0x02b5, 0x02e1, 0x0498, 0x0499, 0x34bc, 0x0593, 0x05e5, 0x34d8, 0x0760, 0x075e, 0x34f4, 0x087b, 0x08f1, 0x08f3, 0x0a7f, 0xf838, 0x0b57, 0x0b58, 0x0d39, 0x0da7, 0x0d35, 0x0d60, 0x0d51, 0x0d62, 0x0d42, 0x0d3c, 0x0d43, 0x0dab, 0x0da9, 0x0db4, 0x0d79, 0x0d6a, 0x0d3b, 0x0daa, 0x0d33, 0x0d37, 0x0d27, 0x0da8, 0x0d70, 0x0d2f, 0x0d36, 0x0db5, 0x0d30, 0x0d3a, 0x0d38, 0x0db1, 0x0dac, 0x0d2e, 0x0d75, 0x0db0, 0x11f7, 0x1200, 0x11f1, 0x11f3, 0x1360, 0x1361, 0x1332, 0x132d, 0x134a, 0x132a, 0x1567, 0x15a2, 0x15a3, 0x159e, 0x15a4, 0x1644, 0x1632, 0x179b, 0x1798, 0x1799, 0x179a, 0x1766, 0x1762, 0x176b, 0x4562, 0x1767, 0x1a3b, 0x1a23, 0x1a29, 0x1b7e, 0x1bf3, 0x3785, 0x1bf5, 0x3783, 0x1c80, 0x1c7e, 0x1c7c, 0x1c7f, 0x1c7d, 0x1c81, 0x1e25, 0x1e29, 0x1e17, 0x1e63, 0x1e67, 0x1e65, 0x1e2a, 0x1e68, 0x1e26, 0x1e64, 0x1e1b, 0x1e62, 0x1e69, 0x1ffe, 0x2044, 0x2042, 0x20b7, 0x20d2, 0x20d4, 0x20d7, 0x20dc, 0x20d1, 0x20d5, 0x20cd, 0x20d8, 0x219a, 0x2242, 0x2235, 0x2258, 0x2234, 0x223c, 0x223b, 0x223e, 0x223d, 0x225a, 0x2241, 0x2238, 0x2245, 0x2233, 0x2326, 0x38ba, 0x23f7, 0x23ef, 0x23f0, 0x23ee, 0x249d, 0x2506, 0x2511, 0x2508, 0x2502, 0x250a, 0x2507, 0x2691, 0x268e, 0x2685, 0x26e8, 0x2717, 0x26d4, 0x3969, 0x26c4, 0x26d5, 0x3945, 0x26d8, 0x2680, 0x26de, 0x2742, 0x29c7, 0x29bf, 0x2b8d, 0x2b89, 0x2b90, 0x2b9a, 0x2bc8, 0x2b92, 0x2ba1, 0x2b84, 0x2f57, 0x2f47, 0x2f77, 0x2f3a, 0x2f50, 0x2f42, 0x2f43, 0x2fa3, 0x3077, 0x31b2, 0x31e2, 0x31bd, 0x3374, 0x3482, 0x34b8, 0x3b6c, 0x34ba, 0x34b9, 0x34bb, 0x3487, 0xf8e4, 0x3483, 0x34b7, 0x0043, 0x38ce, 0x38ba, 0x3973, 0x3a09, 0x3a0a, 0x3a0b, 0x3a07, 0x3a05, 0x3a0e, 0x3a97, 0x3b77, 0x3b7b, 0x3b7a, 0x3b74, 0x3b79, 0x3d86, 0x3df5, 0x3da5, 0x3d9d, 0x3dbe, 0x3d96, 0x3de1, 0x3da4, 0x3da1, 0x3df6, 0x3d04, 0x3d8d, 0x3d8b, 0x3d78, 0x3d98, 0x3e0a, 0x425d, 0x4227, 0x425f, 0x45c0, 0x45c1, 0x466d, 0x465e, 0x468a, 0x4662, 0x4664, 0x3e3a, 0x47c0, 0x47ca, 0x47d1, 0x3e79, 0x47c7, 0x47ce, 0x7309, 0x47c5, 0x4936, 0x4957, 0x4977, 0x4af6, 0x4af7, 0x4b55, 0x4b44, 0x4b3e, 0x4b42, 0x4b52, 0x4be1, 0x4c08, 0x4c68, 0x4c67, 0x3f5d, 0xf937, 0x4d7e, 0x4d93, 0x4d79, 0x4d81, 0x4d7d, 0x4d7b, 0x4d94, 0x3f8a, 0x4f66, 0x4fd9, 0x4fe0, 0xf93e, 0x505f, 0x515f, 0x515e, 0x5168, 0x4027, 0x5188, 0x516a, 0x516c, 0x5166, 0x5167, 0x5189, 0x5160, 0x5185, 0x032a, 0x5368, 0x53b9, 0x53ba, 0x53be, 0x546f, 0x5480, 0x5474, 0x5481, 0x547a, 0x549c, 0x5473, 0x5482, 0x547f, 0x54a7, 0x5479, 0x5478, 0x547d, 0x54a8, 0x547c, 0x5668, 0x564e, 0x579e, 0x4146, 0x4140, 0x5798, 0x413f, 0x5785, 0x579c, 0x57c5, 0x579a, 0x5968, 0x5965, 0x5967, 0x5961, 0x5960, 0x419d, 0x41cb, 0x5a7b, 0x41e1, 0x5b19, 0x5b0e, 0x5b31, 0x5b12, 0x5b10, 0x5b15, 0x5b3f, 0x5b1d, 0x5b1e, 0x5e4d, 0x5e48, 0x5e45, 0x5e42, 0x5e49, 0x5e4a, 0x5e47, 0x427f, 0x5e4c, 0x5fcd, 0x5fd5, 0x5fc4, 0x5fca, 0x5fc3, 0x4346, 0x6229, 0x62b4, 0x636d, 0x6366, 0x636a, 0x6415, 0x64d3, 0x64ec, 0x6555, 0x441a, 0x66d6, 0x66d8, 0x6751, 0x66e0, 0x6703, 0x6704, 0x66da, 0x66ea, 0x6702, 0x66d3, 0x66e4, 0x66e5, 0x693b, 0x6966, 0x6a2c, 0x6a21, 0x6a26, 0x6ad4, 0x6ad5, 0x6ad9, 0x6bd5, 0x6beb, 0x6bc5, 0x44d3, 0x6c27, 0x6bf0, 0x6bb9, 0x6c18, 0x6bee, 0x44d0, 0x6bb7, 0x6bbb, 0x6bef, 0x6bb8, 0x6bdf, 0x6bda, 0x6be3, 0x6bc9, 0x6bec, 0x71a4, 0x458e, 0x71a3, 0x725e, 0x7261, 0x7262, 0x7263, 0x728e, 0x7269, 0x726b, 0x7285, 0x728d, 0x7264, 0x726d, 0x764c, 0x7649, 0x7647, 0x7648, 0x7642, 0x7645, 0x765b, 0x765d, 0x7646, 0x7813, 0x781a, 0x780e, 0x780f, 0x781b, 0x7812, 0x78c3, 0x78be, 0x78bd, 0x7979, 0x797c, 0x46c3, 0x46b6, 0x7980, 0x7975, 0x799b, 0x8a2f, 0x7974, 0x46c0, 0x46b8, 0x2041, 0x2494, 0x7c30, 0x7ca7, 0x7ca5, 0x7ca4, 0x7d3a, 0x7e5b, 0x7e9f, 0x7ea8, 0x7eb3, 0x7ea1, 0x7ea7, 0x7eb2, 0x7e9d, 0x7ea3, 0x7ea2, 0x7fef, 0x7fd9, 0x47d9, 0x7fd5, 0x7fdd, 0x7fda, 0x7fee, 0x7fd7, 0x821a, 0x8219, 0x8218, 0x82b3, 0x82bf, 0x82bb, 0x82c0, 0x82b9, 0x82b8, 0x82d5, 0x8411, 0x8410, 0x84c3, 0x84c2, 0x84e9, 0x84cd, 0x84e5, 0x84ca, 0x84c7, 0x84e8, 0x86f1, 0x870c, 0x86ef, 0x86ee, 0x86f3, 0x870d, 0x86f6, 0x86f0, 0x48ec, 0x87f5, 0x87f4, 0x87f8, 0x87fe, 0x8911, 0x8922, 0x8942, 0x8c5c, 0x8c5a, 0x8c5d, 0x8cd1, 0x8cd0, 0x8e75, 0x8e7b, 0x8f89, 0x944d, 0x9689, 0x9692, 0x968c, 0x9688, 0x9867, 0x9868, 0x0321, 0x02f2, 0x0309, 0x02f8, 0x02f0, 0x02f3, 0x02f5, 0x02fb, 0x02f7, 0x02ef, 0x030b, 0x04a2, 0x05f5, 0x05f3, 0x05f4, 0x05f2, 0x0698, 0x0768, 0x0780, 0x0785, 0x078e, 0x078f, 0x02f4, 0x0786, 0x07a4, 0x0886, 0x0889, 0x0887, 0x0885, 0x52dc, 0x0888, 0x0aff, 0x0b66, 0x35cc, 0x0dc3, 0x35a2, 0x0dc4, 0x0e3b, 0x0de7, 0x0df8, 0x0dfb, 0x35b6, 0x0dbe, 0x0dc6, 0x35c5, 0x35c6, 0x0dfc, 0x0dc0, 0x0e33, 0x0dc9, 0x0dfe, 0x0dda, 0x0dcc, 0x0dbb, 0x0dfd, 0x0ddf, 0x0dcd, 0x0dc2, 0x0dc8, 0x0e32, 0x0e2d, 0x0dd2, 0x0e31, 0x0dd3, 0x0e2e, 0x0dcf, 0x11ff, 0x1209, 0x11fc, 0x1372, 0x13aa, 0x13ab, 0x13a7, 0x137b, 0x1376, 0x13a8, 0x13ac, 0x3683, 0x5921, 0x15aa, 0x0a03, 0x15ac, 0x15ad, 0x15ab, 0x1650, 0x1658, 0x17dd, 0x36f8, 0x17ae, 0x17a2, 0x17ab, 0x17e3, 0x17af, 0x17e0, 0x17e4, 0x36f6, 0x17a7, 0x17aa, 0x17e2, 0x17e1, 0x17df, 0x17ad, 0x17e5, 0x17d1, 0x17ac, 0x17d5, 0x17a3, 0x179f, 0x1979, 0x1976, 0x1a43, 0x1a3d, 0x1a47, 0x1a44, 0x1a3f, 0x1a5b, 0x1b7f, 0x1c9a, 0x1c9c, 0x379b, 0x1d1e, 0x1e88, 0x1e6a, 0x1e76, 0x1e72, 0x1e70, 0x1e7e, 0x1e6c, 0x1e6f, 0x1e75, 0x1e77, 0x1e78, 0x1e8a, 0x1e79, 0x1e94, 0x2001, 0x2105, 0x20f1, 0x20ee, 0x20ef, 0x2104, 0x5e3f, 0x20fa, 0x2107, 0x20f4, 0x20f5, 0x219c, 0x226d, 0x2269, 0x2266, 0x2262, 0x2246, 0x388d, 0x2265, 0x225d, 0x225e, 0x225f, 0x238e, 0x2402, 0x2406, 0x2404, 0x2403, 0x2462, 0x2527, 0x2521, 0x2520, 0x2524, 0x2529, 0x2531, 0x2523, 0x2522, 0x26dc, 0x274d, 0x26e5, 0x26d3, 0x26ee, 0x26e6, 0x3956, 0x2736, 0x2740, 0x283f, 0x273d, 0x2744, 0x395b, 0x275f, 0x2729, 0x2749, 0x278a, 0x272a, 0x2787, 0x274c, 0x2731, 0x2748, 0x272b, 0x273b, 0x2741, 0x26c9, 0x2734, 0x2753, 0x2735, 0x2747, 0x2738, 0x29d1, 0x29d2, 0x2a51, 0x2a55, 0x2a52, 0x2a53, 0x2b8f, 0x2bf4, 0x2c47, 0x2c0d, 0x2c1c, 0x2bfb, 0x2c19, 0x2bf7, 0x2bf9, 0x2bf5, 0x2be9, 0x2c0a, 0x2bee, 0x2c0b, 0x2bfd, 0x2c06, 0x2c02, 0x2c16, 0x2c18, 0x2bf0, 0x2ed4, 0x2f66, 0x2f6a, 0x2f75, 0x2f76, 0x2f80, 0x2f6d, 0x3a96, 0x2f69, 0x2f67, 0x2f68, 0x2f5d, 0x30a4, 0x30fe, 0x30fd, 0x31ec, 0x31e9, 0x3221, 0x31eb, 0x31e7, 0x31f2, 0x3220, 0x337a, 0x352d, 0x352e, 0x34ca, 0x352f, 0x34c8, 0x3b7e, 0x34cb, 0x34c3, 0x3484, 0x34d2, 0x34c6, 0x3b81, 0x34cf, 0x34d5, 0x34d4, 0x34dd, 0x352b, 0x35a3, 0x34db, 0x352c, 0x3513, 0x3c35, 0x38d1, 0x38cc, 0x38d5, 0x38c9, 0x38cf, 0x38d2, 0x397b, 0x397c, 0x3a23, 0x3a1d, 0x3a1c, 0x3a1e, 0x3a22, 0x3a24, 0x3a20, 0x3a18, 0x3a21, 0x3b88, 0x3b8a, 0x3b94, 0x3b8f, 0x3b8e, 0x3b90, 0x3c9b, 0x3ba7, 0x3c64, 0x3d00, 0x3e18, 0x3e14, 0x3e1d, 0x3e05, 0x3dff, 0x3e1b, 0x3e1a, 0x3e19, 0x3e03, 0x3e0e, 0x3e47, 0x3e04, 0x3e5a, 0x3e07, 0x3e20, 0x426a, 0x4266, 0x427a, 0x4265, 0x42af, 0x45cd, 0x45cf, 0x45d1, 0x45ce, 0x465f, 0x4677, 0x4674, 0x4688, 0x4675, 0x4689, 0x4672, 0x47c6, 0x47ea, 0x47e0, 0x4807, 0x47e6, 0x47e5, 0x47dd, 0x47e3, 0x47da, 0x49ae, 0x497e, 0x497d, 0x497f, 0x3ed3, 0x49d9, 0x4afa, 0x4afb, 0x4b4d, 0x4b54, 0x4b51, 0x4b50, 0x4d98, 0x4d95, 0x4d9d, 0x4dc1, 0x4d9a, 0x4d9b, 0x3f9f, 0x4d9c, 0x4dd7, 0x4da4, 0x4d96, 0x4da0, 0x4f31, 0x4fe9, 0x506e, 0x519a, 0x51a5, 0x5194, 0x51a6, 0x5199, 0x518b, 0x5198, 0x5191, 0x518c, 0x51a1, 0x51a3, 0x51c6, 0x536f, 0x536d, 0x536a, 0x536c, 0x5371, 0x536e, 0x53df, 0x54ac, 0x54aa, 0x40b1, 0x54b5, 0x54ad, 0x54b2, 0x54b3, 0x54ab, 0x54b6, 0x54c7, 0x54c6, 0x566c, 0x5670, 0x57b3, 0x414b, 0x598c, 0x5981, 0x5983, 0x597d, 0x5985, 0x5990, 0x59a2, 0x598d, 0x598f, 0x597e, 0x598a, 0x597f, 0x5976, 0x5987, 0x5978, 0x5a80, 0x5a82, 0x5a81, 0x5a83, 0x5b5a, 0x5b34, 0x5b2c, 0x5b2a, 0x5b40, 0x5b2d, 0x5b33, 0x5b2b, 0x5b4b, 0x7b3f, 0x5b3c, 0x5e5a, 0x5e77, 0x5e60, 0x5ffa, 0x5ff9, 0x5ffc, 0x42d6, 0x5ff5, 0x5fe8, 0x6009, 0x5fe7, 0x5fe6, 0x5fe9, 0x6232, 0x622c, 0x62bd, 0x62bc, 0x637a, 0x637e, 0x6379, 0x4389, 0x6423, 0x6430, 0x6428, 0x64d4, 0x6ace, 0x64f1, 0x64f0, 0x6560, 0x6565, 0x66a8, 0x670a, 0x671b, 0x6712, 0x6707, 0x674f, 0x670e, 0x6752, 0x6716, 0x4400, 0x6753, 0x6754, 0xf984, 0x6756, 0x696d, 0x6972, 0x6a2f, 0x6c2a, 0x44dc, 0x6c63, 0x6c84, 0x6caf, 0x6c45, 0x6c70, 0x6c56, 0x6c16, 0x6c3d, 0x6c38, 0x6c6f, 0x6c77, 0x6c2e, 0x6c31, 0x6c4c, 0x6c5f, 0x6c75, 0x6c39, 0x6c3a, 0x6c2c, 0x6c2d, 0x6c3f, 0x6c2f, 0x6c30, 0x6c3e, 0x83d0, 0x4590, 0x71b2, 0x72b7, 0x728f, 0x45b1, 0x7296, 0x729e, 0x7297, 0x7295, 0x72a5, 0x7298, 0x86e7, 0x72a3, 0x729a, 0x72ad, 0x72a6, 0x72b6, 0x7299, 0x72af, 0x72ac, 0x45aa, 0x729f, 0x7294, 0x75eb, 0x766f, 0x766d, 0x767e, 0x766c, 0x7661, 0x7663, 0x766b, 0x765e, 0x763e, 0x7664, 0x76ad, 0x467d, 0x7820, 0x78d1, 0x78d5, 0x79ae, 0x79af, 0x799f, 0x79a8, 0x79ca, 0x7be1, 0x7c39, 0x7c38, 0x7c3b, 0x7cad, 0x7cb5, 0x7caf, 0x7cb1, 0x7cae, 0x7cb4, 0x7cb0, 0x7d4b, 0x7d51, 0x7d4c, 0x4769, 0x7d60, 0x7ebe, 0x7eb9, 0x7eb7, 0x7eb6, 0x47a1, 0x7ebd, 0x7eb8, 0x7ec1, 0x7ff7, 0x7ff3, 0x7ff4, 0x7ffb, 0x7ffd, 0x7ff5, 0x47e7, 0x7ffa, 0x8014, 0x47ec, 0x7ff2, 0x7ffc, 0x8000, 0x47df, 0x822b, 0x8229, 0x822e, 0x4833, 0x82d7, 0x82db, 0x82d9, 0x82d8, 0x82e6, 0x82d6, 0x82d1, 0x82e7, 0x82d0, 0x82dc, 0x84ed, 0x851a, 0x8519, 0x8516, 0x84ec, 0x84ef, 0x84ee, 0x84f4, 0x852f, 0x8730, 0x8719, 0x8718, 0x8711, 0x8716, 0x8712, 0x8710, 0x8714, 0x880c, 0x880d, 0x8910, 0x8929, 0x8928, 0x8c65, 0x8c66, 0x8cde, 0x8cdf, 0x8ce0, 0x8cd9, 0x8cdb, 0x8cd8, 0x8ce3, 0x8cd7, 0x8ea6, 0x8ea7, 0x8ebf, 0x8ea8, 0x8e9f, 0x8ea1, 0x8ea2, 0x8ead, 0x8ea3, 0x8ea0, 0x9083, 0x9085, 0x9082, 0x9084, 0x91ee, 0x925d, 0x9392, 0x9455, 0x9453, 0xf9fc, 0x9451, 0x9452, 0x9450, 0x959d, 0x9687, 0x9697, 0x969b, 0x969d, 0x9869, 0x9a11, 0x4bee, 0x9c7a, 0x4c32, 0x3244, 0x00c6, 0x0340, 0x032e, 0x0368, 0x032d, 0x0334, 0x0332, 0x0369, 0x0331, 0x036a, 0x033e, 0x036f, 0x0375, 0x04f6, 0x0520, 0x0528, 0x0567, 0x05fb, 0x05fe, 0x05fc, 0x05fd, 0x05ff, 0x05fa, 0x07ac, 0x07af, 0x07b1, 0x34fc, 0x07bf, 0x07be, 0x07a7, 0x07aa, 0x0894, 0x0893, 0x0899, 0x352a, 0x08fa, 0x0956, 0x0a22, 0x0a91, 0x0a92, 0x0b08, 0x0b06, 0x0dd6, 0x0e37, 0x0e4b, 0x0ece, 0x0ed0, 0x0e39, 0x0e64, 0x0ecf, 0x0e46, 0x0e66, 0x0e56, 0x0e43, 0x0e4a, 0x0e58, 0x0e65, 0x0e5a, 0x0e5b, 0x0e55, 0x0e50, 0x0e4c, 0x0ecd, 0x0e51, 0x0e47, 0x35d3, 0x0e53, 0x0e62, 0x0ecc, 0x35d7, 0x0e7f, 0x0e4d, 0x120a, 0x120c, 0x120f, 0x13bb, 0x13b9, 0x13eb, 0x13ae, 0x13c1, 0x13ea, 0x13be, 0x13bf, 0x13ba, 0x13b7, 0x13b3, 0x13e9, 0x156e, 0x15af, 0x15b3, 0x15b2, 0x1668, 0x1669, 0x166a, 0x17de, 0x17eb, 0x1811, 0x17ed, 0x17e9, 0x17f7, 0x17f4, 0x17ea, 0x1812, 0x17e8, 0x1813, 0x198e, 0x1986, 0x1a63, 0x1a65, 0x1b99, 0x1cc2, 0x1cae, 0x1cb0, 0x1cad, 0x1eb4, 0x1ed1, 0x1ead, 0x37f3, 0x1ebd, 0x1eb7, 0x1eab, 0x1eaf, 0x1ec1, 0x1eb5, 0x210f, 0x210e, 0x211c, 0x2113, 0x210a, 0x211e, 0x2114, 0x211a, 0x21cb, 0x2287, 0x2293, 0x3891, 0x2284, 0x2285, 0x2292, 0x2280, 0x232b, 0x2363, 0x240a, 0x38c0, 0x2466, 0x2534, 0x2533, 0x254d, 0x2789, 0x2757, 0x6117, 0x274a, 0x3963, 0x2739, 0x273f, 0x2790, 0x278f, 0x27b2, 0x279f, 0x2795, 0x27a1, 0x279c, 0x278e, 0x27a0, 0x27ae, 0x2796, 0x27ca, 0x27ac, 0x3970, 0x27a6, 0x2797, 0x2793, 0x03b6, 0x29d6, 0x29e0, 0x29d8, 0x2a56, 0x2c6e, 0x2c7e, 0x2c74, 0x2c77, 0x2c80, 0x2c7a, 0x2c6b, 0x2c5f, 0x2c76, 0x2cb0, 0x2c63, 0x2f92, 0x2f82, 0x2f9d, 0x2f94, 0x2f83, 0x2f8b, 0x2f84, 0x3057, 0x3084, 0x30b5, 0x3109, 0x31e6, 0x3b02, 0x3225, 0x3251, 0x333e, 0xf8da, 0x3385, 0x353f, 0x3542, 0x3538, 0x353a, 0x354e, 0x3545, 0x3539, 0x3537, 0x3544, 0xf8e7, 0x35a4, 0x353d, 0x3541, 0x38df, 0x38de, 0x38ca, 0x38e9, 0x38e2, 0x38e0, 0x3989, 0x3987, 0x3a32, 0x3a33, 0x3aac, 0x3af9, 0x3b0d, 0x3bb9, 0x3e5e, 0x3e6a, 0x3d35, 0x3e81, 0x3e69, 0x3eac, 0x3e80, 0x3e75, 0x3e71, 0x3e76, 0x3e6f, 0x42b6, 0x4303, 0x42bf, 0x4301, 0x42b2, 0x42c4, 0x45db, 0x45dc, 0x45d8, 0x9672, 0x46b5, 0x46a8, 0x468f, 0x469e, 0x468e, 0x47de, 0x47e2, 0x4820, 0x481d, 0x481a, 0x4819, 0x482b, 0x4818, 0x4810, 0x480e, 0x4824, 0x481f, 0x4813, 0x4835, 0x4983, 0x3ee0, 0x49d7, 0x4b02, 0x4b03, 0x4b5c, 0x4b5f, 0x4bc7, 0x4c9a, 0x4c97, 0x4ca3, 0x4df7, 0x4dc6, 0x4dcc, 0x4dd6, 0x4dcd, 0x4df9, 0x4dd9, 0x4dd8, 0x3f9a, 0x4dd1, 0x4dce, 0x4dd5, 0x3fa3, 0x4dd4, 0x4df8, 0x4f7a, 0x4f79, 0x4f7f, 0x4ff3, 0x4ff5, 0x4ff6, 0x4ff4, 0x4ff7, 0x4005, 0x5079, 0x519c, 0x51df, 0x51f5, 0x51ff, 0x51d1, 0x51da, 0x51cf, 0x51cd, 0x51de, 0x51d8, 0x3aad, 0x51e0, 0x51fe, 0x519e, 0x5375, 0x5373, 0x5372, 0x53d8, 0x54d0, 0x54d6, 0x54d7, 0x54ca, 0x54cd, 0x568a, 0x5689, 0x568b, 0x57d3, 0x57da, 0x57ce, 0x57d2, 0x415e, 0x57d4, 0x57d7, 0x57d5, 0x57fb, 0x57cd, 0x57fa, 0x57d6, 0x41a6, 0x599b, 0x599e, 0x599d, 0x59a4, 0x599f, 0x59a5, 0x59a8, 0x5a8f, 0x5a8c, 0x5a95, 0x5b60, 0x5b55, 0x5b5c, 0x5b6f, 0x5b51, 0x5b61, 0x5ba7, 0x5b5e, 0x5b62, 0x5b54, 0x5b6e, 0x5b52, 0x5b58, 0x5b6d, 0x5b5f, 0x5b6c, 0x5b50, 0x5b5d, 0x5b8e, 0x5e72, 0x5e78, 0x5e75, 0x5e76, 0x5e7c, 0x5e7e, 0x5e7d, 0x6015, 0x6014, 0x601d, 0x601c, 0x6023, 0x6057, 0x62c8, 0x435d, 0x62c9, 0x62c5, 0x6387, 0x638a, 0x6394, 0x6439, 0x6440, 0x643e, 0x6438, 0x64d6, 0x43b8, 0x6577, 0x6578, 0x657d, 0x66dd, 0x675e, 0x6777, 0x67d4, 0x6766, 0x675f, 0x6773, 0x6772, 0x6797, 0x675a, 0x6796, 0x675d, 0x6765, 0x6770, 0x6775, 0x6774, 0x675c, 0x6760, 0x4434, 0x676d, 0x6941, 0x6a3c, 0x6a3e, 0x446f, 0x6a49, 0x6be4, 0x6d0c, 0x6d15, 0x6d0e, 0x6cd4, 0x6cc7, 0x6d14, 0x6cdb, 0x6d5f, 0x6ced, 0x6d09, 0x6ccf, 0x6cff, 0x6d1a, 0x6cf5, 0x6cee, 0x6ce5, 0x6d0d, 0x6cdf, 0x6cec, 0x6cd7, 0x6d2c, 0x6ccd, 0x6ce3, 0x6d00, 0x6ceb, 0x6cfd, 0x6d0f, 0x6d2d, 0x6d50, 0x6cfe, 0x6cc4, 0x6ce1, 0x6cf9, 0x71bb, 0x71bc, 0x4594, 0x4593, 0x71ba, 0x72d0, 0x72d6, 0x72ce, 0x72e1, 0x72d5, 0x72cf, 0x72d3, 0x8714, 0x72d4, 0x75b5, 0x7690, 0x76a1, 0x7681, 0x7685, 0x766e, 0x7688, 0x7682, 0x7686, 0x768f, 0x7689, 0x7680, 0x7684, 0x88d1, 0x7829, 0x782b, 0x782a, 0x7830, 0x78e2, 0x78e3, 0x78e1, 0x79d5, 0x79c4, 0x79c9, 0x79e0, 0x79df, 0x79cb, 0x79dd, 0x79e8, 0x79d4, 0x7a1c, 0x7bb5, 0x7bb6, 0x7be5, 0x7c45, 0x7c49, 0x7c40, 0x7c46, 0x7c44, 0x7c4a, 0x7cc9, 0x7cc4, 0x7cc2, 0x7d68, 0x8ccb, 0x7d82, 0x7d6b, 0x7d67, 0x7d6c, 0x7d6d, 0x7d71, 0x4792, 0x7ed7, 0x7ed2, 0x7ed9, 0x47aa, 0x7ebc, 0x7edd, 0x7ed6, 0x47a7, 0x7ed8, 0x8020, 0x8016, 0x8018, 0x8015, 0x8019, 0x8027, 0x8050, 0x801d, 0x802c, 0x801c, 0x8029, 0x802b, 0x8024, 0x47ef, 0x8028, 0x8239, 0x82f2, 0x82f0, 0x8eed, 0x82ed, 0x82ef, 0x82ea, 0x8301, 0x84bc, 0x855c, 0x855b, 0x855a, 0x8526, 0x8743, 0x8733, 0x873a, 0x8737, 0x8736, 0x873c, 0x8734, 0x874a, 0x873b, 0x8735, 0x873d, 0x8740, 0x873e, 0x8717, 0x8826, 0x8824, 0x8810, 0x8836, 0x8825, 0x4922, 0x8966, 0x8c7f, 0x8c7a, 0x8cfb, 0x8cfd, 0x8cfc, 0x8cfa, 0x8ed6, 0x8ed2, 0x8ec8, 0x8ec2, 0x8ec7, 0x8ecd, 0x8ec1, 0x8ec6, 0x8ecc, 0x8fa1, 0x9095, 0x9094, 0x9097, 0x9096, 0x9093, 0x90a1, 0x9209, 0x9208, 0x9267, 0x9265, 0x9262, 0x9261, 0x9397, 0x9401, 0x9419, 0x9418, 0x945c, 0x9467, 0x946c, 0x4ab5, 0xf9fd, 0x9466, 0x9461, 0x946e, 0x945d, 0x945a, 0x95a2, 0x95a9, 0x95a5, 0x95a6, 0x95b2, 0x95a3, 0x96ac, 0x96aa, 0x96af, 0x96ab, 0x96b1, 0x96c6, 0x96ad, 0x96b9, 0x9870, 0x4b75, 0x9c0c, 0x9c81, 0x9c83, 0x9c7e, 0x9d51, 0x9f99, 0x9f94, 0x9f95, 0xa2fe, 0xa418, 0x0105, 0x0372, 0x3482, 0x0399, 0x04ad, 0x0606, 0x07c2, 0x07cb, 0x07d5, 0x07d2, 0x07cc, 0x07d7, 0x07c5, 0x07ca, 0x52ec, 0x08a2, 0x08a3, 0x08a1, 0x52e8, 0x08a6, 0x08a4, 0x08ff, 0x0900, 0x3535, 0x0a06, 0x0a25, 0x0a9f, 0x0b7f, 0x0eea, 0x0eeb, 0x0ede, 0x0f18, 0x0ee0, 0x0ee8, 0x0edf, 0x0ef1, 0x0eec, 0x0f1a, 0x0ee6, 0x0ee1, 0x0f5d, 0x0077, 0x0f1e, 0x35f0, 0x0f80, 0x1217, 0x141d, 0x13f7, 0x13ef, 0x13ee, 0x13ed, 0x13f5, 0x141e, 0x15bd, 0x57ff, 0x15be, 0x166d, 0x1676, 0x184c, 0x1819, 0x1848, 0x181e, 0x184a, 0x1849, 0x1826, 0x1995, 0x1a85, 0x1a7e, 0x1a97, 0x1a7d, 0x1b42, 0x1b9e, 0x1c0c, 0x1c0b, 0x1c0e, 0x1ccf, 0x1ed8, 0x1ee0, 0x1ee8, 0x1ee9, 0x1ee2, 0x1ee1, 0x1eda, 0x1ee3, 0x1ed9, 0x1ef0, 0x1ee7, 0x1ee4, 0x2123, 0x2131, 0x2133, 0x210c, 0x69e0, 0x2126, 0x2124, 0x2132, 0x2127, 0x2121, 0x2130, 0x21a2, 0x21cc, 0x2296, 0xf88f, 0x2298, 0x229c, 0x229b, 0x236b, 0x2412, 0x2414, 0x255a, 0x2554, 0x2551, 0x255e, 0x2558, 0x38f0, 0x2559, 0x279a, 0x27f2, 0x27ad, 0x2820, 0x27f1, 0x27f0, 0x27f3, 0x27f4, 0x27e9, 0x27fe, 0x282e, 0x27e8, 0x27e7, 0x27ff, 0x27f5, 0x29e5, 0x29e7, 0x29e6, 0x29e9, 0x2a58, 0x2c6c, 0x2cd9, 0x3a3e, 0x2ccb, 0x3a39, 0x2cbe, 0x2cb5, 0x2cd1, 0x2cc2, 0x2cb6, 0x2cd3, 0xf8c2, 0x2eda, 0x3aa2, 0x2fae, 0x3aa1, 0x2fac, 0x2fa9, 0x2fba, 0x2fa7, 0x2fb3, 0x2fbd, 0x2fb1, 0x310e, 0x3111, 0x310f, 0x3252, 0x326a, 0x3254, 0x3255, 0x3253, 0x3257, 0xf8d0, 0x325b, 0x3258, 0x3259, 0x3b3b, 0x35b8, 0x35b5, 0x35bf, 0x35c1, 0x35bb, 0x3bb7, 0x35c3, 0x35ad, 0x35a8, 0x35ae, 0x35aa, 0x35d0, 0x35b1, 0x35bc, 0x35b7, 0x35b0, 0x35fa, 0x35fb, 0x35b9, 0x3907, 0x38fc, 0x38ff, 0x38f2, 0x38f8, 0x38f4, 0x3c57, 0x3c70, 0x3aae, 0x3b0f, 0x3b10, 0x9ac1, 0x3bc7, 0x3bc6, 0x3bce, 0x3ca7, 0x3bdc, 0x3ed5, 0x3ed3, 0x3f20, 0x3ee2, 0x3ef1, 0x3edb, 0x3eea, 0x3eeb, 0x3ee1, 0x3eff, 0x3ed6, 0x3ee0, 0x3ed7, 0x3ee5, 0x3d54, 0x431b, 0x4310, 0x430f, 0x430e, 0x4339, 0x430a, 0x4314, 0x430c, 0x4523, 0x455a, 0x45e2, 0x4693, 0x46b0, 0x46ab, 0x46bd, 0x46b1, 0x468d, 0x46ad, 0x46aa, 0x46ac, 0x46bc, 0x46c9, 0x4847, 0x4862, 0x4840, 0x4844, 0x483f, 0x4843, 0x483d, 0x4860, 0x485f, 0x483a, 0x4842, 0x485e, 0x485d, 0x49bc, 0x49e0, 0x49ee, 0x49eb, 0x4a0d, 0x4b09, 0x4b0c, 0x4b69, 0x4b74, 0x4b67, 0x3f31, 0x7527, 0x4cad, 0x4dff, 0x4e16, 0x4e08, 0x4e09, 0x4e00, 0x4dfc, 0x4e13, 0x4e14, 0x4e0a, 0x983e, 0x4e29, 0x4e17, 0x4e3b, 0x4dfb, 0x3fbf, 0x4e0e, 0x3fe4, 0x5008, 0x521b, 0x521a, 0x5219, 0x5202, 0x404a, 0x5217, 0x5207, 0x5213, 0x5209, 0x520a, 0x5212, 0x52aa, 0x5238, 0x537b, 0x537c, 0x537a, 0x53ea, 0x53eb, 0x53ef, 0x53f0, 0x5509, 0x5502, 0x5501, 0x552b, 0x5507, 0x40cf, 0x5528, 0x54fb, 0x552a, 0x54fe, 0x5504, 0x5529, 0x550a, 0x798c, 0x56c2, 0x7991, 0x56a6, 0x4114, 0x2fc6, 0x1c07, 0x580a, 0x57fd, 0x5806, 0x580d, 0x5809, 0x580b, 0x5800, 0x5805, 0x583d, 0x59d5, 0x59bf, 0x59ba, 0x59c7, 0x5a98, 0x5a9a, 0x420d, 0x5ba4, 0x5b9c, 0x5b9d, 0x5ba2, 0x5b96, 0x5b95, 0x5ba5, 0x5baa, 0x5bad, 0x5b9a, 0x5ba3, 0x5b97, 0x5b90, 0x5baf, 0x5b8d, 0x4201, 0x5ba8, 0x5bee, 0x5ea3, 0x5e99, 0x5ea1, 0x5e9c, 0x5ea4, 0x5ecb, 0x6056, 0x6048, 0x6059, 0x604a, 0x605c, 0x42f1, 0x604f, 0x604d, 0x605d, 0x623a, 0x62e3, 0x62e1, 0x62de, 0x6397, 0x639a, 0x6448, 0x644a, 0x644c, 0x644e, 0x644f, 0x644b, 0x644d, 0x6447, 0x6451, 0x64da, 0x64f9, 0x64fc, 0x64fb, 0x64fd, 0x64f8, 0x64fa, 0x658a, 0x658e, 0x6588, 0x6589, 0x658d, 0x6590, 0xf97e, 0x671c, 0x67ab, 0x67a4, 0x67a8, 0x67ad, 0x679f, 0x679a, 0x67b0, 0x67a5, 0x67d5, 0x67a2, 0x67b2, 0x679d, 0x67a1, 0x6915, 0x6942, 0x6973, 0x6984, 0x69dd, 0x6a5c, 0x6a4c, 0x4476, 0x6a4b, 0x6c67, 0x6da8, 0x6d7f, 0x6d8d, 0x6d8b, 0x6df7, 0x6da9, 0x6df4, 0x6d9a, 0x6d8c, 0x6d95, 0x6d7e, 0x6d77, 0x450a, 0x4503, 0x6d71, 0x6dfd, 0x6d88, 0x6d99, 0x6d6d, 0x6dd4, 0x6d91, 0x6d7d, 0x6d63, 0x6d75, 0x6df9, 0x6d8e, 0x6d74, 0x6dd9, 0x6d66, 0x6dfa, 0x6df5, 0x8660, 0x71c1, 0x71c9, 0x7303, 0x732c, 0x7334, 0x7317, 0x7309, 0x7304, 0x7306, 0x731a, 0x730e, 0x7327, 0x7305, 0x7307, 0x7319, 0x7314, 0x730c, 0x731d, 0x7322, 0x7323, 0x75bb, 0x75bc, 0x75ba, 0x76a9, 0x76b5, 0x76ac, 0x76aa, 0x76af, 0x76b7, 0x4635, 0x4636, 0x783d, 0x7845, 0x7848, 0x783c, 0x783e, 0x78ec, 0x78ed, 0x78e9, 0x7a0a, 0x7a0b, 0x79f8, 0x7a04, 0x79f6, 0x79f9, 0x7c53, 0x7c52, 0x7c60, 0x7c63, 0x7cce, 0x7ccd, 0x7cd0, 0x7ccc, 0x7d87, 0x7d8d, 0x7d9d, 0x4773, 0x7e63, 0x7ef4, 0x7ef1, 0x7eff, 0x7ef5, 0x7efc, 0x7ef2, 0x7ef6, 0x47b1, 0x7efa, 0x47af, 0x802e, 0x8045, 0x8043, 0x8051, 0x804c, 0x8073, 0x8047, 0x804b, 0x804f, 0x47f4, 0x8044, 0x804d, 0x804e, 0x804a, 0x8041, 0x8052, 0x809f, 0x8054, 0x8059, 0x80a2, 0x824b, 0x8248, 0x830d, 0x831f, 0x8308, 0x830e, 0x831d, 0x8304, 0x8418, 0x841b, 0x8566, 0x8562, 0x8583, 0x8567, 0x8762, 0x874f, 0x874e, 0x8767, 0x8753, 0x874d, 0x874c, 0x8768, 0x8751, 0x48dc, 0x8758, 0x875b, 0x8750, 0x876a, 0x8839, 0x8838, 0x8982, 0x8984, 0x8986, 0x8c80, 0x8c86, 0x8d25, 0x8d11, 0x4999, 0x8d0e, 0x8d15, 0x8d0f, 0x8d18, 0x8d0d, 0x8d13, 0x8d16, 0x8d19, 0x8f08, 0x8ef7, 0x8efb, 0x8efc, 0x8fb4, 0x8fbe, 0x8fc1, 0x90a6, 0x90a5, 0x90a2, 0x90a4, 0x9212, 0x920e, 0x927a, 0x9278, 0x927d, 0x927e, 0x9281, 0x9283, 0x9280, 0x9282, 0x939b, 0x9399, 0x939c, 0x939a, 0x93a1, 0x941a, 0x941c, 0x948a, 0x9479, 0x9473, 0x9475, 0x947c, 0x9478, 0x9460, 0x9483, 0x9470, 0x4ab6, 0x4abd, 0x9487, 0x9484, 0x947b, 0x947e, 0x9474, 0x95b9, 0x95b8, 0x95b7, 0x95b5, 0x96cc, 0x96ce, 0x96d1, 0x9904, 0x96cb, 0x999b, 0x987e, 0x987a, 0x9877, 0x988c, 0x98e1, 0x9a20, 0x9a1e, 0x9ac2, 0x9b0f, 0x9b00, 0x4bf4, 0x9b10, 0x9c0d, 0x9c0e, 0x9c8e, 0x9c8d, 0x9c8a, 0x9c8b, 0x9c8c, 0x9c8f, 0x9d57, 0x4c35, 0x9d55, 0x9d5b, 0x9fac, 0x9fa7, 0x9fa0, 0x9f9e, 0x4caa, 0xa28d, 0x4d1f, 0xa393, 0xa394, 0xa392, 0x0181, 0x03d6, 0x03c3, 0x03e4, 0x03e2, 0x0409, 0x03bf, 0x03c8, 0x03c7, 0x04b5, 0x04b2, 0x060c, 0x060b, 0x060a, 0x0605, 0x07d3, 0x07e6, 0x07e9, 0x07f0, 0x07ea, 0x07e7, 0x08b1, 0x08b3, 0x08b4, 0x08b0, 0x095c, 0x095d, 0x095e, 0x09c0, 0x0aaf, 0x3550, 0x0b86, 0x0b83, 0x0b84, 0x0f5c, 0x0f70, 0x0f8c, 0x0f7b, 0x0f66, 0x0f79, 0x0f63, 0x0fc5, 0x0f6b, 0x0f6d, 0x0f72, 0x0f69, 0x0f75, 0x0f89, 0x0fc6, 0x0fa5, 0x03e7, 0x0f6a, 0x0f97, 0x145a, 0x145c, 0x1459, 0x1424, 0x1425, 0x1430, 0x1458, 0x1431, 0x1576, 0x15c1, 0x1685, 0x167d, 0x1865, 0x1887, 0x1852, 0x1854, 0x188a, 0x1850, 0x1886, 0x184f, 0x1868, 0x199d, 0x1aa0, 0x1aba, 0x1abd, 0x1ab8, 0x1ba6, 0x377b, 0x1cde, 0x1cd8, 0x1cd1, 0x1f13, 0x3809, 0x1f0e, 0x1f1b, 0x1f3a, 0x3807, 0x1f1c, 0x1f12, 0x1f16, 0x1f1a, 0x1448, 0x214b, 0x2137, 0x2136, 0x2138, 0x213a, 0x2149, 0x213c, 0x214a, 0x22b1, 0x22c2, 0x22b5, 0x22c4, 0x22b6, 0x241e, 0x241f, 0x24af, 0x256b, 0x256f, 0x2792, 0x27e4, 0x282c, 0x27ef, 0x6184, 0x284f, 0x2852, 0x2850, 0x283a, 0x2837, 0x2847, 0x2864, 0x2840, 0x283c, 0x2845, 0x2841, 0x29f3, 0x39bb, 0x2cc1, 0x2cb4, 0x3a4b, 0x2d2a, 0x2d22, 0x2d29, 0x3a4d, 0x2d3e, 0x2d3c, 0x2d30, 0x2fc7, 0x2fd5, 0x2fd6, 0x2fd3, 0x2fce, 0x2fc8, 0x305c, 0x305f, 0x3062, 0x3ac2, 0x30bd, 0x30bf, 0x325c, 0x32b6, 0x3b1a, 0x329d, 0x327f, 0x3b12, 0x3294, 0x3281, 0x3347, 0x3346, 0x3b3c, 0x3394, 0x3675, 0x361a, 0x362a, 0x3632, 0x3617, 0x3623, 0x3674, 0x3bc3, 0x3676, 0x362e, 0x3625, 0x3620, 0x3671, 0x3616, 0x3670, 0x362c, 0x362f, 0x361f, 0x3664, 0x3bc0, 0x3908, 0x3914, 0x390a, 0x390b, 0x3a4f, 0x3a59, 0x3a54, 0x3a51, 0x3ab6, 0x3bec, 0x3bed, 0x3bea, 0x3eee, 0x3f5a, 0x3f73, 0x3f65, 0x3f61, 0x3f55, 0x3f6b, 0x3f64, 0x3f5b, 0x3f4c, 0x3f6f, 0x3f84, 0x3f70, 0x435d, 0x4357, 0x4366, 0x4353, 0x4398, 0x4397, 0x4528, 0x45eb, 0x45ea, 0x45e8, 0x45ec, 0x45ef, 0x46d1, 0x46ca, 0x729f, 0x46cf, 0x46cd, 0x46ce, 0x4870, 0x4867, 0x4873, 0x486d, 0x4876, 0x4879, 0x486a, 0x488b, 0x4872, 0x4871, 0x486e, 0x487a, 0x4a16, 0x4a39, 0x4a3b, 0x4b10, 0x4b96, 0x4b7b, 0x4b7c, 0x4b7d, 0x4cbe, 0x4e5c, 0x4e38, 0x4e39, 0x4e2e, 0x4e34, 0x4e32, 0x4e5b, 0x4e33, 0x4e3c, 0x3fe5, 0x500e, 0x500f, 0x5010, 0x5087, 0x525b, 0x5253, 0x405f, 0x525c, 0x523f, 0x5259, 0x524a, 0x5244, 0x524c, 0x5240, 0x525f, 0x525e, 0x524e, 0x5254, 0x5243, 0x5287, 0x5382, 0x5385, 0x5531, 0x5547, 0x552e, 0x552f, 0x5548, 0x5534, 0x4118, 0x059f, 0x5832, 0x5836, 0x5833, 0x5831, 0x5840, 0x5841, 0x59dd, 0x59d2, 0x59d9, 0x41ad, 0x59df, 0x59db, 0x59d8, 0x59d3, 0x59de, 0x59e0, 0x59d4, 0x59d7, 0x59da, 0x5aa7, 0x5bfe, 0x5bdd, 0x5c40, 0x5be2, 0x421e, 0x5bd6, 0x5bde, 0x5bef, 0x4227, 0x5beb, 0x5bea, 0x5be4, 0x5bd1, 0x4218, 0x5bec, 0x5bfa, 0x5bd9, 0x5bf3, 0x5be1, 0x5bdc, 0x5be5, 0x5bdf, 0x5bd4, 0x4220, 0x5c05, 0x5ed6, 0x5ed5, 0x5ed0, 0x5ec8, 0x5ec4, 0x5ec9, 0x5ecd, 0x5ed2, 0x5ecc, 0x5eca, 0x60a0, 0x6092, 0x42f4, 0x4302, 0x608b, 0x60a1, 0x6095, 0x6088, 0x6086, 0x608d, 0x6085, 0x6091, 0x6089, 0x60a2, 0x62f0, 0x62f3, 0x62f4, 0x62ef, 0x6306, 0x63a2, 0x645e, 0x6463, 0x6460, 0x645b, 0x647b, 0x6458, 0x6459, 0x645d, 0x6505, 0x6506, 0x6502, 0x6503, 0x6504, 0x65a2, 0x65a7, 0x65a6, 0x65a4, 0x65ac, 0x65a9, 0x67e7, 0x6801, 0x67df, 0x67d9, 0x67e3, 0x680f, 0x691a, 0x6945, 0x6948, 0x697b, 0x6985, 0x6986, 0x69fe, 0x69ff, 0x6a64, 0x6a71, 0x6a72, 0x6a61, 0x6a62, 0x6a6c, 0x6a60, 0x6a5d, 0x6a63, 0x6a67, 0x6e01, 0x6e2a, 0x6e30, 0x6e06, 0x6e7d, 0x6e22, 0x6eb9, 0x6e0a, 0x6e10, 0x6d8f, 0x6e80, 0x6e13, 0x6e2e, 0x6e18, 0x6e17, 0x6e1a, 0x6e14, 0x6e47, 0x6e63, 0x6e38, 0x4524, 0x6e7f, 0x6e21, 0x6e37, 0x6e31, 0x6e1b, 0x6ea5, 0x6f6c, 0x71d3, 0x7388, 0x736e, 0x735c, 0x7374, 0x7354, 0x7383, 0x8770, 0x7365, 0x7360, 0x7370, 0x736f, 0x736d, 0x7372, 0x736c, 0x7376, 0x7375, 0x7359, 0x73c7, 0x75c1, 0x75f9, 0x76e3, 0x76e7, 0x76d6, 0x76cf, 0x76da, 0x76e9, 0x76d2, 0x7855, 0x784f, 0x784d, 0x7851, 0x7856, 0x78f9, 0x78f8, 0x7906, 0x7903, 0x7909, 0x78f7, 0x78f5, 0x7a47, 0x7a45, 0x7a3e, 0x7a46, 0x7a29, 0x7a34, 0x7a3f, 0x7a44, 0x7a35, 0x7a5a, 0x7a2a, 0x7a33, 0x7a37, 0x7a43, 0x7a39, 0x7a30, 0x7a5d, 0x7a32, 0x7a27, 0x7bbd, 0x7bba, 0x7bbc, 0x7bf1, 0x7bf0, 0x7c61, 0x7c5c, 0x7c58, 0x7c5d, 0x7cda, 0x7cd9, 0x7cdd, 0x7cdc, 0x7cde, 0x477d, 0x7da0, 0x7da2, 0x7f0f, 0x7f13, 0x7f12, 0x7f11, 0x7f14, 0x7f19, 0x7f0e, 0x7f17, 0x7f21, 0x7f20, 0x7f16, 0x8078, 0x8e37, 0x8087, 0x8079, 0x8080, 0x8077, 0x8081, 0x8046, 0x807a, 0x809c, 0x8083, 0x8084, 0x80ad, 0x809d, 0x809e, 0x8255, 0x8336, 0x832b, 0x8327, 0x8346, 0x832c, 0x8345, 0x8333, 0x832d, 0x8334, 0x8322, 0x4864, 0x841f, 0x85b3, 0x858c, 0x858f, 0x85af, 0x85ad, 0x858e, 0x85ac, 0x85b0, 0x85b1, 0x85ae, 0x8599, 0x86eb, 0x8774, 0x8775, 0x878e, 0x876d, 0x8770, 0x878c, 0x884f, 0x8851, 0x8858, 0x884c, 0x884e, 0x8915, 0x89be, 0x89db, 0x89b3, 0x89ae, 0x8c87, 0x8c8a, 0x8c88, 0x8c8b, 0x8c8c, 0x8d44, 0x8d2d, 0x8d2a, 0x8d31, 0x8d2c, 0x8d45, 0x8d30, 0x8d29, 0x8d46, 0x8ef4, 0x8f14, 0x8f10, 0x8f0f, 0x8f12, 0x8f0b, 0x8f0c, 0x8f0a, 0x8f13, 0x8f0e, 0x8fd9, 0x8fd0, 0x9703, 0x90c1, 0x90bf, 0x90bd, 0x90bc, 0x90ba, 0x90bb, 0x90d1, 0x90be, 0x90d0, 0x90b9, 0x921a, 0x921c, 0x921b, 0x9291, 0x9296, 0x929f, 0x929c, 0x929a, 0x929d, 0x93ad, 0x93a5, 0x93ae, 0x9403, 0x9426, 0x9420, 0x9423, 0x9424, 0x9421, 0x9428, 0x9425, 0x941e, 0x9494, 0x9493, 0x948f, 0x949a, 0x94ad, 0x4ac2, 0x95ca, 0x95c5, 0x96bb, 0x96e1, 0x96ea, 0x96e4, 0x96ed, 0x96e6, 0x96e0, 0x96e8, 0x96e5, 0x981a, 0x9894, 0x9896, 0x989e, 0x9895, 0x98a1, 0x988e, 0x989b, 0x9892, 0x9897, 0x9899, 0x9893, 0x9a32, 0x9a2f, 0x9a2e, 0x9a33, 0x9b1c, 0x9b1e, 0x9b11, 0x9b20, 0x9b1f, 0x9b19, 0x9b16, 0x9cac, 0x9cb9, 0x9cb3, 0x9ca6, 0x9ca2, 0x9ca9, 0x9ca7, 0x9d6c, 0x9d6d, 0x9d69, 0x9d80, 0x9d66, 0x9d65, 0x9d71, 0x9d6b, 0x9fbd, 0x9fc1, 0x9fd3, 0x9fb6, 0x4cac, 0x9fb9, 0x9fd4, 0x9fb7, 0x9fdb, 0x9fb8, 0x9fc0, 0x9fbc, 0x9fd5, 0x9fbf, 0x9fc3, 0x9fc9, 0xa258, 0xa290, 0xa295, 0xa297, 0xa309, 0xa308, 0xa306, 0xa305, 0xa310, 0xa397, 0xa395, 0xa3ee, 0xa41f, 0xfa1a, 0x1b4b, 0x018e, 0x03e8, 0x03f0, 0x03f4, 0x0406, 0x03ed, 0x349b, 0x03e9, 0x0400, 0x04b8, 0x056d, 0x0804, 0x0801, 0x0803, 0x0802, 0x52f6, 0x3526, 0x0962, 0x0aba, 0x0b13, 0x0fde, 0x0fd7, 0x0fe4, 0x0fce, 0x0fe3, 0x0fdd, 0x103a, 0x0fdb, 0x0fd6, 0x0fe0, 0x0fd4, 0x0fcb, 0x0fe1, 0x0fc9, 0x0fdf, 0x103c, 0x0ffc, 0x0fcf, 0x1479, 0x1476, 0x1478, 0x1687, 0x189c, 0x18b1, 0x18c1, 0x189a, 0x1892, 0x41af, 0x18c2, 0x1896, 0x18c0, 0x1891, 0x1895, 0x19a2, 0x1ac3, 0x1ac0, 0x1ac2, 0x0b8a, 0x1bb0, 0x1c16, 0x1f46, 0x1f4a, 0x1f3e, 0x1f45, 0x1f42, 0x3815, 0x1f5b, 0x1f44, 0x2004, 0x4022, 0x2155, 0x2157, 0x2151, 0x214e, 0x215a, 0x22c6, 0x22c3, 0x389c, 0x22c5, 0x22cc, 0x2371, 0x2426, 0x24b2, 0x257a, 0x2584, 0x257b, 0x2874, 0x288c, 0x2851, 0x2848, 0x288d, 0x2892, 0x2898, 0x2893, 0x28b0, 0x284e, 0x2896, 0x2897, 0x289c, 0x28ca, 0x2d33, 0x2d83, 0x2d84, 0x2d9a, 0x2d8c, 0x64cc, 0x2d99, 0x2ee0, 0x2fe4, 0x2ff8, 0x2fed, 0x2ff3, 0x2ff4, 0x2ff5, 0x2ffd, 0x3119, 0x329e, 0x32c4, 0x329f, 0x339b, 0x339f, 0x339a, 0x36aa, 0x369d, 0x3692, 0x36a2, 0x36af, 0x36eb, 0x36a0, 0x36a1, 0x3694, 0x3698, 0x368f, 0x3687, 0x3684, 0x36a9, 0x367c, 0x3918, 0x3a5f, 0x3a62, 0x3a61, 0x3ac0, 0x3b15, 0x3bfc, 0x3bf9, 0x3fc8, 0x3fc9, 0x3fde, 0x3fca, 0x3fe2, 0x3d64, 0x3d6e, 0x4004, 0x3fcc, 0x3fdd, 0x3fe4, 0x3fd3, 0x3fc7, 0x3fc6, 0x3d5f, 0x4037, 0x43d8, 0x43ee, 0x43b2, 0x43a3, 0x43b3, 0x43ed, 0x43f8, 0x4531, 0x455b, 0x4566, 0x4569, 0x4596, 0x459b, 0x45f7, 0x45f3, 0x45f4, 0x45f5, 0x46e2, 0x46e7, 0x46e5, 0x46e9, 0x46e6, 0x46e3, 0x4874, 0x487f, 0x488f, 0x4890, 0x4897, 0x48a3, 0x488e, 0x4898, 0x488c, 0x4a42, 0x4a44, 0x4a69, 0x4a43, 0x4a68, 0x3ef6, 0x4b8d, 0x4b88, 0x4b8b, 0x4b89, 0x4ccc, 0x4d1f, 0x4e80, 0x4e5e, 0x4e67, 0x4e68, 0x4e65, 0x764a, 0x4e74, 0x4e69, 0x4e61, 0x4e62, 0x4e6c, 0x4e93, 0x4e86, 0x4f9d, 0x4f9b, 0x501b, 0x5016, 0x5019, 0x5014, 0x5018, 0x5015, 0x5099, 0x5098, 0x525d, 0x5289, 0x527a, 0x527d, 0x524b, 0x4073, 0x5278, 0x527f, 0x5277, 0x527e, 0x5279, 0x52ab, 0x527c, 0x5274, 0x5275, 0x52a7, 0x538d, 0x554e, 0x5566, 0x5561, 0x554d, 0x554f, 0x40dd, 0x5554, 0x557c, 0x56da, 0x56de, 0x56d8, 0x56dd, 0x56df, 0x5866, 0x5862, 0x585f, 0x5864, 0x5863, 0x5860, 0x5888, 0x586a, 0x5867, 0x5887, 0x583f, 0x586c, 0x586e, 0x58ad, 0x59f1, 0x59f4, 0x59f6, 0x59f5, 0x59f8, 0x59fb, 0x59ec, 0x59ef, 0x59ed, 0x7ab9, 0x59f7, 0x59f9, 0x59fd, 0x5ab1, 0x5c36, 0x5c1b, 0x5c32, 0x5c42, 0x5c4d, 0x5c1f, 0x5c21, 0x5c1c, 0x5c31, 0x5c2e, 0x5c47, 0x5c3b, 0x5c41, 0x5c18, 0x5c39, 0x5c1d, 0x5c27, 0x5c23, 0x7bd7, 0x5eee, 0x5ee8, 0x5ee5, 0x5eef, 0x5ee4, 0x5eec, 0x5ef0, 0x60d7, 0x60d8, 0x60d4, 0x60ca, 0x60d2, 0x60cb, 0x60d3, 0x60e6, 0x60e2, 0x6249, 0x6248, 0x62ff, 0x6309, 0x63b0, 0x63af, 0x647c, 0x6478, 0x647a, 0x6472, 0x6479, 0x647e, 0x650c, 0x650b, 0x65cd, 0x65be, 0x65bc, 0x65bf, 0x65c0, 0x65bd, 0x6838, 0x6808, 0x6805, 0x683b, 0x6810, 0x680c, 0x680d, 0x6804, 0x683a, 0x6813, 0x6837, 0x6839, 0x691f, 0x694b, 0x69ee, 0x6a75, 0x6a78, 0x6a7c, 0x6a74, 0x6a76, 0x6aea, 0x6aeb, 0x6dfb, 0x6e19, 0x6ea7, 0x6e8c, 0x6edc, 0x6e98, 0x6ebe, 0x6e9e, 0x6f0f, 0x6e9f, 0x6edd, 0x6e93, 0x6ebb, 0x6eb6, 0x6e90, 0x6ea1, 0x6ebd, 0x6ede, 0x6e3a, 0x6f22, 0x6e97, 0x6e94, 0x6ec3, 0x6e8e, 0x6ea8, 0x6e99, 0x6ead, 0x6e9b, 0x6ea2, 0x6f21, 0x6eac, 0x6f0e, 0x6f31, 0x71e1, 0x71de, 0x71df, 0x71dc, 0x71dd, 0x71ec, 0x71e7, 0x7369, 0x73b8, 0x73a1, 0x73a8, 0x73ba, 0x73c2, 0x73a6, 0x73a4, 0x73a3, 0x73ab, 0x73bc, 0x73b7, 0x73bf, 0x73ad, 0x73b1, 0x73ca, 0x73c4, 0x73b9, 0x75c8, 0x75c6, 0x75c7, 0x770a, 0x770d, 0x76fb, 0x7703, 0x7702, 0x76fc, 0x76f9, 0x76f8, 0x786e, 0x7863, 0x7862, 0x7861, 0x786b, 0x4688, 0x786f, 0x7866, 0x786c, 0x790e, 0x7915, 0x7916, 0x7910, 0x7917, 0x7911, 0x7a6e, 0x7a6c, 0x7a87, 0x7a83, 0x7a63, 0x7adc, 0x7bc0, 0x7bf7, 0x7bfa, 0x7c70, 0x7c6a, 0x7c68, 0x7c69, 0x7c84, 0x7cec, 0x7ce7, 0x7cee, 0x7dba, 0x7db2, 0x7db5, 0x7dcb, 0x080b, 0x7dd0, 0x7e6d, 0x7e6c, 0x47bb, 0x7f45, 0x7f46, 0x7f34, 0x7f2c, 0x7f35, 0x7f44, 0x47ba, 0x7f76, 0x80b1, 0x80aa, 0x80a1, 0x80b2, 0x4812, 0x80a6, 0x80b5, 0x80b4, 0x80b8, 0x80af, 0x80b0, 0x80a3, 0x8262, 0x8264, 0x8356, 0x8351, 0x834f, 0x8368, 0x834c, 0x8350, 0x4861, 0x8348, 0x834a, 0x8421, 0x85e3, 0x85b9, 0x85de, 0x85b7, 0x85e1, 0x85b6, 0x85b5, 0x85df, 0x48e1, 0x8797, 0x879a, 0x879b, 0x8798, 0x8792, 0x8793, 0x87d7, 0x8773, 0x886b, 0x8874, 0x8878, 0x886d, 0x8918, 0x89e9, 0x89f5, 0x89ea, 0x8a2e, 0x89e7, 0x89fe, 0x89e5, 0x8a36, 0x89f0, 0x89e6, 0x8a2c, 0x8c89, 0x8c95, 0x8c93, 0x8d4d, 0x8d4a, 0x8d4f, 0x8d50, 0x8d4b, 0x8f2a, 0x8f2b, 0x8f2f, 0x8f2e, 0x8f7c, 0x8fed, 0x8fe2, 0x90e0, 0x90dc, 0x90da, 0x90d6, 0x90f4, 0x90d9, 0x90d5, 0x9222, 0x9221, 0x9224, 0x9225, 0x9226, 0x9223, 0x92aa, 0x92af, 0x92b0, 0x92ab, 0x93af, 0x93b7, 0x93b5, 0x93b2, 0x93b3, 0x942b, 0x94d8, 0x94c2, 0x94af, 0x94bc, 0x94b8, 0x94be, 0x94b7, 0x94b4, 0x94bf, 0x94b3, 0x94b1, 0x94bb, 0x94bd, 0x94d6, 0x94dd, 0x95d8, 0x95d3, 0x95d5, 0x95e3, 0x95e2, 0x95d9, 0x95de, 0x95df, 0x95da, 0x95d4, 0x96f3, 0x96e2, 0x970d, 0x9701, 0x9705, 0x971a, 0x9703, 0x971f, 0x9716, 0x96fa, 0x96fc, 0x970a, 0x999f, 0x98bc, 0x98ca, 0x98b6, 0x98c7, 0x98bf, 0x4b89, 0x98b9, 0x4b8c, 0x98b0, 0x98b8, 0x98bd, 0x9891, 0x98bb, 0x98be, 0x9a3e, 0x9a3d, 0x9b38, 0x9b3d, 0x9b39, 0x9b33, 0x9c33, 0x9cbb, 0x9cc6, 0x9cc5, 0x9cc7, 0x9ccb, 0x9ca8, 0x9cc8, 0x9cbe, 0x9cc1, 0x9cbd, 0x9d82, 0x9d9e, 0x9d81, 0x9d84, 0x9b8d, 0x9d96, 0x9d8e, 0x9d88, 0x9d87, 0x9fe0, 0xa00d, 0x9fdf, 0x9fe4, 0x9fe2, 0x9fdd, 0x9fec, 0x9fde, 0x9fe7, 0x9fea, 0x9fe3, 0xa25c, 0x9e77, 0xa25d, 0xa29c, 0xa31d, 0xa39d, 0xa39e, 0xa39b, 0xa3b5, 0xa3b9, 0xa3b6, 0xa3f3, 0xa3f2, 0xa3f4, 0xa426, 0xa427, 0xa425, 0xa506, 0xa50b, 0xa53a, 0xa53c, 0x040a, 0x040b, 0x04bf, 0x04fd, 0x0618, 0x91df, 0x5390, 0x069e, 0x07fc, 0x0810, 0x080f, 0x080d, 0x08b9, 0x08b7, 0x08ba, 0x090a, 0x1041, 0x108b, 0x1046, 0x1053, 0x10e2, 0x103f, 0x0f7c, 0x104b, 0x104e, 0x108a, 0x1047, 0x1493, 0x7dce, 0x148c, 0x14af, 0x14c9, 0x15c6, 0x15c8, 0x1691, 0x18cf, 0x18d4, 0x18ce, 0x1add, 0x1ad4, 0x1f49, 0x1f63, 0x1f5d, 0x381a, 0x1f67, 0x1fbb, 0x1f60, 0x1f80, 0x215f, 0x2160, 0x22da, 0x22d2, 0x22dd, 0x258e, 0x2588, 0x256c, 0x289e, 0x28c9, 0x28a4, 0x3998, 0x28d9, 0x28d2, 0x28da, 0x28dd, 0x28ce, 0x28fc, 0x2a14, 0x2a60, 0x2dd7, 0x2dcb, 0x2dcd, 0x2dd5, 0x2ee7, 0x3000, 0x300a, 0x300f, 0x3002, 0x3001, 0x311d, 0x32ca, 0x32cb, 0x32cd, 0x334f, 0x339c, 0x3680, 0x370d, 0x3702, 0x3bf1, 0x3707, 0x36f7, 0x36f8, 0x36fd, 0x3724, 0x36fb, 0x3739, 0x373a, 0x3922, 0x6ba9, 0x3a6a, 0x3a6d, 0x3a74, 0x3c0e, 0x3fdf, 0x402b, 0x3fe3, 0x4026, 0x402a, 0x4023, 0x4035, 0x404a, 0x43fd, 0x4400, 0x441e, 0x43ff, 0x459e, 0x45fa, 0x46f1, 0x4895, 0x48a8, 0x48a6, 0x4a6e, 0x4a83, 0x4a6d, 0x4b8f, 0x3f6a, 0x4cdf, 0x4cd5, 0x4ce0, 0x4cd3, 0x4cd8, 0x4e8c, 0x764b, 0x4e94, 0x4e96, 0x4e85, 0x4e8f, 0x4ea9, 0x4e8e, 0x4e90, 0x4eb8, 0x4ec3, 0x4ebb, 0x4fa5, 0x4fa2, 0x76a2, 0x4fa3, 0x50b5, 0x50ac, 0x50a8, 0x52ad, 0x52b8, 0x52b4, 0x52ae, 0x52b6, 0x4485, 0x52c1, 0x52bf, 0x5392, 0x5400, 0x5401, 0x5575, 0x5572, 0x5578, 0x5570, 0x557e, 0x557d, 0x557f, 0x56ef, 0x586d, 0x588e, 0x588f, 0x588a, 0x588d, 0x5895, 0x588b, 0x588c, 0x58b0, 0x5893, 0x59fc, 0x5a15, 0x5a0e, 0x5a18, 0x5a11, 0x5a0d, 0x5abb, 0x5ab3, 0x4239, 0x5ca1, 0x5c9a, 0x5c84, 0x5ca0, 0x5c86, 0x5c9d, 0x5caa, 0x5c78, 0x5c8d, 0x5c8a, 0x5ca6, 0x5c7a, 0x5c97, 0x5c88, 0x5c8e, 0x423d, 0x4244, 0x5c76, 0x5c81, 0x5c85, 0x5c75, 0x5ca8, 0x5c8f, 0x5c91, 0x5ca2, 0x5c9c, 0x5c89, 0x5c7f, 0x5c96, 0x5c79, 0x5c9f, 0x5ca7, 0x4246, 0x5c87, 0x5c9b, 0x5ca5, 0x5c8b, 0x5cc9, 0x5eff, 0x5f03, 0x5f00, 0x5f02, 0x5f04, 0x5f05, 0x5ee6, 0x5f1f, 0x6114, 0x430e, 0x610c, 0x610f, 0x6119, 0x610b, 0x6113, 0x60d5, 0x4310, 0x611c, 0x6250, 0x624e, 0x6312, 0x63b9, 0x6485, 0x6488, 0x6490, 0x6513, 0x65d0, 0x65d1, 0x65d2, 0x65d7, 0x65d6, 0x65e5, 0x6846, 0x686b, 0x6845, 0x683f, 0x683e, 0x443e, 0x686a, 0x6868, 0x684c, 0x6923, 0x6922, 0x6997, 0x6991, 0x5ab5, 0x6998, 0x699c, 0x6a89, 0x4484, 0x6a8b, 0x6a8a, 0x6a8d, 0x6a8e, 0x6a88, 0x6f4e, 0x6f44, 0x6f37, 0x6f75, 0x6f54, 0x6f76, 0x6f34, 0x6f6b, 0x6f32, 0x6f57, 0x6f52, 0x6f45, 0x4549, 0x6eb1, 0x6f4b, 0x6f47, 0x6f33, 0x6f40, 0x6f3c, 0x6f43, 0x6f4f, 0x6f55, 0x6f41, 0x6fb2, 0x6fc0, 0x7434, 0x73f9, 0x7419, 0x740d, 0x73fa, 0x741e, 0x741f, 0x740e, 0x7440, 0x7408, 0x45df, 0x7413, 0x744c, 0x45f0, 0x75cc, 0x75cb, 0x7724, 0x7725, 0x773d, 0x7720, 0x7727, 0x7726, 0x771d, 0x771e, 0x7732, 0x776c, 0x7759, 0x468a, 0x787a, 0x7879, 0x791b, 0x792e, 0x7923, 0x7920, 0x791f, 0x7ab6, 0x7ab9, 0x7aa1, 0x7aa3, 0x7aa8, 0x7aaf, 0x7a9a, 0x7a99, 0x7aa2, 0x7a9d, 0x4702, 0x7aab, 0x7bc9, 0x7bfe, 0x7c00, 0x7bfc, 0x7c07, 0x7c75, 0x7c72, 0x7c73, 0x7c74, 0x7cfa, 0x7cfc, 0x7cf8, 0x7cf6, 0x7cfb, 0x7dcd, 0x7dd1, 0x7dcf, 0x7e74, 0x7e72, 0x7e73, 0x7f54, 0x7f51, 0x47c0, 0x7f53, 0x7f49, 0x7f4c, 0x7f4a, 0x7f4f, 0x7f56, 0x8100, 0x80d5, 0x80d7, 0x80ff, 0x80d9, 0x80e3, 0x80d3, 0x4815, 0x80d8, 0x80d4, 0x80de, 0x8271, 0x8374, 0x8388, 0x837f, 0x836b, 0x8387, 0x8379, 0x8378, 0x8389, 0x8380, 0x8376, 0x8429, 0x8428, 0x842f, 0x85e5, 0x8604, 0x8603, 0x85f0, 0x85e8, 0x85ea, 0x85f1, 0x8601, 0x8602, 0x87a9, 0x87ab, 0x87b7, 0x87b6, 0x48e2, 0x88a0, 0x888e, 0x8886, 0x8887, 0x8885, 0x888b, 0x8888, 0x8890, 0x891a, 0x8934, 0x8a37, 0x8a2f, 0x8a30, 0x8a39, 0x8a34, 0x8a33, 0x8a85, 0x8a84, 0x8a3a, 0x8c9f, 0x8d69, 0x8d6c, 0x8d6a, 0x8d67, 0x8d6b, 0x8f3f, 0x8f40, 0x900b, 0x90d2, 0x90f8, 0x9101, 0x90fa, 0x9116, 0xf9f6, 0x922c, 0x922d, 0x922f, 0x922e, 0x92c1, 0x92f5, 0x92c4, 0x92de, 0x92cc, 0x92d2, 0x92c2, 0x92cd, 0x92cf, 0x92dd, 0x92c8, 0x93ba, 0x93be, 0x93bf, 0x942e, 0x9430, 0x94e7, 0x94ee, 0x94e8, 0x94e6, 0x94e2, 0x94e4, 0x94fb, 0x94fc, 0x94ea, 0x95ed, 0x95f6, 0x95f3, 0x95f4, 0x95f1, 0x95f7, 0x95f5, 0x95ea, 0x95eb, 0x9700, 0x972c, 0x9712, 0x973d, 0x9733, 0x4b4d, 0x9730, 0x9740, 0x9731, 0x9757, 0x4b4a, 0x9735, 0x9732, 0x972d, 0x9736, 0x9738, 0x9762, 0x975f, 0x978a, 0x98d6, 0x98d8, 0x98dd, 0x98e4, 0x98e3, 0x9a4d, 0x9ad7, 0x9b4a, 0x9b4c, 0x9b50, 0x9b4b, 0x9b4e, 0x9b4f, 0x9c39, 0x9cd2, 0x9ccd, 0x9cd3, 0x9ce1, 0x9cce, 0x9cd5, 0x9cdd, 0x9cd4, 0x9ccf, 0x9dcb, 0x9da6, 0x9dc2, 0x9da5, 0x9da9, 0x9da2, 0x9da4, 0x9db0, 0x9dcc, 0x9daf, 0x9dbf, 0xa024, 0xa01a, 0xa014, 0xa03a, 0xa020, 0xa01b, 0xa021, 0xa025, 0xa01e, 0xa03f, 0xa040, 0xa018, 0xa02c, 0xa015, 0xa02d, 0xa01f, 0xa029, 0xa04b, 0xa2b3, 0xa2a5, 0xa2a7, 0xa2ab, 0xa2a6, 0xa2aa, 0xa322, 0xa323, 0xa3a1, 0xa3a3, 0xa3a0, 0xa3bd, 0xa3ba, 0xa3fa, 0xa3f8, 0xa3fc, 0xa3f6, 0xa434, 0xa443, 0x4d63, 0xa4d4, 0xa50d, 0xa543, 0xa541, 0xa53d, 0xa540, 0xa53e, 0xa53f, 0xa546, 0x4d93, 0xa5d4, 0x0435, 0x0436, 0x0432, 0x043a, 0x04c8, 0x0536, 0x061e, 0x061d, 0x061f, 0x081c, 0x081d, 0x0820, 0x350e, 0x08c0, 0x109a, 0x1093, 0x10dd, 0x360a, 0x10a3, 0x10a9, 0x109c, 0x109b, 0x360d, 0x1097, 0x14b1, 0x14ca, 0x14b3, 0x14cd, 0x18ea, 0x18ee, 0x18ef, 0x1adf, 0x1b50, 0x1bbb, 0x1f88, 0x1f89, 0x1f8c, 0x1f85, 0x1f5e, 0x1f94, 0x1f95, 0x216b, 0x216a, 0x2169, 0x22e3, 0x22f1, 0x2437, 0x2433, 0x2591, 0x258f, 0x2597, 0x28d4, 0x28de, 0x28d3, 0x28e0, 0x2943, 0x290b, 0x28ff, 0x2904, 0x2907, 0x2df9, 0x2dfa, 0x2dfb, 0x2df8, 0x3012, 0x3010, 0x311f, 0x32df, 0x32e3, 0x3352, 0x33a9, 0x3765, 0x3787, 0x3742, 0x3752, 0x374c, 0x369f, 0x3701, 0x3748, 0x374f, 0x377e, 0x374d, 0x3758, 0x3747, 0x375e, 0x3749, 0x374e, 0x375d, 0x375a, 0x3786, 0x3751, 0x3929, 0x39a6, 0x39a7, 0x3a70, 0x3a6f, 0x3ad3, 0x3ad2, 0x3c28, 0x3c1b, 0x3c1a, 0x3c1c, 0x3c21, 0x4032, 0x4066, 0x407d, 0x4073, 0x407f, 0x4065, 0x4080, 0x4061, 0x4075, 0x406e, 0x4067, 0x4071, 0x406c, 0x4063, 0x4062, 0x4083, 0x40b2, 0x4081, 0x406f, 0x406b, 0x4082, 0x408a, 0x4429, 0x4430, 0x4431, 0x4597, 0x4600, 0x45ff, 0x48b6, 0x48b5, 0x48c3, 0x4a8d, 0x4b18, 0x4b9c, 0x4b9a, 0x4b99, 0x4eb7, 0x4ec4, 0x4ec6, 0x4ec7, 0x4ebc, 0x4ec0, 0x4ec5, 0x4ecd, 0x4ec1, 0x4ebe, 0x4fa7, 0x4fb8, 0x5023, 0x4074, 0x52e8, 0x52de, 0x52e3, 0x52ef, 0x52dc, 0x52e4, 0x52e1, 0x52e5, 0x5395, 0x5394, 0x5393, 0x538e, 0x5598, 0x559c, 0x5599, 0x55a0, 0x559e, 0x5704, 0x58d3, 0x58b4, 0x58bb, 0x58b7, 0x58b8, 0x58bd, 0x58b6, 0x58b9, 0x58b5, 0x5a22, 0x5a21, 0x5ac3, 0x5abc, 0x5cff, 0x5ce5, 0x5cf7, 0x5cd2, 0x5d00, 0x5cdb, 0x5cf0, 0x5ce2, 0x5ccd, 0x4256, 0x5ce1, 0x5cf2, 0x5cdc, 0x5ccc, 0x5cd6, 0x5cf3, 0x5cfa, 0x5cf6, 0x5cec, 0x5cea, 0x5ce3, 0x5cd0, 0x425a, 0x5c95, 0x5cd5, 0x5cf4, 0x5ccb, 0x5cda, 0x5cc8, 0x5cdf, 0x5cf5, 0x5ccf, 0x5cc7, 0x5cd7, 0x5f24, 0x42a3, 0x5f1c, 0x5f21, 0x5f1e, 0x5f18, 0x5f1b, 0x42a8, 0x6146, 0x614b, 0x6148, 0x6147, 0x6167, 0x6154, 0x6315, 0x6322, 0x63c5, 0x6329, 0x63c7, 0x648d, 0x651b, 0x6520, 0x65e2, 0x65e7, 0x65e8, 0x65e1, 0x6872, 0x687b, 0x6874, 0x6871, 0x6879, 0x6875, 0x6890, 0x6877, 0x687d, 0x694f, 0x6950, 0x69a3, 0x69a2, 0x69f4, 0x6a94, 0x6a9a, 0x6a9b, 0x6aa7, 0x6a97, 0x6a95, 0x6a92, 0x6a9c, 0x6a96, 0x6fb6, 0x6fb8, 0x6fb0, 0x7018, 0x6fc5, 0x6fb5, 0x6fc2, 0x7006, 0x7019, 0x6fb9, 0x7015, 0x6fd6, 0x6fac, 0x453c, 0x6fc6, 0x6fb3, 0x6fc3, 0x6fca, 0x6fcf, 0x6fbd, 0x6fce, 0x7014, 0x6fba, 0x701a, 0x6fc1, 0x6fbb, 0x459b, 0x459a, 0x7201, 0x71fc, 0x745a, 0x7454, 0x7461, 0x745c, 0x7455, 0x744a, 0x744b, 0x7451, 0x7469, 0x746b, 0x87f1, 0x7466, 0x7458, 0x745d, 0x7467, 0x7456, 0x7488, 0x7464, 0x744e, 0x7757, 0x775a, 0x7751, 0x774a, 0x774b, 0x465e, 0x7747, 0x776f, 0x776a, 0x776b, 0x7746, 0x776d, 0x7754, 0x776e, 0x774c, 0x7878, 0x7886, 0x7882, 0x46a7, 0x7ae1, 0x7ae5, 0x7adb, 0x7ade, 0x7ad7, 0x7c03, 0x7c7c, 0x7c7e, 0x7d05, 0x7d07, 0x7de6, 0x7de1, 0x7dfb, 0x7de5, 0x7de7, 0x7ddf, 0x7dff, 0x7e76, 0x7f63, 0x7f66, 0x7f65, 0x7f5e, 0x7f64, 0x7f6b, 0x7f5f, 0x7f67, 0x7f68, 0x8108, 0x8109, 0x8117, 0x8115, 0x811b, 0x810b, 0x8128, 0x810e, 0x8118, 0x8153, 0x8145, 0x810d, 0x810a, 0x8113, 0x814a, 0x8279, 0x83a1, 0x838d, 0x83a2, 0x8390, 0x486e, 0x8431, 0x8430, 0x861f, 0x8619, 0x860c, 0x861e, 0x861d, 0x8607, 0x8766, 0x87c5, 0x87ba, 0x87bd, 0x87c2, 0x87c3, 0x87bf, 0x490d, 0x88a1, 0x88a2, 0x88a8, 0x88a3, 0x88aa, 0x88af, 0x88b9, 0x8937, 0x8a8f, 0x4943, 0x8a8e, 0x8a87, 0x8a8a, 0x8a92, 0x8a97, 0x8a9f, 0x8b05, 0x8ca9, 0x8ca7, 0x8d8a, 0x8d82, 0x8d85, 0x8d8b, 0x8d89, 0x8d81, 0x8d80, 0x8d87, 0x8d86, 0x8f4d, 0x901c, 0x901f, 0x9121, 0x911d, 0x9122, 0x90fe, 0x911b, 0x913a, 0x9137, 0x9117, 0x9138, 0x9126, 0x9118, 0x9234, 0x9235, 0x9232, 0x4a73, 0x92e1, 0x92fd, 0x92e3, 0x92e8, 0x92f9, 0x92ff, 0x92fe, 0x4a74, 0x92e0, 0x9300, 0x4a70, 0x92ec, 0x92e4, 0x92ef, 0x92fa, 0x93ca, 0x9431, 0x9432, 0x9434, 0x9441, 0x9500, 0x9506, 0x9508, 0x9505, 0x9503, 0x950b, 0x9502, 0x950a, 0x95f0, 0x9613, 0x960a, 0x960f, 0x9611, 0x9608, 0x960b, 0x9612, 0x960d, 0x975b, 0x9763, 0x9761, 0x9768, 0x975a, 0x984e, 0x984d, 0x9850, 0x98fc, 0x9912, 0x98f5, 0x991e, 0x98f0, 0x98f3, 0x98f2, 0x9901, 0x98ef, 0x98ee, 0x9916, 0x98f6, 0x98fb, 0x991c, 0x4bdb, 0x9a5d, 0x9a60, 0x9a66, 0x9a5f, 0x9a61, 0x9a5b, 0x9a62, 0x9a57, 0x9b69, 0x9b6b, 0x9b61, 0x9b77, 0x9b5f, 0x9b63, 0x9b62, 0x9b65, 0x9cef, 0x9ce2, 0x9d00, 0x9ce8, 0x9cf2, 0x9ce7, 0x4c29, 0x9ce5, 0x9dd5, 0x9dd0, 0x9dda, 0x9dd3, 0x4c51, 0x9dd9, 0x9dcf, 0x9dd6, 0x9dd8, 0x9df5, 0x9dce, 0x9dd7, 0x9df4, 0x9dcd, 0x9e01, 0x9bba, 0xa052, 0xa055, 0xa05a, 0xa04d, 0xa054, 0xa053, 0xa05e, 0xa067, 0xa065, 0xa04e, 0x4cdb, 0xa04f, 0xa061, 0xa06e, 0xa051, 0xa05b, 0xa263, 0xa2b7, 0xa2b6, 0xa2c3, 0xa2bb, 0xa2b5, 0xa32e, 0xa330, 0xa333, 0xa331, 0xa3a4, 0xa3c1, 0xa3bb, 0xa3be, 0xa400, 0xa3ff, 0xa440, 0x4d65, 0xa43f, 0xa444, 0x4d64, 0x4d67, 0xa4db, 0xa50f, 0xa511, 0xa54e, 0xa54d, 0xa54b, 0xa54c, 0xa595, 0x043b, 0x0445, 0x0444, 0x043e, 0x043c, 0x043f, 0x04cc, 0x04ce, 0x0622, 0x0623, 0x069f, 0x08c5, 0x08c4, 0x10e9, 0x1099, 0x3611, 0x10e6, 0x10e7, 0x10f7, 0x14d2, 0x3733, 0x18fd, 0x190c, 0x190b, 0x1ced, 0x3821, 0x3822, 0x1f9b, 0x200a, 0x216f, 0x2175, 0x22f2, 0x22f8, 0x243e, 0x2924, 0x290e, 0x2916, 0x2918, 0x2910, 0x2931, 0x2944, 0x39a6, 0x2929, 0x292f, 0x294b, 0x2936, 0x39a3, 0x2e34, 0x2e00, 0x2e2b, 0x3020, 0x3021, 0x301e, 0x301d, 0x32f5, 0x32f2, 0x32f6, 0x3790, 0x379d, 0x379c, 0x3792, 0x3794, 0x37d1, 0x3793, 0x37b7, 0x3797, 0x37b0, 0x379f, 0x37c9, 0x392d, 0x392c, 0x3a77, 0x3c2c, 0x40c0, 0x40b9, 0x4453, 0x4540, 0x4702, 0x46fb, 0x3ea1, 0x4a8b, 0x4aae, 0x4aab, 0x4ba1, 0xa2cd, 0x4cea, 0x4edd, 0x4edc, 0x4ed9, 0x4fab, 0x4fac, 0x4fad, 0x4fb2, 0x502c, 0x502b, 0x50c2, 0x5300, 0x530d, 0x5306, 0x52ff, 0x5303, 0x5301, 0x5310, 0x530f, 0x5305, 0x5398, 0x5397, 0x5396, 0x5399, 0x55ac, 0x55ab, 0x5712, 0x58d8, 0x58df, 0x58d6, 0x5a2d, 0x5a32, 0x5d3f, 0x5d2f, 0x5d26, 0x5d3a, 0x5d39, 0x425f, 0x5d3b, 0x5d35, 0x5d2a, 0x5d21, 0x5d38, 0x5d37, 0x5d34, 0x425c, 0x5d22, 0x5d36, 0x5d44, 0x5f45, 0x5f3b, 0x5f36, 0x5f42, 0x617a, 0x6186, 0x618b, 0x617f, 0x6181, 0x632a, 0x63d5, 0x649f, 0x649d, 0x6526, 0x65f4, 0x65f5, 0x6815, 0x688e, 0x688f, 0x6926, 0x69a7, 0x69af, 0x6aad, 0x6aac, 0x6aab, 0x6aaa, 0x702f, 0x7021, 0x7023, 0x70a3, 0x7049, 0x703a, 0x7048, 0x702d, 0x7025, 0x7029, 0x7032, 0x7034, 0x7024, 0x702c, 0x704b, 0x703b, 0x7020, 0x7028, 0x7498, 0x45f5, 0x7497, 0x8804, 0x749d, 0x74a8, 0x75d5, 0x7777, 0x7778, 0x7772, 0x7773, 0x7802, 0x793b, 0x7afe, 0x7b0b, 0x7aff, 0x7b07, 0x4711, 0x470c, 0x7b30, 0x7bcd, 0x7bcf, 0x7c10, 0x7c0a, 0x7c83, 0x7d15, 0x7d0e, 0x7d0c, 0x7e02, 0x7dfe, 0x7e05, 0x7e15, 0x7e08, 0x7f7f, 0x7f77, 0x7f7c, 0x7f82, 0x7f7e, 0x7f78, 0x7f7d, 0x7f79, 0x7f81, 0x814b, 0x8163, 0x8164, 0x8156, 0x8154, 0x814e, 0x8110, 0x814f, 0x8157, 0x815e, 0x8151, 0x816a, 0x8169, 0x83ad, 0x83a4, 0x83ac, 0x83a9, 0x83ae, 0x044c, 0x8650, 0x8635, 0x8632, 0x87d8, 0x87d1, 0x87cf, 0x87be, 0x88d5, 0x88c1, 0x88c6, 0x88c3, 0x88c2, 0x88c0, 0x88c5, 0x88c7, 0x88bf, 0x88c4, 0x88d4, 0x8a90, 0x8ad2, 0x494e, 0x8ad4, 0x8caf, 0x8cae, 0x8cb2, 0x8cad, 0x8d9c, 0x8da0, 0x8db6, 0x8f3d, 0x8f56, 0x8f82, 0x9028, 0x902b, 0x913c, 0x913e, 0x913f, 0x9142, 0x913d, 0x9141, 0x913b, 0x9149, 0x9143, 0x9239, 0x9238, 0x9322, 0x9308, 0x930c, 0x9306, 0x9313, 0x9304, 0x9320, 0x931d, 0x9305, 0x930a, 0x93d6, 0x93d7, 0x9436, 0x9437, 0x9523, 0x9522, 0x9520, 0x951a, 0x951d, 0x961c, 0x9620, 0x9677, 0x977f, 0x978b, 0x977d, 0x9799, 0x9784, 0x9789, 0x9785, 0x9783, 0x9786, 0x979e, 0x9853, 0x9917, 0x4b94, 0x9919, 0x9920, 0x991f, 0x9923, 0x9918, 0x9921, 0x9929, 0x9924, 0x9926, 0x9a5e, 0x9a6f, 0x9a6e, 0x9a74, 0x9a72, 0x9a73, 0x9b7d, 0x9b7e, 0x9b85, 0x9b7f, 0x9b84, 0x9c44, 0x9cf5, 0x9cf8, 0x9d03, 0x9cf6, 0x9e28, 0x4c63, 0x9e39, 0x9dfb, 0x9e0e, 0x9dfd, 0x9e1f, 0x4c61, 0x9e03, 0x9bd8, 0x9e10, 0x4c5a, 0x9e0d, 0x9e27, 0x9e41, 0xa072, 0xa078, 0xa080, 0x4ce3, 0xa085, 0xa07b, 0x9d7c, 0xa07d, 0xa091, 0xa088, 0xa0aa, 0xa08d, 0xa089, 0xa095, 0xa09b, 0xa08c, 0xa09e, 0xa07c, 0xa086, 0xa084, 0xa268, 0xa2c5, 0xa2c4, 0xa2c9, 0xa2c6, 0xa342, 0xa345, 0xa341, 0xa344, 0xa3a6, 0xa3c2, 0xa442, 0xa449, 0xa448, 0xa44a, 0xa44c, 0xa44b, 0xa517, 0xa518, 0xa515, 0xa552, 0xa554, 0xa553, 0xa59a, 0xa59b, 0xa5dc, 0xa5e4, 0xa691, 0x4daf, 0xa6ba, 0x0451, 0x045b, 0x04cf, 0x3305, 0x1113, 0x1115, 0x1114, 0x1123, 0x3613, 0x1111, 0x1112, 0x3680, 0x14f0, 0x169b, 0x1912, 0x1916, 0x1917, 0x19b5, 0x1cf4, 0x1fb1, 0x2179, 0x22ff, 0x22fc, 0x22fb, 0x243f, 0x2444, 0x259d, 0x2932, 0x294c, 0x292b, 0x295a, 0x2a1f, 0x2e01, 0x2e2d, 0x2e27, 0x2e59, 0x2e5a, 0x2e4d, 0x2e58, 0x3023, 0x3025, 0x302b, 0x32ff, 0x33ae, 0x37cb, 0x37ca, 0x37d0, 0x37ce, 0x37cc, 0x37d8, 0x37c6, 0x37d2, 0x37cf, 0x37c8, 0x3b17, 0x4db0, 0x40c4, 0x9240, 0x40e9, 0x40f2, 0x40fc, 0x40ea, 0x40eb, 0x40fd, 0x4478, 0x4477, 0x4473, 0x449e, 0x4479, 0x45a2, 0x4603, 0x4704, 0x4705, 0x48ce, 0x4abf, 0x4ef6, 0x4ef7, 0x5031, 0x5030, 0x50c9, 0x50c7, 0x531c, 0x5328, 0x531a, 0x531e, 0x531b, 0x531f, 0x55bf, 0x55bb, 0x55bc, 0x55c0, 0x571a, 0x58ef, 0x58ec, 0x58e9, 0x58f0, 0x58fe, 0x5a34, 0x5d6a, 0x5d95, 0x5d6c, 0x5d72, 0x5d67, 0x5d60, 0x5d6b, 0x5d5e, 0x5d6f, 0x5d66, 0x7c46, 0x5d62, 0x5d5d, 0x5d5c, 0xf965, 0x5f50, 0x619f, 0x4323, 0x619e, 0x61a6, 0x6335, 0x6338, 0x6336, 0x633a, 0x63dc, 0x687c, 0x68ab, 0x4449, 0x68a8, 0x68a7, 0x692b, 0x692c, 0x6928, 0x092b, 0x69a9, 0x69aa, 0x69ab, 0x69f8, 0x6ab1, 0x6af0, 0x6aef, 0x70a8, 0x708b, 0x7094, 0x709e, 0x708f, 0x7088, 0x707e, 0x7081, 0x7030, 0x709b, 0x7082, 0x7090, 0x7085, 0x707f, 0x70a9, 0x70de, 0x720d, 0x45fa, 0x74cf, 0x74cb, 0x74d8, 0x74dd, 0x74d3, 0x74d0, 0x74d5, 0x74d6, 0x75d6, 0x7792, 0x7795, 0xa5cb, 0x778d, 0x779b, 0x779d, 0x778f, 0x779e, 0x77a6, 0x7896, 0x7892, 0x7b16, 0x7b2a, 0x7b29, 0x7b2c, 0x7c15, 0x7c12, 0x7c11, 0x7c13, 0x7c88, 0x7c8b, 0x7c8a, 0x7c87, 0x7d17, 0x7d16, 0x7d1a, 0x7e19, 0x7e17, 0x7f91, 0x7f94, 0x818b, 0x8190, 0x818f, 0x8186, 0x8183, 0x818e, 0x8187, 0x81a8, 0x8185, 0x81a6, 0x8182, 0x81a7, 0x83b9, 0x83b7, 0x83b4, 0x83b6, 0x83b3, 0x83c6, 0x863c, 0x8640, 0x8638, 0x8791, 0x87a6, 0x87da, 0x88da, 0x88d8, 0x88d9, 0x88db, 0x88d7, 0x8b16, 0x8b12, 0x8b1f, 0x4959, 0x8b14, 0x8b1a, 0x8b10, 0x8cb3, 0x8dae, 0x8dc1, 0x8db0, 0x8daf, 0x8db1, 0x8dad, 0x8db2, 0x8dc4, 0x903c, 0x903f, 0x9161, 0x9166, 0x923c, 0x923b, 0x932c, 0x4a7e, 0x932a, 0x933e, 0x932f, 0x9332, 0x9327, 0x9329, 0x9340, 0x93df, 0x93de, 0x943c, 0x943b, 0x943e, 0x9521, 0x9546, 0x953c, 0x9536, 0x9538, 0x9535, 0x9631, 0x9636, 0x962d, 0x9633, 0x962f, 0x962e, 0x9635, 0x97ac, 0x97a9, 0x97a6, 0x4ba8, 0x994c, 0x9943, 0x9941, 0x994f, 0x9942, 0x9951, 0x4ba9, 0x9940, 0x9950, 0x9945, 0x994a, 0x994b, 0x9a83, 0x9a82, 0x9a81, 0x9ae0, 0x9b98, 0x9b9f, 0x9b9b, 0x9b9a, 0x9b99, 0x9b96, 0x9bae, 0x9b9e, 0x9d09, 0x9d0d, 0x9e4e, 0x9e4a, 0x9e4d, 0x9e40, 0x9e3e, 0x9e48, 0x9e42, 0x9e62, 0x9e45, 0x9e51, 0xa0c6, 0xa0d0, 0xa0c0, 0xa0b7, 0xa0c2, 0xa0bc, 0xa0c5, 0xa0dc, 0xa0db, 0xa0d2, 0xa0c7, 0xa0b6, 0xa0c9, 0xa0cc, 0xa0d1, 0xa0cd, 0xa0da, 0xa0ba, 0xa0d3, 0xa0ce, 0xa0f6, 0xa0bd, 0xa0dd, 0xa0c8, 0xa10d, 0xa135, 0xa271, 0xa26e, 0xa26f, 0xa2d6, 0xa34c, 0xa34f, 0xa354, 0xa353, 0xa3c9, 0xa3c8, 0xa403, 0x4d54, 0xa404, 0xfa16, 0xa457, 0xa452, 0xa453, 0x4d6d, 0xa456, 0xa45c, 0xa455, 0xa564, 0xa55d, 0xa55e, 0xa5a2, 0xa5a3, 0x4d8e, 0xa5e7, 0xa5e6, 0xa698, 0xa6ac, 0xa6af, 0xa6ae, 0x0459, 0x05a9, 0x082a, 0x08c7, 0x1141, 0x1137, 0x1135, 0x1133, 0x1139, 0x1132, 0x14ff, 0x1501, 0x14f8, 0x191b, 0x1919, 0x1bbf, 0x1fbc, 0x1fbe, 0x1fbd, 0x217d, 0x2446, 0x2447, 0x25a4, 0x2a21, 0x2a62, 0x2e86, 0x3a72, 0x302f, 0x3031, 0x3c14, 0x37f8, 0x37f5, 0x37f9, 0x37f2, 0x37fa, 0x37f3, 0x3814, 0x37fd, 0x380f, 0x380e, 0x3801, 0x3937, 0x3935, 0x3934, 0x3931, 0x3a7a, 0x3a7b, 0x3c37, 0x412b, 0x40fb, 0x4116, 0x4113, 0x3d93, 0x4111, 0x410f, 0x411b, 0x4138, 0x44a4, 0x4709, 0x4707, 0x470b, 0x48d3, 0x48d1, 0x48d8, 0x4b1d, 0x4ba9, 0x4bd0, 0x7215, 0x4f02, 0x4f05, 0x4f01, 0x4f00, 0x532e, 0x5330, 0x532f, 0x5331, 0x55d2, 0x55d3, 0x5902, 0x5a40, 0x5a42, 0x5a3b, 0x5ace, 0x5d98, 0x5d8f, 0x5d94, 0x5d91, 0x426f, 0x5dba, 0x5d90, 0x5d86, 0x5d9a, 0x5d8c, 0x5d93, 0x5d87, 0x5d88, 0x5d97, 0x5d8d, 0x5d9c, 0x5dbd, 0x5f3c, 0x5f59, 0x42b0, 0x61d1, 0x61bb, 0x61be, 0x625d, 0x63e2, 0x6605, 0x68ba, 0x352e, 0x68f4, 0x69b2, 0x69f9, 0x6ab7, 0x6ab6, 0x7089, 0x70f9, 0x70d9, 0x70e8, 0x70d4, 0x70db, 0x70e2, 0x70df, 0x70d1, 0x70e9, 0x70ea, 0x7213, 0x7211, 0x74fa, 0x74f8, 0x74f4, 0x74fb, 0x750e, 0x7502, 0x750f, 0x7790, 0x77ad, 0x77a9, 0x7948, 0x7b5a, 0x7b4f, 0x7b4e, 0x7b55, 0x7b54, 0x7b4a, 0x7bd5, 0x7c18, 0x7c8d, 0x7d1d, 0x7d19, 0x7e26, 0x7e28, 0x7e2b, 0x7e7d, 0x7fa0, 0x7f9a, 0x7f9b, 0x81b5, 0x81ad, 0x81b2, 0x8294, 0x83c9, 0x864e, 0x864f, 0x8644, 0x8652, 0x88e9, 0x8939, 0x4969, 0x957e, 0x8dc7, 0x8dd3, 0x8dc6, 0x8dc3, 0x49b4, 0x8dd2, 0x8f66, 0x917f, 0x9180, 0x9184, 0x9185, 0x91e3, 0x4a4d, 0x9241, 0x9244, 0x9243, 0x934e, 0x934f, 0x4a83, 0x9349, 0x934a, 0x934b, 0x9343, 0x93e0, 0x93e5, 0x93e1, 0x93e6, 0x93e2, 0x940c, 0x9440, 0x9549, 0x954a, 0x9554, 0x954c, 0x9555, 0x9556, 0x963b, 0x963d, 0x97a4, 0x97a8, 0x97c3, 0x97bf, 0x97c8, 0x97c2, 0x97ca, 0x97cc, 0x97c9, 0x97be, 0x97cd, 0x97c7, 0x97c5, 0x985d, 0x4bb0, 0x996c, 0x996b, 0x9970, 0x996d, 0x996f, 0x9989, 0x9984, 0x9a8d, 0x9a8a, 0x9a8e, 0x9a91, 0x9bb5, 0x9bb1, 0x9baf, 0x9bb9, 0x9bb7, 0x9bb0, 0x4c0c, 0x9c17, 0x4c18, 0x9c4f, 0x9d19, 0x9d10, 0x9d18, 0x9d11, 0x9d1c, 0x9d12, 0x9e76, 0x9e71, 0x9c20, 0x9e7a, 0x9e7f, 0x9c22, 0x9e73, 0x9eab, 0x9c1e, 0x9e77, 0x9e74, 0x9e7e, 0x9e9b, 0x9e84, 0x9e7c, 0xa129, 0xa12b, 0xa10e, 0xa100, 0xa10b, 0xa0fe, 0xa0fa, 0xa117, 0xa0ff, 0xa10c, 0xa10f, 0x4cf5, 0xa102, 0xa101, 0xa0fc, 0xa149, 0xa106, 0xa112, 0xa113, 0xa278, 0xa35b, 0xa362, 0xa35f, 0xa35d, 0xa3ab, 0xa3d5, 0xa3d4, 0xa3d3, 0xa407, 0xa46c, 0xa470, 0xa46e, 0xa468, 0xa46d, 0xa477, 0xa46a, 0xa4ce, 0xa4ec, 0xa569, 0xa568, 0xa5a6, 0xa5a9, 0xa5aa, 0xa600, 0xa60d, 0xa5f8, 0xa5fc, 0xa60a, 0xa5f7, 0xa601, 0xa6b6, 0xa6bb, 0xa6b7, 0xa6b9, 0xa6ca, 0x0469, 0x0625, 0x1159, 0x1507, 0x1509, 0x1922, 0x1b07, 0x1b04, 0x330f, 0x1cf8, 0x1fc7, 0x1fd1, 0x217e, 0x2308, 0x244a, 0xf898, 0x24b9, 0x2e88, 0x2e91, 0x2e84, 0x2e73, 0x2e89, 0x2e85, 0x3033, 0x3313, 0x381d, 0x381f, 0x381c, 0x3820, 0x381a, 0x381b, 0x3939, 0x39af, 0x3ae5, 0x3c3c, 0x4137, 0x413a, 0x44bb, 0x3e0e, 0x4710, 0x470d, 0x4baf, 0x4c11, 0x3fd8, 0x4f0d, 0x4f0c, 0x4f0b, 0x50d4, 0x533d, 0x533e, 0x533b, 0x5343, 0x5340, 0x5346, 0x5411, 0x55dd, 0x55df, 0x55ea, 0x574a, 0x5906, 0x5dc1, 0x5db9, 0x5dc6, 0x5db8, 0x5dbb, 0x5dc8, 0x5dc5, 0x5dbf, 0x5dc7, 0x5dc4, 0x5f65, 0x5f67, 0x61d7, 0x61db, 0x61d4, 0x61d6, 0x63e8, 0x660a, 0x6abd, 0x6abe, 0x711a, 0x710d, 0x710f, 0x711b, 0x7110, 0x7111, 0x7113, 0x7218, 0x7520, 0x751f, 0x7523, 0x751d, 0x7537, 0x7525, 0x7524, 0x752a, 0x7527, 0x7533, 0x7528, 0x7534, 0x77ba, 0x8970, 0x789d, 0x794c, 0x7b5c, 0x7b6a, 0x7b5d, 0x7b65, 0x7b63, 0x7b5e, 0x7c19, 0x7c97, 0x7e3f, 0x7e33, 0x7e32, 0x7fa1, 0x7fa5, 0x7fa4, 0x7fa2, 0x81c1, 0x482c, 0x81c7, 0x81c4, 0x81c6, 0x81c5, 0x81d4, 0x81ca, 0x8653, 0x88f1, 0x8921, 0x496e, 0x8bb7, 0x8b92, 0x8dd4, 0x8f44, 0x9198, 0x919b, 0x9191, 0x9195, 0x919a, 0x9192, 0x9353, 0x9357, 0x4a86, 0x935c, 0x935d, 0x9364, 0x93ea, 0x93ed, 0x9442, 0x9443, 0x9564, 0x9561, 0x9560, 0x967d, 0x97d4, 0x97d5, 0x97d9, 0x9987, 0x9999, 0x998c, 0x998a, 0x998f, 0x4bb3, 0x998b, 0x9982, 0x999b, 0x4beb, 0x9bc8, 0x9bc4, 0x9bcc, 0x9bc7, 0x9bc3, 0x9bc6, 0x9bcb, 0x9bca, 0x9bc9, 0x9bcd, 0x9c53, 0x9d21, 0x9d29, 0x9d1d, 0x9d24, 0x9d28, 0x9c43, 0x9eb1, 0x9eb2, 0x9eb5, 0x9ed6, 0x9eaf, 0x9eca, 0x9eb8, 0xfa12, 0xfa11, 0xa145, 0xa147, 0xa134, 0xa16e, 0xa142, 0xa131, 0xa12e, 0xa156, 0xa138, 0xa137, 0xa14b, 0xa12d, 0xa133, 0xa136, 0x9de0, 0xa148, 0xa2dc, 0x4d42, 0xa366, 0xa36d, 0xa363, 0xa364, 0x4d41, 0xa367, 0xa3d9, 0xa40b, 0xa47e, 0xa48b, 0xa526, 0xa52c, 0xa529, 0xa56f, 0xa56b, 0xa56d, 0xa56e, 0xa61c, 0xa611, 0xa610, 0xa624, 0xa612, 0xa615, 0xa617, 0x4dac, 0x046f, 0x05ab, 0x082e, 0x08c9, 0x0b96, 0x1185, 0x16a0, 0x192b, 0x230d, 0x3036, ERROR, 0x3b2f, 0x3b2e, 0x33b1, 0x384a, 0x3837, 0x383c, 0x3838, 0x383a, 0x383e, 0x3849, 0x3c4d, 0x3c7b, 0x3a80, 0x3a7f, 0x3ae3, 0x3c3f, 0x4152, 0x414e, 0x414a, 0x414b, 0x44d5, 0x4ad8, 0x4b20, 0x4bb3, 0x4bb1, 0x4bb0, 0x4f17, 0x50d9, 0x5349, 0x5413, 0x55ed, 0x55eb, 0x55ee, 0x590a, 0x590b, 0x5a4a, 0x5dd5, 0x5dd7, 0x5dde, 0x5ddc, 0x5dee, 0x5f70, 0x42b2, 0x61d9, 0x63d7, 0x68cb, 0x68c7, 0x69fc, 0x713b, 0x7139, 0x714b, 0x7143, 0x7140, 0x7146, 0x754d, 0x7543, 0x7547, 0x754b, 0x7555, 0x7552, 0x7b5f, 0x4722, 0x7b7c, 0x7b7b, 0x7fa8, 0x7fa9, 0x81de, 0x81d7, 0x81dd, 0x81d6, 0x81d8, 0x829b, 0x83e0, 0x83e8, 0x83e6, 0x88f8, 0x88fb, 0x8bbb, 0x9459, 0x8bb8, 0x4970, 0x8cc1, 0x8cc0, 0x91a4, 0x91ab, 0x924d, 0x9365, 0x9367, 0x936a, 0x9366, 0x9369, 0x9573, 0x9580, 0x956f, 0x9571, 0x97e4, 0x97e6, 0x97e7, 0x99a0, 0x99a4, 0x9aa2, 0x9aa7, 0x9aa4, 0x9bde, 0x9bdb, 0x9c58, 0x9c5c, 0x9d2f, 0x9d2e, 0x9edd, 0x9ee4, 0x9ed8, 0x9ee7, 0x9eda, 0x9e75, 0x4c95, 0xa179, 0xa180, 0xa17f, 0xa17c, 0xa175, 0xa17b, 0xa182, 0x4d00, 0xa189, 0xa174, 0xa17d, 0xa17a, 0xa186, 0xa1a8, 0xa172, 0x4d02, 0xa18b, 0xa191, 0xa1b3, 0xa181, 0xa282, 0xa2e1, 0xa2e3, 0xa2e2, 0xa376, 0xa374, 0xa372, 0xa375, 0xa40e, 0xa40d, 0xa494, 0xa492, 0xa493, 0xa491, 0xa48f, 0xa495, 0xa4d0, 0xa4f7, 0xa576, 0xa5af, 0x4d9f, 0xa626, 0xa625, 0xa62d, 0xa6a0, 0xa6c3, 0x04d7, 0x0acc, 0x1179, 0x117a, 0x1515, 0x1fdb, 0x2185, 0x2970, 0x297b, 0x2ea5, 0x2e9f, 0x3317, 0x33b2, 0x3839, 0x3840, 0x384e, 0x393e, 0x3ae8, 0x3ae7, 0x4166, 0x4161, 0x44da, 0x4714, 0x48df, 0x4f18, 0x5039, 0x503a, 0x5730, 0x5732, 0x590e, 0x5a4c, 0x5de8, 0x5df1, 0x5deb, 0x5dec, 0x5f74, 0x5f73, 0x61f1, 0x6342, 0x633e, 0x6341, 0x652c, 0x68d2, 0x69bb, 0x7158, 0x7157, 0x7156, 0x715a, 0x457d, 0x7561, 0x7568, 0x7565, 0x755f, 0x7564, 0x755e, 0x755b, 0x7567, 0x77c3, 0x78a2, 0x7953, 0x7b7d, 0x7c20, 0x7fae, 0x7faf, 0x7fb0, 0x81e7, 0x81e6, 0x81e9, 0x83f1, 0x83eb, 0x83ea, 0x83e9, 0x8663, 0x8902, 0x88fe, 0x8bde, 0x8cc2, 0x8de6, 0x8f5d, 0x91ad, 0x9375, 0x9372, 0x9377, 0x4af6, 0x9651, 0x97e8, 0x97ed, 0x97ee, 0x99b9, 0x99a1, 0x99b6, 0x9aae, 0x9be8, 0x4c12, 0x9c1e, 0x9d31, 0x9d32, 0x4c91, 0x9f0e, 0x9f12, 0x9f09, 0x9f05, 0x4c90, 0x9f03, 0x9f1f, 0x9f0d, 0x9f0c, 0x9f04, 0x9f0a, 0xa1c2, 0xa1bf, 0xa1c9, 0xa1b2, 0xa1c1, 0xa1af, 0xa1b4, 0xa1b0, 0xa1b6, 0xa1b7, 0xa1bb, 0xa1b1, 0xa2f0, 0xa378, 0xa37a, 0xa379, 0xa3e4, 0xa3e6, 0xa49f, 0xa49d, 0xa498, 0xa499, 0xa4f9, 0xa530, 0xa582, 0xa581, 0xa5b3, 0xa57f, 0xa63a, 0xa63e, 0xa648, 0x1186, 0x1936, 0x1b13, 0x1c22, 0x1fdd, 0x25a7, 0x297d, 0x3a79, 0x331c, 0x3865, 0x3860, 0x3867, 0x3c4e, 0x3b1a, 0x4ae3, 0x5734, 0x5918, 0x5a52, 0x5dfc, 0x5f79, 0x5f78, 0x5f76, 0x61fa, 0x61f8, 0x652d, 0x68d6, 0x69bd, 0x69bf, 0x69be, 0x7144, 0x7170, 0x7162, 0x716e, 0x756e, 0x757c, 0x7574, 0x7578, 0x7570, 0x7579, 0x7571, 0x77cc, 0x78a7, 0x78a6, 0x7b93, 0x7c21, 0x7c9c, 0x829d, 0x83f4, 0x83f3, 0x8df0, 0x91b8, 0x91b6, 0x91bd, 0x9373, 0x9382, 0x9587, 0x9656, 0x9659, 0x97f6, 0x99c9, 0x99c5, 0x99c7, 0x99ca, 0x99c2, 0x99c4, 0x9bf2, 0x9bf0, 0x9d3b, 0x9d3a, 0x9f26, 0x9f28, 0x9f34, 0x9f2d, 0xa1d7, 0xa1d2, 0xa1d6, 0xa1dc, 0xa1d3, 0xa1d1, 0xa286, 0x4d1e, 0xa2ef, 0xa2ee, 0xa3e8, 0xa4ac, 0xa4a9, 0xa4aa, 0xa4ab, 0xa4fb, 0xa533, 0xa588, 0xa5b6, 0xa5b7, 0xa5d0, 0xa5cf, 0xa64f, 0xa659, 0xa64c, 0x1b18, 0x1fe0, 0x3869, 0x4173, 0x4172, 0x4ae8, 0x55fb, 0x591c, 0x5e09, 0x5e0a, 0x5e08, 0x5f7d, 0x5f7f, 0x6267, 0x717a, 0x717b, 0x77d1, 0xf9cb, 0x7b9d, 0x7c9d, 0x81fc, 0x81fb, 0x81fd, 0x83f5, 0x83f6, 0x8c0f, 0x8c1d, 0x91c7, 0x91c1, 0x91bf, 0x9254, 0x937f, 0x93f5, 0x958a, 0x958c, 0x965c, 0x9865, 0x99cf, 0x99d0, 0x9ab8, 0x9bfa, 0x9c66, 0x9f40, 0x9f41, 0x9c72, 0xa1f7, 0xa1f3, 0xa1ef, 0xa1f4, 0xa1ed, 0xa1f2, 0xa1f1, 0xa1f9, 0xa4b4, 0xa4fc, 0xa5bc, 0xa65e, 0xa65b, 0xa65f, 0xa65d, 0xa6cf, 0xa6ce, 0x193a, 0x1fe1, 0x2315, 0x2314, 0x4178, 0x4179, 0x44e6, 0x4bb8, 0x4f22, 0x55fe, 0x68db, 0x6a06, 0x6ac8, 0x7189, 0x7586, 0x78ad, 0x7b99, 0x7bd8, 0x7c23, 0x7d23, 0x7fb5, 0x83f9, 0x8907, 0x8c1e, 0x8dfb, 0x8f72, 0x8f73, 0x9387, 0x9449, 0x965d, 0x97f8, 0x9c03, 0x9f4e, 0x9f4d, 0x9f50, 0x9f55, 0xa209, 0xa207, 0xa20c, 0xa203, 0xa206, 0xa20b, 0xa20a, 0xa289, 0xa4bb, 0xa4ff, 0xa536, 0xa58b, 0xa666, 0xa669, 0xa667, 0xa6c2, 0xa6d2, 0x1fe2, 0x3828, 0x2988, 0x335b, 0x3876, 0x417d, 0x45a6, 0x535a, 0x5e17, 0x68dc, 0x718f, 0x7594, 0x7595, 0x7fb6, 0x8204, 0x87ee, 0x938a, 0x93f9, 0x9c07, 0x9c1f, 0x9c2a, 0x9d45, 0x9f5c, 0x9f5b, 0x9f61, 0x9f5d, 0xa218, 0xa21f, 0xa383, 0xa416, 0xa414, 0xa4bf, 0xa4c0, 0xa673, 0xa6c0, 0x1517, 0x2989, 0x591e, 0x591f, 0x5a54, 0x5e18, 0x6205, 0x7195, 0x7598, 0x759b, 0x7959, 0x8208, 0x8401, 0x91ce, 0x93fa, 0x9abe, 0x9d47, 0x9f6a, 0x9f69, 0x9f68, 0x9f67, 0xa225, 0xa228, 0xa4c4, 0xa537, 0xa58d, 0xa58c, 0x4d91, 0xf920, 0x5e22, 0x5f82, 0x77d9, 0x8c38, 0x93fb, 0x99e1, 0x9c72, 0x9d48, 0x9f6c, 0x9f70, 0xa231, 0xa230, 0xa679, 0x5e23, 0x68f8, 0x9c74, 0x9f73, 0xa234, 0xa387, 0xa3b2, 0xa5c2, 0xa67d, 0x1fe5, 0x938c, 0x9f77, 0x9f75, 0xa238, 0xa23a, 0xa683, 0xa681, 0x4180, 0x7199, 0x4587, 0x944a, 0x9d4a, 0xa23c, 0xa6c8, 0x5604, 0x78af, 0xa689, 0xa2fa, 0x9661, 0xa23f, 0x7193, 0xa4c9, 0x77de, 0x9391, 0xa68e, 0xa68d, 0x7198, 0x69c5, 0xa6a5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xf802, 0x0062, 0x3405, 0x0088, 0x00d0, 0x00cf, 0x011e, 0x011f, 0x0120, 0x090e, 0x092c, 0x0061, 0x0004, 0x0005, 0x0003, 0x3404, 0xf801, 0x007d, 0x008d, 0x01a3, 0x01a4, 0x04db, 0x0500, 0xf81e, 0x06a3, 0x0832, 0x353f, 0x0ad4, 0x0ad5, 0x1c23, 0x232c, 0x237a, 0x0503, 0x0007, 0x0008, 0x008f, 0x009c, 0x00d5, 0x0112, 0x0113, 0x0114, 0x0121, 0x01a8, 0x01a6, 0x0476, 0x0501, 0x053d, 0xf814, 0x053e, 0x0629, 0x0677, 0x0678, 0x06a6, 0x06a9, 0x06ac, 0x0834, 0x0504, 0x097b, 0x0a10, 0x062f, 0x0ad7, 0x0b1c, 0x0b1f, 0x0b1a, 0xf836, 0x0b1e, 0x0b9e, 0x0b9a, 0x11a0, 0x11a1, 0x15d2, 0x15d3, 0x19b9, 0x1b1d, 0x1b55, 0x1cff, 0x1fe7, 0x382a, 0x2011, 0x2013, 0x2012, 0x21af, 0x21b1, 0xf890, 0x232d, 0x237b, 0x239d, 0x239a, 0x38a7, 0x239f, 0x23a0, 0x239c, 0x24bd, 0x38fa, 0x25aa, 0x306c, 0x3091, 0x3c74, 0x456a, 0xf929, 0x5605, 0x626b, 0x626a, 0x00e0, 0x0012, 0x3400, 0x007f, 0x00a0, 0x0099, 0x0095, 0x009e, 0x00df, 0x00de, 0x01af, 0x01ad, 0x01b0, 0x04df, 0x0543, 0x0541, 0x0548, 0x0575, 0xf81a, 0x0632, 0x067b, 0x0679, 0x06b3, 0x34db, 0x0ba7, 0x06b2, 0x06b0, 0x06b4, 0xf829, 0x08cd, 0x08ce, 0xf82b, 0x0910, 0x0980, 0x09d3, 0x0a30, 0x0098, 0x0a2f, 0x0a31, 0x0ada, 0x0ad9, 0x0b27, 0x0b28, 0x0b21, 0x0b25, 0x0ba6, 0x0ba2, 0x0ba1, 0x0ba4, 0xf839, 0x0baa, 0x0ba5, 0x0ba3, 0x0064, 0x123f, 0x1244, 0x151b, 0x1553, 0x1584, 0x1586, 0x15d5, 0xf860, 0x193e, 0x1940, 0x1bca, 0x1bc9, 0x1c26, 0x1d00, 0x1d31, 0x1d3c, 0x1d30, 0x1d33, 0x1d32, 0x1d38, 0x2034, 0x2053, 0x2054, 0x21b4, 0x21b2, 0x232f, 0x23a5, 0x23a7, 0x23a4, 0x23a8, 0x23a9, 0x23a2, 0x23a3, 0x23a6, 0x2481, 0x2480, 0x25ad, 0x2a24, 0x2a65, 0x2a68, 0x2a69, 0x313c, 0x313b, 0x335d, 0x3944, 0x4182, 0x44f1, 0x456b, 0x471b, 0x48eb, 0x4bba, 0x4bd3, 0x4d13, 0x5922, 0x6af4, 0x820f, 0x8210, 0x0507, 0x9c0b, 0x9c0a, 0x0019, 0x001a, 0x0018, 0x0066, 0x0082, 0x00a8, 0x00e5, 0x00e7, 0x00e4, 0x0115, 0x0123, 0x0124, 0x0143, 0x01c3, 0x01bc, 0x01bb, 0x3438, 0x01b7, 0x01b9, 0x01cf, 0xf80d, 0x047a, 0x047b, 0x04e1, 0x04e0, 0x0509, 0x054d, 0xf816, 0x054b, 0x0579, 0x05b1, 0x0636, 0x0635, 0x0637, 0x0638, 0x067f, 0x0680, 0x0681, 0x6953, 0x067e, 0x06cd, 0x06bf, 0x06be, 0x06c2, 0x06b8, 0x06c1, 0x6530, 0x0931, 0x092f, 0x096f, 0x0982, 0x353a, 0x0987, 0x0986, 0x098d, 0x0994, 0x09d7, 0x09d4, 0x09d8, 0x0a16, 0x0a14, 0x0a2e, 0x0a36, 0x0a37, 0x1fee, 0x0ae0, 0x0ae5, 0x0adf, 0x0b2b, 0x0b29, 0x0b2d, 0x0b2f, 0x0bb7, 0x0bc9, 0x0bc1, 0x0bca, 0x0bb2, 0x0bac, 0x0bae, 0x11b2, 0x11a8, 0x11b0, 0x11a7, 0xf851, 0x1252, 0x124a, 0x1556, 0x1555, 0x155f, 0x155e, 0x1588, 0xf85d, 0x15dd, 0x15e2, 0x15e1, 0x15df, 0x15e0, 0x16af, 0x16b1, 0x16ba, 0x1945, 0x1943, 0x19bd, 0x19c8, 0xf86c, 0x19be, 0x19bf, 0xf874, 0x1b59, 0x1c29, 0x1c2c, 0x1c2f, 0x1c2d, 0x1c2e, 0x1d04, 0x1d02, 0x1d01, 0x1d40, 0x1d4a, 0x1d3f, 0x1d4f, 0x1d41, 0x1d4e, 0x1feb, 0x1fec, 0x00ac, 0x205b, 0x2063, 0x205a, 0x2059, 0x21dc, 0x21db, 0x21d9, 0x21e0, 0x21dd, 0x0020, 0x23b0, 0x23b1, 0x23b2, 0x23b6, 0x2451, 0x2452, 0x2450, 0x2484, 0x38c9, 0x2483, 0x25c3, 0x25b8, 0x25b9, 0x25b2, 0x2990, 0x2a26, 0x2a29, 0x2a6e, 0x3140, 0x313e, 0x3141, 0x335e, 0x33bb, 0x33bc, 0x33b9, 0xf8ef, 0x3880, 0x3c4f, 0x3945, 0x39ba, 0x39bd, 0x3c56, 0x3c55, 0x3c75, 0x3c77, 0x3c81, 0xf8fa, 0x3c83, 0x3c8b, 0x3c84, 0x4186, 0x4183, 0x418b, 0x456d, 0x4616, 0x4728, 0x48ea, 0x4bd4, 0x4c03, 0x4d15, 0x4f3d, 0x4f3e, 0x5416, 0xf94c, 0x5606, 0x574d, 0x6222, 0x6273, 0x626d, 0x626e, 0x64b1, 0x054e, 0x662d, 0x43cd, 0x68f9, 0x6952, 0x6b00, 0x6afc, 0x6afa, 0x4492, 0x6af7, 0x6af8, 0xf990, 0xf9c4, 0x7c27, 0x8211, 0x00ae, 0x8450, 0x844f, 0x844d, 0x8671, 0xf9e2, 0x8672, 0x8e18, 0x0a44, 0x0021, 0x0067, 0x00af, 0x00b0, 0x0029, 0x0117, 0x0122, 0xf803, 0x0025, 0x0128, 0x01ff, 0x01d9, 0x01db, 0x01de, 0x01f2, 0x01fe, 0x01f4, 0x01dd, 0x3445, 0xf804, 0x0201, 0x01dc, 0x047d, 0x0481, 0x047e, 0x047f, 0x04e5, 0x050f, 0x34b5, 0x050a, 0x34b6, 0x050b, 0x0551, 0x0552, 0x0550, 0x05b8, 0x063d, 0x063e, 0x063c, 0x0687, 0x06d7, 0x06db, 0x06cf, 0x06e0, 0x084c, 0x0842, 0x08d4, 0x0911, 0x0914, 0x0915, 0x0912, 0x0933, 0x0935, 0x3537, 0x0971, 0x3530, 0x0991, 0x0993, 0x0995, 0x09dc, 0x0a42, 0x0a40, 0x53a6, 0x0ae6, 0x128f, 0x0b32, 0xf837, 0x0b31, 0x0bf5, 0x0bcd, 0x0bde, 0x0bd5, 0x0bda, 0x0bee, 0x0bec, 0x0bcf, 0x0bce, 0xf83d, 0x0bcc, 0x0bf3, 0x11c1, 0x11c4, 0x11c6, 0x11b4, 0x11c3, 0x11b8, 0x11bb, 0x11b7, 0x11bc, 0x11bf, 0x11c7, 0x11be, 0x1260, 0x125d, 0x1276, 0x126c, 0x1275, 0x125b, 0x1271, 0x1273, 0x1261, 0x125a, 0x1262, 0x1272, 0x125f, 0x1258, 0x151e, 0x1558, 0x158b, 0x158a, 0x15f4, 0x15f0, 0x16d2, 0x16cd, 0x16ce, 0x16bc, 0x16d0, 0x1946, 0x1947, 0x373e, 0x374d, 0x3751, 0x19ce, 0x19cf, 0x19cc, 0x19cb, 0xf872, 0x1b60, 0x1b5f, 0x1b5d, 0x1bd4, 0x1c3a, 0x1c38, 0x1c3c, 0x1c36, 0x1d08, 0x1d7e, 0x1d5e, 0x1d6e, 0x1d53, 0x1d70, 0x1d57, 0x1d5d, 0x1d63, 0x1d7a, 0x1d79, 0x1d93, 0xf881, 0x201d, 0x2068, 0x2073, 0x2074, 0x2066, 0x206f, 0x2075, 0x207a, 0x2070, 0x206d, 0x2065, 0x218a, 0x21ed, 0x21e9, 0x21e3, 0x21ef, 0x3873, 0x21ea, 0x2331, 0xf891, 0x2338, 0x6b20, 0x2335, 0x233a, 0x2381, 0x2380, 0x23b8, 0x23c1, 0x23ba, 0x2488, 0x24cf, 0x24ca, 0x24c7, 0x24c5, 0x24c8, 0x24d0, 0x24c9, 0x25bb, 0x25b6, 0x25bd, 0xf89d, 0x25b4, 0x25c1, 0x25d1, 0x25d2, 0x25cc, 0x25d4, 0x25cb, 0x25ce, 0x25d5, 0x25d8, 0x2995, 0x2993, 0x2999, 0x2996, 0x39be, 0x2a89, 0x2a94, 0x2a91, 0x2a8f, 0x2a84, 0x2a97, 0x2a86, 0x2a85, 0x2a8c, 0x2ef2, 0x2eed, 0x2eef, 0x30d9, 0x3146, 0x3147, 0x314b, 0x3150, 0x314a, 0x314e, 0x314c, 0x3148, 0x3363, 0x3361, 0x3362, 0x3360, 0x33c3, 0x33c5, 0x33c1, 0x33d0, 0xf8dc, 0x3882, 0x3c1e, 0x3886, 0x3884, 0x394c, 0x3948, 0x39b8, 0x39bf, 0x39c1, 0x39c6, 0x39c5, 0x39c7, 0x39c0, 0x39c3, 0x3aed, 0x3b03, 0x3b22, 0x3b21, 0x3c9f, 0x3c90, 0x3c9e, 0x3cc8, 0x3ca0, 0x3c94, 0x3c95, 0x3ca1, 0x3cc3, 0x3cc7, 0x419a, 0x4190, 0x44f2, 0x44f3, 0x456e, 0x45ab, 0x45a9, 0x461a, 0x4618, 0x461b, 0x4760, 0x474c, 0x4742, 0x4733, 0x473f, 0x473e, 0x4738, 0x4743, 0x4746, 0x4736, 0x48ee, 0x48f5, 0x48f4, 0x3f56, 0x4c1b, 0x3540, 0x4d2b, 0x4d29, 0x4d2a, 0x4d2e, 0x503f, 0x50e6, 0x53a7, 0x53a8, 0x5418, 0x5608, 0x5750, 0x5753, 0x5a56, 0x5a55, 0x626f, 0x627f, 0x64b3, 0x663a, 0x6638, 0x6637, 0x6636, 0x0554, 0xf980, 0x68dd, 0x68fc, 0x68fa, 0x6933, 0x6b04, 0x6b07, 0x6b08, 0x6b06, 0x6b09, 0xf991, 0xf993, 0x721e, 0xf9d2, 0x840b, 0x8443, 0x8452, 0x8458, 0x845e, 0x8668, 0x868d, 0x8682, 0x867b, 0x8c58, 0x49bd, 0xf800, 0x002c, 0x002e, 0x160b, 0x002d, 0x0069, 0x00b2, 0x00b6, 0x00a9, 0x00ed, 0x0119, 0x014f, 0x0216, 0x0203, 0x020e, 0x0204, 0x0207, 0x0210, 0x0227, 0x0228, 0x020d, 0x0229, 0x020f, 0x0222, 0x0211, 0x0485, 0x0484, 0x0483, 0x048a, 0x0486, 0x0510, 0x0558, 0x055a, 0x070c, 0x05c4, 0x05c5, 0x0647, 0x0649, 0x064a, 0x064b, 0x21bb, 0x068d, 0x068b, 0x0707, 0x0706, 0xf820, 0x06ef, 0x06f0, 0x06ed, 0x06f9, 0x0702, 0x06e7, 0x06f4, 0x06f7, 0x06f1, 0x0853, 0x0855, 0x351a, 0x08da, 0x08d9, 0x352c, 0x0938, 0x0999, 0x09a2, 0x099c, 0x099a, 0x099b, 0x09e5, 0x09e3, 0x09e1, 0x09e0, 0x09e2, 0x09e4, ERROR, 0x09e8, 0xf82f, 0x0a13, 0x0a56, 0x0a4b, 0x0a4a, 0x0a4d, 0x0a4c, 0x3549, 0x0aea, 0x0ae9, 0x0aeb, 0x0aec, 0x0b3a, 0x0b3c, 0x0b39, 0x0b3b, 0x0c14, 0x0c0e, 0x0c35, 0x0c0a, 0x0c3f, 0x0c38, 0x357c, 0x0c4e, 0x0c17, 0xf83f, 0x0c1e, 0x11b6, 0x11ce, 0x11ca, 0x11cb, 0x11cc, 0x11c9, 0x12b4, 0x12ac, 0x1288, 0x1286, 0x128c, 0x1293, 0x128a, 0x12a4, 0x1287, 0x12a5, 0x12a6, 0x1285, 0x12a3, 0x128e, 0x151f, 0x1563, 0x158d, 0x15fa, 0x15fb, 0x1609, 0x15fe, 0x15ff, 0x1602, 0x1604, 0x15fd, 0x1605, 0x16f9, 0x16f7, 0x16db, 0x16da, 0x1951, 0x1950, 0x1957, 0x19e2, 0x19d8, 0x19da, 0x19dc, 0x1b20, 0x1b1f, 0x1b69, 0x1bdd, 0x1c40, 0x1c41, 0x1c43, 0x1d0d, 0x1d0c, 0x1d87, 0x1da9, 0x1d92, 0x1d85, 0x37bf, 0x1d8c, 0x1da2, 0x1d8f, 0x1d8a, 0x37ba, 0x1d8d, 0x1ff1, 0x2037, 0x208b, 0x2087, 0x2082, 0x218e, 0x21bc, 0x21f8, 0x21fa, 0x21eb, 0x21f9, 0x21fc, 0x2205, 0x231b, 0x231d, 0x231e, 0xf892, 0x233c, 0x233e, 0x2384, 0x23c8, 0x23c9, 0x23d3, 0x23c7, 0x23d2, 0x2455, 0xf896, 0x248c, 0x248a, 0x24d5, 0x24d3, 0x38d8, 0x24d8, 0x25d0, 0x25ee, 0x25f1, 0x25fb, 0x25d3, 0x25ec, 0x25cd, 0x2615, 0x2626, 0x260e, 0x2627, 0x262a, 0x2600, 0x2604, 0x2628, 0x2608, 0x2614, 0x299b, 0x39b2, 0x29a1, 0x299d, 0x29a0, 0x299e, 0x29a2, 0x299c, 0x2a32, 0x2a34, 0x2a93, 0x2a96, 0x2a90, 0x2ab4, 0x2ab5, 0xf8b6, 0x2ab6, 0x2ac2, 0xf8b5, 0x2aba, 0x2a92, 0x2efb, 0x2f05, 0x2ef3, 0x2efe, 0x2efd, 0x455d, 0x2efa, 0x3043, 0x3095, 0x3094, 0x3ac4, 0x316f, 0x3173, 0x315c, 0x315b, 0x3166, 0x3174, 0x3163, 0x3167, 0x3160, 0x3162, 0x3171, 0x3172, 0x315e, 0x3323, 0x3326, 0x3364, 0xf8d6, 0x33f2, 0x3401, 0x33dd, 0x33dc, 0x33db, 0x33f3, 0x33fd, 0x33d8, 0x33f8, 0x33fb, 0x3883, 0x388c, 0x388e, 0x3949, 0x3954, 0x3952, 0x394e, 0x3958, 0x3951, 0x3955, 0x3953, 0x3957, 0x3950, 0x394f, 0x394d, 0x39d2, 0x39d3, 0x39c9, 0x39d4, 0x3aef, 0xf8f8, 0x00b1, 0x3b05, 0x3b04, 0x3b2e, 0x3b2d, 0x3c45, 0x3c5b, 0x3c5a, 0x3c59, 0x3c9d, 0x3c8e, 0x3cbc, 0x3cdd, 0x3cba, 0xf8fd, 0x3cd8, 0x3ccb, 0x3cd9, 0x3cda, 0x3cc4, 0x3cb8, 0x3cbf, 0x3cdb, 0x3cc1, 0xf8fc, 0x3cc5, 0xf919, 0x41b1, 0x41af, 0xf918, 0x44f7, 0x44f6, 0x44f8, 0x4550, 0x4551, 0x4571, 0x4570, 0x45b0, 0x45af, 0x45ae, 0x45ad, 0x4625, 0x462c, 0x4622, 0x4633, 0x4634, 0x3e2b, 0x473a, 0x4740, 0x4768, 0x3e61, 0x4764, 0x475c, 0x4757, 0x4753, 0x474f, 0x4751, 0x4754, 0x4766, 0x72dd, 0x3eb2, 0x490d, 0x4908, 0xf92b, 0x48fa, 0x4aea, 0x4b2a, 0x4bbb, 0x4bd5, 0x4bd7, 0x1da4, 0x00f0, 0x00b5, 0x4c06, 0x4c28, 0x4c22, 0x4c21, 0x2456, 0x4c23, 0x11cd, 0x4d30, 0x4d34, 0x4fc9, 0x4fca, 0x4fc8, 0xf93d, 0x5044, 0x50f3, 0xf941, 0x50f8, 0x50fc, 0x50f6, 0x50fb, 0x50f7, 0x5100, 0x5102, 0xf940, 0xf94d, 0x5424, 0x560d, 0x4129, 0x5762, 0x5930, 0x592b, 0x592a, 0x4192, 0x592d, 0x5ada, 0x5e28, 0x5f86, 0x6277, 0x627c, 0x6350, 0x634e, 0x63f2, 0x64b2, 0x64ce, 0x64cf, 0x64e5, 0x3407, 0x6535, 0x6531, 0x6613, 0x662b, 0x662c, 0x6645, 0x6660, 0x6641, 0x6658, 0x6647, 0x665b, 0x6650, 0xf982, 0x665f, 0x664a, 0x6656, 0x6643, 0x6644, 0x6651, 0x68fd, 0x6934, 0x6935, 0x6954, 0x6955, 0x6a0c, 0x6a0b, 0x6a0a, 0x6af9, 0x6b35, 0x6b24, 0x6b13, 0x6b1c, 0x6b69, 0x6b25, 0x6b21, 0xf995, 0xf996, 0xf998, 0x7220, 0x75a9, 0x75a8, 0x75de, 0x7609, 0x760a, 0x760b, 0x77e3, 0x7807, 0x78b2, 0x78b3, 0x795d, 0x7e58, 0x7e86, 0x7e87, 0x7fb9, 0x7fb8, 0x840c, 0x8444, 0x8466, 0x8480, 0x8475, 0x846d, 0x847e, 0x8467, 0x8481, 0x8477, 0x86a8, 0x86a2, 0x86a5, 0x869b, 0x8c57, 0x8e0f, 0x8e32, 0x8e2c, 0x8e33, 0x91e7, 0x006e, 0x00b7, 0x00f6, 0x00f2, 0x00f3, 0x0517, 0x0130, 0x0154, 0x0153, 0x0252, 0x023d, 0x023c, 0x0234, 0x0233, 0x0254, 0x022f, 0x3458, 0x0255, 0x023f, 0x0237, 0x0256, 0x0261, 0x0258, 0xf806, 0x023b, 0x0232, 0x022e, 0x023e, 0x003b, 0x048c, 0x048d, 0x0513, 0x0516, 0x0512, 0x055b, 0x058a, 0x05d7, 0x05ce, 0x0650, 0x0651, 0x064f, 0x068e, 0x068f, 0x06f2, 0xf821, 0x0728, 0x071a, 0x0725, 0x071d, 0x0714, 0x0720, 0x071f, 0x071b, 0x0717, 0x0715, 0x071c, 0x0713, 0xf825, 0x0860, 0x351c, 0x0866, 0x08e3, 0x08de, 0x08e0, 0x08e1, 0x091a, 0x091b, 0x0918, 0x091c, 0x0919, 0x0942, 0x0940, 0x093e, 0x0944, 0x0974, 0x0943, 0xf82d, 0x09f2, 0x0a1b, 0x0a19, 0x0a1e, 0xf830, 0x0a5e, 0x0a66, 0x0a5d, 0x0a5a, 0x0a5f, 0x0a60, 0x0a5b, 0x0a5c, 0x0a59, 0x0af0, 0x0af1, 0x0b43, 0x0b40, 0x0b42, 0x0b41, 0x0b3f, 0x0c57, 0x0c69, 0x0c6f, 0x0cab, 0x0c71, 0x0c93, 0x0c56, 0x0c90, 0x0c6d, 0x0c6c, 0x0c70, 0x0c66, 0x0c67, 0x11d7, 0x11b5, 0x11db, 0x11d8, 0x11d5, 0x11d4, 0x12ba, 0x12b7, 0x12be, 0x12b9, 0x3637, 0x12e0, 0x12dd, 0x12de, 0x4918, 0x12d8, 0x12bd, 0x12db, 0x151d, 0x1525, 0x1721, 0x170c, 0x1729, 0x172d, 0x171b, 0x170e, 0x171f, 0x1704, 0x171c, 0x1705, 0x1706, 0x1720, 0x170d, 0x172a, 0x1723, 0x1711, 0x195c, 0x1966, 0x195b, 0x194f, 0x195e, 0x195d, 0x19f1, 0x19ea, 0x19f4, 0x19eb, 0x19f0, 0x19fa, 0x19fb, 0x1b28, 0x1b2c, 0x1b6b, 0x1b2a, 0x1b6a, 0x1b6f, 0x1bdb, 0x1be0, 0x4fd1, 0x1be3, 0x1be5, 0x1be7, 0x1c4d, 0x1c55, 0x1c54, 0x1c53, 0x1c52, 0x1c4e, 0x1c60, 0x21c0, 0x1d0f, 0x1d11, 0x1d13, 0x1dc6, 0x1db3, 0x1dc7, 0x1dd2, 0x1db8, 0x1dac, 0x1dae, 0x1dcf, 0x1dc5, 0xf87b, 0x1dcc, 0x1dab, 0x1dc9, 0x1db9, 0x1ffb, 0x1ff8, 0x1ff7, 0x1ff9, 0x2020, 0x203b, 0x2039, 0x209e, 0x209a, 0x20aa, 0x20ab, 0x20af, 0x2096, 0x20a9, 0x20a6, 0x2091, 0x3843, 0x20ae, 0x209f, 0x20ac, 0x20a0, 0x2192, 0x2191, 0x21bf, 0x2217, 0x220a, 0x220c, 0x234a, 0x2346, 0x2334, 0x2345, 0x2343, 0x2344, 0xf893, 0x2387, 0x2386, 0x238a, 0x23da, 0x23d8, 0x38b4, 0x0518, 0x0134, 0x23d6, 0x23d4, 0x2454, 0x2459, 0x245a, 0x2457, 0x38e0, 0x24dd, 0x24e9, 0x24e0, 0x2605, 0x2612, 0x2613, 0x2607, 0x2616, 0x2623, 0x2602, 0xf8a1, 0x264a, 0x2636, 0x2640, 0x2656, 0x2643, 0xf8a0, 0x264b, 0x2646, 0x263e, 0x2649, 0x29a7, 0x29b6, 0x29a6, 0x29a8, 0x29ac, 0x29a9, 0x29ab, 0x2a38, 0x2a37, 0x2a39, 0x2a41, 0x2a3e, 0x2ac0, 0x2abb, 0x2abf, 0x2abd, 0x2afe, 0x2b1e, 0x2aee, 0x2afc, 0xf8b7, 0x2af9, 0x2b06, 0x2ae4, 0x2ae9, 0x2ae5, 0x2b03, 0x2afd, 0x2b49, 0x2ebe, 0x2f0a, 0x5626, 0x2f18, 0x2f0d, 0x2f0f, 0x2f0e, 0x2f20, 0x3071, 0x3099, 0x30e2, 0x30df, 0x30de, 0x3178, 0x3179, 0x3ae4, 0x317c, 0x317d, 0x3184, 0x318b, 0x318a, 0xf8d2, 0x3189, 0x332c, 0x3329, 0x336c, 0x6804, 0x3409, 0x3408, 0x340c, 0x340d, 0x3410, 0x3c26, 0x389f, 0x3898, 0x38a2, 0x389a, 0x39d5, 0x39e2, 0x39f0, 0x39ea, 0x39eb, 0x39ed, 0x39e8, 0x39e0, 0x3a85, 0x3a86, 0x3af0, 0x1e46, 0x3b45, 0x3b38, 0x3b3e, 0x3b42, 0x3b40, 0x3c47, 0x3c5c, 0x3c5e, 0x3cb4, 0x3cc2, 0x3d14, 0x3ce5, 0x3d15, 0x3d11, 0xf8ff, 0x3cee, 0x3ce7, 0x3cf5, 0x3cf4, 0x3ce8, 0x3d01, 0x3cef, 0x3cf1, 0xf900, 0x41db, 0x41bf, 0x41da, 0x41c7, 0x41dd, 0xf91a, 0x41eb, 0x41e1, 0x41c1, 0x41bd, 0x4507, 0x44fd, 0x4501, 0x450a, 0x4503, 0x4572, 0x4574, 0x4575, 0x45b2, 0x45b1, 0x45b4, 0x464c, 0x4642, 0x4640, 0x4649, 0x463c, 0x464d, 0x464a, 0x463b, 0x4761, 0x4774, 0xf926, 0x477f, 0x477a, 0x4788, 0x477c, 0x3e6f, 0x4770, 0x490f, 0x4928, 0x4913, 0x492a, 0x4aed, 0x4aef, 0x4b2e, 0x4bc1, 0x4bdd, 0x0b47, 0x4c2d, 0x4c2b, 0x4c35, 0x4c2f, 0x4c31, 0x4c34, 0xf935, 0x4c30, 0x4d3a, 0x4d39, 0x4d37, 0x4d4b, 0x4d54, 0x4d4d, 0x4d51, 0x4d47, 0x4f27, 0x4f50, 0x4f4d, 0x4f4e, 0x4f54, 0x4fd2, 0x4fce, 0x504b, 0x5049, 0x5105, 0x510f, 0x5119, 0xf943, 0x5106, 0x510c, 0x5129, 0x5104, 0x5108, 0x5125, 0x401c, 0x5103, 0x5127, 0x5110, 0x510a, 0xf942, 0x6b5d, 0x53aa, 0x53ab, 0x53a9, 0x5441, 0x543a, 0x543c, 0x542b, 0x5449, 0x5615, 0x4100, 0x5616, 0xf953, 0x5631, 0x3c4a, 0x573c, 0x577c, 0x576d, 0x576a, 0x5763, 0x576b, 0x577b, 0x5764, 0x577a, 0x5769, 0x576f, 0x5937, 0x5935, 0x593c, 0x5936, 0x593d, 0x593e, 0x5ae1, 0x5ae0, 0x5e2d, 0x5e2b, 0x5f8d, 0x5f92, 0x42b6, 0x5f8e, 0xf96b, 0x5f91, 0x5f96, 0x627b, 0x6278, 0x6281, 0x6296, 0x62a3, 0x6295, 0x6297, 0x6354, 0x6352, 0x63f5, 0x6400, 0x63fb, 0x63f4, 0x63f6, 0x64e8, 0x64ea, 0x663e, 0x663d, 0x663b, 0x6680, 0x43e4, 0x6688, 0x6681, 0x6682, 0x66ce, 0x6683, 0x6677, 0x6679, 0x6673, 0x666d, 0x6670, 0x668d, 0x6675, 0x668c, 0x666a, 0x6691, 0x6689, 0x668e, 0x12dc, 0x68ff, 0x6959, 0x69c7, 0x6a12, 0x6a14, 0x6a13, 0x6acb, 0x6b42, 0x44ad, 0x6b3d, 0x82ff, 0x6b40, 0x6b44, 0x6b62, 0x6b43, 0x6b3f, 0x6b45, 0x6b3c, 0xf997, 0x6b46, 0x6b47, 0xf9b3, 0x719e, 0x719d, 0x722c, 0x7229, 0x722f, 0x722e, 0x7230, 0x75e1, 0x75e2, 0x760e, 0x7619, 0x7612, 0x78b4, 0x7bda, 0x7d26, 0x7e59, 0x7e5a, 0x7e88, 0x7fc0, 0x7fba, 0x82a0, 0xf9dd, 0x82a2, 0x8486, 0x8fec, 0x849d, 0x8488, 0x848f, 0x848e, 0x849b, 0x86c1, 0x86c3, 0x86c4, 0x8696, 0x86c7, 0x86c6, 0x86bf, 0x48c3, 0x890f, 0x8e55, 0x8e42, 0x8e46, 0x8e4b, 0x8e43, 0x8e53, 0x8e48, 0x8e49, 0x8e4a, 0x8e4e, 0x4bde, 0x0691, 0x944b, 0x9680, 0x9681, 0x9683, 0x028a, 0x9682, 0x2342, 0x0922, 0x0070, 0x0071, 0x00bc, 0x1d18, 0x00be, 0x00ba, 0x00f8, 0x0137, 0x0135, 0x0afc, 0x0156, 0x0159, 0x015e, 0x026d, 0x0291, 0x0292, 0x0268, 0x0266, 0x0273, 0x3467, 0x0296, 0x028b, 0x028c, 0x0496, 0x04ee, 0x051c, 0x051a, 0x0519, 0x051b, 0x055d, 0x055e, 0xf818, 0x05dc, 0x05e2, 0x0652, 0x0692, 0x0730, 0x0752, 0x0742, 0x0741, 0x0745, 0x0737, 0x0740, 0x073f, 0x073d, 0x0738, 0x073a, 0x0749, 0x086b, 0x0878, 0x0879, 0xf826, 0x086c, 0x08e9, 0x08e6, 0x08e5, 0x08ea, 0x08e7, 0x08e8, 0x091f, 0x094b, 0x094a, 0x0953, 0x0976, 0x09a3, 0x09a4, 0x09f6, 0x09f3, 0x09f9, 0x09f7, 0x09fc, 0x0a1d, 0x0a6d, 0x0a71, 0x0a6c, 0x0a6e, 0x0a70, 0x0a6f, 0x0a67, 0x0a68, 0x0afa, 0x0af9, 0x0b4e, 0x53de, 0x0b4d, 0x0b4f, 0x0b4a, 0x0b4c, 0x3596, 0xf842, 0x0cee, 0x0cb2, 0x0cc0, 0x0cc1, 0x0cf4, 0x0cc8, 0x0cc5, 0x0cc6, 0x0cad, 0x11e2, 0x11ea, 0x11e3, 0x11e1, 0x12f7, 0x1301, 0x1312, 0x12f6, 0x12f1, 0x131f, 0x12ee, 0xf852, 0x12f3, 0x1315, 0x1316, 0x1317, 0x12f8, 0x1319, 0x12f2, 0x12f4, 0x12f5, 0x1313, 0x1306, 0x1526, 0x1524, 0x155a, 0x2ec8, 0x1597, 0x1595, 0x159a, 0x161f, 0x0afb, 0x1629, 0x1620, 0xf862, 0xf863, 0x174c, 0x1730, 0x1738, 0x173d, 0x1751, 0x174f, 0x174a, 0x1734, 0x1736, 0x5a30, 0x196a, 0x1968, 0x1a1c, 0x1a0e, 0x1a1e, 0x3759, 0x1a09, 0x1a08, 0x1a13, 0x1a01, 0x1a0f, 0x1a14, 0x1a06, 0x1a07, 0x5bb2, 0xf873, 0x3776, 0x1b79, 0x1bea, 0x1bed, 0x1be9, 0x1bee, 0x1c68, 0x1c64, 0x1c67, 0x1c72, 0x1c62, 0x1c74, 0x1c79, 0x1d19, 0x1d17, 0x1d15, 0x1d16, 0x1de6, 0x62a4, 0x1dee, 0x37d2, 0x1ddf, 0x1de4, 0x1dda, 0x1dea, 0x1ded, 0x1de3, 0x1de9, 0x1ffd, 0x0657, 0x2021, 0x20c6, 0x20b8, 0x20cb, 0xf885, 0x20bd, 0x20b5, 0x20bb, 0x20bf, 0x20be, 0x20b2, 0x20c1, 0x20c2, 0x2199, 0x21c6, 0x222c, 0x222d, 0x2225, 0x221e, 0x221f, 0x2223, 0x2350, 0x234e, 0x234d, 0x2352, 0x23e9, 0x23ec, 0x23e8, 0x2458, 0x245c, 0x245b, 0x248f, 0x3972, 0x24f6, 0x2500, 0x24fc, 0x24f8, 0x24ea, 0x24fe, 0x24f7, 0x24fd, 0x2670, 0x2662, 0x2644, 0x3920, 0x264d, 0x264c, 0x263f, 0x2666, 0x2635, 0x3929, 0x2634, 0x268d, 0x2684, 0x3938, 0x2686, 0x2689, 0x2687, 0x2683, 0x2675, 0x2679, 0x26af, 0x26b0, 0x29b7, 0x29bb, 0x29b9, 0x2a46, 0x2a47, 0x2a45, 0x2aea, 0x2af6, 0x2b68, 0x2b39, 0xf8b9, 0x2b3d, 0x2b3b, 0x2b4d, 0x2b30, 0x2b4a, 0x2b3e, 0x2b40, 0x2b4c, 0x2b47, 0x2b38, 0x2b52, 0x2b3a, 0x2b53, 0x2ec4, 0x2ec1, 0x2f1c, 0x2f1d, 0x2f2a, 0x2f1e, 0x2f2f, 0x2f22, 0x2f2e, 0x2f25, 0x3a89, 0x3ab0, 0x304a, 0x304b, 0x3076, 0x3abf, 0x30e8, 0x30ef, 0x30e9, 0x3ac5, 0x30ea, 0xf8cc, 0x3aea, 0x319b, 0x319e, 0x3193, 0x31a7, 0x319c, 0x31a0, 0x319a, 0x31ab, 0x31be, 0x31a9, 0x332d, 0x336e, 0x3444, 0x343d, 0x343a, 0x3468, 0x343c, 0x346a, 0xf8e0, 0x3438, 0x3465, 0x3439, 0x346d, 0x3436, 0xf8e3, 0x343e, 0x347e, 0x3437, 0x3899, 0x38a9, 0x38ad, 0x38a7, 0x38a8, 0x3966, 0x3969, 0x396d, 0x3967, 0x396b, 0x396a, 0x39ee, 0x3a01, 0x3a03, 0x39f4, 0x39fb, 0x3c37, 0x39f6, 0x39fc, 0x3af4, 0x3b08, 0x3b0a, 0x3b09, 0x3b6d, 0x3b62, 0x3b41, 0x3b5e, 0x3b5c, 0x3cf3, 0x3d26, 0x3ce4, 0x3d39, 0xf904, 0x3d6c, 0x3d2b, 0x3d2e, 0x3d3b, 0x3d5e, 0x3dfb, 0x3d27, 0x3d24, 0x3d69, 0x3d30, 0xf905, 0x3d62, 0x3d38, 0x3d35, 0x3d2a, 0x3d2c, 0x3d68, 0x3d31, 0x3d2f, 0x3d2d, 0x3d3a, 0x3d36, 0xf903, 0x3d21, 0x3d3c, 0x3d20, 0x3d64, 0x3d3e, 0x3ce8, 0x41f7, 0x4212, 0x41f1, 0x41f5, 0x4222, 0x41f2, 0x41df, 0x4215, 0x4216, 0x457a, 0x4576, 0x45be, 0x3e20, 0x45bd, 0x4609, 0x4608, 0x4657, 0x47a3, 0x47bf, 0x47b8, 0x47af, 0x479c, 0x47a5, 0x4772, 0x4775, 0x479d, 0x4799, 0x47b9, 0x494e, 0x4939, 0x493b, 0x4935, 0x493c, 0x4955, 0x4af0, 0x4af3, 0x4af4, 0x4b3b, 0x4b3c, 0x4b3a, 0x4b36, 0x4c07, 0x0ceb, 0x4c55, 0x4c50, 0x4c4f, 0x4c52, 0x4c56, 0x00bd, 0x4c32, 0x4d63, 0x4d6b, 0x4d66, 0x4d57, 0x4d5d, 0x3f86, 0x4d6d, 0x4d61, 0x4d69, 0x4d5a, 0x4d5c, 0x4d62, 0x4f2a, 0x4f29, 0x4f58, 0x4f5a, 0x4fd7, 0x4fdb, 0x4fdc, 0x4fdd, 0x4fd8, 0x5054, 0x505b, 0x505c, 0x5053, 0x504f, 0x5056, 0x5050, 0x505a, 0x506b, 0x5136, 0x5153, 0x513a, 0x513c, 0x513e, 0x5149, 0x5140, 0xf946, 0xf947, 0x5364, 0x5365, 0x53b5, 0x53b6, 0x53b2, 0x5448, 0x544a, 0x5472, 0x5469, 0x545a, 0x544c, 0x562c, 0x5630, 0x564b, 0x5649, 0x5642, 0x5644, 0x564a, 0x564f, 0x5792, 0xf957, 0x5797, 0x5780, 0x5782, 0x5786, 0x5953, 0x595e, 0x5952, 0x595b, 0x594e, 0x5a6d, 0x5a6e, 0x5afa, 0x5af6, 0x5afb, 0x5e33, 0x5e3d, 0x5e37, 0x5e3e, 0x5e35, 0x5f9a, 0x5fab, 0x5fa6, 0x5fb0, 0x5f99, 0x5fa0, 0x5f9e, 0x5fa8, 0x5fa1, 0x5faa, 0x5fad, 0x5fbb, 0x5f9c, 0x5fa5, 0x00b3, 0x6227, 0x628d, 0x628e, 0x628f, 0x6292, 0x4356, 0x6291, 0x62ad, 0x6357, 0x6358, 0x635e, 0x635d, 0x635c, 0x635b, 0x4367, 0x640a, 0x6403, 0x640e, 0x64b8, 0x654d, 0x653f, 0x6547, 0x654b, 0x654a, 0x653d, 0x8038, 0x6541, 0x654c, 0x8081, 0x6662, 0x6669, 0x6661, 0x43d1, 0x66aa, 0x66a6, 0x66ac, 0x66bd, 0x66bb, 0x66a4, 0x66ba, 0x669a, 0x43eb, 0x66a1, 0x66c1, 0x68e0, 0x690a, 0x6903, 0x6906, 0x6939, 0x693a, 0x6936, 0x695b, 0x695f, 0x695e, 0x6967, 0x6961, 0x6962, 0x695d, 0x69ca, 0x69cc, 0x69ce, 0x6a18, 0x6a1d, 0x6a1f, 0x6a20, 0x6a17, 0x6a15, 0x6b1f, 0x6b27, 0x6b26, 0x1e10, 0x6b8b, 0x6bae, 0x6b8a, 0xf999, 0x6b92, 0x6b89, 0x6b87, 0x44b6, 0x6b8f, 0x6b84, 0x6b83, 0x6b8c, 0x6b93, 0x6b8d, 0x6b98, 0x6b7d, 0x6b7e, 0x6bd2, 0x6b80, 0x6b99, 0x71ac, 0x7250, 0x7255, 0x7242, 0x723f, 0x723c, 0x45a3, 0x724c, 0x7249, 0x7257, 0x7258, 0x724f, 0x725c, 0x7247, 0xf9b7, 0x75ab, 0x4610, 0x75af, 0x75ad, 0x75e8, 0x75e7, 0x7630, 0x7626, 0x762f, 0x7628, 0x762b, 0x761d, 0x762d, 0x7620, 0x762a, 0x762c, 0x7635, 0x7621, 0x7623, 0x7624, 0x7636, 0x7637, 0x77e9, 0x78ba, 0x78b8, 0xf9cc, 0x796d, 0x796a, 0x7968, 0x7969, 0x796b, 0x7961, 0x7bdc, 0x7bdb, 0x7c2d, 0x7c2c, 0x7ca2, 0x7d2b, 0x7d32, 0xf9d7, 0x7e94, 0x7e92, 0x7e90, 0x7fc9, 0x7fc4, 0x7fc1, 0x7fc3, 0x7fcd, 0x8214, 0x82a7, 0x82af, 0x82aa, 0x840d, 0x8454, 0x845b, 0x8461, 0x84ae, 0x84b3, 0x84c0, 0x84c4, 0x84bf, 0x84cb, 0x84ad, 0x84a7, 0x84a4, 0x84bd, 0x84af, 0x84b2, 0x84a5, 0x86e7, 0x86e0, 0x86ce, 0x86de, 0x86d5, 0x86df, 0x86d9, 0x87f2, 0x8923, 0x8940, 0x491b, 0x893e, 0x4987, 0x8ccf, 0x0b54, 0x8e5b, 0x8e58, 0x8e62, 0x8e5f, 0x8e67, 0x8e63, 0x8e5e, 0x8e60, 0x8f85, 0x8f86, 0x8f87, 0x91e8, 0x91e6, 0x9671, 0x9685, 0xfa02, 0x9686, 0x9810, 0x09f8, 0x00bf, 0x0b61, 0x00fe, 0x00fc, 0x0139, 0x0161, 0x0160, 0x02e2, 0x02ea, 0x02e3, 0x02b4, 0x02ae, 0x02be, 0x02b8, 0x02a8, 0x02aa, 0x02a9, 0x02b3, 0x02d5, 0x02ad, 0x02b9, 0x02bb, 0x02b1, 0x02c2, 0xf808, 0x02eb, 0x02ba, 0x02d2, 0x02d4, 0x04f1, 0x051d, 0xf812, 0x0562, 0x058c, 0x05e6, 0x05e7, 0x065a, 0x0658, 0x0659, 0x0696, 0x0697, 0x0761, 0x0767, 0x0771, 0x0765, 0x077d, 0x077e, 0x087d, 0x0884, 0x087c, 0x087e, 0x087f, 0x0880, 0x08ef, 0x08f4, 0x091e, 0x094e, 0x09fb, 0x09fa, 0x09fd, 0xf831, 0xf832, 0x0a79, 0x0a7c, 0x0a7d, 0x0a84, 0x0a7b, 0x0a78, 0x3557, 0x0b5e, 0x0b5a, 0x0b5c, 0x0b59, 0x0b55, 0x0b63, 0x0b56, 0x0b5f, 0x0b60, 0x0b5b, 0x0d4a, 0x0d65, 0x0db3, 0x0d2c, 0x0d77, 0x0d3d, 0x0d52, 0x0d61, 0x0d2a, 0x0d3e, 0x0d34, 0x0d29, 0x0db2, 0x0dad, 0x0d40, 0x0d53, 0xf844, 0x0d3f, 0x0d41, 0x0d72, 0x11f6, 0x11f5, 0x11f4, 0x11f2, 0x11f9, 0x1327, 0x1354, 0x1355, 0x132e, 0xf854, 0xf853, 0x132c, 0x1338, 0x1339, 0x1331, 0x134f, 0x1373, 0x1330, 0x132b, 0x1351, 0x152c, 0x155b, 0x155c, 0x1568, 0x156c, 0x156b, 0x1569, 0x159f, 0x1638, 0x163c, 0x163a, 0x1635, 0x369d, 0x1639, 0x1636, 0x163b, 0x1760, 0x1761, 0x1763, 0x1764, 0x1794, 0x1793, 0x175e, 0x1768, 0x176a, 0x1765, 0xf866, 0x1790, 0x175f, 0x1772, 0xf865, 0x1a3c, 0x1a27, 0x1a24, 0x1a26, 0x1a25, 0x375f, 0x1a28, 0x1a36, 0x1b31, 0x1b30, 0x1b34, 0x1b81, 0x1b7d, 0x1b82, 0x1b80, 0x3779, 0x02d3, 0x1bf2, 0x1c66, 0x1c8c, 0x1c7b, 0x1c83, 0x3798, 0x1c8e, 0x1c7a, 0x1c92, 0x1c91, 0x1c82, 0x1d1b, 0x1d1c, 0x1e27, 0x1e21, 0x37dc, 0x5d2b, 0x1e43, 0x37df, 0x1e18, 0x1e7b, 0x1e1a, 0x1e4b, 0x1e4a, 0x1e4d, 0x1e4f, 0x1e19, 0x1e35, 0x1e13, 0x1e52, 0x1e14, 0x1e1e, 0x1e2c, 0x1e20, 0x1e22, 0x1e12, 0x1e1f, 0x2000, 0x2023, 0x2040, 0x2043, 0x20e4, 0x20db, 0x20ea, 0x20dd, 0x20cc, 0x20d9, 0x20e8, 0x20f6, 0x20e3, 0x20d3, 0x20da, 0x20d6, 0x20e7, 0x223a, 0x223f, 0x2240, 0x2248, 0x2259, 0x2237, 0x2244, 0xf88c, 0xf88b, 0x2255, 0x2239, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x238d, 0x23f2, 0x23f8, 0x23f5, 0x23f6, 0x23fc, 0x23fe, 0x23f1, 0x23fd, 0x245e, 0x2496, 0x2497, 0x249c, 0x249b, 0x2495, 0xf89a, 0x251a, 0x2509, 0x2504, 0x250e, 0x251c, 0x2518, 0x250d, 0x2510, 0x250c, 0x2503, 0x267b, 0x26a6, 0x2677, 0x2688, 0x2674, 0x26da, 0x2676, 0x2678, 0x268a, 0x268f, 0x267d, 0x2690, 0x26ed, 0x26d9, 0x26d0, 0x271a, 0x26d7, 0x26e2, 0x26e1, 0x26c5, 0x26e0, 0x26ca, 0x2725, 0x26cc, 0xf8b3, 0x29c6, 0x29c1, 0x2a4d, 0x2b4b, 0x2b64, 0x2b95, 0x2b99, 0xf8bc, 0x2b94, 0x2ba2, 0x2bae, 0x2b9e, 0x2ba7, 0x2b86, 0x39fd, 0x2ba4, 0x2b91, 0x2b93, 0xf8bb, 0x2b88, 0x2ecd, 0x2eca, 0x2f3f, 0x2f40, 0x2f46, 0x2f41, 0x2f45, 0x2f58, 0x2f3b, 0x2f48, 0x304e, 0x3052, 0x304f, 0x307b, 0x307a, 0x30a0, 0x309f, 0x30fb, 0x30f7, 0x31b8, 0x31b9, 0x31bb, 0x31b7, 0x3af4, 0x31ba, 0x3aef, 0x31da, 0x31b5, 0x31bf, 0x31bc, 0x31c0, 0xf8d3, 0xf8d9, 0x3375, 0x3379, 0x3376, 0x3435, 0x3440, 0x34c0, 0x3481, 0x34ad, 0x34af, 0x34ac, 0x348f, 0x34a8, 0x34aa, 0x34a9, 0x3488, 0x347f, 0x3480, 0x34bc, 0x38ae, 0x38bb, 0x38bd, 0x3c31, 0x3978, 0x3974, 0x3a0c, 0x3a11, 0x3a08, 0x3a06, 0x3a10, 0x3a8f, 0x3a90, 0x3a8d, 0x3a8e, 0x3a96, 0x3a95, 0x3b0b, 0x3b0c, 0x3b7c, 0x3b73, 0x3b75, 0x3b76, 0x3b7d, 0x3b78, 0x3b71, 0x3c4b, 0x3c4e, 0x3d33, 0x3d32, 0x3d03, 0x3d91, 0x3de7, 0x3de9, 0x3da2, 0x3d94, 0x3d87, 0x3da3, 0x3ddd, 0x3d7b, 0x3d83, 0x3d81, 0x3ddf, 0x3d7c, 0x3de4, 0x3de2, 0x3d93, 0x3d7d, 0x3dbf, 0x3d9b, 0x3d8e, 0x3d9f, 0x3d09, 0x3d8c, 0x3d7f, 0x3d9c, 0x3d84, 0x3d42, 0x3de6, 0x4251, 0x424a, 0x4264, 0x4225, 0x422f, 0x422e, 0x422b, 0x4228, 0x4232, 0x422d, 0x4231, 0x4239, 0x422c, 0x4261, 0x4511, 0x4510, 0x4512, 0x4553, 0x4555, 0x457b, 0x4581, 0x457d, 0x457c, 0x45c2, 0x45c5, 0xf922, 0x45c4, 0xf923, 0x466b, 0x4668, 0x3e3e, 0x465c, 0x465d, 0x466a, 0xf924, 0x4c76, 0x4776, 0x3e77, 0x47c4, 0x47cb, 0x47c8, 0x47d4, 0x47d5, 0x47c9, 0x47d7, 0x3e7b, 0x4978, 0x495a, 0x495b, 0x495c, 0x4956, 0x4958, 0x4971, 0x69d4, 0x4b40, 0xf933, 0x4b3f, 0x4b43, 0x4b41, 0x4be2, 0x4be0, 0x4be3, 0x4c66, 0x4c73, 0x4c6c, 0x4c71, 0x4c6a, 0x4c6d, 0x4c6e, 0x4c6b, 0x4d8c, 0x4d77, 0xf93a, 0x4d7f, 0x4d89, 0x4d7a, 0x4d85, 0x4d78, 0x4d8a, 0x4d86, 0x4f2c, 0x4f67, 0x4f5b, 0x4fe5, 0x4fe1, 0x5061, 0x5069, 0x506a, 0x5165, 0x516d, 0x5163, 0x5186, 0x515c, 0x5162, 0xf948, 0x5179, 0x5169, 0x5170, 0x5176, 0x515d, 0x5187, 0x516e, 0x5171, 0x517c, 0x5173, 0x515b, 0x516b, 0x53bf, 0x53c1, 0x53bd, 0x53c9, 0x53bc, 0x53c2, 0x53c0, 0x5492, 0x54a9, 0x548f, 0x5476, 0x547b, 0x5475, 0x54a4, 0x5664, 0x573d, 0x57af, 0x413a, 0xf958, 0x579d, 0x5799, 0x57b1, 0x5963, 0x5962, 0x5964, 0x5969, 0x41a0, 0x5a75, 0x5a73, 0x5a71, 0x5a74, 0x5b0c, 0x5b16, 0x41e5, 0x5b11, 0x5b1f, 0x5b1a, 0x5b0d, 0x5b1b, 0x5b13, 0x5e4e, 0x5e55, 0x5e50, 0x427d, 0x5fd2, 0x5fd3, 0x5fd1, 0x5ff1, 0x5fdc, 0x5fc8, 0x5fcc, 0x5fd0, 0x5fcf, 0x5fdf, 0x622b, 0x622e, 0x622d, 0x629d, 0x629e, 0x629f, 0x62a9, 0x62a0, 0x6298, 0x62a1, 0x62ab, 0x62af, 0x636e, 0x635f, 0x635a, 0x436d, 0x6365, 0x6368, 0x6372, 0x6417, 0x6416, 0x6418, 0x6419, 0x641a, 0x6422, 0x641b, 0x641c, 0x64be, 0x64ee, 0x655a, 0x6550, 0x6558, 0x6554, 0x6557, 0x6556, 0x6615, 0x669b, 0x6693, 0x6692, 0x6672, 0x6698, 0x6699, 0x66df, 0x43f8, 0x66d5, 0x8158, 0x66d4, 0x66f3, 0x66f4, 0x66e7, 0x66e1, 0x66e6, 0x66eb, 0x66ec, 0x02db, 0x4450, 0x690d, 0x690c, 0x1b2f, 0x6968, 0x6965, 0x696b, 0x6969, 0x69d1, 0x69d3, 0x6a27, 0x6a28, 0x4468, 0x4467, 0x6a24, 0x6ad7, 0x6bca, 0x6bc7, 0xf99e, 0x6bd8, 0x6be1, 0x6bc6, 0x6bf8, 0x6bc3, 0x6bf4, 0x6c17, 0x6bea, 0x6bcb, 0x6b86, 0x6bc4, 0x6bd9, 0x6c19, 0x6bc2, 0x6be2, 0x44cf, 0x6bde, 0x6bed, 0xf99c, 0x44cd, 0x6c1d, 0x6bdd, 0x6bdb, 0x6be8, 0x6be9, 0x6bbf, 0x6be0, 0x6bd1, 0x6bdc, 0x6bce, 0x6c1e, 0x6bcc, 0x6bf2, 0x6bf3, 0xf99f, 0xf9a2, 0xf9a3, 0xf9a1, 0x71ab, 0x71aa, 0x71a7, 0x71a9, 0x7288, 0x7275, 0x7260, 0x726c, 0x7273, 0x45ab, 0x726e, 0x7274, 0x7276, 0x7268, 0x7277, 0x7286, 0x75ea, 0x7651, 0x7650, 0x7658, 0x764d, 0x764f, 0x764e, 0x765c, 0x7652, 0x7644, 0x764a, 0x764b, 0x77ea, 0x7810, 0x7811, 0x78cd, 0x78bf, 0x78c4, 0x78d0, 0x78ce, 0x78c0, 0x78c2, 0x78cf, 0x78c9, 0x78bb, 0x7997, 0x7992, 0x796f, 0x797e, 0x799a, 0x46c1, 0x7986, 0x7973, 0x8a24, 0x7977, 0x798f, 0x7970, 0x7981, 0x7982, 0x7999, 0x797d, 0x797f, 0x797b, 0x7987, 0x7bb2, 0x7c2f, 0x7c34, 0x7c2e, 0x7c32, 0x4747, 0x7caa, 0x4757, 0x7ca9, 0x7d38, 0x7d36, 0x7d37, 0x7d47, 0x7d33, 0x7d39, 0x7d35, 0x7d44, 0x7ea5, 0x7ea6, 0x7e9e, 0x7fe3, 0x7fdf, 0x7fd3, 0x7ff1, 0x7fe4, 0x7fe0, 0x7fd6, 0x8dc3, 0x7fe6, 0x7fd8, 0x7fde, 0x7fdb, 0x7fdc, 0x821b, 0x821f, 0x821d, 0x821c, 0x821e, 0x8220, 0x8221, 0x484e, 0x82b6, 0x82bc, 0x82c6, 0x82c7, 0x82ba, 0x82be, 0x82bd, 0x82b5, 0x82b4, 0x840f, 0x8462, 0x84eb, 0x84d9, 0x84e4, 0x84d7, 0x84d8, 0x84d6, 0x84ce, 0x84dd, 0x84e7, 0x84d2, 0x84c5, 0x84c9, 0x84db, 0x8692, 0x868a, 0x868b, 0x8689, 0x8708, 0x8703, 0x8706, 0x8705, 0x86f5, 0x870b, 0x86fb, 0x87fc, 0x8801, 0x8802, 0x87fa, 0x8808, 0x87f7, 0x8800, 0x87ff, 0x8806, 0x87f6, 0x87fb, 0x880a, 0x8925, 0x8943, 0x8944, 0x8c64, 0x8c62, 0x8c5e, 0x8c5b, 0x8cd6, 0x0072, 0x00c2, 0x8e77, 0x8e82, 0x8e7c, 0x8e7d, 0x8e86, 0x8e81, 0x8e84, 0x8e76, 0x8e83, 0x8e7f, 0x8e7e, 0x8f88, 0x8f8d, 0x8f8b, 0x8f91, 0x8f8f, 0x907c, 0x9079, 0x907a, 0x91ea, 0x944c, 0x9599, 0x02d1, 0x968b, 0x968d, 0x968a, 0x968e, 0x9811, 0x2256, 0xfa15, 0x0074, 0x00c3, 0x00c4, 0x011b, 0x015f, 0x016a, 0x0169, 0x016b, 0x030c, 0x02f6, 0x02ed, 0x0329, 0x02fe, 0x02f1, 0x0317, 0x02ff, 0x02ee, 0x02fd, 0x031c, 0x02fc, 0x0300, 0x0320, 0x3477, 0x02f9, 0x0367, 0x0308, 0x049e, 0x04f3, 0x0525, 0x0527, 0x051f, 0x0565, 0x0563, 0x0594, 0x0597, 0x05f1, 0x065f, 0x0662, 0x51f2, 0x0660, 0xf822, 0x078c, 0x0782, 0x0790, 0x078b, 0x078d, 0x0781, 0x079d, 0x088e, 0x088f, 0x0892, 0x0923, 0x0952, 0xf82e, 0x0a00, 0x0a01, 0x0a02, 0x0a1f, 0x0a8c, 0x0a89, 0x0a8b, 0x0a88, 0x0a8d, 0x0a8f, 0x6385, 0x0b00, 0x0b05, 0x0b01, 0x0b68, 0x0b6e, 0x0b67, 0x0b75, 0x55b6, 0xf845, 0x0dd7, 0xf846, 0x0048, 0x0dd4, 0x0dd8, 0xf847, 0xf848, 0x0dba, 0xf849, 0x0ddb, 0x0dbf, 0x0e35, 0x0dbc, 0x0dd9, 0x35c4, 0x0ddd, 0x0e00, 0x0dd5, 0x0e30, 0x0dbd, 0x0ddc, 0x11fd, 0x11fe, 0x1207, 0x4517, 0x136f, 0x1369, 0x1370, 0x1367, 0x13a9, 0x1395, 0x1390, 0x136c, 0x1397, 0x1371, 0x3652, 0x1374, 0x136d, 0x138e, 0x152f, 0xa31b, 0x15a9, 0x164e, 0xf85f, 0x165a, 0x1648, 0x1655, 0x164c, 0x1649, 0x164f, 0x164a, 0x17d6, 0x17a0, 0x17a9, 0xf867, 0x179d, 0x17d4, 0x17a4, 0x17a8, 0x17a6, 0x17e6, 0x197d, 0x1977, 0x197a, 0x1a41, 0x1a49, 0x1a59, 0x1a45, 0x1a48, 0x1a40, 0x1b8e, 0x1b95, 0x1b90, 0x1bf7, 0x1bf8, 0x1bf6, 0x1bfb, 0x1c9e, 0x1c9d, 0x1c99, 0xf877, 0x1ca3, 0x1ca9, 0x1c98, 0x1ca0, 0x1c96, 0x1c94, 0x1c95, 0x1c9f, 0x1ca1, 0x1d21, 0x1d1d, 0x1d1f, 0x1e6d, 0xf87c, 0x1e9a, 0x1e92, 0x1e7a, 0x1e7d, 0x1ea1, 0x1e9d, 0x1e99, 0x1e6b, 0x1e6e, 0xf87d, 0x2045, 0xf884, 0x20fb, 0x20eb, 0x20f2, 0x20f9, 0xf886, 0x20f8, 0x20ed, 0x2101, 0x20f7, 0x2106, 0x219b, 0x21ca, 0x386b, 0x5ec3, 0x226b, 0x226c, 0x2274, 0x2267, 0x225b, 0x2260, 0x2276, 0x2263, 0x2261, 0x2328, 0x235b, 0x235e, 0x2360, 0x235d, 0x235c, 0x23f4, 0x2400, 0x2408, 0x2407, 0x2401, 0x2405, 0x2464, 0x2463, 0x249e, 0x24a0, 0x24a1, 0x249f, 0x2526, 0x252d, 0x2528, 0x251d, 0x26ec, 0x26e3, 0x26eb, 0x2716, 0x26c8, 0x661b, 0x26e9, 0x26e4, 0x2724, 0x26d1, 0x3941, 0x26dd, 0x26c2, 0x26cb, 0x26c7, 0x26e7, 0x3950, 0x26ea, 0x274b, 0xf8a5, 0x2760, 0x277d, 0x273e, 0xf8a4, 0x2752, 0x274e, 0x273c, 0x2732, 0x2730, 0x2723, 0x29ca, 0x29cb, 0x29c9, 0x29c8, 0x29cd, 0x2b98, 0x2ba0, 0x2b9f, 0x2b9c, 0x2ba3, 0x2b97, 0xf8be, 0x2bf1, 0x2c09, 0x2c03, 0x2bea, 0x2c45, 0x2bed, 0x2c05, 0x2c1a, 0x2c15, 0x2c01, 0x2bec, 0x2c0e, 0x2c17, 0x2c42, 0x2c12, 0x2c10, 0x2bef, 0x2bff, 0x2c00, 0x2c0c, 0x2c0f, 0x2c04, 0x2c08, 0x2c14, 0x2c43, 0xf8bd, 0x2c1b, 0x2c11, 0x2c13, 0x2ecf, 0x2ece, 0x2f6f, 0x2f6e, 0x2f7a, 0x2f70, 0x2f64, 0x2f5e, 0x2f6c, 0xf8c9, 0x2f5b, 0x2f61, 0x2f65, 0x307f, 0x3080, 0x307c, 0x30a7, 0x30a6, 0x30a1, 0x3ac0, 0x30a8, 0x30a3, 0x30a2, 0x30ad, 0x30a5, 0x3101, 0x30ff, 0x30fc, 0x3100, 0x3135, 0x31ee, 0x31ef, 0x31f6, 0x31e8, 0x31ea, 0x31e3, 0x321f, 0x3afc, 0x31e4, 0x31fa, 0x31f1, 0x31fb, 0xf8d4, 0x333d, 0x333c, 0x3479, 0x3378, 0x3377, 0x440b, 0x34d1, 0x34c7, 0x34df, 0x34d0, 0x34e0, 0x34d6, 0x34d8, 0x3516, 0x350e, 0x34d9, 0x350f, 0x3511, 0x34cd, 0x3489, 0x34ce, 0x3514, 0x34da, 0x3512, 0x34d3, 0x34c2, 0x34e1, 0x34e9, 0x34ea, 0x34de, 0x3515, 0x38d9, 0x38d6, 0x38cd, 0x38d0, 0x38d3, 0xf8f0, 0x3982, 0x3985, 0x397f, 0x397d, 0x3981, 0x3983, 0x3984, 0x84a0, 0x3a28, 0x3a0f, 0x3a17, 0x3a1a, 0x3a25, 0xf8f7, 0x3a9b, 0x3a99, 0x3b92, 0x3b8c, 0x3b95, 0x3b8d, 0x3ba3, 0x3b93, 0x3b91, 0x3ddb, 0x3d99, 0x3d9a, 0x3e08, 0x3e4c, 0x3e0d, 0x3e01, 0x3e4e, 0x3e02, 0x3e4d, 0x3e21, 0x3dfc, 0xf909, 0x3d8a, 0xf908, 0x3d95, 0x3e11, 0x3e12, 0x3e46, 0x3e1c, 0x3e49, 0x3e0c, 0x3d1e, 0x3e13, 0x3e16, 0x3dfd, 0x3e0f, 0x3e1f, 0x4230, 0x426e, 0x426b, 0x429b, 0x427b, 0x4263, 0x4297, 0x426d, 0x429c, 0x4298, 0x426f, 0x4267, 0x4269, 0x4515, 0x4563, 0x4586, 0x458a, 0x4587, 0x4588, 0x4585, 0x4589, 0x45ca, 0x45c7, 0x45cb, 0x45cc, 0x45c9, 0x460d, 0x4683, 0x4684, 0x4678, 0x4682, 0x4673, 0x4679, 0x468c, 0x47d0, 0x47cf, 0x47d2, 0x47d9, 0x47cc, 0x47eb, 0x47fd, 0x47ec, 0x47e8, 0x47f8, 0x47fa, 0xf927, 0x3e85, 0x47e1, 0x47fb, 0x48e7, 0xf92e, 0x49a5, 0x4991, 0x49a6, 0x497c, 0x4992, 0x49a2, 0x49a0, 0x4afc, 0x4afe, 0x4b57, 0x4b53, 0x4b58, 0x4be7, 0x4c8e, 0xf938, 0x4c83, 0x4c8b, 0x4c84, 0x3f97, 0x4da2, 0x4db7, 0x4da9, 0x4da5, 0x4d9f, 0x4daa, 0x4d97, 0x4da1, 0x4d9e, 0x4dab, 0x4d99, 0x4da3, 0x4f30, 0x4f32, 0x4f2f, 0x4f70, 0x4f6c, 0x4f6f, 0x4fe8, 0x4fee, 0x4fea, 0x506d, 0x5076, 0x5070, 0x5071, 0x506c, 0x51eb, 0x51b5, 0x5196, 0x5190, 0x518d, 0xf949, 0x51a2, 0x51b0, 0x5192, 0x51a0, 0x5193, 0x51c3, 0x518e, 0x51b6, 0x519d, 0x5195, 0x51b3, 0x51a4, 0x5370, 0x53d4, 0x4093, 0x53cf, 0x0170, 0x5494, 0x7861, 0x54c0, 0x54b4, 0x54c1, 0x40b2, 0x54bd, 0x54af, 0x5677, 0x5678, 0x566b, 0x566d, 0x566e, 0x5672, 0x566f, 0x5671, 0x30ab, 0x568c, 0x573f, 0x57b6, 0x57b7, 0x7a06, 0x57bb, 0x57b8, 0x079c, 0x57b9, 0x7a01, 0x598b, 0x597a, 0x5984, 0x5988, 0x5991, 0x5979, 0x598e, 0x5980, 0x5982, 0x597c, 0x41a4, 0x5a84, 0x5a7f, 0x41f2, 0x5b3b, 0x5b71, 0x5b3d, 0x5b30, 0x41f1, 0x5b3e, 0x5b38, 0x5e5e, 0x5e64, 0x4281, 0x5e5d, 0x5e6d, 0x5e4f, 0x5e62, 0x5e5f, 0x5fec, 0x5ff2, 0x5ff4, 0x5ff7, 0x5ff6, 0x6007, 0x5fed, 0x5fea, 0x5ff0, 0x5ff8, 0x5ff3, 0x42dc, 0xf972, 0x6231, 0x622f, 0x62b6, 0x62ae, 0x62aa, 0x62bf, 0x62cc, 0x62c7, 0x6c83, 0x6380, 0x637b, 0x637f, 0x637d, 0x6383, 0xf978, 0x6446, 0x642d, 0x6425, 0x6426, 0x642c, 0x6437, 0x6431, 0x6433, 0x6432, 0x6427, 0x642a, 0x642e, 0x642f, 0x64c0, 0x6571, 0x6561, 0x6562, 0x6566, 0x6618, 0x66c5, 0x66c3, 0x66c4, 0x66c2, 0x66ae, 0x6710, 0x6708, 0x671f, 0x673a, 0x673b, 0x6736, 0x670c, 0x6706, 0x672a, 0x6757, 0x6750, 0x6720, 0xf985, 0x672c, 0x6721, 0x670b, 0x6719, 0x6735, 0x6718, 0x670f, 0x6713, 0x6755, 0x6739, 0x671a, 0x440c, 0x6717, 0x68e4, 0x68e9, 0x458b, 0x6910, 0x6912, 0x693f, 0x696e, 0x4518, 0xf98c, 0x69d6, 0x69d5, 0x69d7, 0x0b02, 0x446d, 0x6a31, 0x6a30, 0x6a3a, 0x6b85, 0x6b6b, 0x6c48, 0x6c4b, 0x6c37, 0x6c7b, 0x6c6c, 0x6c85, 0x6c65, 0x6c36, 0x6c86, 0x6c34, 0x6c68, 0x6c5a, 0x6c58, 0x6c72, 0x6c6a, 0x6bd3, 0x6c3c, 0x6c33, 0x6c3b, 0x6c4d, 0x6c4f, 0x6c7c, 0x6cb0, 0x6c5b, 0x6c55, 0x6c64, 0x6c6b, 0x6c53, 0x44e6, 0x6c57, 0x6c5e, 0x6c6d, 0x6c35, 0x6c69, 0x6c59, 0x6c66, 0x6c50, 0x6c51, 0x6c5c, 0x6d5d, 0x6c87, 0x6c78, 0x6c49, 0x6c4e, 0x6bf1, 0x6c73, 0x6c88, 0x6bcf, 0xf9a4, 0x71b1, 0x71b3, 0x729c, 0x72a4, 0x7290, 0x72b8, 0x72a0, 0x729d, 0x72a8, 0x72a9, 0xf9b9, 0x72b1, 0x7293, 0x729b, 0x72a2, 0x72a1, 0x72b0, 0x72a7, 0x75b3, 0x8849, 0x75b4, 0x75f1, 0x75ed, 0x75ec, 0x7668, 0x7675, 0x766a, 0x7662, 0x7667, 0x7660, 0x7677, 0x765f, 0x7679, 0x7823, 0x7821, 0x781c, 0x8999, 0x781f, 0x781e, 0x78d6, 0x78d3, 0x78d9, 0x78d7, 0x78d4, 0x78dc, 0x78d8, 0x79a3, 0x46d1, 0x79be, 0x79a9, 0x79a1, 0x79a0, 0x79ab, 0x79a2, 0x79ba, 0x79c2, 0x799c, 0x79bb, 0x79aa, 0x79ac, 0x79a5, 0x79c1, 0x472c, 0x7be2, 0x7c36, 0x7c3d, 0x7c3a, 0x2461, 0x7c48, 0x7c3c, 0x7cb7, 0x7cac, 0x7cb3, 0x7cb6, 0x7cb2, 0x476e, 0x7d5d, 0x7d49, 0x7d4e, 0x7d4f, 0x7d4d, 0x7d5c, 0x7e5d, 0x7ebb, 0x7ece, 0x7ebf, 0x7eba, 0x7ec3, 0x47e5, 0x8006, 0x7ff8, 0x7ffe, 0x8013, 0x7ff6, 0x47e6, 0x8234, 0x822d, 0x822a, 0x8235, 0x822c, 0x82d4, 0x82da, 0x82d3, 0x82d2, 0x82ce, 0x82cf, 0x489f, 0x84fd, 0x850b, 0x84fe, 0x84f8, 0x84f7, 0x8517, 0x84fa, 0x84f9, 0x8500, 0x84f5, 0x84f1, 0x8503, 0x8505, 0x851c, 0x86ac, 0x869a, 0x86ad, 0x86a0, 0x871b, 0x8725, 0x8724, 0x8726, 0x8727, 0x8728, 0x872a, 0x871a, 0x872e, 0x8715, 0x8815, 0x8814, 0x8817, 0x8818, 0x880f, 0x8813, 0x880b, 0x8822, 0x137a, 0x8926, 0x921f, 0x8951, 0x894d, 0x894e, 0x894a, 0x894b, 0x894c, 0x8950, 0x8962, 0x894f, 0x8952, 0x8c68, 0x8c69, 0x8ce5, 0x8cf0, 0x8ce1, 0x8ce2, 0xf9f2, 0x8ea5, 0x8ea9, 0x8ea4, 0x8eaf, 0x8eac, 0x8eae, 0x8eaa, 0x8f95, 0x8f99, 0x8f93, 0x8f9d, 0x8f98, 0x8f9c, 0x8f97, 0x4a0d, 0x9089, 0x9087, 0x91d7, 0x91ed, 0x91f1, 0x91f0, 0x9205, 0x9203, 0x9204, 0x925f, 0x9457, 0x959c, 0x95a1, 0x959a, 0x968f, 0x9693, 0x969e, 0x96a3, 0x9698, 0x9699, 0x9695, 0x986e, 0x986a, 0x9af4, 0x9af7, 0x9c79, 0x9f8f, 0x9f91, 0xa00b, 0xa502, 0x0084, 0x0104, 0x0180, 0x032f, 0x033f, 0x033b, 0x0362, 0x0344, 0x0333, 0x035f, 0x032b, 0xf809, 0x0339, 0x0336, 0x0348, 0x0335, 0x036c, 0x0358, 0x033a, 0x04a8, 0x04f4, 0x0529, 0x059a, 0x0600, 0x07bb, 0x07bd, 0x07b7, 0x07b2, 0x34f8, 0x07a8, 0x07ab, 0x07a6, 0x07bc, 0x0897, 0x0896, 0x08f8, 0x5313, 0x0951, 0x3533, 0x09b5, 0x09b4, 0x09b6, 0x353c, 0x09b7, 0x0a05, 0x0a23, 0x0a95, 0x0a98, 0x354f, 0x0a94, 0x0a93, 0x0b07, 0x0b73, 0x0b71, 0x0b72, 0x0b78, 0x0e5f, 0x0e6a, 0x0e67, 0x0e6b, 0x0e69, 0x0e8e, 0x0e49, 0x0e80, 0x35dc, 0x0e44, 0x0e8f, 0x0e45, 0xf84c, 0x0e4f, 0x0e63, 0x0e36, 0x0e48, 0x0e5c, 0x0e93, 0x0e61, 0x0e60, 0x0e4e, 0x0e5e, 0x0e3f, 0x0ea4, 0x55e0, 0x0e68, 0x120b, 0x1211, 0x120d, 0x120e, 0x13c2, 0xf857, 0x13b0, 0x13c3, 0x13c8, 0x1365, 0x13d7, 0x13bd, 0x13b8, 0x13b6, 0x13c7, 0x13bc, 0x13b1, 0x13af, 0xf85b, 0x1535, 0x1530, 0x155d, 0x0b76, 0x156f, 0x15b0, 0xf85e, 0x15b4, 0x165c, 0x165d, 0x1808, 0x17ee, 0x180b, 0x17f2, 0x17fd, 0x17f1, 0x1810, 0xf868, 0x1814, 0x198b, 0x198c, 0x1985, 0x1a7a, 0x1a6c, 0x1a60, 0x1a67, 0x1a66, 0x1a6a, 0x1a5f, 0x1a6d, 0x1a68, 0x1a64, 0x1b3a, 0x1b3b, 0x1b39, 0x1c02, 0x1c04, 0x1c03, 0x1cb4, 0x1cb3, 0x1cbb, 0x1cac, 0x1cb6, 0x1cb1, 0x1caf, 0x1cb5, 0x1cbe, 0x1cb2, 0x1d24, 0x1eb6, 0x1eb9, 0x1eac, 0x1eb0, 0x1ed7, 0x1ebb, 0x1efe, 0x1ecb, 0xf87f, 0x37f5, 0x1eb3, 0x1ebe, 0x1ecd, 0x1ebc, 0x1eba, 0x1ec7, 0x2116, 0x211b, 0x2117, 0x2115, 0x219f, 0xf88e, 0x2282, 0x2283, 0x228e, 0x226a, 0x2289, 0x2294, 0x2286, 0x2290, 0x2362, 0x2390, 0x240c, 0x240f, 0x38c3, 0x24a5, 0x24a7, 0x24a6, 0x24a4, 0x2535, 0x2538, 0x2536, 0x2543, 0x2547, 0x2537, 0x2743, 0x27a2, 0x2751, 0x2772, 0x276d, 0x272f, 0x2754, 0x276e, 0x2755, 0x2737, 0x274f, 0x2750, 0x6139, 0x279e, 0xf8a8, 0x27b3, 0x27a7, 0x3971, 0x27f9, 0x2791, 0xf8a7, 0x27b6, 0x27dd, 0x2799, 0x29df, 0x29d5, 0x47f5, 0x2c28, 0x2c40, 0x2c71, 0x2c98, 0x2c95, 0x2c65, 0x2c78, 0x2c7f, 0x2c60, 0x2c7c, 0x2c96, 0x2c6a, 0x2c79, 0x2c73, 0x2c72, 0x2c7b, 0x2c70, 0x2ed5, 0x2ed7, 0x2f8f, 0x2f89, 0x2f9e, 0x2f87, 0x2fa0, 0x2f8d, 0x2f88, 0x2f7f, 0x2f8c, 0x2f93, 0x3059, 0x95b0, 0x30b1, 0x51f4, 0x30af, 0x30b2, 0x3108, 0x310a, 0x3136, 0x3137, 0xf8cf, 0x3b01, 0x3236, 0x3229, 0x324a, 0x3226, 0x3228, 0x3224, 0x322a, 0x3248, 0x3344, 0x3384, 0x338c, 0x34c4, 0x34dc, 0x3587, 0x3553, 0x357f, 0x3531, 0x3551, 0x354b, 0x3552, 0x3580, 0x35a5, 0x3581, 0x3543, 0x3534, 0x3536, 0x3532, 0x3548, 0x3549, 0x353c, 0x354d, 0x354a, 0xf8e6, 0x358a, 0x3546, 0x353e, 0x3583, 0x3550, 0x35b4, 0x38f0, 0x38e4, 0x38e3, 0x38e5, 0x38e6, 0x38e7, 0x38e1, 0x38ef, 0x38e8, 0x38dd, 0x3903, 0x3988, 0x3a26, 0x3a16, 0x3a3b, 0x3a2f, 0x3a39, 0x3a34, 0xf8f4, 0x3a35, 0x3a31, 0x3a38, 0x0b81, 0x3aaa, 0x3aa3, 0x3aa4, 0x3aa0, 0x3aa1, 0x3aa9, 0x3aa5, 0x3baf, 0x3bb1, 0x3bab, 0x3bae, 0x3bb0, 0x3bb3, 0x3bac, 0x3ba9, 0x3bb2, 0x3ba8, 0x3bb4, 0x3bc2, 0x3c4f, 0x3c66, 0x3e1e, 0x3e15, 0x3e10, 0x3e7f, 0x3e7e, 0x3e60, 0x3ecc, 0x3eb2, 0x3e62, 0x3e8d, 0x3e8e, 0x3e77, 0x3e7c, 0x3e8f, 0x3e5d, 0x3e6d, 0x3e63, 0x3eaf, 0x3e90, 0x3e7d, 0x3e7a, 0x3e06, 0xf90b, 0x3e68, 0x3eb4, 0x3e78, 0x3eb1, 0x6ed7, 0xf90c, 0x3d41, 0x42e8, 0x42e9, 0x42c0, 0x3dd7, 0x42ea, 0x42b7, 0x42ba, 0x42b5, 0xf91d, 0x42b4, 0x42bc, 0x42c6, 0x42b8, 0x42bd, 0x42c2, 0x434d, 0x42f0, 0x42c7, 0x42c1, 0x42c3, 0x42f1, 0x42ec, 0x3de2, 0x451c, 0x4520, 0x4558, 0x4565, 0x4564, 0x458c, 0x458d, 0x45d9, 0x45e0, 0x4610, 0x4694, 0x4692, 0x4696, 0x4695, 0x46bf, 0x46a0, 0x3e45, 0x47f4, 0x47f6, 0x47dc, 0x733d, 0x4816, 0x4815, 0x481c, 0x480f, 0x482c, 0x4814, 0x4825, 0x4817, 0x4812, 0x481e, 0x4980, 0x49a8, 0x49af, 0x49d6, 0x49e2, 0x49b4, 0x49b3, 0x49b0, 0x49b2, 0x49a1, 0x4b60, 0x4b66, 0x4b61, 0x4b4e, 0x4b5d, 0x4b63, 0x4be6, 0x4bef, 0x4bec, 0x4c98, 0x4ca7, 0x4c94, 0x4c95, 0x4c91, 0x4c9d, 0x4c99, 0x4c9b, 0x4c9c, 0x4d1d, 0x4d1c, 0x4dd0, 0x4de0, 0x4dcb, 0x4ddb, 0x4dda, 0x4dc2, 0x4dd3, 0x4de5, 0x4f7d, 0x4f7b, 0x4fff, 0x3ff2, 0x4ff9, 0x5077, 0x507c, 0x5078, 0x507b, 0x507a, 0x51d2, 0x51cb, 0x51c9, 0x51ce, 0x51e4, 0x51ca, 0x51d0, 0x2fa5, 0x4049, 0x51d9, 0x51ee, 0x51dd, 0x5200, 0x51e1, 0x53de, 0x53e2, 0x53da, 0x54ce, 0xf94f, 0x54cf, 0x54da, 0x54d1, 0x54d4, 0x54ed, 0x54cb, 0x54d5, 0x54f1, 0x569c, 0x5688, 0x5741, 0x57d0, 0x57f7, 0x57cf, 0x57d1, 0x57db, 0x57de, 0x57f8, 0x57dc, 0x57d9, 0x59a0, 0x59b2, 0x59a1, 0x59aa, 0x59a9, 0x41a9, 0x59a6, 0x599c, 0x59b5, 0x59a7, 0x5a8e, 0x5a90, 0x5a91, 0x5b85, 0x5b5b, 0x5b70, 0x5b64, 0x5b67, 0x5b63, 0x5b77, 0x5b68, 0x5b65, 0x5b6a, 0x5b78, 0x5b66, 0x5e88, 0x5e9e, 0x5e74, 0x5e7a, 0x5e79, 0x5e8b, 0x5e7f, 0x6013, 0x601e, 0x6017, 0x601a, 0x6022, 0x6043, 0x6019, 0x601f, 0x6027, 0x6012, 0x6024, 0x6025, 0x035e, 0x6235, 0x6234, 0x62d1, 0x62c4, 0x62ca, 0x62c6, 0x62cb, 0x62cd, 0x62e2, 0x6389, 0x638b, 0x6386, 0x6388, 0x638d, 0x643b, 0x643c, 0x643d, 0x64f5, 0x6579, 0x6575, 0x6582, 0x657f, 0x6585, 0x6576, 0x657c, 0x657e, 0x657b, 0x6580, 0x657a, 0x2548, 0x43cb, 0x661d, 0x66f6, 0x66f7, 0x66f9, 0x6763, 0x676c, 0x676e, 0x6714, 0x440d, 0x6767, 0x676f, 0x6769, 0x6776, 0x6795, 0x6771, 0x6761, 0x6778, 0x676b, 0x6785, 0x6784, 0x6914, 0x6976, 0x59b6, 0x6975, 0x6974, 0x69e2, 0x6a3f, 0x6a44, 0x6a3d, 0x6a47, 0x6a48, 0x6adb, 0x6adc, 0x6add, 0x6be5, 0x6be6, 0x6cc2, 0x6d2e, 0x6d1d, 0x6cf8, 0x6cf0, 0x6cf6, 0x6cc5, 0x6cc6, 0x6cfc, 0x6d52, 0x6d2f, 0x6d10, 0x6cf3, 0x6cd2, 0x6cea, 0x6cdc, 0x6d1b, 0x6cfb, 0x6cc3, 0x6d16, 0x6d07, 0x6cc9, 0x6cd8, 0x6d30, 0x6d13, 0x6d31, 0x6cfa, 0x6cf2, 0x6de3, 0x6cd5, 0x6d01, 0x6cf1, 0x6d1c, 0x6cd6, 0x6d08, 0x6d0b, 0x6d17, 0x6d20, 0x6cca, 0x6d32, 0x6d05, 0x6ce4, 0x6cce, 0x6d33, 0x6d02, 0x6d19, 0x6d1e, 0x6cd3, 0x6cf7, 0x6ce8, 0x6d1f, 0x6cf4, 0x6dd8, 0x71bf, 0x71be, 0x71bd, 0x72dc, 0x72dd, 0x72ab, 0x72c9, 0x72c8, 0x72df, 0x72d9, 0x72db, 0x72cc, 0x72e0, 0x72ef, 0x72f3, 0x72ae, 0x7301, 0x75b7, 0x75b9, 0x75b6, 0x75b8, 0x75f6, 0x75f3, 0x75f5, 0x75f2, 0x7691, 0x769d, 0x769b, 0x7692, 0x768d, 0x769e, 0x768c, 0x4631, 0xf9c7, 0x7695, 0xf9c6, 0x768a, 0x768e, 0x769c, 0x77ef, 0x782d, 0x7852, 0x7835, 0x7828, 0x782e, 0x78e5, 0x79ea, 0x79f1, 0x79eb, 0x79d8, 0x79d0, 0x79f3, 0x79db, 0x79ce, 0x46d5, 0x79da, 0x79d7, 0x79e1, 0x79f2, 0x79c8, 0x79d9, 0x79de, 0x79d1, 0x79e7, 0x79cf, 0x7bb7, 0x7c47, 0x7c42, 0x7c43, 0xf9d3, 0x7cc3, 0x7cc1, 0x7cc7, 0x7d64, 0x7d6a, 0x7d66, 0x7d50, 0x7d6e, 0x7d65, 0x38ec, 0x7d7f, 0xf9d5, 0x7d9a, 0x7d69, 0x7d72, 0x7d6f, 0x7d7d, 0x7d70, 0x7e60, 0x7ec2, 0x7ee7, 0x7ed1, 0x7eeb, 0x7ed4, 0x7edc, 0x7edb, 0x8037, 0x8025, 0x801f, 0x801e, 0x8021, 0x801b, 0x8017, 0x8022, 0x802a, 0x801a, 0x802d, 0x8023, 0x8026, 0x8036, 0x7fff, 0x823a, 0x8240, 0x8242, 0x8238, 0x823b, 0x823c, 0x8243, 0x82e8, 0x4856, 0x82f9, 0x82eb, 0x82f1, 0x82e9, 0x82ec, 0x8415, 0x8447, 0x8446, 0x8445, 0x8524, 0x8556, 0x8521, 0x8527, 0x854d, 0x8531, 0x851e, 0x852c, 0x854f, 0x852b, 0x8553, 0x8551, 0x8554, 0x8529, 0x8550, 0x851f, 0x8532, 0x852a, 0x851d, 0x8528, 0x852e, 0x852d, 0x86bc, 0x86bb, 0x86bd, 0xf9e4, 0x8747, 0x8741, 0xf9e5, 0x8749, 0x48f4, 0x882e, 0x8827, 0x896a, 0x897b, 0x8973, 0x8975, 0x8969, 0x8979, 0x8972, 0x8c76, 0x8c77, 0x8c74, 0x8c73, 0x8d02, 0x8cfe, 0x8d01, 0x8cf9, 0x8cf4, 0x8ed3, 0x8ed5, 0x8ed8, 0x8ec3, 0x8eca, 0x8ed0, 0x8ecb, 0x8ece, 0x8ec5, 0x8ee6, 0x8ec4, 0x8ec0, 0x8ed4, 0x8ee8, 0x8f76, 0x8fa2, 0x8fae, 0x8fa8, 0x8fa3, 0x8fa7, 0x8f96, 0x8fa9, 0x8fa5, 0x8faf, 0x8fa4, 0x8fab, 0x8faa, 0x8fa6, 0x8fa0, 0x9098, 0x91db, 0x91f6, 0x91f5, 0x920c, 0x920a, 0x9775, 0x9268, 0x9263, 0x9266, 0x4a58, 0x9264, 0x926a, 0x9269, 0x9395, 0x9402, 0x946a, 0x945e, 0x9468, 0x9469, 0x9465, 0xf9fe, 0x95a7, 0x95ae, 0x95a8, 0x95b3, 0x969c, 0x96a9, 0x96b6, 0x96b3, 0x96b2, 0xfa03, 0x96b8, 0x96c0, 0x96bf, 0x96ba, 0x96a8, 0x983c, 0x9872, 0x9871, 0x9875, 0x9873, 0x9a17, 0x9a15, 0x9a16, 0x9a1b, 0x9afa, 0x9af9, 0x9c2c, 0x9c85, 0x9c82, 0x9c7f, 0x9c7d, 0x9c88, 0x42f3, 0x9d4e, 0x9d50, 0x9f93, 0x9f97, 0x9f98, 0x9f9b, 0x9f9c, 0x9f96, 0xa28b, 0xa2fd, 0xa2fc, 0xfa17, 0x398b, 0x0108, 0x0107, 0x0373, 0x03a2, 0x03af, 0x0382, 0x037b, 0x0374, 0x03b0, 0x0376, 0x03b9, 0x039e, 0x03b1, 0x03a1, 0x03b2, 0x036e, 0xf80b, 0x3487, 0x0378, 0x037a, 0x0383, 0x039a, 0x04f8, 0x0531, 0x0569, 0x0568, 0x059c, 0x0604, 0x0699, 0x07c7, 0x07c6, 0x07dc, 0x07c4, 0x07d8, 0x07d4, 0x07df, 0x07d1, 0x07d0, 0x07d6, 0x07cf, 0x08ad, 0x08af, 0x08a7, 0x08fd, 0x095b, 0x095a, 0x0a07, 0x0a9d, 0x0a9b, 0x0aab, 0x0aa4, 0x0a9c, 0x0a9e, 0x0aa5, 0x0aaa, 0x0aa6, 0x0b0e, 0x0b7e, 0x0b7c, 0x0eee, 0x0ed5, 0x0ee9, 0x0e42, 0x0ee2, 0x0f23, 0x0ed9, 0x0ed4, 0x0ee3, 0x0f15, 0x0eef, 0x0ef0, 0x0ed6, 0x0edd, 0x0ef6, 0x0f1c, 0x0ed8, 0x0edb, 0x0eda, 0x0eed, 0x1411, 0x1215, 0x1218, 0x121a, 0x121f, 0x1216, 0xf84d, 0x1219, 0xf84b, 0x13f0, 0x1409, 0x141b, 0x7be7, 0x13f6, 0x13f4, 0x13b5, 0x1410, 0x13f2, 0x1415, 0x13f3, 0x13f8, 0x1539, 0x153b, 0x1536, 0x140e, 0x1572, 0x1574, 0x15b9, 0x15b7, 0x15b8, 0x1672, 0x166b, 0x181d, 0x1837, 0x1822, 0x1843, 0x184d, 0x1838, 0x185b, 0x1879, 0x181b, 0x17f3, 0x1991, 0x1a7b, 0x1a94, 0xf86f, 0x1a96, 0x1a7f, 0x1a8f, 0x1a84, 0x1a7c, 0x1a8e, 0x1a90, 0x1a98, 0x1a83, 0x1a80, 0x1a93, 0x1a82, ERROR, 0x1b3d, 0x1b41, 0x1ba1, 0x1b9f, 0x1c0a, 0x1c0d, 0x1cc8, 0x1cc9, 0x1cc7, 0x1ccd, 0x1d25, 0x1eb1, 0x1edc, 0xf880, 0x1ee5, 0x1ef4, 0x1ebf, 0x1edb, 0x1eea, 0x1ef2, 0x37fa, 0x1ef1, 0x1eed, 0x1ee6, 0x2002, 0xf882, 0x2125, 0x2118, 0x211f, 0x2120, 0x21cf, 0x229d, 0x2299, 0x22a8, 0x2368, 0x2366, 0x2367, 0x2391, 0x2413, 0x2415, 0x241d, 0x2416, 0x2419, 0x246b, 0x2468, 0x246a, 0x246d, 0x2469, 0x24aa, 0x2557, 0x2552, 0x2550, 0x255f, 0x2567, 0x254f, 0x38f2, 0x255b, 0x255c, 0x255d, 0x281f, 0x279d, 0x27b1, 0x27b0, 0x2794, 0x27c3, 0x27af, 0x27a8, 0x27dc, 0x2798, 0x27c4, 0x27a4, 0x27ab, 0x27aa, 0x27a5, 0x2821, 0x27eb, 0x27e6, 0x27f7, 0x27f8, 0x27fc, 0x27fa, 0x27e0, 0xf8aa, 0x27f6, 0xf8a9, 0x27e1, 0x29ec, 0x29e2, 0x29e4, 0x29f9, 0x2c6f, 0x3a4c, 0x2cbb, 0x2ce1, 0x2d00, 0x2cd8, 0x3a2f, 0x2cd6, 0x2ce2, 0x2cc3, 0x2cb3, 0x2cd2, 0xf8c1, 0x2cce, 0x2cd0, 0x2cd5, 0x2cb9, 0x2cba, 0x2ccf, 0x2cbd, 0x2edb, 0x2faa, 0x2fad, 0x2fb8, 0x2fb6, 0x2fb5, 0x2faf, 0x2fb4, 0x2fb7, 0x2fa8, 0x2fb9, 0x2fbe, 0x3082, 0x30bc, 0x30b8, 0x30b6, 0x30b9, 0x3ac1, 0x3110, 0x3227, 0x3269, 0x3270, 0x3256, 0x326b, 0x327a, 0x326c, 0x326d, 0xf8d5, 0x67c1, 0x338d, 0x3390, 0x35b6, 0x3610, 0x3612, 0x35ba, 0x35bd, 0x3605, 0x35c2, 0x3607, 0x35f5, 0xf8e9, 0x35af, 0x35f4, 0x35f7, 0x35f8, 0x3611, 0x38f6, 0x38f5, 0x38fb, 0x3901, 0x3900, 0x3902, 0x38fe, 0x38fa, 0x38fd, 0x3c40, 0x3a37, 0x3a49, 0x3a4b, 0x3a46, 0x3a47, 0x3ab3, 0x3ab2, 0x3ab0, 0x3ab7, 0x3b11, 0x3bcc, 0x3bdf, 0x3bd3, 0x3bd5, 0x3bdb, 0x3bc5, 0x3bc8, 0x3bc9, 0x3be2, 0x3bca, 0x3bd1, 0x3bd2, 0x3bdd, 0x3e6c, 0x3e73, 0x3f21, 0x3ef0, 0x3f1f, 0x3f3b, 0x3f22, 0x3f23, 0x3ee8, 0x3edd, 0x3d3f, 0x3f1b, 0x3eed, 0xf90e, 0x3ef2, 0x3d46, 0x3edc, 0x3ee9, 0x3f1d, 0x3eda, 0x3ee6, 0x4313, 0x4315, 0x4316, 0x433c, 0x430b, 0x431c, 0x433a, 0x433d, 0x439a, 0x431d, 0x4309, 0x4308, 0x433b, 0x4522, 0x4526, 0x4525, 0x4524, 0x039b, 0x458f, 0x4590, 0x45e6, 0x45e3, 0x45e5, 0x4611, 0xf925, 0x46ae, 0x46be, 0x46b4, 0x46b3, 0x46af, 0x4691, 0x46c2, 0x46b6, 0x46b2, 0x4857, 0x483b, 0x4858, 0x4851, 0x4841, 0x4839, 0x3e8f, 0x4859, 0x4845, 0x4861, 0x48e8, 0x49fa, 0x49ea, 0x49ef, 0x49f2, 0x49f0, 0x4b08, 0x4b70, 0x4b6a, 0x4b73, 0x4b68, 0x4bc8, 0x4bf2, 0x0b7b, 0x4cae, 0x4cab, 0x4cb5, 0x4caf, 0x4cb2, 0x4cb6, 0x4cb0, 0x4d1e, 0x4e03, 0x4e06, 0x4e1f, 0x3fac, 0x4e0f, 0x4e02, 0x4e19, 0x4e18, 0x4e22, 0x4e15, 0x4e07, 0x4e0d, 0x4e24, 0x4e0c, 0x4e1e, 0x4f89, 0x4f8a, 0x500a, 0x500b, 0x5007, 0x5004, 0x5009, 0x5084, 0x5083, 0x5218, 0x5214, 0x5205, 0x5216, 0x520e, 0x5211, 0x5208, 0x520b, 0x5215, 0x5085, 0x5237, 0x522a, 0x520d, 0x520f, 0x537e, 0x5376, 0x5377, 0x53ec, 0x54fc, 0x5508, 0x54ff, 0x5503, 0x5510, 0x5505, 0x5506, 0x54fa, 0x56c7, 0x56c0, 0x56c3, 0x56a7, 0x56a8, 0x56ab, 0x56c1, 0x56aa, 0x56c8, 0x5743, 0x5802, 0x580e, 0x5801, 0x57fe, 0x5803, 0x4168, 0x5822, 0x5821, 0x5807, 0x5808, 0x580c, 0x59ca, 0x59bc, 0x59be, 0x59bd, 0xf95c, 0x59bb, 0x59b9, 0x41ab, 0x59c5, 0x5a99, 0x5b6b, 0x5b93, 0x5b94, 0x5ba9, 0x5ba0, 0x5ba6, 0xf961, 0x5bab, 0x5b9e, 0x5b9b, 0x5b91, 0x5b99, 0x5eb6, 0x5eb8, 0x5e9a, 0x4291, 0x5e98, 0x5e9b, 0x5eb3, 0x5ea2, 0x22aa, 0x5ea0, 0x5e9f, 0x605b, 0x6070, 0x6054, 0x6071, 0x6065, 0x6051, 0x609d, 0x6061, 0x605a, 0x6074, 0x604c, 0x604b, 0x605e, 0x6058, 0x6053, 0x6052, 0x623b, 0x6239, 0x62d6, 0x62e7, 0x62d7, 0x62d8, 0x62d9, 0x62da, 0x62db, 0x62dc, 0x62e0, 0x62e4, 0x62dd, 0x62f5, 0x62f1, 0x6398, 0x639d, 0x6399, 0x6450, 0x6449, 0x7fe4, 0x6462, 0x64d7, 0x6501, 0x64f7, 0xf97d, 0x658c, 0x659c, 0x8088, 0x661f, 0x661e, 0x673d, 0x673f, 0x6711, 0x6759, 0x673e, 0x6758, 0x6800, 0x679e, 0x67b6, 0x67aa, 0x67af, 0x67ac, 0x4430, 0x67c0, 0x67a9, 0x0b10, 0x68ee, 0x6977, 0x6979, 0x697a, 0x697d, 0x697f, 0x6983, 0x6978, 0x697e, 0x69e4, 0x69e6, 0x69e5, 0x445d, 0x6a4e, 0x6a59, 0x4475, 0xf98e, 0x6a4f, 0x6a4a, 0x6ae3, 0x6ade, 0x6ae2, 0x6c74, 0x6cac, 0x6c61, 0x6c62, 0x6c76, 0x6c7a, 0x6c79, 0x6c60, 0x6d64, 0x6e81, 0x6ddf, 0x6d84, 0x6d8a, 0x6d92, 0x6d79, 0x6dde, 0x6d98, 0x6d6c, 0x6de1, 0xf9a5, 0x6d7c, 0x6d72, 0x6d81, 0x6de0, 0x6d65, 0x44ff, 0x6d6a, 0x6d97, 0x6daa, 0x6dd3, 0x6dab, 0x6d6e, 0x6dac, 0x6d76, 0x6d7b, 0x6dad, 0xf9a6, 0x6d94, 0x6dd7, 0x6d70, 0x6dd5, 0x6df1, 0x6d7a, 0x6d68, 0x6d96, 0x450b, 0x6d73, 0x6dae, 0x6ddd, 0x6dda, 0x6daf, 0x6db0, 0x6ddb, 0x6d62, 0x6df8, 0x71c2, 0x71c7, 0x71c8, 0x71c5, 0x71c3, 0x71c6, 0x72de, 0x45c8, 0x7311, 0x7315, 0x7328, 0x7321, 0x732d, 0x7351, 0x732b, 0x7316, 0x7324, 0x7335, 0x731f, 0x7312, 0x7310, 0x7380, 0x733b, 0x7329, 0x732a, 0x731b, 0x7318, 0x7320, 0x733f, 0x731c, 0x7326, 0x730b, 0x75be, 0x75c4, 0x75bd, 0x75fa, 0x75fb, 0x76b1, 0x76b2, 0x76b0, 0x76b9, 0x76a6, 0x76bd, 0x76b6, 0x76b8, 0x76b4, 0x76b3, 0x76a7, 0x76ae, 0x76bc, 0x77f2, 0x77f3, 0x77f4, 0x783b, 0x7840, 0x7846, 0x78f0, 0x78ee, 0x78e8, 0x78f1, 0x78eb, 0x78ef, 0x79fc, 0x7a20, 0x7a09, 0x7a06, 0x7a03, 0xf9cf, 0x7a19, 0x7a24, 0x7a1b, 0x7a1d, 0x79fd, 0x7a1e, 0x79f4, 0x7a01, 0x7a08, 0x7a05, 0x7a23, 0x79ff, 0x7bea, 0x7c4d, 0x7c4e, 0x7c56, 0x7c57, 0x7c51, 0x7c55, 0x7c54, 0x7ccb, 0x7cd4, 0x7cd1, 0x7ccf, 0x7cd2, 0x7cca, 0x7cd6, 0x7d8b, 0x7d88, 0x7d85, 0x7d89, 0x1a9b, 0x7dbb, 0x7d8c, 0x4774, 0x7d99, 0x7d8a, 0x7eec, 0x7eef, 0x7ef9, 0x7f09, 0x7ef8, 0x7ef3, 0x7f00, 0x7f1d, 0x47ac, 0x7efd, 0x8048, 0x805c, 0x8055, 0x805e, 0x8049, 0x8063, 0x8060, 0x8053, 0x8062, 0x8040, 0x8249, 0x824a, 0x824c, 0x824d, 0x830a, 0x8306, 0x832f, 0x8321, 0x8307, 0x8309, 0x8302, 0x8316, 0x8303, 0x830b, 0x830f, 0x8560, 0x8568, 0x855e, 0x855d, 0x8563, 0x855f, 0x8564, 0x8578, 0x8561, 0x8569, 0x8565, 0x86da, 0x86e6, 0x86db, 0x86dc, 0x8739, 0x8757, 0x8755, 0x8765, 0x8761, 0x8754, 0x8845, 0x8841, 0x883e, 0x8837, 0x8912, 0x8913, 0x892c, 0x8996, 0xf9e9, 0x899c, 0x899d, 0x8985, 0xf9e8, 0x899f, 0x89a3, 0x8c82, 0x8c83, 0xf9ee, 0x8d1d, 0x8d14, 0x8d1f, 0x8d20, 0x8e47, 0x8e80, 0x8ec9, 0x8ef9, 0x8f06, 0x8ef0, 0x8ef8, 0x8eef, 0x8efd, 0x8ef1, 0x8efe, 0x8fb8, 0x8fc0, 0x8fc3, 0x8fb5, 0x8fb6, 0x8fc9, 0xf9f3, 0x8fbd, 0x8fba, 0x8fbf, 0x8fb3, 0x8fc6, 0x8fb2, 0x8fbc, 0x8fb7, 0x8fb9, 0x8fc8, 0x90b5, 0x90b3, 0x4a16, 0x90ac, 0x90a9, 0x90ad, 0x9211, 0x920d, 0x9216, 0x9289, 0x927c, 0x928b, 0x927b, 0x9288, 0x9284, 0x939d, 0x9398, 0x9488, 0x9486, 0x9482, 0x948b, 0xf9ff, 0x9471, 0x9472, 0x9481, 0x948c, 0x9480, 0x9489, 0x95bb, 0x95c1, 0x95be, 0xfa01, 0x95bd, 0x96c1, 0x96b4, 0x96b7, 0x96c8, 0x4b3b, 0x96d3, 0x96d0, 0x96b0, 0x96ca, 0x96cd, 0x9815, 0x9819, 0x9817, 0x983f, 0x9840, 0x9844, 0x987c, 0x9878, 0x9879, 0x9888, 0xfa06, 0x9889, 0x987d, 0x9a23, 0x9a24, 0x9a26, 0x9a22, 0x9a27, 0x9a1f, 0x9ac9, 0x9ac3, 0x9b0a, 0x9b0b, 0x9b04, 0x4bef, 0x9b03, 0x9b01, 0x9b09, 0x9c0f, 0x9c2e, 0x9c2d, 0x9c91, 0x9c99, 0x9c9e, 0x9c90, 0x9c94, 0x9c9d, 0x9c98, 0x9c9b, 0x9c9c, 0x9c9a, 0x9d54, 0x9f9d, 0x9f9f, 0x9fa3, 0x9fa4, 0x9fa5, 0xa302, 0xa417, 0xa41b, 0xa419, 0xa4d1, 0x1537, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x0055, 0x0182, 0x0189, 0x0187, 0x03be, 0x03bd, 0x03ca, 0x03d4, 0x03bc, 0x03c4, 0x03c1, 0x03c2, 0x03d7, 0x0370, 0x03ba, 0x03e3, 0x03bb, 0x04b1, 0x04b6, 0x04b0, 0x056c, 0x060d, 0x0607, 0x07f1, 0x07f5, 0x07ed, 0x07ef, 0x07eb, 0x07ec, 0x07ee, 0x0807, 0x09c4, 0x0a08, 0x0ab3, 0x0aad, 0x0ab0, 0x0b11, 0x018a, 0x0f83, 0x0f7a, 0x0f82, 0x0f68, 0x0f71, 0x0fb0, 0x0faf, 0x35f6, 0x0f6c, 0x0f6f, 0x0f62, 0x0f65, 0x0f81, 0x0f7f, 0x0f64, 0x0f73, 0x0f6e, 0x0f67, 0x0f74, 0x0f7d, 0x0f78, 0x0f85, 0x0faa, 0x0f88, 0x0fa6, 0xf84e, 0x0f8a, 0x0f84, 0x5655, 0x1224, 0x1222, 0x1223, 0x1432, 0x145b, 0x144f, 0x3667, 0x1426, 0x143e, 0x1442, 0x1447, 0x1422, 0x069b, 0x144a, 0x141f, 0x1449, 0x142b, 0x1433, 0xf858, 0x142a, 0x1428, 0x153d, 0x153c, 0x15bf, 0x1679, 0x1680, 0x167c, 0x167a, 0x1678, 0x1882, 0x185c, 0x185a, 0x184b, 0x187c, 0x187f, 0x181f, 0x1889, 0x188b, 0x1857, 0x187e, 0x187d, 0x1853, 0x1a9f, 0x1abc, 0x1aa5, 0x1a86, 0x1adc, 0x1aa4, 0x1ab6, 0x1aa2, 0x1ab4, 0x1b48, 0x1b46, 0x1ba7, 0x1c14, 0x1c12, 0x1c11, 0x1ce1, 0x1cd0, 0x1d26, 0x1d28, 0x1d29, 0x1f2f, 0x1f0d, 0x1f25, 0x1f14, 0x1f3c, 0x1f0b, 0x1f11, 0x1f30, 0x1f18, 0x1f19, 0x1f36, 0x1f17, 0x1f10, 0x1f15, 0x2003, 0x2029, 0x204c, 0x213f, 0x213e, 0x2134, 0x2142, 0x2135, 0x07f3, 0x21cd, 0x21d1, 0x21d2, 0x22ad, 0x22ba, 0x22c1, 0x22bb, 0x22b4, 0x22bc, 0x236c, 0x2392, 0x2421, 0x2424, 0x3f19, 0x24ad, 0x24ae, 0x24ab, 0x24ac, 0x2570, 0x2576, 0x2571, 0x2577, 0x617f, 0x27ec, 0x281c, 0x27fb, 0x27ee, 0x28e2, 0x27fd, 0x281e, 0x283b, 0x284a, 0xf8ae, 0x3992, 0x287d, 0x2856, 0x2844, 0x284b, 0x29fa, 0x29e8, 0x29f8, 0x29ff, 0x29f7, 0x29f6, 0x29fe, 0x2a07, 0x2a5d, 0x2cd4, 0xf8c3, 0x2cc8, 0x2cc5, 0xf8c0, 0x2cc9, 0x2d4d, 0x2d20, 0x2d36, 0x2d35, 0x2d88, 0x2d25, 0x2d21, 0x2d26, 0x3a45, 0x2d3f, 0x2d3b, 0x2d24, 0x2d43, 0x2d4e, 0x2d4f, 0x2d44, 0x2d40, 0x2d41, 0x2d39, 0x2d2b, 0x2edd, 0x2ede, 0x2fcd, 0x2fcb, 0x2fdb, 0x2fd8, 0x2fd9, 0x2fd2, 0x2fca, 0x2fd1, 0x2fd4, 0x2ff9, 0x2fd0, 0x305e, 0x305d, 0x308a, 0x3114, 0x3283, 0x3284, 0x329b, 0x3282, 0x327d, 0x327c, 0x3299, 0x327e, 0x329a, 0x3295, 0x327b, 0x3286, 0x3348, 0x3392, 0x35b2, 0x3642, 0x3672, 0x3615, 0x3630, 0x3643, 0x365b, 0x361d, 0x3673, 0x362d, 0x3bc9, 0x3621, 0x361c, 0xf8ea, 0x3629, 0x361e, 0x3633, 0x3910, 0x390e, 0xf8f1, 0x390d, 0x3911, 0x3912, 0x3917, 0x3909, 0x390f, 0x3998, 0x3994, 0x3996, 0x3999, 0x3995, 0x3997, 0x3a50, 0x3a52, 0x3a4d, 0x3a57, 0x3a53, 0x3a56, 0x3ab8, 0x3b12, 0x3bf1, 0x3bf0, 0x3bee, 0x3bef, 0x3be5, 0x3beb, 0x3be7, 0x3bf2, 0x3be6, 0x3bf7, 0x3c09, 0x3c6b, 0x3c6a, 0x3e79, 0x3ecd, 0x3eef, 0x3ee4, 0x3ee3, 0x3f6c, 0x3f67, 0x3f62, 0x3f58, 0x3f69, 0x3fab, 0x3f57, 0x3fad, 0x3f54, 0x3fae, 0x3f76, 0x3f49, 0x3f45, 0x3f4f, 0xf90f, 0x3f50, 0x3f7d, 0x3f44, 0x3f66, 0x3f48, 0x3fa3, 0x3f51, 0x3f53, 0xf910, 0x3f60, 0x3f47, 0x3f5e, 0x3f85, 0x3fac, 0x3f6d, 0x3f75, 0x3fa8, 0x3d55, 0x3f43, 0x3f4e, 0x3f5c, 0x3f56, 0x3f6e, 0x3f63, 0x3f6a, 0x4356, 0x4312, 0x435c, 0x4358, 0x4355, 0x437e, 0x43a8, 0x4311, 0x4359, 0x435a, 0x4367, 0x4354, 0x435b, 0x43f0, 0x4529, 0x452c, 0x452a, 0x4527, 0x4567, 0x4568, 0x4593, 0x4595, 0x459a, 0x45ee, 0x45f1, 0x45ed, 0x45e9, 0x46cb, 0x46df, 0x46db, 0x483c, 0x484e, 0x486c, 0x487b, 0x487c, 0x4883, 0x486b, 0x4866, 0x4863, 0x48a0, 0x4885, 0x4868, 0x48a2, 0x49ec, 0x3ee8, 0x49e7, 0x4a10, 0x4a18, 0x4a3a, 0x4a1a, 0x4a38, 0x4a41, 0x4a1b, 0x4a14, 0x4a1c, 0x4a1d, 0x4b12, 0x4b0d, 0x4b07, 0x4b7e, 0x4b7f, 0x0ab9, 0x4b80, 0x4b7a, 0x4bf3, 0x4cb9, 0x4cbb, 0x4cba, 0x4cbd, 0x4cb7, 0x4cbf, 0x4d21, 0x4e3a, 0x4e3d, 0x4e36, 0x4e49, 0x4e81, 0x3fb6, 0x4e3f, 0x4e4d, 0x4e3e, 0x3fbd, 0x4e30, 0x4e4f, 0x4f37, 0x4f98, 0x4f99, 0x5011, 0x500d, 0x5088, 0x508a, 0x521c, 0x5255, 0x5256, 0x5262, 0x5257, 0x5242, 0x5210, 0x524d, 0x525a, 0x5266, 0x5246, 0x287e, 0x524f, 0x62f9, 0x5387, 0x5384, 0x53f4, 0x53f5, 0x53f2, 0x53f7, 0x5545, 0xf950, 0x5549, 0x5535, 0x54fd, 0x5530, 0x5543, 0x5546, 0x40d6, 0x5533, 0x56c6, 0xf956, 0x56d4, 0x71d8, 0x56e0, 0x0fa7, 0x5744, 0x0398, 0x5854, 0x583e, 0x5835, 0x583a, 0x4171, 0x5834, 0x5839, 0x5846, 0x585a, 0x585b, 0x583c, 0x59dc, 0x59d6, 0x59d0, 0xf95e, 0x5aac, 0xf95d, 0x5aa5, 0x5bf4, 0x5c24, 0x5be0, 0x5bfd, 0x5bf2, 0x5bfc, 0x5c02, 0x5bf1, 0x5bff, 0x5bd2, 0x5bd8, 0x5bd3, 0x5bf9, 0xf963, 0x5bed, 0x5bf7, 0x5bf0, 0x5bd7, 0x5c09, 0x5bf5, 0x5ec2, 0x5ec5, 0x5ecf, 0x4298, 0x5ec1, 0x5ec6, 0x5ed4, 0x5ece, 0x609b, 0x6099, 0x608f, 0x60b7, 0x6082, 0x6093, 0x60b4, 0x60c1, 0x6090, 0x609a, 0x6094, 0x609c, 0x60b5, 0xf96f, 0xf96e, 0x609f, 0x608e, 0x609e, 0x623c, 0x6247, 0x6241, 0x62eb, 0x62ec, 0x62ed, 0x62ee, 0x62df, 0x62f2, 0x630d, 0x630e, 0x0186, 0x63a9, 0x63a4, 0x63a5, 0x645f, 0x645a, 0x6466, 0x6468, 0x646a, 0x6464, 0x6465, 0x64c1, 0x64d8, 0xf97b, 0x64d9, 0x6509, 0x65aa, 0x65a3, 0x65b9, 0x59e2, 0x65a5, 0x65ab, 0x6620, 0x6789, 0x678b, 0x67db, 0x67e4, 0x67ef, 0x67e2, 0x67e9, 0x67f0, 0x67f3, 0x67dd, 0x681e, 0x691d, 0x6946, 0x697c, 0x6980, 0x6981, 0x6982, 0x6987, 0x6988, 0x698a, 0x698c, 0x69e7, 0x69eb, 0x69ea, 0x6a68, 0x6a6b, 0x6a69, 0x6a66, 0x6a6a, 0x6a65, 0x6ae5, 0x6ae4, 0x6ae6, 0x6d18, 0x6e24, 0x6e48, 0x6e2f, 0x6e7e, 0x6d89, 0x6e1e, 0x6e49, 0x6e26, 0x6e09, 0x6e34, 0x6e2d, 0x6e4a, 0x6e15, 0xf9a9, 0x6e33, 0x6e28, 0x6e27, 0x6e20, 0x6e2b, 0x6e29, 0x6e6a, 0x6e0b, 0x6e0e, 0x6e1c, 0x6dff, 0xf9aa, 0x6e35, 0x6e11, 0x6e4b, 0x6e4c, 0x6e1f, 0x6e0f, 0x6e39, 0x6e68, 0x6e1d, 0x6e08, 0x6e0c, 0x6e0d, 0x6e62, 0x6eaf, 0x6e32, 0x6e2c, 0x6e64, 0x6e04, 0x6e16, 0x6e4d, 0x6e07, 0x6eae, 0x71d4, 0x71d1, 0x71d5, 0x71d0, 0x7371, 0x735d, 0x735b, 0x737a, 0xf9bd, 0x737f, 0x7379, 0x7367, 0x739e, 0x7394, 0x7364, 0x735e, 0x7381, 0x735a, 0x7357, 0x737c, 0x7398, 0x7366, 0x737e, 0x7382, 0x7368, 0x735f, 0x7363, 0x7397, 0x45cd, 0x7353, 0x737b, 0x737d, 0x7378, 0x7406, 0x75c0, 0x75c2, 0x75c3, 0x76dc, 0x76e6, 0x76ec, 0x76f2, 0x76e8, 0x76eb, 0x76ea, 0x76e5, 0x76e0, 0x76d0, 0x76d8, 0x76d5, 0x76d3, 0x76e4, 0x76f3, 0x76db, 0x772f, 0x77f9, 0x785d, 0x785b, 0x784c, 0x7858, 0x7860, 0x7853, 0x7850, 0x7907, 0x7908, 0x78f4, 0x78f6, 0x7904, 0x78fd, 0x7905, 0x7a28, 0x7a56, 0x7a42, 0x7a5c, 0x7a3d, 0x7a2f, 0x7a2b, 0x7a58, 0x7a61, 0x7a2c, 0x7a51, 0x7a50, 0x7a3c, 0x7a36, 0x46f6, 0x7a60, 0x7a5b, 0x7a2e, 0x7a40, 0x7a5f, 0x7a26, 0x7a2d, 0x7a5e, 0x7a3b, 0x7bef, 0x7bf3, 0x7bee, 0x7bed, 0x7c5a, 0x7c62, 0x7c5b, 0x7c5f, 0x7c5e, 0x7c64, 0x7ce0, 0x7ce1, 0x7ce5, 0x7da5, 0x7d9b, 0x7d9f, 0x7d9c, 0x477a, 0x7daa, 0x7da4, 0x7da3, 0x7e67, 0x7f26, 0x7f1a, 0x47b8, 0x7f1c, 0x7f15, 0x7f1b, 0x7f18, 0x7f1e, 0x7f25, 0xf9dc, 0x807b, 0x8075, 0x8093, 0x808f, 0x807c, 0x809b, 0x8088, 0x8091, 0x807e, 0x4801, 0x8086, 0x825b, 0x8254, 0x8335, 0x8340, 0x8337, 0x8329, 0x8326, 0x8323, 0x8330, 0x8320, 0x8328, 0x8332, 0x832a, 0x8331, 0x8324, 0x8341, 0x8342, 0x8343, 0x8325, 0x8338, 0x841c, 0x841d, 0x841e, 0x84f6, 0x85a5, 0x8589, 0x859d, 0x858a, 0x8587, 0x85ab, 0x8586, 0x859e, 0x8593, 0x85a1, 0x8588, 0x85a3, 0x859f, 0x85a0, 0x86ff, 0x8700, 0x8702, 0x86f8, 0x86f7, 0x8701, 0x8787, 0x8789, 0x8776, 0x876e, 0x8777, 0x8782, 0x8785, 0x8783, 0x8784, 0x8857, 0x884b, 0x8856, 0x885d, 0x8860, 0x884d, 0x8855, 0x8854, 0x8853, 0x8850, 0x8863, 0x8862, 0x8917, 0x8916, 0x892d, 0x89d9, 0x89bf, 0x492f, 0x89b2, 0x89ac, 0x89b0, 0x89cf, 0x89b8, 0x4931, 0x89d3, 0x89b1, 0x89af, 0x89ce, 0x89b4, 0x89b7, 0x89d5, 0x499c, 0x8d38, 0x8d28, 0x8d3f, 0x8d40, 0x8d41, 0x8d33, 0x8d2b, 0x8d2e, 0x8f11, 0x8f18, 0x8f17, 0x8f19, 0x8f16, 0x49e6, 0x8f0d, 0x8f26, 0x8f79, 0x8fd8, 0x8ff3, 0x8fd7, 0x8fcc, 0x8fcf, 0x8fcb, 0x8fd1, 0x8fce, 0x8fd4, 0x8fd5, 0x8fd3, 0x8fd6, 0x8fcd, 0x8fda, 0x8fd2, 0x8fde, 0x90cc, 0x90b8, 0x90b7, 0x90c2, 0x90c3, 0x91fa, 0x91f9, 0x921f, 0x921d, 0x4382, 0x92a6, 0x9290, 0x929e, 0x9298, 0x9293, 0x9292, 0x92a5, 0x9295, 0x93a9, 0x93a8, 0x93aa, 0x93ab, 0x93ac, 0x941f, 0x9422, 0x94aa, 0x9496, 0x9491, 0x94ab, 0x94a2, 0x94a4, 0x949d, 0x9497, 0x947d, 0x949f, 0x949c, 0x9499, 0x94a6, 0x9492, 0x94a7, 0x95c9, 0x95c8, 0x95c7, 0x95cb, 0x9674, 0x96c9, 0x4b38, 0x96d2, 0x96db, 0x96eb, 0x96e9, 0x96ef, 0x96ee, 0x96f9, 0x96de, 0x9816, 0x9845, 0x987f, 0x9898, 0x989f, 0x9886, 0x9890, 0x989a, 0x989d, 0x988d, 0x989c, 0x98a0, 0x98a7, 0x988f, 0x9a41, 0x9a35, 0x9a37, 0x9a30, 0x9a3a, 0x9a36, 0xfa08, 0x9aca, 0x9b12, 0x9b15, 0x9b22, 0x9b13, 0x9b18, 0x9b21, 0x9c10, 0x9c20, 0x9c2f, 0x9ca5, 0x9ca3, 0x9cb6, 0x9cab, 0x9d68, 0x9d67, 0x9d6f, 0x9d77, 0x9d64, 0x9d78, 0x4c3a, 0x9d76, 0x9d6e, 0x4cb1, 0x9fd0, 0x9fb3, 0x9fcb, 0x9fd6, 0x9fb1, 0x9fb4, 0x9fd7, 0x9fc6, 0x9fba, 0x9fd1, 0x9fd2, 0x9fb5, 0x9fc4, 0x9fcc, 0x9fbb, 0x9fb2, 0xa25b, 0xa25a, 0xa259, 0xa299, 0xa294, 0xa296, 0xa293, 0xa291, 0xa28f, 0xa298, 0xa30c, 0xa30a, 0xa30e, 0xa312, 0xa311, 0xa30b, 0xa39a, 0x4d47, 0xa3b4, 0x4d51, 0xa41c, 0xa420, 0xa421, 0xa4d3, 0xa4d2, 0xa538, ERROR, 0x4ccf, 0x011d, 0x0192, 0x018f, 0x018c, 0x03ea, 0x04b9, 0x056e, 0x05a0, 0x91dd, 0x0612, 0x0617, 0x066d, 0x0805, 0x07fb, 0x07fd, 0x0806, 0x0800, 0x07ff, 0x07fe, 0x08b6, 0x0905, 0x0907, 0x0abc, 0x0abb, 0x0b8b, 0x0b87, 0x7bfb, 0x0fe7, 0x0fe6, 0x0fe2, 0x85d3, 0x0fd9, 0x0fca, 0x1012, 0x1010, 0x0fdc, 0x0fd0, 0x0f8b, 0x1013, 0x2a10, 0x0fda, 0xf84f, 0x0ffd, 0x0fe5, 0x0fcc, 0x1039, 0x0fc7, 0x0fd8, 0x1460, 0x1464, 0x1486, 0x145e, 0x1466, 0x145f, 0x1477, 0x1482, 0x1496, 0x153e, 0x1579, 0x157a, 0x1688, 0x1689, 0x168c, 0x43e0, 0x167b, 0x1686, 0x1894, 0x1897, 0x18b7, 0x18b5, 0x18b8, 0x1893, 0x18b2, 0x18b4, 0x1899, 0x18c3, 0x189d, 0x189b, 0x18a3, 0x3747, 0x199f, 0x199e, 0x19a3, 0x19a0, 0x19a1, 0x1ac5, 0x1ac6, 0x1abe, 0x1ac4, 0x1abf, 0x1b4c, 0x1b4a, 0x1bb1, 0x1c15, 0x1c17, 0x1c10, 0x1c18, 0x1ce0, 0x1cdf, 0x1d27, 0x1f43, 0x1f48, 0x1f1d, 0x1f50, 0x1f58, 0x1f47, 0x1f54, 0x1f53, 0x1f40, 0x1f55, 0x3817, 0x1f5a, 0x2470, 0x215b, 0x214d, 0x2156, 0x214f, 0xf887, 0x2159, 0xf888, 0x2154, 0x2153, 0x2150, 0x22b3, 0x236e, 0x38a3, 0x236f, 0x2393, 0x2429, 0x2425, 0x2428, 0x246f, 0x32b8, 0xf897, 0x24b3, 0x2579, 0x257e, 0x257c, 0x2583, 0xf8ac, 0x2800, 0x2834, 0x2865, 0x2836, 0x28a7, 0x2859, 0x2858, 0x2831, 0x2862, 0x2838, 0x2873, 0x283e, 0x2855, 0x2854, 0x2895, 0xf8ad, 0x28a5, 0x2894, 0x289a, 0x289b, 0x2899, 0x289f, 0x2853, 0x2a12, 0x2a0a, 0x2a09, 0x2a0c, 0x2a0b, 0x2a0e, 0x2a0d, 0x2a08, 0x2d38, 0x2d3a, 0x2d37, 0x2d3d, 0x2d2d, 0x2d82, 0x2d95, 0x2d87, 0x2d9d, 0x2db5, 0x2d81, 0x2dc7, 0x2d9b, 0x2d98, 0x2d94, 0x2d86, 0x2d90, 0x2d34, 0x2d8e, 0x2d85, 0x2da6, 0x2d96, 0x2fea, 0x2fdf, 0x32bd, 0x2ff7, 0x2feb, 0x2fe0, 0x2fe8, 0x2fe1, 0x2fe9, 0x2fee, 0x2fe5, 0x2fec, 0x3063, 0x30c6, 0x30c2, 0x30c1, 0x30c0, 0x30c3, 0x3118, 0x32ae, 0x32a3, 0x32c5, 0x32a0, 0x32b4, 0x32a5, 0x3b1e, 0x32a4, 0x32a8, 0x32a6, 0x36a8, 0x368d, 0x3682, 0x369e, 0x3689, 0x3683, 0x3691, 0x36a6, 0x369a, 0x3690, 0x3685, 0x367d, 0xf8ec, 0x369b, 0x36a5, 0x36f0, 0x3696, 0x3688, 0x36d6, 0x36d8, 0x3686, 0x36a4, 0x3697, 0x391c, 0x3919, 0x399e, 0x399f, 0x399d, 0x399c, 0x3a5d, 0x3a5e, 0x3a73, 0x3a63, 0x3abe, 0x3ac1, 0x3abc, 0x3abf, 0x3abb, 0x3abd, 0x3b13, 0x3b14, 0x3bf8, 0x3bfa, 0x3c06, 0x3bfe, 0x3c51, 0x400b, 0x3ff1, 0x3fa9, 0x3fd5, 0x3fdc, 0x3fcb, 0x3ff2, 0x405f, 0x3fdb, 0x3fd6, 0x3fd9, 0x3fd1, 0x3fcf, 0x3fd8, 0x3fe0, 0x3fd4, 0x3ff3, 0x4005, 0x3fce, 0x3ff4, 0xf912, 0x3fda, 0x400e, 0x4006, 0x3fd7, 0x3fcd, 0x4007, 0x3fe1, 0x4008, 0x43be, 0x43ef, 0x43d9, 0x43da, 0x71d7, 0x43a0, 0x43df, 0x439e, 0x43bf, 0x43af, 0x43a7, 0x43aa, 0x43f4, 0x43ae, 0x43b5, 0x43b8, 0x43db, 0x43c0, 0x43b7, 0x43a2, 0x43dd, 0x43a1, 0x43a5, 0x43b4, 0x43a6, 0x43ab, 0x43ac, 0x439f, 0x43b1, 0x43fc, 0x452e, 0x4530, 0x4599, 0x45f8, 0x45f6, 0x46f4, 0x46eb, 0x46e1, 0x46e4, 0x4875, 0x4869, 0x3e9a, 0x4899, 0x489e, 0x4894, 0x4893, 0x4891, 0x4a19, 0x4a17, 0x4a49, 0x4a47, 0x4a48, 0x4a52, 0x4a40, 0x4a63, 0x4a46, 0x4a5f, 0x4b0e, 0x4b85, 0x4b87, 0x4bcb, 0x4bcc, 0x4bc9, 0x4ccb, 0x1ce7, 0x4d20, 0x4e5f, 0x4e60, 0x4e6a, 0x4e76, 0x4e73, 0x4e71, 0x4e66, 0x3fc2, 0x4e6b, 0x4e79, 0x4e7b, 0x4f3c, 0x4f9e, 0x4f9c, 0x501c, 0x501e, 0x5021, 0x5096, 0x50a1, 0x50b6, 0x50a0, 0x5094, 0x5097, 0x5281, 0x5286, 0x52c0, 0x528a, 0xf94b, 0x5285, 0x5295, 0x5249, 0x5282, 0x5284, 0x2878, 0x5290, 0x52b1, 0x53fe, 0x53fb, 0x5550, 0x5556, 0x555a, 0x554c, 0x40dc, 0x5557, 0x56e1, 0x56d9, 0x56db, 0x56f4, 0x5745, 0x5747, 0x5874, 0x586b, 0x5868, 0x5869, 0x5879, 0xf95b, 0x5880, 0x5881, 0x5861, 0x5870, 0x586f, 0x5873, 0x585d, 0x59fa, 0x41b3, 0x59f3, 0x5a0a, 0x5a17, 0xf95f, 0x5ab0, 0x5c3e, 0x5c46, 0x5c4f, 0x5c44, 0x5c69, 0x5c33, 0x5c2f, 0x5c4e, 0x5c3a, 0x5c2b, 0x5ca9, 0x5c50, 0x5c45, 0x5c37, 0x5c25, 0x5c2c, 0x5c3f, 0x5c34, 0x5c29, 0x5c1e, 0x5c3d, 0x5eed, 0xf966, 0x5ef3, 0x5eea, 0x5eeb, 0x60cc, 0x60ce, 0x60d0, 0x60e3, 0x60e0, 0x60d1, 0x60dc, 0x60dd, 0x60f0, 0x60db, 0x60e5, 0x60f1, 0x60c9, 0x60e8, 0x60e7, 0x60c8, 0x60de, 0x60cd, 0x60c5, 0x60c6, 0x60e4, 0x60c3, 0x62fb, 0x62fc, 0x62fe, 0x6303, 0x6300, 0x62fd, 0x6305, 0x6313, 0x63a7, 0x63b4, 0x6470, 0x6474, 0x6471, 0x6475, 0x647d, 0x6473, 0x64c4, 0x64c3, 0x64de, 0x64dd, 0x6511, 0x650f, 0x6510, 0x65c3, 0x65c2, 0x65ca, 0x65c1, 0x6623, 0x67b1, 0x6824, 0x6811, 0x6825, 0x680a, 0x681f, 0x6820, 0x6814, 0x6828, 0x6803, 0x6812, 0x680b, 0x6817, 0x2a11, 0x6949, 0x6989, 0x6990, 0x698f, 0x6996, 0x6995, 0x6993, 0x69ed, 0x69f0, 0x43de, 0x6a85, 0x6a77, 0x6a7a, 0x6a84, 0x6a79, 0x6a7d, 0x6a7b, 0x6aed, 0x6aec, 0x6df6, 0x6d9b, 0x6e9d, 0x6f11, 0x6ec4, 0x6ec8, 0x6edf, 0x6ebf, 0x6eb3, 0x6eba, 0x6f10, 0x6f06, 0x6e88, 0x6e9a, 0x6ee0, 0x6ecc, 0x6eb5, 0x6ee1, 0x6ebc, 0x6ec6, 0x6f0b, 0x6ea4, 0x6e95, 0x6ea3, 0x6ee2, 0x6ecd, 0x6ee3, 0x6eab, 0x6ecb, 0x6e8f, 0xf9ab, 0x6ea9, 0x6f24, 0x6ee4, 0x6f12, 0x6ee5, 0x6f67, 0x6eaa, 0x6ea0, 0x6ee6, 0x6ec1, 0x6ee7, 0x6f0d, 0x6e86, 0x6eb0, 0x6e8b, 0x6ee8, 0x6ec9, 0x6f19, 0x6ec0, 0x6f0c, 0x6ee9, 0x6eea, 0x71ed, 0x71e3, 0x71e4, 0x71e8, 0x71d2, 0x71e2, 0x8666, 0x73cf, 0x73d1, 0x73c3, 0x73c9, 0x73ea, 0x73b4, 0x73dc, 0x73bd, 0x73e6, 0x73c8, 0x73ec, 0x73b2, 0x73a9, 0x73d3, 0x73c0, 0x73e9, 0x73d5, 0x45d9, 0x73c5, 0x45dd, 0x73cb, 0x73d0, 0x73d2, 0x73e4, 0x73e8, 0x73cd, 0x73b6, 0x73aa, 0x73d4, 0x8449, 0x73c1, 0x73dd, 0x73ce, 0x75c9, 0x75ca, 0x76fd, 0x76d9, 0x76ff, 0x7704, 0x76fa, 0x7706, 0x7715, 0x7711, 0x7707, 0x770b, 0x77fc, 0x77fd, 0x786d, 0x7865, 0x7914, 0x7913, 0x790c, 0x790b, 0x7918, 0x7922, 0x7a7d, 0x7a6f, 0x7a75, 0x7a7b, 0x7a80, 0x7a7f, 0x7a96, 0x7a6d, 0x7a6b, 0x7a86, 0x7a73, 0x7a62, 0x7a77, 0x7a81, 0x7a69, 0x7a82, 0x7a97, 0x7a84, 0x46fc, 0x7a78, 0xf9d0, 0x7a7a, 0x7a6a, 0x7a65, 0x7a7e, 0x7a94, 0x7bc2, 0x7bc1, 0x7bf9, 0x7c71, 0x7c6b, 0x7c6d, 0x7c6f, 0x7c6e, 0x7cf2, 0x7ce8, 0x7cef, 0x7ce9, 0x7cea, 0x7ced, 0x7cf3, 0x7ce6, 0x7dc9, 0x7db4, 0x7db3, 0x7db9, 0x7dca, 0x7db1, 0x7db6, 0x7dc7, 0x7dc4, 0x7db7, 0x7e6f, 0x7f33, 0x7f32, 0x7f1f, 0xf9d9, 0x7f2b, 0x7f30, 0x7f36, 0x7f42, 0x7f41, 0xf9d8, 0x80a5, 0x80ab, 0x80a9, 0x80b3, 0x80a7, 0x80a0, 0x80d2, 0x80a8, 0x80b6, 0x80ac, 0x80ae, 0x80e6, 0x8265, 0x8347, 0x8363, 0x834d, 0x835f, 0x834b, 0x8360, 0x8349, 0x8353, 0xf9df, 0x8f3a, 0x8357, 0x834e, 0x8352, 0x8354, 0x8420, 0x8422, 0x85c1, 0x85d7, 0x85d5, 0x85c4, 0x85d0, 0x85bb, 0x85e2, 0x85cb, 0x85b8, 0x85bf, 0x85d8, 0x85c0, 0x85ba, 0x85b4, 0x85bc, 0x85d4, 0x85ed, 0x85c2, 0x85d9, 0x85cc, 0x872f, 0x8723, 0x8796, 0x878d, 0x879e, 0x8799, 0x8883, 0x4907, 0x886a, 0x8869, 0x8875, 0x886c, 0x8880, 0x886e, 0x8881, 0x8877, 0x8876, 0x8873, 0x8870, 0x8884, 0x8919, 0x89f2, 0x933d, 0x89ec, 0x89eb, 0x89f6, 0x89ef, 0x89f4, 0x89ee, 0x89f3, 0x89ed, 0x8c9b, 0x8c98, 0x8c94, 0x147a, 0x8c9a, 0xf9f0, 0x8d4c, 0x49a8, 0x8d57, 0x8d51, 0x8d62, 0x8d52, 0x8d5c, 0x8d53, 0xf9ef, 0x8e85, 0x8f2d, 0x8f3e, 0x8f30, 0x8f7d, 0x8fe6, 0x8ff6, 0x8fe4, 0x8fe9, 0x8fec, 0x8ff2, 0x8fe8, 0x8fe3, 0x8feb, 0x8ff0, 0x8fea, 0x8fe7, 0x8ffd, 0x8fe5, 0x8fee, 0x8ff5, 0x8ff9, 0x8ff1, 0x8ff4, 0xf9f4, 0x9011, 0x90de, 0x90d8, 0x90dd, 0x90db, 0x90d3, 0x90e1, 0x91de, 0x91fc, 0x9228, 0x92b7, 0x92b8, 0x92c7, 0x92b2, 0x92a9, 0x92b9, 0x92bc, 0x92b3, 0x92d1, 0x93b0, 0x93b1, 0x93b6, 0x9404, 0x942c, 0x94c1, 0x949e, 0x94ba, 0x4aca, 0x94d1, 0x94d3, 0x94d4, 0x94d5, 0x94c5, 0x94b6, 0x94b2, 0x94b5, 0x94c3, 0x94b9, 0x94c6, 0x95d6, 0x95e0, 0x95db, 0x95d7, 0x95dd, 0x9715, 0x970c, 0x970f, 0x970e, 0x96fe, 0x9704, 0x970b, 0x9702, 0x96ff, 0x9708, 0x9710, 0x9717, 0x9713, 0x9706, 0x9709, 0x9824, 0x9826, 0x9825, 0x9848, 0x98b5, 0x98d2, 0x98d5, 0x98c4, 0x98af, 0x98ad, 0x98c1, 0x98c0, 0x98cc, 0x98cd, 0x98c3, 0x98c8, 0x98c5, 0x98ba, 0x98d0, 0x98c2, 0x98ce, 0x4b8d, 0x9a43, 0x9a42, 0x9a40, 0x9a31, 0x9acf, 0x9ace, 0x9b30, 0x9b34, 0x9b32, 0x9b43, 0x9b3c, 0x9c11, 0x9c35, 0x9c34, 0x9c37, 0x9c31, 0x9cbf, 0x9cbc, 0x9cc2, 0x9cc9, 0x9d83, 0x9d8b, 0x9da0, 0x9d8d, 0x9d8c, 0x9d9a, 0x9d8a, 0x9d91, 0x9ff1, 0xa00f, 0xa001, 0xa007, 0xa00c, 0x4cc0, 0x9fdc, 0x9fee, 0x9ff7, 0x9ff2, 0x9ff8, 0x9feb, 0x4cca, 0x9fe6, 0x9fed, 0x9fe9, 0xa008, 0xa000, 0x9fe5, 0x9ffc, 0xa261, 0xa25e, 0xa25f, 0x4d25, 0xa29b, 0xa316, 0xa315, 0xa320, 0xa314, 0xa31a, 0xa317, 0xa39c, 0x4d4a, 0xa3f1, 0x4d53, 0xa3f0, 0xa428, 0xa424, 0xa42a, 0xa42b, 0xa4d5, 0xa504, 0xa505, 0xa591, 0xa592, 0xa6a6, 0x0109, 0x0422, 0x041a, 0x040e, 0x041b, 0x0408, 0x50b3, 0xf81c, 0x069d, 0x0812, 0x081e, 0x08bb, 0x08bf, 0x08bc, 0x0908, 0x0909, 0x0963, 0x09c8, 0x3728, 0x0b8e, 0x0b8d, 0x1043, 0x104d, 0x106d, 0x1042, 0x1052, 0x1051, 0x1069, 0x1050, 0x1056, 0x106c, 0x1044, 0x1045, 0x106b, 0x3605, 0x1068, 0x1057, 0x122e, 0x1231, 0x122d, 0x148b, 0x14b2, 0x148d, 0x14a3, 0x14a4, 0x1490, 0x1489, 0x148e, 0x1492, 0x157b, 0x1690, 0x168f, 0x18e9, 0x18cd, 0x18c5, 0x18d0, 0x18c9, 0x18d1, 0x18c7, 0x18d2, 0x185f, 0x18e1, 0x18cc, 0x18c6, 0x18e4, 0x19a9, 0x1ad3, 0x1ada, 0x1ad2, 0x1adb, 0x1b4d, 0x1b4e, 0x1c1c, 0x1ce8, 0x1f6c, 0x1f5f, 0x1f66, 0x1f64, 0x1f78, 0x1f65, 0x1f6d, 0x1f61, 0x1f7a, 0x2007, 0x2166, 0x2168, 0x2162, 0x22d3, 0x22d4, 0x22d1, 0x22dc, 0x2373, 0x2372, 0x242d, 0x242c, 0x242f, 0x2472, 0x24b4, 0x2589, 0x28cd, 0x28a6, 0x28a2, 0x28a0, 0x2846, 0x28a1, 0x6857, 0x28a3, 0x28b1, 0x28db, 0x28f6, 0x28dc, 0x28d6, 0x2a13, 0x2d9c, 0x2d97, 0x2dd8, 0x2de4, 0x2dd4, 0x2de5, 0x2ddb, 0x2dd0, 0x2dda, 0x2dcc, 0x2ddc, 0x2ded, 0x2dd3, 0x2dd1, 0x2dce, 0x2dd9, 0x2ddd, 0xf8c6, 0x2ee6, 0x2ee5, 0x2ee9, 0x2fff, 0x2ffe, 0x300e, 0x308c, 0x30ca, 0x30cb, 0x311a, 0x32d7, 0x32cf, 0x32d0, 0x32c9, 0x32cc, 0x32d3, 0x33a4, 0x33a3, 0x3681, 0x3726, 0x36f3, 0x3727, 0x36f2, 0x36ff, 0x36f5, 0x36fc, 0x370e, 0x3bf0, 0x36f6, 0x3700, 0x3723, 0x3705, 0x3725, 0x3708, 0x3750, 0x3925, 0x3920, 0x3923, 0x3921, 0x39a1, 0x3a69, 0x3a6c, 0x3a68, 0x3a6b, 0x3acc, 0x3acd, 0x3c10, 0x3c0d, 0x3c0a, 0x3c16, 0x3c14, 0x3c52, 0x4028, 0x402e, 0x402c, 0x404d, 0x4049, 0x4031, 0x4030, 0x4033, 0x402d, 0x4036, 0x403e, 0x402f, 0x4027, 0x4034, 0x404c, 0x43fe, 0x4412, 0x441f, 0x4417, 0x43f5, 0x4415, 0x43f7, 0x3e02, 0x1f7d, 0x43fa, 0x43f9, 0x444b, 0x459c, 0x459d, 0x3e23, 0x46f0, 0x46f6, 0x46ef, 0x489d, 0x489a, 0x48a7, 0x48af, 0x48aa, 0x4a64, 0x4a86, 0x4a75, 0x4a70, 0x4a84, 0x4a6b, 0x4a85, 0x4a6c, 0x4b17, 0x4b94, 0x4b93, 0x4cd2, 0x4cd7, 0x4cd4, 0x4ea6, 0x4ea7, 0x4e9c, 0x4e8b, 0x4e8d, 0x4e98, 0x4eb9, 0x4e9b, 0x4e9d, 0x4e99, 0x4ea8, 0x4e91, 0x4e87, 0x4e9a, 0x4fa6, 0x501f, 0x50a7, 0x50b1, 0x50b2, 0x50b7, 0x52d0, 0x52b3, 0x52b5, 0x52c4, 0x52c3, 0x52bc, 0x52b2, 0x52ba, 0x52bb, 0x52c2, 0x52cd, 0x52be, 0x52b7, 0x538f, 0x5403, 0x5404, 0x5571, 0x5577, 0x5574, 0x558b, 0x557a, 0xf951, 0x558c, 0x5573, 0x56ff, 0x56fb, 0x56fd, 0x56f0, 0x56f3, 0x56fc, 0x56f2, 0x5892, 0x589e, 0x58ae, 0x5896, 0x5a14, 0x5a12, 0x5a13, 0x5a16, 0x5a0f, 0x5ab6, 0x5abd, 0x5c8c, 0x5cae, 0x5cac, 0x5cab, 0x5c99, 0x5c92, 0x5cbb, 0x5c9e, 0x5c7e, 0x5caf, 0x5cbc, 0x5c98, 0x5f01, 0x5f09, 0x5f06, 0xf967, 0x5f07, 0x5f08, 0x60cf, 0x610e, 0x6132, 0x4315, 0x6112, 0x6116, 0x6117, 0x611b, 0x6115, 0x6131, 0x6118, 0x611a, 0x6110, 0x610a, 0x6109, 0x624f, 0xf973, 0x630f, 0x6310, 0xf975, 0x6328, 0x6311, 0x6316, 0x6317, 0x6302, 0x63bb, 0x63ba, 0x63c3, 0x63bc, 0x648a, 0x6484, 0x6486, 0x64e0, 0x6517, 0x6518, 0x651e, 0x6515, 0x65d3, 0x65da, 0x65d9, 0x67e6, 0x67f4, 0x67e1, 0x6869, 0x6840, 0x6858, 0x686c, 0x684d, 0x6921, 0x6999, 0x69f1, 0x3f68, 0x6a86, 0x6f5b, 0x6f5c, 0x6f77, 0x6f2c, 0xf9ad, 0x6f58, 0x6f64, 0x6f61, 0x6f48, 0x6f97, 0x6f59, 0x6f29, 0x6f62, 0x6f2e, 0x6f68, 0x6f90, 0x6f3a, 0x6f3d, 0x6f5e, 0x6f46, 0x6f69, 0x6f65, 0x6f3e, 0x6f49, 0x6f56, 0x6fe1, 0x6f78, 0x6f79, 0x6f66, 0x6f4a, 0x6f35, 0x6f7a, 0x6f92, 0x6f60, 0x6f36, 0x6f51, 0x6f42, 0x455d, 0x6f3f, 0x6f7b, 0x6f5d, 0x6f94, 0x6f6a, 0xf9b5, 0x71f2, 0x73bb, 0x741b, 0x741a, 0x7433, 0x7417, 0x740a, 0x7415, 0x7412, 0x7401, 0x742d, 0x73fd, 0x7423, 0x7405, 0x7411, 0x7400, 0x741c, 0x7435, 0x742e, 0x7436, 0x0abf, 0x742f, 0x740c, 0x7409, 0x7431, 0x73fc, 0x740f, 0x7418, 0x7402, 0x7600, 0x771f, 0x7737, 0x465a, 0x7738, 0x772b, 0x772e, 0x7721, 0x7730, 0x7729, 0x7731, 0xf9c9, 0x7701, 0x772c, 0x7722, 0x77ff, 0x7877, 0x7867, 0x787f, 0x787d, 0x787b, 0x787e, 0x791e, 0x791c, 0x7921, 0x7926, 0x7927, 0x7929, 0x792c, 0x791d, 0x792b, 0x7abf, 0x7aa4, 0x7aaa, 0x7aae, 0x7a9f, 0x7ad0, 0x7ab1, 0x7aad, 0x7a9b, 0x7ab2, 0x7aa9, 0x7ab3, 0x7ab4, 0x7aba, 0x7aa5, 0x7ab7, 0x7aac, 0x7acb, 0x7acf, 0x7bc6, 0x7c01, 0x7bff, 0x7bfd, 0x7c77, 0x7c78, 0x7c76, 0x7cf7, 0x7dcc, 0x4785, 0x7dd4, 0x7dd7, 0x7dd5, 0x7dd6, 0x7dd3, 0x7f5d, 0x7f55, 0x80e0, 0x8148, 0x80ee, 0x80db, 0x80e7, 0x80d6, 0x80e5, 0x80e1, 0x80dd, 0x80e2, 0x8270, 0x8266, 0x826f, 0x826e, 0x8381, 0x8369, 0x836e, 0x836d, 0x836c, 0x8384, 0x8385, 0x8371, 0x8373, 0x836a, 0x836f, 0x837b, 0x856a, 0x857c, 0x857d, 0x8581, 0x85fa, 0x8605, 0x85eb, 0x85fb, 0x85e9, 0x85ef, 0x85fc, 0x85e7, 0xf9e1, 0x85ee, 0x85fd, 0x8732, 0x87a7, 0x87b5, 0x87b1, 0x87b9, 0x87a8, 0x87b3, 0xf9e6, 0x888a, 0x8891, 0x888d, 0x8899, 0x490b, 0x889a, 0x889b, 0x8892, 0x888f, 0x88ab, 0x4cdb, 0x4939, 0x8a75, 0x8a31, 0x8a38, 0x4937, 0x8a35, 0x8a69, 0x8a3b, 0x8a3d, 0x8a6c, 0x8a79, 0x8a3c, 0x8a3e, 0x8c97, 0x8ca5, 0x8ca2, 0x8c9d, 0x8ca1, 0x8d68, 0x8d6f, 0x8d6d, 0x8d72, 0x8d75, 0x8d77, 0x8d79, 0x8eb5, 0x8eea, 0x8eab, 0x8f43, 0x8f41, 0x8f42, 0x9009, 0x9008, 0x9006, 0x9001, 0x9003, 0x9000, 0x9004, 0x900a, 0x900e, 0x900d, 0x9007, 0x900f, 0x9014, 0x9002, 0x9015, 0x900c, 0x9010, 0x9005, 0x90fd, 0x90ff, 0x9104, 0x9100, 0x9109, 0x922b, 0xf9f7, 0x9231, 0x92db, 0x92c5, 0x92d3, 0x92ce, 0x4a6b, 0x92c9, 0x92bf, 0x92cb, 0x92c0, 0x92d0, 0x92d4, 0x93c1, 0x93b9, 0x93bb, 0x93c3, 0x93c9, 0x9407, 0x942d, 0x94f8, 0x94e1, 0x94fa, 0x94ef, 0x94fd, 0x4acd, 0x94eb, 0x94f1, 0x94ed, 0x94fe, 0x95f8, 0x9603, 0x95ee, 0x95e8, 0x9601, 0x96ec, 0x9722, 0x9714, 0x9734, 0x972f, 0x9739, 0x9741, 0x973c, 0x9749, 0x9758, 0x973a, 0x9742, 0x973f, 0x9822, 0x9823, 0x984a, 0x98dc, 0x98d9, 0x98db, 0x98e2, 0xfa07, 0x98df, 0x98e0, 0x98d7, 0x9a4f, 0x9a46, 0x9a53, 0x9a55, 0x9a4e, 0x9a4a, 0x9a4c, 0x9a63, 0x9b51, 0x9b53, 0x9b58, 0x9b4d, 0x9b5a, 0x9b49, 0x9b5d, 0x9c12, 0x9c3c, 0x9cd1, 0x9cdf, 0x9cd6, 0x9cd8, 0x9ce0, 0x9cd9, 0x9db1, 0x9dac, 0x9daa, 0x9dee, 0x9dbd, 0x4c4d, 0x9dc3, 0x9da8, 0x9dae, 0x9dab, 0xa01d, 0xa027, 0xa038, 0xa012, 0xa048, 0xa02b, 0xa016, 0xa019, 0xa03d, 0xa023, 0xa02a, 0xa264, 0xa2ad, 0xa2ac, 0xfa14, 0xa2b1, 0xa2af, 0xa32c, 0xa324, 0xa325, 0xa328, 0xa3f9, 0xa3f7, 0xa3fd, 0xa3fe, 0xa439, 0xa433, 0xa4d7, 0xa4d8, 0xa4e4, 0x14a1, 0xa50e, 0xa53b, 0xa544, 0xa542, 0xa594, 0xa593, 0xa5d5, 0xa6a7, 0x0431, 0x0423, 0x0428, 0x0427, 0x04c6, 0x05a3, 0x0621, 0x081b, 0x3510, 0x08c1, 0x08c3, 0x092a, 0x0969, 0x0a27, 0x10b6, 0x10a7, 0x10a4, 0x10a6, 0x1090, 0x109e, 0x1094, 0x10a8, 0x10a5, 0x10a2, 0x1091, 0x367b, 0x14bc, 0x14bd, 0x14b4, 0x14b0, 0x14e4, 0x1545, 0x154b, 0x157e, 0x157f, 0x157d, 0x15c3, 0x18fc, 0x18f7, 0x18f0, 0x18ed, 0x18f1, 0x18f8, 0x1ae9, 0x1ceb, 0x381d, 0x1f90, 0x1f8d, 0x1f86, 0x1f91, 0x1f8a, 0x2008, 0x2050, 0x22ea, 0x22e6, 0x22e2, 0x22e7, 0x22ed, 0x22e1, 0x2434, 0x2476, 0x2475, 0x2473, 0x24b5, 0x2590, 0x2592, 0x28e1, 0x28df, 0x28d5, 0x28f2, 0x28fe, 0x2913, 0x292e, 0x2a19, 0x2e08, 0x64f5, 0x2e05, 0x2e09, 0x2e06, 0x2e03, 0x2dfd, 0x2dfc, 0x2e02, 0x2e42, 0x301a, 0x3011, 0x3015, 0x3016, 0x30cc, 0x30cf, 0x30d0, 0x3122, 0x311e, 0x3121, 0x32e5, 0x3b27, 0x3354, 0x32ef, 0x3353, 0x3351, 0x33ad, 0x3767, 0x3768, 0x37a4, 0x3777, 0x3789, 0x3744, 0x378b, 0x3779, 0x375b, 0x3743, 0x3757, 0x374a, 0x377c, 0x3746, 0x377b, 0x3756, 0x39a8, 0x3a76, 0x3a72, 0x3ad6, 0x3ad8, 0x3ad1, 0x3c22, 0x3c20, 0x3c23, 0x3c1e, 0x3c6e, 0x40a3, 0x4077, 0x40a6, 0x406d, 0x40a2, 0x407c, 0x4084, 0x4068, 0x4074, 0x4086, 0x40a5, 0x407b, 0x407a, 0x4069, 0x4072, 0x4076, 0x444a, 0x4437, 0x442a, 0x442d, 0x4446, 0x4428, 0x4426, 0x4442, 0x442c, 0x4438, 0x442b, 0x4433, 0x4445, 0x4539, 0x46f9, 0x46fa, 0x48b8, 0x48b7, 0x48bb, 0x48b9, 0x48b4, 0x4a6f, 0x4a87, 0x4a8f, 0x4aa2, 0x4aa3, 0xf931, 0x4b9b, 0x4b9d, 0x4bce, 0x3fcf, 0x4ebd, 0x4ebf, 0x4e92, 0x3fcd, 0x4eef, 0x4ec9, 0x4fa4, 0x4fa8, 0x4faa, 0x5028, 0x5024, 0x5025, 0x5026, 0x50a9, 0x50ba, 0x50be, 0x50bc, 0x50c0, 0x52f0, 0x52df, 0x52e0, 0x52ed, 0x52db, 0x52fb, 0x52b9, 0x52da, 0x52eb, 0x52ec, 0x559a, 0x559f, 0x559b, 0x5597, 0x55a1, 0x570f, 0x5705, 0x5748, 0x4182, 0x58bc, 0x58ba, 0x5abf, 0x5d01, 0x5ce8, 0x5cef, 0x5ce4, 0x5ce6, 0x5d02, 0x5ceb, 0x5ce0, 0x5ced, 0x5cd9, 0xf964, 0x5d14, 0x5cee, 0x4252, 0x5d13, 0x5cf9, 0x5cf8, 0x5f25, 0xf969, 0x5f19, 0x5f20, 0x5f43, 0x5f3f, 0x6145, 0x614c, 0x6149, 0x614f, 0x6141, 0x613e, 0x614d, 0x6152, 0x614a, 0x614e, 0x6173, 0x6142, 0x6151, 0x6155, 0x6150, 0x616c, ERROR, 0x616a, 0x6153, 0x6168, 0x6255, 0x6256, 0x631c, 0x631d, 0x7f80, 0x631e, 0x6323, 0x631f, 0x63e1, 0x63cd, 0x63cb, 0x63cc, 0x63c8, 0x63c9, 0x649b, 0x6494, 0x6492, 0x6496, 0x6493, 0x6495, 0x648f, 0x651d, 0x6522, 0x6521, 0x65e9, 0x65ef, 0x65e0, 0x65e6, 0x65e4, 0x6829, 0x682c, 0x6876, 0x6883, 0x6878, 0x683c, 0x4443, 0x687a, 0x4451, 0x68f2, 0x699e, 0x699b, 0x699a, 0x69f6, 0x69f5, 0x6aa5, 0x6a93, 0x6aa4, 0x6e82, 0x6ec7, 0x6fb7, 0x701d, 0x6fe2, 0x6fd7, 0x6fe3, 0x6fe4, 0x6fbc, 0x6fd3, 0x455a, 0x6f5a, 0x6fd2, 0x6f2d, 0xf9af, 0x6fc4, 0x6fd0, 0x6fe5, 0x7005, 0x7007, 0x6fe6, 0x701b, 0x6fe7, 0x6fd8, 0x6fbe, 0x7017, 0x6fb4, 0x6fd9, 0x6fe8, 0x6fad, 0x6faf, 0x6fc8, 0x6fe9, 0x6fea, 0x71fe, 0x71fb, 0x7200, 0x7472, 0x7470, 0x7446, 0x7459, 0x745e, 0x7448, 0x744f, 0x7471, 0x7460, 0x745f, 0x746e, 0x7473, 0xf9c0, 0xf9bf, 0x7447, 0x746d, 0x746f, 0x7481, 0x746c, 0x7478, 0x7483, 0x7449, 0x7468, 0x7474, 0x7463, 0x746a, 0x6885, 0x7465, 0x7462, 0x74c8, 0x75d0, 0x75d4, 0x75d1, 0x7603, 0x7742, 0x7763, 0x7756, 0x775b, 0x7755, 0x7750, 0x772d, 0x7744, 0x7748, 0x7745, 0x7782, 0x4665, 0x7762, 0x7885, 0x788d, 0x7936, 0x792f, 0x7931, 0x7937, 0x7aa7, 0x7ad9, 0x7af0, 0x7af2, 0x7afd, 0x7ae8, 0x7aeb, 0x7aee, 0x7ae0, 0x7ae9, 0x7aed, 0x7ad6, 0x7af8, 0x7ad4, 0x7adf, 0x7ae7, 0x7ad8, 0x7ae3, 0x7aef, 0x7b0f, 0x7bca, 0x1546, 0x7c05, 0x7c0c, 0x7c0d, 0x7c7f, 0x7c80, 0x7c81, 0x7d01, 0x7d03, 0x7df2, 0x7de2, 0x7de3, 0x7dde, 0x7de9, 0x7de8, 0x7de0, 0x7e01, 0x7df5, 0x7de4, 0x8d01, 0x7e77, 0x7f74, 0x7f6f, 0x7f62, 0x7f61, 0x7f6d, 0x7f73, 0x7f6a, 0x7f69, 0x8112, 0x812d, 0x8114, 0x810f, 0x8129, 0x8116, 0x8103, 0x8146, 0x815c, 0x8111, 0x8106, 0x80dc, 0x812b, 0x812a, 0x812c, 0x8127, 0x827a, 0x839c, 0x8399, 0x8395, 0x838b, 0x8398, 0x8396, 0x8432, 0x85a4, 0x85aa, 0x861b, 0x48af, 0x860d, 0x861c, 0x860a, 0x8620, 0x8608, 0x861a, 0x8613, 0x8611, 0x875d, 0x875f, 0x875e, 0x8760, 0x87bb, 0x87bc, 0x87c1, 0x87c0, 0x87c8, 0x87ce, 0x88a7, 0x88b2, 0x88b6, 0x88a5, 0x88ba, 0x88b5, 0x88ad, 0x88a4, 0x88d3, 0x88b0, 0x88b1, 0x891d, 0x8a8d, 0x4941, 0x8a91, 0x8ab6, 0x8ab7, 0x8abd, 0x8abc, 0x8a96, 0x8a94, 0x8aa0, 0x8ca8, 0x8ca6, 0x8d84, 0x8d96, 0x8d88, 0x8d9a, 0x8ed1, 0x8ecf, 0x8f50, 0x8f51, 0x8f4e, 0x8f80, 0x8f81, 0x901b, 0x9017, 0x9020, 0x9019, 0x901a, 0x9021, 0x901e, 0x9018, 0x901d, 0x4a29, 0x912d, 0x9124, 0x9127, 0x912e, 0x9125, 0x911c, 0x9119, 0x4a2a, 0x9123, 0x911f, 0x911a, 0x912b, 0x911e, 0x91e0, 0x9233, 0x92e6, 0x92fc, 0x92e5, 0x92f8, 0x92f6, 0x92ea, 0x92f2, 0x92ed, 0x92eb, 0x92f0, 0x92f1, 0x93c6, 0x93c8, 0x93ce, 0x93c5, 0x4a96, 0x93cb, 0x9513, 0x9514, 0x9507, 0x950c, 0x961a, 0x4b12, 0x9617, 0x9606, 0x9616, 0x9607, 0x9610, 0x9609, 0x9619, 0x9615, 0x976e, 0x973b, 0x973e, 0x976c, 0x9765, 0x9764, 0x9759, 0x977c, 0x9770, 0x9779, 0x982c, 0x9852, 0x9851, 0x984c, 0x9900, 0x9910, 0x9913, 0x98ff, 0x98fe, 0x98ed, 0x9a5a, 0x9a58, 0x9a5c, 0x9ada, 0x9b78, 0x9b5e, 0x9b67, 0x9b64, 0x9c13, 0x9c23, 0x9c41, 0x9c3f, 0x9c40, 0x9ced, 0x9ce3, 0x9cea, 0x9cf0, 0x9ce6, 0x9ce9, 0x9cf1, 0x9cee, 0x9dd4, 0x9dd1, 0x9ddc, 0x9dec, 0xa069, 0xa06d, 0xa057, 0xa066, 0xa0f9, 0xa04a, 0xa060, 0xa056, 0xa059, 0xa04c, 0xa06a, 0xa062, 0xa063, 0xa070, 0xa05f, 0xfa0d, 0xa064, 0xa05d, 0xa068, 0xa09f, 0xa2ba, 0xa2b8, 0xa2bc, 0xa2b9, 0xa2b4, 0xa33b, 0xa32d, 0xa338, 0xa32f, 0xa332, 0xa441, 0xa4cb, 0xa4de, 0xa4dd, 0xa4da, 0xa4dc, 0xa510, 0xa54f, 0xa549, 0xa598, 0xa596, 0xa597, 0xa5c7, 0x019c, 0xa5da, 0xa5d8, 0xa6a8, 0x010a, 0x019d, 0x04cb, 0x0538, 0x0539, 0x05a6, 0x0823, 0x0822, 0x0821, 0x09ce, 0x0b92, 0x0b91, 0x10ec, 0x10e0, 0x10ed, 0x1108, 0x10e5, 0x10ee, 0x10e4, 0x10eb, 0x10e3, 0x10ea, 0x110a, 0xf859, 0x14d1, 0x14e3, 0x14d4, 0x14d0, 0x14d9, 0x367e, 0x58e1, 0x14da, 0x14d3, 0x154c, 0x154d, 0x157c, 0x1580, 0x15cc, 0x18ff, 0x1908, 0xa508, 0x1901, 0xf86b, 0x1900, 0x1aed, 0x1af3, 0x1aee, 0x1af1, 0x1af0, 0x1ade, 0x1b51, 0x1f82, 0x1fa9, 0x1f98, 0x1f9d, 0x1f9a, 0x1f9e, 0x1f9f, 0x1fa6, 0x1fa7, 0x2009, 0x202f, 0x2171, 0x216d, 0x2172, 0x22ef, 0x22f0, 0x243b, 0x2439, 0x243c, 0x2438, 0x4bfd, 0x243a, 0x2478, 0x2479, 0x2477, 0x2598, 0x259c, 0x2599, 0x259a, 0x2911, 0x290a, 0x28fd, 0x290f, 0x2919, 0x2903, 0x2915, 0x290c, 0x2909, 0x2912, 0x2934, 0x292a, 0x2908, 0x292d, 0x2928, 0xf8b1, 0x292c, 0x2926, 0x2933, 0x39a7, 0x2a1a, 0x2a1e, 0x2e07, 0x2e2c, 0x2e32, 0x2e28, 0x2e31, 0x2e29, 0x2e30, 0x2e2a, 0x2e44, 0x2e2e, 0x30d1, 0x3124, 0x32f7, 0x32f4, 0x32f3, 0x32f8, 0x37b5, 0x3796, 0x3798, 0x3795, 0x3791, 0x37b2, 0x379e, 0x3759, 0x37a3, 0x379a, 0x379b, 0x4320, 0x6183, 0x3ada, 0x3adf, 0x3b16, 0x3c1f, 0x3c2d, 0x3c2e, 0x3c2b, 0x40b8, 0x40bb, 0x40bf, 0x40ba, 0x40d5, 0x40e3, 0x40c1, 0x40be, 0x40bd, 0x40b4, 0x40c2, 0x40a1, 0x4087, 0x40d7, 0x40ca, 0x40b5, 0x40da, 0x40d9, 0x40b3, 0x40d8, 0x4467, 0x4471, 0x4462, 0x445c, 0x4468, 0x4452, 0x4456, 0x1109, 0x0442, 0x45a0, 0x4700, 0x46fe, 0x46ff, 0x48cb, 0xf928, 0x48ca, 0x48a9, 0x48c8, 0x4ab4, 0x4aac, 0x4aaa, 0x4aa9, 0x4c0e, 0x4ce9, 0x4ced, 0x4cf2, 0x4ceb, 0x4cee, 0x4ee8, 0x4edb, 0x4ed7, 0x4ee3, 0x4ee5, 0x4eee, 0x4ed5, 0x4fb3, 0x502d, 0x50c1, 0x50c3, 0x530c, 0x530e, 0x5307, 0x5317, 0x5309, 0x5316, 0x539a, 0x539c, 0x55b4, 0x55b7, 0x55b3, 0x154e, 0x5713, 0x5714, 0x58e6, 0x58dc, 0x58e8, 0x58e5, 0x5a2e, 0x5a2c, 0x5a2b, 0x5acd, 0x5d3d, 0x5d32, 0x5d2d, 0x5d45, 0x5d3e, 0x5d50, 0x5d25, 0x5d53, 0x5d23, 0x5f37, 0x5f38, 0x5f47, 0x5f3d, 0x5f3e, 0x5f49, 0x5f4a, 0x5f1d, 0x7ce9, 0x61a5, 0x618c, 0x618d, 0x6189, 0x6196, 0x6185, 0x618f, 0x6177, 0x618e, 0x6182, 0x618a, 0x6188, 0x617b, 0x6197, 0x617d, 0x6179, 0x6259, 0x6324, 0x632d, 0x632e, 0x632b, 0xf976, 0x63da, 0x63d8, 0x63d6, 0x6487, 0x64a0, 0x6528, 0x6525, 0x651f, 0x65f3, 0x65f7, 0x65f6, 0x682b, 0x685b, 0x6848, 0x81cb, 0x685c, 0x686d, 0x689d, 0x6899, 0x688c, 0x6891, 0x689b, 0x689a, 0x689c, 0x6895, 0x688d, 0x6896, 0x68a5, 0x692a, 0x69a1, 0x69a4, 0x69ad, 0x6aa9, 0x6aae, 0x6ab0, 0x700d, 0x6f63, 0x6f71, 0x7051, 0x7054, 0x702a, 0x7044, 0x7055, 0x7099, 0x7039, 0x703f, 0x703e, 0x704f, 0x704d, 0x7035, 0x7040, 0x7031, 0x6fd5, 0x702b, 0x7033, 0x7041, 0x7056, 0x704c, 0x7046, 0x703c, 0x7045, 0x7043, 0x703d, 0x7070, 0x7057, 0x7038, 0x7058, 0x4565, 0x7037, 0x7207, 0x7206, 0x7209, 0x74ab, 0x7490, 0x7493, 0x74bc, 0x74a9, 0x749e, 0x74bf, 0x74aa, 0x7491, 0x74a4, 0x749a, 0x74a7, 0x74a1, 0x749c, 0x74a2, 0x749b, 0x749f, 0x7494, 0x748f, 0x72f0, 0x7492, 0x7495, 0x74a5, 0x74a6, 0x7604, 0x779c, 0x7779, 0x777a, 0x777e, 0x777b, 0x7771, 0x7781, 0x777f, 0x777c, 0x777d, 0x7775, 0x7776, 0x788e, 0x788f, 0x793e, 0x793f, 0x7940, 0x7941, 0x4704, 0x7b0d, 0x7b17, 0x7b10, 0x7b0e, 0x7aea, 0x7b1d, 0x7b03, 0x7b22, 0x7b04, 0x7b00, 0x7b20, 0x7b21, 0x7b23, 0x7b13, 0x7b09, 0x7b11, 0x7bcb, 0x7bce, 0x7bd0, 0x7bcc, 0x7bd4, 0x14db, 0x7c09, 0x7c0b, 0x7c85, 0x7d06, 0x7d0d, 0x4764, 0x7d14, 0x7d0f, 0x7e09, 0x7e14, 0x7e0b, 0x7dfc, 0x7e04, 0x7e0a, 0x7e00, 0x7dfd, 0x7e07, 0x7e06, 0x7e11, 0x7e79, 0x7e78, 0x7f88, 0x7f80, 0x7f8b, 0x8159, 0x8161, 0x8175, 0x4823, 0x8155, 0x815b, 0x815f, 0x8152, 0x8162, 0x8172, 0x815d, 0x8168, 0x8171, 0x8165, 0x8166, 0x8167, 0x8176, 0x814c, 0x8160, 0x8174, 0x8150, 0x828a, 0x8281, 0x8286, 0x827f, 0x8280, 0x83a5, 0x83a7, 0x83a8, 0x83a6, 0x83af, 0x6195, 0x83b1, 0x8435, 0x8439, 0x85c3, 0x8630, 0x862a, 0x862b, 0x862d, 0x862e, 0x862c, 0x8623, 0x8621, 0x8622, 0x876c, 0x8781, 0x878f, 0x8780, 0x87d0, 0x87cd, 0x87d5, 0x87d4, 0x88d1, 0x88be, 0x88cb, 0x88ce, 0x88bd, 0x88d0, 0x8b04, 0x8ad5, 0x8ad0, 0x8ad3, 0x8afb, 0x8ad8, 0x8ad1, 0x8afd, 0x8ad9, 0x8ad6, 0x8ae6, 0x8af9, 0x8da1, 0x8d9d, 0x8d9e, 0x95d9, 0x8eff, 0x8f5f, 0x8f57, 0x8f60, 0x8f59, 0x902c, 0x9025, 0x9027, 0x9030, 0x9024, 0x9026, 0x902d, 0x902e, 0x9029, 0x9031, 0x9145, 0x9147, 0x9152, 0x914a, 0x9150, 0x9146, 0x914f, 0x914e, 0x9153, 0x9321, 0x9309, 0x931a, 0x931b, 0x5315, 0x9310, 0xf9f9, 0x9314, 0x930e, 0x9312, 0x930b, 0x93cf, 0x93d2, 0x93d0, 0x93d4, 0x93d3, 0x93d1, 0x0b18, 0xf9fb, 0x9409, 0x951c, 0x9527, 0x9525, 0x951b, 0x9529, 0x951f, 0x9530, 0x9524, 0x9528, 0x9519, 0x952f, 0x9624, 0x9621, 0x9625, 0x9626, 0x9627, 0x9676, 0x9766, 0x9775, 0x9769, 0x977e, 0x978f, 0x9774, 0x7210, 0x97ad, 0x982b, 0x982a, 0x9858, 0x9922, 0x991d, 0x992b, 0x992c, 0x992d, 0x9933, 0x991b, 0x9927, 0x992a, 0x9928, 0x993b, 0x9a7e, 0x9a71, 0x9a79, 0x9a78, 0x9a70, 0x9a6d, 0x9a7d, 0x9a75, 0x9a76, 0x9ade, 0x9b66, 0x9b83, 0x9b87, 0x9b7b, 0x9b89, 0x9b86, 0x9b82, 0x9b7c, 0x9b81, 0x9c43, 0x9c45, 0x9cf7, 0x9cf9, 0x9cfa, 0x9e05, 0x9dfe, 0x9e0f, 0x9dff, 0x9dfa, 0x9e09, 0x9e20, 0x9e0c, 0x9e3c, 0x9e22, 0x9df8, 0x9e0a, 0x9e08, 0x9df7, 0xa08e, 0xa077, 0xa08b, 0xa0b4, 0xa08a, 0xa09a, 0xa079, 0xa083, 0xa07f, 0xa0a1, 0xa08f, 0xa0a3, 0xa081, 0xa094, 0xa07e, 0xa082, 0xa090, 0xa0a5, 0xa0ad, 0xa09d, 0xa267, 0xa269, 0xa2cb, 0xa2c8, 0xa2d1, 0xa340, 0xa34b, 0xa349, 0xa346, 0xa33e, 0xa343, 0xa33f, 0xa3a5, 0xa3a7, 0xa44e, 0xa44d, 0x259b, 0xa4e5, 0xa4e1, 0xa4e2, 0xa516, 0xa514, 0xfa1b, 0xa559, 0xa551, 0xa55f, 0xa54a, 0xa557, 0xa558, 0xa5ca, 0xa5db, 0xa5de, 0xa5e0, 0xa5e1, 0xa5df, 0xa5e2, 0xa5e3, 0xa692, 0xa6bf, 0xa6be, 0x010b, 0x0452, 0x044e, 0x34b9, 0xf813, 0x05a7, 0x0826, 0x0827, 0x08c6, 0x090b, 0x096a, 0x0978, 0x111a, 0x1116, 0x1119, 0x1117, 0x111b, 0x1118, 0x1120, 0x1237, 0x14ec, 0x1581, 0x923d, 0x190f, 0x19ad, 0x1afb, 0x1b52, 0x1faf, 0x1fb7, 0x1fb2, 0x2178, 0x21ac, 0x2300, 0x22fe, 0x2302, 0x22fd, 0x2303, 0x2440, 0x2443, 0x2442, 0x24b7, 0x25a2, 0x2900, 0x2935, 0x2941, 0x2905, 0x0453, 0x2950, 0x294e, 0x2953, 0x2e53, 0x2e50, 0x2e57, 0x2e5f, 0x2e55, 0x2eea, 0x3026, 0x9830, 0x302a, 0x3028, 0x302c, 0x302d, 0x30d4, 0x3307, 0x3358, 0x3359, 0x37c5, 0x37cd, 0x37c7, 0x37e8, 0x3c4b, 0x3932, 0xa697, 0x3ade, 0x3c32, 0x0ac8, 0xf915, 0x40f1, 0x40f0, 0x40ec, 0x4109, 0x40f9, 0x40f5, 0x40fe, 0x4474, 0x4481, 0x447c, 0x4475, 0x4489, 0x4482, 0x4497, 0x4486, 0x447d, 0x4493, 0x449c, 0x4476, 0x4480, 0x4545, 0x06a1, 0x4703, 0x48c9, 0x48cd, 0x48d0, 0x4aad, 0x4ac5, 0x4ba2, 0x4cec, 0x4cf6, 0x4cf3, 0x4ef3, 0x4efa, 0x4ef9, 0x4ef5, 0x4ef4, 0x4ef8, 0x4fb6, 0x4fb4, 0x5032, 0x50cd, 0x50c8, 0x50ce, 0x50ca, 0x532a, 0x5321, 0x531d, 0x55bd, 0x55be, 0x55c2, 0x40f1, 0x55c9, 0x571f, 0x58f1, 0x58ed, 0x58f2, 0x58e0, 0x58f7, 0x5a30, 0x5a37, 0x5a31, 0x5a36, 0x5ac8, 0x5d6d, 0x5d69, 0x5d7d, 0x5d61, 0x5d70, 0x5d71, 0x5d73, 0x5d76, 0x5d75, 0x5d78, 0x5d79, 0x5d64, 0x5d6e, 0x5f51, 0x5f4f, 0x5f22, 0x61af, 0x61aa, 0x61a3, 0x619d, 0x619c, 0x61a1, 0x61b6, 0x61ac, 0x61a2, 0x61a7, 0x61b0, 0x61a9, 0x61c3, 0x6331, 0x6332, 0x6333, 0x6334, 0x6337, 0x633c, 0x63d9, 0x63dd, 0x63de, 0x63df, 0x63e0, 0x64a5, 0x64aa, 0x64a2, 0x64a3, 0x6604, 0x6603, 0x65fe, 0x6628, 0x68af, 0x68ad, 0x68a6, 0x69ac, 0x69a5, 0x69b0, 0x69b1, 0x6a01, 0x6ab2, 0x6ad2, 0x6af1, 0x6fd1, 0x7047, 0x70c9, 0x70a7, 0x70c8, 0x7095, 0x708e, 0x7091, 0x707d, 0x70ee, 0x708d, 0x708c, 0x70b0, 0x7096, 0x7042, 0x707c, 0x70b1, 0x70b2, 0x7084, 0x709d, 0x70a1, 0x7098, 0x70b3, 0x7022, 0x707b, 0x708a, 0x70ce, 0x7080, 0x7097, 0x70b4, 0x70b5, 0x709a, 0x709f, 0x7093, 0x7212, 0x720b, 0x720e, 0x74a3, 0x74cc, 0x74dc, 0x74e1, 0x74de, 0x74d2, 0x74db, 0x74d9, 0x74d7, 0x74d4, 0x74c9, 0x74eb, 0x74da, 0x74d1, 0x7504, 0x74ca, 0x74e2, 0x75d7, 0x778c, 0x7799, 0x77a2, 0x7796, 0x7794, 0x779f, 0x4667, 0x778e, 0x7803, 0x7894, 0x7893, 0x7944, 0x7b2f, 0x7b35, 0x7b2b, 0x7b32, 0x7b2d, 0x7b36, 0x4714, 0x7b31, 0x7b12, 0x7b33, 0x7b1f, 0x7b34, 0x7b40, 0x7b3f, 0x7b41, 0x7bd3, 0x7c89, 0x7d18, 0x7d10, 0x7e1a, 0x7e25, 0x7e1e, 0x7f92, 0x7f95, 0x7f93, 0x8184, 0x819a, 0x8189, 0x818d, 0x8188, 0x8191, 0x819b, 0x819c, 0x9548, 0x828e, 0x8292, 0x83c5, 0x83c1, 0x83b8, 0x83be, 0x83b5, 0x83c7, 0x843c, 0x4889, 0x85ec, 0x863f, 0x8639, 0x8637, 0x87a1, 0x8794, 0x87a0, 0x87de, 0x87db, 0x87df, 0x87dc, 0x88d6, 0x88dc, 0x88dd, 0x88e0, 0x88e3, 0x88e1, 0x8b18, 0x8b19, 0x8b53, 0xf9ec, 0x8b44, 0x8b0e, 0x8b0f, 0x8b47, 0x8b17, 0x8b1d, 0x8b11, 0x8cb4, 0x8cb6, 0x8db7, 0x8dbe, 0x8dc2, 0x8db4, 0x8f31, 0x8f15, 0x8f83, 0x903b, 0x9036, 0x9042, 0x9050, 0x9040, 0x9034, 0x9038, 0x903d, 0x903e, 0x9035, 0x903a, 0x9046, 0x9037, 0x9039, 0x9045, 0x9177, 0x915d, 0x916a, 0x9176, 0x916b, 0x916c, 0x9165, 0x9164, 0x9171, 0x915f, 0x9172, 0x91fe, 0x91ff, 0x923e, 0x932b, 0x9336, 0x932d, 0x9339, 0x933f, 0x933b, 0x9333, 0x9342, 0x933a, 0x93d5, 0x93d8, 0x93d9, 0x940d, 0x940a, 0x9439, 0x943a, 0x953d, 0x9545, 0x953a, 0x9537, 0x953e, 0x9542, 0x9787, 0x978c, 0x9782, 0x976b, 0x97a0, 0x979a, 0x9790, 0x978e, 0x97a1, 0x97bd, 0x97b2, 0x97b5, 0x97b7, 0x97aa, 0x97a2, 0x97a5, 0x97ae, 0x97ab, 0x97bc, 0x9832, 0x985a, 0x9964, 0x995c, 0x994d, 0x993f, 0x993e, 0x9952, 0x9958, 0x9957, 0x995e, 0x9953, 0x9954, 0x9956, 0x8f65, 0x9a84, 0x9a85, 0x9a86, 0x9b97, 0x9ba1, 0x9ba2, 0x4c0b, 0xfa0a, 0x9ba3, 0x9ba6, 0x4c17, 0x9c15, 0x9c24, 0x9c4a, 0x9c49, 0x9c48, 0x9c4b, 0x9d0e, 0x9962, 0x9d0b, 0x9d0a, 0x9d08, 0x9d06, 0x9e43, 0x9e47, 0x9e3f, 0x9e46, 0x9e50, 0x4c6d, 0x9e4b, 0x4c70, 0x9e52, 0xa0d7, 0xa0bf, 0xa0d8, 0xa0e0, 0xa0e7, 0xa0b8, 0xa0d5, 0xa0ef, 0xa0e6, 0xa0e4, 0xa0d4, 0xa0d6, 0xa0ea, 0x4ced, 0xa0bb, 0xa0e9, 0xfa10, 0xa26d, 0xa270, 0xa273, 0xa272, 0xa2d4, 0xa2ce, 0xa2d5, 0xa35a, 0xa358, 0xa352, 0xa350, 0xa355, 0xa34e, 0xa34d, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3d1, 0xa458, 0xa463, 0xa45e, 0xa454, 0xa45b, 0xa4e9, 0xa4e7, 0xa4e8, 0xa51d, 0xa567, 0xa55a, 0xa55c, 0xa55b, 0xa561, 0xa5a1, 0x4d8d, 0xa5a4, 0xa5e9, 0xa5ef, 0xa5e5, 0xa5f5, 0xa5eb, 0xa5ed, 0xa696, 0xa695, 0xa6b3, 0xa6b5, 0xa6b1, 0x34a7, 0x044d, 0x0624, 0x082b, 0x09cf, 0x0ac9, 0x1136, 0x1131, 0x1154, 0x113a, 0x1138, 0x1239, 0x1238, 0x14f4, 0x14f3, 0x14f6, 0x14fc, 0x14f5, 0x14f1, 0x169c, 0x1918, 0x191a, 0x1afc, 0x1afe, 0x1b03, 0x1b53, 0x1d2b, 0x1fc6, 0x1fc1, 0x217b, 0x2306, 0x2449, 0x24b8, 0x25a3, 0x2952, 0x294d, 0x295f, 0x295e, 0x2961, 0x2a23, 0x2e8c, 0x2e6f, 0x2e75, 0x2e74, 0x2e71, 0x2e70, 0x2e6c, 0x3126, 0x3308, 0x6707, 0x37f0, 0x37ef, 0x37fb, 0x3810, 0x380c, 0x37f6, 0x37fe, 0x3a7c, 0x3ae1, 0x3c38, 0x3c6f, 0x4118, 0x4115, 0x411c, 0x4110, 0x4135, 0xf917, 0x4117, 0x411d, 0x4126, 0x4128, 0x4129, 0x412a, 0x411a, 0xf916, 0x2307, 0x44ab, 0x44ac, 0x44a1, 0x44ae, 0x44a3, 0x44a7, 0x4548, 0x4604, 0x46fd, 0x3e5a, 0x4708, 0x48d2, 0x4ac6, 0x4abe, 0x4b1c, 0x4ba6, 0x4ba7, 0x4bab, 0x4c00, 0x4cfb, 0x4cfc, 0x4cf9, 0x4d01, 0x4f06, 0x4f04, 0xf93c, 0x5034, 0x5336, 0x5332, 0x5342, 0x532d, 0x5335, 0x55d8, 0x5723, 0x5720, 0x5901, 0x5900, 0x5903, 0xa6bc, 0x5a3c, 0x5a41, 0x5a35, 0x5ac9, 0x5d8e, 0x5d9e, 0x5d99, 0x5db4, 0x5daa, 0x5d9f, 0x5d96, 0x5d9d, 0x5dc3, 0x5d74, 0x5dab, 0x42af, 0x5f63, 0x5f5b, 0x5f5a, 0x61c5, 0x61c4, 0x61cf, 0x61c8, 0x61a4, 0x61bd, 0x61d3, 0x6260, 0x633b, 0x63e3, 0x63e7, 0x64a8, 0x64ac, 0x64a9, 0x652a, 0x6608, 0x6609, 0x68b9, 0x6ac1, 0x6ac2, 0x6ab8, 0x70e1, 0x70eb, 0x70e5, 0x70fa, 0x70e4, 0x710b, 0x70d7, 0x70ef, 0x70e0, 0x70ec, 0x70fb, 0xf9b0, 0x70d3, 0x70e6, 0x70fc, 0x70e3, 0x70cf, 0x70da, 0x70dc, 0x70d2, 0x70a4, 0x456b, 0x7217, 0x7216, 0x74f2, 0x74fc, 0x7518, 0x74f6, 0x74fe, 0x74f3, 0x74f7, 0x7501, 0x74f9, 0x7506, 0x74f5, 0x7510, 0x74df, 0x7503, 0x7508, 0x75d8, 0x7605, 0x7797, 0x77b3, 0x77ae, 0x77af, 0x77a7, 0x77b1, 0x77a8, 0x77ac, 0x77ab, 0x7804, 0x789a, 0x794a, 0x7b42, 0x7b58, 0x7b4b, 0x7b45, 0x7b49, 0x7b4c, 0x7b59, 0x7b56, 0x471b, 0x7b46, 0x7b44, 0x7b5b, 0x7b69, 0x7c8e, 0x7c8f, 0x7d1e, 0x68bc, 0x7e2f, 0x7f9e, 0x7f9d, 0x7f9f, 0x7f9c, 0x81b4, 0x81ae, 0x81ab, 0x81b3, 0x81af, 0x81c2, 0x8293, 0x8295, 0x8296, 0x8297, 0x83cf, 0x83ce, 0x83cb, 0x844b, 0x8646, 0x8643, 0x8645, 0x8651, 0x87ae, 0x87af, 0x87b0, 0x87b8, 0x87e2, 0x87e3, 0x87e6, 0x88ed, 0x88ea, 0x893a, 0x8b59, 0x8b84, 0x8b5f, 0x8b7c, 0x8b5c, 0x8b58, 0x8b55, 0x8b5d, 0x8b7e, 0x8b80, 0x8b83, 0x8b57, 0x4963, 0x8b5e, 0x8cba, 0x8dd5, 0x8f58, 0x8f68, 0x8f67, 0x904a, 0x904c, 0x9052, 0x9049, 0x904e, 0x9047, 0x904d, 0x904b, 0x904f, 0x917e, 0x9187, 0x9183, 0x9189, 0x4aca, 0x9186, 0x9188, 0x9247, 0x9242, 0x9249, 0x9248, 0x4a80, 0x4a84, 0x4a7f, 0x9344, 0x9351, 0x9346, 0x9347, 0x93e4, 0x940f, 0x943f, 0x954b, 0x9557, 0x9552, 0x4af1, 0x9551, 0x9558, 0x955e, 0x9553, 0x955d, 0x954d, 0x963c, 0x963f, 0x9646, 0x963e, 0x9644, 0x9645, 0x9641, 0x9638, 0x9642, 0x9643, 0x967a, 0x97a3, 0x97ba, 0x97c0, 0x97c4, 0x97c6, 0x97cb, 0x9861, 0x997a, 0x9973, 0x9972, 0x9974, 0x9980, 0x9981, 0x9a47, 0x9a95, 0x9a8f, 0x9a90, 0x9a92, 0x9a94, 0x9a8b, 0x9ae6, 0x9bb2, 0x9bb8, 0x9bbd, 0x9bbe, 0x9bce, 0x9bba, 0x9c16, 0x9c26, 0x9c25, 0x9c4c, 0x9c50, 0x9c4e, 0x9c51, 0x9c52, 0x9d14, 0x9d15, 0x9d1b, 0x9e82, 0x9e99, 0x9e9a, 0x9e7d, 0x9e85, 0x9e86, 0x9e9c, 0x9e79, 0x9e7b, 0x9e80, 0x9e83, 0x9e81, 0xa11e, 0xa11b, 0xa12a, 0xa0fb, 0xa105, 0xa120, 0xa111, 0xa104, 0xa0fd, 0xa103, 0xa110, 0xa118, 0xa10a, 0xa14e, 0xa109, 0xa107, 0xa11c, 0x4d1c, 0xa277, 0xa276, 0xa2d8, 0xa2d9, 0xa361, 0xa35c, 0xa35e, 0xa360, 0xa3aa, 0xa3d6, 0xa3d8, 0xa409, 0xa408, 0xa46b, 0xa465, 0xa473, 0xa474, 0xa4ed, 0xa524, 0xa525, 0xa56a, 0xa5a7, 0xa5a8, 0xa60b, 0xa5fa, 0xa5f9, 0xa5ff, 0xa604, 0xa5f6, 0xa605, 0xa699, 0xa6ab, 0xa6bd, 0xa6b8, 0x34a8, 0x0464, 0x045a, 0x0572, 0x097a, 0x0b95, 0x115f, 0x1161, 0x115e, 0x115a, 0x115c, 0x115d, 0x116e, 0x1157, 0x1158, 0x1502, 0x150b, 0x1508, 0x1551, 0x1925, 0x1928, 0x1923, 0x1921, 0x1924, 0x1929, 0x1b06, 0x1b0a, 0x1fca, 0x1fcc, 0x1fcb, 0x1fcf, 0x217f, 0x217c, 0x21d6, 0x2309, 0x230b, 0x2376, 0x247d, 0x25a5, 0x295b, 0x295c, 0x295d, 0x2965, 0x2e6d, 0x2e82, 0x2e83, 0x2e87, 0x2e95, 0x2e8a, 0x30d6, 0x3128, 0x330d, 0x382e, 0xf8ee, 0x382d, 0x3821, 0x3819, 0x393b, 0x393c, 0x393a, 0x3a7e, 0x3c3b, 0x4147, 0x4139, 0x4134, 0x4136, 0x4146, 0x413b, 0x4141, 0x4145, 0x44c0, 0x44c4, 0x44ba, 0x44bd, 0x44be, 0x45a3, 0x470c, 0x48d9, 0x4acd, 0x4bae, 0x4cff, 0x4d24, 0x4fbb, 0x4fbc, 0x5036, 0x50d5, 0x50d3, 0x50d6, 0x533c, 0x533f, 0x55de, 0x55e3, 0x5727, 0x5729, 0x418b, 0x5905, 0x5907, 0x590c, 0x5ad0, 0x5dbe, 0x5dbc, 0x5dd0, 0x5dc2, 0x5db5, 0x5dc9, 0x5f66, 0x432b, 0x61d5, 0x61e2, 0x61dc, 0x61e3, 0x61da, 0x61c2, 0x61e8, 0x63e9, 0x64af, 0x64ad, 0x64ae, 0x660b, 0x68c1, 0x69b6, 0x69b9, 0x6ac0, 0x70a5, 0x7128, 0x7122, 0x7129, 0x7118, 0x711f, 0x711c, 0x7112, 0x712a, 0x457a, 0x7121, 0x712b, 0x7117, 0x70f0, 0x7116, 0x7123, 0x752b, 0x7526, 0x753d, 0x7522, 0x753a, 0x7531, 0x7532, 0x7554, 0x7521, 0x7535, 0x4609, 0x752e, 0x7530, 0x752f, 0x7536, 0x75da, 0x75d9, 0x77bb, 0x77bc, 0x77b7, 0x77c2, 0x77bd, 0x77b2, 0x466d, 0x5344, 0x5dd1, 0x7b52, 0x7b6b, 0x7b67, 0x471f, 0x7b61, 0x7b6c, 0x7b51, 0x7b74, 0x7b77, 0x7b6f, 0x7b6d, 0x7b68, 0xf9d1, 0x7b84, 0x7c90, 0x7c92, 0x7c93, 0x7d1f, 0x7e31, 0x7e38, 0x7e39, 0x7e37, 0x7fab, 0x81c3, 0x81c8, 0x81cb, 0x81cf, 0x8298, 0x83d4, 0x83d3, 0x83d8, 0x83d9, 0x83dd, 0x83d1, 0x83d6, 0x843e, 0x8658, 0x8657, 0x8655, 0x87c4, 0x87e4, 0x88ee, 0x88ef, 0x88f3, 0x88f2, 0x88f0, 0x8bab, 0x8b9a, 0x8baf, 0x8b97, 0x496a, 0x496c, 0x8bbf, 0x8b94, 0x8b93, 0x8cbe, 0x8cbb, 0x8cbc, 0x8dd9, 0x8f6c, 0x9053, 0x9054, 0x905b, 0x9058, 0x9056, 0x9057, 0x919f, 0x9194, 0x9196, 0x9197, 0x924a, 0x924b, 0x9355, 0x935a, 0x935e, 0x935f, 0x9359, 0x935b, 0x9358, 0x9354, 0x93e8, 0x93eb, 0x93ec, 0x9413, 0x9566, 0x956b, 0x9562, 0x9569, 0x9563, 0x955f, 0x954e, 0x9648, 0x964a, 0x97e3, 0x97db, 0x97d8, 0x97d6, 0x9986, 0x9990, 0x9991, 0x9988, 0x9994, 0x9983, 0x4bb2, 0x999c, 0x998d, 0x9985, 0x9a98, 0x9a9a, 0x9a9c, 0x9ae7, 0x9bc5, 0x9bd0, 0x9bd1, 0x9c19, 0x9c27, 0x4c1d, 0x9c54, 0x9d2d, 0x9d22, 0x4c2d, 0x9d1f, 0x9ebd, 0x9eae, 0x9ebb, 0x9ead, 0x9ebc, 0x9eb9, 0x9eb4, 0x9ecb, 0x9eb7, 0x9eb3, 0x9eba, 0x9eb6, 0x9ecd, 0x9ebe, 0x9ec9, 0xfa0b, 0xa15f, 0xa13b, 0xa161, 0xa15c, 0xa18a, 0xa15a, 0xa14d, 0xa146, 0xa144, 0xa13d, 0xa140, 0xa13c, 0xa18c, 0xa141, 0xa14c, 0xa13e, 0xa14a, 0xa27c, 0xa27a, 0xa365, 0xa36e, 0xa369, 0xa36a, 0xa36f, 0xa36c, 0xa370, 0xa368, 0xa36b, 0x4d45, 0xa3ac, 0xa3de, 0xa3dd, 0xa3dc, 0x44c5, 0xa48c, 0xa483, 0xa482, 0xa488, 0xa485, 0xa481, 0xa4f5, 0xa4ef, 0xa4f4, 0xa4f2, 0xa4f6, 0xa4f3, 0xa4f0, 0xa4f1, 0xa52b, 0xa527, 0xa528, 0xa56c, 0xa5ae, 0xa60e, 0xa61b, 0xa616, 0xa61f, 0xa622, 0xa620, 0xa621, 0xa614, 0xa613, 0xa69d, 0xa69c, 0xa69e, 0xa69f, 0x046b, 0x08c8, 0x1178, 0x1176, 0x1170, 0x1171, 0x150a, 0x192c, 0x2311, 0x247e, 0x2957, 0x2966, 0x2969, 0x2967, 0x2968, 0x2971, 0x296f, 0xa3ae, 0x2e8b, 0x2e96, 0x3035, 0x303a, 0x306b, 0x3316, 0x3843, 0x3846, 0x383f, 0x383b, 0x383d, 0x39b1, 0x39b2, 0x3ae4, 0x3c40, 0x415d, 0x4151, 0x414d, 0x414c, 0x415b, 0x44d4, 0x44d2, 0x44ca, 0x44c8, 0x44d0, 0x44c9, 0x4549, 0x45a4, 0x4712, 0x470f, 0x4711, 0x48db, 0x48dd, 0x48dc, 0x4ad4, 0x4b21, 0x4bb2, 0x4d04, 0x4d02, 0x4f11, 0x4f16, 0x4f10, 0x4fbe, 0x721a, 0x534c, 0x534a, 0x55f2, 0x55f1, 0x572a, 0x572c, 0x572f, 0x5731, 0x5911, 0x5912, 0x5a4b, 0x5ddb, 0x5dd6, 0x5ddd, 0x5de2, 0x5de4, 0x5de0, 0x5ddf, 0x5de3, 0x5f6e, 0x5f71, 0x61e9, 0x61ea, 0x6263, 0x63eb, 0x63ea, 0x68bd, 0x68bb, 0x68c6, 0x68cc, 0x68c8, 0x44cf, 0x68c9, 0x68ca, 0x68cf, 0x68d0, 0x69ba, 0x69fb, 0x6a03, 0x6ac4, 0x7149, 0x7153, 0x7136, 0x714a, 0x7141, 0x714e, 0x7119, 0x714d, 0x7145, 0x714c, 0x7147, 0x7148, 0x714f, 0x7137, 0x7142, 0x754a, 0x7546, 0x460a, 0x7549, 0x754f, 0x7551, 0x754c, 0x460c, 0x7606, 0x7951, 0x7b7a, 0x7b83, 0x7b7e, 0x7b7f, 0x7b80, 0x4bb5, 0x7c91, 0x7c94, 0x7c95, 0x7d21, 0x7d20, 0x7e3d, 0x7e40, 0x7e46, 0x7e84, 0x7fac, 0x7fad, 0x482e, 0x81da, 0x81d9, 0x83e2, 0x83e1, 0x83e3, 0x83e4, 0x83de, 0x83df, 0x8641, 0x8659, 0x865c, 0x865a, 0x87e8, 0x88f6, 0x88fc, 0x88f7, 0x88fa, 0x88f9, 0x8bc4, 0x8bbe, 0x8bd2, 0x8bbd, 0x8b95, 0x8bd4, 0x8de4, 0x9061, 0x9062, 0x9063, 0x9064, 0x9060, 0x905c, 0x905d, 0x905e, 0x91a5, 0x91a6, 0x924c, 0x9368, 0x936e, 0x9371, 0x936b, 0x936f, 0x93ee, 0x93f1, 0x93f0, 0x93ef, 0x9415, 0x9414, 0x8f6e, 0x9447, 0x957c, 0x957a, 0x9574, 0x9576, 0x956e, 0x9578, 0x956d, 0x956c, 0x964e, 0x97d7, 0x97ea, 0x97e5, 0x9864, 0x99b3, 0x99a3, 0x99a5, 0x99a7, 0x99a2, 0x999f, 0x99a6, 0x999e, 0x99a8, 0x9aa9, 0x9aa6, 0x9aaa, 0x9aab, 0x9aa0, 0x9aa1, 0x9aa8, 0x9ae8, 0x9ae9, 0x9aea, 0x9be4, 0x9bdf, 0x9be0, 0x9c28, 0x9c5d, 0x9c5b, 0x9c56, 0x9c57, 0x9c5f, 0x9c62, 0x9ee1, 0x9ee3, 0x9ede, 0x9ed9, 0x9ee8, 0x9ef2, 0x9ef6, 0x9ee6, 0x9ef4, 0x9ef5, 0x9ee5, 0x9ee2, 0x4c8d, 0xa196, 0xa1aa, 0xa197, 0xa170, 0xa1a1, 0xa19d, 0xa1a9, 0xa16f, 0xa17e, 0xa194, 0xa19a, 0xa173, 0xa187, 0xa171, 0xa177, 0xa188, 0xa18d, 0xa185, 0xa178, 0xa1ad, 0xa280, 0xa281, 0xa2e5, 0xa2e7, 0xa37c, 0xa3af, 0xa3e1, 0xa496, 0xa4a3, 0xa490, 0xa4f8, 0xa52e, 0xa575, 0xa57e, 0xa57d, 0xa57b, 0xa578, 0xa5b0, 0xa634, 0xa636, 0xa630, 0xfa1d, 0xa62e, 0xa637, 0x0ace, 0x0b97, 0x0b98, 0x117c, 0x117e, 0x117d, 0x117f, 0x150f, 0x16a4, 0x1931, 0x192e, 0x192f, 0x1932, 0x1d2c, 0x1fd4, 0x1fdc, 0x1fd8, 0x200e, 0x2183, 0x2184, 0x2312, 0x2972, 0x297c, 0x297e, 0x2ea6, 0x2ea0, 0x2e9e, 0x2ea2, 0x312a, 0x3318, 0x384d, 0x3858, 0x385b, 0x5914, 0xf8f2, 0x3ae6, 0x4164, 0x4168, 0x4160, 0x4162, 0x44d7, 0x454b, 0x48e0, 0x4b22, 0x4d05, 0x4f19, 0x4f1a, 0x4fc3, 0x50d8, 0x50dc, 0x534f, 0x55f7, 0x55f4, 0x55f8, 0x5913, 0x5a50, 0x5df0, 0x5de9, 0x5def, 0x5ded, 0x5dea, 0x5df8, 0x5e05, 0x5df2, 0x5f72, 0x4331, 0x61f9, 0x61f3, 0x61f6, 0x61f2, 0x61f7, 0x6266, 0x6265, 0x6340, 0xf977, 0x68d1, 0x68d3, 0x6a04, 0x7159, 0x7160, 0x715b, 0x715d, 0x715e, 0x7169, 0x715c, 0x7161, 0x716a, 0x715f, 0x754e, 0x755c, 0x7560, 0x7563, 0x75db, 0x77ca, 0x77c9, 0x77c8, 0x78a5, 0x78a3, 0x7b8e, 0x7b87, 0x7b89, 0x7b85, 0x7b86, 0x7b8f, 0x7b8a, 0x7b90, 0x7c98, 0x7c9b, 0x7e47, 0x7e49, 0x7e48, 0x81e5, 0x81ea, 0x81ed, 0x83f0, 0x83ef, 0x83f2, 0x83ec, 0x8440, 0x8660, 0x865f, 0x87eb, 0x87ec, 0x8900, 0x8901, 0x8be2, 0x8bdf, 0x8be0, 0x8be1, 0x8be3, 0x8cc3, 0x8deb, 0x8dea, 0x8f61, 0x8f71, 0x906b, 0x9068, 0x9069, 0x9067, 0x91b0, 0x91b1, 0x91b2, 0x9251, 0x9374, 0x957f, 0x9584, 0x9653, 0x9654, 0x97f0, 0x97f4, 0x97f1, 0x9837, 0x99bf, 0x4bbc, 0x4bbb, 0x99bd, 0x99be, 0x99b7, 0x99c0, 0x99ba, 0x99b8, 0x99bc, 0x99bb, 0x9aeb, 0x9be7, 0x9c1d, 0x9c1c, 0x9c63, 0x244b, 0x9d38, 0x9d36, 0x9d34, 0x9d37, 0x9f06, 0x9f1c, 0x9f02, 0x9f1d, 0x9f1e, 0x9ee0, 0x9f11, 0x9f18, 0x9f21, 0x9f20, 0x9f10, 0xa1bd, 0xa1ae, 0xa1b5, 0xa1b8, 0xa1b9, 0xa1be, 0xa1c4, 0xa1bc, 0xa1ba, 0xa283, 0xa2ea, 0xa2ec, 0xa37e, 0xa37b, 0xa3e5, 0xa4a7, 0xa49e, 0xa49a, 0xa52f, 0xa531, 0xa583, 0xa5b5, 0xa646, 0xa641, 0xa643, 0xa63d, 0xa642, 0xa63b, 0xa647, 0x096b, 0x09d0, 0x118e, 0x1b11, 0xf871, 0xf889, 0x244c, 0x312b, 0x384f, 0x385e, 0x3863, 0x386b, 0x393f, 0x3ae9, 0x416d, 0x416b, 0x416a, 0x9f2a, 0x44e0, 0x44dd, 0x44e1, 0x44de, 0x44dc, 0x454d, 0x4716, 0x48e3, 0x4ae5, 0x4ae4, 0x4f1d, 0x574b, 0xa6c1, 0x5a4e, 0x5ad6, 0x5dfd, 0x5e07, 0x5dfe, 0x5e03, 0x5e0b, 0x5dff, 0x5f7a, 0x5f77, 0x61fb, 0x6343, 0x63ed, 0x69bc, 0x44df, 0x6a05, 0x6ac6, 0x6ac5, 0x7174, 0x7173, 0x7172, 0x7178, 0x7573, 0x757a, 0x4f1c, 0x7576, 0x7575, 0x7577, 0x77cf, 0x77ce, 0x77cd, 0x78a8, 0x7b98, 0x7b92, 0x7b94, 0x7c9a, 0x7fb4, 0x81eb, 0x81f4, 0x81f3, 0x81ee, 0x81f2, 0x81f0, 0x8664, 0x8c05, 0x8bfb, 0x8bfc, 0x8df3, 0x906c, 0x91ba, 0x9379, 0x937e, 0x9378, 0x93f4, 0x9416, 0x9657, 0x99c8, 0x99c3, 0x99ce, 0x9ab3, 0x9aed, 0x9aee, 0x9bf1, 0x9bf8, 0x4c14, 0x9c64, 0x9c65, 0x9f35, 0x9f29, 0x9f2c, 0x9f31, 0x9f2b, 0x9f2e, 0x9f25, 0xa1da, 0xa1e0, 0xa1d4, 0xa1e1, 0xa1dd, 0xa3e7, 0xa412, 0xa4ae, 0xa4af, 0xa586, 0xa585, 0xa5d1, 0xa658, 0xa63f, 0xa652, 0xa64b, 0xa653, 0xa650, 0xa656, 0xa657, 0xa6cd, 0xa6cb, 0x0831, 0x0830, 0x09d1, 0x361c, 0x1192, 0x1190, 0x118f, 0x1193, 0x1191, 0x3772, 0x2313, 0x247f, 0x2eac, 0x4170, 0x44e5, 0x4b23, 0x4b24, 0x4d08, 0x4d07, 0x4f1f, 0x4f20, 0x4f21, 0x50e1, 0x5354, 0x5357, 0x5355, 0x55fa, 0x5738, 0x7186, 0x5737, 0x5a53, 0x5f7e, 0x5f7b, 0xf971, 0x61fd, 0x61fc, 0x6346, 0x6932, 0x6ac7, 0x7171, 0x7183, 0x716f, 0x717e, 0x717d, 0x7181, 0x717c, 0x758a, 0x757e, 0x7580, 0x757d, 0x757f, 0x7582, 0x77d4, 0x77d0, 0x77d2, 0x7955, 0x7b9b, 0x7b9a, 0x7e4e, 0x81f1, 0x83f8, 0x83fd, 0x865e, 0x8666, 0x8905, 0x8c0a, 0x8c0b, 0x8c0e, 0x8c0d, 0x8c11, 0x8c09, 0x8c10, 0x8c0c, 0x8c12, 0x8cc4, 0x8df7, 0x8df8, 0x8f6a, 0x8f6b, 0x91c0, 0x91c2, 0x9385, 0x9380, 0x9384, 0x9381, 0x91c4, 0x958b, 0x958d, 0x958e, 0x9ab7, 0x9ab9, 0x9aef, 0x9bfb, 0x9bff, 0x9c67, 0x9c68, 0x9c69, 0x9d3f, 0x9f3c, 0x9f4c, 0x9f3d, 0x9f3e, 0x9f3f, 0x9f3b, 0xa1ff, 0x4d0e, 0xa1f6, 0xa1ee, 0xa1fc, 0xa1f8, 0xa201, 0xa1fa, 0xa288, 0xa380, 0xa411, 0xa4fe, 0xa500, 0xa535, 0x503c, 0xa5bd, 0xa5bb, 0xa65c, 0xa65a, 0xa6d1, 0xa6d0, 0x0a0b, 0x3873, 0x1939, 0x1b1a, 0x1fe3, 0x2187, 0x2377, 0x2378, 0x2eb1, 0x386a, 0x3874, 0x3aeb, 0x417b, 0x45a5, 0x48e4, 0x4d0b, 0x4d0e, 0x4d0c, 0x5739, 0x5e10, 0x5e11, 0x5e16, 0x5f81, 0x5f80, 0x61fe, 0x6201, 0x6200, 0x6347, 0x63ef, 0x7188, 0x758b, 0x758d, 0x7587, 0x7585, 0x758f, 0x7584, 0x7588, 0x758e, 0x758c, 0x77d7, 0x77d6, 0x7b9f, 0x2188, 0x8203, 0x83fe, 0x87ef, 0x8909, 0x8908, 0x8c20, 0x8c24, 0x8c1f, 0x9070, 0x9256, 0x93f7, 0x93f8, 0x93f6, 0x9590, 0x965e, 0x97f7, 0x99d6, 0x99d5, 0x9abb, 0x9af0, 0x9c01, 0x9c6c, 0x9d41, 0x9d42, 0x9f4f, 0x9f53, 0x9f58, 0xa212, 0xa204, 0xa213, 0xa205, 0xa20d, 0xa382, 0xa381, 0xa4b5, 0xa4ba, 0xa5be, 0xa665, 0xa663, 0xa66e, 0xa66a, 0xa66c, 0xa6c4, 0x096c, 0x7ba5, 0x1b12, 0x244d, 0x331f, 0x3877, 0x3878, 0x3c44, 0x417c, 0x44eb, 0x44ea, 0x44ec, 0x45a7, 0x4719, 0x4f23, 0x7674, 0x5601, 0x5e1c, 0x6203, 0x6348, 0x68da, 0x7191, 0x7192, 0x7596, 0x7597, 0x7591, 0x7593, 0x77d8, 0x77d5, 0x7957, 0x7958, 0x7ba2, 0x8205, 0x83fa, 0x890c, 0x890a, 0x8c2e, 0x8c29, 0x8c2f, 0x8cc5, 0x9072, 0x91c8, 0x925a, 0x9259, 0x9389, 0x9388, 0x99db, 0x99d9, 0x99da, 0x9abc, 0x4bec, 0x9c06, 0x9c05, 0x9c6f, 0x9c6d, 0x9c70, 0x9f60, 0x9f5e, 0x9f63, 0x9f5a, 0x9f5f, 0xa219, 0xa21d, 0xa21b, 0xa222, 0xa21c, 0xa21e, 0xa2f7, 0xa384, 0xa415, 0xa4b8, 0xa4c1, 0xa501, 0xa50a, 0xa5d2, 0xa675, 0xa674, 0xa672, 0x0ad0, 0x1b1b, 0x2010, 0x2379, 0x44ed, 0x4bb9, 0x4f24, 0x4fc5, 0x5603, 0x634a, 0x68f7, 0x69c1, 0x69c2, 0x7194, 0x7599, 0x759a, 0x795a, 0x7ba8, 0x7c25, 0x7c9e, 0x8441, 0x8c32, 0x8c33, 0x91cb, 0x91ca, 0x91cc, 0x9593, 0x99e0, 0x9c71, 0x9f6b, 0xa22b, 0xa229, 0xa21a, 0xa226, 0xa227, 0xa22a, 0xa2f8, 0x503d, 0xa676, 0x1518, 0x387a, 0x417f, 0x4279, 0x63f0, 0x719a, 0x7196, 0x759e, 0x759d, 0x75dc, 0x77da, 0x820b, 0x8402, 0x8442, 0x8667, 0x938b, 0x99e2, 0x9f71, 0xa22f, 0xa22e, 0xa4c6, 0xa58e, 0xa67b, 0xa677, 0xa678, 0xa67c, 0x387c, 0x6207, 0x7197, 0x7bd9, 0x890d, 0x890e, 0x99e3, 0x99e4, 0x9af3, 0x9c75, 0xa237, 0xa235, 0xa58f, 0xa680, 0xa67f, 0xa6d4, 0x2eb4, 0xa3ec, 0x8f75, 0x4d10, 0x6269, 0x75a4, 0x77db, 0x91d1, 0x938d, 0x9f76, 0xa239, 0xa684, 0xa682, 0x0ad2, 0x44ee, 0x4d11, 0x5f84, 0x8f74, 0x938f, 0x938e, 0xa23b, 0x08cb, 0xa688, 0xa686, 0x335c, 0x53a4, 0x9075, 0xa68b, 0x1519, 0x7c9f, 0x99e5, 0xa240, 0x4d12, 0xa2fb, 0xa68c, 0x53a5, 0x9c77, 0x9c78, 0xa6d6, 0x77df, 0x91d2, 0x151a, 0x7ba9, 0x91d3, 0xa4ca, 0x69c4, 0x78b1, 0x9664, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, }; /* * The second table is generated by running the following sh+Perl * over CNS.TXT: cat CNS.TXT | \ perl -ne '$a{$1,hex$2,hex$3}=hex$4 if /^0x(\S)(\S\S)(\S\S)\s+0x(\S+)\s/;' \ -e 'END {$o=" "; for $p (0..6) { for $r (0..93) { for $c (0..93) {' \ -e '$k=$a{$p+1,$r+33,$c+33}; $k = 0 if !defined $k; $k >>= 16;' \ -e '$k <= 3 or die; $v |= $k << $sh; $sh += 2;' \ -e 'if ($sh == 32) { $o .= sprintf"0x%08xU, ", $v; $v=$sh=0; }' \ -e '(print "$o\n"), $o=" " if length $o > 64; } } }' \ -e 'if ($sh > 0) { $o .= sprintf"0x%08xU, ", $v; $v=$sh=0; }' \ -e 'print "$o\n"; }' */ static const unsigned int cns11643_forward_2[(7*94*94+15)/16] = { 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00800000U, 0x00002000U, 0x00000000U, 0x00002000U, 0x00200080U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x02000002U, 0x80000000U, 0x00000000U, 0x02000000U, 0x00000000U, 0x00000000U, 0x00200800U, 0x00000000U, 0x00000020U, 0x00000080U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x08000000U, 0x00000200U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000800U, 0x00000000U, 0xa0080000U, 0x00008000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x20000000U, 0x00200000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000008U, 0x00000020U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000200U, 0x00000000U, 0x00000008U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00008080U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x02000000U, 0x00000000U, 0x00000000U, 0x02000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000080U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000080U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000008U, 0x80000008U, 0x00000000U, 0x00000000U, 0x00000000U, 0x20000000U, 0x00000200U, 0x00000000U, 0x00000800U, 0x08000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000020U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x20000000U, 0x00800000U, 0x00000000U, 0x00000000U, 0x00000200U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00800000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x20000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00020000U, 0x00000000U, 0x00000000U, 0x02000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00008000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000800U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00002000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00002000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x20000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x08000000U, 0x00000000U, 0x02000000U, 0x00000000U, 0x00002000U, 0x00000000U, 0x00000000U, 0x80000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000080U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000020U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000008U, 0x00000000U, 0x00000000U, 0x00080000U, 0x00000200U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000800U, 0x00000000U, 0x00000008U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00020000U, 0x02000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00820000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00080000U, 0x00000002U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000002U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000800U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x02000000U, 0xa02a0282U, 0x2aa00002U, 0x000808a8U, 0x28228088U, 0x80080080U, 0xa28a02a2U, 0x208a0a20U, 0xaa00a2aaU, 0x080aa2a2U, 0x0880808aU, 0x8082802aU, 0x82a0a282U, 0x80a20880U, 0x022a0088U, 0xaa08888aU, 0x88a082a8U, 0x022808a0U, 0x82800a80U, 0x0a280022U, 0xa2288022U, 0x8a0a08aaU, 0x828a0a2aU, 0x8a08a00aU, 0x8aaa8088U, 0x08222822U, 0x22088a02U, 0xa082a802U, 0xa8200a08U, 0x8a088020U, 0x2a00080aU, 0x80202208U, 0x02822802U, 0x288202a0U, 0x82088808U, 0x08020a82U, 0x8a0882a2U, 0x2a80a200U, 0x8022228aU, 0xaa0aa280U, 0x80208000U, 0x8282aa82U, 0x0aa8882aU, 0xa0020088U, 0xa2288aa8U, 0x822288aaU, 0xa20a88aaU, 0x00888282U, 0x20a00028U, 0xa8000080U, 0x20a08a28U, 0x00a888a0U, 0x00002a88U, 0x2a828aaaU, 0x82282220U, 0x28828200U, 0x0002220aU, 0x22288a00U, 0x2a082008U, 0x08aaa888U, 0xa2828a20U, 0xa2aaa0a2U, 0x220a2028U, 0xa820a080U, 0x08aaa2a8U, 0x820a80a2U, 0x02a8880aU, 0x822a0000U, 0x28808a02U, 0xa2228020U, 0xaaaa0280U, 0x0a2802aaU, 0x0aaa8008U, 0x088a020aU, 0x88002080U, 0x02822020U, 0x22a08aaaU, 0x80282a00U, 0xa0000088U, 0x8a880880U, 0x22a08a08U, 0x8aaa8208U, 0x02a08802U, 0x00a0a8a8U, 0x8aa22aaaU, 0x0aa282a8U, 0x8020a88aU, 0x88880a08U, 0xa02aa082U, 0xa00a2088U, 0x000022a0U, 0x2a82288aU, 0xa02200a0U, 0x00802282U, 0xa8a828a0U, 0x82a22820U, 0xa2a8a888U, 0x00822808U, 0x0220028aU, 0xa8220202U, 0x8882000aU, 0x22a8a0a0U, 0x2808a808U, 0x80002a02U, 0xa0aa2220U, 0x2a028aa2U, 0x08822a08U, 0x080a0000U, 0x08820a00U, 0x82a0008aU, 0x80000080U, 0x02a00880U, 0x880a2802U, 0x2000a208U, 0x20aa8a00U, 0xa2a80280U, 0x88082a02U, 0x0aaa8882U, 0x2282aaa0U, 0xa0280800U, 0x02aa0888U, 0x08a02828U, 0x082280a0U, 0x02280a22U, 0x0022a2a8U, 0x82002002U, 0x88aa8a28U, 0x2282aa82U, 0x088088a0U, 0x0a88aa88U, 0x8a882a22U, 0x2800a022U, 0x22a028a8U, 0x2aa8a02aU, 0x028a2820U, 0x22a800a8U, 0x28820a82U, 0x28a08882U, 0x08200a02U, 0x0020082aU, 0x22a0aa82U, 0x080808a8U, 0x020a2a20U, 0x808aa220U, 0x0aa80000U, 0x00a2a02aU, 0x2088a288U, 0x2aa80aa0U, 0x80828820U, 0x80000802U, 0x2aa80008U, 0x8280208aU, 0x220002a0U, 0xaa80a802U, 0xa0080a00U, 0x088082aaU, 0x88000800U, 0x822a22aaU, 0x822aa88aU, 0x0282a288U, 0xaaa22a82U, 0x282aa222U, 0x80282aa0U, 0x28a088a0U, 0x80000822U, 0xa0028820U, 0x000a0a00U, 0x222882a0U, 0x08aa2a02U, 0x08080aa8U, 0x0a20a080U, 0x8a80a000U, 0xa2802a20U, 0x20822aa8U, 0x8a8aa028U, 0x08828802U, 0xaa2020a8U, 0x280880a2U, 0x00002a8aU, 0x08008022U, 0x20828802U, 0x82a28280U, 0xa8220088U, 0x20020008U, 0x8aaa2a2aU, 0x2aa28022U, 0x0288880aU, 0xaa02a82aU, 0xa82aa2a2U, 0x2a8a2002U, 0x80000022U, 0x0a22a822U, 0x0888a280U, 0x20a0aa28U, 0xaa008088U, 0x8828028aU, 0xa80822a8U, 0x0808a82aU, 0x2aa00880U, 0x82aa8080U, 0xaa208a80U, 0xa0800022U, 0x02828880U, 0x222a2000U, 0xa228a02aU, 0x08088088U, 0x20800020U, 0x0288028aU, 0x0a20a8a2U, 0x002a2a8aU, 0x00002020U, 0x800080aaU, 0xaa2a0820U, 0x2800222aU, 0x22a20008U, 0x80088880U, 0x80200a20U, 0x08a82220U, 0x00000882U, 0x00800020U, 0xaaa80a00U, 0xa2a0a880U, 0x82888282U, 0x28820802U, 0xa082808aU, 0x282220a8U, 0x8222a082U, 0x8280222aU, 0x20008020U, 0x2a880008U, 0x8a0aaaa0U, 0x02882080U, 0x8200a820U, 0x20008822U, 0xaa8808aaU, 0x82888aa0U, 0x88202088U, 0x0a2a22aaU, 0x0a0800a0U, 0xa8800aa8U, 0xaa880808U, 0xa022a0a0U, 0x2a022802U, 0xaa2a8a00U, 0xaaa020a2U, 0xa2088a80U, 0x08080202U, 0x8000a028U, 0x088a82a0U, 0x8802888aU, 0x00aaa8aaU, 0x2000a008U, 0x000a2a0aU, 0x200a0280U, 0x288a8200U, 0x8a82a002U, 0xa28228aaU, 0x22802800U, 0x20a00000U, 0xaa20288aU, 0x2082a80aU, 0x2202a202U, 0x00208882U, 0x2a082802U, 0xa80008a0U, 0x08002800U, 0x00aa880aU, 0xa2200080U, 0x8208aaa8U, 0x0a880082U, 0xa88a00a0U, 0x2a002828U, 0x0a888822U, 0xa8000a20U, 0xa880a282U, 0x88028a00U, 0x8a8a2aa8U, 0x8a20880aU, 0xaaa800a2U, 0x00228a8aU, 0xa22a0a28U, 0x08082822U, 0x02882002U, 0x22008aa8U, 0x208aa00aU, 0x2a00a02aU, 0x28082280U, 0x2a202aaaU, 0x82282020U, 0x22a88888U, 0xa2aa8800U, 0x08a82288U, 0x200a202aU, 0x282800a8U, 0x88002008U, 0xa288aa2aU, 0xaa28a028U, 0xa0820a82U, 0xaa20aa00U, 0x8882aa82U, 0x8a2aa080U, 0x2aa0200aU, 0x82082280U, 0x82a808a0U, 0x00a00082U, 0x2000a08aU, 0xaaa2a002U, 0xaaa0a000U, 0x8208008aU, 0x20082200U, 0x28a88000U, 0x0a2a0208U, 0x88a0a22aU, 0x2a8a2828U, 0x28828a80U, 0x20802808U, 0xa028a222U, 0xaaa28808U, 0x002aa020U, 0x02882a00U, 0x080808a0U, 0x82800002U, 0xa080a8a2U, 0x08828882U, 0x22a0a0a0U, 0x2200a200U, 0x280aaaa2U, 0x28aaa022U, 0xa2a80080U, 0xaa82280aU, 0xa0280220U, 0x20882808U, 0x2280a880U, 0x0208aa28U, 0x8a2a8a2aU, 0xaa00228aU, 0x88820a00U, 0x8000a8a0U, 0x0a000a8aU, 0x20a88aaaU, 0xaaa22aa0U, 0xa8088a2aU, 0xa2a00088U, 0x2a280aa2U, 0x822a0aa0U, 0x802a2282U, 0x88028228U, 0x080aa008U, 0x080a080aU, 0x022022a8U, 0x2a0280a0U, 0x228a2028U, 0xaa2282a8U, 0x0a2a8802U, 0x88aaa2aaU, 0xa0222aaaU, 0x828a2a22U, 0x202a28aaU, 0x020822a0U, 0xa088a2a0U, 0x20a20a08U, 0x0088880aU, 0xa800aa00U, 0x2aa08828U, 0x02a800a2U, 0x8a008000U, 0x00002020U, 0xa8202002U, 0x22a2a822U, 0x02aaaa28U, 0xa0888880U, 0x20202882U, 0x28aa80aaU, 0xaa20828aU, 0x2a882a28U, 0xa88aa228U, 0x28a820a0U, 0x280022a0U, 0xaa28828aU, 0x2008a220U, 0x0082a802U, 0x0aaa2800U, 0x08200a8aU, 0x2a208080U, 0x0280a2a2U, 0x02a82200U, 0x22028288U, 0x0a28a220U, 0x82080288U, 0xa8200888U, 0x82822a00U, 0xa828022aU, 0x008a8282U, 0xa0280228U, 0x22a0a228U, 0x20202082U, 0xa0208200U, 0x2a08a802U, 0x880880a8U, 0xaa888880U, 0x288a8a20U, 0x00a2a80aU, 0xa882a82aU, 0x80880a80U, 0x00aa2088U, 0x28a2a0aaU, 0xaaa80a88U, 0xa828a222U, 0x220aa8a2U, 0x0802aaa2U, 0x02028080U, 0x88aaaaa8U, 0x2aaa0800U, 0x0088aaaaU, 0x2a222828U, 0x8a02aaa0U, 0x22aa8280U, 0x22088080U, 0xa28802a0U, 0x02000a2aU, 0x280002a0U, 0x02a20a2aU, 0x8a20a288U, 0xa0202288U, 0x8a200222U, 0xaaa2aa8aU, 0x02822a28U, 0x82220220U, 0x20a28008U, 0x08800a82U, 0xaa8aa2a8U, 0x200a82a8U, 0x80822082U, 0x0a8a82a8U, 0xaaaaa8aaU, 0x8208a0a2U, 0xa8002820U, 0x002a280aU, 0x20a2a082U, 0x2aa8aa0aU, 0x202000aaU, 0x8208a888U, 0x0aa0a202U, 0x02a88a0aU, 0x2a22020aU, 0x0a220aa8U, 0x2a08aa22U, 0xaa882280U, 0xa0888a28U, 0x0a2a00a8U, 0x028a88aaU, 0xa80820a2U, 0x8802aa0aU, 0x82aa8208U, 0x8888288aU, 0x808280a8U, 0x08008aaaU, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaa2aU, 0xa2aaaaaaU, 0xaaa2aaaaU, 0x82aaaaaaU, 0xaaa2aaaaU, 0xaaaaa82aU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xaaaaaa8aU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0x2a2aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aa2U, 0xa8aaaaaaU, 0xaaaa2aaaU, 0xa8aaa8aaU, 0x0aaaa28aU, 0xaaa2aa82U, 0x2a8aaaaaU, 0xaaaaa8a8U, 0xaaaaa2aaU, 0xaa2aaaaaU, 0x2aaaaaaaU, 0xaaaaaaaaU, 0xaa2a8aaaU, 0xaaaa2aaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaa8aa2a2U, 0xaaa2aaaaU, 0xaa2aaaaaU, 0xa8aa8aaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xaaaaaaaaU, 0x8aaaa2aaU, 0xaaaaa88aU, 0x8aaaa8aaU, 0xaaaaaaaaU, 0xaaa8aaaaU, 0xaa0aaaaaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xa8aaaaaaU, 0x8aaaaaaaU, 0xaaaaa8aaU, 0xaaaaa88aU, 0x2aaaaaaaU, 0xaaaa2aaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaa2aaU, 0x8aaaaaaaU, 0x8aaaaaaaU, 0xaaaaa8a2U, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaaa28U, 0xaaaaaaaaU, 0xaaa8aaaaU, 0xaaaa2aa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaa8aU, 0x8a8aaaaaU, 0xa0aa2aaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa28a2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa88aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xaaa8a2aaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaa8aaaaU, 0x28a8aaaaU, 0x2aaaaaaaU, 0xaaa8aaaaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0x0aaaa882U, 0xaaaaaaa2U, 0xaaa2aa8aU, 0xaaaaaa2aU, 0xaa2aaaaaU, 0xa8aaaaa2U, 0xaaaaaaaaU, 0x82aaaaaaU, 0xaaaaa08aU, 0xaaa2aaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0x0a2aa22aU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xaaa2aaa8U, 0xaaaaaaa2U, 0xaaa2aaaaU, 0x2aaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaaa2aa2aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaaa8aa8aU, 0xaaaaaa8aU, 0xa28aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaa8aU, 0x2aaaaaaaU, 0xaaaa2aaaU, 0xaaaaa2aaU, 0xaaa8aaaaU, 0xaaaaaaa2U, 0x2a0aaaaaU, 0x2aaa8aaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaa2aa2aaU, 0xa8a8a2aaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa22aaaaU, 0xaaaaaaaaU, 0x2aaa2aaaU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xa8aaa8aaU, 0xaaaaa22aU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2a2U, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaa8aaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaaa8aaU, 0xaaaaaaaaU, 0xaa8aa2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaa0U, 0xaaa2aaaaU, 0xaaaaaaaaU, 0x2aa8aaaaU, 0xaaaa2a2aU, 0xaa2a8aaaU, 0xaaaaaaaaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xa8aaaaa8U, 0xaaaaa2a8U, 0xaaa2aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaa88aaaaU, 0xaaaaa22aU, 0xaa8aaaaaU, 0xaaaaaaa8U, 0xa2aaa0aaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa82aaaaaU, 0x88aaaaaaU, 0xaaaaa8aaU, 0xaaa2aaaaU, 0xaaaaa222U, 0xaaaa2aaaU, 0xaaaa2aaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaa0aaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xa82aaaaaU, 0xaaaaaaaaU, 0x2aaa8aaaU, 0xaa2aaaa2U, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaa2aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa82aaaaU, 0xaaa22aaaU, 0x2aaaa8aaU, 0xaaa88aaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaa2a2U, 0xaaaaaaaaU, 0x8aaaaaa2U, 0xaaaaa2a2U, 0x2a8a2a8aU, 0xaaa8aaaaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaa2aaU, 0xaa2aaaaaU, 0xaaaa8aaaU, 0x8aa2a2aaU, 0xaaa8aaaaU, 0xaaaa0aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa8aaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xaaaaaaaaU, 0x82aaa8aaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0x2aaaaaaaU, 0xaa2aaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa2aaa0aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa8aaU, 0xaaaaaaa8U, 0xaaaa2aaaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xaaaaaaaaU, 0xa2aa8aaaU, 0xaaaaaa2aU, 0x2aaaaa2aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa22aa2aU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xa2aaaa2aU, 0xaaaaaaaaU, 0x2aa8aaaaU, 0xa8aaaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaa0aaaU, 0xaaaa2aaaU, 0xa2aa8aaaU, 0xaaaaaaaaU, 0x8aaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaa8a2aaaU, 0xaaa8aaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaa8U, 0x2aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaa8aU, 0x2a8aaaaaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xa8aaaaaaU, 0x2aa2aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaa82aU, 0x2aaaaaa2U, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xa8aaaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaa28aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xa2aaaaaaU, 0x8aaaaa2aU, 0xaaa2aaaaU, 0xaaaaaaaaU, 0xaaaaa828U, 0xa8aaaaaaU, 0xaaaa0aa2U, 0xaa2a8aaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaa2aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa88U, 0xaaaaaaa0U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaaaaaaU, 0x88aa8aaaU, 0xaa8a2aa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x8aaaa8aaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa2aa8aU, 0xaaaaaa2aU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa2aa2aaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xaaa8a2aaU, 0x2aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaa2aaa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aa0aaU, 0xaaa8aa8aU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0x88aaaaaaU, 0x8a28aaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2a8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa2U, 0x8aaaa8aaU, 0xaa2aaaaaU, 0x2aaaaaaaU, 0xaaaaaa2aU, 0xaaaaa8aaU, 0x28aaaaaaU, 0xaaaaa8aaU, 0xaaa8aaaaU, 0x0aaaa02aU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa2U, 0xaaaaa88aU, 0xaaaaaaaaU, 0x2aaa2aaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaa2aaaaU, 0xa8aa2a2aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x8aa2aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0x002aaaaaU, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0xaaaa8a00U, 0x8aaaaa2aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaa2U, 0xa2aaaaa2U, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaa8aa8aaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaa88aaaU, 0x2aaaaaaaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa02U, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0x0aa2aaaaU, 0xaaaaaaaaU, 0xaaa22aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa28aU, 0xaa2aaa8aU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aa2aaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa2U, 0x2aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xa82aaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa2a8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa8aaaaU, 0x2aaaaaaaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaa2aa2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaa22aaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa8aa2aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaa8aa8U, 0xaaaaaaa2U, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaaa2a2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8a2a2a0U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa2aaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaa2aU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaa2aaU, 0xaaaa2a28U, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaa8aaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa88U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaaaaaaU, 0xa2aaaa2aU, 0x0aaaa8aaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaa88aaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xaaa2aaaaU, 0xaaa8aaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaa2aa8U, 0xaaaaaaa2U, 0xaa2aaaaaU, 0xaaaaaaaaU, 0xaaa22aaaU, 0x2aaaaa2aU, 0xaaaaaaa8U, 0xaaa2a2aaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xa28aaaaaU, 0x22aaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaa8U, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa82aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aa8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa8aaU, 0x8aaa8aaaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaa2aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8a8aaaaU, 0xaaaaaaa8U, 0xaaaaa2a8U, 0xa2a8aa28U, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaa8aaaaU, 0xaaa2aaaaU, 0xaaaaa8aaU, 0xaaaaaa2aU, 0xa2aaaaa8U, 0x2aaaaa2aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2a22aaa2U, 0xaaaaa2aaU, 0xaaaaa2aaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaa8aa2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa22aaaaaU, 0xaaaaaaa2U, 0xaaaaa8aaU, 0xaaa2a2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaa8aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa2a2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaa2a8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaa2aaU, 0xaaaaa8aaU, 0xaaaa28aaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaa2aaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaaaaaaU, 0x0000aaaaU, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0xaaaa0000U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaa8aaaaaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaaa2U, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaa2a2aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaaaaa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xa2aaaaaaU, 0xaaaaa8aaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaa2aaa2aU, 0xaaa2aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaa2aa88aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaa88aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaa8aaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0x8aaa2aaaU, 0xaaa2aaaaU, 0xaaaaa88aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8a8aaa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaa2aaaaaU, 0x2aaaaaaaU, 0xaaaaaaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa8a8U, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaa8aaa8U, 0xaaaaaaaaU, 0xaaa2aaaaU, 0xa2aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaaa2aaaaU, 0xaaaaaaa2U, 0x2aa8aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa82U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa2aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa8a8U, 0xaaa88aaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaa2aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa2aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaa2aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0x2aaaa80aU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa8aaU, 0xaaaaaaaaU, 0xaaaa2aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaa2aaU, 0xaaaaaaa2U, 0xaa2aaaaaU, 0xa8aaaaaaU, 0x2aa2aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x0aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xaaaaa8a8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa8aU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x2aaaaaaaU, 0xaaaaa8aaU, 0xaaa8aaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa8U, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x8aaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaa0aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaa2U, 0xaaaaaaaaU, 0xaa8aa8aaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaa8aaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaa2aU, 0xaaaaaaaaU, 0xaaaa8aaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xa8aaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0xaaaaaaaaU, 0x0000002aU, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U, }; /* * Mapping from Unicode back to CNS 11643. * * This inverse is done the same way the SBCS ones are done: I * provide a list of CNS 11643 positions, sorted into ascending * order of their Unicode values. Then we can binary-search through * this list, referring to the above table for each comparison, to * find the coordinates for a given code point. * * Generated by running the following sh+Perl over CNS.TXT: cat CNS.TXT | \ perl -ne '$a{hex$4}=[$1,hex$2,hex$3]if/^0x([1-7])(\S\S)(\S\S)\s+0x(\S+)\s/;' \ -e 'END {$o=" ";for$k(sort{$a<=>$b}keys %a){($p,$r,$c)=@{$a{$k}}; ' \ -e '$o .= $C; $C = ", "; (print "$o\n"), $o=" " if length $o > 65;' \ -e '$o.=sprintf"%d",(($p-1)*94+($r-33))*94+($c-33);} print "$o\n"; }' */ static const unsigned short cns11643_backward[] = { 79, 181, 113, 16, 111, 112, 454, 452, 453, 455, 451, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 24, 22, 154, 67, 68, 69, 70, 12, 11, 73, 74, 78, 96, 167, 95, 168, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 149, 146, 148, 147, 150, 151, 153, 152, 158, 114, 121, 134, 133, 130, 131, 138, 139, 141, 140, 129, 122, 120, 123, 118, 119, 132, 135, 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 212, 213, 215, 216, 217, 218, 210, 209, 208, 207, 206, 223, 224, 226, 225, 219, 220, 222, 221, 231, 232, 233, 191, 192, 193, 194, 195, 196, 197, 198, 205, 204, 203, 202, 201, 200, 199, 211, 214, 91, 90, 84, 83, 93, 92, 89, 88, 81, 85, 82, 227, 228, 230, 229, 87, 86, 145, 142, 144, 143, 564, 565, 566, 567, 568, 569, 570, 572, 573, 574, 575, 576, 577, 579, 580, 581, 582, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 0, 2, 3, 80, 49, 50, 45, 46, 53, 54, 57, 58, 41, 42, 162, 37, 38, 71, 72, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 5, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 94, 178, 179, 173, 174, 175, 177, 180, 176, 137, 136, 172, 44285, 26605, 44195, 44182, 26562, 26717, 27186, 19484, 20004, 18268, 18405, 17862, 26718, 26903, 20605, 26564, 17756, 17749, 17752, 17754, 44413, 17846, 26618, 17838, 17839, 35551, 17995, 17992, 17998, 44636, 18273, 35724, 26908, 26911, 18272, 35730, 26910, 26907, 18283, 18628, 45459, 27190, 18627, 36002, 27191, 18621, 27188, 27193, 36359, 19498, 19037, 27516, 46083, 27954, 19487, 19497, 27959, 28505, 20010, 28499, 28504, 47710, 48030, 20011, 20606, 20609, 20612, 29057, 29058, 29053, 29055, 38688, 29632, 29628, 29623, 21143, 49620, 29624, 21138, 30888, 21137, 21134, 21142, 29627, 30264, 21625, 21624, 30266, 21623, 21627, 21629, 22107, 30892, 40100, 30890, 22496, 22798, 31936, 31937, 32376, 32726, 23236, 23234, 57705, 58135, 33402, 23715, 26620, 27520, 22799, 17757, 17854, 18006, 35554, 44646, 44648, 18007, 18635, 57180, 18561, 27961, 36853, 28510, 29063, 33403, 18637, 20015, 30269, 17719, 17860, 18009, 35733, 18290, 18289, 18291, 27200, 18639, 19048, 19047, 27962, 20018, 20019, 29065, 21144, 36856, 26572, 44306, 17765, 26629, 35453, 26725, 26726, 26925, 26927, 26923, 26922, 18644, 18648, 18645, 36375, 27968, 19058, 19060, 27972, 27973, 27967, 36859, 27969, 27974, 20025, 48673, 28515, 28518, 20023, 38055, 20619, 29642, 29644, 29643, 29637, 21148, 21146, 29640, 29639, 21147, 30270, 30897, 30896, 30898, 41386, 31471, 55834, 32377, 32727, 26575, 26633, 26731, 18021, 26930, 45010, 45502, 27532, 19062, 27975, 28524, 21151, 31474, 22500, 31475, 40110, 31943, 27977, 28526, 38063, 45013, 19508, 42857, 26738, 44673, 27534, 20026, 48683, 29075, 38709, 33702, 44671, 28529, 17727, 44448, 17871, 48687, 18303, 26518, 44206, 44905, 26937, 17875, 35465, 17873, 18027, 18026, 18025, 18307, 45035, 18655, 19067, 27537, 19068, 28530, 48693, 39402, 21153, 30274, 23673, 17732, 19069, 46876, 19511, 30276, 35376, 17734, 17877, 26941, 27220, 20579, 21156, 30133, 26582, 17781, 17777, 17883, 17881, 18029, 26744, 18028, 18034, 26747, 26752, 18035, 26746, 18032, 18031, 18043, 18052, 18325, 18312, 26944, 18321, 35753, 45050, 18661, 18675, 18674, 18677, 18669, 27222, 27225, 18665, 27546, 19080, 27541, 19072, 19079, 27542, 27540, 46152, 19085, 36412, 19518, 19526, 27991, 37397, 19524, 19517, 27997, 19515, 28000, 27998, 27994, 27993, 19884, 27996, 37403, 20039, 28552, 20042, 20033, 28543, 28538, 20046, 20051, 20034, 28545, 20050, 28544, 20044, 47776, 37406, 37407, 20037, 28537, 28550, 28548, 20054, 37395, 20052, 20047, 38094, 29087, 29083, 20632, 38098, 29084, 29089, 20630, 20633, 48709, 29659, 21167, 21164, 21162, 29656, 29651, 29662, 21160, 21645, 29660, 29663, 29658, 38729, 30283, 30279, 21653, 30280, 21641, 53061, 30906, 30907, 22122, 30902, 30905, 30910, 22117, 22115, 55106, 31477, 22503, 31478, 30908, 41391, 31945, 22801, 41396, 32379, 41980, 42382, 23238, 23412, 33011, 23607, 23606, 33633, 59140, 17783, 17766, 17888, 35770, 18329, 18679, 19087, 29665, 32729, 17784, 18061, 26758, 18072, 18073, 26757, 18076, 18078, 18074, 18067, 18336, 26960, 18340, 18341, 18697, 45564, 18695, 18696, 18694, 18690, 19090, 27556, 27558, 19094, 19093, 19095, 19098, 19533, 19534, 19540, 19531, 28012, 28556, 20059, 28559, 20070, 47797, 20061, 20066, 29102, 29104, 20636, 20638, 29099, 29101, 29671, 29670, 29668, 21176, 29672, 21174, 53089, 21669, 21659, 30286, 21661, 21665, 30277, 22125, 30919, 22128, 22123, 22124, 22127, 22126, 31487, 22510, 22507, 31486, 55851, 22808, 56529, 42385, 23675, 33635, 37439, 21840, 18699, 27230, 35775, 28568, 29673, 21188, 31955, 17791, 17897, 17899, 26764, 18089, 26964, 35776, 26970, 26966, 26971, 18704, 28016, 46939, 19547, 20074, 29105, 22119, 17755, 17903, 17901, 26655, 26658, 26654, 17900, 18097, 18102, 18095, 18094, 18092, 18099, 18346, 18356, 26974, 18363, 18347, 18355, 18364, 18368, 18349, 26978, 18365, 18359, 18351, 18357, 35780, 18354, 18345, 27242, 27238, 18705, 18707, 27236, 19112, 19115, 19110, 19122, 19120, 27568, 19116, 19129, 19125, 19117, 27572, 27567, 19106, 27569, 19130, 19119, 19114, 19107, 28020, 19557, 19564, 19552, 19573, 28019, 19563, 19554, 19556, 20102, 20092, 20105, 20089, 20107, 20097, 20095, 20090, 37457, 20099, 37449, 28575, 20100, 20084, 28574, 20101, 20082, 20098, 20094, 20093, 29108, 20651, 29110, 20663, 20662, 20657, 20652, 29113, 20654, 29112, 20665, 20660, 20664, 20661, 20658, 21192, 29680, 29685, 29681, 29679, 21190, 21199, 21198, 29684, 29686, 21194, 21195, 29682, 30295, 30293, 21676, 21674, 30299, 21672, 22139, 22142, 30926, 31491, 31493, 22810, 22811, 32387, 41985, 23045, 23047, 23240, 32732, 23241, 33016, 33250, 23753, 23754, 17905, 44737, 26772, 18370, 27245, 27574, 19133, 20114, 29116, 54156, 23716, 17793, 17906, 44738, 18104, 26775, 18106, 44739, 18376, 36079, 18721, 18722, 18724, 27575, 36469, 46214, 19585, 19580, 19581, 28025, 46963, 19583, 20116, 28577, 29119, 29121, 29124, 20672, 29693, 29694, 21683, 29696, 30302, 30304, 30305, 31958, 23416, 59146, 26776, 26983, 46225, 20117, 27585, 46973, 29697, 39452, 26662, 26779, 26985, 26984, 27249, 27250, 27586, 36932, 28030, 36930, 28029, 28583, 28584, 29126, 29698, 17797, 17910, 26987, 18379, 18380, 27254, 27253, 18730, 18729, 18727, 27587, 46980, 19588, 28586, 37481, 29702, 30309, 23052, 17737, 26782, 17799, 17800, 17798, 17801, 17913, 26666, 35486, 26786, 35485, 17914, 17915, 26783, 26784, 18111, 35611, 35615, 18115, 18116, 26781, 18388, 45116, 26994, 26995, 26991, 18383, 45111, 18386, 18387, 35797, 18731, 27256, 27600, 27592, 27590, 19145, 27604, 27594, 19141, 27599, 27603, 27596, 19142, 46245, 36485, 19150, 27593, 19605, 19592, 28034, 19595, 28040, 46990, 19596, 28036, 46993, 19599, 19602, 20130, 20133, 20124, 28593, 28595, 20136, 29127, 20131, 20127, 29131, 29128, 29139, 38146, 29140, 48805, 20676, 29132, 29705, 49761, 29716, 29713, 29704, 21202, 29707, 21208, 21205, 29717, 21204, 30315, 30311, 39461, 21685, 39457, 30310, 30318, 21687, 30314, 30312, 21684, 30319, 30931, 30932, 31497, 30930, 40159, 22146, 54187, 22523, 22519, 40823, 31496, 22521, 55871, 32393, 41990, 41991, 33019, 23417, 33253, 43832, 17918, 44257, 20139, 30320, 17802, 28045, 17803, 26670, 26671, 17920, 26791, 26793, 18120, 26790, 18121, 26999, 27000, 27264, 26794, 27261, 27263, 45656, 18744, 27262, 27260, 27611, 27613, 28050, 28051, 28048, 28052, 19611, 28602, 28597, 28604, 28601, 20143, 28603, 20140, 28600, 29147, 29142, 29146, 29145, 29148, 29722, 29721, 29720, 29718, 21697, 21698, 30934, 31502, 31500, 32738, 32737, 23535, 33256, 47881, 21211, 30936, 17923, 17922, 17921, 18123, 44782, 27001, 27006, 27004, 35819, 27005, 18397, 27003, 18399, 18746, 18747, 27269, 36101, 27268, 27267, 27616, 27618, 27617, 19158, 19613, 28057, 28055, 28058, 19612, 37514, 28607, 28608, 20148, 38164, 29725, 21212, 29728, 29729, 30326, 30327, 21700, 22150, 30937, 30939, 40171, 32397, 32739, 26798, 18403, 21215, 54202, 27270, 29152, 44268, 26675, 17926, 17927, 18127, 18408, 27009, 27010, 18751, 27272, 45679, 27273, 18752, 27622, 36979, 28060, 27623, 20153, 20150, 38172, 29154, 29153, 48830, 30328, 30330, 23419, 27011, 30942, 44541, 18412, 27012, 18411, 19619, 20155, 20156, 29730, 30332, 22152, 17808, 45149, 18413, 27277, 27279, 18755, 36110, 36114, 18756, 45688, 36510, 28063, 19621, 19622, 28616, 20157, 28615, 29158, 38800, 29732, 49796, 22153, 30945, 31504, 44273, 17928, 17931, 26806, 35508, 26681, 18420, 18422, 18136, 26803, 18421, 26805, 26808, 18130, 26804, 26807, 18145, 18418, 27280, 27282, 27022, 18762, 18427, 27017, 18426, 27023, 27021, 27015, 18761, 27292, 18771, 27287, 27018, 27284, 19174, 46299, 27288, 36116, 27643, 27299, 27285, 27286, 27291, 18758, 46305, 19173, 18767, 28070, 36529, 19634, 27637, 19624, 19166, 27638, 19631, 27639, 19168, 46309, 19179, 27646, 28069, 28071, 28077, 19626, 47924, 28078, 19636, 28075, 37000, 28072, 19627, 20161, 28087, 28082, 20159, 19628, 19638, 20170, 28079, 47930, 20166, 28081, 28073, 36526, 20165, 37539, 28085, 37545, 28629, 28623, 20175, 28632, 20178, 28627, 28621, 38181, 20684, 28628, 29169, 20179, 29162, 36997, 20174, 20685, 20692, 29166, 29738, 38197, 48858, 21220, 29165, 29167, 20695, 21218, 29737, 29751, 21219, 20694, 29743, 29742, 29744, 21712, 29748, 30336, 21715, 21222, 21710, 29745, 29747, 29741, 21720, 21707, 29746, 30949, 21723, 30338, 30340, 30339, 30342, 53201, 30344, 22162, 30343, 21719, 30950, 40839, 31962, 31968, 31511, 31964, 22818, 31963, 22817, 30951, 42011, 32746, 32403, 42006, 56599, 23421, 32745, 32743, 23538, 33257, 23775, 17933, 18147, 27029, 45169, 27650, 27651, 36532, 19641, 20184, 29173, 29755, 39502, 21724, 22531, 44821, 27030, 27031, 27304, 18773, 26598, 26597, 17812, 26685, 26684, 26686, 26815, 26811, 18153, 18154, 18157, 18152, 27033, 18436, 35839, 18435, 18447, 27312, 27654, 27034, 18434, 27305, 27311, 18775, 18430, 18776, 18778, 27663, 18786, 27313, 18777, 27309, 27653, 27652, 18779, 18774, 19195, 19185, 19642, 19192, 19201, 27662, 19188, 19186, 28103, 28106, 28102, 19657, 47111, 28110, 19660, 19661, 28100, 19645, 28092, 19650, 28105, 28101, 20190, 19655, 28653, 28641, 19646, 29176, 20696, 28643, 20189, 28650, 28647, 28644, 20191, 20188, 28655, 28640, 20193, 29187, 29186, 20702, 29183, 29181, 20700, 20706, 29179, 29185, 20707, 20721, 20714, 20710, 20718, 20711, 20717, 20712, 20704, 29759, 29768, 49837, 21238, 21257, 21256, 29757, 21241, 21250, 21258, 29763, 21236, 38826, 21242, 30352, 21735, 29771, 38824, 21254, 21255, 30365, 21732, 53229, 30356, 30357, 30353, 30369, 30363, 39505, 30361, 39509, 21741, 30364, 22173, 31514, 30962, 22172, 22167, 22177, 22171, 22170, 22534, 22539, 22537, 22532, 22535, 31972, 22820, 31977, 31975, 31973, 22826, 22828, 31976, 22819, 31974, 22829, 23058, 23059, 32750, 23249, 32749, 42773, 23423, 33025, 23610, 33410, 33409, 43625, 27036, 27667, 27666, 28112, 29191, 26821, 18167, 27039, 27040, 27320, 18790, 19205, 27669, 46352, 19664, 28113, 19666, 28117, 28664, 28660, 28663, 28662, 28661, 37597, 20202, 29199, 29196, 29198, 20723, 29773, 38837, 38835, 29776, 30372, 30371, 30370, 30966, 30969, 22830, 31985, 32755, 33028, 18168, 46353, 20726, 18449, 27324, 19208, 19938, 20203, 30375, 31519, 33412, 27325, 27676, 46357, 48004, 49868, 39522, 17940, 45199, 46361, 19672, 19675, 29208, 30377, 30378, 26689, 26690, 26824, 18169, 18172, 18171, 18173, 18454, 18452, 27044, 36142, 27326, 18796, 27327, 27328, 18793, 18805, 45754, 27679, 28132, 27678, 19214, 46364, 19217, 27680, 47142, 28127, 28131, 28128, 19680, 47140, 20211, 28669, 20205, 20206, 28674, 20216, 28671, 48022, 20210, 48908, 38229, 20729, 20734, 20737, 20732, 20730, 20739, 20735, 29211, 29210, 20731, 21267, 29781, 21261, 21265, 39530, 30379, 21747, 21750, 30975, 30974, 22184, 39527, 22180, 22181, 30976, 54295, 22548, 22543, 31521, 31991, 31992, 31990, 55921, 23061, 23062, 23253, 23543, 23544, 43317, 43316, 17943, 30979, 22549, 18459, 19221, 36570, 19686, 20217, 28892, 38858, 39535, 22188, 17945, 18176, 26829, 18179, 18466, 18461, 18471, 18468, 35862, 18807, 18811, 27338, 27335, 18808, 27690, 27684, 27687, 27691, 19225, 36576, 27685, 27694, 19228, 27689, 19224, 19702, 28140, 19687, 19692, 37030, 28139, 28143, 28138, 28689, 19701, 19706, 28684, 20223, 28681, 20240, 20225, 28679, 37618, 28682, 20221, 37624, 28690, 20230, 28692, 20231, 20244, 20220, 20222, 29227, 20760, 20749, 20759, 29214, 29217, 29218, 20755, 20752, 20747, 29216, 20741, 29224, 20745, 20746, 20769, 20744, 20742, 29800, 29225, 20743, 20831, 20750, 29801, 29788, 29798, 29795, 21274, 29791, 29786, 21276, 29787, 21285, 29796, 29797, 29793, 29799, 21290, 21275, 29802, 29784, 38864, 21284, 29221, 21291, 21759, 39556, 30387, 21757, 39544, 21764, 30384, 30383, 21774, 21769, 53282, 30385, 30395, 21771, 21773, 21753, 21766, 22218, 22217, 30989, 30983, 22206, 22199, 30982, 30386, 22214, 22193, 22212, 31530, 22202, 22208, 21756, 30987, 22196, 30993, 22204, 22203, 22205, 22561, 31529, 22559, 22564, 22558, 31532, 55230, 40867, 22552, 22565, 22554, 22567, 31999, 31995, 22839, 32001, 32000, 32414, 32418, 23070, 32415, 32413, 32417, 32420, 23073, 23072, 23071, 23261, 23255, 32760, 32758, 23257, 23262, 32763, 23260, 23254, 42776, 23427, 23259, 23547, 33259, 23614, 23612, 23613, 35665, 44853, 27054, 35867, 27057, 27053, 27699, 27339, 27340, 45771, 27343, 27342, 36579, 27696, 27700, 27701, 27697, 19710, 28145, 28146, 47171, 28696, 28694, 20247, 37634, 28697, 46409, 29234, 29231, 29230, 29232, 29233, 29235, 21293, 49906, 29807, 30405, 21785, 30995, 30996, 31536, 31535, 22569, 22571, 32422, 57247, 33262, 43326, 43630, 44560, 18829, 18702, 20249, 28700, 38884, 22845, 26693, 18478, 35879, 27062, 18830, 18832, 18831, 19248, 19712, 28147, 28706, 28705, 28707, 28703, 20251, 20776, 29236, 29237, 20777, 29815, 38885, 29816, 29813, 30409, 30408, 31000, 30999, 31538, 32764, 23263, 43327, 35671, 27065, 27703, 19250, 28152, 28710, 28711, 28712, 20778, 29818, 22222, 22223, 31003, 31540, 22846, 27350, 17950, 27066, 18482, 27067, 18834, 27705, 28155, 28157, 28156, 28158, 19716, 27706, 28154, 37658, 20253, 28716, 28713, 29242, 20780, 29241, 29240, 29828, 29821, 29822, 29823, 38893, 29825, 31004, 31006, 31007, 22224, 32007, 32006, 23077, 33706, 27709, 18483, 19717, 21786, 22225, 26554, 17819, 17818, 17955, 35427, 26697, 18193, 18188, 26836, 18202, 44878, 18199, 26838, 18184, 44879, 44873, 18197, 18488, 18486, 18485, 18489, 18487, 27071, 18495, 18493, 18835, 36193, 27073, 18851, 36186, 36187, 27353, 18853, 18843, 46423, 19255, 19256, 27710, 46454, 19259, 27711, 19718, 19273, 19272, 19269, 19260, 28160, 19726, 28172, 28173, 19723, 28167, 19741, 19722, 20256, 19739, 28161, 28177, 37661, 28163, 28165, 47198, 37064, 20271, 19736, 20272, 19728, 47220, 19733, 28718, 28723, 20278, 28719, 20266, 28726, 20283, 20280, 20262, 28724, 28727, 20260, 20264, 20274, 20784, 48110, 29256, 20785, 20796, 20794, 20813, 20797, 29249, 29258, 29246, 20807, 29257, 20793, 20801, 29261, 20788, 20806, 38264, 29248, 29251, 20791, 20808, 21296, 29838, 21307, 49940, 21300, 49021, 21299, 29835, 29842, 29839, 49945, 21791, 30424, 30426, 21792, 21805, 30433, 30422, 21790, 30418, 21795, 38909, 53362, 21793, 31009, 22226, 21799, 31012, 31018, 40253, 31011, 22230, 22229, 31015, 40244, 22234, 22238, 31016, 31543, 22232, 22227, 31013, 22233, 30427, 40245, 22577, 22583, 31551, 31553, 22579, 31545, 22573, 31544, 31549, 22586, 31546, 31548, 22578, 32013, 32011, 32017, 32014, 32023, 32426, 32428, 32018, 32424, 23078, 23265, 32769, 32773, 32770, 23267, 33034, 42799, 33035, 33037, 33264, 23430, 23429, 23548, 33415, 23617, 33540, 33541, 23757, 17963, 26839, 18206, 18501, 27078, 18511, 18506, 18870, 18856, 18869, 18864, 18863, 18858, 27360, 19283, 27718, 19287, 19750, 19749, 19759, 28186, 28191, 28185, 28192, 20295, 28738, 28734, 20294, 28735, 28737, 28733, 20118, 20303, 20289, 20297, 20825, 20818, 20827, 29276, 20815, 20826, 29273, 29271, 29274, 49025, 20816, 20821, 29854, 21326, 21316, 49044, 29851, 29855, 29857, 21324, 21813, 21810, 21818, 21808, 21814, 30435, 31024, 22244, 22242, 31030, 22246, 22248, 31023, 22251, 22252, 22588, 31555, 22590, 22595, 55277, 22796, 22853, 31557, 23275, 23086, 23269, 23276, 32774, 33039, 43106, 33417, 23619, 23777, 27083, 18513, 19795, 21327, 18873, 27721, 19761, 28744, 18514, 27365, 28745, 18516, 18517, 36616, 46467, 27725, 29860, 55284, 32027, 33041, 17745, 19288, 26701, 18210, 26842, 45294, 27090, 35900, 27089, 27086, 18875, 18878, 27367, 18877, 19289, 19290, 27728, 27727, 28195, 37080, 28194, 28199, 19763, 47257, 19762, 28749, 28751, 28752, 29864, 49061, 29279, 20835, 29863, 29861, 29865, 30440, 30439, 30443, 30442, 30444, 31033, 31035, 31034, 31560, 22597, 22598, 32029, 32028, 32433, 57790, 33418, 27091, 26846, 18218, 26843, 18217, 45298, 27096, 35921, 18526, 18521, 18522, 27097, 27371, 27373, 27374, 18881, 45848, 19292, 36625, 27730, 27729, 27731, 27735, 47264, 27736, 37084, 28207, 47272, 28208, 28204, 28210, 28206, 28213, 28758, 28756, 20315, 28760, 48162, 29866, 29285, 29867, 29284, 20837, 29283, 29871, 49991, 29870, 29869, 29868, 21329, 28759, 30452, 30447, 30451, 30453, 54415, 31037, 31039, 22599, 31563, 31564, 32030, 42044, 32780, 32781, 32782, 32778, 33542, 17967, 26704, 17969, 17970, 18222, 18220, 18221, 18531, 18885, 45308, 18533, 27098, 18534, 18892, 19295, 27376, 27377, 28214, 19304, 19305, 19296, 28215, 19306, 19303, 19770, 19773, 19772, 28218, 19769, 19774, 20323, 28762, 37706, 20840, 20320, 20319, 20849, 29290, 20842, 20846, 38303, 20855, 21341, 53414, 30457, 30456, 21830, 21835, 21826, 21831, 21827, 21825, 22255, 40292, 31042, 22256, 22601, 31568, 22605, 32032, 22603, 22858, 32439, 23282, 27378, 27379, 36631, 27740, 28220, 28219, 28763, 29877, 29878, 29876, 30458, 30459, 32035, 33709, 26851, 35925, 18537, 18896, 27382, 19311, 19312, 27742, 19310, 27741, 28226, 28764, 28225, 28223, 28224, 28222, 28766, 28769, 28227, 28767, 29299, 29298, 29294, 29297, 20859, 29300, 38955, 29880, 29883, 29881, 29885, 29884, 29882, 30460, 30462, 30461, 31050, 22262, 31053, 31052, 31571, 31572, 22608, 31574, 22607, 31570, 32038, 32037, 32441, 32440, 33266, 33543, 33420, 19313, 29302, 21838, 31577, 20335, 35692, 44903, 18223, 27386, 18902, 27388, 27744, 27746, 37103, 19779, 20336, 28771, 29306, 20862, 20863, 29305, 29886, 21839, 30465, 30464, 31055, 40904, 32041, 32042, 32443, 32784, 33421, 29310, 26854, 26855, 35930, 18545, 27391, 18906, 27394, 18905, 18907, 19323, 27752, 27756, 27750, 27751, 19321, 27748, 27760, 27754, 46510, 19320, 27753, 27755, 37112, 28233, 19783, 28231, 27757, 28230, 28236, 19782, 28234, 28781, 28782, 20341, 20346, 48185, 20344, 28785, 38321, 28778, 28779, 20343, 20345, 37720, 28784, 28787, 29317, 38325, 29312, 29321, 29311, 29319, 29316, 29323, 29895, 29899, 50020, 21347, 21349, 29894, 29892, 53447, 30479, 21841, 30478, 30476, 30474, 30470, 53451, 30469, 38972, 30482, 54447, 31059, 31060, 22268, 31065, 31061, 31067, 31589, 31585, 32050, 32046, 56004, 31588, 56000, 32447, 32444, 32445, 33049, 33050, 23437, 43111, 33422, 33545, 33544, 23794, 18226, 18909, 19325, 19785, 20869, 21350, 38974, 39630, 31073, 32452, 33052, 33640, 27109, 27399, 18910, 27767, 27766, 28238, 28239, 28789, 49117, 29907, 29909, 21352, 21842, 30484, 31074, 32053, 32787, 27111, 27402, 27401, 27768, 27770, 19326, 28242, 19786, 20349, 20870, 38336, 21355, 31077, 29913, 31595, 32453, 23523, 33785, 18230, 26858, 27117, 27118, 27116, 27115, 27113, 27404, 27407, 27408, 27405, 27409, 36266, 27411, 45895, 18913, 27779, 19330, 19339, 19333, 27774, 19334, 37121, 28247, 28248, 19793, 19791, 28249, 28245, 28244, 20351, 28804, 20355, 28805, 20356, 28800, 28803, 28794, 28796, 28806, 28801, 28808, 28802, 28798, 29329, 28807, 28797, 29343, 29340, 20871, 29332, 29333, 29334, 29338, 29339, 49132, 38980, 29916, 29924, 29919, 29914, 21360, 29926, 29929, 29922, 29927, 21363, 29915, 21844, 30492, 30489, 30491, 30494, 30490, 30500, 21846, 39637, 30486, 22270, 22271, 31079, 31083, 22275, 22273, 31080, 31087, 31601, 31597, 31600, 31598, 22617, 31599, 31602, 31603, 40327, 41526, 32060, 32062, 32063, 32058, 22864, 32059, 32791, 32789, 32792, 32790, 33054, 23438, 33269, 33424, 33271, 33642, 33790, 27120, 27416, 28254, 29933, 22620, 31607, 32795, 33548, 27784, 27785, 28257, 28256, 48232, 29346, 29935, 17971, 18231, 27122, 27421, 18917, 27419, 18921, 18826, 27792, 27789, 27795, 36679, 19798, 19343, 19344, 27791, 27794, 28261, 28264, 19799, 28262, 19797, 28263, 19801, 20362, 37750, 48240, 28819, 20359, 28814, 29359, 29352, 29358, 20882, 29355, 20885, 29356, 20879, 29357, 29351, 29353, 29354, 29361, 29937, 21372, 29940, 21370, 29936, 29944, 29938, 39001, 30515, 30511, 30509, 30508, 30517, 53489, 30514, 22280, 22276, 31095, 22277, 54482, 40344, 31099, 31096, 31610, 31616, 21371, 31608, 22621, 22622, 31614, 22874, 32066, 22870, 32070, 32068, 32067, 32460, 57305, 23284, 32797, 32796, 33056, 33057, 33058, 33273, 33272, 23678, 23758, 18924, 27424, 27423, 45911, 19347, 27797, 19350, 19807, 28266, 28265, 20368, 20367, 28820, 29364, 29363, 20893, 20894, 20897, 29366, 20895, 20898, 21375, 39013, 21378, 39659, 21853, 31105, 22282, 31103, 31104, 31617, 22879, 22880, 23097, 33060, 23801, 35703, 18234, 35945, 45348, 27125, 18549, 18550, 18552, 27427, 27432, 27428, 27426, 27429, 27798, 19354, 19359, 47351, 28270, 28269, 19816, 28268, 37156, 37154, 28273, 28272, 28274, 19811, 28276, 37153, 19817, 28267, 37762, 28825, 28829, 20374, 28831, 20377, 28830, 20378, 28828, 29374, 20899, 29372, 20904, 29371, 20901, 29370, 20902, 29946, 29368, 38368, 21386, 21379, 29950, 21388, 21383, 29949, 21381, 29947, 50082, 29948, 30524, 30520, 21859, 30521, 21857, 53503, 21863, 30527, 30525, 30523, 21864, 31112, 31111, 22288, 31108, 31107, 31109, 22290, 31620, 22626, 31622, 22881, 56037, 32076, 32074, 32075, 23443, 32800, 33062, 58229, 33061, 33275, 33276, 23806, 26862, 45353, 18931, 18930, 27434, 27435, 19364, 19363, 19362, 28278, 28279, 19818, 37166, 28281, 28280, 47360, 20379, 28834, 20380, 48272, 20381, 38376, 29378, 29377, 49168, 29955, 50095, 30531, 39670, 40141, 31118, 31115, 31117, 54504, 22628, 22629, 31627, 31628, 31626, 31630, 22630, 32078, 32079, 32469, 32470, 32803, 33277, 17973, 18555, 27439, 18935, 19368, 27806, 19365, 37167, 20382, 28837, 20907, 29379, 29380, 29385, 29958, 31633, 32080, 23101, 36284, 27814, 27809, 19371, 27816, 19372, 27812, 27811, 28285, 28292, 19823, 37169, 28286, 28290, 19824, 47367, 28287, 28840, 28847, 28844, 20387, 29386, 28845, 20393, 28848, 20386, 28842, 48280, 48275, 20915, 29397, 29393, 29392, 20917, 20918, 29388, 20913, 29391, 20910, 29394, 39047, 28849, 29960, 21396, 29965, 29964, 21400, 29969, 29963, 21394, 29968, 29961, 39031, 30546, 30540, 30535, 21872, 21869, 30551, 21878, 30549, 21873, 30563, 39694, 21875, 30565, 30554, 30562, 30544, 39685, 21870, 39704, 30561, 30556, 30542, 21877, 21879, 30557, 39689, 31133, 31139, 22294, 31136, 31124, 31137, 22298, 31138, 31140, 31135, 31128, 31142, 31122, 22295, 31642, 40966, 31645, 31641, 31649, 40982, 31652, 31634, 22635, 31637, 31639, 31640, 40983, 31636, 40999, 32089, 32100, 32096, 32101, 32088, 22883, 32095, 23105, 32087, 32097, 56054, 32091, 32094, 32085, 41567, 32093, 22886, 22884, 41580, 32483, 42095, 23103, 32480, 42087, 23106, 23102, 23104, 32102, 32805, 33066, 33069, 33071, 23447, 33067, 23450, 33065, 33070, 23553, 42834, 33281, 33283, 33430, 33434, 33429, 23656, 33549, 33711, 33737, 59468, 27440, 19378, 19382, 47377, 28298, 37186, 19831, 48285, 28854, 28855, 20396, 20395, 28856, 20925, 20921, 20922, 20924, 20926, 21404, 29973, 21405, 21406, 50113, 21407, 21882, 21883, 21880, 21881, 30572, 53540, 30570, 22299, 31660, 22642, 22641, 31656, 31657, 21891, 31658, 41593, 32107, 22891, 32106, 32105, 41599, 22892, 23109, 32488, 32490, 32808, 23289, 57835, 42849, 33438, 43358, 33647, 23724, 27131, 45939, 18948, 18946, 18949, 27817, 27823, 19384, 19383, 27821, 19388, 27824, 19387, 27822, 19385, 19389, 28307, 28299, 19836, 19843, 28300, 28309, 19845, 28306, 28304, 28302, 19841, 19846, 19838, 20419, 37799, 20410, 20415, 20404, 20413, 20402, 48302, 20414, 29401, 20936, 20942, 29405, 29410, 29406, 20932, 20928, 21413, 29976, 29985, 29980, 29986, 21408, 20930, 21419, 21422, 29988, 39061, 21416, 21911, 39718, 30579, 30577, 30581, 21898, 21902, 21914, 21893, 21896, 30575, 30578, 30580, 21897, 30585, 39719, 21907, 21904, 22303, 31154, 22305, 31152, 22306, 22307, 31666, 22647, 41014, 22645, 41021, 22646, 31661, 22651, 22650, 55390, 32119, 32117, 31665, 22896, 22895, 22944, 32499, 32496, 32501, 32495, 56629, 23112, 23110, 42489, 23290, 32809, 23291, 23292, 23452, 23451, 33285, 58241, 23556, 33286, 33439, 33552, 33551, 58862, 23681, 33649, 33648, 33738, 27442, 27832, 19848, 19851, 37193, 28313, 19849, 28312, 28865, 29990, 21423, 31159, 33444, 18562, 18953, 18952, 18950, 27444, 27833, 46604, 27836, 28314, 29412, 28867, 20943, 20944, 38420, 21427, 21428, 31160, 31668, 32122, 32506, 33084, 33554, 46613, 27837, 19206, 28317, 28315, 28316, 47403, 28870, 28874, 28873, 29413, 21431, 29992, 21430, 29993, 21429, 30590, 31164, 22310, 31670, 32127, 32128, 33287, 19395, 19396, 28319, 19852, 28320, 28323, 28321, 19854, 19853, 28877, 28878, 37813, 28876, 20947, 29415, 20948, 29414, 20946, 21432, 29995, 29994, 29996, 31166, 31167, 22903, 22905, 22904, 23295, 33086, 20422, 20423, 27454, 27455, 27847, 27456, 19857, 29417, 29999, 29998, 30000, 30003, 30001, 30596, 31676, 31673, 31674, 32133, 33088, 26866, 19401, 19400, 19859, 28326, 28882, 38431, 20951, 30007, 30005, 30006, 30008, 21435, 21920, 30599, 31171, 22311, 31172, 31678, 31681, 31680, 31679, 22909, 32813, 23559, 49238, 26708, 44596, 26868, 26867, 18566, 46631, 18570, 18565, 27141, 27137, 27142, 27138, 27140, 35963, 18575, 18568, 36302, 27462, 27457, 27459, 18959, 18956, 45964, 36308, 19412, 27856, 27861, 27862, 27854, 46640, 36736, 19871, 28337, 28333, 19869, 28336, 28343, 28342, 28335, 28344, 47431, 19865, 19864, 19868, 28898, 28883, 20428, 28894, 37832, 28899, 28890, 28889, 28891, 28886, 20435, 28888, 28893, 28900, 48033, 48367, 49247, 29428, 20955, 29431, 29424, 29427, 20957, 29420, 29429, 20962, 29433, 20960, 20956, 37203, 29426, 30022, 30015, 30013, 30014, 30016, 22317, 30019, 30017, 30012, 21440, 21439, 30009, 30024, 30018, 30610, 30605, 30611, 30602, 30609, 50180, 30601, 30608, 30612, 38453, 31180, 31181, 22315, 22314, 31175, 31178, 31179, 31183, 41042, 31688, 31685, 31689, 32137, 22911, 32139, 22912, 23115, 32513, 32512, 42499, 32815, 33089, 33091, 33090, 33092, 33291, 47443, 56121, 18647, 20965, 27865, 28349, 30616, 31188, 19414, 19415, 19875, 30617, 50196, 22320, 23457, 27150, 27466, 27465, 18964, 19417, 27871, 19876, 47456, 47455, 20439, 28903, 28904, 48382, 38458, 29436, 30032, 30034, 30033, 21443, 50199, 39115, 21931, 30621, 30618, 31189, 31190, 31693, 31697, 31696, 22658, 22659, 41054, 40934, 31695, 32145, 32818, 27874, 28353, 31192, 31191, 31698, 32146, 33294, 44602, 17976, 17978, 18242, 26875, 26882, 18247, 18584, 18588, 18585, 18591, 27153, 18583, 27166, 27154, 18586, 18590, 35974, 18582, 18970, 27469, 18973, 18974, 18969, 18976, 18978, 45991, 27876, 19428, 27888, 19431, 19422, 19425, 46677, 19424, 27885, 19423, 19432, 36754, 27880, 27891, 19427, 28355, 28369, 28374, 19891, 28366, 28362, 19887, 28363, 28359, 28354, 28360, 47481, 19877, 47477, 37233, 19890, 19893, 37227, 28933, 28921, 28920, 28925, 28914, 37841, 28916, 28911, 20448, 28919, 20449, 20446, 28917, 28922, 20450, 48416, 20441, 29437, 29439, 28926, 20984, 30058, 29460, 29462, 29447, 20972, 20970, 20981, 29461, 20990, 29465, 30054, 21446, 30040, 50231, 30053, 21448, 30036, 39131, 30050, 21447, 30062, 30049, 30045, 21451, 39130, 50251, 21454, 21463, 21936, 30631, 21932, 30629, 30647, 30624, 21934, 30630, 21952, 30626, 30632, 21940, 21938, 21955, 30642, 22326, 30625, 21943, 30627, 21941, 21954, 21942, 39799, 21949, 30644, 30628, 21950, 30636, 31200, 31204, 31202, 31219, 31208, 31199, 22328, 31212, 22332, 31207, 22322, 31210, 31203, 31205, 31195, 41654, 22321, 31209, 31196, 22323, 31214, 31224, 30056, 31713, 31705, 31701, 31711, 41072, 31699, 31704, 22667, 22660, 31706, 22663, 22668, 22914, 32147, 32158, 22918, 22921, 22915, 22922, 32150, 56141, 32148, 55477, 32516, 23300, 23126, 32517, 23124, 23127, 56826, 32820, 32825, 23310, 32824, 23301, 57881, 23306, 32823, 32829, 23307, 32821, 23302, 32827, 33094, 23462, 33095, 23560, 33298, 58267, 23626, 23627, 43526, 33556, 33713, 33650, 23761, 33740, 33742, 33768, 33767, 43927, 18594, 27477, 27894, 19434, 19433, 19435, 37244, 19899, 37867, 20461, 20994, 38497, 38496, 20995, 20996, 30649, 31229, 32165, 41668, 41667, 32831, 18249, 18986, 18988, 18989, 27896, 27898, 46696, 19905, 19904, 28385, 19902, 28384, 28382, 37887, 47509, 28939, 20468, 28941, 20466, 37871, 28937, 28934, 20465, 20467, 29475, 29476, 21004, 21000, 29480, 28935, 29482, 21003, 30073, 21469, 30067, 30068, 30066, 30070, 21470, 30065, 30071, 50268, 21471, 30076, 21959, 21961, 53707, 21956, 21957, 30659, 21960, 30074, 30665, 30658, 21476, 31237, 22337, 54696, 31236, 31722, 22341, 54698, 22342, 41095, 31732, 31727, 22676, 31733, 31724, 31731, 22677, 31723, 22671, 31729, 31740, 22674, 22681, 22670, 32174, 41098, 32172, 22923, 32527, 42144, 23133, 32524, 32528, 42530, 32832, 32833, 32837, 32835, 32838, 23317, 23467, 33103, 32834, 33305, 23561, 23563, 23629, 58284, 58623, 33457, 58628, 23727, 33770, 18992, 46706, 19906, 21005, 30082, 30666, 27902, 28945, 21963, 31249, 23137, 18595, 18995, 27485, 36782, 27905, 36778, 28397, 28947, 28400, 28401, 28399, 28946, 20478, 28403, 20475, 20473, 20472, 19029, 29487, 30084, 49360, 21482, 30092, 39179, 39180, 29491, 30096, 30086, 21484, 29485, 30089, 30093, 30085, 30090, 21489, 21479, 21490, 30671, 30674, 30669, 30668, 30677, 30675, 30682, 31257, 31260, 31261, 21968, 31254, 31744, 31748, 22690, 22688, 31745, 22683, 55516, 22689, 31746, 22686, 41695, 32189, 32187, 32188, 32183, 32185, 32533, 56213, 32840, 57438, 23318, 32841, 23468, 33460, 58297, 23683, 33563, 23682, 33744, 36322, 27906, 28404, 28952, 19452, 19451, 28406, 28408, 28954, 37902, 28953, 20480, 21009, 21010, 30101, 30103, 30685, 30683, 31265, 31266, 40531, 31267, 41112, 31749, 31750, 32193, 32195, 32536, 32537, 23139, 32535, 32539, 23469, 33772, 23809, 28413, 21012, 29492, 21011, 30105, 30692, 30687, 30689, 30694, 30690, 31275, 31272, 31273, 31752, 31751, 41708, 32540, 32543, 32843, 32844, 33653, 18998, 36324, 19000, 27917, 19456, 28420, 19925, 19921, 37278, 28423, 37285, 19931, 19935, 19928, 28418, 19926, 19934, 28422, 37284, 47546, 19933, 37277, 28970, 20486, 20487, 28973, 28972, 20483, 20488, 20484, 28971, 28961, 28960, 28962, 20497, 48484, 20496, 21016, 49382, 21023, 29499, 29498, 29497, 21019, 21024, 21027, 30108, 30111, 30121, 30107, 21505, 30117, 30113, 21496, 30114, 21504, 21502, 21492, 30700, 30697, 30703, 30705, 21973, 30708, 30699, 30702, 21978, 30706, 30701, 21976, 30707, 53762, 30696, 21982, 31281, 22353, 22354, 54752, 31282, 22692, 31757, 22696, 22697, 41130, 32205, 56874, 32202, 32206, 22937, 22940, 32199, 22942, 32555, 42161, 23142, 32550, 32552, 32560, 42160, 32851, 23324, 57450, 32849, 23326, 32845, 23328, 33116, 33118, 57921, 33117, 33119, 33112, 58303, 23566, 33315, 43377, 27488, 27920, 48499, 20498, 30123, 21988, 31762, 32212, 33319, 28429, 20499, 29505, 30125, 30126, 21507, 30711, 22357, 31290, 22356, 31289, 22358, 31763, 31764, 22699, 33123, 33655, 27922, 28430, 47565, 28431, 30714, 30712, 30715, 31292, 31294, 32215, 32563, 32561, 33124, 23568, 23731, 33656, 28435, 47567, 19942, 28981, 21509, 21990, 21989, 22359, 22701, 22947, 22948, 32565, 56902, 23146, 32219, 28436, 28439, 37925, 28982, 28984, 20505, 28985, 48512, 28986, 29516, 21031, 21033, 39206, 50363, 21510, 21992, 21993, 30721, 30719, 53789, 30720, 39880, 21996, 22361, 31300, 31296, 31298, 31297, 22363, 55572, 31767, 31301, 23332, 23473, 33464, 36796, 38559, 30136, 30135, 33127, 36797, 27924, 27925, 28440, 28441, 19947, 19949, 20508, 28988, 20513, 20509, 37931, 20512, 28991, 28990, 29521, 29522, 38567, 21035, 29523, 38563, 30137, 50374, 30138, 21517, 39217, 21518, 39215, 22002, 30726, 30724, 21999, 30727, 53796, 31307, 40573, 40566, 22365, 31770, 31776, 31769, 41154, 32224, 22950, 32223, 32221, 32225, 22951, 32568, 23333, 32858, 32856, 32859, 33129, 33321, 23569, 33322, 33466, 33565, 33658, 27491, 19002, 27927, 19457, 28449, 28444, 37305, 19954, 28446, 28447, 28448, 19955, 37948, 28995, 28999, 20520, 28996, 28992, 48525, 48531, 37941, 28993, 28994, 28998, 20519, 37944, 29000, 29524, 38582, 21037, 21039, 39227, 30141, 30144, 30142, 30145, 30148, 21519, 30147, 22003, 21040, 30730, 30739, 22005, 53813, 22009, 22004, 30737, 30738, 30736, 30732, 30731, 30729, 22008, 30740, 31315, 22370, 22367, 31316, 31314, 40579, 31317, 22366, 41168, 31782, 31783, 31777, 31781, 31779, 22704, 22954, 32231, 32235, 32229, 32232, 56924, 32571, 22955, 32572, 32234, 32864, 32863, 33135, 33131, 43188, 33467, 58648, 33566, 23734, 23795, 20525, 37952, 29001, 29002, 20524, 21042, 21041, 21043, 30743, 31319, 31787, 22707, 23153, 32868, 23637, 27492, 27493, 19459, 19962, 19963, 19967, 28452, 28453, 19964, 19965, 19961, 47600, 20531, 20526, 29003, 20533, 21046, 29525, 21045, 49447, 29527, 30149, 30152, 30150, 21525, 30745, 30744, 30747, 30746, 22374, 40595, 31320, 31321, 39920, 22709, 31789, 31792, 31794, 22708, 31788, 32239, 32238, 32237, 41756, 32240, 32241, 32580, 32579, 32578, 32869, 32870, 33137, 23571, 23570, 23686, 33716, 33746, 23810, 30751, 23336, 30154, 22019, 32872, 57487, 18253, 26885, 18596, 35980, 27498, 27495, 19460, 27930, 27933, 19461, 27931, 19968, 28460, 19972, 20542, 29006, 20537, 48543, 20541, 29530, 21530, 30155, 21528, 22021, 30754, 30758, 22024, 22381, 22379, 22380, 31795, 31796, 56298, 22960, 32585, 33569, 17828, 26713, 18257, 18258, 18259, 18603, 27174, 19009, 27501, 21057, 19016, 27499, 27503, 19012, 19013, 46042, 27941, 27937, 19465, 27936, 30160, 28463, 28465, 28470, 28462, 19975, 28467, 29013, 20547, 29535, 29537, 21056, 31799, 29539, 30156, 30157, 21534, 21533, 39261, 30159, 22025, 30766, 30765, 40607, 41199, 23638, 33469, 19018, 19468, 19469, 28475, 28471, 19978, 37339, 28472, 29015, 20549, 20550, 20551, 29019, 49487, 21061, 29544, 29543, 29546, 29545, 30162, 30163, 30768, 30770, 30767, 30769, 31330, 31329, 31327, 22385, 31333, 31328, 54853, 22387, 31800, 31805, 55633, 31804, 41772, 32588, 32591, 32590, 32589, 32592, 33145, 33146, 33327, 33326, 33571, 33570, 33774, 28477, 46784, 19985, 20554, 20559, 20556, 20562, 21067, 38616, 21539, 30168, 21547, 30165, 30170, 30167, 22042, 30772, 22034, 22033, 53885, 22037, 53891, 22390, 22391, 31341, 31339, 55644, 22726, 55640, 31808, 31807, 22966, 22968, 32256, 32253, 56330, 32248, 41782, 32252, 22975, 22974, 23161, 32593, 23166, 23155, 23173, 32596, 42224, 32595, 23172, 23167, 23164, 23338, 32599, 23343, 32875, 32881, 42602, 23351, 32882, 33150, 23480, 32878, 33152, 23481, 33154, 57975, 23478, 23483, 23484, 23578, 23642, 42916, 58350, 23576, 58351, 23579, 43198, 33473, 43396, 33470, 23639, 23641, 23690, 23688, 33573, 23691, 23765, 46786, 29022, 29556, 32259, 19986, 28479, 20565, 29026, 20569, 20566, 21082, 29563, 29561, 30176, 21552, 21556, 21551, 39275, 21553, 53899, 30777, 22047, 22050, 31348, 31344, 22402, 31345, 22404, 22406, 22409, 22408, 54884, 31817, 31818, 31823, 22731, 22729, 31816, 31821, 33157, 32886, 42922, 33328, 35436, 17829, 17983, 35716, 44952, 27182, 27183, 18607, 36351, 27505, 19020, 27504, 27949, 27946, 19478, 27947, 19480, 27945, 19994, 19988, 28480, 19991, 19993, 19995, 19990, 20570, 29028, 20575, 21086, 21085, 29568, 29567, 21084, 21088, 21558, 21557, 21560, 21559, 22052, 22051, 53913, 22410, 31352, 31350, 31824, 23175, 32888, 33158, 19481, 28485, 20581, 20577, 20580, 20578, 29569, 21091, 21090, 21092, 21565, 22056, 22055, 22414, 22413, 22301, 31827, 22735, 22979, 23176, 23353, 23177, 23354, 33329, 23736, 23813, 19997, 20584, 48614, 21095, 30186, 30190, 30187, 21567, 30193, 21568, 30192, 50474, 22057, 22060, 22058, 31358, 22418, 22417, 31835, 22736, 22740, 31357, 22739, 31832, 31834, 32262, 22980, 22981, 32263, 56361, 56369, 32607, 32606, 23178, 23179, 23180, 32890, 23356, 33331, 33333, 33334, 23649, 23738, 23694, 23737, 23785, 23817, 23819, 33335, 28489, 28491, 29035, 30781, 32896, 29573, 21097, 21570, 30197, 30196, 31362, 31361, 31837, 32897, 33165, 42930, 33576, 29040, 20588, 29037, 21100, 29576, 29578, 21099, 49545, 30199, 30205, 30200, 21572, 21573, 30202, 30784, 31368, 31366, 31365, 31369, 31367, 31838, 31373, 22421, 22745, 31843, 31839, 55701, 22742, 22746, 22747, 32271, 41829, 32275, 32269, 41818, 41826, 32268, 32274, 23183, 23182, 32610, 32614, 23181, 32902, 32899, 42622, 58004, 58002, 33169, 33167, 42936, 58003, 23583, 43211, 33475, 23651, 33577, 33664, 23739, 33720, 23767, 33747, 29580, 30208, 30206, 30207, 30209, 22423, 31846, 56392, 32278, 22985, 32616, 32617, 33170, 33339, 23652, 21101, 22748, 23190, 23189, 23361, 33172, 33476, 20590, 20591, 20592, 21104, 31375, 31374, 22986, 32619, 32620, 23584, 29042, 29584, 29583, 38653, 39321, 30218, 21574, 30219, 21576, 30217, 30216, 39322, 30212, 22067, 30794, 30797, 40013, 31378, 31380, 22425, 30798, 22435, 22426, 22433, 54944, 22752, 31854, 55720, 22749, 31858, 22750, 22751, 22754, 22756, 32287, 22987, 32282, 32280, 32284, 22990, 22988, 32286, 32285, 22993, 32624, 32626, 32630, 32623, 32629, 23191, 32622, 32632, 32625, 32628, 32914, 32916, 32915, 23363, 33174, 33176, 33173, 33179, 33178, 58015, 33342, 23585, 33341, 33582, 43561, 23740, 28492, 29045, 21106, 29592, 29597, 29593, 30222, 30227, 30230, 30221, 30225, 21580, 30801, 30802, 31387, 31388, 31384, 31385, 31386, 31864, 31867, 31866, 31863, 31861, 31865, 32290, 56399, 32289, 32291, 22996, 22997, 22998, 32635, 23194, 23193, 32921, 23364, 33181, 33479, 33583, 22758, 22999, 19483, 28493, 20594, 20595, 29049, 20593, 29050, 21116, 20597, 29602, 29599, 21585, 21117, 29600, 21109, 21108, 21113, 29604, 29605, 21581, 21582, 30232, 53979, 21583, 30233, 50509, 22069, 30806, 30805, 30808, 30807, 31389, 30810, 31393, 31394, 31391, 31872, 31397, 31873, 31875, 41282, 22760, 23003, 41277, 22759, 32297, 32296, 32300, 32298, 32299, 32924, 32639, 23195, 32927, 32926, 23366, 23368, 33185, 33184, 23498, 33183, 33346, 33344, 23586, 33347, 33480, 23741, 33667, 33722, 33750, 22071, 22442, 32304, 32645, 30234, 22762, 31401, 22761, 23768, 20598, 38675, 21119, 30235, 21594, 30236, 21588, 21596, 21597, 21600, 21598, 30816, 22076, 22075, 30815, 22074, 30814, 30817, 22450, 22449, 22448, 40713, 22444, 31408, 40715, 54997, 31879, 22765, 22768, 31878, 22764, 32312, 42283, 32307, 23007, 32313, 23008, 32308, 32310, 23011, 32650, 32648, 23197, 32655, 32649, 32653, 32654, 32932, 32931, 23372, 23370, 32938, 42651, 42658, 23371, 33190, 33191, 33192, 33194, 23502, 42970, 33189, 58403, 43231, 33350, 33348, 23589, 33482, 33483, 33481, 23698, 58951, 58950, 23742, 33723, 23788, 33776, 23804, 33800, 20000, 20599, 30239, 21602, 22080, 30822, 30820, 30823, 22083, 22453, 22454, 31411, 31413, 31410, 31409, 22772, 31882, 31886, 31881, 22771, 31884, 41878, 32319, 23203, 32657, 32656, 32940, 23374, 33197, 33353, 33484, 33587, 33670, 20601, 29611, 32659, 43235, 59398, 20602, 38025, 50539, 30247, 30246, 30244, 21609, 39348, 30828, 22085, 31416, 31417, 31889, 22776, 31892, 32321, 32324, 23013, 32325, 32327, 32326, 32328, 32663, 23205, 32661, 32944, 32946, 32945, 57616, 42988, 23505, 33357, 33592, 33590, 23700, 43571, 33672, 59105, 33724, 33786, 57620, 42990, 21612, 21611, 21837, 22457, 58416, 23743, 21614, 30835, 30836, 31426, 22458, 32335, 23015, 32334, 32333, 23206, 41901, 23380, 33362, 33361, 58420, 33597, 33598, 33801, 38027, 30250, 39359, 30839, 30851, 22090, 54029, 30856, 30849, 30842, 30840, 22472, 31431, 31429, 31435, 22465, 22473, 31428, 22471, 22469, 22467, 22462, 31897, 22780, 32336, 55782, 31899, 23017, 32338, 41907, 32342, 32340, 23023, 32339, 23022, 32344, 32346, 32678, 42320, 32688, 32672, 32682, 32674, 32669, 23209, 42316, 32683, 42310, 32681, 32685, 23211, 23214, 23215, 23398, 32952, 57638, 32958, 23387, 57640, 32950, 23386, 23388, 33210, 23512, 23515, 33209, 23513, 23510, 33207, 23508, 23514, 33368, 23592, 33370, 33367, 23591, 33369, 23597, 33366, 23594, 33491, 33492, 33495, 33490, 58752, 23664, 23661, 43580, 43575, 23703, 33602, 33603, 43431, 23745, 33676, 23704, 33757, 33758, 33804, 21124, 21615, 21616, 21617, 21619, 39366, 21618, 40067, 30862, 22092, 30867, 30858, 54032, 30863, 22097, 22098, 22095, 21780, 30864, 31441, 22480, 31440, 22481, 31442, 22476, 31447, 55031, 31437, 22479, 31450, 22790, 31438, 22482, 31448, 22485, 31443, 55038, 22672, 22791, 31914, 22786, 22788, 22785, 31915, 22793, 31913, 32350, 32356, 32347, 23030, 23027, 32353, 32352, 41929, 32359, 32691, 23218, 32693, 32964, 23225, 32696, 42327, 32357, 23399, 32975, 23404, 23402, 32973, 32967, 23403, 57655, 32965, 32974, 23405, 23519, 33213, 33215, 33214, 43024, 23518, 33376, 33381, 23601, 33375, 23599, 23600, 33500, 23668, 43439, 33499, 43447, 33502, 23667, 23666, 33503, 33605, 33607, 33606, 23709, 33609, 33680, 23747, 59242, 23791, 23811, 33802, 23816, 30870, 32360, 58100, 33508, 43698, 39368, 30872, 30873, 22102, 22489, 31451, 55049, 23032, 32699, 23524, 23710, 23711, 30256, 30257, 21620, 30876, 30874, 31452, 31455, 31453, 31456, 22794, 32363, 32362, 23036, 32706, 32703, 32710, 32704, 32709, 33222, 33221, 33223, 43284, 43279, 33509, 23712, 58466, 33684, 54066, 32980, 32981, 55058, 32364, 32712, 32985, 33224, 33513, 33615, 54068, 31457, 55060, 42725, 32988, 33228, 33225, 33227, 33226, 33386, 33516, 33685, 29621, 21622, 30881, 30882, 31458, 31928, 41362, 41955, 41952, 32366, 41956, 32714, 23228, 32991, 32994, 32992, 42731, 33231, 23526, 33517, 33616, 33687, 23749, 33686, 33730, 32367, 23229, 33392, 23713, 31460, 33622, 33623, 32370, 32369, 32371, 32717, 33238, 31461, 31932, 32372, 32718, 33239, 23603, 33519, 33522, 23041, 32373, 23408, 57692, 42740, 33241, 33762, 43893, 31935, 41372, 32375, 32720, 32722, 33000, 32998, 32999, 23528, 33246, 33398, 33397, 23671, 43472, 33630, 33627, 33631, 33695, 33694, 33731, 23773, 23792, 23799, 33788, 33789, 33803, 43304, 42372, 42429, 33247, 33248, 33700, 23793, 3290, 3292, 26513, 3293, 17677, 17676, 8841, 3312, 3310, 3313, 3311, 8842, 3355, 8850, 8848, 3354, 3353, 26532, 3449, 3448, 3447, 26560, 3450, 3446, 3573, 3574, 17831, 17830, 17832, 26716, 17984, 4015, 17672, 26514, 17683, 3314, 3356, 8851, 26533, 3357, 8870, 3740, 9228, 27509, 17673, 3315, 3358, 3451, 8871, 18267, 17674, 26509, 26510, 8836, 3294, 3317, 17687, 8843, 3318, 17685, 3359, 3452, 3454, 3453, 26608, 3575, 3576, 17896, 4016, 18613, 4792, 3291, 26511, 8837, 3295, 3320, 3319, 17709, 17708, 17833, 3577, 26609, 17985, 4017, 26900, 26899, 18614, 5250, 10573, 20003, 20005, 6213, 11897, 11898, 17675, 3296, 17684, 3361, 17834, 4018, 3297, 8844, 3321, 17688, 3362, 3364, 8852, 3365, 3363, 26534, 17747, 17835, 3578, 4019, 17987, 18269, 4020, 4394, 571, 3322, 3366, 17710, 3579, 3581, 3580, 3741, 4021, 4022, 4395, 4396, 18617, 18616, 18618, 18615, 4793, 28495, 11899, 20604, 16015, 3298, 17689, 17690, 3368, 3367, 8853, 3369, 3375, 17712, 3370, 3371, 8855, 8854, 3373, 3374, 17715, 3372, 17714, 17713, 26535, 3457, 3458, 3459, 3460, 3456, 3463, 8877, 26566, 8873, 8876, 3464, 3480, 17748, 8875, 26565, 3461, 3462, 3455, 17753, 17751, 8872, 8874, 17844, 17837, 3594, 8914, 3591, 3595, 8924, 8912, 3592, 8916, 17840, 17836, 17851, 3593, 17843, 3596, 26614, 3582, 8915, 3597, 8919, 17842, 8923, 8920, 17841, 17849, 8917, 3583, 3585, 3598, 26611, 3587, 8909, 3590, 3588, 3589, 8925, 8922, 8913, 3586, 17845, 17852, 8910, 3584, 17850, 26615, 17848, 8918, 8921, 17847, 8911, 9031, 26720, 3763, 3750, 18001, 17993, 9032, 3747, 18000, 3765, 17991, 3755, 17990, 3754, 9020, 3758, 3753, 9025, 9033, 17999, 9029, 17994, 3756, 17996, 17988, 3759, 3744, 3768, 9022, 17989, 17997, 9240, 3742, 3764, 3743, 3751, 3752, 9027, 9023, 3757, 3749, 9019, 3745, 9030, 3766, 3769, 3748, 3761, 3767, 3746, 9028, 3762, 9034, 9021, 3760, 9024, 9026, 4036, 9242, 9254, 4028, 18274, 9255, 4023, 4033, 26913, 18282, 4026, 9236, 4034, 9235, 9239, 9246, 9244, 4042, 4037, 9230, 9232, 4039, 4027, 9233, 9245, 9252, 4032, 9238, 9231, 4031, 9234, 4035, 9237, 18271, 4030, 18284, 4025, 18275, 4040, 9247, 4041, 9251, 18270, 9249, 9253, 4038, 9241, 9229, 26905, 9243, 4029, 9248, 4024, 9250, 18279, 18276, 18278, 18277, 18280, 4411, 4399, 18624, 18625, 9589, 9597, 18633, 4398, 4406, 4418, 18623, 9603, 9601, 9596, 27189, 27195, 18622, 4400, 9602, 9592, 4414, 4405, 4413, 9587, 18629, 9599, 18626, 9590, 4409, 9591, 18630, 9586, 4416, 4403, 4412, 4402, 18619, 9588, 9593, 18620, 9600, 4410, 4407, 9595, 4415, 9598, 9594, 4404, 4417, 4408, 4401, 4397, 27196, 18632, 18631, 27194, 9604, 4819, 4797, 19027, 4813, 19032, 4818, 10044, 10043, 10048, 10049, 4800, 19023, 4809, 19043, 19031, 19041, 4822, 19025, 4810, 27513, 19030, 19028, 19026, 10037, 4803, 10038, 19034, 4824, 27515, 4815, 4794, 4795, 10057, 5267, 19038, 4808, 4807, 10039, 4811, 10589, 4802, 10050, 4817, 4816, 4806, 10042, 10051, 19024, 10036, 4805, 10052, 4814, 10040, 4796, 19033, 4799, 4798, 10053, 4812, 4801, 4821, 4823, 10047, 4820, 19036, 10055, 10041, 10056, 19022, 10045, 27512, 10054, 19035, 10046, 19039, 19040, 4804, 10597, 10585, 19485, 5255, 19488, 10590, 10596, 5254, 10583, 5258, 10587, 10580, 5256, 10584, 5261, 5266, 19493, 10601, 19490, 10579, 19491, 5262, 19042, 10600, 19496, 19486, 5257, 10586, 5253, 10581, 10577, 10591, 10578, 10576, 10588, 10594, 10595, 5259, 19489, 27956, 11216, 10592, 10575, 10593, 19500, 5269, 10598, 5268, 10574, 19492, 10582, 10599, 5264, 5263, 5260, 5265, 19501, 19499, 5251, 19494, 19495, 5252, 5747, 20012, 11219, 11212, 28501, 5744, 28500, 11220, 20008, 20009, 28503, 11210, 11213, 5743, 11214, 20006, 28498, 5746, 11218, 28509, 11208, 11207, 5748, 20007, 5749, 5745, 5750, 11206, 11217, 11215, 11209, 28506, 28497, 28507, 5742, 11211, 20610, 20613, 6220, 6214, 11903, 6223, 11909, 11912, 6216, 6217, 11906, 6215, 11915, 6221, 11916, 20611, 11911, 6222, 20608, 11900, 6219, 11901, 29054, 11910, 11908, 20614, 11904, 6218, 11902, 6224, 11907, 11914, 11905, 11913, 20607, 20615, 6671, 6668, 21130, 6669, 29622, 12596, 12588, 6667, 6664, 12589, 21133, 21131, 6666, 12592, 21132, 12594, 21141, 29630, 12601, 21135, 21140, 12600, 12595, 6663, 12587, 6661, 12590, 6672, 12593, 21136, 12597, 6665, 6662, 12599, 12598, 6670, 12591, 21139, 7052, 13211, 21628, 13208, 7053, 30262, 7051, 21630, 13215, 13212, 13205, 7050, 21632, 7054, 13206, 7049, 7057, 13209, 13210, 7055, 7056, 13216, 13213, 13214, 21631, 21626, 7444, 13852, 7441, 13849, 7443, 7445, 22106, 13850, 7442, 30889, 13851, 22110, 13848, 22105, 22109, 7740, 14422, 7741, 14420, 31464, 14421, 14419, 14418, 22498, 22497, 14423, 7739, 22108, 31468, 14887, 14888, 22797, 13207, 14886, 7742, 8188, 15250, 15251, 23235, 8431, 8432, 15838, 15837, 8515, 8514, 16166, 23672, 3299, 3323, 3377, 26536, 3376, 3466, 3465, 3601, 3600, 3602, 3599, 17853, 3771, 3770, 3772, 18005, 26722, 18004, 18002, 4044, 26914, 4043, 4045, 18285, 4419, 27197, 182, 10058, 183, 5270, 185, 184, 11221, 20013, 186, 6673, 187, 23410, 3300, 17691, 3378, 3603, 4046, 18634, 3301, 3381, 3379, 3380, 3604, 17855, 26621, 3773, 4048, 4047, 4049, 18984, 4825, 20616, 7446, 17678, 26537, 17716, 17711, 17717, 8849, 26557, 3467, 3468, 17759, 17760, 3605, 26623, 9035, 18288, 4421, 4420, 10060, 10059, 5271, 17679, 3382, 8856, 17761, 18008, 9256, 18636, 4422, 19046, 4828, 19044, 4826, 4827, 19045, 19502, 7447, 578, 3469, 26569, 3606, 8926, 17859, 17858, 17857, 18010, 3774, 3775, 18011, 9036, 26724, 9257, 4050, 9258, 26915, 26918, 18638, 18640, 18641, 10062, 10063, 4831, 19049, 10064, 19050, 10061, 4832, 4830, 4829, 10065, 19504, 10602, 19503, 20020, 20017, 11222, 28512, 20021, 11917, 12602, 21634, 21633, 21635, 7058, 7448, 13853, 22499, 3302, 3316, 17686, 17692, 17720, 17762, 17861, 18012, 18292, 26920, 5272, 5752, 47726, 6674, 21145, 8838, 3383, 26571, 3472, 3470, 3471, 4051, 18293, 3303, 3304, 26517, 3324, 17693, 17721, 3384, 3385, 3386, 8879, 3473, 17764, 8878, 3610, 17864, 8928, 3608, 3609, 8927, 17863, 17865, 3611, 3607, 17866, 9037, 4370, 9038, 18016, 18018, 9039, 26727, 18013, 3777, 3776, 18015, 18014, 3780, 3778, 3779, 18017, 4057, 18294, 4056, 9263, 9260, 9261, 18297, 9259, 4058, 4054, 4053, 18298, 4055, 4052, 18296, 26929, 4059, 4424, 9605, 18642, 9262, 4429, 18643, 9606, 4425, 4428, 4427, 4426, 4423, 18646, 10068, 19059, 4835, 10071, 4833, 19056, 27525, 19053, 10067, 4836, 4834, 4837, 10069, 10070, 19051, 10066, 10072, 19057, 19052, 19054, 19055, 19505, 5756, 5273, 10603, 10605, 10604, 10606, 5274, 20024, 5753, 20022, 5754, 5755, 19506, 6226, 11919, 20618, 11918, 11920, 11921, 6227, 20617, 6225, 12603, 12604, 6676, 6675, 12942, 30272, 21636, 7059, 7060, 7061, 7063, 13217, 13218, 7062, 21637, 22111, 7449, 30899, 7450, 22112, 31472, 15252, 15840, 15839, 16167, 23605, 3305, 17694, 17723, 17722, 3475, 3474, 3612, 26635, 26632, 8929, 26634, 17867, 3782, 3783, 3781, 3784, 9040, 9041, 26733, 26734, 26735, 18020, 18019, 18300, 35745, 35742, 35743, 18299, 35746, 4061, 9264, 26931, 4060, 18301, 9607, 4433, 9608, 4432, 18651, 18649, 27206, 4430, 27208, 4431, 18650, 19066, 10073, 19063, 19061, 19064, 19065, 5275, 10608, 19507, 5278, 10607, 5462, 5277, 5276, 5759, 37391, 5758, 5757, 6228, 20622, 20621, 6231, 6232, 6230, 29073, 6229, 20623, 38704, 12605, 21150, 12606, 38700, 21149, 21638, 13220, 7064, 13219, 21819, 7451, 14424, 7743, 40109, 15253, 8336, 583, 3325, 3387, 8857, 17724, 3388, 3389, 17725, 17768, 17767, 3476, 3477, 17769, 3613, 9042, 9265, 9266, 26932, 4434, 10074, 5280, 5279, 11224, 11223, 48681, 22113, 3306, 3390, 3478, 27979, 5281, 8839, 26576, 8880, 3479, 17771, 8931, 3615, 3614, 8930, 3785, 18022, 18652, 27211, 27213, 4838, 27535, 27980, 10609, 6233, 12607, 6677, 21152, 21639, 13854, 22501, 23237, 15583, 17680, 3391, 17726, 18023, 9267, 9609, 5284, 5282, 5283, 3307, 26523, 3326, 17695, 3394, 17728, 3393, 3392, 3482, 3481, 17869, 8881, 8932, 17870, 17872, 4065, 4062, 4064, 4063, 18302, 4435, 18653, 27981, 5760, 33009, 3308, 17729, 3395, 17772, 3484, 3483, 9043, 26740, 4066, 18577, 27985, 17681, 26524, 8858, 17773, 3486, 3485, 3616, 3617, 9044, 3786, 18024, 3787, 18304, 4067, 4068, 4069, 18305, 4436, 9610, 18654, 27986, 4839, 20624, 8840, 26543, 3396, 17730, 26578, 26577, 17774, 8933, 17874, 9045, 9046, 9268, 18306, 9269, 9612, 9611, 9614, 9613, 4437, 10610, 4841, 10075, 4840, 19509, 27989, 11225, 5761, 20029, 11226, 20028, 20627, 20626, 20625, 12608, 6678, 21154, 29077, 21155, 21640, 7065, 22502, 15254, 17682, 17731, 26544, 8859, 17775, 3487, 26641, 17876, 26940, 18308, 18309, 5285, 19510, 20030, 3309, 3327, 3398, 3397, 17733, 3399, 17735, 26580, 17776, 17878, 26742, 4071, 18310, 4070, 4072, 18659, 18658, 4438, 18657, 18656, 46147, 4842, 20628, 13855, 8016, 3328, 3489, 3504, 3499, 26583, 3494, 3493, 3500, 3498, 3491, 3505, 3492, 3488, 3503, 3502, 3501, 3490, 17782, 3497, 17778, 17779, 3496, 17780, 3506, 3495, 26581, 17880, 17882, 3623, 26645, 3629, 3625, 17884, 3631, 8934, 3628, 3618, 3621, 3624, 3620, 3627, 3630, 3619, 3622, 3626, 3632, 17885, 17886, 17879, 9055, 9052, 18039, 3800, 9053, 3788, 3790, 3814, 3809, 18042, 18047, 18038, 9060, 9054, 3792, 3794, 9059, 3801, 9049, 3813, 3815, 3789, 3806, 18051, 9047, 3812, 18040, 3797, 18044, 3807, 3808, 9048, 3805, 3803, 18033, 3804, 3810, 9056, 3791, 18048, 3811, 9058, 3799, 3796, 18036, 9051, 3795, 9061, 3798, 18045, 3802, 18041, 18037, 18030, 3793, 9057, 18046, 18049, 9050, 18050, 26951, 26950, 18313, 9286, 9285, 4090, 9288, 9290, 9279, 9282, 9289, 4091, 18319, 18323, 9276, 9280, 18320, 26946, 9284, 9629, 4086, 9633, 4073, 9281, 4074, 4087, 4080, 4076, 18316, 9277, 4079, 4084, 4093, 9278, 9271, 4078, 9272, 9274, 26947, 4081, 18311, 4083, 9270, 9275, 18315, 18324, 4092, 4088, 9283, 4094, 18318, 4085, 9273, 4082, 18314, 18322, 4077, 4075, 9287, 4089, 18671, 18672, 9628, 9616, 9631, 18666, 18668, 9618, 4445, 4459, 4441, 4458, 4450, 4455, 4439, 9617, 9623, 4454, 9635, 4456, 18670, 4446, 18663, 18673, 9625, 9622, 4444, 18660, 9615, 4457, 9630, 4449, 9632, 4460, 4440, 4451, 4448, 9620, 4452, 9626, 9627, 4447, 4453, 4443, 18664, 18678, 18676, 4442, 9619, 18662, 9624, 18667, 9634, 10095, 4855, 10077, 27554, 10082, 4848, 4859, 10080, 4843, 4853, 4858, 10087, 27547, 4854, 4857, 19074, 19082, 10090, 4849, 10081, 19071, 19075, 19083, 10093, 10094, 19076, 4851, 10092, 4847, 4862, 27550, 10084, 19078, 4845, 19077, 10097, 10085, 10089, 4850, 4861, 10086, 4856, 10091, 10098, 10625, 19070, 10096, 4863, 4844, 10088, 10079, 19073, 4852, 27549, 27555, 10078, 19081, 19086, 10083, 10076, 4860, 19520, 10617, 19529, 5304, 10631, 5302, 5299, 10622, 5295, 10626, 5306, 10616, 10621, 10620, 4846, 5301, 10629, 19527, 10632, 10613, 28004, 5779, 19528, 10633, 5307, 27999, 5293, 5290, 10624, 5287, 28001, 10630, 19516, 5294, 10634, 19513, 10614, 10628, 5297, 10615, 10618, 10623, 19523, 19522, 5298, 5296, 5308, 19512, 20043, 19525, 27992, 5303, 19519, 5291, 5443, 28007, 5292, 10619, 5305, 5300, 10627, 5289, 19514, 5288, 10611, 10612, 11231, 20049, 5762, 5765, 11242, 5785, 11245, 5763, 11238, 5769, 5775, 6050, 20038, 20045, 5773, 11235, 5786, 5766, 5774, 11243, 11935, 11248, 11236, 28541, 11227, 11240, 11234, 5772, 11246, 20035, 20031, 5768, 5788, 5781, 20040, 5770, 5767, 20053, 5778, 20041, 11247, 11233, 11239, 11241, 11229, 11244, 5764, 11228, 20055, 5771, 5787, 5783, 11230, 5777, 20048, 5784, 5780, 5776, 20036, 11237, 47760, 5782, 11933, 11929, 20634, 11944, 11922, 11931, 6247, 6248, 6240, 11940, 6250, 11927, 11926, 11924, 11942, 6238, 11936, 11925, 6241, 11934, 6236, 11930, 11937, 11939, 20631, 29088, 11943, 6245, 11923, 6239, 11928, 20032, 6234, 48726, 6246, 11938, 6242, 6243, 6249, 6237, 188, 6235, 11932, 20629, 6244, 11941, 6694, 6689, 21163, 12623, 12619, 21157, 12613, 6683, 6679, 12622, 6680, 12616, 12618, 21158, 12621, 21171, 6685, 21161, 6692, 6686, 29664, 21159, 12611, 6687, 6688, 12614, 6693, 21169, 12612, 12617, 6684, 12610, 6690, 6682, 21168, 29652, 6681, 12615, 12620, 21166, 6691, 21197, 12609, 21165, 7072, 13237, 21652, 13234, 21643, 7066, 7078, 7079, 21648, 7069, 13232, 7071, 13224, 7077, 21655, 13236, 7068, 13238, 7067, 30284, 13233, 13235, 7070, 13231, 13225, 13222, 30281, 21649, 11232, 13228, 21642, 13221, 13227, 13226, 21646, 13223, 21654, 7074, 21656, 21651, 21170, 21647, 7073, 21644, 53082, 21650, 7075, 13229, 7452, 13230, 13864, 22120, 13857, 22121, 7464, 13861, 7456, 7460, 13860, 22116, 7459, 7455, 7458, 7453, 7463, 13862, 13858, 7462, 13856, 7461, 13863, 13859, 7076, 30912, 7465, 13865, 7457, 7454, 22118, 22505, 14431, 14433, 7745, 14434, 14432, 14430, 14429, 7747, 14428, 7748, 31479, 22506, 22504, 31483, 14426, 14427, 7744, 7749, 7746, 14425, 22806, 8017, 22805, 14891, 14889, 14894, 14892, 22803, 14890, 14893, 22804, 22802, 22807, 8189, 15257, 15258, 8190, 32380, 15259, 15255, 15260, 15256, 8018, 23042, 32728, 15584, 15586, 8339, 15585, 8338, 8337, 23411, 8340, 15842, 15843, 33013, 8434, 8433, 8435, 15841, 16017, 16016, 23531, 8516, 8518, 8517, 16018, 8573, 16281, 33405, 33404, 8614, 23674, 16280, 16353, 8845, 17758, 26586, 3508, 3507, 26584, 3635, 3634, 8936, 3633, 8935, 17889, 3818, 9064, 18059, 9063, 18053, 3816, 3819, 18058, 18057, 9062, 18056, 3817, 18087, 18054, 18055, 18331, 9291, 18328, 9292, 4095, 18327, 18330, 18326, 4461, 18680, 10099, 10100, 4864, 4865, 19088, 10636, 5309, 5311, 10635, 5310, 11249, 5789, 20057, 20056, 28553, 29095, 6251, 6252, 11945, 20635, 6696, 21172, 6695, 13239, 13867, 13866, 23532, 16413, 3329, 8860, 17736, 8882, 8883, 17785, 26587, 26588, 3638, 3642, 8938, 26650, 3640, 3639, 8937, 3641, 3637, 17892, 17893, 3636, 8939, 17890, 17891, 3829, 18064, 18077, 3826, 18063, 3822, 9065, 18079, 18069, 18062, 9066, 18075, 3824, 18060, 9068, 3820, 9069, 9067, 3823, 3825, 3828, 3827, 3821, 9070, 18065, 18080, 18081, 18066, 18071, 18070, 18068, 4100, 9305, 18334, 4102, 18332, 4101, 18335, 9306, 4099, 4098, 9296, 26956, 9295, 18337, 9293, 9298, 9297, 9294, 9303, 9304, 9301, 9299, 4097, 18338, 26953, 26955, 9302, 4103, 9307, 26952, 18339, 9300, 18333, 4462, 4096, 26961, 4463, 9640, 18684, 18683, 9646, 18687, 18682, 18685, 4469, 9644, 9650, 18692, 9641, 9645, 9647, 9649, 9643, 18691, 9642, 9637, 9638, 4464, 18686, 4466, 4465, 9639, 9648, 18688, 18693, 18689, 27229, 18681, 4468, 27227, 9636, 10110, 19091, 10109, 10114, 10105, 19097, 10108, 10107, 19096, 10111, 19105, 10115, 4866, 4869, 19101, 19102, 10106, 10112, 19100, 19089, 19104, 4868, 10101, 19092, 4467, 10650, 10113, 19103, 10104, 27560, 4867, 10103, 19099, 10641, 19535, 19538, 5312, 5316, 10657, 10639, 10653, 5317, 10655, 19539, 10661, 19541, 10665, 19530, 28008, 10656, 10644, 10652, 19532, 10666, 10664, 10654, 10649, 10642, 11257, 10640, 5321, 10647, 5322, 5318, 10637, 10659, 10645, 19536, 19542, 10643, 10662, 5319, 19543, 10668, 5313, 5315, 10651, 10646, 4870, 5314, 10648, 10663, 10667, 10658, 10660, 10638, 28554, 20063, 11252, 20058, 11261, 11260, 5797, 11253, 20060, 5798, 5796, 20069, 11255, 5793, 11259, 20065, 11254, 11256, 11250, 5791, 28560, 11269, 11268, 11265, 5790, 5794, 5795, 10102, 11262, 5792, 5320, 11264, 11251, 11267, 11266, 20067, 11270, 20062, 11959, 20064, 11263, 29100, 28558, 28562, 11258, 11951, 6262, 6265, 6260, 11950, 11954, 11949, 20640, 6254, 6264, 11946, 6258, 11953, 20644, 6256, 6255, 11956, 6257, 11958, 20639, 11955, 6253, 20647, 20645, 20641, 6263, 11960, 11948, 11957, 20646, 29096, 11947, 20643, 20642, 6259, 20637, 6261, 11952, 11961, 21184, 21179, 12631, 6697, 12637, 21183, 21177, 6702, 12633, 12640, 12625, 6704, 6698, 12630, 7080, 12629, 12638, 6699, 21178, 6703, 12628, 12634, 12639, 12624, 6701, 12632, 21175, 21186, 12636, 12642, 12626, 12635, 21173, 6700, 12641, 21182, 21185, 21181, 12627, 29666, 7084, 13241, 7082, 7081, 13243, 13248, 21657, 13244, 21667, 13247, 7087, 21668, 7439, 7086, 21662, 13240, 13246, 21180, 7085, 13245, 21664, 13242, 21660, 7083, 21666, 21663, 21658, 13872, 22131, 13874, 13869, 7467, 13871, 22132, 7466, 13873, 22129, 22133, 7469, 13875, 7468, 13868, 13870, 22130, 22508, 7753, 14437, 22509, 7752, 14438, 7751, 14436, 7750, 14435, 8020, 8019, 15261, 15263, 23044, 15262, 8191, 8192, 23043, 56530, 8193, 15587, 8341, 23413, 16169, 16168, 8615, 3330, 3400, 17894, 3830, 18084, 18082, 18083, 18342, 9651, 18698, 19544, 5799, 5800, 20071, 11962, 6705, 12643, 13249, 22134, 17696, 8861, 17786, 17895, 9071, 18701, 18700, 17697, 18085, 9308, 9652, 10116, 4871, 21187, 15264, 32385, 8436, 3331, 3509, 8884, 17787, 3643, 3644, 26651, 4104, 26963, 19546, 5323, 37440, 6707, 20648, 6708, 6706, 21670, 3332, 26548, 3401, 3403, 3402, 8862, 3404, 3510, 8885, 17789, 3511, 17788, 26589, 17790, 26652, 17898, 3645, 3646, 8940, 18088, 3831, 26761, 9072, 26968, 4108, 9309, 26965, 4106, 4107, 4105, 10117, 18343, 18344, 4473, 4472, 4474, 4471, 18703, 9653, 4109, 4470, 4872, 4873, 27565, 4874, 19548, 10669, 19549, 19550, 28017, 5801, 11271, 5324, 20072, 20073, 28570, 20649, 6266, 20650, 6710, 6709, 12644, 21189, 7088, 7470, 30922, 14895, 16019, 16170, 3333, 3512, 17792, 3513, 8946, 3648, 3651, 17902, 8944, 8942, 3650, 8945, 8947, 8941, 3653, 3652, 3649, 3647, 8943, 17904, 18100, 3842, 26766, 18091, 3839, 9077, 9080, 9079, 26768, 3833, 3841, 18090, 26769, 3838, 9076, 9074, 3837, 18101, 18098, 18093, 3832, 3835, 18096, 9075, 9082, 9078, 3836, 3840, 3843, 9073, 9081, 3834, 18362, 18348, 4114, 4122, 18353, 9321, 9314, 4123, 9325, 9310, 9317, 18366, 18361, 4113, 9311, 4111, 9318, 9322, 4110, 18358, 9323, 9316, 18352, 9319, 18350, 4125, 4116, 9326, 9324, 18360, 4121, 4119, 9315, 4118, 9313, 9312, 4117, 4115, 4124, 4120, 4112, 18711, 9320, 18367, 4476, 18718, 4483, 9667, 4475, 9659, 9655, 18706, 9671, 9654, 18717, 4478, 9664, 4481, 4484, 18719, 4479, 9668, 4482, 18708, 4881, 9674, 9656, 18709, 18710, 9658, 9665, 9669, 9673, 9670, 9663, 9666, 18716, 18714, 9660, 4486, 9662, 9661, 9672, 4477, 9657, 4485, 18715, 4480, 18713, 4887, 10125, 19113, 4886, 18712, 27573, 10123, 27571, 4875, 19128, 4880, 19123, 10122, 10119, 10124, 4876, 10118, 19127, 4879, 4877, 19111, 10126, 4878, 4882, 19108, 19118, 4883, 19121, 4885, 19131, 27566, 27570, 4884, 19109, 19553, 19575, 10120, 10121, 19126, 46208, 19124, 10127, 10676, 5325, 11285, 10675, 10694, 19559, 19555, 5331, 19568, 10692, 19570, 5330, 5326, 10701, 10685, 10688, 19565, 5334, 10698, 10690, 5327, 5335, 19561, 10695, 10693, 19566, 19578, 10678, 10699, 10687, 10682, 19577, 10672, 10700, 10684, 10671, 19576, 5333, 10689, 10702, 10686, 10674, 10679, 10670, 19558, 5332, 19579, 10683, 10680, 5328, 10673, 19567, 10697, 5329, 19562, 10681, 10677, 19560, 19571, 10696, 19569, 19574, 19572, 5802, 11278, 20106, 11275, 11292, 11280, 11293, 20113, 5804, 20088, 20086, 20077, 11289, 11286, 20080, 20108, 20103, 20078, 20085, 11287, 11290, 11294, 20112, 10691, 11296, 11982, 20091, 5805, 11297, 11273, 11283, 20087, 11288, 20081, 20083, 5803, 5806, 11295, 11298, 11277, 11274, 20104, 20079, 11276, 20076, 20111, 11281, 11279, 5807, 20075, 11291, 20110, 20109, 11282, 11284, 11272, 11970, 11968, 6275, 6273, 11978, 11969, 11979, 11975, 11967, 11981, 11966, 11973, 6272, 6271, 6270, 11971, 11976, 6267, 6274, 20656, 11964, 20655, 11974, 11963, 11972, 6268, 11977, 11965, 6269, 11980, 20653, 20096, 20659, 12648, 6715, 6714, 6716, 12660, 12650, 12656, 12645, 12659, 12658, 12662, 12655, 6711, 12654, 6717, 21193, 12647, 6712, 21191, 12661, 6713, 12649, 12652, 12657, 12651, 12646, 21196, 21200, 12653, 13251, 7092, 13254, 13253, 13256, 13258, 21679, 7090, 21675, 13252, 21671, 13250, 21681, 13259, 13257, 13255, 21673, 13261, 21677, 13260, 7094, 7089, 21678, 7091, 7093, 21680, 21682, 13262, 13882, 22137, 22140, 13881, 13880, 22138, 13883, 13876, 22136, 13877, 13885, 13878, 22141, 7471, 13887, 22135, 13886, 13879, 22143, 14442, 7756, 14440, 14445, 14444, 13884, 22513, 7755, 22511, 14443, 14439, 14447, 14446, 7754, 22515, 14441, 22512, 7472, 22514, 22516, 8021, 23046, 22812, 22809, 14896, 15265, 15266, 15267, 8342, 32731, 23239, 8343, 23242, 15588, 23243, 15845, 15844, 23414, 23533, 16020, 16021, 16171, 16282, 23676, 3334, 3335, 26525, 3336, 3405, 3514, 8948, 3654, 3655, 3846, 3847, 3845, 3844, 4126, 18369, 26979, 9327, 4128, 4127, 9328, 26980, 27243, 4487, 18720, 4888, 10128, 10704, 28023, 5336, 5809, 10703, 5808, 20666, 6718, 20667, 12663, 7473, 22144, 7757, 14448, 23049, 8344, 23244, 8519, 17698, 8886, 17794, 3515, 8887, 3658, 17907, 3656, 3657, 3659, 26774, 3849, 3848, 18105, 9083, 3850, 26982, 9084, 9329, 18373, 9330, 18371, 4129, 4131, 4133, 4130, 4134, 4132, 18375, 18372, 18374, 4491, 4488, 4490, 4492, 4489, 10129, 9675, 18723, 10131, 10130, 4894, 27579, 4890, 27582, 46223, 4891, 4893, 4895, 4892, 19136, 4897, 4896, 27581, 19135, 19134, 5341, 10706, 10705, 5340, 19584, 5339, 5338, 5342, 5337, 19582, 11304, 11301, 5811, 11300, 11305, 28579, 5813, 11303, 5810, 5812, 11302, 20115, 11983, 20669, 11984, 11985, 20670, 20671, 20668, 29123, 6719, 6727, 12664, 6721, 6725, 12665, 6726, 6722, 6723, 6720, 6724, 7097, 11299, 7098, 7096, 30303, 7095, 13888, 7474, 14449, 14450, 23050, 32388, 8194, 8345, 23415, 3337, 17795, 3660, 18109, 18107, 18108, 18377, 4493, 10132, 4898, 19137, 19138, 5345, 5344, 5343, 5814, 5815, 11306, 6728, 7475, 3338, 8863, 3406, 8888, 26590, 17796, 8949, 3661, 26661, 17909, 18378, 4135, 18725, 20119, 11986, 20673, 3339, 26550, 3407, 8950, 9085, 26986, 9086, 18110, 3851, 18726, 11307, 5816, 11987, 30308, 22517, 7758, 3340, 3360, 3408, 8889, 3516, 17911, 3855, 3854, 3852, 3853, 9331, 4137, 4138, 9332, 4136, 18381, 18382, 4497, 9676, 4496, 4494, 4495, 4901, 4899, 19139, 19140, 10134, 4900, 10133, 4889, 10707, 28032, 19586, 5347, 5348, 20121, 20120, 5346, 19587, 6729, 12666, 7099, 7100, 13263, 7759, 14897, 14898, 23053, 8437, 16283, 8846, 3409, 26664, 3341, 8891, 8890, 26593, 17912, 3662, 8952, 8953, 8951, 26665, 8954, 17917, 18112, 18117, 9094, 26785, 9089, 9091, 9093, 9090, 3859, 9087, 18113, 9088, 3856, 3857, 9092, 9095, 3858, 9096, 18114, 9346, 18390, 9340, 9335, 4140, 9343, 9341, 9334, 9347, 9350, 9345, 9338, 4142, 9344, 4143, 9339, 9342, 9333, 9337, 9349, 4144, 26992, 4145, 18391, 9336, 9348, 4139, 4141, 18389, 18392, 18384, 26997, 18385, 9693, 9686, 9692, 9685, 9687, 9681, 9679, 18736, 9694, 9691, 9677, 18732, 4499, 9689, 9690, 9688, 9680, 9678, 4498, 9684, 9682, 18733, 18739, 9683, 9695, 18735, 18738, 18740, 18734, 4906, 19148, 4905, 19144, 10135, 4902, 10137, 19149, 4907, 10138, 27605, 19146, 4910, 19147, 4908, 10139, 9696, 10141, 19143, 4904, 27601, 4903, 27606, 10136, 10140, 4909, 5350, 5349, 19594, 19591, 19590, 10709, 10713, 10715, 5351, 10718, 19600, 5355, 10720, 19601, 5357, 19598, 5353, 5361, 19604, 5358, 10711, 5352, 20126, 10710, 10708, 10722, 10712, 19589, 5354, 10721, 5359, 10717, 10716, 5360, 10714, 5356, 19597, 46991, 19593, 10723, 19603, 10719, 11322, 11329, 11318, 5819, 11314, 11330, 11308, 11327, 11325, 11319, 20137, 11328, 11321, 20123, 11313, 11331, 11311, 11324, 11309, 20122, 11332, 20138, 5820, 20125, 11326, 11990, 11312, 5817, 20129, 11316, 20135, 5818, 11315, 11320, 20134, 28596, 11317, 28590, 20132, 11323, 20128, 11994, 29134, 20680, 29136, 11997, 11989, 20677, 11991, 20675, 11996, 11995, 6276, 29130, 11310, 11993, 20674, 20678, 6277, 29129, 11988, 11992, 29137, 29133, 12673, 21209, 12680, 12671, 21201, 12678, 12669, 12677, 12681, 12668, 12672, 12667, 21203, 6730, 29715, 12670, 6731, 12676, 12675, 12674, 21206, 21207, 12679, 21688, 21689, 21686, 13267, 13269, 7102, 13270, 21694, 13265, 21690, 13264, 13274, 21692, 13272, 7101, 13275, 13266, 13271, 13273, 13268, 21693, 21691, 22145, 13892, 13897, 13891, 13896, 22148, 13889, 13899, 13895, 13900, 13894, 13890, 13898, 22147, 13901, 13893, 14451, 7763, 22520, 7761, 22522, 7760, 7762, 22518, 14899, 22813, 15163, 15268, 23054, 15589, 15590, 23246, 8346, 23245, 15846, 23247, 8438, 33020, 15847, 23418, 16023, 8521, 23534, 8520, 16022, 8574, 23609, 16172, 33535, 33407, 17699, 26519, 3342, 3663, 8955, 9097, 4001, 5362, 19606, 21695, 3343, 3519, 3518, 3517, 26668, 3860, 4911, 11998, 3344, 3345, 3346, 3410, 18118, 18393, 4500, 27609, 9697, 18742, 18741, 5821, 3347, 8864, 17738, 26551, 3520, 3521, 8892, 3664, 35497, 17919, 18119, 9098, 18122, 3861, 26792, 9099, 4151, 18395, 18394, 9352, 4149, 4148, 9351, 4146, 9353, 4147, 4150, 4501, 18743, 4503, 9701, 9698, 9699, 9700, 9702, 4502, 10143, 10142, 19151, 4913, 19154, 4912, 19153, 19155, 19152, 19610, 5365, 10725, 19608, 5364, 5366, 5363, 19607, 19609, 5823, 10724, 37503, 5824, 11334, 20016, 5825, 11333, 5822, 20141, 20142, 20144, 12001, 12003, 6278, 12002, 12000, 11999, 29149, 29724, 21210, 12684, 6736, 6734, 29719, 6735, 12682, 12683, 21696, 6732, 13279, 13277, 21699, 7104, 13278, 7105, 7103, 6733, 13904, 13902, 13903, 13276, 14453, 7764, 14452, 14900, 14901, 13905, 15269, 3348, 3522, 3666, 8956, 3665, 18396, 4152, 6279, 17700, 3411, 3523, 4504, 5826, 17701, 8893, 17804, 8894, 17805, 8957, 3863, 9103, 9101, 3864, 9100, 9102, 9104, 26797, 3862, 18125, 18124, 4156, 4157, 4154, 18398, 18400, 4153, 9706, 4155, 18401, 4505, 18745, 9705, 9707, 9704, 9708, 4506, 4916, 10144, 19157, 10146, 4914, 10147, 4915, 10145, 19156, 9703, 10726, 10729, 10730, 10727, 5370, 5369, 5367, 5368, 10728, 19616, 19615, 20146, 5371, 20147, 20145, 5828, 5829, 47882, 5830, 12004, 12006, 12008, 6281, 6280, 5827, 12007, 12005, 12688, 21214, 21213, 12686, 12692, 6737, 12693, 12690, 6738, 12687, 12685, 12691, 7107, 13281, 12689, 7109, 13282, 7108, 7111, 13283, 7106, 7110, 13910, 13908, 13907, 13909, 13906, 22149, 31960, 8196, 15591, 15592, 23248, 15848, 16024, 8649, 17702, 17924, 4158, 3865, 18402, 18404, 4507, 18749, 18748, 19159, 3349, 3412, 26552, 3524, 8958, 18126, 3866, 9105, 18406, 9709, 4508, 6739, 3350, 17739, 17806, 17925, 3667, 20149, 6282, 3351, 3413, 3414, 3526, 3525, 26676, 8959, 3668, 26677, 9106, 18128, 3867, 18407, 9355, 9356, 9357, 18409, 4159, 4160, 9354, 4161, 27271, 27621, 4509, 9710, 18750, 10149, 4917, 19160, 10148, 19617, 5372, 10731, 5373, 10732, 19618, 20154, 20152, 5831, 28612, 20151, 29155, 12009, 20681, 12695, 12694, 6740, 30329, 7112, 13284, 7476, 13911, 7765, 22814, 8522, 16174, 17703, 17704, 17807, 17908, 9358, 18410, 9711, 5374, 11335, 6283, 20682, 22151, 22815, 8022, 23755, 17705, 3869, 18129, 3868, 4510, 18753, 10150, 5376, 5648, 5377, 5375, 5832, 20683, 12696, 6741, 7113, 23536, 8847, 8960, 26678, 9108, 3870, 9107, 3871, 26801, 4165, 9361, 9360, 4164, 4162, 4163, 9359, 18415, 18414, 4512, 9712, 4515, 4511, 4517, 4513, 4514, 4516, 27276, 19161, 19163, 4920, 4919, 4918, 19162, 10734, 5378, 5381, 5379, 10733, 5384, 28062, 5380, 10735, 5383, 5382, 28061, 28066, 28617, 11337, 11336, 20158, 5835, 5833, 5834, 11338, 6284, 12011, 6285, 12010, 29159, 29734, 13285, 21216, 21217, 7115, 12697, 7114, 21701, 6742, 13913, 13912, 7766, 14454, 15270, 15593, 15594, 23420, 3415, 26529, 3527, 17810, 26682, 8895, 17809, 35507, 3873, 3875, 18135, 8963, 9111, 9110, 9109, 17929, 8962, 8961, 3670, 3874, 3872, 3669, 17930, 17932, 18134, 4166, 9362, 18138, 4167, 9116, 27025, 9118, 9117, 9363, 18133, 18131, 9113, 18423, 3879, 3877, 18139, 9112, 9114, 9120, 18143, 3876, 18142, 9115, 9124, 4169, 18140, 9121, 3878, 18144, 9119, 9122, 18137, 4168, 18132, 4170, 9123, 18417, 18425, 9383, 9370, 9368, 9382, 9377, 4522, 4171, 9378, 9381, 4518, 9380, 4172, 4177, 4175, 9371, 27281, 9366, 9373, 4182, 9384, 4519, 9374, 27024, 4520, 4178, 9376, 18763, 9727, 4521, 9365, 4179, 4523, 4180, 4176, 4181, 9375, 9364, 9379, 4173, 18416, 18764, 9367, 9372, 9369, 4174, 18419, 9713, 27296, 9714, 18424, 9724, 10154, 9725, 4529, 9728, 9718, 4528, 9720, 27290, 9721, 18769, 19170, 9723, 4524, 18759, 19164, 4924, 18760, 18766, 9719, 9715, 4925, 19175, 27289, 9729, 4921, 10152, 9722, 18757, 10151, 9717, 9726, 18768, 18770, 4527, 4922, 4533, 4923, 9730, 10153, 4526, 4927, 4532, 4531, 4530, 4926, 9731, 4928, 4525, 27302, 9716, 19171, 19169, 19172, 18765, 19167, 5385, 10157, 10159, 27640, 10161, 4929, 4935, 10738, 10165, 10156, 5387, 10736, 19177, 4934, 4932, 10167, 27648, 10737, 27647, 10158, 19180, 4933, 10162, 4936, 10164, 19623, 19165, 4931, 10163, 10166, 10160, 19182, 4930, 5388, 19632, 10155, 5386, 19633, 28086, 19178, 19183, 5389, 19176, 19630, 19181, 10740, 10749, 5838, 20167, 5391, 5396, 5839, 10751, 5403, 11340, 10741, 5395, 5398, 5393, 10739, 10753, 10756, 11355, 28083, 10754, 11344, 5394, 5401, 5405, 10748, 11339, 10752, 5390, 11341, 10755, 11343, 10744, 19625, 5836, 20169, 10742, 10743, 5400, 20168, 19629, 5399, 10746, 5404, 10750, 5397, 10747, 19640, 5402, 5840, 5837, 11342, 20171, 10745, 20172, 5392, 19637, 19639, 20173, 20160, 19635, 5845, 5849, 11346, 6290, 5847, 11350, 5851, 12012, 11352, 6292, 5843, 5846, 11353, 20177, 11354, 11360, 5853, 6293, 29168, 11356, 11361, 11349, 6303, 20162, 6294, 5852, 11347, 11362, 20164, 6302, 5850, 6287, 11359, 20176, 5854, 11351, 11345, 5844, 11348, 38179, 11357, 20690, 6286, 6291, 5841, 11358, 20180, 6289, 20181, 20182, 20163, 5842, 6301, 12699, 12023, 20688, 12015, 12698, 29164, 12019, 12021, 20686, 20691, 12018, 21228, 6300, 29163, 12017, 6304, 21227, 48853, 20687, 12714, 21225, 20693, 6299, 6744, 12024, 12700, 21226, 20689, 6297, 12016, 12020, 6743, 6288, 12013, 12014, 6745, 6296, 6298, 6295, 12022, 12704, 12705, 12710, 7120, 12717, 21702, 6751, 21713, 6750, 12712, 21703, 7119, 12701, 6749, 21230, 12716, 6747, 6748, 21711, 12713, 13302, 7117, 5848, 21231, 12715, 7124, 12707, 30346, 7118, 21223, 7123, 12702, 12706, 12703, 12709, 6752, 7116, 6746, 21714, 13288, 12711, 21221, 7122, 21232, 7125, 53190, 12708, 21224, 7121, 13287, 39489, 21716, 21233, 21717, 21706, 13292, 7480, 13286, 13925, 13301, 7129, 21709, 7127, 7478, 13298, 13294, 7133, 21705, 13916, 22161, 21721, 22160, 7131, 13293, 21722, 13914, 21718, 13297, 30952, 13300, 13291, 21708, 7132, 30948, 21704, 7126, 13915, 7479, 13299, 7128, 7130, 13296, 7134, 13295, 13290, 13289, 7477, 13303, 13918, 14456, 7482, 22154, 13924, 22156, 13922, 22163, 14457, 22157, 7483, 13923, 22159, 13920, 7768, 14455, 22165, 13917, 13919, 7769, 7485, 7767, 7484, 7771, 13921, 7481, 22155, 22158, 22164, 31970, 14910, 31508, 14902, 22530, 22528, 22525, 22527, 22526, 14463, 14903, 14459, 31507, 22524, 8023, 14461, 14460, 7770, 14458, 14462, 14911, 14907, 14909, 32399, 14904, 14905, 32400, 14908, 14906, 8197, 22816, 8200, 8199, 8198, 8347, 15595, 8348, 15271, 8439, 15849, 8440, 8523, 8575, 16175, 23537, 16176, 16177, 23717, 16459, 3416, 8896, 3528, 3672, 3673, 3671, 17934, 3674, 3881, 3880, 18146, 9385, 4184, 4183, 18772, 10168, 5406, 5407, 28089, 28091, 20183, 5855, 12025, 6305, 6306, 12027, 12029, 12028, 29174, 12719, 21235, 12718, 6753, 12720, 21234, 13304, 7135, 21725, 7486, 22166, 7772, 8024, 7773, 23539, 3417, 17740, 17741, 17811, 9125, 18149, 18150, 9386, 4186, 4185, 4187, 4534, 9732, 9733, 19184, 10169, 4937, 5408, 5856, 11363, 3418, 26530, 3352, 3419, 17813, 8897, 3532, 3531, 3529, 3530, 17938, 3677, 8970, 8972, 3676, 8964, 17935, 8965, 17936, 8971, 8967, 8969, 3675, 8966, 8973, 8968, 17937, 3888, 3897, 3895, 9135, 9132, 9140, 3893, 9141, 18166, 3886, 9138, 18155, 3892, 9134, 9133, 3890, 9139, 3891, 4188, 3885, 9136, 18151, 9126, 3882, 18164, 3901, 9131, 9137, 3887, 3889, 18156, 9127, 18163, 9128, 9129, 26814, 3900, 3894, 3899, 9130, 3898, 3884, 3883, 3896, 18162, 26817, 18160, 18161, 18165, 18158, 18159, 18440, 18433, 4202, 9398, 9391, 4197, 4216, 9387, 9394, 9396, 9399, 4211, 18429, 9395, 9388, 4209, 9392, 18431, 9400, 4194, 18428, 9397, 4204, 4203, 9390, 4192, 18443, 18441, 4193, 4191, 18442, 4215, 4207, 4201, 4189, 9393, 4200, 4190, 4208, 4217, 9734, 4205, 9389, 4195, 4198, 4199, 18437, 4213, 4214, 4212, 4206, 4210, 4196, 4535, 18439, 18446, 18444, 18445, 18438, 18432, 18782, 9740, 4547, 4539, 4541, 4546, 9752, 4544, 10170, 4938, 4549, 9737, 9745, 4545, 9744, 9741, 9749, 9751, 4538, 4542, 4548, 4940, 9746, 4540, 4551, 9739, 18784, 18785, 36132, 4543, 4939, 4537, 27316, 9736, 9743, 9735, 9738, 9742, 10171, 4550, 27308, 9747, 9748, 9750, 4536, 18781, 19193, 19194, 18780, 18783, 27318, 4954, 10183, 4952, 4953, 10173, 10189, 19187, 4943, 19190, 19196, 10757, 10191, 10185, 19199, 10176, 19198, 10194, 10179, 4949, 10780, 10182, 4951, 4942, 19203, 10196, 10184, 4945, 10177, 10174, 10175, 4946, 10190, 10197, 4948, 10181, 10180, 4956, 4955, 4941, 4947, 4950, 10193, 19189, 19200, 10187, 4944, 10172, 10195, 10186, 10188, 10192, 19191, 19202, 19197, 10758, 19662, 5416, 5436, 5435, 19652, 5424, 19654, 10776, 10772, 10769, 10787, 5419, 5411, 19651, 19663, 10774, 5872, 5415, 10782, 19647, 5437, 5434, 10778, 10761, 19643, 19656, 5433, 10784, 10760, 5422, 5426, 10783, 19648, 10770, 5427, 5421, 10759, 19644, 5858, 10786, 10768, 5432, 10771, 10785, 5431, 19649, 11364, 28098, 5412, 10766, 5417, 5428, 28099, 5423, 10775, 10765, 10763, 10781, 5409, 5429, 5413, 5857, 10779, 5414, 28108, 5410, 5425, 5420, 5418, 10767, 5430, 10764, 10777, 10773, 11366, 11365, 19658, 19659, 10762, 11382, 20196, 5860, 20195, 11388, 11371, 11385, 12030, 5863, 11389, 11392, 5862, 11374, 11391, 11390, 5864, 11367, 5859, 5867, 20198, 5865, 11387, 28656, 11377, 5869, 11394, 11386, 11395, 5877, 5875, 11384, 11383, 20186, 11381, 11375, 5868, 20185, 5866, 10178, 11368, 20187, 12060, 11369, 5861, 5874, 12032, 28639, 5870, 5871, 11370, 11393, 12031, 11378, 11373, 5873, 11379, 11376, 20197, 20192, 5878, 28654, 20194, 6321, 20720, 20697, 12035, 12054, 12059, 12047, 6317, 12064, 6314, 12033, 20705, 12034, 6307, 6316, 12041, 6319, 6320, 12042, 20703, 12055, 12061, 6315, 20709, 6309, 12040, 12036, 12063, 12045, 12046, 12037, 12057, 12048, 12058, 12050, 20708, 6310, 12721, 6313, 6311, 12062, 12053, 12049, 20701, 20698, 12038, 6763, 12052, 6318, 12044, 20699, 12043, 20719, 21248, 20713, 6312, 6308, 12742, 12056, 12051, 12039, 20715, 20716, 12737, 21237, 12722, 12733, 21251, 12740, 6761, 5876, 12738, 6756, 21243, 21247, 21239, 6755, 12745, 29764, 12723, 12736, 12724, 12735, 6759, 12739, 11380, 21244, 29765, 21253, 12746, 12731, 6762, 13318, 7136, 21246, 12744, 12743, 6764, 13305, 7137, 13306, 21245, 12727, 12728, 12725, 12730, 12726, 12747, 6758, 7138, 6760, 6765, 21240, 12729, 21252, 12741, 21726, 21249, 12734, 21734, 13309, 21737, 6754, 7141, 13932, 13314, 13313, 13315, 21729, 21728, 13312, 7142, 21740, 7148, 7145, 21730, 7146, 13307, 13310, 13320, 7154, 7152, 21727, 13311, 11372, 7139, 13317, 13308, 21743, 7155, 13316, 6757, 7144, 12732, 21744, 21733, 7147, 21742, 7151, 7153, 7150, 7149, 21739, 7143, 13319, 7140, 7156, 21738, 21736, 7490, 7491, 13931, 7500, 7497, 22169, 7488, 7495, 13933, 7493, 7487, 21731, 7494, 22176, 13930, 7775, 7489, 40199, 7496, 7774, 13929, 13928, 22175, 7498, 22168, 7499, 22178, 13927, 13926, 7776, 13936, 7492, 13934, 22174, 22533, 7777, 22536, 7782, 14466, 14468, 22822, 7779, 22824, 14469, 14465, 22823, 14467, 7780, 7783, 22538, 14464, 7778, 7781, 8026, 13935, 8025, 55901, 22821, 8031, 14915, 22827, 8029, 8030, 14918, 14914, 8027, 14912, 8201, 14916, 31981, 14917, 14913, 22825, 8028, 15272, 23056, 15275, 23057, 23055, 15276, 15274, 15277, 8202, 15273, 23422, 15599, 8350, 15598, 15597, 15596, 8349, 8351, 15850, 8442, 8441, 23541, 23542, 16026, 16025, 16028, 8576, 8524, 16179, 16027, 23540, 23611, 16178, 8578, 8577, 8616, 16284, 16354, 3420, 44443, 18787, 11396, 13937, 17742, 17743, 3678, 8974, 3904, 3902, 26820, 3903, 26819, 9401, 4218, 4552, 18789, 9753, 18791, 9754, 18788, 4553, 10199, 27670, 4957, 4958, 10198, 19204, 27671, 19668, 19667, 5444, 28116, 5440, 28120, 10788, 5447, 5446, 5439, 5442, 5445, 5441, 19665, 11400, 5438, 5879, 20199, 20200, 20201, 5881, 5882, 11399, 11402, 5880, 11397, 11401, 11398, 20722, 6322, 20725, 29200, 12065, 20724, 21259, 6766, 12748, 7501, 7157, 13321, 7158, 7159, 13323, 13322, 13324, 13939, 13938, 14471, 14470, 7784, 7785, 15278, 23250, 3421, 18103, 18448, 27674, 19207, 11403, 19669, 19670, 5884, 5883, 12066, 14919, 8443, 16180, 3422, 26822, 4959, 19209, 5449, 5448, 11404, 11405, 6323, 12749, 6767, 13940, 31520, 3423, 3533, 18450, 4219, 9402, 9755, 4554, 5450, 19671, 11406, 5885, 6324, 29206, 13325, 13326, 30971, 22540, 14472, 8032, 16355, 3424, 18451, 9403, 4220, 4555, 18792, 9756, 4960, 10203, 10201, 10202, 4961, 10200, 19673, 28125, 19676, 19674, 5452, 5453, 10789, 5454, 5451, 11407, 20204, 11408, 12067, 29207, 6769, 6768, 30972, 14473, 14920, 23060, 15280, 15279, 15600, 17744, 8865, 4556, 19678, 20727, 3425, 3534, 17814, 3680, 3679, 17942, 17941, 3681, 3682, 8976, 8975, 9142, 3905, 9145, 9144, 9143, 9146, 18170, 27043, 4221, 9409, 9405, 9414, 18458, 18453, 4228, 18457, 4226, 9410, 9406, 9413, 4225, 4232, 9408, 9404, 4231, 9411, 4224, 9412, 4227, 4229, 9416, 9415, 9407, 4223, 4222, 4230, 27042, 18455, 18456, 18799, 18795, 9761, 9767, 18802, 4562, 4559, 9758, 9763, 18797, 4565, 4557, 9762, 4560, 4563, 18794, 27330, 9765, 18798, 4558, 9770, 4561, 18800, 4564, 9759, 9764, 9768, 9760, 9757, 18803, 18804, 9769, 9766, 18801, 18728, 19213, 4969, 4962, 4965, 19219, 4968, 19211, 10206, 19216, 4963, 10204, 19215, 4967, 19220, 19212, 4964, 19210, 10207, 4966, 19679, 28130, 10793, 5456, 10792, 10794, 5455, 5460, 10205, 19218, 10791, 10795, 19681, 5457, 10790, 5459, 19682, 5458, 20215, 11415, 20208, 11410, 20214, 5886, 5890, 5887, 11413, 11416, 20212, 5888, 28673, 5889, 5894, 12076, 11414, 5892, 11411, 11409, 20207, 5893, 20209, 11412, 20213, 6330, 29212, 12068, 6327, 6328, 6326, 12073, 12072, 12069, 6332, 20738, 20733, 12071, 5891, 20736, 20728, 12075, 12070, 6329, 6325, 6331, 12074, 21263, 29778, 21264, 6772, 29782, 12752, 12751, 12750, 6770, 29780, 21268, 21262, 21266, 6771, 13329, 13332, 7161, 21749, 21751, 7160, 13333, 13328, 7163, 13330, 21746, 7162, 13327, 21745, 13331, 7507, 7504, 13949, 13948, 21748, 13947, 13942, 22182, 13943, 22186, 30973, 22179, 7505, 22183, 7502, 7506, 13941, 7503, 13944, 13945, 13950, 22185, 22546, 13946, 22544, 22545, 14474, 31522, 22541, 22542, 7787, 22547, 14923, 7786, 14921, 14922, 8033, 8204, 15281, 23064, 8203, 23063, 15602, 15603, 23251, 8352, 23252, 15601, 8444, 33413, 16181, 8579, 16285, 16286, 23718, 3426, 26599, 3683, 3684, 3906, 18174, 9417, 4566, 4970, 5461, 5286, 5895, 5896, 5751, 11417, 6333, 12754, 12753, 22187, 57754, 3427, 3685, 9418, 4234, 18460, 4233, 18806, 9771, 9772, 10208, 10209, 4971, 4972, 19685, 4973, 10796, 19684, 19683, 5463, 28678, 5898, 20218, 5897, 12077, 12346, 12755, 13951, 22189, 8034, 8353, 3428, 3537, 3538, 3536, 3539, 3535, 17815, 3688, 17946, 8984, 3687, 3689, 17947, 17944, 8979, 8978, 8981, 8980, 8983, 3686, 8977, 8982, 18181, 9147, 3916, 9148, 9152, 3915, 18182, 9156, 9151, 9154, 3908, 3909, 3910, 3911, 18178, 3918, 18177, 9150, 3913, 3919, 18180, 9149, 9155, 18175, 3912, 9153, 3914, 3907, 3917, 18183, 26827, 4255, 18462, 9420, 4235, 27050, 4245, 4246, 4238, 4256, 4240, 9428, 4251, 9423, 4241, 9438, 9439, 9431, 9424, 4254, 9436, 4249, 4247, 18473, 9437, 18464, 9435, 9427, 9419, 9426, 4242, 27046, 4248, 18465, 4236, 9430, 9429, 9421, 18470, 4250, 9433, 9422, 4253, 9440, 4237, 18463, 4244, 9425, 9434, 4252, 27048, 4239, 4243, 27051, 9432, 18469, 18467, 9804, 4574, 4587, 18821, 9799, 9789, 4580, 9787, 4573, 9782, 4583, 9795, 9776, 9778, 18813, 27692, 27337, 18815, 9781, 9773, 9794, 9810, 4578, 9783, 9801, 18812, 9775, 9808, 9809, 9812, 9803, 9788, 9796, 4584, 4571, 4579, 4591, 4568, 4570, 18816, 18810, 18825, 9780, 4588, 4581, 9806, 9777, 4590, 4585, 9786, 27336, 27681, 4589, 9793, 9785, 4582, 9805, 9797, 18809, 4576, 9811, 9784, 4572, 9802, 9792, 4577, 9798, 4569, 9774, 4586, 4988, 4575, 9791, 9790, 9779, 18472, 9807, 18819, 9800, 18817, 4567, 18824, 18822, 45765, 18823, 10229, 4995, 10230, 19236, 10218, 4984, 4996, 19230, 10211, 19226, 10220, 10228, 19234, 10210, 10237, 4974, 19237, 19243, 19223, 10236, 10231, 19238, 10232, 4982, 4993, 10222, 19229, 10223, 10233, 10224, 19242, 10219, 10213, 10214, 10227, 10221, 19227, 19222, 4975, 4979, 10235, 10215, 4991, 4987, 19233, 27688, 4990, 4997, 4980, 4992, 10226, 4994, 4977, 19232, 4976, 10212, 27682, 10216, 4985, 10234, 10225, 10217, 4989, 4986, 18814, 4978, 4981, 19241, 19231, 19240, 19239, 10817, 19698, 10801, 10802, 10806, 19709, 10821, 10818, 19691, 10811, 10810, 5470, 10814, 10829, 10797, 19704, 10830, 10816, 10834, 10822, 5469, 10820, 5464, 5485, 5475, 19700, 5479, 5478, 10798, 28136, 10827, 10833, 10825, 10832, 19694, 10813, 10799, 10831, 10815, 5467, 5480, 19703, 10824, 5473, 19690, 19705, 19693, 10823, 10800, 5481, 19688, 5483, 10826, 5484, 5466, 10807, 10828, 19697, 19545, 5472, 5482, 10809, 10819, 10804, 10808, 5477, 10803, 5465, 5474, 5471, 10812, 4983, 11440, 5468, 19689, 19695, 19707, 19708, 19699, 20246, 5476, 20242, 11443, 11465, 11454, 5918, 20233, 5913, 11437, 5914, 11453, 20239, 11446, 11459, 5910, 11419, 11461, 5900, 11427, 5903, 5902, 28687, 5919, 19696, 11421, 11455, 11456, 5905, 5901, 11435, 20238, 5912, 11430, 20227, 11457, 5908, 11449, 11462, 11424, 11429, 11423, 20219, 5907, 11442, 12099, 11425, 5911, 11434, 11458, 5906, 11431, 11428, 11445, 5909, 5899, 5921, 11448, 11447, 20226, 20243, 20234, 20236, 20229, 20224, 11420, 5904, 11460, 11436, 11438, 20232, 11451, 11450, 11418, 5915, 5917, 11426, 11433, 11441, 5916, 11432, 11444, 11463, 11452, 20237, 20245, 20228, 11464, 11422, 20241, 12119, 6341, 20748, 12117, 12096, 12101, 12094, 20766, 12113, 12080, 12087, 29220, 12111, 12121, 12097, 20751, 12084, 12103, 12108, 12088, 20754, 12105, 12085, 20740, 20764, 12092, 12093, 6343, 12112, 12110, 20762, 12081, 12115, 20763, 12116, 12118, 6347, 6339, 20758, 10805, 12089, 12107, 12090, 6336, 6352, 12114, 6350, 6346, 12079, 6338, 20768, 12082, 6351, 20767, 12098, 12078, 20765, 6344, 12102, 12086, 6345, 12095, 6335, 5920, 12104, 11439, 12083, 29215, 20756, 12109, 6340, 12106, 6337, 12100, 6348, 12091, 12120, 20753, 20770, 6342, 12231, 20761, 6349, 12769, 12767, 21269, 12789, 12765, 21272, 12783, 6334, 6775, 12761, 12788, 21292, 12766, 12780, 6780, 6773, 21289, 12786, 21281, 12759, 12785, 21282, 6791, 12776, 12792, 6789, 12768, 6774, 12770, 12784, 6783, 12763, 6787, 6777, 12772, 12762, 12756, 21273, 12782, 6784, 12791, 12757, 6781, 29790, 12778, 29792, 6782, 12764, 12775, 12771, 12773, 21278, 6776, 12790, 6790, 12774, 21270, 12793, 29804, 21271, 12758, 12779, 6779, 6788, 6786, 12760, 12781, 6785, 21280, 21283, 6778, 12777, 21288, 21279, 29805, 21765, 12787, 21287, 13345, 21277, 13341, 13337, 13357, 13354, 7166, 21781, 21777, 13361, 13344, 7177, 13351, 21760, 21762, 13340, 13350, 7174, 13370, 30390, 13367, 13353, 13338, 21776, 21768, 13358, 13360, 7170, 13348, 13343, 13334, 7167, 7175, 30401, 13363, 7176, 13335, 13369, 13356, 13362, 7173, 21758, 21761, 13359, 21752, 13366, 21772, 7178, 21767, 7172, 13352, 13339, 13371, 13336, 13364, 7169, 21755, 13346, 21754, 13347, 7168, 7165, 13342, 7171, 21763, 7164, 21779, 13365, 13368, 13349, 13964, 21775, 21770, 21778, 13956, 22195, 13952, 7520, 22211, 22207, 7509, 7514, 7510, 13966, 13977, 7508, 13958, 13967, 13355, 13968, 22191, 22194, 7515, 22215, 13983, 7519, 7522, 13954, 22210, 7518, 22200, 13981, 13982, 13972, 13971, 13963, 22192, 22213, 13973, 13980, 13979, 22198, 7513, 7511, 13965, 13962, 22219, 13959, 13978, 7521, 13976, 7517, 7516, 22190, 13970, 30404, 13953, 13955, 13957, 13975, 13969, 7512, 22197, 13960, 22201, 13974, 22216, 22209, 13961, 22550, 7795, 14492, 7788, 14477, 22556, 14488, 7790, 14495, 22560, 14484, 22557, 14479, 22551, 31526, 14496, 14475, 14486, 22566, 7797, 14491, 14497, 14485, 7789, 14487, 14476, 7796, 22562, 22555, 14494, 14481, 7792, 22563, 14483, 14480, 7798, 14482, 7791, 7794, 14490, 14478, 14493, 22553, 14489, 22568, 22831, 8036, 14934, 8041, 8042, 22834, 22842, 22833, 8035, 14933, 22835, 14930, 14931, 8039, 14925, 14929, 8038, 22841, 14926, 22836, 22844, 22840, 22837, 8040, 8037, 22843, 14924, 14928, 14932, 22838, 15287, 15284, 15293, 23065, 15292, 15290, 15285, 23076, 8208, 23066, 23075, 32416, 23068, 23074, 15286, 8207, 7793, 15289, 8206, 15294, 15288, 15283, 14927, 23069, 23067, 8205, 15282, 15607, 23258, 15606, 15291, 8354, 22832, 15610, 15611, 15605, 15609, 32759, 15604, 23256, 32757, 15854, 15608, 8447, 8445, 15852, 23426, 23425, 23424, 15855, 23428, 15851, 15853, 8446, 23546, 23545, 16030, 16031, 8525, 16029, 16184, 8580, 16182, 16183, 16287, 23677, 8650, 16358, 16356, 16357, 16359, 23719, 23756, 23720, 16460, 3429, 3690, 17948, 4257, 27058, 9441, 18474, 18475, 9813, 27341, 18827, 19245, 10238, 10240, 19244, 10239, 19246, 10241, 5486, 10836, 10242, 19711, 10835, 10837, 10838, 11466, 5923, 11467, 11469, 5924, 5922, 11468, 20772, 12127, 12125, 12124, 20771, 12123, 12122, 6353, 12126, 6792, 12794, 12796, 6793, 12795, 7180, 21783, 7179, 13372, 21782, 21784, 13985, 13984, 13986, 22221, 22220, 7523, 14498, 7799, 22570, 14935, 8043, 15295, 8526, 3430, 3540, 3691, 3920, 4258, 4259, 18476, 18477, 4592, 18828, 19247, 10243, 20250, 20248, 29810, 20773, 6354, 20774, 21294, 30407, 13498, 7524, 8044, 3431, 17816, 3692, 27063, 9443, 4260, 9442, 18479, 9814, 4593, 9815, 36168, 4594, 10245, 4999, 4998, 19249, 10843, 10841, 10842, 10840, 19713, 10839, 11470, 11473, 5926, 11471, 5925, 11472, 12128, 20775, 29814, 12797, 12798, 12799, 21295, 13375, 13374, 7181, 13373, 13376, 13987, 31002, 40877, 13988, 13989, 31539, 14499, 7800, 8045, 15296, 8448, 8866, 18480, 4595, 9816, 5000, 28151, 28153, 5487, 19714, 5927, 11474, 20252, 6356, 6355, 20779, 12800, 12801, 7182, 7183, 13991, 13990, 14936, 16185, 3432, 8867, 3541, 17949, 3921, 9157, 18481, 4596, 6357, 3433, 9817, 4597, 9818, 7801, 3434, 9444, 9819, 18833, 10250, 10249, 10247, 19253, 10246, 10251, 10248, 19251, 19252, 5488, 5489, 19715, 5928, 11475, 28715, 11476, 11477, 20254, 12132, 12133, 12131, 20781, 12129, 12130, 6358, 12802, 13379, 13378, 13377, 13380, 13993, 13992, 7525, 13994, 7802, 14500, 22572, 14937, 15297, 16032, 3435, 3543, 3542, 26696, 4261, 8868, 8898, 3693, 8985, 9158, 9159, 4262, 18484, 9445, 4598, 9820, 9821, 5001, 5005, 10252, 5004, 5002, 5003, 10844, 5490, 5931, 20255, 5929, 5930, 11478, 20782, 20783, 6794, 3436, 8899, 17820, 3544, 17817, 8902, 17954, 3547, 8901, 3546, 3545, 3922, 8900, 17821, 17822, 8986, 8990, 8992, 8993, 3703, 3704, 8989, 3699, 17952, 8987, 17958, 8991, 3700, 18194, 3695, 17951, 3696, 17956, 3702, 8988, 3694, 3923, 3697, 3698, 3701, 9176, 9174, 9161, 3935, 9168, 3930, 9162, 18491, 9170, 18189, 9167, 3933, 9166, 3940, 9175, 3942, 18192, 3944, 17953, 9160, 18196, 3931, 9177, 18190, 3938, 3941, 18185, 9468, 3925, 3948, 3939, 9163, 3928, 3943, 9171, 3926, 3927, 9466, 9164, 3934, 3945, 9178, 9165, 3932, 18186, 3937, 9446, 3946, 9172, 3936, 18490, 3947, 3924, 9169, 3929, 9173, 9467, 18187, 18191, 18201, 18198, 18195, 18200, 4274, 4290, 9453, 4281, 18845, 9474, 4266, 18498, 4269, 9465, 27077, 9451, 9455, 4277, 4279, 9458, 4286, 4272, 4270, 4271, 4285, 9470, 4280, 9457, 9459, 4278, 4283, 9460, 9473, 18500, 4599, 4289, 27070, 4267, 9472, 18499, 9476, 9456, 9478, 9463, 4276, 9452, 4275, 4293, 4282, 18497, 9450, 9830, 4288, 4292, 9464, 9469, 18492, 4294, 4287, 4273, 4263, 18496, 4268, 27068, 9454, 4264, 9477, 18494, 9448, 9447, 9461, 9449, 4291, 5006, 4284, 9462, 4265, 18846, 4614, 9475, 18837, 9837, 9840, 18847, 9843, 9832, 18839, 18841, 9846, 9849, 9851, 9829, 4600, 4605, 10257, 4621, 9844, 9852, 9836, 9828, 18840, 18838, 18844, 10284, 4608, 9841, 9833, 9835, 4613, 19265, 9838, 4607, 9825, 9847, 18842, 9850, 18836, 18854, 4604, 18850, 4616, 9822, 4618, 4602, 4622, 9848, 9824, 4619, 10278, 9471, 4606, 4601, 9831, 9823, 4620, 4612, 9842, 4617, 4615, 9834, 4609, 9826, 4610, 4611, 9827, 9845, 4603, 9839, 27354, 18852, 18848, 19262, 19258, 10260, 5014, 5019, 19264, 19275, 19261, 10269, 10275, 10271, 10258, 10261, 10254, 10255, 5026, 5011, 10270, 10279, 5021, 5007, 19254, 5016, 10262, 5018, 10263, 10273, 19271, 19274, 19257, 5020, 10288, 10256, 5013, 5012, 5024, 10253, 10286, 10274, 10287, 10281, 10267, 10282, 19270, 10276, 10285, 10283, 5025, 10268, 5010, 5009, 5017, 5023, 10280, 5022, 10265, 5491, 19263, 10289, 10264, 10259, 5015, 5027, 5008, 19276, 10272, 10277, 19268, 19266, 19267, 5525, 10846, 10850, 19724, 5506, 5504, 19735, 19740, 5495, 10848, 10847, 5515, 20257, 10853, 5509, 19727, 10871, 10883, 5492, 10868, 10861, 5527, 10845, 19719, 10873, 19720, 5524, 5512, 5523, 5502, 10857, 10875, 10867, 5503, 5497, 10881, 19721, 10874, 10876, 5505, 5513, 10878, 10855, 10872, 10860, 10880, 5518, 5494, 5516, 10865, 10863, 10864, 5507, 10859, 10858, 5496, 10852, 10882, 5498, 10862, 5528, 19729, 5522, 10851, 5519, 5517, 5526, 10869, 5521, 10266, 10870, 5520, 10877, 5493, 10866, 5511, 10854, 5510, 19737, 5508, 5500, 5499, 11479, 10879, 20270, 19747, 10856, 19745, 19742, 11500, 19725, 5501, 19732, 19743, 19731, 19744, 19734, 28182, 19738, 19748, 19746, 20261, 5960, 5514, 5942, 11494, 5956, 20259, 11482, 5939, 5935, 11512, 5941, 5945, 5940, 5949, 11516, 11507, 20284, 20286, 11489, 5954, 5948, 11501, 5932, 11513, 11506, 5936, 11495, 5951, 11524, 11525, 28728, 5933, 11511, 5953, 11499, 11485, 11486, 5957, 11490, 11497, 11491, 20267, 5955, 5963, 11487, 11480, 11481, 20263, 11483, 5938, 11496, 20287, 5952, 5961, 20265, 20282, 11498, 11522, 11514, 5934, 11520, 5946, 20279, 5944, 20277, 11526, 5943, 11504, 11492, 11502, 5966, 11508, 11505, 11488, 5962, 11518, 11515, 11523, 5937, 11503, 5965, 20268, 11510, 20799, 20273, 5947, 5950, 20269, 11509, 5964, 11493, 10849, 20258, 20285, 11519, 11517, 11521, 20275, 28731, 20276, 20281, 28732, 11484, 5959, 12164, 12163, 12137, 6364, 20789, 12162, 12140, 12141, 29264, 6374, 12171, 6369, 12161, 20792, 12134, 6375, 6365, 12149, 12139, 12142, 12166, 6359, 12173, 12165, 6368, 12154, 6379, 20787, 20795, 6378, 6372, 20805, 29255, 12172, 6360, 12152, 12143, 12156, 12168, 6380, 20798, 6362, 12151, 20786, 12144, 6371, 20790, 6370, 12147, 12157, 12167, 12138, 12148, 6363, 12158, 6376, 6367, 12145, 6366, 12136, 12150, 12170, 5958, 6822, 12153, 12803, 12155, 12169, 6373, 12146, 6361, 6377, 7201, 12135, 49019, 12160, 20809, 20803, 20812, 12159, 20802, 20810, 20804, 20800, 20811, 12831, 6819, 12820, 12825, 6808, 21297, 12805, 6821, 21298, 6799, 12804, 12837, 6823, 12808, 12824, 21312, 12810, 12840, 12836, 6797, 6807, 13406, 6820, 6805, 12806, 21310, 12835, 6809, 12832, 12845, 12812, 12821, 21801, 21302, 12843, 12833, 6804, 21787, 21311, 12819, 6798, 6796, 6814, 29832, 21306, 12817, 12814, 12815, 21301, 12839, 21303, 12844, 12842, 6802, 12846, 6806, 6813, 29833, 12807, 13382, 12816, 21305, 6800, 6818, 6815, 6803, 12826, 12811, 6816, 12828, 6810, 6812, 6795, 21304, 12830, 12822, 12809, 6811, 12838, 12841, 12818, 12829, 21797, 6801, 7184, 12827, 13381, 21309, 12834, 21308, 29847, 21313, 12813, 13391, 13401, 7187, 13400, 13412, 7189, 13398, 30417, 13402, 7200, 21806, 13393, 7192, 21796, 13405, 14002, 7204, 7203, 13407, 13390, 13417, 7198, 21788, 7188, 13410, 30434, 13414, 13419, 13408, 13396, 7191, 7194, 7202, 7197, 21798, 13399, 12823, 21807, 21789, 13395, 13418, 7193, 21802, 7196, 13420, 7185, 13409, 13383, 13415, 7811, 21803, 13397, 31010, 7186, 13392, 7190, 13384, 6817, 13388, 30416, 13413, 13389, 13387, 7195, 21804, 13411, 21800, 13386, 13404, 13403, 13416, 13394, 7199, 30429, 14005, 22237, 7538, 7528, 14017, 13997, 7530, 14009, 7537, 7532, 14007, 14502, 14013, 14019, 14012, 13995, 14010, 14021, 14023, 7527, 14022, 7533, 7539, 22235, 7536, 22239, 14016, 7535, 14011, 22228, 13999, 14004, 22231, 14015, 7534, 7531, 7526, 7529, 14003, 31021, 13385, 13998, 14001, 14018, 14006, 13996, 14501, 14020, 14000, 14014, 21794, 22236, 14504, 7815, 22575, 22574, 7803, 22580, 22581, 7807, 14506, 14512, 14510, 7805, 7806, 7813, 14513, 14505, 7808, 22576, 14509, 14508, 14514, 7814, 22582, 7809, 7812, 14507, 7816, 7810, 7817, 7804, 14511, 23082, 14503, 22240, 22584, 14950, 8050, 14947, 14949, 22849, 8048, 14945, 14946, 14941, 22851, 22848, 14008, 14942, 8049, 14938, 22847, 8046, 14951, 8047, 14939, 14940, 14944, 8052, 22850, 8051, 32021, 22852, 14943, 8214, 15301, 15307, 8215, 15298, 8212, 8209, 15309, 8213, 23079, 8210, 15300, 15303, 15304, 15305, 15308, 23081, 14948, 15299, 8211, 15306, 15623, 15302, 23080, 15614, 8356, 15617, 8357, 15626, 15616, 15613, 23266, 15615, 15619, 15622, 15621, 15625, 15612, 23264, 8355, 15620, 15624, 15627, 15618, 15856, 15857, 15861, 15862, 23433, 15859, 15860, 15858, 23431, 8449, 23432, 8527, 16036, 23615, 23549, 16033, 16034, 16035, 8528, 23616, 16187, 16186, 16290, 8617, 16288, 16291, 16289, 16360, 8651, 8665, 16436, 16414, 23776, 16435, 16479, 16480, 3437, 26555, 17961, 17959, 3705, 8994, 17960, 17964, 9179, 18207, 3949, 18204, 3952, 18203, 9180, 18208, 3950, 3951, 18205, 18510, 9487, 9489, 9484, 9481, 9483, 18507, 18503, 18508, 4298, 18502, 18512, 18509, 4296, 18505, 18504, 9485, 4297, 9482, 9479, 4295, 9486, 27080, 9480, 4299, 9488, 27082, 9854, 18861, 9858, 18859, 18857, 4631, 18855, 27359, 18868, 18865, 9861, 18862, 4623, 4626, 4628, 4630, 4627, 9857, 9856, 18867, 4625, 9859, 9860, 18866, 9853, 4629, 18871, 4624, 18860, 9855, 27361, 19277, 10303, 10304, 10305, 5032, 27720, 5028, 10294, 19279, 10302, 10307, 5033, 19280, 10292, 10298, 10291, 10301, 19286, 19284, 10297, 5029, 5031, 10306, 19278, 10290, 10293, 10299, 19282, 10300, 10308, 10296, 19281, 5030, 19285, 5533, 10890, 19755, 19757, 10892, 10888, 19754, 10900, 10886, 10899, 5529, 10884, 11530, 10894, 5532, 19760, 10895, 10898, 19753, 10902, 19751, 10891, 28187, 10896, 19752, 19756, 5530, 5531, 10901, 10889, 10885, 10903, 19758, 10893, 10897, 10887, 5967, 5968, 11540, 5974, 20293, 11528, 11537, 11527, 5971, 11535, 11533, 20302, 11534, 5969, 20301, 11538, 20288, 20299, 20291, 20304, 11531, 11529, 5970, 11532, 11536, 20300, 20298, 20290, 5972, 20292, 20296, 11539, 12179, 12186, 12188, 12194, 20828, 6393, 12174, 20817, 6385, 20819, 12189, 6390, 12195, 6381, 20822, 12192, 20829, 12176, 12193, 12175, 6395, 20823, 12187, 6382, 12196, 21365, 6387, 12180, 6392, 12191, 12178, 12185, 12181, 12177, 6384, 6391, 6389, 6386, 6394, 6383, 12184, 20820, 6388, 20830, 5973, 20814, 12190, 12182, 20824, 12183, 29852, 29856, 12854, 21322, 6826, 21321, 21319, 12850, 12856, 12852, 21323, 6828, 12851, 12855, 12847, 21325, 12849, 6827, 21317, 21320, 21318, 21315, 12853, 12848, 21314, 6829, 6824, 12857, 6825, 13426, 13423, 13435, 13429, 13431, 7205, 13425, 13433, 21817, 21811, 13432, 13430, 21816, 13436, 7208, 13427, 13434, 21815, 7206, 21812, 21809, 13422, 13424, 7207, 13421, 13437, 13428, 22249, 22241, 14027, 7546, 22247, 22243, 14038, 14036, 7540, 14026, 14029, 14030, 14025, 7550, 7551, 14024, 14039, 14034, 7544, 7541, 14033, 14031, 22250, 31022, 7547, 14035, 7542, 22245, 7543, 22253, 14032, 7545, 14028, 54378, 14037, 7548, 14040, 14041, 7549, 7819, 7826, 14515, 14521, 22587, 14519, 7822, 7821, 7818, 14517, 22589, 22594, 22591, 7824, 7823, 7820, 22592, 14520, 14516, 14518, 22593, 7825, 8056, 14954, 22854, 8053, 8054, 14956, 8055, 14953, 22855, 14952, 15313, 14955, 23083, 15314, 8216, 15312, 23084, 32429, 15311, 23274, 15310, 8217, 23271, 8358, 23273, 23270, 15628, 15629, 23085, 23268, 23272, 15865, 15864, 8450, 23550, 15863, 16037, 16038, 23551, 23618, 16188, 16292, 23722, 23721, 16361, 16461, 8685, 16481, 3438, 26556, 4300, 4301, 18872, 27363, 4632, 20305, 30437, 7827, 3439, 4302, 5034, 6396, 3440, 18874, 5534, 6830, 8869, 18515, 9862, 10309, 29277, 12858, 30438, 7828, 3441, 4303, 9863, 9864, 11541, 5975, 20834, 12197, 20833, 20832, 6397, 12859, 29859, 21821, 7209, 21820, 8218, 3442, 11542, 3443, 3707, 8995, 3706, 3955, 3954, 3953, 9181, 18209, 18518, 18519, 4304, 18520, 4305, 9490, 27088, 9865, 18876, 9868, 4634, 9866, 27368, 4633, 9867, 4635, 10312, 10311, 10310, 5035, 19291, 10905, 10906, 5535, 10904, 10907, 5977, 5536, 20307, 20306, 5976, 11546, 11545, 20308, 11543, 11544, 11547, 12199, 12198, 12202, 29280, 12201, 12200, 6831, 12862, 21328, 12861, 6832, 12860, 13438, 21822, 13439, 7210, 31032, 14042, 14043, 39596, 15319, 8219, 15318, 15317, 15315, 15316, 8451, 15630, 16039, 16362, 23778, 3444, 26531, 8903, 3548, 8904, 17965, 17966, 26702, 8996, 8997, 18216, 18214, 9187, 18211, 18212, 9183, 18215, 9182, 4306, 9186, 3957, 9184, 3956, 9188, 9185, 18213, 9494, 9869, 9492, 9499, 18523, 4307, 18527, 4310, 9500, 9496, 18524, 9497, 27093, 9491, 4309, 9493, 4308, 9498, 18525, 9495, 45307, 9873, 4637, 4638, 18884, 9876, 9870, 18883, 9875, 18879, 9871, 4636, 9874, 9872, 18882, 18880, 10318, 10315, 19293, 10317, 5040, 5039, 5037, 10314, 10319, 5036, 5038, 10316, 10915, 10313, 10320, 19294, 28202, 28209, 20309, 10910, 10914, 37087, 10913, 11549, 11560, 28212, 19766, 10916, 19765, 10911, 11548, 5540, 28201, 28211, 5539, 10909, 10912, 5541, 19764, 5538, 5537, 10908, 10917, 11551, 11558, 20310, 5979, 11557, 11554, 20317, 5981, 20312, 20314, 20313, 11556, 20838, 20316, 11550, 11552, 11555, 11553, 5980, 11559, 5978, 6398, 20311, 12206, 12205, 12203, 49065, 6401, 6400, 12207, 20836, 12204, 12863, 6833, 6399, 20839, 12209, 12208, 21823, 12866, 12864, 7211, 21332, 6834, 12865, 13441, 21331, 21333, 21330, 30448, 7212, 13440, 13449, 13448, 13446, 30446, 13445, 13442, 13443, 13444, 13447, 13450, 14048, 14045, 14046, 7552, 14044, 14050, 14049, 14047, 14523, 14524, 7829, 22600, 7830, 14522, 31565, 8058, 14957, 8057, 8220, 32434, 8221, 8359, 15632, 15631, 15866, 16040, 8529, 16190, 16189, 16191, 3549, 9877, 5041, 5542, 10918, 3550, 8905, 3445, 17823, 17746, 8998, 17968, 26705, 9193, 9191, 9192, 9189, 3958, 9190, 18219, 18536, 9508, 18530, 4313, 9506, 9502, 9505, 18529, 9501, 4315, 9504, 18528, 4312, 4311, 18535, 4314, 9507, 9503, 18532, 4642, 4645, 9885, 9884, 9883, 4639, 9892, 9882, 27739, 4641, 10325, 18887, 9889, 9887, 4644, 18890, 9879, 9890, 18886, 9881, 9891, 9888, 9880, 18889, 4640, 9893, 9878, 4643, 18893, 18888, 18891, 10330, 10321, 10332, 19299, 10324, 10335, 10336, 10322, 10334, 10331, 10329, 10333, 5047, 19301, 5045, 19308, 19297, 10327, 19307, 10323, 19302, 10326, 10337, 10328, 5046, 9886, 19298, 5042, 5044, 19768, 10932, 10921, 10919, 20327, 10920, 19300, 10927, 19771, 10928, 10924, 5547, 10929, 10926, 10923, 19767, 5545, 10922, 5543, 5546, 10925, 10933, 5043, 5544, 10931, 10930, 5548, 20325, 20329, 11565, 20318, 20330, 20321, 11566, 5991, 20328, 11572, 20850, 20324, 11574, 11567, 5985, 11571, 11570, 5986, 5992, 20841, 5993, 11573, 5983, 11564, 11562, 11568, 11561, 5990, 11563, 11569, 11575, 5984, 5989, 5987, 5988, 20322, 20331, 5982, 20326, 20845, 20858, 6408, 12216, 6407, 12220, 20852, 12210, 20857, 12221, 20851, 20843, 20854, 12211, 12212, 20856, 12222, 12219, 12217, 12218, 12214, 12213, 20844, 12223, 6404, 20848, 12215, 20853, 6409, 6403, 6410, 6411, 20847, 6406, 6405, 21342, 21337, 12867, 6836, 6835, 21335, 21336, 12872, 21339, 7213, 6837, 21338, 21334, 6839, 12873, 6402, 6838, 12869, 12871, 12868, 21344, 12870, 21340, 13460, 21824, 21834, 13459, 13456, 7216, 14051, 7217, 13455, 21832, 7215, 21829, 13457, 13454, 13451, 13458, 13452, 13453, 7214, 21828, 31044, 14528, 31045, 14055, 21833, 14054, 14056, 22257, 14525, 7555, 31043, 14052, 22254, 7553, 22259, 7557, 7556, 14053, 14057, 22258, 7554, 14532, 7833, 8059, 7834, 7831, 14529, 14527, 22606, 14530, 22602, 14533, 7832, 14531, 14526, 22604, 14960, 14963, 15322, 14958, 22856, 15633, 14964, 22857, 8222, 14962, 8060, 14959, 14961, 14965, 15323, 23087, 15321, 32436, 23089, 23090, 23088, 8223, 15320, 23279, 23277, 23280, 8360, 23278, 23281, 23434, 8453, 16042, 8452, 16044, 16041, 16043, 8581, 16293, 3551, 9509, 10338, 10339, 5549, 12224, 7558, 8224, 8530, 16294, 3552, 9510, 189, 27381, 18895, 9894, 18894, 9895, 18897, 19309, 10340, 10341, 5550, 5551, 20332, 28768, 11576, 12227, 12226, 12225, 12874, 20860, 12875, 12876, 6840, 21345, 13462, 13461, 21836, 22260, 14058, 7559, 7560, 22261, 14537, 14534, 14535, 14536, 14967, 14966, 8061, 15324, 15867, 3553, 4646, 19775, 5552, 12228, 20861, 3554, 27385, 10342, 5553, 19776, 20333, 5994, 5995, 38956, 3555, 3556, 8999, 3960, 3959, 4647, 9896, 11577, 3557, 3558, 3559, 3560, 26706, 3961, 3962, 9195, 9194, 18540, 4316, 9513, 9511, 9512, 18541, 18538, 27103, 18539, 18900, 9897, 9898, 18898, 18901, 4651, 4649, 18903, 4650, 4648, 18899, 5048, 19315, 19314, 19317, 19316, 5052, 5051, 10343, 5050, 5049, 19318, 10344, 19777, 5556, 10935, 10934, 5554, 5555, 19780, 19778, 5997, 5996, 11579, 20338, 20337, 11578, 5557, 20339, 28775, 29308, 6412, 12230, 6413, 12229, 20864, 29889, 29888, 12877, 13463, 7218, 14059, 22263, 22609, 14538, 32043, 8226, 8225, 32783, 23283, 8531, 3561, 9514, 20340, 5558, 12878, 6841, 17824, 18224, 9196, 9197, 9515, 4318, 4319, 18543, 27106, 4317, 18544, 4655, 4656, 4653, 4654, 18904, 9899, 18908, 27395, 9900, 4652, 10345, 19324, 5056, 5057, 19322, 5561, 10351, 27761, 5062, 5060, 10352, 10347, 5059, 5058, 5053, 10350, 10349, 10346, 5061, 19319, 10348, 5054, 27749, 5055, 5562, 10939, 10940, 5563, 10936, 10938, 10942, 10941, 10937, 19781, 5559, 5560, 11587, 6002, 6001, 11581, 5999, 28783, 11584, 6003, 11585, 6004, 11582, 5998, 6000, 11586, 20342, 11583, 11580, 29320, 12243, 20865, 12232, 6415, 6418, 6417, 6422, 6421, 12244, 12242, 12235, 12239, 12238, 6419, 12241, 12237, 12245, 12236, 6420, 6414, 6416, 20866, 12234, 21348, 12880, 6845, 12884, 6844, 12881, 6843, 21346, 12233, 12240, 12883, 29891, 6846, 12885, 12882, 12879, 13466, 13470, 13472, 13468, 13467, 13465, 7221, 7219, 7224, 7225, 13469, 7222, 13464, 7223, 6842, 13471, 7220, 22264, 14061, 31066, 14060, 14068, 14062, 14067, 14064, 7561, 14066, 22266, 22265, 7562, 31064, 7563, 22267, 14065, 14063, 31584, 31587, 7836, 14539, 22612, 22610, 7835, 14542, 14540, 14541, 40304, 40911, 7837, 22611, 22861, 14971, 22860, 8064, 14972, 32044, 32048, 8062, 14973, 8063, 14970, 14974, 22859, 14968, 8227, 15325, 8228, 8361, 14969, 8362, 23436, 23435, 8454, 15868, 8533, 16045, 8532, 23620, 16192, 8618, 8619, 59363, 16475, 17825, 4657, 9901, 6005, 6006, 3562, 3708, 9000, 18225, 9198, 3963, 18227, 4320, 27397, 4658, 4659, 4660, 10944, 10353, 5063, 27762, 27764, 5564, 10943, 19784, 11589, 6008, 20347, 11588, 6007, 20867, 20868, 12246, 7226, 13476, 13473, 13474, 13475, 31071, 31072, 22269, 40924, 22613, 14543, 22614, 14975, 32051, 32052, 23091, 15635, 15634, 33051, 16046, 3563, 9516, 5064, 20348, 6009, 12247, 29911, 21353, 12886, 21351, 7227, 14069, 14976, 15636, 3564, 18228, 18229, 4321, 4663, 9902, 4664, 4662, 18911, 4661, 10354, 5065, 19327, 19328, 5066, 5067, 5566, 10945, 5565, 19787, 19789, 19788, 20350, 11590, 5567, 6010, 12248, 6423, 6424, 29912, 6847, 21354, 6848, 7228, 7565, 14070, 7564, 31596, 14544, 7838, 22862, 14977, 15637, 3565, 3964, 9519, 9518, 4322, 9517, 4323, 9520, 27406, 9908, 4667, 4666, 9910, 9909, 4671, 18914, 4670, 18912, 27410, 4665, 27414, 9904, 9905, 9906, 27403, 4672, 9903, 4668, 9907, 4669, 19337, 19332, 10357, 10361, 10359, 10358, 27782, 10362, 19331, 27776, 19341, 10363, 10364, 10356, 27778, 10355, 19796, 5069, 5070, 19340, 10365, 10360, 19338, 10954, 19792, 10366, 5071, 5068, 19329, 19336, 10948, 28246, 10947, 19790, 10949, 10950, 10952, 10951, 10956, 5571, 5568, 5572, 10946, 5573, 10955, 5570, 10953, 5569, 19335, 19794, 28253, 20357, 20354, 11593, 11595, 11591, 11592, 20352, 20353, 11596, 11598, 11599, 11594, 11597, 6011, 12252, 20874, 12257, 12249, 12253, 29336, 20875, 12258, 12254, 6425, 6433, 20872, 6428, 12250, 12251, 6852, 6436, 6429, 20873, 6434, 6427, 12256, 6435, 12255, 6431, 6426, 6432, 12259, 12891, 12893, 29925, 21362, 29923, 29920, 21356, 21359, 21358, 21357, 21361, 6430, 21364, 21366, 12888, 6850, 12894, 6851, 12892, 12887, 12890, 12895, 6849, 12889, 7230, 13480, 13479, 21843, 7233, 7231, 13477, 7229, 13478, 21845, 7232, 31082, 14078, 22274, 14080, 22272, 14079, 14071, 14075, 14074, 14072, 7567, 7568, 7566, 14073, 14076, 14077, 22616, 7569, 22615, 7843, 14552, 22618, 7840, 14546, 7842, 7844, 31084, 22619, 7841, 14551, 14547, 7839, 14550, 14545, 14549, 14548, 22863, 22865, 14979, 8067, 8068, 8065, 22868, 8066, 22867, 22866, 14978, 32454, 15328, 23093, 23092, 8229, 15326, 15327, 15638, 15641, 15639, 15640, 15869, 23439, 33055, 8455, 16193, 16295, 33547, 8620, 16363, 16364, 8666, 3566, 4673, 19342, 11600, 20358, 12260, 33643, 3567, 3965, 27121, 4324, 18915, 9911, 9912, 5072, 28258, 11601, 6012, 6437, 7845, 14553, 15329, 15642, 3568, 18232, 18233, 9526, 9521, 9523, 9525, 9524, 9522, 4325, 4674, 9921, 18918, 9916, 9913, 18920, 18923, 9920, 18916, 18919, 4676, 4677, 9919, 9918, 9917, 9914, 9915, 9922, 4675, 18922, 5076, 5082, 5081, 10375, 10369, 10367, 19345, 5079, 10963, 5074, 10372, 10376, 10378, 10374, 10368, 5080, 10373, 10371, 5073, 10379, 5083, 10377, 5077, 10370, 19346, 5078, 5075, 19805, 5575, 28260, 10964, 19806, 19800, 10957, 10959, 10961, 19802, 10962, 10960, 5576, 19804, 10965, 19803, 10958, 11605, 6013, 11613, 20363, 11602, 48236, 11614, 20360, 11603, 11604, 20364, 28815, 11612, 11611, 11608, 5574, 6014, 11606, 11609, 6015, 11610, 11607, 20361, 20884, 12271, 20880, 12275, 6444, 20881, 12901, 6447, 12273, 20890, 20876, 12270, 12265, 12267, 12268, 12261, 20888, 6443, 20878, 20883, 6442, 20887, 6438, 12264, 20877, 6445, 20889, 6446, 12263, 12266, 12274, 6440, 6441, 12272, 12262, 29942, 12903, 6854, 12905, 12269, 12907, 6858, 12908, 12904, 21367, 6855, 12900, 6857, 12897, 12902, 12906, 12899, 21368, 21374, 6439, 21373, 12896, 6856, 12898, 21369, 7236, 13482, 7240, 30512, 7238, 30510, 21849, 6853, 21852, 13489, 13490, 7235, 21847, 21851, 13488, 13491, 7237, 7234, 13484, 13481, 13486, 13483, 7241, 13485, 21850, 21848, 13487, 7239, 22278, 7571, 14087, 22281, 14081, 14085, 14091, 14092, 14088, 14089, 14086, 30516, 14083, 31097, 7573, 7570, 14082, 14084, 22279, 7572, 14090, 7849, 22623, 22625, 14560, 14554, 7848, 31613, 7846, 22624, 14562, 7847, 14557, 14558, 14555, 14563, 14559, 31615, 7850, 14556, 14564, 14561, 22876, 22871, 22873, 14983, 22872, 22869, 14980, 22875, 8069, 32071, 14984, 14986, 14985, 14981, 14982, 22877, 15334, 23094, 8230, 23095, 15331, 15333, 15330, 15335, 32463, 23096, 15332, 15644, 15647, 15643, 8363, 15645, 15646, 15648, 8364, 8366, 8365, 15870, 23442, 15872, 23440, 15871, 23441, 16047, 23621, 16296, 16365, 3569, 17972, 9199, 4326, 9528, 4327, 4328, 9527, 9927, 9926, 4678, 4681, 4680, 4679, 9923, 9925, 9924, 10382, 5085, 10386, 10385, 10384, 10380, 5084, 5088, 5091, 19348, 19349, 5092, 10381, 10383, 5090, 5089, 5087, 5086, 10972, 19351, 10970, 10966, 5577, 20365, 10967, 5578, 10968, 10969, 10971, 19809, 5579, 19808, 11618, 20366, 11617, 11616, 11615, 20371, 20369, 28821, 12279, 6448, 29365, 12276, 12278, 20891, 6449, 20896, 6450, 12277, 20892, 20370, 21377, 12917, 21376, 12910, 12911, 39009, 6861, 6859, 6860, 12919, 39011, 12918, 12915, 12914, 12913, 12912, 12916, 12909, 13492, 13497, 13495, 21855, 21856, 21854, 13494, 13493, 13496, 14093, 22283, 7574, 7851, 14566, 22284, 7852, 14565, 14988, 14987, 8070, 22878, 15336, 8231, 15649, 8534, 16048, 23622, 16298, 16297, 8906, 4682, 4683, 10973, 6452, 3570, 3968, 3967, 3966, 26861, 18547, 18546, 9529, 18548, 18551, 4330, 4329, 18553, 4686, 9929, 9932, 9930, 18927, 4684, 4685, 18925, 18926, 9928, 9931, 18928, 5099, 19353, 19352, 19358, 10393, 10395, 10394, 5096, 10389, 19355, 19360, 5094, 5093, 19356, 5097, 5095, 19357, 5098, 10392, 10387, 10388, 10391, 10390, 19361, 19812, 19810, 19814, 19813, 10976, 10977, 10975, 19815, 10974, 5580, 20372, 6020, 48261, 11619, 11621, 11623, 6019, 48256, 20373, 6017, 20376, 11620, 6018, 11622, 6016, 20375, 20900, 12289, 12280, 12283, 12287, 6456, 12285, 29375, 12284, 12281, 12282, 6454, 12288, 6453, 20903, 6458, 6457, 6455, 29369, 12286, 12925, 29952, 12924, 21380, 21382, 12920, 21385, 21384, 6862, 12923, 12922, 6863, 21387, 30522, 29953, 30530, 7246, 21860, 13499, 21861, 7247, 7243, 7245, 21865, 7242, 7244, 21858, 21862, 14094, 22287, 7577, 14096, 14095, 22627, 12921, 7579, 7578, 7575, 7576, 22289, 22286, 14571, 31624, 14569, 7853, 14570, 31623, 14572, 14568, 14567, 14989, 8073, 8071, 8072, 23099, 32466, 23098, 15337, 15338, 8233, 23100, 8232, 15651, 15652, 15650, 23285, 16049, 16050, 23679, 23680, 3571, 9001, 3969, 9530, 4332, 4331, 9531, 18929, 18932, 9934, 4687, 9933, 4688, 18934, 18933, 5100, 10398, 10396, 10402, 5101, 10397, 10401, 10399, 10400, 10978, 10980, 19821, 5581, 19820, 10979, 5582, 6023, 6022, 6021, 11624, 19819, 28832, 12292, 6459, 6460, 20905, 12291, 12290, 20906, 12926, 6865, 6864, 12927, 12928, 7249, 7248, 21866, 14100, 13500, 13502, 13501, 14099, 14097, 14101, 14098, 40375, 7580, 22292, 31120, 22291, 14573, 7854, 14574, 14575, 22631, 8074, 8075, 32472, 8367, 23446, 23445, 8582, 3572, 18235, 18236, 27130, 18556, 18939, 9935, 18940, 18938, 18936, 18937, 10403, 5102, 19366, 19369, 19370, 19367, 5733, 5732, 19822, 20384, 6025, 11626, 6024, 11625, 20383, 29382, 20908, 20909, 12293, 21389, 6866, 12929, 6867, 21390, 22293, 22632, 22633, 31631, 22882, 8368, 15653, 23552, 3709, 4333, 9532, 18942, 4690, 18941, 4689, 9936, 9937, 10405, 10407, 5103, 10409, 10412, 10410, 19374, 27810, 19373, 10411, 10408, 10404, 5104, 10413, 10406, 19375, 19827, 19828, 10989, 5588, 10998, 5585, 19826, 10991, 5589, 19830, 5583, 19825, 10986, 10999, 10987, 10984, 5587, 28291, 5584, 28289, 10990, 10993, 5586, 10994, 5590, 10995, 10985, 10992, 10996, 10988, 10983, 10981, 19829, 10997, 10982, 37791, 11633, 20394, 20391, 20388, 11629, 11635, 6028, 11628, 11630, 6026, 11627, 6033, 11631, 6032, 11632, 6034, 6029, 6035, 6030, 20392, 6031, 20385, 6027, 20389, 11634, 20914, 29398, 6463, 12304, 20911, 12307, 12295, 12300, 12294, 6465, 20920, 12298, 29389, 20912, 20390, 12296, 6464, 20919, 12303, 12302, 12299, 12301, 12297, 6871, 12306, 6461, 12305, 20916, 21391, 12945, 21393, 6878, 12940, 21401, 6877, 12930, 29966, 12932, 6870, 12937, 12936, 12939, 6875, 12934, 12933, 21395, 21399, 6874, 6869, 12935, 6872, 12941, 12943, 12938, 12931, 6873, 21392, 21398, 7257, 6868, 29959, 21397, 12944, 29971, 13506, 7250, 21867, 13508, 30560, 7251, 21876, 21868, 7253, 13511, 30545, 13503, 6876, 13509, 30538, 30566, 30539, 30559, 13505, 21871, 6462, 7256, 30550, 30543, 7252, 30555, 7254, 7255, 30541, 7583, 13510, 13504, 7258, 21874, 13507, 14111, 14106, 31126, 40398, 14116, 7581, 14108, 7585, 14114, 14105, 14102, 14117, 7860, 7586, 14113, 14103, 7584, 14107, 7588, 14104, 14109, 7587, 14112, 14115, 22296, 22297, 14593, 14594, 14578, 14585, 14583, 31646, 22636, 7858, 14590, 14110, 22634, 14581, 22637, 14591, 7857, 14580, 14579, 14589, 14586, 14588, 31635, 14576, 14592, 7855, 22639, 14587, 14596, 14584, 7859, 7856, 14582, 14577, 14595, 7582, 22640, 31638, 22638, 14992, 22889, 22887, 14990, 14996, 8079, 14994, 14993, 8081, 14999, 8080, 22890, 15000, 14997, 8077, 14998, 14991, 8078, 8076, 15342, 14995, 22885, 15001, 15339, 23108, 23107, 32475, 8238, 8236, 15341, 32473, 15343, 15340, 8237, 8234, 8235, 8239, 8370, 23287, 15658, 42482, 15657, 15655, 15654, 15656, 23286, 8369, 8371, 8456, 23449, 33072, 15874, 15873, 23288, 23448, 16051, 23555, 16053, 16055, 16054, 16052, 23554, 23624, 8536, 8535, 23623, 8584, 8583, 8585, 16195, 16194, 16366, 16299, 16367, 8652, 23723, 8653, 16415, 33710, 23807, 8690, 3710, 18558, 9533, 18557, 18943, 9939, 9940, 9938, 18945, 18944, 4691, 9941, 9942, 9943, 19380, 10414, 10420, 19377, 19379, 10418, 5105, 10416, 19381, 10417, 10419, 19376, 10415, 5591, 19832, 11000, 5593, 11002, 5592, 11001, 19833, 19834, 19863, 19835, 28295, 11637, 6036, 20398, 11639, 11636, 11003, 20400, 6037, 20399, 20397, 11638, 20923, 12310, 20927, 6466, 12308, 6467, 12309, 6468, 29975, 21403, 21402, 6879, 12949, 12946, 12948, 6880, 6881, 12947, 21886, 21888, 21884, 13512, 21887, 21890, 13513, 21889, 7259, 13515, 13514, 21885, 190, 31149, 14121, 14122, 14118, 22300, 14119, 7589, 7590, 14120, 7866, 22644, 22643, 7862, 7867, 7863, 7865, 7861, 22302, 7864, 22894, 32111, 32112, 22893, 8082, 14597, 56736, 15345, 32487, 15344, 15659, 8372, 8373, 16057, 15875, 23760, 16056, 23625, 16368, 16437, 3711, 18237, 3970, 18560, 9534, 4334, 18559, 4694, 9946, 4692, 9944, 4697, 4693, 4698, 4696, 9945, 4695, 5109, 5108, 10431, 5117, 10424, 10430, 5113, 10423, 10429, 10427, 5112, 5114, 10426, 5107, 10425, 5118, 5115, 5119, 5116, 10422, 10421, 10428, 5110, 5106, 5111, 27828, 19386, 19390, 11018, 11011, 28863, 6042, 11010, 19842, 5597, 5604, 5601, 5607, 5606, 5602, 19839, 11004, 11007, 19840, 11006, 5598, 11008, 11017, 5599, 11005, 11014, 11015, 5600, 11012, 5605, 5595, 5603, 11009, 5594, 11013, 19847, 19837, 11016, 19844, 20417, 11656, 11647, 6039, 11654, 11651, 11643, 11652, 6041, 11644, 20406, 11640, 20403, 20411, 6474, 11649, 20412, 6038, 11655, 20405, 6045, 6047, 11642, 20409, 28864, 6046, 11645, 6040, 11653, 11646, 11650, 20407, 11648, 6043, 11641, 6048, 5596, 6044, 6049, 20401, 20418, 20416, 20938, 6470, 12317, 12319, 12321, 12325, 20408, 12315, 12313, 6472, 29408, 12320, 12324, 12316, 12312, 20937, 12311, 20940, 20931, 20933, 12322, 12314, 12318, 6473, 20929, 6471, 12326, 6469, 12323, 20935, 12966, 20939, 20941, 20934, 6884, 12958, 7272, 12968, 6887, 12972, 6893, 12953, 21421, 29982, 12969, 12950, 21414, 12971, 12954, 21415, 6900, 6897, 12970, 12964, 6883, 6891, 6890, 21417, 6889, 6895, 21410, 12951, 6896, 12965, 6892, 6882, 12967, 6885, 6886, 6894, 12956, 12955, 12952, 29983, 12960, 12957, 12961, 6899, 21409, 12973, 6888, 12962, 12963, 21418, 12959, 21420, 21412, 6898, 21903, 13520, 7264, 7273, 7269, 13517, 21899, 7266, 7270, 13529, 7260, 13521, 21895, 7268, 21905, 21916, 13524, 13519, 7267, 7271, 13518, 21915, 7265, 21894, 13528, 7262, 13527, 13526, 7274, 13280, 7261, 21912, 13525, 13516, 21892, 7275, 13523, 7263, 21909, 21910, 21906, 21913, 21908, 21901, 21900, 13522, 30586, 7593, 7598, 7591, 14135, 14126, 14138, 14130, 14136, 7599, 7592, 14123, 14129, 14139, 14132, 14137, 14125, 31157, 22304, 14133, 7594, 14131, 7597, 7596, 14127, 14128, 14124, 14134, 7595, 14141, 14140, 22309, 22308, 14608, 14604, 7874, 22648, 14598, 7868, 7884, 14610, 7876, 7872, 14601, 7879, 7882, 14612, 7871, 14603, 7880, 14614, 14611, 14599, 7875, 7869, 7883, 14606, 7878, 14600, 7873, 14613, 7877, 7870, 14607, 7881, 14605, 14609, 22649, 32116, 22898, 15003, 15009, 8088, 15012, 8083, 8084, 15004, 15011, 15006, 8089, 8086, 22900, 15002, 22897, 8085, 15008, 15010, 8087, 15007, 15005, 32115, 22899, 15355, 8243, 8244, 8240, 23111, 8241, 23113, 15351, 15349, 23114, 15353, 8245, 15354, 15347, 15346, 15350, 15348, 8242, 15352, 15660, 8376, 8375, 15661, 23293, 15663, 15662, 8377, 23456, 23453, 15880, 15877, 15878, 23454, 15876, 15879, 8458, 15881, 23455, 8457, 16058, 23557, 8586, 8588, 16196, 8587, 16300, 16370, 16372, 16369, 16371, 8672, 33739, 23802, 3712, 26938, 4699, 10295, 5120, 19850, 5608, 11657, 11658, 21424, 14142, 7885, 14615, 22652, 22901, 8090, 15357, 15356, 8378, 15882, 23558, 16059, 8621, 9002, 26602, 4335, 3971, 9947, 18563, 10437, 10432, 10436, 10434, 5121, 10435, 10433, 19391, 11019, 28868, 11659, 11660, 12329, 12330, 6476, 6477, 12328, 12331, 12327, 6475, 21425, 6901, 21426, 6478, 12974, 7276, 13530, 7277, 21917, 7600, 14145, 14143, 14144, 14618, 14617, 14616, 56088, 32125, 15358, 32508, 8246, 15359, 16060, 8622, 16301, 3713, 4337, 4336, 9949, 4700, 18954, 27839, 9948, 10439, 19392, 5122, 11020, 10438, 19394, 27838, 19393, 5610, 11023, 11021, 11022, 5609, 11662, 11663, 11661, 20945, 6481, 12333, 12332, 12334, 6480, 6479, 29991, 13531, 13533, 21918, 7278, 13532, 14146, 7601, 15014, 22902, 15013, 8247, 15360, 8249, 8248, 15664, 15883, 8459, 3714, 9950, 4701, 10442, 5124, 10441, 10440, 19397, 5123, 19398, 11029, 28322, 11031, 11024, 11025, 5611, 11026, 5612, 11030, 11027, 11028, 5613, 20420, 6051, 6052, 20421, 11664, 12335, 12336, 20949, 12978, 6904, 6902, 6903, 12975, 12976, 50157, 12977, 13538, 21919, 13539, 7279, 13536, 13535, 13537, 13534, 7604, 14147, 7602, 7603, 14620, 7886, 14619, 14871, 22653, 15015, 15016, 8091, 22906, 8092, 7887, 15361, 15362, 15665, 8379, 3715, 3716, 5126, 4338, 5125, 9951, 19855, 27452, 19399, 6053, 3717, 4703, 9952, 9953, 4702, 4704, 3718, 27136, 9954, 5128, 10443, 5130, 5127, 5129, 19856, 11034, 5614, 19858, 11033, 11032, 28881, 12337, 21433, 12979, 29997, 7280, 7605, 14149, 14148, 22654, 14621, 32134, 22907, 23296, 15884, 33289, 33288, 3719, 9200, 9535, 4705, 9955, 46624, 10445, 27849, 19404, 19403, 5131, 10444, 5132, 19402, 11036, 19862, 19861, 5616, 11035, 11037, 19860, 5615, 20425, 11666, 11667, 11665, 6054, 29419, 6482, 20950, 6483, 30004, 6906, 21434, 12981, 12980, 6905, 21437, 20424, 21436, 13540, 21921, 21923, 13541, 21924, 21922, 21925, 14150, 31173, 22312, 7891, 7890, 7888, 7889, 7892, 22655, 15017, 8094, 8093, 15363, 15666, 23297, 23298, 23299, 8538, 8537, 3720, 46627, 10244, 6485, 6055, 6484, 6907, 50165, 3721, 8907, 3722, 3723, 17974, 17975, 9536, 9203, 18239, 9204, 3973, 18241, 9201, 3972, 18240, 3975, 9202, 3977, 3976, 9205, 3974, 26869, 18238, 4343, 4341, 9538, 18571, 4340, 18576, 18573, 18564, 4345, 4347, 4344, 18574, 9541, 9537, 4348, 18567, 4342, 3978, 18569, 4346, 9540, 18572, 27139, 9539, 27144, 4339, 9961, 4709, 4710, 9963, 18963, 9957, 9960, 9969, 9967, 18957, 4711, 9973, 4714, 9970, 9962, 9959, 18958, 18955, 11669, 9968, 4706, 9971, 9956, 9965, 4708, 4713, 9966, 4717, 4715, 18962, 9958, 4712, 18961, 9964, 4716, 4707, 9972, 5137, 19407, 5146, 5135, 5133, 10447, 5141, 5138, 10449, 19405, 19413, 5140, 10448, 10446, 10451, 5145, 5143, 11668, 19406, 10452, 10450, 5134, 19409, 19408, 5136, 5139, 19410, 5142, 18960, 5144, 20433, 11047, 5618, 19874, 11038, 11040, 19872, 11041, 28338, 11049, 11045, 11043, 28884, 11046, 11050, 5619, 5623, 11039, 28332, 11048, 28341, 5621, 19866, 5620, 11044, 11042, 19867, 5617, 5622, 19870, 19873, 6061, 11677, 20427, 28887, 11675, 6063, 28896, 20432, 20434, 20430, 11670, 12351, 20426, 6062, 11674, 20429, 20431, 11671, 6058, 6064, 11676, 6060, 11673, 6908, 6059, 11672, 6065, 6057, 6056, 47433, 12343, 12341, 20958, 12347, 20961, 12339, 12352, 12344, 20952, 12338, 6489, 6495, 12349, 29430, 12342, 20953, 6492, 20954, 20964, 6490, 12350, 6487, 6486, 12345, 6491, 6066, 20959, 12348, 12340, 6488, 6493, 6494, 20963, 6913, 6909, 21438, 6914, 12984, 21441, 30010, 12983, 12985, 6911, 12982, 6912, 12988, 12987, 12986, 30023, 6910, 31184, 21928, 21930, 21926, 13545, 21929, 13548, 7286, 13547, 7285, 7281, 7282, 7283, 13544, 13543, 7284, 21927, 13546, 13542, 14152, 14162, 7608, 7607, 22318, 14156, 14158, 22316, 14153, 22313, 14157, 14151, 14160, 7606, 14159, 14155, 14161, 22656, 14154, 7895, 14622, 14628, 7899, 7901, 7898, 7897, 31684, 7896, 7894, 14623, 14626, 7893, 14627, 22657, 7900, 14625, 56773, 14624, 8095, 22910, 8096, 15020, 15018, 15019, 23116, 15365, 23117, 15364, 8250, 15668, 8380, 15667, 15885, 16061, 8539, 16373, 16374, 8589, 3724, 27147, 4349, 11678, 6915, 7902, 14629, 3725, 26872, 5148, 5147, 11679, 20436, 28901, 30615, 14163, 3726, 4718, 28902, 20437, 11680, 11681, 11682, 6916, 7609, 3727, 27148, 4350, 9974, 5149, 10453, 5624, 20438, 11683, 6496, 6917, 7610, 7903, 8097, 15366, 3728, 4351, 18578, 27149, 5150, 11051, 6067, 21442, 6918, 12989, 13549, 22319, 22913, 23118, 3729, 6068, 12353, 6919, 3730, 9542, 9975, 4719, 18965, 10455, 27870, 19418, 5153, 19419, 5151, 5152, 5154, 19416, 10454, 11056, 11053, 11055, 5625, 5627, 5626, 11052, 5628, 11054, 11684, 11685, 11686, 12356, 20967, 12357, 29435, 12355, 12358, 29434, 6497, 12354, 21444, 6920, 21445, 13554, 13550, 13553, 13555, 13552, 13551, 14164, 14165, 14166, 7611, 7612, 14631, 14630, 14632, 15022, 15021, 15368, 23119, 15369, 15367, 23120, 8381, 32817, 15669, 15670, 23458, 16062, 16197, 16302, 3731, 3979, 7904, 3732, 11057, 11687, 23121, 8629, 9003, 26558, 17977, 9004, 9006, 3733, 9007, 9005, 26710, 9213, 9214, 9208, 18243, 26880, 26874, 9212, 3981, 18244, 3982, 9209, 9207, 9206, 9210, 3980, 9211, 9976, 18246, 26878, 9547, 4354, 9546, 9548, 18581, 4353, 9553, 4357, 9543, 9557, 9563, 4364, 9560, 4361, 18592, 9550, 9556, 9558, 18587, 9545, 4360, 4355, 9551, 4362, 4365, 4359, 18593, 4352, 9555, 9549, 9562, 4367, 4363, 4358, 9554, 5155, 9552, 4356, 4366, 27161, 9544, 27165, 9559, 9561, 18579, 18589, 27162, 18979, 4736, 4730, 4738, 4735, 9983, 9986, 4731, 18967, 9977, 27473, 4724, 4734, 18968, 4737, 4739, 9998, 9989, 18981, 4723, 9997, 4727, 4725, 4720, 9981, 18975, 9996, 9985, 9988, 10001, 18977, 4740, 9995, 4732, 9990, 10000, 9987, 9991, 9994, 18966, 18971, 9979, 9999, 9993, 18972, 18983, 9978, 45993, 9982, 4733, 4728, 4721, 4726, 4722, 4741, 9980, 10472, 4729, 27476, 18982, 9992, 9621, 18980, 10475, 5169, 19429, 10459, 27884, 10470, 10466, 19878, 10485, 19420, 10477, 19426, 10467, 19892, 10476, 10461, 10465, 10488, 5172, 10480, 10471, 5156, 10486, 10457, 27881, 10479, 27890, 5171, 5166, 10456, 5164, 5163, 5168, 10478, 5160, 5167, 9984, 11688, 10473, 27886, 18580, 10463, 5170, 10464, 10468, 5173, 10458, 10482, 20452, 10481, 10489, 5162, 5159, 10487, 10483, 10474, 10469, 5165, 5161, 10460, 5157, 10484, 5158, 27883, 10462, 19421, 19430, 18818, 28364, 19879, 19882, 11063, 11065, 11070, 11090, 5642, 5632, 19885, 11062, 5643, 5644, 11073, 11080, 11086, 19881, 11067, 28370, 11074, 19880, 19894, 5645, 11088, 11083, 5640, 5638, 11079, 11075, 11061, 5629, 11066, 11058, 19886, 5637, 5639, 11071, 11068, 5634, 11084, 5631, 11069, 11729, 11077, 19895, 11076, 5630, 19888, 5641, 19883, 5633, 11059, 11064, 11081, 11087, 5646, 11060, 11072, 11078, 5636, 28372, 19889, 11089, 11082, 11085, 19896, 5635, 28929, 11704, 11692, 6076, 11721, 11730, 11733, 6074, 11700, 11725, 11701, 11715, 6087, 11711, 6084, 20459, 11712, 11689, 37866, 11726, 20444, 20454, 6093, 11723, 11713, 11735, 11708, 12390, 20442, 11738, 6091, 11706, 11718, 6094, 6073, 11710, 11736, 11703, 11696, 11707, 20460, 11695, 11693, 6069, 11727, 11702, 11731, 20440, 11732, 6077, 6082, 6078, 6086, 11722, 6079, 11714, 11698, 6071, 11690, 11724, 11734, 11697, 6085, 11739, 11709, 20447, 11705, 20457, 6070, 6090, 20455, 11720, 6092, 20445, 11716, 6081, 6075, 6083, 6072, 6089, 11717, 11699, 11719, 11694, 11728, 20453, 28928, 20458, 20451, 20443, 11737, 20456, 11691, 12389, 20974, 12411, 6451, 12394, 20978, 12392, 12371, 6501, 12387, 12407, 12383, 6509, 12406, 12381, 6088, 12397, 12382, 12404, 6508, 6500, 20987, 12360, 12368, 20982, 12393, 12385, 12410, 12388, 6514, 12405, 20973, 6505, 20991, 12391, 12399, 12372, 12398, 20968, 12415, 12367, 12400, 20980, 12413, 20992, 12361, 6080, 20993, 12375, 12374, 6507, 20979, 12378, 12380, 12395, 12412, 6510, 20985, 6511, 20977, 12366, 6503, 12370, 12408, 6512, 29457, 6504, 6506, 6513, 12414, 12401, 12396, 20989, 20976, 12377, 12376, 6502, 12362, 6499, 12386, 12363, 12384, 20975, 29454, 12373, 12409, 20971, 20986, 29443, 6498, 20988, 20969, 12369, 29459, 12365, 12403, 12364, 6933, 13029, 21452, 21467, 13012, 21450, 21455, 12990, 13020, 6925, 13005, 13015, 6928, 13008, 6926, 12993, 13023, 12992, 13011, 21459, 12991, 21456, 30061, 13009, 13018, 13016, 13004, 12999, 12997, 21465, 12998, 13017, 13028, 13006, 6927, 21458, 13001, 21457, 13021, 21464, 6930, 13000, 12994, 13010, 6934, 21449, 30041, 6922, 6931, 13002, 12996, 21453, 6924, 12402, 6923, 13013, 20983, 6921, 6936, 6929, 13014, 13003, 12995, 13022, 13007, 6935, 13026, 6932, 13025, 21462, 13019, 13024, 21461, 21466, 13027, 21460, 13595, 13596, 13583, 13582, 13578, 7298, 21948, 7290, 13598, 13597, 12359, 13575, 13579, 13573, 21937, 13592, 13577, 21935, 13599, 13570, 13568, 13580, 13590, 13585, 7300, 13559, 21933, 13589, 21945, 21939, 21953, 7301, 12379, 13571, 13562, 13565, 13603, 13572, 13563, 13561, 13558, 30639, 7294, 13581, 7293, 7297, 13576, 13584, 7287, 13600, 13604, 7289, 21944, 13567, 13587, 13591, 13564, 13601, 7296, 30623, 7295, 13556, 7299, 13594, 13566, 13586, 13560, 13574, 13569, 7291, 7292, 13588, 13605, 13602, 13593, 30637, 21946, 21947, 21951, 30633, 13557, 7288, 14183, 22335, 14174, 14177, 22327, 7618, 14179, 14168, 14175, 14181, 7615, 7619, 7613, 22334, 22325, 14170, 14186, 30648, 31226, 14180, 31211, 14171, 14195, 14189, 14167, 14651, 14173, 7614, 22333, 14184, 22329, 14194, 7622, 22331, 14191, 14172, 14178, 14182, 14176, 14196, 14193, 14190, 7616, 7617, 7621, 14169, 14197, 7620, 14187, 22324, 22330, 14185, 14188, 14664, 14645, 14650, 14663, 14649, 14641, 14646, 31707, 7907, 22664, 14634, 14658, 14660, 14633, 7906, 14662, 14654, 7913, 14661, 14647, 7915, 14639, 14192, 14655, 14652, 14635, 14666, 7909, 22661, 22662, 7910, 14637, 14653, 22666, 14665, 14656, 14643, 7912, 7908, 14657, 14644, 14667, 14638, 14648, 14659, 14640, 14642, 31709, 7916, 14636, 7914, 8099, 7905, 22665, 22669, 7911, 8103, 15038, 22917, 15028, 15023, 15029, 15039, 15043, 15042, 8105, 8104, 22919, 32159, 15030, 15044, 15033, 15025, 22920, 15027, 15026, 15032, 15037, 15024, 15031, 15036, 8102, 32155, 15034, 22916, 8100, 15035, 8098, 8101, 15385, 15040, 8254, 23123, 15377, 15381, 15373, 15376, 23122, 15384, 8252, 15389, 15382, 32519, 15374, 15390, 15383, 8255, 8256, 15387, 23125, 15375, 8251, 8253, 15370, 15378, 15372, 23308, 15388, 15386, 15371, 15379, 32520, 23128, 15677, 8257, 15380, 8383, 8385, 8382, 23303, 15682, 15674, 15672, 15676, 15673, 23305, 23309, 15678, 15680, 8386, 8388, 23313, 15679, 8389, 8387, 15681, 23311, 32828, 23314, 23304, 8384, 23312, 23464, 23463, 8460, 15886, 15892, 8462, 15675, 15891, 23465, 15898, 15889, 15896, 15895, 15671, 15890, 15041, 15899, 15888, 15893, 23461, 15897, 15887, 23459, 16066, 8461, 15894, 23460, 16202, 16067, 16065, 16063, 16064, 16068, 8590, 16200, 16198, 16203, 16201, 23628, 16204, 8591, 16199, 23608, 23725, 16303, 16375, 16376, 16377, 23726, 23779, 16470, 16462, 9008, 4368, 4742, 27895, 10491, 10490, 5174, 5647, 11092, 19900, 19897, 11091, 19898, 6095, 6516, 20462, 6515, 6517, 39149, 13030, 13606, 14198, 14200, 14199, 54678, 7917, 14668, 15045, 16438, 3734, 18248, 9566, 9567, 9565, 9564, 4369, 10005, 10003, 18990, 18985, 10002, 18987, 4743, 4745, 4744, 10004, 18991, 19436, 10503, 10500, 10498, 27900, 19439, 5175, 10501, 5180, 10495, 10510, 19442, 10512, 10496, 19441, 5177, 10513, 10508, 10494, 10499, 10509, 10505, 10502, 19438, 5182, 10511, 10497, 19437, 19443, 10506, 10492, 5181, 5178, 10504, 19440, 10507, 10493, 5179, 5176, 28383, 19903, 5657, 11099, 5656, 19901, 11102, 11105, 5653, 5651, 11094, 11103, 11101, 11098, 11106, 11107, 11109, 11110, 11093, 5650, 11096, 11095, 11108, 5652, 11097, 5654, 5649, 11100, 5658, 28393, 5655, 11104, 6102, 11754, 28938, 11743, 6099, 20463, 12421, 11752, 11740, 6097, 11745, 6100, 11749, 11747, 6103, 6096, 28943, 20464, 11741, 11744, 6101, 28936, 11742, 37878, 11753, 11751, 11746, 11748, 11750, 6098, 20469, 12422, 12428, 12418, 12424, 6518, 12420, 6524, 20997, 20998, 6523, 21002, 6522, 12427, 6525, 6526, 12417, 12430, 6527, 6521, 6520, 12426, 6528, 12416, 12419, 12429, 12425, 29478, 29471, 13062, 13051, 6519, 38506, 20999, 21001, 6943, 13039, 13060, 13040, 6938, 21478, 13037, 29474, 13046, 13038, 6940, 13032, 13059, 6941, 13056, 13057, 13033, 6946, 13048, 21473, 13042, 13049, 13036, 30079, 13061, 13053, 13047, 13031, 6942, 13054, 21468, 6945, 13058, 21475, 13052, 6939, 13050, 21472, 13044, 6937, 13035, 13043, 13055, 13041, 21477, 13045, 21474, 7311, 12423, 13624, 13633, 13623, 13619, 13616, 7312, 13614, 6944, 13607, 7310, 13613, 7309, 13618, 13615, 13631, 13626, 13620, 13625, 7305, 13617, 13636, 13608, 13609, 13632, 7306, 13637, 7308, 13638, 13622, 13034, 13628, 13621, 13630, 13627, 39814, 21962, 30651, 13612, 7303, 13635, 7304, 13610, 7307, 14211, 13629, 13634, 30660, 21958, 14208, 7302, 7623, 14218, 14214, 31235, 14212, 14207, 14222, 22336, 22338, 31243, 7627, 22340, 14203, 14215, 14216, 14206, 14205, 14219, 31240, 14209, 14204, 14210, 22343, 14221, 14202, 14220, 14217, 7625, 7624, 31232, 22339, 7626, 14213, 14201, 14670, 7923, 14674, 14671, 14678, 14684, 14673, 22679, 14693, 7920, 14687, 14676, 14688, 14683, 14690, 14675, 7925, 7924, 14677, 14691, 14669, 14689, 7918, 22678, 14681, 14680, 14685, 14672, 7922, 22680, 7926, 14679, 14686, 7927, 14682, 22675, 22673, 7919, 7921, 15058, 15056, 23131, 22927, 15062, 15060, 15063, 22929, 15049, 15057, 15067, 14692, 15053, 8109, 13611, 15048, 15061, 15055, 15052, 15047, 15046, 15066, 22924, 15051, 15050, 8107, 15059, 22925, 8106, 22926, 41681, 8108, 15054, 15065, 15394, 15395, 23135, 8261, 15392, 8258, 15400, 23130, 8262, 15402, 15391, 15064, 15404, 15393, 42146, 8259, 15399, 23132, 15401, 15396, 15403, 15398, 15397, 8260, 22928, 23134, 15684, 15685, 23316, 15687, 8390, 8391, 15688, 15686, 23315, 15683, 23466, 15902, 15905, 15901, 32529, 8466, 15903, 8465, 8464, 8463, 15904, 16073, 16071, 23562, 16070, 15900, 16072, 15906, 16069, 23630, 16207, 16173, 16205, 8592, 16206, 16208, 16306, 8623, 16305, 16304, 8624, 33560, 8654, 16416, 16440, 16439, 16441, 3735, 10006, 18993, 10514, 10515, 19907, 20471, 20470, 11755, 48456, 15907, 16307, 3736, 4746, 10007, 19444, 28394, 11111, 5659, 11757, 11756, 6104, 21006, 6529, 13639, 7313, 21964, 7314, 22344, 22345, 31250, 7628, 8625, 3737, 18994, 10008, 4371, 10010, 10009, 4747, 10516, 19447, 10523, 5183, 10521, 10519, 19450, 10526, 10517, 10518, 5184, 19445, 5188, 19446, 19448, 10527, 5187, 10525, 10522, 10520, 5185, 5186, 10524, 19449, 5661, 11112, 19915, 5666, 11128, 5665, 11130, 19911, 19917, 11118, 5663, 11129, 19909, 11113, 5664, 11125, 11121, 11123, 11117, 11124, 19908, 28402, 5660, 11120, 19916, 11119, 11115, 19910, 11126, 19912, 19914, 11122, 11114, 19913, 11116, 5662, 11127, 6107, 11768, 28948, 20477, 20479, 11764, 11766, 11761, 11760, 11758, 20474, 11765, 11767, 11763, 20476, 11762, 6105, 6106, 11770, 6537, 12432, 12438, 12433, 12434, 21007, 12439, 38521, 6539, 29486, 6531, 6538, 12431, 11759, 6534, 6532, 12437, 12436, 6533, 6535, 12435, 6530, 21008, 6536, 21965, 13064, 6953, 21488, 21481, 13075, 13074, 21486, 13069, 6955, 13073, 13065, 13066, 6947, 6949, 21483, 13071, 13063, 6951, 6950, 13067, 13072, 13070, 6952, 13068, 21480, 21485, 11769, 6948, 21487, 13640, 13647, 7316, 30681, 13651, 7320, 13643, 13641, 30673, 13650, 21966, 7315, 13649, 7317, 7318, 13642, 7319, 13648, 13644, 13645, 13646, 6954, 21967, 14223, 14235, 31258, 7633, 14230, 14232, 22346, 7631, 14224, 14228, 31255, 14231, 7629, 7632, 14234, 14226, 14227, 14233, 14225, 14229, 7630, 14695, 14694, 7929, 14700, 7931, 22685, 31743, 7928, 14696, 7932, 14697, 22684, 22682, 14698, 14701, 22687, 7930, 15072, 22930, 15075, 22931, 15069, 15071, 22933, 22932, 15070, 15073, 15074, 14699, 15068, 8265, 15408, 15411, 15413, 15406, 15407, 15410, 15412, 8266, 8264, 8263, 15409, 15405, 15689, 8392, 23320, 15690, 23319, 15909, 8467, 15911, 8468, 15908, 15910, 8541, 43169, 16074, 8540, 16211, 16210, 33562, 16209, 23728, 16378, 16379, 16381, 16380, 23780, 9009, 3738, 4748, 11131, 6108, 12440, 8110, 23138, 15414, 23631, 23729, 3983, 18996, 27909, 27908, 5668, 28407, 19919, 19918, 5667, 19920, 11771, 6109, 11773, 11772, 48473, 20481, 12441, 6540, 13076, 13079, 13078, 30100, 13077, 13652, 13654, 13653, 21970, 7635, 22347, 31264, 21969, 7634, 22691, 7933, 14702, 14704, 14703, 22935, 22934, 8111, 22936, 32538, 23140, 15416, 15415, 15691, 8393, 23321, 23470, 8469, 16076, 16075, 8655, 3984, 10011, 4749, 11134, 11132, 28412, 28411, 11133, 11775, 11776, 12448, 11774, 12442, 12446, 12445, 12447, 6541, 12444, 12443, 12449, 21013, 13082, 13080, 21491, 13081, 13657, 13655, 21971, 13656, 14236, 14705, 14706, 8112, 23141, 15417, 15692, 8394, 32546, 15912, 16077, 8542, 33312, 16212, 16382, 3985, 4751, 4752, 10012, 18997, 18999, 10013, 4750, 27915, 5194, 19454, 5192, 19453, 5191, 5198, 5190, 5199, 10528, 5196, 27916, 5193, 5197, 5195, 5189, 19455, 5676, 19927, 5670, 11138, 5675, 19930, 19936, 5677, 5671, 47549, 5672, 19922, 11136, 19924, 19932, 5669, 19929, 11137, 5674, 28416, 37282, 11135, 5673, 19923, 6120, 20489, 6122, 28966, 20490, 11779, 6121, 6110, 6114, 20495, 6560, 12454, 11781, 6115, 20491, 20482, 11784, 11785, 6119, 28967, 11787, 20492, 11789, 20494, 11790, 11778, 11777, 11791, 6118, 11788, 11786, 28963, 6116, 6112, 6123, 11782, 11783, 11780, 20485, 6117, 28968, 20493, 6113, 6111, 12453, 6555, 6550, 21025, 21018, 6545, 21028, 6561, 6546, 21014, 6542, 6557, 6554, 6556, 21017, 6547, 6552, 6543, 6544, 12461, 12458, 12450, 12455, 21020, 6558, 12462, 6559, 6549, 21021, 21026, 12452, 21015, 12460, 12456, 12459, 12457, 6553, 12451, 6548, 21022, 13085, 6957, 6960, 21494, 13087, 21499, 6968, 13086, 6962, 21498, 7325, 13088, 30116, 6967, 13084, 6969, 21493, 21497, 21506, 6958, 21503, 6551, 6961, 21495, 6959, 6963, 6965, 6956, 6970, 6966, 21500, 6964, 13083, 21501, 21985, 7332, 21972, 7328, 21983, 21981, 21979, 7335, 21977, 13660, 7336, 13672, 13665, 7321, 13673, 13667, 7331, 13668, 21984, 7330, 13671, 7324, 13669, 13659, 7323, 14247, 7329, 21986, 7326, 21974, 7334, 21975, 13658, 21987, 13662, 7322, 13661, 13663, 13664, 7333, 13666, 13670, 13674, 7337, 7641, 14242, 14248, 14245, 14237, 14249, 14238, 22351, 14244, 22352, 7636, 7642, 14250, 21980, 22348, 7638, 22355, 7648, 7643, 14252, 14246, 7639, 14239, 7649, 14240, 14241, 7650, 7647, 7327, 22350, 7637, 14253, 7651, 22349, 7644, 14251, 7640, 7645, 7646, 7941, 14711, 14720, 14717, 14719, 22694, 7938, 14712, 22695, 14718, 7934, 14714, 7942, 14710, 14715, 14722, 14243, 14716, 14709, 7935, 14708, 7936, 14723, 7937, 14721, 7940, 14707, 22693, 7939, 14713, 15078, 15092, 15087, 15089, 15077, 8113, 22945, 15076, 8116, 8115, 22941, 15091, 15083, 15080, 15086, 22939, 15079, 22943, 15081, 15090, 15088, 22938, 8114, 15095, 15093, 15084, 15094, 15085, 23143, 15421, 8267, 15428, 23144, 32549, 15915, 8274, 15082, 15419, 8270, 15420, 15425, 23145, 23330, 8272, 8273, 15418, 15427, 15429, 15422, 15424, 15426, 15423, 15430, 8269, 8275, 8271, 8268, 15695, 32850, 8399, 15693, 23327, 23323, 15697, 23329, 15698, 8397, 15699, 15696, 23322, 15694, 8400, 8396, 15700, 23325, 8398, 8395, 23294, 33114, 8470, 23471, 33120, 8471, 15914, 15913, 15916, 15917, 23472, 8472, 16078, 16083, 8543, 23564, 16080, 23565, 16079, 16082, 16081, 23633, 16216, 33461, 8593, 16215, 16213, 23632, 16214, 23634, 23684, 8627, 8626, 16308, 16309, 8628, 23730, 16383, 16384, 8667, 23762, 8673, 23781, 16442, 16471, 3986, 36791, 11139, 19937, 11140, 12463, 13089, 13675, 7944, 22698, 7943, 15096, 15431, 23567, 16217, 3987, 10529, 5200, 5678, 12465, 12464, 7338, 13676, 7339, 14724, 8117, 23331, 23782, 8682, 3988, 9568, 10530, 19940, 28432, 5679, 19939, 11141, 11142, 20501, 11792, 20500, 6124, 6562, 21029, 12467, 12466, 12468, 21508, 13090, 13091, 6971, 7652, 7340, 7653, 14728, 14725, 14727, 14726, 7945, 22946, 15097, 15433, 15432, 9215, 5202, 5201, 10531, 19941, 11143, 20503, 20502, 11794, 11793, 6125, 20504, 12470, 12471, 12469, 29509, 21030, 6564, 6563, 30131, 6973, 6972, 21991, 13677, 14256, 14254, 14255, 7654, 14730, 14729, 22700, 15100, 15099, 15098, 15434, 23732, 16443, 3989, 4753, 19001, 4754, 5203, 5204, 10533, 10532, 11144, 19943, 5685, 5683, 5680, 5684, 5682, 5681, 19945, 19944, 6126, 11797, 20506, 6569, 6128, 6133, 11799, 6135, 6134, 6137, 11798, 11795, 6131, 6127, 6129, 11796, 6136, 6132, 6130, 6571, 6570, 6568, 6572, 29515, 6566, 6567, 21034, 6565, 38552, 12472, 21032, 13093, 21511, 6975, 6976, 6974, 21513, 13092, 21512, 13094, 13680, 13682, 21995, 7349, 13683, 7342, 13679, 7341, 7351, 7347, 7348, 7344, 13678, 7343, 13684, 13681, 21994, 7350, 21997, 7345, 7346, 14258, 22362, 14260, 14259, 22360, 14261, 7655, 14257, 22702, 22703, 7949, 14731, 7946, 7950, 7948, 7947, 15101, 32220, 15104, 56261, 15103, 22949, 15102, 8118, 15435, 15436, 8276, 15437, 8277, 23147, 8402, 32852, 8401, 15918, 23474, 23475, 8473, 15919, 16084, 8544, 8545, 16218, 23635, 8630, 23733, 3990, 19946, 5687, 5686, 12473, 12474, 6977, 14262, 7352, 14263, 14732, 3991, 17979, 10014, 4756, 4755, 10534, 5205, 10535, 11147, 19952, 11146, 19950, 11145, 19948, 19951, 11801, 6140, 20516, 20511, 11800, 6139, 20514, 20507, 20510, 11802, 6138, 20515, 12476, 12479, 12477, 12478, 12482, 12475, 12483, 12480, 12481, 6979, 13095, 21516, 21514, 6978, 21515, 13688, 13686, 22001, 30728, 7353, 13685, 13687, 22000, 7354, 21998, 14264, 22364, 14265, 7951, 22952, 15439, 15441, 15438, 15440, 15701, 15920, 16417, 3992, 4757, 10536, 10538, 10537, 11150, 5689, 19957, 11148, 19953, 5688, 11151, 19956, 11152, 11149, 47587, 11814, 6148, 11806, 11812, 20522, 20517, 6143, 6146, 11805, 6141, 11809, 12489, 6145, 20518, 11804, 20521, 11810, 11807, 11813, 11803, 11811, 6144, 6147, 11808, 6142, 6574, 12485, 6573, 12492, 12491, 6580, 6581, 12493, 6575, 12490, 6579, 12495, 12486, 21036, 12488, 6576, 12484, 12487, 12494, 6577, 12496, 6578, 6980, 13100, 13106, 13098, 13107, 21522, 13097, 13102, 13108, 13105, 13104, 13103, 21521, 13096, 13101, 21520, 13099, 7359, 7356, 13697, 13702, 13704, 13701, 13694, 13696, 13706, 13703, 13698, 13707, 13695, 13705, 7357, 7363, 7361, 13689, 7362, 7358, 13690, 13692, 13691, 13699, 13700, 22007, 7360, 22006, 7355, 13693, 14275, 7657, 22371, 14266, 7658, 7661, 14271, 39895, 14268, 7660, 31310, 22368, 14272, 14273, 14267, 14276, 14269, 14274, 7659, 22369, 7656, 14270, 22705, 14738, 7954, 7952, 7955, 7953, 14737, 14734, 14733, 22706, 14736, 31784, 14735, 15118, 8124, 15109, 15108, 22953, 8119, 15114, 15113, 15105, 15116, 15110, 8123, 15107, 15115, 15106, 8120, 8122, 15111, 8121, 15112, 23149, 15117, 15445, 23148, 8282, 15442, 32573, 15446, 23150, 32570, 8279, 15444, 8284, 23151, 8281, 23152, 15443, 32575, 8283, 15447, 8278, 8404, 8406, 23334, 15704, 8405, 15702, 8280, 15703, 8403, 8474, 8476, 15922, 8475, 15921, 16089, 8546, 16088, 8547, 16086, 16085, 16090, 16091, 16219, 23636, 16087, 16313, 16310, 16311, 16312, 8656, 23735, 16387, 16386, 16385, 16418, 23763, 16463, 16444, 8674, 3993, 5206, 19958, 19959, 20523, 21044, 6582, 21524, 21523, 22011, 22013, 22010, 22012, 7364, 14277, 22956, 8125, 22957, 15448, 23154, 32577, 23335, 33136, 16445, 3994, 4372, 4759, 4758, 36806, 5209, 19458, 10539, 5207, 10540, 5208, 19960, 11157, 11153, 19966, 28454, 5690, 11156, 11155, 11154, 5691, 11158, 11159, 20528, 11821, 11819, 11823, 11824, 11830, 20530, 11826, 11828, 38587, 11820, 11815, 29004, 11827, 20527, 20529, 11829, 11822, 11825, 11816, 6150, 11818, 11817, 6149, 6151, 20532, 6585, 12498, 12500, 12499, 12504, 6583, 21047, 12501, 12497, 12502, 12503, 6584, 6586, 12505, 13112, 13111, 30153, 13109, 13110, 6982, 6984, 6981, 6983, 13714, 13715, 13710, 22017, 13711, 7366, 7371, 7365, 7372, 7367, 13712, 30750, 22014, 13713, 13709, 7373, 7369, 22016, 30748, 7368, 7370, 22015, 13708, 22375, 14279, 7663, 22373, 22372, 14281, 7665, 14284, 14280, 14278, 14283, 7664, 14282, 54819, 7662, 22376, 22710, 7957, 7960, 14740, 22711, 7958, 14739, 7956, 7959, 15119, 15120, 15121, 8126, 22958, 15122, 8127, 8286, 15451, 15452, 15450, 15449, 15453, 8285, 15708, 15706, 15707, 15709, 15705, 15710, 15924, 23476, 15925, 15923, 8477, 16092, 8548, 16093, 16221, 16220, 23783, 3995, 6152, 20534, 21048, 6587, 21049, 21526, 21527, 6985, 22018, 22378, 7667, 22377, 7666, 22959, 8287, 8374, 8478, 3996, 5210, 6588, 22020, 15454, 18250, 26559, 26711, 17980, 18251, 9217, 26884, 18254, 3997, 26886, 4000, 3999, 3998, 18252, 9216, 18599, 9570, 18597, 9572, 4373, 18601, 27171, 4375, 9569, 9571, 4374, 9574, 9573, 9575, 18600, 18598, 10018, 10016, 4762, 10015, 4767, 4764, 4761, 19004, 4768, 19005, 4763, 4766, 46029, 4765, 10017, 19006, 4760, 19003, 5216, 10542, 10548, 5213, 5220, 19462, 5215, 10545, 10547, 5218, 10541, 10544, 5214, 5211, 10543, 5217, 10546, 5219, 5212, 27932, 19464, 19463, 11161, 11164, 5693, 19970, 5703, 5699, 11162, 19969, 19973, 5707, 5700, 5705, 5695, 28459, 5692, 5694, 5706, 11163, 5698, 5701, 5697, 5702, 11165, 5704, 5696, 11160, 19971, 20538, 20539, 20536, 20535, 20540, 11831, 6153, 11833, 20544, 6155, 6157, 28457, 11832, 6154, 6158, 20545, 6156, 20543, 20546, 6594, 12510, 6602, 12507, 21054, 6603, 6592, 21050, 12508, 21053, 21051, 6597, 21052, 12509, 6590, 6589, 21055, 6600, 6599, 6598, 6596, 6601, 12506, 6591, 6593, 6595, 6987, 6990, 21529, 6994, 6988, 6993, 6991, 21532, 6986, 21531, 6992, 6989, 30755, 13719, 7376, 7374, 22023, 13720, 30756, 7377, 7375, 13718, 13717, 22022, 7671, 13716, 7669, 7668, 14285, 7378, 7670, 14286, 7673, 14287, 7672, 7962, 14742, 7961, 7966, 7964, 7965, 8129, 7963, 14741, 14288, 8128, 8130, 22961, 8288, 8289, 32586, 15711, 33325, 8595, 8594, 4002, 17827, 17826, 9014, 5221, 17981, 9011, 9012, 9010, 17982, 9013, 9221, 9218, 9223, 9219, 4003, 4006, 18256, 9220, 4005, 9222, 18260, 18255, 4004, 19976, 18604, 27176, 9578, 9580, 4378, 9576, 9579, 9577, 4376, 4379, 18602, 4377, 18605, 19008, 10020, 10024, 10021, 19011, 4771, 19007, 4772, 19017, 10023, 19010, 10025, 10027, 19015, 4769, 10026, 29540, 19014, 4770, 11172, 10022, 10549, 10558, 10556, 10551, 10552, 10557, 10559, 5223, 19466, 10554, 10550, 5222, 5224, 10553, 10560, 10555, 5708, 11175, 11167, 11173, 11174, 5709, 19974, 11166, 11168, 10019, 11170, 11171, 11169, 6160, 30764, 19977, 11840, 14289, 11841, 11838, 5710, 6162, 11837, 11843, 11842, 6159, 11846, 11836, 11845, 11834, 11844, 11839, 6161, 20548, 12517, 21058, 12512, 12518, 12513, 12511, 12514, 6604, 21059, 12516, 21060, 12515, 6605, 6996, 6995, 13119, 13122, 13114, 13118, 6997, 13117, 13115, 13121, 13116, 13113, 13120, 21535, 13726, 7381, 15123, 13723, 13724, 13722, 11835, 7380, 13727, 13721, 7379, 7382, 13725, 14290, 7674, 14291, 14292, 22382, 14743, 7967, 15124, 15125, 22963, 22962, 15126, 15456, 15455, 15713, 15712, 15927, 15928, 15926, 16094, 8549, 4007, 4774, 4773, 5227, 5226, 10562, 10563, 10561, 19467, 5225, 11179, 19980, 11180, 11176, 5711, 11177, 19979, 11178, 11849, 11851, 11847, 11850, 6163, 11848, 6164, 21063, 12026, 6608, 6607, 21062, 6606, 29541, 12519, 12520, 29542, 13124, 13126, 7001, 6998, 21537, 7000, 6999, 13125, 13123, 21536, 21538, 13734, 13731, 13732, 7386, 13733, 13728, 13729, 7383, 22026, 7384, 13730, 7385, 22027, 14296, 22384, 14297, 14294, 14295, 7675, 14293, 31335, 22383, 22386, 31802, 14747, 14744, 14746, 7970, 14750, 7969, 14748, 14751, 14749, 14745, 7968, 15128, 32245, 15129, 15127, 22964, 15131, 8131, 8132, 15458, 8291, 15130, 15457, 8290, 15716, 15717, 8407, 15715, 32874, 15714, 15929, 8479, 23477, 16222, 16315, 16314, 23687, 8631, 8657, 16316, 16419, 23764, 8675, 4008, 4380, 6609, 8408, 4009, 4775, 5712, 6165, 8133, 4381, 10029, 10028, 10564, 19473, 5230, 5228, 5232, 10566, 19470, 5231, 5229, 19472, 19471, 19474, 10565, 5715, 11186, 19983, 5714, 5716, 11191, 5718, 11188, 11189, 11181, 5717, 11192, 28478, 19982, 11183, 19981, 11184, 11182, 5713, 19984, 11190, 11185, 11187, 11863, 20552, 11862, 11860, 11852, 11867, 11855, 11865, 11872, 11864, 6173, 20561, 6169, 11853, 20555, 11859, 6171, 20563, 11858, 6172, 6174, 11861, 20564, 6166, 6167, 11873, 11871, 20557, 11870, 11856, 20560, 11868, 29021, 6170, 48582, 20553, 20558, 6168, 11869, 11854, 11857, 11866, 13161, 12530, 21069, 12523, 12542, 12551, 12526, 6620, 21066, 12539, 6610, 6612, 6624, 12524, 21078, 21070, 6613, 6615, 6625, 6614, 21080, 29548, 29553, 21079, 6623, 12532, 29555, 12521, 6621, 12531, 6617, 12549, 6622, 12547, 12535, 12545, 6619, 12522, 12548, 12543, 21065, 12550, 6611, 29547, 21068, 6626, 6616, 21072, 21064, 12528, 21075, 12536, 12540, 21074, 12544, 6618, 12527, 12525, 12537, 29549, 29550, 21073, 21076, 12534, 12533, 21077, 12538, 12541, 12546, 30164, 13129, 7002, 13139, 13131, 7008, 7012, 13148, 13156, 13141, 7004, 21545, 13145, 12529, 21546, 7005, 13152, 13157, 13149, 21540, 13151, 13160, 13153, 13135, 13144, 21071, 21549, 7013, 21544, 7009, 13133, 13146, 7007, 13140, 7006, 13154, 13137, 13130, 7010, 13159, 21550, 30166, 13132, 13150, 13147, 13142, 13128, 13127, 13136, 13155, 7011, 13158, 13134, 13138, 7003, 21543, 21548, 21542, 7398, 7393, 13768, 13764, 13740, 7389, 22029, 22043, 30774, 7388, 7394, 30776, 22030, 22028, 13738, 7392, 13750, 13736, 13737, 7387, 13767, 7396, 13753, 13758, 13752, 14315, 13748, 13756, 13754, 13741, 13735, 13762, 7395, 13763, 22035, 13757, 22036, 13746, 13744, 13739, 22038, 22041, 22031, 13747, 13760, 13743, 13759, 13765, 22044, 30775, 7391, 22032, 13755, 13761, 13751, 13745, 7390, 22045, 30773, 22039, 13143, 13749, 7397, 13742, 22040, 21541, 14320, 7678, 14319, 14317, 14335, 7682, 22392, 14332, 14324, 14334, 14310, 14322, 22400, 7684, 22401, 14302, 22395, 14300, 14333, 22389, 14331, 14330, 14314, 14313, 14303, 7686, 31336, 14309, 14318, 14329, 7689, 14336, 22393, 7978, 7691, 7685, 14307, 22394, 14316, 14299, 14301, 7676, 7688, 7681, 14308, 14323, 13766, 7687, 14298, 7973, 14325, 14328, 7683, 22398, 14312, 7690, 7680, 22399, 22396, 22397, 7679, 14321, 14327, 7677, 31338, 14305, 14326, 14306, 54868, 31342, 22388, 14311, 14757, 22722, 14762, 7975, 7977, 14768, 7971, 14782, 14774, 14763, 14764, 14773, 22723, 7984, 14772, 14756, 14771, 14759, 14783, 7983, 7981, 14760, 22714, 14779, 22724, 14765, 14778, 22721, 14780, 14755, 7976, 22712, 14781, 22725, 22715, 14769, 22728, 7980, 14766, 22718, 31812, 7982, 14775, 22719, 22720, 22716, 7974, 14761, 14776, 22713, 14770, 14304, 14777, 14758, 22717, 7979, 22727, 15148, 31810, 7972, 14753, 31809, 15145, 15138, 8135, 22970, 15133, 15149, 15140, 14767, 22967, 15151, 15134, 22969, 8134, 15144, 8136, 8144, 8142, 15146, 8143, 15136, 22976, 15137, 15142, 15147, 22965, 14752, 8137, 15156, 15153, 15480, 15143, 15139, 15154, 15469, 15141, 32258, 8140, 22971, 8139, 14754, 8141, 15150, 15152, 8138, 15155, 15132, 32250, 15135, 22973, 22972, 15478, 23171, 15462, 8295, 15476, 23159, 23160, 15460, 8296, 32594, 15471, 23158, 15467, 8301, 15477, 15461, 15464, 8293, 15479, 23163, 15472, 15475, 8299, 8304, 8302, 15468, 15463, 23168, 8297, 8298, 15459, 8294, 23170, 8292, 8300, 15474, 8303, 23165, 15470, 15481, 8305, 23156, 23157, 23169, 15466, 23162, 15473, 23344, 23479, 15730, 15745, 15732, 15739, 15465, 15737, 15720, 15743, 8411, 15724, 15742, 15731, 32876, 23346, 8410, 23339, 23342, 15747, 15733, 23341, 15738, 15741, 15718, 15744, 15729, 15734, 15722, 15726, 15746, 15736, 15719, 15723, 15725, 15735, 23340, 8409, 15728, 23347, 23348, 23350, 32880, 23345, 23337, 15721, 23349, 15727, 15933, 15937, 8486, 15939, 23482, 8480, 32884, 15935, 15941, 8485, 8481, 33147, 8482, 15932, 15938, 8484, 15936, 8483, 15931, 15740, 15934, 33153, 15930, 15940, 23572, 23577, 8550, 16101, 16104, 16100, 16102, 16103, 16097, 16098, 16095, 23573, 23575, 16099, 16096, 8551, 8552, 23574, 16224, 23643, 16226, 33472, 43394, 23646, 23645, 23647, 16225, 16227, 23640, 8597, 23644, 16223, 8596, 8598, 23648, 16318, 16319, 8632, 16317, 23689, 16389, 16388, 16390, 8659, 16391, 8658, 16392, 16420, 16423, 16422, 8668, 16421, 33717, 23766, 23784, 8678, 8676, 8677, 8683, 16465, 16466, 16464, 16472, 23803, 4382, 26894, 27943, 11193, 11874, 13769, 15482, 42917, 4383, 19019, 4776, 5233, 27944, 19475, 11194, 19987, 11195, 5719, 6177, 11876, 11875, 6181, 6176, 11877, 6178, 6180, 6179, 6175, 20567, 6627, 21083, 21081, 12555, 12553, 29566, 12554, 12552, 7014, 21554, 7017, 7019, 7018, 30175, 21555, 7015, 7016, 13771, 13770, 7399, 13772, 22046, 13773, 7400, 22048, 22049, 30779, 14344, 14342, 14789, 22405, 14340, 14341, 7692, 14337, 14345, 14339, 14343, 14785, 22407, 22403, 14787, 22730, 14788, 7989, 14784, 7988, 14786, 7985, 7986, 7987, 14338, 8147, 15159, 15157, 15158, 8145, 8148, 8146, 22978, 22977, 56995, 15483, 15484, 8306, 23174, 15748, 15750, 15749, 8412, 8487, 15944, 15943, 15942, 4384, 17706, 8908, 9017, 3739, 9015, 9018, 9016, 26897, 18262, 18261, 9225, 18266, 4013, 18263, 4014, 9227, 4011, 9226, 9224, 4012, 4010, 18264, 18265, 18606, 27184, 9581, 9584, 4387, 9583, 9582, 18609, 4386, 4385, 18608, 4389, 9585, 4388, 10034, 4778, 4779, 4780, 10035, 10031, 4777, 10032, 27508, 10033, 10030, 27506, 19479, 27948, 5240, 19477, 19989, 5237, 10567, 5238, 5241, 10568, 19476, 5236, 5234, 5235, 5239, 5720, 11198, 5728, 11197, 19992, 11200, 5724, 11199, 6189, 5722, 5725, 5721, 5726, 5727, 5723, 19996, 20572, 11196, 6185, 11879, 20573, 11883, 20574, 20576, 11882, 6190, 6186, 6187, 11878, 11880, 11881, 6182, 6184, 20571, 6188, 6183, 21087, 12558, 12556, 12557, 6629, 6630, 21089, 12559, 6628, 7020, 30177, 7022, 7021, 21562, 13162, 21563, 21561, 13163, 13775, 22053, 13774, 22054, 31351, 7693, 7694, 14346, 7695, 22411, 14792, 22733, 14790, 22732, 14791, 7990, 22734, 15160, 8307, 23352, 18610, 22412, 7991, 4390, 27950, 5242, 10569, 19482, 11201, 5729, 6191, 11884, 11886, 6193, 6192, 6194, 6195, 11885, 6633, 6634, 6632, 7023, 6631, 12560, 29570, 21564, 21566, 7024, 13776, 14347, 7696, 7992, 15161, 15165, 8151, 15162, 8152, 8150, 15166, 8153, 15164, 15485, 8149, 8308, 23485, 16320, 23692, 23796, 4391, 5731, 5730, 20585, 20583, 20582, 6196, 11888, 11887, 6197, 21093, 12564, 6638, 6635, 12563, 6637, 12561, 6636, 21094, 12562, 13164, 7025, 13779, 39976, 7401, 13777, 7402, 7403, 13778, 7404, 22059, 14348, 22419, 7700, 7697, 7702, 14350, 7698, 14349, 7701, 22416, 22415, 7699, 22420, 14795, 14797, 22737, 22738, 7993, 14796, 7994, 14794, 14793, 32265, 15168, 15167, 8154, 15169, 15490, 8310, 15489, 15486, 8309, 15487, 15488, 15751, 15752, 8413, 23358, 8490, 23355, 23357, 15945, 23487, 23486, 8488, 8489, 15946, 23580, 8553, 8554, 16105, 23581, 23650, 8633, 16322, 8635, 23693, 16321, 16323, 8634, 16393, 33719, 16446, 23818, 18611, 4392, 21096, 6639, 30194, 13165, 21569, 13780, 7703, 7704, 22982, 4393, 20586, 7405, 8311, 4781, 18612, 21571, 7705, 23488, 8599, 4782, 11202, 29038, 11889, 20589, 11891, 20587, 11890, 12568, 12565, 6640, 49541, 6641, 12566, 12567, 21098, 13167, 13172, 7026, 13166, 13168, 13175, 13170, 13174, 13171, 13169, 13173, 7027, 22061, 13783, 22062, 13781, 7407, 22063, 7406, 13782, 7408, 22422, 14353, 31364, 31372, 14352, 7706, 14351, 14798, 22743, 14800, 14802, 14801, 22744, 7995, 14799, 15176, 8155, 15174, 15177, 8156, 32276, 15172, 22983, 15175, 15173, 15170, 8157, 15171, 32615, 23186, 23184, 15491, 23185, 23187, 15493, 15492, 23359, 15753, 23360, 15754, 33168, 23490, 23489, 15947, 23582, 8556, 33337, 8555, 16228, 16229, 8636, 16324, 23695, 8669, 23808, 4783, 6198, 13177, 13176, 13785, 13784, 30792, 22424, 7996, 14804, 14803, 15180, 15178, 15181, 15179, 22984, 32908, 8312, 15494, 15495, 15496, 32906, 15948, 23491, 16106, 23696, 16325, 4784, 21102, 22064, 14354, 14805, 23188, 4785, 29582, 21103, 7028, 30211, 14355, 8158, 15182, 8313, 23362, 15755, 15756, 8491, 16230, 4786, 5734, 5735, 11203, 6199, 6200, 11892, 6201, 29587, 6645, 21105, 6647, 12570, 12571, 12569, 6642, 6643, 6646, 6644, 21577, 21578, 13178, 7029, 7030, 21575, 21579, 13792, 7411, 13787, 13786, 22068, 13791, 7409, 22066, 30795, 7713, 31381, 13788, 13793, 13790, 13789, 22065, 7410, 7711, 22431, 14357, 7707, 22428, 14358, 22429, 22285, 14356, 22427, 7710, 7708, 7712, 22432, 7709, 22430, 22434, 32288, 22994, 22753, 14806, 31851, 14811, 14807, 14810, 7997, 22755, 14602, 14809, 14808, 22992, 8161, 8159, 8162, 8160, 15183, 15184, 15185, 8163, 22989, 22991, 23192, 15500, 8315, 15498, 32633, 8316, 15497, 15499, 8314, 15760, 15757, 32911, 15758, 15759, 15949, 8493, 23493, 8492, 23492, 16108, 16107, 8557, 23654, 23655, 23653, 8600, 8637, 8660, 16394, 16447, 16448, 4787, 11893, 29596, 12572, 13179, 13180, 7031, 30228, 7032, 13794, 7412, 22436, 7998, 22757, 15186, 22995, 8164, 15503, 8317, 15502, 15504, 15501, 15952, 15761, 15762, 23365, 8414, 15951, 23496, 23494, 15950, 23495, 16109, 16449, 23786, 4788, 23497, 23787, 4789, 19998, 5243, 10570, 11204, 19999, 6202, 6205, 6203, 11894, 21114, 6207, 6204, 20596, 21115, 6206, 21107, 6649, 21112, 12573, 21110, 21586, 12574, 13796, 29606, 6648, 6650, 6651, 21111, 13182, 21587, 13181, 7033, 39335, 7034, 21584, 13183, 13795, 7036, 7413, 30804, 7035, 7714, 13797, 7415, 7414, 13798, 13801, 13799, 13800, 7416, 22070, 7719, 7717, 22440, 22441, 7716, 14360, 22439, 7718, 22437, 22438, 14359, 14812, 31395, 14361, 7715, 14362, 14815, 14813, 14814, 14819, 8168, 14818, 14821, 14820, 14817, 14816, 31396, 7999, 23001, 31874, 23000, 23005, 15189, 23004, 15188, 8167, 8165, 8166, 23002, 15187, 15507, 23196, 8318, 32641, 15506, 15505, 8319, 32925, 15767, 15766, 23367, 15764, 23499, 15763, 8416, 8415, 15768, 16110, 8558, 15954, 8494, 15953, 15765, 23587, 16111, 8601, 23697, 8661, 16395, 33749, 16450, 4790, 11205, 14822, 4791, 21118, 39337, 13185, 13184, 14363, 40707, 22443, 14824, 22763, 14823, 23006, 8169, 15508, 15509, 8417, 23500, 23657, 16451, 5244, 6209, 6208, 12575, 12577, 6653, 12576, 6652, 6654, 12578, 21592, 21591, 21595, 13187, 13189, 13188, 21590, 13191, 21589, 21601, 21593, 7037, 13190, 13186, 21599, 30237, 13192, 22078, 13808, 22072, 13811, 13813, 13803, 13807, 13804, 7418, 7421, 7423, 13805, 13806, 7422, 13809, 13812, 13810, 7424, 22073, 7420, 13802, 7417, 22077, 7419, 22079, 22451, 7721, 14369, 14367, 14366, 22452, 14372, 22446, 14371, 14370, 22447, 14365, 7720, 14364, 22445, 14368, 7722, 22767, 14827, 22770, 14831, 14828, 14830, 14829, 14826, 14832, 14835, 14833, 14834, 8001, 22766, 8000, 14825, 14836, 15194, 15197, 15199, 15198, 23009, 15192, 15196, 15191, 23010, 15193, 8170, 15190, 23012, 15195, 15522, 15511, 8320, 23202, 23200, 8321, 15510, 15515, 15521, 15513, 15520, 23199, 15517, 23201, 15516, 15519, 15514, 15512, 23198, 15518, 15775, 15773, 8418, 15772, 15778, 15776, 23369, 8419, 15771, 15769, 32937, 15770, 8421, 15774, 8420, 15777, 15955, 15961, 23503, 23501, 15956, 8498, 15962, 8497, 15960, 15959, 8496, 15958, 8495, 15957, 58046, 16117, 16119, 16118, 33349, 16115, 8560, 16112, 16116, 16121, 23588, 16120, 16113, 16114, 8559, 16231, 8604, 23659, 16232, 8602, 8603, 23658, 33586, 16326, 8638, 16424, 23769, 8670, 23770, 16452, 8671, 16453, 16454, 16468, 16467, 8686, 16476, 5245, 20600, 29610, 12580, 29608, 12579, 29609, 7038, 7039, 13193, 30821, 13814, 14375, 22082, 22081, 7425, 7723, 14373, 31412, 14376, 7724, 22773, 14837, 14374, 15200, 8171, 15523, 32658, 23376, 15781, 15779, 23375, 23373, 15780, 15963, 23504, 8499, 16122, 8607, 8561, 8605, 8606, 16327, 8662, 23771, 5246, 28494, 21603, 30826, 15201, 23590, 23660, 10571, 20603, 6655, 21120, 13194, 21604, 21608, 7040, 13195, 21606, 21605, 21607, 13816, 13815, 7726, 7426, 7427, 30832, 13819, 13818, 13817, 22084, 22456, 14377, 14380, 22455, 14379, 14378, 7725, 14841, 14839, 14838, 31888, 22774, 14840, 22775, 8172, 15203, 15204, 8173, 23014, 15202, 23204, 15525, 15524, 15527, 8322, 15526, 32664, 15782, 15784, 15783, 23506, 15964, 15967, 15965, 15966, 16123, 8562, 33359, 33356, 16233, 16234, 16235, 23699, 8639, 8663, 16455, 5247, 21610, 7428, 7727, 15205, 23377, 16124, 23701, 33674, 16425, 10572, 23789, 8687, 5248, 14381, 22777, 15206, 15528, 23378, 33203, 15968, 16125, 5249, 21121, 13196, 13197, 21613, 7041, 7042, 13821, 7430, 7429, 13820, 14842, 22778, 15207, 15209, 15208, 8176, 8175, 8174, 23379, 8501, 15969, 23507, 8500, 16127, 16126, 23702, 8640, 16328, 5736, 12581, 29618, 21122, 13200, 13198, 13199, 30248, 22089, 13830, 30847, 13825, 13822, 13829, 22087, 30852, 22086, 13831, 30854, 30843, 7432, 13828, 13824, 22088, 30841, 13823, 13827, 13826, 7431, 14392, 14387, 14385, 14394, 14386, 31434, 14382, 31430, 14388, 22459, 22461, 14383, 14851, 14384, 14395, 22468, 31432, 22463, 22466, 40743, 22470, 22464, 14391, 7728, 14390, 14389, 22460, 14393, 22783, 14843, 14846, 31906, 22784, 14845, 22779, 14853, 14848, 14852, 22781, 14850, 14849, 14847, 31898, 14844, 31896, 8004, 8003, 31901, 8005, 8002, 14854, 31902, 31900, 15215, 15218, 32341, 15216, 15220, 41918, 23019, 32337, 15221, 32345, 15213, 8181, 15214, 23018, 15212, 15219, 23207, 15211, 15210, 8180, 8178, 8177, 23021, 23020, 22782, 23016, 15217, 15537, 15543, 8325, 15538, 42318, 15541, 15545, 8326, 15540, 32677, 15532, 23208, 15531, 15544, 15535, 23210, 15533, 15542, 15534, 8324, 8323, 23212, 15529, 15530, 15539, 32687, 23213, 32689, 15536, 32670, 23390, 15787, 15790, 23392, 32671, 23382, 23384, 8179, 23385, 23395, 23396, 32957, 23389, 32956, 23383, 15788, 15794, 15792, 15786, 15797, 23381, 15785, 23397, 8423, 15793, 32951, 23394, 32954, 15789, 8422, 15796, 23393, 32960, 15795, 23391, 15972, 15971, 43006, 23511, 43000, 15978, 43003, 15974, 15977, 8503, 33208, 33211, 15975, 15976, 33206, 15970, 15973, 8502, 23509, 8564, 16138, 16133, 16137, 23598, 16140, 16136, 23593, 16132, 23596, 8566, 16135, 16139, 8565, 16130, 15791, 16134, 33372, 43252, 16131, 23595, 16128, 16129, 8563, 16239, 16241, 16244, 16240, 16245, 23662, 16238, 23663, 16236, 23665, 8608, 16242, 8610, 8609, 16237, 16243, 23705, 16333, 8641, 16334, 23706, 16332, 16329, 33599, 23707, 16331, 16330, 16396, 23744, 16398, 16397, 23746, 16428, 43760, 16427, 16426, 16429, 23772, 8679, 8680, 16473, 16477, 23814, 5737, 11895, 12584, 21123, 6656, 12582, 21125, 19021, 12583, 21127, 21126, 13201, 13202, 7045, 7043, 13203, 7044, 13836, 22096, 13839, 13833, 13840, 13832, 13834, 22099, 13835, 13838, 22093, 22100, 7435, 13843, 13842, 7433, 13837, 13841, 7434, 22478, 30865, 22094, 22091, 22475, 14405, 31445, 7733, 22477, 14400, 7729, 22487, 14397, 14403, 14406, 22484, 7734, 31911, 14402, 14399, 14407, 14398, 22488, 14404, 7730, 22474, 14396, 7731, 22486, 7732, 14401, 22483, 14872, 14859, 14860, 14863, 14861, 31918, 14855, 31919, 22792, 14858, 14868, 14862, 22787, 31912, 8006, 31910, 14870, 14867, 8007, 14869, 14856, 14865, 14866, 22789, 14864, 15225, 15227, 15230, 23024, 23026, 15224, 23028, 8182, 15232, 15223, 15233, 23029, 15229, 15231, 15235, 15228, 15236, 15226, 15222, 8183, 23031, 15234, 8184, 8328, 32355, 23025, 23216, 14857, 15571, 15562, 8330, 15558, 8331, 23224, 23219, 15567, 15561, 15551, 8329, 15564, 15559, 15560, 23222, 15546, 15553, 15568, 23217, 15565, 42330, 15557, 23223, 15569, 15552, 15547, 15566, 23221, 15549, 15563, 15554, 15570, 15550, 8327, 15548, 15555, 15556, 15804, 23220, 15802, 32972, 15807, 23400, 15819, 15810, 15803, 15799, 15812, 15805, 15808, 15801, 15815, 15798, 15806, 15811, 15813, 15816, 15800, 23401, 15820, 15821, 15814, 15818, 15809, 15994, 15997, 23520, 8504, 23516, 15996, 16001, 15999, 8505, 15990, 15980, 15979, 8507, 15992, 15993, 15989, 15981, 23517, 15986, 15817, 33216, 15982, 8506, 15988, 23521, 15987, 15983, 15995, 33217, 15984, 16145, 15998, 16000, 15991, 15985, 16146, 16148, 16142, 8567, 33374, 16155, 16153, 8568, 16152, 16151, 16144, 16141, 16147, 16156, 16143, 16149, 43276, 16254, 16259, 16249, 16252, 8611, 16256, 33501, 16263, 16150, 33505, 16250, 16260, 16264, 16255, 16248, 16258, 33506, 16257, 16262, 16261, 16154, 16253, 16247, 16251, 8642, 8643, 16246, 23669, 16345, 16336, 16344, 16341, 16342, 16335, 16338, 16346, 16340, 16339, 16337, 23708, 16343, 33611, 16399, 33677, 16400, 23748, 16402, 16401, 16404, 16403, 16431, 16430, 16456, 23790, 16457, 23797, 16469, 8684, 8688, 23805, 16478, 8689, 5738, 30871, 40760, 8424, 16002, 23522, 8644, 8645, 5739, 12585, 21128, 6657, 13844, 22101, 22490, 14409, 14410, 14408, 14874, 14873, 8008, 15238, 14875, 15237, 32361, 23033, 15573, 8332, 8334, 15572, 23226, 32702, 8333, 23406, 15822, 15824, 15823, 16003, 8508, 23525, 8612, 16347, 16405, 23798, 23812, 16482, 5740, 18086, 13204, 30875, 7436, 22104, 22103, 22491, 14412, 14411, 22795, 14876, 23035, 23034, 32711, 8335, 8425, 16157, 16474, 5741, 7046, 21621, 7437, 15574, 23407, 16265, 6210, 20001, 22493, 22492, 31926, 14877, 23037, 32365, 8664, 6211, 7438, 8009, 16266, 6212, 20002, 13845, 7736, 14413, 14414, 22494, 7735, 31459, 14878, 8013, 8011, 8012, 8010, 15239, 8185, 32715, 23227, 15826, 15825, 15828, 15827, 8426, 16004, 33235, 16006, 16005, 8509, 16158, 23602, 16267, 16268, 8613, 16406, 16432, 8681, 33780, 11896, 14415, 14879, 15575, 12586, 18317, 14880, 15241, 15240, 23038, 23230, 23231, 23527, 16269, 8646, 23750, 16407, 16433, 6658, 13846, 13847, 30885, 14416, 6659, 21129, 8186, 15242, 23233, 16008, 8510, 16009, 16007, 16270, 23751, 16348, 33691, 6660, 14883, 14882, 14881, 15243, 23040, 23039, 15247, 15246, 15245, 15244, 8187, 15576, 15830, 8427, 15829, 16010, 16161, 16160, 8569, 16159, 16273, 16272, 16271, 23670, 33781, 7047, 31462, 14417, 8014, 31933, 15577, 15578, 16162, 16274, 33523, 23714, 16349, 16408, 16458, 16484, 7048, 8015, 15248, 15579, 16011, 16275, 17939, 7440, 22495, 14884, 15249, 15580, 15581, 15582, 15835, 23409, 15831, 8511, 15834, 15833, 8428, 15832, 8430, 8429, 16013, 16012, 8512, 8513, 33245, 23529, 8571, 16163, 8570, 33528, 16278, 16279, 16277, 16276, 8648, 33625, 16350, 16351, 16352, 8647, 16409, 16412, 16411, 16410, 23800, 33782, 16483, 7737, 22800, 32724, 8195, 15836, 16014, 23604, 8572, 16164, 33798, 23815, 16485, 7738, 23444, 33764, 14885, 23530, 16165, 23752, 16434, 23774, 10, 21, 23, 31, 32, 35, 36, 39, 40, 43, 44, 47, 48, 51, 52, 55, 56, 59, 60, 100, 101, 104, 105, 102, 103, 13, 14, 15, 17, 18, 19, 20, 61, 62, 63, 64, 65, 66, 106, 107, 108, 124, 125, 126, 128, 127, 159, 169, 170, 171, 9, 75, 160, 165, 76, 29, 30, 77, 109, 1, 110, 4, 156, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 7, 6, 115, 117, 116, 8, 166, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 157, 98, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 33, 155, 34, 163, 164, 161, 35348, 44194, 44192, 44193, 44213, 44214, 35362, 17707, 44284, 35388, 44399, 44397, 44398, 44532, 44618, 35546, 44626, 44622, 44954, 44957, 44955, 45471, 36835, 37038, 47764, 53016, 30923, 44191, 44181, 44336, 26561, 44400, 44619, 44958, 35720, 35997, 45443, 46064, 46065, 47656, 47688, 38727, 44197, 35356, 44286, 44401, 48645, 26508, 35349, 44183, 44198, 44215, 35389, 44289, 44319, 44288, 44216, 44290, 44287, 26607, 26606, 35441, 35442, 44402, 44961, 44522, 44609, 44620, 44621, 45248, 44959, 46598, 45320, 44960, 45444, 36354, 46069, 46066, 46503, 46068, 46808, 47657, 47689, 47690, 38029, 35346, 35345, 44185, 44184, 35344, 35354, 44217, 35363, 44292, 44291, 44283, 35390, 44405, 44403, 44404, 44962, 45319, 26981, 45446, 45447, 45445, 46070, 46811, 36836, 46810, 48646, 38686, 49604, 49603, 55072, 56500, 57177, 35347, 35350, 26515, 35351, 35355, 44218, 44219, 44220, 44406, 35547, 44623, 44963, 36837, 47691, 54077, 44186, 44187, 44188, 44221, 44624, 44407, 44408, 44627, 26902, 35721, 26901, 45449, 35998, 45681, 46072, 46071, 46812, 44409, 35548, 35722, 44964, 45451, 45450, 46074, 36447, 27510, 46075, 46076, 47692, 46814, 46813, 27953, 36838, 47694, 47693, 47695, 28496, 48234, 48647, 39372, 53017, 53574, 53019, 53018, 53053, 54080, 40094, 54079, 54078, 56496, 56501, 44199, 44200, 44223, 44222, 17750, 44294, 44293, 44295, 26563, 26613, 26612, 26610, 44414, 26617, 44415, 35444, 44412, 44411, 26616, 44410, 35445, 44416, 35443, 35549, 44629, 26721, 44630, 44639, 44635, 44631, 26719, 44632, 44634, 44633, 44628, 35550, 44638, 44966, 44968, 26909, 35727, 44969, 35728, 18281, 35729, 26906, 26904, 44973, 44967, 44975, 44970, 44977, 35725, 44965, 44976, 44971, 44972, 44974, 35723, 35726, 35999, 45469, 45458, 36365, 27187, 45468, 45456, 45455, 36004, 27192, 45462, 36001, 36000, 36003, 45467, 45454, 45453, 45470, 45461, 45452, 45457, 45460, 45463, 45465, 45464, 36005, 27514, 36363, 27518, 46081, 36358, 46080, 36367, 27517, 27519, 36362, 46077, 36356, 46082, 36361, 46060, 46085, 46086, 46078, 46079, 36355, 46084, 36357, 36360, 36368, 36364, 36366, 27511, 46822, 46824, 46823, 27958, 27957, 46827, 46819, 36848, 46830, 36840, 46825, 46818, 36849, 36839, 27955, 46821, 46828, 46834, 46829, 46820, 27960, 46831, 47680, 46835, 46974, 46836, 46826, 36843, 47442, 36846, 36850, 46815, 46817, 36842, 36847, 36841, 46816, 46833, 36845, 47698, 47704, 37371, 37366, 47701, 37363, 37367, 37384, 37368, 47697, 37370, 37365, 47711, 28502, 37369, 47707, 47705, 47700, 47703, 47708, 47713, 37364, 37372, 47696, 47702, 28508, 47706, 47709, 37362, 47699, 37130, 48655, 29633, 38033, 38031, 48648, 36844, 38037, 38035, 48653, 38034, 48660, 48658, 29059, 48657, 48663, 48650, 29060, 38039, 48649, 38030, 48652, 48659, 48662, 49207, 48654, 48651, 47712, 38032, 38036, 38038, 29056, 48661, 49618, 38040, 53029, 29629, 38687, 49605, 49610, 38041, 49612, 29634, 49621, 29626, 49622, 49609, 49608, 49623, 53498, 38689, 49624, 49968, 49614, 49616, 49606, 29625, 49607, 49611, 49615, 49617, 29631, 38201, 30267, 30263, 49613, 53030, 53032, 53024, 53021, 53020, 39378, 30265, 53026, 53027, 39374, 53025, 39380, 39379, 53022, 53023, 39373, 53028, 30268, 39376, 53031, 39375, 39422, 40095, 40101, 54081, 30887, 30894, 40099, 30891, 30893, 40096, 40097, 40102, 40098, 55077, 39377, 40780, 40781, 31466, 31465, 55075, 55074, 55076, 31467, 55073, 55827, 31940, 31938, 31939, 55829, 55828, 55826, 41376, 31941, 41374, 41375, 41377, 41965, 41969, 32725, 41968, 41970, 56666, 41967, 41966, 42203, 57706, 57179, 42374, 57178, 57223, 33008, 33007, 42747, 58137, 42375, 33006, 58136, 43068, 33401, 58504, 43305, 33701, 44224, 26567, 26619, 44418, 44419, 44640, 44642, 44643, 35552, 44641, 44980, 44979, 44978, 44982, 44981, 45472, 45473, 36369, 46087, 36851, 36852, 47714, 37373, 48664, 38690, 53035, 53033, 39382, 39381, 53034, 40103, 54082, 40782, 55830, 41378, 56502, 41971, 41972, 42376, 43478, 44201, 35365, 35364, 44296, 44421, 44420, 35553, 44644, 35555, 36006, 36007, 27521, 46088, 46837, 47715, 48665, 38042, 29062, 49625, 40783, 44202, 44225, 35366, 44212, 44236, 35391, 44394, 26622, 44422, 44647, 44649, 35556, 44645, 44983, 45476, 45474, 36008, 45475, 45448, 45680, 46091, 46090, 46092, 46089, 46838, 47718, 38043, 47716, 47717, 38044, 48666, 29635, 49626, 41379, 56503, 56504, 26520, 44226, 44228, 44298, 26568, 44297, 35393, 44299, 35392, 44425, 44423, 44594, 44652, 44650, 44651, 35557, 44927, 35731, 44984, 44985, 45477, 46093, 46094, 36370, 36371, 46840, 47720, 20014, 47719, 29064, 38045, 49628, 49627, 53036, 40104, 54083, 31942, 58138, 35367, 44300, 44426, 26624, 35446, 35732, 45478, 46841, 36854, 47721, 47722, 48667, 49629, 39660, 54084, 55831, 56505, 57182, 42748, 43306, 44427, 26625, 35558, 44653, 26723, 26916, 26917, 44987, 44988, 35734, 36010, 27198, 27199, 36013, 36009, 36011, 45480, 45479, 36373, 27522, 36372, 36012, 46096, 36374, 46097, 36855, 46842, 46843, 27963, 47723, 37377, 37375, 37376, 37374, 28511, 38051, 38046, 38048, 38049, 38047, 38050, 48668, 49630, 39386, 38691, 53038, 39385, 39384, 39383, 53037, 54086, 31469, 54087, 40784, 41381, 41380, 41382, 55832, 41973, 41974, 57707, 43069, 26516, 44229, 44239, 35394, 44302, 26570, 44429, 44428, 44430, 44431, 44656, 44654, 44655, 26921, 44989, 26919, 44990, 44991, 44992, 45483, 45481, 45482, 46098, 46254, 46845, 46846, 46844, 47724, 47727, 47725, 54088, 26521, 35368, 44230, 44231, 44304, 35395, 44303, 44436, 44432, 44433, 44434, 35447, 44657, 44995, 44994, 45484, 45485, 46055, 46099, 46847, 46848, 37378, 49631, 53095, 55080, 40787, 41975, 57275, 44204, 26539, 44232, 35369, 35370, 44233, 26540, 44234, 35396, 35397, 26573, 44309, 35398, 44308, 44305, 44310, 26627, 44441, 35451, 35449, 35448, 26628, 26626, 44439, 44438, 35452, 44442, 44440, 35450, 26630, 26631, 44437, 26728, 44660, 26730, 35560, 26729, 35569, 35568, 35566, 35563, 44658, 35562, 35565, 35564, 44659, 44661, 35561, 35567, 45004, 35738, 35740, 26924, 26926, 18295, 45001, 26928, 44999, 45000, 45007, 45486, 45005, 35735, 35741, 45006, 35737, 45002, 35739, 45003, 44997, 44996, 35736, 44986, 27204, 36014, 27202, 45499, 45492, 45497, 27205, 45496, 27201, 27203, 45489, 45495, 45498, 45491, 45494, 45493, 45490, 36015, 45488, 46100, 27527, 27524, 36382, 36380, 27526, 27530, 46105, 46109, 36379, 46110, 27523, 36383, 46108, 27528, 46107, 46106, 46103, 46102, 27529, 36381, 46104, 46111, 46101, 36384, 36376, 36378, 36377, 27965, 36858, 27966, 36857, 46849, 27971, 28522, 27970, 46852, 46850, 37379, 27964, 36385, 46851, 46853, 46854, 28516, 37380, 47734, 47730, 28519, 28520, 37381, 37385, 28523, 28517, 28514, 28513, 47732, 47729, 47733, 37382, 37383, 47731, 28521, 48259, 47735, 37386, 29070, 48676, 38058, 48674, 29066, 38059, 48675, 38052, 29068, 29067, 38053, 29071, 38054, 48672, 48671, 48669, 48677, 48670, 38057, 38056, 38692, 29636, 49635, 38698, 49633, 49632, 29069, 29641, 38699, 38693, 38696, 29638, 29645, 49642, 49640, 49639, 38695, 39387, 49637, 38694, 49641, 38697, 49636, 49634, 49638, 39388, 39392, 30271, 39389, 39391, 53043, 53044, 53041, 53045, 53042, 39390, 53039, 53167, 53040, 30895, 54090, 40788, 54091, 54095, 54094, 54093, 40106, 40108, 40107, 40105, 54089, 54092, 53046, 40562, 40791, 31470, 40790, 40789, 55081, 31473, 55833, 41383, 41384, 55082, 41385, 56508, 56507, 56506, 57183, 57184, 42749, 57708, 43307, 33532, 59138, 59137, 44205, 35371, 44235, 26574, 35400, 35399, 35454, 35455, 35456, 44663, 26732, 35570, 44662, 26736, 35748, 35744, 45008, 35747, 45009, 36017, 27207, 45501, 36018, 36016, 45503, 46112, 46116, 27531, 36390, 36386, 36388, 36389, 36387, 46113, 46114, 36860, 46857, 46855, 46858, 46859, 46860, 46856, 37390, 37387, 37389, 37392, 37388, 47736, 47737, 47738, 38061, 38060, 29072, 48679, 48678, 38062, 29647, 38703, 38701, 38702, 38706, 29646, 38705, 49645, 49643, 49644, 39396, 39393, 30273, 39394, 39395, 54096, 40793, 40792, 40794, 55083, 55085, 55084, 41387, 55835, 55836, 41977, 41976, 57185, 42750, 58505, 43308, 33632, 59528, 35372, 44312, 44313, 35458, 35457, 35459, 44664, 35571, 35572, 26933, 45012, 45011, 45505, 27209, 45506, 45507, 45504, 27533, 46119, 46118, 46121, 46122, 46117, 46120, 36392, 27978, 46861, 36391, 36861, 36862, 46862, 28527, 48680, 27976, 38064, 49646, 29648, 38707, 38708, 30900, 54097, 54098, 55086, 55087, 40795, 57186, 44189, 26541, 44315, 44665, 44668, 35573, 44666, 44667, 27210, 45510, 45512, 45508, 45509, 45511, 46863, 46123, 46063, 47739, 29074, 55837, 42505, 44190, 35460, 44445, 26636, 44444, 44669, 26737, 44670, 45014, 35749, 35750, 27212, 45515, 36020, 45514, 36019, 45513, 45518, 45516, 36393, 46125, 46124, 36394, 46864, 28528, 48682, 47740, 46126, 38065, 29649, 49648, 49647, 39397, 39398, 39399, 40111, 55088, 32378, 55838, 57187, 59010, 59348, 35461, 44446, 35575, 44672, 45517, 36021, 46127, 57188, 58139, 44237, 35401, 35402, 44316, 44447, 26637, 26638, 44450, 44449, 35463, 35462, 44451, 44674, 35576, 44675, 44452, 44676, 35751, 45015, 45018, 45019, 45017, 45016, 46128, 46129, 27984, 27982, 27983, 48685, 48684, 48686, 48688, 39400, 53047, 55089, 56509, 57709, 59011, 59139, 44317, 44454, 44453, 44455, 26739, 35578, 35577, 44677, 26936, 26935, 45023, 45022, 45024, 45021, 45025, 45020, 45027, 27215, 27214, 36024, 45520, 46131, 27536, 36395, 46130, 46133, 46807, 46132, 46866, 46865, 46134, 46867, 47742, 47743, 47744, 37442, 48689, 38710, 49649, 53048, 59262, 35373, 26542, 44238, 26639, 45029, 44457, 44456, 26741, 45522, 36025, 45521, 27216, 46135, 45523, 47745, 36396, 38066, 48690, 38711, 55839, 35374, 35403, 44458, 44320, 44318, 44321, 35404, 26640, 35464, 44459, 44460, 35468, 35469, 35466, 35467, 44679, 35579, 44678, 35580, 44617, 45032, 45031, 45034, 45033, 35752, 26939, 45030, 36026, 27217, 45533, 45528, 45531, 45532, 45527, 45525, 45529, 45530, 27218, 45526, 46142, 46143, 27538, 36397, 27539, 46138, 46136, 46139, 46141, 46140, 46137, 36398, 46875, 46870, 27988, 46874, 46871, 46872, 36863, 46873, 27987, 28531, 47749, 47747, 28532, 47748, 47746, 47750, 47751, 38067, 38068, 48695, 48694, 48691, 48692, 29076, 29650, 49651, 49654, 49650, 49655, 38712, 49653, 49656, 49658, 49657, 49652, 53050, 30275, 39401, 53051, 53049, 53431, 40112, 54100, 54099, 55504, 57252, 57710, 43479, 58797, 59426, 59520, 35357, 44207, 44208, 44240, 44323, 44322, 26643, 44464, 44462, 26642, 44463, 44681, 35559, 45037, 45036, 45038, 45039, 45534, 45535, 27219, 46145, 46144, 46194, 46073, 37393, 47753, 47755, 48381, 47754, 38070, 48696, 38069, 49659, 50183, 53052, 40113, 57037, 44243, 35375, 44241, 35377, 44245, 44242, 44326, 26579, 35405, 44327, 35406, 44324, 44325, 44466, 26644, 44465, 35471, 44467, 35470, 44468, 44685, 44683, 35581, 26743, 45042, 45040, 45043, 45041, 45540, 45537, 45539, 45538, 45536, 45859, 36023, 46150, 36399, 46151, 46148, 46146, 46149, 46788, 46881, 46883, 36865, 36866, 46880, 46878, 46886, 46879, 36400, 46877, 46884, 46885, 46809, 46882, 28533, 37394, 47758, 47756, 47757, 29080, 29079, 48698, 48699, 48697, 29078, 47759, 48750, 48700, 50008, 49661, 49660, 38713, 48970, 39404, 39405, 39403, 54102, 22114, 40151, 54101, 55092, 55091, 31944, 56511, 56510, 33010, 58140, 43309, 58798, 58799, 35378, 44247, 26546, 26545, 44246, 35408, 44330, 44329, 44335, 44331, 44334, 44328, 44307, 44333, 35476, 44474, 35474, 44475, 26646, 35475, 26649, 44473, 26648, 26647, 35473, 44469, 44471, 35472, 44470, 44472, 26749, 44696, 44687, 44694, 44693, 35585, 26753, 26756, 35590, 35583, 44689, 26750, 26745, 26751, 35587, 44690, 35588, 26748, 35584, 44688, 35591, 44692, 44691, 44697, 44686, 35582, 35586, 35589, 26943, 26945, 45047, 35763, 35755, 26942, 45045, 35764, 35756, 35758, 26948, 35767, 45044, 35769, 36040, 45052, 35759, 35762, 35761, 35768, 35760, 35765, 45054, 35766, 35757, 45046, 35754, 45049, 45048, 45051, 36401, 36039, 36051, 36046, 36029, 36050, 45547, 45541, 36032, 27224, 27223, 36048, 36038, 36044, 36043, 36047, 36041, 36042, 36030, 36034, 36045, 26949, 45552, 45553, 36052, 45542, 36027, 45550, 45549, 36049, 45543, 45551, 45545, 36033, 36035, 36036, 36037, 27226, 45548, 45546, 27221, 36028, 36031, 45544, 46162, 27545, 27552, 27553, 27548, 46155, 36423, 36410, 36408, 36421, 36406, 36415, 36431, 36418, 27551, 36422, 36429, 36427, 27543, 46156, 46157, 36426, 27544, 36409, 46160, 46161, 36432, 46159, 36428, 36433, 36416, 36434, 36413, 36430, 46497, 46154, 36411, 36414, 36417, 46158, 36425, 36420, 36402, 36403, 36404, 36419, 36424, 36407, 36405, 36435, 36885, 27990, 46898, 46895, 28005, 46890, 28002, 36896, 36888, 36891, 27995, 28006, 36883, 46897, 36869, 36889, 36884, 36893, 36867, 36892, 36881, 36874, 46892, 46896, 46904, 46901, 46905, 36873, 36875, 46887, 36871, 46893, 46902, 36870, 46894, 36872, 46888, 36880, 36887, 46906, 36897, 46891, 36879, 36868, 36886, 36877, 36882, 36876, 36895, 46900, 19521, 36898, 36894, 46899, 46889, 36878, 36890, 28534, 28546, 47769, 37415, 47774, 47781, 37404, 47772, 37409, 28535, 37419, 37396, 37398, 28539, 37405, 28536, 37420, 37411, 28547, 28540, 37414, 37418, 28551, 37427, 28542, 37423, 37425, 47765, 47779, 38071, 47762, 47766, 47775, 37413, 47771, 47782, 47777, 28549, 37417, 37400, 37401, 37402, 37408, 37416, 37412, 47778, 37422, 37426, 47780, 37424, 37421, 37410, 47773, 48716, 38072, 29086, 38076, 29091, 37399, 48724, 29085, 29081, 49665, 38082, 48710, 48712, 38079, 38093, 48717, 48707, 38083, 38073, 38090, 38100, 48722, 48714, 38089, 38092, 29090, 38095, 29082, 38088, 38081, 29092, 38084, 29094, 38086, 38087, 48718, 48723, 48701, 48721, 48720, 38096, 48715, 38077, 38085, 38080, 48703, 48727, 48705, 48702, 48704, 38099, 48708, 48706, 48711, 48719, 48725, 38097, 38091, 38074, 38078, 38075, 49669, 49663, 49674, 29654, 49678, 49668, 49680, 49679, 29655, 49675, 38716, 38720, 38718, 38725, 49666, 49670, 29653, 29661, 38724, 29657, 38719, 49664, 38714, 38715, 38722, 49681, 49662, 49672, 49673, 38721, 49676, 49671, 38717, 38723, 49677, 38728, 49667, 39406, 38726, 53064, 39412, 53068, 53065, 39410, 53071, 53057, 39417, 39423, 39414, 53062, 39415, 53070, 53063, 39407, 53058, 39416, 53069, 53072, 39418, 30282, 53074, 39411, 53055, 39409, 40802, 53073, 30278, 53067, 38730, 53066, 53056, 53054, 53081, 53075, 53077, 39419, 53080, 54114, 39408, 30285, 39424, 39421, 53078, 53496, 53076, 53060, 53059, 39413, 39420, 54123, 30909, 40127, 54109, 40125, 54121, 30913, 40117, 40131, 54113, 30903, 30914, 30901, 40124, 30911, 40122, 40115, 54124, 54108, 54117, 40121, 54112, 40119, 40114, 40128, 40123, 40126, 54106, 40118, 40116, 54120, 54105, 54104, 30904, 30915, 40130, 54119, 54111, 54110, 54115, 54122, 40120, 40129, 31485, 40801, 40796, 55096, 55093, 55103, 55104, 40798, 40806, 31476, 31481, 40803, 31482, 55094, 40804, 31484, 55100, 55098, 55097, 40799, 31480, 55101, 55108, 55107, 55099, 55105, 55102, 55095, 40805, 40797, 31949, 55844, 55850, 31948, 41389, 55846, 31946, 31951, 41397, 31952, 41979, 41388, 41395, 41394, 31953, 55845, 31950, 31954, 31947, 55849, 41392, 55842, 55848, 55843, 55841, 55847, 41393, 55840, 41390, 56513, 32381, 40800, 56520, 56518, 56516, 41981, 41982, 32383, 41978, 56521, 56519, 56512, 56514, 56517, 32382, 41983, 56515, 56665, 56522, 42383, 42384, 42378, 42380, 42379, 57190, 57192, 57194, 57191, 57189, 57193, 57195, 42381, 57712, 42756, 42754, 33014, 42753, 57711, 42752, 57715, 42755, 57714, 33012, 42751, 57713, 58148, 58149, 43070, 58144, 58145, 58146, 58143, 58141, 58142, 33249, 58147, 58508, 58509, 58507, 58506, 43480, 43481, 33533, 58800, 58802, 58801, 58803, 43310, 43618, 33634, 59012, 59143, 59142, 59145, 59141, 59144, 44248, 44249, 26585, 44479, 44477, 35478, 44478, 44476, 35477, 44701, 45555, 45055, 44705, 44703, 44704, 44706, 44709, 44707, 44698, 44702, 44699, 44700, 44708, 35772, 45060, 45057, 45058, 45059, 45327, 45056, 35771, 36053, 36055, 45559, 45558, 36054, 45554, 45557, 45556, 36437, 46166, 46163, 46165, 36436, 46164, 36438, 36901, 46910, 36902, 46909, 46908, 46907, 36899, 46911, 37430, 47783, 47784, 37428, 36900, 47785, 37429, 38101, 48728, 38102, 48730, 48731, 38103, 48729, 49683, 49687, 38731, 49684, 49689, 49685, 49686, 53084, 53085, 53083, 30916, 55111, 55109, 55110, 32384, 57196, 57717, 57716, 26547, 35379, 44337, 44338, 44482, 44481, 44723, 26759, 44719, 44715, 44711, 44722, 44710, 44718, 44720, 44713, 44716, 44721, 44717, 44714, 44712, 35593, 35592, 35594, 35595, 35596, 26957, 45072, 45064, 45069, 45063, 26954, 45067, 26959, 45065, 35773, 45074, 44682, 45066, 26958, 45073, 45068, 45070, 45071, 45062, 45061, 35774, 36060, 45561, 36056, 45563, 45560, 36057, 27228, 45570, 45562, 45569, 45571, 45982, 45566, 45567, 45565, 36062, 36059, 36063, 36061, 36058, 36439, 27559, 46173, 27557, 27561, 46171, 46181, 46175, 46182, 46183, 46170, 46167, 46179, 46168, 46185, 46169, 46184, 46176, 46177, 46178, 36441, 46180, 46172, 36440, 36443, 28010, 46912, 28009, 36908, 46925, 46918, 36906, 46915, 36442, 46924, 46921, 36905, 28013, 28014, 46919, 46920, 36907, 46922, 46926, 28011, 46913, 46914, 36903, 36904, 20068, 48737, 28563, 47790, 28555, 47788, 28561, 28557, 47794, 47799, 28566, 47787, 47789, 47796, 37431, 46923, 47798, 29103, 37436, 28564, 48580, 37435, 47800, 47793, 47792, 28565, 47795, 37434, 37437, 47791, 37432, 37433, 37438, 38107, 48745, 48734, 48744, 38114, 29097, 49697, 48741, 38113, 48740, 38105, 38112, 38104, 48743, 48739, 38110, 38111, 29098, 38108, 48732, 48735, 48742, 48736, 48738, 38115, 38109, 38106, 38736, 38735, 38734, 49691, 29669, 49699, 49701, 49696, 38737, 49695, 38733, 49702, 49692, 49706, 49698, 49682, 29667, 49700, 49693, 38732, 38738, 53097, 30287, 30288, 53094, 30289, 39428, 39429, 53090, 53103, 30290, 53102, 53099, 39430, 39432, 53086, 53100, 53091, 53092, 53093, 39466, 53098, 53096, 53088, 39431, 39427, 39425, 53087, 39426, 54128, 54130, 54125, 30918, 30921, 30920, 54126, 54129, 40133, 54131, 40134, 40132, 54880, 54132, 54127, 30917, 55118, 31488, 55112, 40809, 55114, 55119, 55117, 55120, 40807, 54133, 55817, 55115, 55116, 31489, 40810, 55855, 41398, 55113, 41400, 55854, 55852, 55853, 40811, 41399, 41401, 56527, 56524, 41984, 56532, 56526, 56528, 56531, 56896, 56525, 55856, 32730, 57197, 42386, 57723, 33015, 57719, 57718, 57722, 57720, 42759, 57721, 42757, 42758, 58150, 43071, 58152, 43072, 58510, 58151, 58804, 43482, 43866, 59465, 59535, 59548, 44339, 45572, 44724, 45075, 36445, 46187, 45573, 46186, 36444, 46927, 47801, 48748, 48747, 49705, 50567, 49703, 49704, 53105, 53104, 54134, 55857, 56242, 55858, 56533, 56534, 56708, 58153, 35358, 44340, 44484, 44483, 44725, 46188, 46928, 46929, 48749, 44486, 44485, 35599, 35598, 26962, 45076, 36909, 46930, 46933, 36446, 46932, 46931, 38116, 48751, 49707, 49708, 39433, 54135, 54136, 55121, 56535, 55861, 55859, 55860, 56536, 57198, 44341, 44342, 44487, 44727, 44726, 45077, 36064, 36449, 27562, 36448, 46191, 46190, 46192, 36450, 28015, 36912, 46934, 36910, 36911, 36913, 47803, 37441, 37445, 37443, 37444, 38117, 48752, 38119, 38118, 48754, 29674, 49710, 49711, 49709, 38739, 38741, 53106, 39434, 55862, 40812, 40813, 56537, 44250, 44251, 44343, 35429, 44489, 26653, 44492, 44493, 44491, 44490, 26762, 26763, 26765, 44729, 44728, 26969, 35777, 26967, 45078, 45079, 27232, 45085, 45081, 45082, 45083, 45084, 45086, 26972, 45080, 44956, 27233, 27231, 36066, 36067, 36065, 36453, 46193, 46196, 36451, 36454, 46195, 27564, 36452, 36915, 27563, 46938, 46941, 19551, 46935, 46940, 46937, 46942, 46936, 28018, 36914, 29107, 47807, 47810, 47812, 47809, 47804, 47811, 37446, 47808, 28571, 28569, 37447, 47806, 48755, 48756, 29106, 38120, 38121, 38122, 49713, 29676, 38742, 29675, 49712, 38743, 30291, 53111, 53107, 53110, 54141, 53109, 39436, 53108, 29677, 39435, 54142, 40135, 54137, 54138, 31490, 54139, 55123, 55122, 40814, 31503, 31956, 42387, 57724, 43311, 58805, 35409, 44494, 26657, 44495, 26656, 35480, 44496, 35479, 44733, 26767, 26770, 44731, 44732, 44734, 44730, 35601, 35602, 35600, 26975, 45090, 45089, 35783, 26973, 35781, 26976, 35778, 35779, 26977, 45088, 45087, 35785, 35782, 35786, 35784, 27237, 36069, 45581, 45583, 45584, 27234, 27240, 36071, 27235, 36068, 45575, 45586, 45579, 36076, 45589, 45578, 45582, 27241, 45580, 45585, 45574, 45588, 36074, 27239, 36075, 36072, 45576, 45587, 36070, 36073, 45577, 19132, 36457, 46200, 36459, 36462, 36456, 46206, 36455, 46207, 46201, 46202, 46205, 46199, 36458, 46204, 46203, 36464, 36461, 36460, 36463, 36465, 46949, 46955, 46943, 46944, 36921, 46945, 46946, 46952, 36920, 36924, 46950, 28022, 46951, 36922, 46956, 46954, 28021, 46948, 46947, 36917, 36918, 36919, 36916, 28572, 47817, 28573, 37469, 47814, 28576, 37451, 37468, 47819, 47821, 37458, 47820, 47815, 37459, 37452, 37466, 37463, 37450, 37454, 37465, 47818, 37467, 47813, 37448, 38123, 37462, 37455, 37461, 37460, 37453, 37456, 37464, 47822, 38132, 38127, 38130, 38124, 29114, 38126, 48758, 29111, 29109, 48762, 48760, 49723, 38129, 38128, 48761, 48757, 48759, 48763, 38125, 38131, 38133, 48765, 29689, 38745, 29683, 49722, 29690, 49714, 38747, 53118, 29692, 49716, 29688, 38750, 29687, 49715, 49719, 29691, 29678, 49717, 38746, 38749, 38748, 53115, 38744, 49718, 39444, 39442, 30292, 39439, 53124, 39440, 30298, 30294, 53121, 30297, 53114, 49720, 53113, 55132, 39437, 39445, 49721, 53116, 53123, 53122, 53117, 53112, 39443, 39438, 30296, 53119, 39441, 53120, 40145, 40140, 54148, 54143, 40146, 40143, 54144, 30925, 54151, 40139, 54154, 40136, 54153, 54155, 40137, 54149, 54150, 54146, 54145, 54147, 40144, 40138, 40142, 54152, 55126, 55135, 55130, 30924, 55128, 31492, 55134, 55125, 40817, 40815, 55127, 55129, 55131, 40816, 31494, 55133, 55136, 55124, 41402, 31957, 55866, 41403, 41404, 55865, 55867, 55864, 55868, 55863, 41986, 32386, 56538, 56543, 56541, 56539, 41988, 41987, 57200, 42388, 42389, 42390, 57725, 42761, 57726, 42760, 58157, 43073, 58156, 58158, 58154, 58155, 58159, 43312, 58511, 58807, 58808, 58806, 58809, 43619, 59264, 43778, 26526, 44345, 35410, 44346, 44498, 44497, 44735, 44736, 35605, 26771, 35604, 27244, 45593, 45092, 45091, 45093, 45592, 45590, 45595, 45594, 45591, 46210, 36466, 46209, 36467, 37471, 47824, 37470, 47825, 47823, 29115, 29117, 48768, 38135, 48766, 48767, 38134, 29118, 49724, 38751, 30300, 30301, 39446, 54158, 54157, 54160, 54161, 40147, 54159, 55137, 57201, 42391, 44252, 35411, 44499, 44502, 44503, 26659, 44500, 44743, 44742, 26773, 44740, 44741, 35788, 35787, 45095, 35789, 45096, 45097, 45094, 36077, 45597, 45599, 36078, 27246, 27247, 27248, 45600, 45596, 45598, 45601, 45602, 27583, 46218, 27578, 27577, 27576, 27580, 46221, 46222, 46216, 46215, 36470, 36473, 46212, 46219, 46217, 46220, 46211, 46213, 36472, 36471, 28024, 36926, 46960, 46962, 46961, 46959, 46964, 36927, 28026, 46965, 36925, 46958, 37473, 28581, 37476, 47831, 47826, 28578, 37472, 37475, 47829, 28580, 37474, 47830, 47827, 47828, 37477, 48775, 48771, 29120, 29125, 38136, 48778, 38137, 48773, 48772, 48777, 29122, 48774, 48770, 48776, 48769, 49725, 49732, 38755, 38753, 49729, 49737, 29695, 49739, 49736, 49731, 38752, 53128, 49733, 49730, 49734, 49738, 49726, 49728, 38754, 49735, 50360, 53125, 39447, 30306, 53132, 30307, 53130, 53127, 53133, 53131, 39450, 39448, 53126, 39449, 54164, 54166, 40149, 30927, 40150, 40148, 54165, 54162, 54163, 55140, 55138, 40819, 55139, 55141, 53129, 40818, 56549, 41405, 55869, 32390, 56544, 56546, 32389, 56548, 56547, 56545, 32733, 57202, 57727, 33017, 57728, 57729, 43075, 33251, 58160, 43074, 58161, 33406, 33534, 59013, 59350, 43620, 33703, 43716, 33732, 59265, 59427, 44253, 45099, 45098, 36080, 45603, 45606, 45604, 28028, 47446, 46967, 46966, 28582, 46968, 48781, 48779, 48780, 49741, 29803, 49742, 38756, 53135, 53134, 54168, 40093, 54167, 55142, 55143, 41406, 56550, 57203, 57730, 44254, 44505, 35481, 44747, 26777, 44746, 44745, 35790, 45100, 45607, 45605, 45608, 36081, 27584, 46226, 46970, 36928, 37478, 46972, 46969, 46971, 47832, 47834, 47833, 38138, 38757, 49744, 49743, 39451, 53136, 40152, 54169, 41407, 42762, 26549, 35412, 44348, 44347, 35482, 35607, 26778, 35791, 44748, 35606, 35609, 35608, 45609, 35792, 45101, 35794, 45610, 35793, 36082, 45612, 45613, 36083, 45614, 36474, 46229, 46227, 36475, 46228, 46230, 46975, 36929, 28031, 36931, 47837, 47835, 47836, 28585, 47838, 48782, 48784, 48783, 39015, 29699, 49745, 38759, 38758, 49746, 38760, 54172, 53139, 53138, 53137, 54170, 40153, 54171, 54173, 55144, 33018, 33252, 43621, 44209, 26592, 26591, 44349, 44506, 26663, 35483, 44507, 44509, 44510, 44508, 44752, 44750, 44749, 44751, 35610, 26989, 26988, 45102, 45103, 35795, 45104, 35796, 27252, 45615, 45620, 27255, 27251, 36086, 45619, 45618, 45617, 45616, 45621, 36085, 46235, 27589, 46232, 27588, 46976, 46233, 46231, 36477, 36478, 46234, 46236, 36476, 46237, 46982, 46978, 36935, 36937, 36934, 36936, 36933, 36938, 46985, 46979, 46977, 46981, 46984, 46983, 47848, 47849, 47847, 28587, 47845, 47841, 37479, 28588, 37480, 47840, 47839, 47850, 47846, 47851, 47843, 47844, 28589, 48788, 38142, 38140, 48791, 38141, 48790, 48794, 48786, 48785, 48792, 48789, 48787, 48793, 38139, 29701, 29703, 29700, 49749, 49747, 49748, 49750, 38761, 53141, 39455, 39454, 39453, 54175, 54174, 53140, 54438, 55145, 55870, 32391, 41989, 42392, 43077, 35359, 44255, 44350, 44513, 44512, 44511, 35484, 26780, 44753, 26990, 45106, 45105, 36088, 45623, 45624, 36087, 45625, 46240, 46241, 46239, 46067, 46238, 46986, 46987, 47853, 37482, 47854, 47852, 48795, 49751, 53142, 54176, 53143, 53144, 57731, 58810, 35380, 35381, 44353, 44351, 44355, 44354, 44356, 35413, 44352, 44516, 44514, 44518, 17916, 44515, 35488, 44519, 44517, 35487, 44757, 35612, 35619, 35620, 44759, 35617, 35616, 35618, 35613, 35614, 44760, 44755, 44761, 44756, 44758, 26788, 44763, 44762, 26787, 44754, 35621, 26993, 35804, 45110, 26996, 45107, 35802, 35803, 45115, 35800, 45112, 45117, 35798, 45114, 35801, 35799, 45109, 44764, 45113, 45318, 45108, 35805, 45637, 45631, 36089, 45632, 36090, 27259, 36091, 45627, 45630, 45639, 45634, 45626, 45628, 45638, 45636, 45633, 45629, 36092, 27257, 36483, 36480, 27591, 27598, 36481, 46248, 27597, 36491, 36487, 36482, 46246, 36488, 36484, 36486, 46251, 46247, 27607, 46242, 27608, 27595, 46252, 46249, 46250, 46244, 36479, 36490, 27602, 36492, 36493, 36489, 46669, 28037, 47010, 47003, 47005, 28039, 28041, 36941, 46994, 47001, 46996, 36949, 28035, 47006, 47011, 47008, 46989, 47009, 28043, 28038, 36939, 36947, 46988, 28033, 36940, 36945, 47007, 47002, 46992, 45787, 46998, 46997, 46999, 47000, 47004, 28042, 36950, 36942, 36948, 36944, 36943, 36946, 36951, 37484, 47864, 37489, 47855, 47865, 37490, 37487, 37486, 28591, 37491, 37485, 37492, 37493, 37495, 47859, 46995, 28592, 47860, 37488, 28594, 37483, 37494, 47858, 37496, 47863, 47857, 47862, 47861, 38149, 48798, 38145, 29135, 38150, 48799, 49752, 29138, 48806, 38143, 38152, 48796, 38148, 48797, 48810, 48801, 48809, 38147, 48807, 49757, 38151, 48811, 48803, 48808, 38144, 48800, 38762, 38770, 38768, 49758, 49753, 29714, 29709, 29708, 38763, 38767, 38766, 38769, 38773, 49755, 49764, 38772, 38764, 38765, 49759, 29712, 49763, 29710, 29706, 38771, 49762, 49760, 49756, 29711, 48802, 30313, 53150, 30317, 53146, 39458, 53157, 53151, 39463, 39456, 53148, 53158, 39464, 53156, 53153, 53154, 39465, 39459, 39462, 54179, 53147, 53145, 53152, 53155, 39460, 53149, 30316, 40156, 30928, 54185, 30929, 40158, 54177, 40161, 40157, 40154, 54182, 54178, 40820, 40155, 54180, 54184, 54183, 54186, 54181, 54188, 40160, 31498, 40822, 41412, 55147, 40826, 55153, 40821, 55149, 55151, 55148, 40824, 55146, 55152, 31499, 55150, 55154, 55278, 40827, 56551, 41411, 55874, 31959, 41408, 41409, 55876, 41410, 55873, 55872, 55875, 41413, 41414, 56553, 32394, 56555, 41992, 32392, 56554, 56556, 56557, 56558, 56559, 56552, 32735, 57204, 32734, 42393, 57206, 57205, 40825, 42763, 42765, 42764, 57733, 57732, 43078, 33254, 33255, 58162, 58164, 58163, 58165, 43079, 58811, 33537, 33536, 58813, 43483, 58812, 43622, 43717, 43779, 43831, 59266, 43917, 44256, 26512, 26667, 35489, 44520, 44521, 35490, 44461, 26789, 35622, 45118, 45642, 45641, 45643, 45640, 46253, 36952, 28044, 47012, 37497, 49765, 53159, 40162, 55155, 55877, 56560, 41993, 58814, 59428, 44258, 44260, 44259, 35415, 35414, 35623, 44766, 45644, 46255, 47013, 53160, 56561, 44357, 35491, 45119, 45646, 45645, 27610, 47014, 37286, 36954, 47015, 36953, 47867, 53161, 55878, 26594, 44358, 44359, 35494, 35493, 26669, 35496, 44526, 44525, 44523, 35492, 44524, 35495, 44776, 44770, 35627, 44767, 35625, 35624, 35628, 44775, 35629, 44771, 44774, 35626, 44768, 44769, 44772, 35630, 44773, 35810, 26998, 35808, 35812, 35809, 35811, 35814, 45122, 35813, 35815, 45121, 35816, 45120, 35806, 35807, 36095, 45655, 36094, 36097, 36093, 36098, 45652, 36100, 36099, 45648, 36096, 45647, 45658, 45660, 27265, 45654, 45653, 45649, 45650, 45659, 45657, 45651, 36495, 46265, 36494, 46261, 36496, 36955, 46257, 27614, 27615, 46262, 36497, 46260, 46264, 46263, 27612, 46266, 46267, 46256, 46258, 47020, 36962, 28049, 28046, 28047, 36960, 36956, 47025, 36957, 36961, 47027, 36958, 36963, 47021, 47026, 47017, 36959, 47019, 47024, 47016, 47028, 47022, 47018, 47870, 28605, 47875, 37500, 37501, 28599, 37499, 47871, 28598, 37506, 37507, 47023, 47877, 47874, 47872, 37504, 47869, 47876, 37502, 37498, 47878, 37505, 38157, 29141, 38777, 29144, 38154, 38153, 29143, 38156, 38159, 48815, 48812, 48814, 49768, 38160, 48813, 38155, 38158, 49769, 49770, 38783, 29723, 38774, 38780, 49767, 38779, 38782, 38784, 38775, 38781, 38776, 53164, 53166, 39469, 39468, 39470, 30322, 39471, 39473, 30321, 53163, 53162, 53165, 39472, 39474, 39467, 54191, 40167, 54193, 54199, 40166, 30933, 54198, 54197, 40164, 54192, 40165, 54195, 40168, 54190, 30935, 40828, 40829, 31501, 55158, 55156, 55157, 41417, 41416, 41415, 56563, 32396, 41994, 32395, 56562, 56564, 41995, 57207, 42394, 57734, 58167, 42766, 43080, 58166, 58815, 58816, 43484, 59267, 59304, 26595, 44777, 35631, 26795, 45123, 45662, 45661, 46268, 36964, 47879, 37508, 48816, 38785, 57208, 44261, 44262, 44361, 35416, 44360, 26672, 26796, 35632, 44993, 45124, 35817, 35818, 45663, 45622, 27830, 46269, 28053, 47880, 38161, 38786, 53168, 49771, 53169, 53170, 31495, 58168, 26673, 35499, 44529, 35498, 44528, 44527, 44531, 26674, 44530, 44780, 35635, 35637, 35636, 35633, 35634, 44779, 44783, 45127, 44778, 44781, 35638, 35825, 35821, 35820, 35824, 35823, 27002, 45125, 45128, 45126, 27007, 45129, 35822, 35826, 45130, 36103, 36105, 27266, 45665, 36104, 45666, 45664, 36500, 36503, 36501, 36504, 36498, 46273, 46274, 27619, 36505, 36502, 46275, 36499, 46272, 46270, 46271, 36468, 36977, 36968, 36966, 28056, 47034, 36975, 47039, 47029, 36970, 36969, 36972, 36971, 47030, 47031, 36974, 36965, 28059, 47035, 36976, 37513, 47032, 47038, 47686, 36967, 47033, 36973, 47887, 28054, 37516, 37517, 37518, 47888, 47891, 37512, 47890, 28609, 37515, 37511, 47886, 28610, 37510, 48821, 47883, 47884, 37509, 47885, 47889, 29150, 38168, 29151, 48818, 48819, 38165, 38166, 48824, 38162, 48822, 48820, 48825, 38167, 38163, 48823, 29727, 38787, 29726, 38789, 49773, 38791, 38790, 49772, 49774, 50118, 53171, 30325, 28606, 30323, 39475, 30324, 54200, 53175, 39477, 39479, 53172, 53174, 53176, 53173, 39476, 40170, 39478, 40172, 40169, 30938, 40173, 55161, 40831, 55159, 55160, 40830, 55162, 40832, 55884, 55881, 41418, 55880, 55882, 55879, 55883, 56565, 56566, 41419, 41996, 41997, 42397, 42396, 57212, 57210, 42395, 57209, 57211, 57213, 33021, 57735, 57780, 43081, 58169, 58170, 43313, 58512, 58817, 59147, 43781, 43780, 45131, 45132, 45133, 36978, 47892, 38169, 44210, 44264, 44362, 44784, 26799, 45669, 44788, 44786, 44789, 27008, 45135, 35827, 45136, 18542, 27104, 46062, 45671, 45672, 45670, 45668, 45667, 46278, 46277, 27620, 46276, 46279, 47040, 47041, 47042, 47043, 47044, 47045, 28611, 47893, 47897, 47896, 47894, 47895, 48826, 38170, 49776, 49777, 49775, 38792, 53177, 54201, 54203, 30940, 40174, 55164, 55163, 58171, 59268, 59269, 59429, 44211, 44265, 26800, 44791, 44790, 35639, 45137, 45675, 45674, 45676, 36637, 47046, 37519, 48827, 49778, 53178, 54204, 35353, 35382, 44267, 44271, 44266, 44269, 44270, 44368, 44369, 44365, 44363, 44370, 44364, 44366, 44367, 35417, 35501, 35500, 44533, 44534, 44535, 44536, 35640, 44792, 35642, 44794, 35641, 44793, 35643, 35828, 45141, 45138, 45139, 45142, 45140, 45683, 36107, 45682, 27275, 45678, 36106, 45677, 36507, 36506, 36508, 46282, 46280, 36509, 46281, 36983, 36981, 36982, 47053, 47047, 27274, 47898, 47049, 47050, 36980, 47048, 47051, 47054, 47052, 47899, 47902, 37520, 37523, 37522, 47903, 37521, 47901, 47900, 38171, 29156, 48828, 48829, 38793, 49779, 38794, 49780, 49782, 49783, 49781, 39480, 39481, 30331, 53179, 53180, 54206, 40175, 30941, 54207, 54205, 55166, 55165, 55167, 31961, 41421, 55885, 41420, 56570, 56568, 56572, 56567, 56569, 41998, 42398, 57214, 32398, 57216, 57215, 42399, 42767, 42768, 33022, 57736, 43082, 58965, 59016, 59351, 44539, 44537, 44538, 35644, 45684, 45143, 45325, 45687, 46283, 45685, 45686, 46285, 46284, 47055, 48504, 37524, 47905, 47904, 38173, 49785, 49788, 49786, 49784, 49787, 54208, 54189, 30943, 55168, 55888, 55887, 55886, 56575, 56573, 56574, 58172, 58513, 59148, 44372, 44371, 44542, 44540, 44795, 35829, 45146, 45145, 46286, 27625, 27624, 37287, 47060, 47056, 47057, 47059, 47058, 36984, 47906, 47909, 47907, 47908, 48834, 48831, 48833, 48832, 29731, 49789, 53184, 53185, 53182, 53183, 39482, 30944, 40176, 54211, 55169, 55889, 57217, 57737, 43084, 44272, 35418, 26596, 35502, 26679, 35503, 35645, 44799, 35646, 44798, 44800, 44802, 44797, 35647, 44796, 44801, 35832, 45148, 35830, 45147, 35831, 36108, 45150, 27278, 45689, 36111, 36109, 45691, 36113, 36112, 45690, 46292, 27630, 27628, 27633, 27626, 36514, 36512, 27629, 27631, 27627, 27632, 36513, 46288, 46294, 46291, 46290, 46295, 46293, 46289, 28065, 36988, 47071, 47064, 36985, 36990, 36987, 47063, 36989, 28067, 47070, 47068, 47065, 28068, 47069, 36986, 47067, 47062, 47066, 47913, 28613, 37527, 37526, 37532, 37531, 37528, 28614, 47910, 37525, 47912, 37529, 28064, 47911, 37530, 38175, 38174, 48835, 48837, 48840, 48836, 48838, 48839, 49237, 38176, 29157, 49795, 49792, 38797, 49791, 29733, 38796, 29736, 29735, 49790, 38799, 38801, 38795, 49797, 49798, 49799, 38798, 49793, 49794, 30335, 39483, 40835, 30334, 30333, 39484, 53186, 53188, 53187, 53189, 54212, 40177, 40179, 54214, 54213, 54215, 40178, 40834, 55170, 31505, 40833, 41423, 55890, 41422, 55891, 41424, 56576, 56578, 56579, 57153, 56577, 42400, 32741, 32740, 57218, 57738, 42769, 58173, 33408, 43623, 35360, 44274, 26680, 35419, 44373, 44546, 35504, 44807, 35510, 44804, 35505, 44544, 44545, 35506, 44803, 44805, 44808, 44543, 35509, 35648, 35650, 27014, 44813, 44811, 45157, 44814, 45151, 44809, 44810, 45155, 44812, 44815, 18141, 44816, 35651, 45156, 45152, 45153, 26802, 27013, 35833, 45154, 27016, 45163, 27298, 45698, 27020, 45164, 45692, 35834, 45695, 45166, 27019, 35836, 27283, 35835, 27294, 45160, 35837, 27026, 27295, 45693, 45694, 45167, 45158, 45696, 27297, 45697, 45159, 45161, 45165, 45162, 46306, 46304, 45701, 27300, 36118, 27293, 27644, 36517, 36117, 45708, 46302, 45702, 27634, 36515, 45704, 46298, 27636, 45707, 36115, 27635, 45709, 45700, 45706, 46301, 46300, 27645, 45703, 46297, 46303, 36516, 46296, 36521, 36527, 36530, 47076, 46314, 47078, 47074, 47079, 46315, 36524, 47072, 27649, 47082, 36525, 27641, 37002, 36520, 36531, 46313, 46308, 36993, 46310, 46312, 47075, 46311, 47080, 27642, 36519, 46307, 36992, 47081, 47083, 36991, 36518, 47073, 46316, 46317, 36523, 36528, 28633, 47926, 28620, 36998, 47091, 28618, 47928, 47918, 37558, 47093, 47927, 47095, 28080, 36522, 28088, 47086, 47923, 28076, 37536, 36996, 36999, 28619, 47088, 37001, 47085, 47077, 28084, 37533, 47925, 37003, 28074, 47092, 47090, 47089, 47915, 47921, 37535, 37538, 47929, 36994, 47920, 47931, 47916, 47914, 47084, 37537, 47917, 36995, 47087, 47943, 47922, 47094, 29170, 37547, 37550, 37555, 28622, 28630, 28624, 48846, 47942, 37553, 47941, 28626, 37559, 37561, 37540, 48850, 37563, 38182, 28634, 37556, 47940, 37543, 47936, 38183, 37541, 37557, 37004, 48841, 37544, 29161, 28631, 37562, 37554, 37548, 38180, 47932, 37552, 37534, 47939, 48851, 48852, 48843, 47938, 37560, 48847, 48849, 38178, 29171, 28625, 37546, 47934, 48845, 48848, 48844, 47935, 37551, 38177, 37549, 38191, 38185, 38184, 48860, 39485, 38200, 49804, 38188, 38194, 38199, 49809, 48864, 38802, 38190, 49801, 48854, 38187, 38192, 38189, 48842, 30345, 49811, 49814, 38198, 48857, 49807, 29750, 49813, 49812, 38196, 38804, 38193, 49806, 49803, 49802, 38186, 48856, 48862, 49805, 49810, 38195, 49808, 48863, 49822, 49826, 29740, 29739, 39486, 49817, 38814, 38813, 38810, 29160, 49816, 53191, 53194, 39488, 38807, 38806, 38803, 38808, 38809, 38816, 49824, 49818, 49819, 48859, 49821, 53193, 49820, 53196, 38811, 38815, 54217, 29754, 53192, 53197, 49800, 38805, 49815, 39487, 38812, 54224, 30337, 29753, 54218, 30348, 54220, 39494, 54226, 30341, 39493, 53198, 39498, 30349, 54228, 37542, 39497, 39500, 30946, 30947, 53204, 39499, 55175, 39495, 40183, 31509, 53199, 53205, 40189, 39490, 39492, 40182, 39491, 54239, 54230, 54229, 53203, 30953, 54223, 54222, 54225, 39496, 54219, 54227, 40180, 54473, 53202, 53472, 30347, 40181, 40184, 40185, 40187, 54234, 54231, 40190, 40191, 40186, 54237, 54235, 54236, 40192, 30954, 40836, 54238, 55174, 55176, 55173, 55178, 40838, 54233, 55172, 54221, 40188, 55179, 40837, 40193, 55171, 40844, 31510, 31506, 31969, 40841, 41427, 41425, 55894, 55183, 31965, 40840, 40842, 55180, 55182, 40843, 41426, 55893, 41428, 55892, 53195, 55895, 55181, 31966, 40845, 56582, 55896, 41431, 57219, 32402, 32401, 56585, 41432, 57222, 31967, 41433, 56592, 56588, 56581, 41430, 56587, 42000, 56583, 42003, 56580, 56589, 55897, 56586, 42001, 42002, 56584, 41999, 56597, 32747, 56594, 42007, 56591, 42403, 56596, 56593, 55898, 42008, 32742, 42004, 42401, 56598, 56590, 57220, 42010, 57221, 41429, 42005, 42009, 42402, 57740, 57225, 32744, 57224, 32748, 57739, 57226, 58514, 33023, 42404, 58174, 58175, 58176, 57742, 57741, 57743, 58177, 58515, 58517, 58518, 58516, 58520, 43485, 58519, 58818, 43486, 58819, 43624, 58820, 33733, 43833, 43867, 35511, 26683, 44547, 44818, 35652, 44817, 44820, 44819, 27027, 45168, 45175, 45171, 45173, 27028, 45172, 45170, 45174, 45712, 45710, 45713, 45715, 27303, 45716, 45714, 45711, 46318, 36534, 46320, 36533, 46319, 37006, 28090, 47098, 47097, 37005, 47947, 47946, 47944, 47945, 28635, 47948, 37564, 37565, 29175, 48866, 38202, 38204, 29172, 48865, 38203, 49828, 49829, 38817, 38819, 38818, 53207, 38820, 49827, 39501, 30350, 30351, 53211, 53210, 53208, 49830, 53206, 53212, 53209, 53213, 54247, 54242, 54241, 54244, 54243, 54246, 54245, 54116, 54599, 54240, 55184, 40846, 55899, 56600, 32404, 56601, 42405, 42770, 57744, 44374, 35420, 44548, 44549, 26809, 35838, 45176, 45177, 45718, 45717, 45719, 36120, 45721, 45720, 36119, 46323, 46321, 46322, 36536, 36535, 47099, 37566, 37568, 37569, 37567, 38205, 38821, 29756, 53214, 40847, 42771, 44375, 35421, 44376, 44377, 35422, 35513, 26687, 44550, 35519, 35517, 35516, 35512, 35514, 35518, 26812, 44826, 44829, 44828, 27032, 35654, 44822, 26813, 26810, 44830, 35655, 26816, 44825, 45180, 44824, 45188, 45178, 44823, 35653, 45179, 44827, 45181, 45182, 45184, 35840, 36121, 45187, 45723, 35842, 45725, 35841, 45724, 45722, 45185, 35843, 45733, 45735, 27315, 27306, 27307, 45734, 46324, 36126, 36129, 36128, 45728, 36134, 27655, 27319, 36125, 36124, 36538, 27310, 46325, 36135, 27317, 45731, 36127, 36131, 45729, 45737, 45726, 36130, 36123, 45736, 45732, 45727, 36122, 36537, 36539, 27664, 46332, 27659, 36548, 36546, 27660, 27314, 27656, 36545, 46338, 46327, 46340, 46330, 36544, 46329, 46334, 27657, 46335, 36547, 36540, 27658, 36542, 36543, 27661, 46337, 36541, 45738, 46333, 47100, 46336, 46331, 36133, 46339, 46341, 47101, 46326, 28093, 28094, 28637, 37014, 47110, 36549, 47116, 37008, 28095, 28107, 28097, 37007, 28104, 37570, 37009, 47113, 37012, 47114, 47105, 47102, 28109, 47954, 47949, 47103, 37010, 47952, 28636, 47108, 47951, 47950, 37013, 47106, 47953, 47112, 47109, 28096, 47107, 37011, 28111, 37580, 47959, 28648, 47966, 47961, 37582, 47972, 37589, 47956, 29188, 28646, 37571, 37579, 28638, 37577, 28642, 37578, 28649, 37575, 28652, 37584, 28645, 47973, 47974, 47965, 37586, 47958, 47977, 47962, 37585, 28651, 47978, 47957, 37581, 37583, 47975, 37573, 47967, 47976, 47971, 47983, 47970, 47984, 47979, 47964, 37587, 47968, 37588, 37576, 47963, 47982, 37574, 48868, 48869, 47969, 47980, 47960, 37572, 38213, 48876, 29182, 29180, 38216, 29177, 48873, 29184, 29190, 29178, 29189, 48879, 38212, 38822, 38206, 49831, 48884, 48870, 48882, 48881, 38208, 38214, 38209, 48874, 48880, 38211, 48883, 48877, 38207, 48875, 38210, 48872, 48878, 48871, 38215, 49841, 39504, 38828, 38831, 29769, 29766, 49847, 49848, 49833, 29758, 49850, 38827, 29770, 39503, 38830, 49840, 29760, 53218, 29762, 29761, 53217, 53220, 38825, 29772, 49844, 49849, 49845, 38829, 49842, 38832, 53215, 49846, 49838, 49836, 38823, 29767, 49834, 49839, 49835, 53222, 53227, 39507, 30366, 53232, 53226, 53228, 30358, 30355, 39508, 39506, 53240, 30360, 54252, 30362, 39512, 30367, 30359, 40194, 54265, 53224, 53223, 54250, 54248, 53239, 54249, 53231, 39511, 54251, 39510, 53230, 53237, 53238, 53233, 53236, 30354, 53221, 53234, 53235, 31513, 30958, 54258, 54253, 40195, 40196, 54267, 54263, 54255, 53225, 30955, 30960, 30957, 40198, 30956, 54266, 30963, 54264, 30965, 30959, 30964, 54262, 54254, 54269, 55186, 54261, 40200, 40197, 54260, 55185, 54256, 54268, 54257, 54259, 30961, 40849, 55194, 40850, 55199, 31516, 55192, 55198, 31515, 55197, 55189, 40851, 31512, 40848, 55187, 55200, 55193, 55191, 55195, 55201, 55188, 55190, 55196, 31978, 31983, 41437, 41434, 41435, 41436, 55907, 55906, 31980, 31982, 42013, 42406, 55908, 55905, 31979, 55902, 55904, 56602, 55900, 55903, 32405, 32407, 32406, 32408, 42408, 56605, 56607, 56609, 42014, 56603, 42407, 56611, 32410, 56608, 56606, 56604, 32409, 42012, 55909, 56610, 42411, 33024, 57228, 32751, 57227, 32752, 57231, 32753, 57229, 42412, 42409, 42410, 57230, 57751, 58178, 33026, 57746, 57750, 57749, 33027, 43088, 57748, 57747, 58179, 58180, 43087, 43090, 42772, 58181, 43085, 43089, 58183, 58522, 57745, 43086, 58182, 58523, 58823, 43488, 58822, 33538, 58824, 43487, 58821, 59149, 33734, 59270, 59507, 26688, 26818, 27035, 45739, 46343, 36719, 27665, 46342, 46189, 47118, 47117, 47986, 47985, 37590, 48885, 48886, 38834, 49851, 53241, 53242, 40201, 55204, 55203, 40852, 55205, 57232, 35656, 44832, 35657, 44833, 35658, 44831, 45191, 27041, 35847, 35845, 27038, 45195, 45189, 45193, 45192, 45190, 35844, 35846, 27037, 27323, 45740, 36139, 36138, 45743, 45745, 45744, 36136, 36137, 27321, 27322, 45742, 46344, 46345, 46347, 36553, 45746, 27672, 46349, 36551, 46351, 36550, 36555, 46346, 36554, 36552, 46350, 46348, 27668, 37018, 47125, 28119, 47119, 47120, 47122, 37020, 37021, 28121, 47123, 47121, 37016, 47126, 28122, 28115, 28118, 28114, 37019, 37015, 47124, 47995, 37601, 47992, 28665, 28666, 47996, 47991, 47997, 37591, 37599, 37600, 37598, 37592, 47993, 37596, 47988, 47987, 47990, 28657, 28658, 28659, 37593, 37594, 37017, 47989, 48894, 37595, 38218, 38221, 38223, 29194, 29202, 48890, 48893, 48888, 38222, 48895, 48892, 48887, 29203, 38217, 48896, 38220, 29201, 29192, 29193, 29195, 38219, 48889, 48891, 37022, 29197, 49131, 38841, 49860, 38839, 49852, 29775, 38838, 49853, 38836, 49857, 38844, 38842, 49858, 49856, 49855, 49859, 49854, 49861, 38840, 29774, 38843, 49862, 39014, 39513, 39518, 30373, 53249, 53244, 53243, 39517, 53253, 53250, 53248, 39516, 53251, 39514, 39515, 53246, 53247, 53245, 30968, 54271, 54275, 54277, 40202, 54280, 54276, 54278, 54270, 54274, 54281, 40204, 54279, 30967, 40205, 40206, 40207, 54273, 40203, 53252, 40208, 55207, 55206, 40853, 40857, 40856, 31517, 31518, 40854, 55208, 40855, 41439, 55911, 41438, 31986, 55912, 55913, 31984, 55910, 42018, 42017, 42015, 42016, 42413, 32756, 42414, 57233, 32754, 57236, 57235, 42415, 57237, 57238, 33029, 42774, 42775, 43091, 58524, 43314, 33411, 58525, 33636, 45196, 46354, 46355, 47127, 47129, 47128, 38224, 48897, 39519, 53255, 53254, 39520, 39521, 54282, 58526, 44275, 45747, 27675, 36557, 36556, 46356, 37023, 47131, 47130, 48000, 47998, 47999, 29204, 49863, 38225, 29777, 30374, 53256, 55209, 32411, 44276, 45198, 45197, 45748, 28123, 47133, 47132, 48003, 48007, 48006, 37602, 48009, 48002, 48001, 48005, 28667, 48251, 48008, 29205, 48901, 48899, 48902, 38226, 49866, 49865, 49867, 21260, 30376, 49864, 39523, 39524, 54286, 54285, 54284, 54287, 54283, 30970, 55210, 55211, 55914, 31987, 55915, 55916, 56612, 57239, 58184, 26823, 44834, 36140, 45751, 45750, 45749, 27677, 36558, 46358, 46360, 46362, 46359, 28124, 28126, 47135, 47134, 48012, 37604, 37603, 48011, 48013, 48010, 48903, 38227, 48904, 38845, 38847, 49869, 38846, 53257, 54288, 40209, 55212, 40858, 55918, 41440, 31988, 55919, 55917, 56613, 57752, 33258, 58185, 58825, 59017, 35659, 36141, 36560, 36559, 28668, 48014, 48905, 48906, 29209, 44379, 44378, 44552, 35520, 44551, 44553, 44835, 44836, 44842, 35660, 44839, 44837, 44841, 44840, 44838, 26825, 35853, 45203, 45202, 35854, 45212, 35849, 45208, 35852, 45209, 45206, 35851, 35850, 45204, 45207, 45200, 45210, 45211, 45201, 45205, 36144, 45752, 45753, 36143, 27329, 45755, 45756, 27331, 45757, 45761, 45759, 45758, 36565, 46367, 36566, 36567, 36562, 36568, 36563, 36561, 46371, 46365, 46369, 36564, 46366, 46370, 46368, 46374, 46372, 37024, 28129, 28670, 47144, 28134, 47139, 47136, 47137, 47141, 47138, 47146, 37026, 46373, 47145, 47147, 47143, 37025, 48020, 48023, 28133, 38228, 37609, 48018, 37606, 48019, 37608, 37605, 48015, 48016, 28672, 48025, 37610, 28676, 48017, 48024, 48026, 28675, 28677, 48021, 37611, 37607, 48914, 38230, 48912, 49870, 48913, 48910, 48915, 48909, 38028, 48916, 48911, 38231, 38848, 38852, 38850, 38851, 49873, 38853, 38856, 38857, 29779, 38855, 39525, 49871, 38849, 49874, 49876, 49877, 49872, 49875, 53268, 53263, 53262, 53265, 39529, 39532, 53261, 53258, 53259, 53269, 39531, 53267, 53264, 53266, 53260, 39528, 40210, 40212, 54292, 30978, 54290, 54296, 54294, 54298, 30977, 54297, 54289, 54293, 39526, 54209, 54272, 40211, 54291, 55216, 40859, 40860, 55217, 40861, 55214, 55215, 55218, 55213, 31989, 41441, 41442, 55920, 55923, 42020, 56616, 56615, 42019, 42021, 56614, 56617, 42416, 42377, 57240, 57753, 58186, 43076, 43092, 58527, 43489, 58826, 43626, 59352, 45213, 45214, 36146, 36145, 45763, 45762, 46375, 48029, 48028, 38232, 29783, 48917, 39534, 39533, 53270, 40862, 55925, 41443, 55924, 55922, 32412, 57241, 57242, 43834, 59531, 44380, 44554, 35661, 44846, 44844, 44845, 44843, 45215, 36147, 27332, 27333, 45764, 46376, 37027, 47150, 47152, 48032, 48031, 47151, 37612, 48918, 38234, 48919, 49880, 49881, 53271, 30381, 39536, 30380, 40215, 40213, 40863, 40214, 55220, 55219, 41444, 55926, 42417, 43318, 43490, 35383, 26553, 26600, 35522, 44557, 35521, 44555, 44556, 26692, 26691, 44849, 26830, 44847, 44848, 35663, 44850, 35662, 26826, 27052, 35857, 27047, 35856, 45224, 35861, 35863, 45221, 45220, 45219, 35858, 35864, 35860, 35859, 45217, 45222, 35865, 45225, 45226, 45223, 45218, 35866, 45367, 45767, 45766, 27334, 36149, 45768, 45769, 36148, 36152, 45770, 36571, 36153, 36151, 36154, 47153, 46388, 46392, 46384, 46386, 46379, 36572, 46381, 46378, 46390, 27683, 47154, 36150, 36574, 36575, 46377, 46385, 46380, 46382, 27686, 46387, 27693, 36577, 36573, 46391, 47165, 47166, 47156, 37028, 37036, 37621, 28142, 28137, 37034, 47164, 48047, 47160, 47161, 47163, 47162, 28144, 47159, 47157, 47158, 28141, 37037, 37029, 37032, 37031, 37033, 47167, 47155, 28691, 48053, 37620, 48920, 28683, 37623, 48035, 37617, 28680, 37615, 37619, 28686, 48046, 48048, 37625, 48037, 48034, 37622, 48052, 37627, 37626, 48039, 28685, 48040, 48043, 48050, 37631, 48921, 37628, 48057, 48036, 48038, 48054, 28688, 28693, 48055, 48056, 48042, 48044, 48045, 48051, 37633, 48049, 48058, 48041, 37629, 37632, 37613, 37614, 37616, 48925, 48935, 29226, 48933, 29223, 48934, 38242, 38237, 38241, 38238, 29213, 48938, 38246, 48944, 38235, 29229, 38247, 38236, 48932, 38243, 38240, 48943, 29222, 48936, 48937, 48940, 48927, 29219, 48939, 38239, 48946, 48926, 48928, 48923, 48924, 48929, 48931, 29228, 48945, 48922, 48942, 37630, 38245, 48930, 38867, 38869, 29794, 29785, 38866, 38868, 49892, 38874, 38871, 53272, 48947, 38860, 49882, 38873, 38859, 38877, 49885, 38863, 38872, 49886, 29789, 38861, 38862, 49888, 38865, 38870, 21286, 49893, 49890, 49894, 49895, 38875, 38876, 49887, 49889, 49883, 49896, 49884, 53275, 39550, 39541, 30388, 30400, 39538, 30393, 53284, 53279, 53287, 39554, 39548, 53283, 30399, 39542, 30392, 39547, 30396, 30391, 30382, 53286, 39539, 30403, 39552, 53281, 39546, 39553, 53276, 30394, 39540, 53288, 30389, 30398, 30402, 53273, 53277, 53278, 39555, 39551, 39549, 53274, 53280, 39543, 39537, 39545, 30984, 40230, 54310, 30994, 30981, 40864, 55221, 54301, 54304, 40228, 54309, 54319, 40227, 54316, 54303, 30991, 31533, 30980, 54300, 30988, 40226, 54308, 54305, 40218, 40224, 30985, 54315, 54321, 40225, 30986, 54307, 54312, 30992, 40217, 54302, 41450, 40222, 40223, 40219, 30397, 54320, 54313, 54306, 54299, 40229, 40216, 40220, 54317, 54318, 30990, 40221, 54314, 31524, 55225, 55223, 31528, 55227, 55231, 40869, 40870, 31531, 31527, 40873, 55228, 40871, 55226, 55232, 41451, 40866, 31534, 31525, 55234, 31523, 40868, 55236, 40865, 55229, 55233, 40872, 55235, 55222, 55224, 55090, 40874, 40875, 31998, 41447, 55936, 55932, 31993, 55940, 41457, 41452, 41459, 55938, 31996, 41449, 41455, 41460, 41453, 55237, 41464, 41448, 31994, 32003, 31997, 55942, 55937, 41456, 56625, 41462, 55935, 32002, 41461, 41458, 41445, 55927, 55928, 55930, 55934, 55941, 55939, 41454, 41463, 41446, 55931, 55933, 42022, 56622, 42025, 42028, 42026, 56621, 56619, 42030, 56620, 32419, 56627, 56628, 42024, 42023, 56624, 42032, 56626, 55929, 42031, 56623, 56618, 42029, 32762, 57243, 42424, 57245, 42427, 42033, 42419, 42418, 42422, 57244, 42421, 42426, 42420, 42027, 42425, 42423, 57246, 32761, 57756, 57755, 42780, 42782, 33031, 42778, 57760, 42777, 42779, 42781, 57757, 33030, 42784, 57761, 42787, 57759, 42786, 42785, 57758, 42783, 58191, 43097, 43098, 43095, 43093, 33260, 43094, 43096, 58190, 58189, 58187, 43320, 43322, 43491, 43323, 58531, 43321, 58532, 43324, 58530, 43492, 58528, 58529, 43325, 43319, 33539, 58827, 43493, 59018, 58828, 58829, 59019, 43628, 59020, 43627, 43629, 43718, 59271, 59021, 33704, 59263, 59272, 43835, 59353, 59354, 59466, 59491, 44559, 26832, 44852, 45227, 44855, 35664, 44854, 26831, 35873, 35872, 35869, 45228, 27056, 45229, 35874, 27055, 35870, 35871, 35868, 36158, 45773, 46393, 45775, 36161, 27344, 36160, 36157, 45772, 36155, 36159, 45774, 36156, 46396, 46397, 46394, 36584, 36578, 46395, 47168, 36583, 27698, 36580, 36585, 36582, 36581, 37040, 47169, 47170, 28698, 37638, 38250, 28695, 37636, 48061, 37039, 37639, 48062, 37635, 37640, 48063, 37637, 48060, 48059, 48957, 38249, 38248, 38253, 48954, 38252, 48950, 48949, 48951, 48952, 48953, 48956, 38251, 49407, 48955, 48948, 38881, 29808, 38883, 49898, 49897, 29809, 38882, 29806, 49904, 49899, 38879, 49905, 49903, 38880, 49901, 49900, 49902, 48958, 38878, 39557, 53296, 39559, 39560, 30406, 53292, 53290, 53297, 53289, 53293, 53294, 39558, 53295, 40231, 54323, 30997, 54322, 55239, 55241, 40876, 55240, 55238, 41465, 42035, 42034, 42791, 57248, 42790, 42789, 33261, 42788, 43099, 58194, 58192, 58193, 43494, 59022, 33637, 33705, 35361, 35423, 44381, 44561, 35667, 44857, 45230, 35666, 35668, 44856, 45241, 45233, 45240, 45239, 45235, 45232, 45237, 45231, 45236, 35875, 45238, 45234, 35876, 27059, 27345, 36162, 36022, 46398, 46401, 36586, 46399, 46403, 46402, 46400, 46287, 37041, 47173, 47172, 28701, 28699, 37641, 37642, 48068, 28702, 48067, 48069, 48065, 48070, 48071, 48066, 38255, 48959, 38254, 49602, 53299, 53302, 53300, 53303, 53298, 53301, 54327, 54326, 54324, 54325, 55242, 31537, 41466, 41467, 55943, 43100, 58533, 58534, 35424, 35384, 35523, 44858, 26694, 44562, 35669, 26834, 44563, 44859, 44864, 44860, 26833, 44865, 35670, 44862, 44861, 44863, 45244, 35877, 35883, 35878, 35881, 27060, 27061, 35880, 27064, 45242, 45243, 45245, 45776, 35882, 36167, 27347, 27348, 45783, 27346, 45777, 36163, 36164, 36170, 36165, 36166, 45782, 27349, 45779, 45780, 36169, 45781, 46404, 45778, 36171, 36587, 27702, 46407, 36592, 46410, 36593, 36589, 36590, 46408, 46411, 36594, 36588, 36591, 36595, 46405, 46406, 37046, 47177, 37045, 47176, 37042, 37043, 37044, 47174, 28148, 37047, 48074, 47178, 47175, 48961, 48075, 37650, 28709, 48076, 28704, 37645, 37644, 37646, 28708, 37649, 37651, 37647, 37643, 37648, 48077, 48960, 48073, 48963, 48968, 38256, 38257, 48965, 48967, 29238, 49907, 48969, 48964, 48962, 29817, 29811, 49910, 49911, 29812, 49908, 49909, 49832, 53306, 30410, 39561, 53304, 39564, 53305, 53308, 39563, 30998, 53309, 53307, 39562, 54328, 54329, 40232, 31001, 40234, 40233, 54331, 55245, 55243, 40878, 55246, 55244, 40879, 41469, 41468, 32004, 55945, 54330, 40880, 55944, 42036, 42792, 42793, 57762, 58195, 43329, 43328, 35885, 35884, 45784, 45785, 36596, 28149, 28150, 47181, 47182, 47179, 47180, 47184, 47183, 37048, 48080, 48079, 48974, 48975, 48972, 48973, 48977, 48976, 48971, 38258, 38348, 38886, 29819, 49914, 29820, 49913, 49912, 39565, 49915, 53310, 30411, 54336, 54334, 54337, 54332, 54335, 40235, 54333, 55247, 55248, 32005, 55948, 41471, 41470, 55946, 55947, 32423, 56631, 57250, 56632, 57763, 33414, 43330, 58535, 43101, 58832, 43496, 43495, 59023, 59273, 35425, 44866, 45246, 45786, 46412, 38259, 30412, 35672, 44867, 45250, 45249, 35886, 46413, 46415, 46414, 47185, 47186, 38260, 29239, 38887, 38888, 49916, 53311, 54338, 54339, 40236, 56633, 42428, 43631, 35385, 26695, 44869, 44868, 26835, 35890, 35887, 35889, 35888, 45252, 45251, 35848, 45789, 36173, 36174, 36172, 36175, 36176, 45790, 36178, 45792, 46418, 45791, 36179, 45788, 36177, 46420, 36598, 46419, 27708, 36600, 27707, 46417, 36599, 46416, 36597, 47193, 28159, 47188, 37052, 47189, 47190, 37049, 47192, 37053, 37051, 37050, 47187, 47191, 37652, 28714, 37653, 28717, 48082, 48084, 37656, 37655, 37657, 48087, 48081, 48086, 37654, 48083, 48085, 37659, 48987, 48985, 29244, 48980, 48984, 29243, 48981, 48978, 48982, 48979, 48986, 48983, 48988, 38261, 48989, 49922, 38891, 38890, 49923, 49924, 49926, 29826, 49917, 29827, 38892, 29824, 49927, 49928, 49919, 49920, 49921, 38894, 49929, 49918, 49925, 30415, 53316, 53320, 53318, 30414, 30413, 39568, 53317, 39566, 39567, 53314, 53315, 53313, 53312, 53319, 53321, 54340, 40238, 54341, 31005, 40237, 31008, 54343, 54342, 53322, 55251, 31542, 31541, 55250, 40881, 55249, 55253, 55252, 41474, 41473, 41475, 55952, 56634, 55950, 41476, 55949, 55951, 41472, 56637, 42037, 56635, 56636, 57251, 33032, 42794, 57764, 58196, 43102, 43331, 58536, 59355, 45253, 45793, 36180, 36181, 45915, 47194, 47195, 48990, 29829, 54344, 55254, 32008, 44565, 44564, 45256, 45255, 45254, 45794, 45795, 36182, 36601, 37660, 48991, 53324, 53323, 55953, 57765, 44277, 44566, 35426, 44567, 26698, 44568, 35673, 44570, 44572, 17957, 44571, 45258, 35675, 44871, 35674, 35676, 26837, 44875, 44876, 45257, 44872, 44870, 44874, 44877, 27074, 35892, 45796, 35895, 35896, 27072, 45268, 27076, 45261, 27075, 45259, 35891, 35893, 45269, 35894, 45271, 45797, 45267, 45273, 27069, 45264, 45263, 45265, 45266, 45270, 45260, 36183, 27351, 45799, 36191, 45804, 45807, 36184, 27355, 27716, 36190, 36189, 45803, 45809, 36185, 45810, 36188, 46421, 45806, 45805, 27356, 27352, 45808, 45801, 27357, 45798, 45800, 36192, 27713, 36606, 46451, 46449, 36605, 36604, 46433, 36607, 46422, 46432, 27712, 27714, 46440, 46427, 46441, 46445, 46428, 46444, 46435, 46443, 47197, 47196, 28175, 46439, 46447, 36602, 46438, 46424, 46446, 46429, 46450, 46453, 47225, 46430, 46437, 46452, 27717, 46442, 46434, 46426, 36603, 28166, 37067, 28164, 28180, 47207, 47211, 47215, 28179, 47222, 28170, 47209, 28174, 47208, 47224, 28178, 37054, 47204, 28169, 28176, 48101, 37066, 47221, 37065, 47218, 28162, 28168, 47199, 26898, 47214, 47203, 48103, 37059, 37068, 48089, 48090, 47217, 47223, 37057, 28171, 47219, 37062, 47202, 47205, 37061, 37056, 28181, 28183, 37058, 47216, 48088, 47206, 47210, 37060, 47213, 47212, 47226, 47200, 47201, 37055, 37063, 46431, 48099, 48113, 28721, 37666, 28722, 48094, 48096, 37670, 37673, 37665, 49013, 37675, 48091, 28720, 37069, 28725, 48109, 48093, 37671, 48114, 48994, 48104, 48105, 48111, 37663, 48993, 48112, 29245, 37662, 37669, 37668, 37667, 48107, 37664, 48992, 48115, 37676, 48098, 48106, 37672, 48108, 28730, 48092, 48097, 48095, 37674, 49006, 38262, 29266, 48997, 29253, 49000, 49008, 29260, 29268, 29263, 29247, 49015, 38266, 38263, 29265, 49930, 49007, 29259, 38272, 38270, 29250, 49931, 29267, 38269, 38271, 49003, 49017, 53325, 49012, 29840, 49004, 49011, 48996, 48995, 38268, 38265, 29262, 49001, 49002, 49005, 49010, 38267, 49009, 29254, 49018, 48999, 49016, 48998, 53326, 29849, 29836, 29837, 29841, 38896, 29843, 38895, 38905, 38907, 29834, 29848, 49949, 38900, 49946, 49939, 29846, 29845, 38906, 38903, 38898, 53329, 53328, 38908, 49950, 29844, 49938, 49947, 38901, 38902, 29830, 49942, 39569, 53327, 49933, 38899, 49944, 38904, 53181, 29831, 49941, 49948, 49934, 38897, 49932, 49936, 49937, 49935, 53363, 53347, 53342, 30425, 53355, 53349, 53341, 30430, 30432, 39578, 53364, 53343, 53345, 53351, 30421, 53352, 53338, 39574, 53366, 53336, 53333, 30431, 39570, 39577, 53365, 30420, 53356, 30419, 53354, 39573, 53332, 53368, 39576, 39572, 53348, 53331, 55438, 53334, 53369, 39575, 53330, 53359, 53367, 39579, 39581, 39571, 30423, 53360, 53340, 53346, 39580, 53357, 53350, 53361, 54347, 30428, 53335, 53358, 53337, 53339, 31017, 40252, 40251, 40239, 40240, 40242, 54350, 40247, 54370, 54363, 54357, 31014, 54356, 31019, 40250, 54360, 54348, 54354, 54369, 54358, 54355, 54366, 54353, 54349, 40248, 40241, 40882, 54359, 54372, 40243, 40884, 40249, 54346, 54351, 54361, 54364, 40246, 54362, 54368, 54371, 54373, 54345, 54367, 31020, 40163, 40887, 31547, 31552, 40885, 55267, 55255, 32009, 40886, 40883, 55257, 55263, 55256, 55266, 55261, 55260, 41477, 55262, 55268, 40888, 55264, 40254, 22585, 55265, 55259, 40889, 55269, 55258, 54352, 41484, 41491, 41490, 32020, 41482, 41478, 41487, 55961, 55967, 32016, 41496, 41489, 55957, 41486, 41495, 32015, 41488, 55968, 41480, 55962, 41485, 55969, 55955, 32022, 32012, 55966, 55965, 55959, 41479, 32010, 41481, 41483, 41494, 41497, 41492, 55960, 32019, 55963, 56650, 41498, 56649, 55958, 55954, 55964, 55956, 41493, 56656, 56647, 56653, 32427, 32425, 56638, 42039, 56641, 56639, 56646, 56645, 56640, 42038, 56644, 56648, 42430, 56652, 56642, 56651, 56657, 56655, 56654, 56643, 42432, 42435, 42436, 57256, 32768, 32772, 57255, 57254, 42433, 32771, 57259, 32766, 32767, 32765, 57258, 42796, 42434, 42437, 57260, 57257, 33033, 42801, 57769, 42800, 42798, 33036, 57767, 42797, 57772, 57766, 33038, 57778, 42802, 57768, 57773, 57774, 57775, 57776, 57777, 42795, 58199, 57770, 58200, 43103, 42803, 58198, 43104, 58202, 33263, 58203, 58204, 58201, 58197, 43334, 43335, 58540, 58539, 43333, 58538, 43332, 58541, 58537, 58835, 43498, 58836, 33638, 58833, 43497, 58834, 33639, 59026, 59025, 59024, 59150, 33707, 43720, 43719, 33708, 33735, 43782, 43783, 59274, 59356, 43836, 59467, 43925, 44382, 44574, 26699, 26700, 44573, 44575, 26840, 26841, 35677, 44881, 35678, 35680, 44880, 35897, 27079, 35898, 45276, 45275, 27081, 35679, 36194, 45821, 36195, 45813, 36196, 45820, 45815, 27362, 45814, 45812, 45816, 46461, 36197, 45819, 45818, 36612, 36611, 46457, 46460, 28184, 46458, 27719, 46455, 36608, 36609, 46456, 46462, 46463, 46459, 36610, 47230, 28189, 37071, 47234, 28188, 28190, 47233, 47239, 47236, 47232, 47231, 48116, 47237, 47235, 47238, 47228, 47227, 37070, 37072, 47240, 28742, 48121, 47229, 37680, 37678, 48127, 48128, 37677, 48118, 28739, 48123, 48117, 48126, 28736, 37679, 48120, 48122, 48125, 28740, 48119, 48124, 37681, 38277, 49031, 49029, 38273, 49027, 49034, 29272, 49028, 29269, 49032, 49035, 29270, 38275, 49024, 49040, 49036, 49041, 38278, 49033, 49039, 49022, 49023, 49026, 49043, 29275, 49038, 49042, 49589, 38276, 38274, 49962, 49961, 38915, 49955, 38917, 29850, 38913, 38912, 38911, 53377, 53371, 49951, 38916, 49952, 49953, 38910, 49956, 49960, 29858, 38914, 49957, 49963, 49954, 49958, 49037, 30436, 39585, 53381, 53374, 53370, 39583, 53373, 53378, 53379, 53382, 53372, 39582, 39584, 53380, 53375, 53942, 39587, 39586, 49959, 31029, 54381, 54401, 54379, 54395, 54393, 40258, 31026, 54396, 54398, 54384, 53376, 31027, 54385, 54399, 54400, 31025, 54387, 54383, 31028, 54402, 40257, 40259, 54397, 54388, 54392, 54389, 54374, 54382, 54391, 40255, 54376, 54377, 54390, 54394, 54609, 54380, 54140, 40260, 40256, 54375, 53383, 54386, 55274, 31554, 55276, 40261, 55280, 55279, 31556, 54403, 40890, 55270, 40893, 40891, 55271, 55275, 55273, 40892, 55272, 55976, 32025, 55975, 41499, 55972, 55980, 55978, 55973, 32026, 41500, 41501, 32024, 55981, 55971, 55979, 55977, 56119, 55982, 55974, 55970, 55281, 56663, 42040, 32430, 56664, 32431, 56661, 56660, 56658, 56662, 56659, 42440, 57261, 57264, 57272, 42439, 42438, 42442, 32432, 57263, 57269, 32777, 32775, 57273, 57262, 57266, 57268, 57265, 57270, 57267, 57271, 42441, 57783, 32776, 57785, 42804, 33040, 57786, 57781, 57782, 57784, 58207, 43105, 33416, 58208, 58209, 58205, 58206, 58471, 58545, 58547, 58544, 58597, 58546, 58543, 58542, 43336, 58837, 43499, 59032, 59029, 59031, 59055, 59028, 59030, 59151, 43784, 59358, 59357, 59359, 59430, 59521, 35386, 44383, 44882, 44883, 35681, 45279, 45278, 45280, 45823, 36200, 36198, 45824, 36199, 45826, 45822, 45825, 36614, 36613, 47242, 47241, 47243, 28743, 48129, 47786, 48376, 49045, 49046, 49964, 38918, 49967, 49966, 49965, 53387, 39588, 53384, 53386, 53385, 54404, 54405, 40262, 31558, 55983, 42041, 57274, 57787, 58548, 58838, 59033, 45281, 45282, 47244, 47245, 49047, 38919, 40263, 45194, 36201, 27364, 27722, 36923, 48130, 49049, 49048, 40264, 53388, 53389, 40265, 44278, 44384, 44576, 44884, 27084, 45284, 45283, 45827, 27366, 45828, 45829, 46465, 27723, 46464, 47246, 47249, 47248, 28193, 47247, 48135, 48131, 48133, 48134, 48136, 48132, 48371, 49050, 49051, 49969, 49970, 53390, 53391, 40266, 41502, 31031, 54406, 53392, 40267, 55282, 55283, 40894, 56667, 42443, 58210, 58549, 59275, 43837, 59360, 44886, 35682, 44885, 27085, 45288, 45287, 45286, 45285, 45831, 45830, 36202, 45832, 36203, 36615, 27724, 27726, 46468, 46466, 37073, 37074, 47250, 47253, 47251, 48138, 28746, 48141, 48137, 48139, 48140, 37682, 37685, 37683, 37684, 28747, 38281, 49052, 29278, 38279, 38280, 49053, 38920, 49972, 49973, 49971, 39591, 53396, 39590, 39589, 39592, 53395, 53393, 39593, 53394, 40269, 40270, 40271, 54408, 40268, 54407, 40895, 31559, 41504, 41503, 42444, 57788, 35603, 46470, 46469, 28748, 48142, 49054, 49974, 35428, 44577, 44888, 44887, 44889, 35902, 35909, 35901, 35904, 35899, 35906, 45291, 27087, 35908, 45289, 35907, 35910, 35905, 45290, 35903, 45292, 45293, 36207, 36205, 36204, 45840, 45837, 36208, 36206, 27369, 45835, 45834, 45836, 45839, 45833, 45838, 36209, 36621, 36617, 36619, 36620, 36618, 46471, 36622, 28196, 47258, 47259, 37076, 37686, 28198, 28197, 37078, 37079, 47256, 47260, 47255, 37075, 28750, 28753, 37692, 48147, 37688, 37690, 37687, 48145, 48148, 48146, 48143, 48144, 37689, 37691, 37077, 48149, 38926, 38287, 38285, 29281, 49981, 49056, 38921, 49055, 49058, 49057, 38286, 49060, 38284, 29862, 38928, 38923, 38929, 38927, 49976, 49980, 38922, 38925, 49984, 49979, 49978, 38283, 49983, 38930, 38924, 49977, 49059, 49982, 38931, 39595, 53397, 30445, 39598, 39599, 39597, 30441, 39594, 53399, 53398, 54411, 40272, 40277, 54412, 40274, 40276, 40273, 40275, 54410, 55287, 55285, 40896, 31561, 31562, 54409, 55286, 55984, 55985, 42043, 57789, 56669, 56670, 56668, 42042, 57276, 42445, 42446, 42806, 57791, 42805, 42807, 58211, 43108, 58551, 43107, 58552, 58550, 43500, 59034, 59361, 44385, 35430, 35431, 35525, 35528, 35524, 26703, 35527, 44578, 35526, 35687, 35688, 26848, 27094, 44893, 26847, 35683, 44899, 35684, 44896, 35922, 45295, 26844, 35686, 35685, 44895, 44894, 45296, 44892, 44897, 44898, 44891, 26845, 45303, 35915, 45304, 35919, 45302, 45305, 35914, 35917, 45301, 35920, 35912, 35916, 35911, 45300, 27095, 36211, 44890, 45841, 35918, 45299, 45306, 45297, 27092, 36210, 36219, 45849, 36214, 46478, 36218, 45842, 46479, 47263, 36217, 27370, 36216, 45845, 36215, 45847, 27372, 36221, 45844, 35913, 36212, 36213, 45846, 36220, 46481, 36627, 28200, 46476, 46480, 27734, 36624, 36629, 36626, 27732, 46472, 46477, 46475, 36623, 27733, 46474, 46482, 36628, 46473, 37081, 28203, 47265, 37088, 37693, 37085, 47267, 47270, 37082, 47266, 48154, 28205, 37086, 48151, 48150, 37083, 48152, 47268, 47269, 47271, 48153, 37701, 49064, 37699, 38288, 28754, 37695, 48163, 38289, 37700, 28755, 37698, 37697, 28757, 48158, 29282, 37694, 48155, 48157, 29288, 49062, 48867, 49063, 48159, 48160, 48164, 48156, 37696, 29287, 38297, 49069, 38296, 29286, 49074, 38300, 49071, 49067, 49066, 49073, 38295, 38293, 38292, 49068, 38291, 49075, 38299, 38290, 29289, 38298, 49072, 38294, 49070, 38301, 49990, 38941, 49986, 53400, 38938, 29872, 38936, 38934, 49989, 38942, 38937, 38935, 49993, 29873, 38932, 53401, 49988, 49985, 49987, 49992, 30454, 38944, 38943, 38940, 38939, 49994, 38933, 53408, 30449, 30450, 53407, 39601, 53411, 54414, 39606, 53406, 53402, 39603, 39610, 39600, 39609, 39608, 39602, 40278, 54413, 39604, 39605, 39611, 53403, 53404, 40279, 53405, 53410, 31038, 39607, 40286, 31040, 40284, 40280, 40281, 54420, 31036, 54419, 54418, 40897, 31041, 40282, 40285, 54416, 55289, 31566, 55288, 54417, 53409, 53412, 40283, 40899, 55290, 40898, 56674, 55292, 55291, 55990, 41506, 41505, 55987, 55986, 55989, 32031, 55988, 41507, 32779, 56675, 57277, 56673, 56671, 57278, 42447, 57279, 42809, 57792, 42808, 33265, 42810, 58212, 58553, 58555, 58554, 43501, 58839, 59035, 59276, 48165, 49995, 35387, 44579, 44386, 44900, 35690, 26850, 26849, 44902, 44901, 35689, 35923, 45312, 27099, 36222, 45310, 45309, 45850, 36226, 36223, 27375, 45852, 45568, 45851, 45853, 36225, 36224, 46486, 37089, 36630, 27738, 46484, 27737, 46485, 46487, 46483, 28216, 46488, 47277, 37090, 47278, 28217, 47274, 47275, 47276, 47279, 37091, 47273, 48170, 37704, 37703, 37705, 49076, 29291, 38302, 28761, 48168, 48171, 48173, 49085, 48172, 48167, 48169, 49077, 37702, 49078, 49083, 29292, 49084, 49082, 49081, 38945, 49079, 38304, 37707, 38946, 49080, 53415, 49997, 38948, 53413, 29874, 38947, 49998, 50000, 49999, 49996, 38949, 21343, 53416, 53423, 30455, 39612, 54422, 53417, 54421, 53419, 53422, 53424, 53425, 53420, 39613, 53418, 39614, 54427, 53421, 40287, 40290, 40288, 31046, 54429, 54424, 54425, 54423, 31047, 54426, 54430, 54428, 55293, 40291, 40289, 55298, 55300, 40902, 40900, 55991, 55296, 32033, 31567, 31569, 55295, 40901, 55297, 55299, 55294, 55992, 42045, 32034, 41508, 32435, 55993, 32437, 55994, 55995, 56679, 56678, 42047, 56677, 57280, 42046, 56676, 32438, 57794, 42448, 33043, 57281, 57793, 33042, 57995, 33044, 58213, 58556, 33419, 43337, 43632, 59037, 59036, 43721, 33765, 45313, 36228, 36227, 45854, 45855, 46489, 36632, 36633, 46490, 46491, 28221, 37092, 37093, 37708, 37709, 48174, 48175, 29293, 38305, 38306, 53428, 50001, 38950, 38951, 53427, 54431, 31048, 39615, 53426, 31049, 55301, 41509, 32036, 33045, 57795, 42811, 43338, 58557, 58840, 59152, 59153, 35691, 35924, 27100, 45314, 36229, 36230, 45856, 27380, 27383, 36634, 36636, 46495, 36635, 46494, 46492, 46493, 37096, 47283, 47281, 47285, 37097, 47284, 37095, 28765, 37710, 49089, 28770, 37713, 37712, 37098, 48177, 37711, 37094, 48176, 48178, 29301, 38307, 49090, 29295, 38308, 49086, 49088, 29296, 49091, 49087, 38954, 50005, 38952, 50003, 29879, 50002, 50004, 38953, 30463, 53433, 39617, 39618, 39619, 53429, 53430, 53432, 54432, 31573, 54433, 40294, 40296, 31051, 40295, 40293, 31575, 40903, 31576, 55303, 55302, 39616, 32039, 41512, 41511, 55997, 41510, 55998, 42048, 57282, 57796, 57797, 33047, 42812, 33046, 57798, 33267, 58214, 43109, 43341, 43340, 58558, 43339, 58636, 43785, 59431, 44387, 45315, 35926, 27101, 45857, 38309, 50006, 54436, 54434, 54435, 31578, 55999, 42813, 44388, 44580, 45316, 35927, 45317, 36231, 27384, 45858, 46054, 36638, 47287, 37099, 47286, 47288, 49092, 48179, 49094, 49093, 50007, 53434, 31579, 56571, 57799, 44581, 35928, 45321, 46496, 37100, 56680, 43110, 26852, 44904, 27105, 26934, 27102, 35929, 45324, 45323, 45326, 45322, 27387, 36234, 45861, 36233, 45860, 36232, 45863, 45867, 45864, 46504, 36235, 45865, 45862, 36643, 36236, 36639, 27743, 36640, 46500, 46499, 46501, 46498, 46502, 27745, 36642, 36641, 28229, 47289, 37102, 37101, 28228, 47293, 47296, 47291, 47294, 47295, 47292, 47290, 47262, 28774, 28772, 28773, 48182, 48184, 48183, 28776, 48180, 49099, 29307, 29304, 49097, 49098, 29303, 38311, 49095, 49101, 38310, 49102, 49103, 49100, 38312, 49096, 50010, 29887, 38957, 50009, 50012, 50015, 50013, 50011, 50014, 53439, 30467, 53435, 53437, 53436, 53438, 39620, 53440, 30466, 31056, 31054, 31057, 54437, 40297, 54076, 55304, 40908, 55306, 40906, 31580, 55305, 40909, 55639, 40905, 40907, 32040, 56681, 42050, 56684, 57283, 56682, 56685, 32442, 56683, 57285, 57284, 57802, 57800, 57801, 58215, 33268, 57803, 58560, 58559, 58841, 59155, 59154, 59277, 59279, 59278, 59510, 59522, 59539, 44389, 44582, 27747, 36237, 28777, 49105, 49104, 50016, 40298, 54439, 53441, 58216, 35529, 35693, 35694, 26853, 44907, 44908, 44906, 44909, 27108, 45328, 27107, 35931, 45329, 45870, 27396, 45869, 45868, 36239, 36243, 27392, 27393, 36240, 27390, 36241, 36238, 36242, 45875, 45871, 45873, 45874, 45872, 46508, 36644, 36648, 46514, 36646, 46515, 46509, 36651, 36647, 36650, 46512, 46516, 46505, 27758, 36649, 46507, 27759, 36645, 46513, 46506, 46511, 47298, 47304, 37107, 47302, 37110, 28232, 37109, 37105, 47300, 28235, 37108, 47303, 47306, 47301, 47305, 47297, 37106, 37111, 37715, 37724, 48192, 37714, 48196, 37718, 37719, 37721, 37716, 48194, 48190, 37725, 48193, 48186, 48197, 37723, 48189, 28788, 48188, 48191, 48195, 28786, 48187, 28780, 37717, 49111, 29315, 29313, 29324, 38314, 29314, 29318, 29890, 29322, 49108, 38315, 38317, 38323, 29325, 49106, 38322, 49112, 38326, 38324, 38316, 37722, 38320, 38319, 49110, 49109, 29326, 49107, 49113, 38313, 38327, 38318, 38971, 38963, 29896, 29902, 38958, 38962, 29897, 50022, 50017, 29905, 29901, 50018, 50027, 38960, 38961, 38966, 29903, 50030, 50028, 38973, 50021, 29898, 29893, 38964, 38965, 50026, 38959, 38969, 50024, 50023, 50031, 50019, 29904, 50025, 50029, 38968, 30481, 30477, 30468, 30480, 39624, 30475, 53452, 30473, 39626, 39628, 39625, 30472, 53444, 30471, 39622, 39623, 53442, 38970, 39629, 53443, 53450, 53448, 53445, 53449, 53453, 39627, 39621, 31062, 40300, 54440, 54441, 40307, 40308, 31063, 31058, 40303, 54446, 40301, 40302, 40306, 54442, 54448, 40309, 54445, 54444, 40305, 54443, 54449, 54450, 40299, 53446, 31581, 40914, 40311, 55319, 31068, 29900, 31583, 55310, 40910, 55311, 40917, 40915, 40918, 55318, 56003, 40310, 40912, 31582, 40913, 31586, 55312, 55316, 55320, 55314, 55309, 55315, 55307, 55308, 55317, 40916, 41513, 40919, 55313, 32047, 40921, 41517, 56001, 41522, 56002, 41518, 41521, 32045, 40920, 41514, 41519, 41515, 41516, 32049, 56006, 41520, 56692, 32448, 56688, 32449, 42053, 32450, 56687, 42052, 42051, 32451, 32446, 56689, 56690, 56686, 56691, 56005, 32785, 32786, 57286, 57290, 57289, 42449, 42450, 57291, 57288, 57287, 42818, 42817, 42815, 33048, 57805, 42816, 57804, 43114, 43113, 43112, 58563, 58561, 33423, 58562, 43342, 43502, 58842, 58843, 59065, 59038, 59156, 59157, 59158, 43786, 59362, 59432, 26856, 45876, 46518, 46517, 47307, 48200, 48198, 37726, 48199, 53454, 31070, 31069, 54451, 44583, 44584, 35695, 35933, 35934, 35932, 35935, 27398, 36246, 36245, 36244, 45878, 45879, 45877, 45880, 36247, 46519, 27763, 46520, 47309, 28237, 37113, 47308, 48202, 48203, 48201, 38329, 38328, 49115, 29327, 49114, 38330, 29906, 50032, 50033, 30483, 53455, 53456, 40313, 54453, 40312, 54452, 31590, 31591, 40923, 40925, 56007, 40922, 55321, 41523, 56008, 56009, 42054, 42055, 42056, 42057, 56693, 57293, 57292, 41524, 58217, 58218, 58564, 33546, 58844, 59433, 35696, 35697, 45332, 45330, 45331, 35936, 45882, 36248, 27400, 45611, 45881, 36652, 36653, 46521, 46525, 37114, 27765, 46522, 46523, 46524, 28240, 37115, 47311, 47310, 28791, 48204, 37727, 48206, 28790, 48205, 38331, 38334, 38332, 38333, 38335, 49118, 49116, 29328, 29908, 29910, 50037, 50036, 38975, 50038, 50034, 50035, 53458, 39631, 39632, 39633, 53457, 40317, 40319, 40315, 31075, 40318, 40316, 40314, 54454, 54455, 55322, 54456, 31592, 41525, 56011, 56012, 56013, 56010, 42059, 42058, 56694, 32788, 42452, 42451, 57294, 57807, 33053, 58219, 43503, 43504, 59255, 59463, 44910, 27112, 35937, 27110, 45334, 35938, 36251, 36249, 36250, 45884, 45883, 36654, 46530, 46532, 27769, 36655, 46529, 46526, 27771, 46531, 46533, 46527, 46528, 28243, 37117, 28241, 47312, 47313, 47314, 46534, 48211, 48207, 37728, 28792, 48209, 48210, 48208, 49119, 49121, 38337, 49123, 49122, 49120, 50040, 50039, 50050, 39634, 53459, 53460, 31076, 54461, 31078, 54457, 54462, 40321, 40320, 54460, 54458, 31594, 32056, 31593, 55323, 40928, 56014, 40927, 55324, 55325, 55078, 40926, 54459, 55326, 32055, 32054, 56015, 56017, 56016, 56018, 56695, 42060, 56696, 42454, 57296, 42453, 57298, 57295, 57297, 58221, 43115, 58220, 58222, 58845, 43343, 58846, 59159, 35530, 44911, 26857, 35699, 26859, 35700, 35698, 27119, 45335, 35940, 27114, 45339, 45341, 45337, 35941, 35942, 45340, 45338, 35939, 45342, 45343, 45896, 45892, 45885, 45889, 27415, 45893, 27413, 45899, 36258, 45890, 36262, 27412, 45886, 45898, 36253, 36260, 36264, 36254, 36263, 36261, 36256, 36265, 45887, 36252, 36259, 36255, 36257, 45894, 45897, 45891, 27777, 36663, 18951, 27773, 36656, 46535, 27775, 36661, 36657, 46537, 27772, 46538, 36662, 46539, 27780, 46541, 36659, 36664, 46540, 46536, 36660, 36658, 27781, 28252, 47332, 47319, 47326, 37119, 37118, 37128, 28251, 47320, 47317, 47315, 37125, 37126, 37120, 47323, 37123, 47333, 37124, 47316, 47328, 47324, 47329, 47331, 47325, 47322, 47330, 37129, 47318, 47327, 37122, 37127, 37734, 37737, 48216, 48224, 28250, 48215, 37736, 48220, 48222, 37731, 48227, 48214, 28810, 37735, 37733, 37729, 28809, 38338, 48226, 38351, 28795, 48221, 37738, 48218, 37739, 48229, 37730, 37732, 48219, 48228, 48213, 48225, 48223, 28799, 28811, 37740, 28793, 49126, 49129, 49125, 29337, 38345, 49127, 38344, 49130, 38342, 49124, 29330, 29335, 29344, 29341, 38347, 49133, 38343, 29342, 29331, 49135, 38346, 38339, 38349, 49137, 49128, 48212, 49134, 48900, 38340, 38350, 38341, 49136, 38979, 29928, 50043, 29921, 38982, 50047, 38984, 38985, 50048, 30502, 50053, 50045, 50054, 53467, 50046, 38986, 38983, 50042, 50049, 50044, 38981, 50041, 38978, 38977, 38976, 53461, 29917, 50052, 50051, 38988, 29918, 30503, 30499, 30485, 39639, 39644, 30501, 53466, 39649, 39642, 30488, 53471, 30487, 31088, 54470, 39641, 40326, 39643, 53468, 39647, 53473, 30496, 30498, 30493, 39636, 39648, 53462, 53463, 53465, 30497, 39640, 53469, 39635, 39638, 40322, 39646, 39645, 53464, 53470, 30495, 40335, 40336, 31081, 40330, 40328, 40332, 40324, 31086, 40334, 40325, 40331, 40329, 31085, 54463, 54471, 54472, 54468, 54464, 39650, 31090, 40323, 54466, 54474, 54469, 40337, 31089, 38987, 40333, 32064, 40929, 40932, 31604, 31605, 54475, 55333, 55328, 40931, 55329, 40933, 55339, 40930, 56025, 55334, 55335, 55332, 31606, 55338, 40936, 54465, 40935, 55336, 55331, 55330, 55337, 55327, 32061, 56026, 56023, 41531, 32065, 41528, 56020, 56021, 41533, 32057, 41529, 41532, 41534, 41527, 56027, 56028, 56022, 41530, 56019, 56024, 42064, 42061, 42066, 32459, 42065, 32456, 42069, 42063, 56699, 32455, 56701, 32457, 32458, 56697, 42062, 56698, 42068, 42067, 57024, 56702, 56700, 42457, 42459, 42455, 57301, 42458, 42460, 57300, 32793, 42456, 32794, 57299, 57811, 42819, 42821, 42820, 42822, 57809, 57812, 57808, 33270, 43118, 58223, 43116, 43117, 58224, 43120, 33426, 57810, 43119, 58298, 43121, 43344, 58567, 33425, 58566, 58847, 33641, 59160, 59162, 59161, 43838, 35943, 27417, 27418, 27783, 36667, 36666, 46544, 46545, 28255, 37131, 37743, 28812, 37744, 37742, 37746, 37741, 48230, 37745, 38354, 38353, 38352, 50056, 50057, 29930, 29931, 38991, 38989, 38990, 29932, 50055, 29934, 39651, 30505, 53476, 39652, 30504, 53475, 30506, 31092, 31091, 31093, 40338, 41538, 55340, 40786, 40937, 41537, 41536, 41535, 42072, 42071, 42070, 42073, 56703, 56704, 33427, 59532, 59542, 44680, 44912, 44913, 45904, 45902, 45903, 36267, 36669, 36670, 46548, 46546, 46547, 36668, 37132, 37133, 28259, 47338, 47336, 37134, 47334, 47340, 47335, 47339, 47337, 28813, 48233, 48231, 38355, 29345, 49140, 29348, 29347, 49138, 37747, 29349, 49139, 38992, 38993, 50058, 38994, 38995, 53479, 30507, 53477, 53478, 53480, 54477, 31094, 54476, 40938, 40939, 55341, 55342, 43122, 43345, 35531, 44585, 26860, 44914, 35702, 35701, 35944, 27123, 45346, 27422, 27420, 45908, 36269, 45906, 45907, 45905, 36268, 36270, 27793, 36678, 46549, 45909, 46550, 36674, 46554, 36671, 36676, 36675, 27788, 27790, 36681, 36677, 36680, 27786, 36682, 46553, 27787, 36672, 46552, 37135, 36673, 46551, 37141, 37137, 47346, 47344, 37146, 37145, 37139, 47345, 37149, 37147, 36683, 37143, 37136, 37138, 37142, 47343, 47341, 48235, 37140, 47347, 37144, 37148, 47342, 37749, 37755, 37748, 37752, 28817, 48242, 28818, 28816, 37753, 37754, 48238, 37751, 37756, 48241, 48237, 48239, 37758, 37757, 38359, 49148, 29350, 38360, 49141, 49143, 38356, 49145, 29360, 29362, 49146, 49149, 38357, 38358, 49144, 49147, 49150, 50066, 39003, 50059, 53485, 39005, 50061, 29941, 38998, 38997, 50062, 39006, 50064, 50065, 39000, 50060, 38996, 39008, 50063, 29943, 39002, 39007, 39004, 38999, 30513, 39655, 39656, 53486, 39653, 29939, 53490, 39658, 53484, 53487, 53481, 53488, 39654, 39657, 53483, 54481, 40342, 40339, 40343, 54478, 31100, 31102, 40345, 31101, 54479, 54483, 31098, 54480, 40341, 40340, 40943, 55343, 40941, 55350, 55345, 40940, 31609, 55344, 40942, 31612, 55347, 31611, 40346, 40945, 40944, 40946, 55346, 55349, 56032, 41539, 41541, 56029, 56031, 41540, 32069, 41543, 56030, 41542, 56033, 32461, 42075, 42074, 56707, 56705, 56706, 42462, 42463, 57302, 57303, 42461, 42464, 32462, 57304, 57306, 42823, 42824, 57813, 33059, 43123, 58225, 43124, 58226, 43125, 43347, 33428, 43346, 43348, 58569, 58568, 58849, 58848, 58850, 59163, 43722, 43787, 33736, 59364, 59434, 43932, 44280, 44587, 44915, 45347, 45910, 45912, 45741, 36684, 46555, 27796, 36685, 46556, 45914, 46559, 46560, 46558, 46561, 46557, 27425, 37151, 46562, 47348, 37150, 48245, 37759, 48246, 48247, 48249, 37760, 48250, 48248, 48243, 48244, 49152, 38362, 38361, 38363, 48252, 29367, 49151, 39012, 50070, 50071, 29945, 50074, 50072, 50068, 50073, 39010, 50069, 30518, 53491, 50067, 50075, 53493, 40349, 54485, 40347, 54486, 31106, 40350, 40348, 40351, 53495, 54484, 31618, 40947, 55354, 31619, 55357, 55355, 54487, 55352, 55356, 55353, 55351, 32073, 41544, 56035, 56034, 32072, 42076, 56709, 56710, 42465, 32798, 57307, 57815, 57814, 33274, 58227, 58228, 58570, 58571, 58572, 43505, 58573, 43506, 43633, 59166, 59164, 59280, 45916, 47349, 28822, 48253, 49153, 50076, 53497, 54488, 54489, 56036, 43126, 59039, 26601, 44588, 44916, 44917, 27124, 35947, 27126, 35946, 45349, 45920, 45923, 36273, 36271, 27433, 36274, 45925, 45919, 45921, 27430, 45918, 36272, 45926, 45924, 45922, 45917, 36687, 36686, 46566, 36688, 46567, 36689, 36275, 37157, 46568, 46563, 46565, 37155, 47354, 37160, 28271, 37158, 47353, 37152, 28275, 47350, 47355, 28826, 37761, 28827, 28823, 48254, 48255, 48258, 48260, 28824, 48257, 29376, 37159, 38373, 38366, 49156, 49154, 49157, 38367, 38364, 38369, 38371, 38375, 38370, 29373, 49162, 38365, 49158, 49161, 49159, 49155, 49160, 38374, 38372, 39017, 50080, 38740, 39022, 50079, 50077, 50081, 29951, 39023, 39018, 50085, 50086, 39020, 39016, 39021, 50087, 39019, 50078, 50084, 50083, 39664, 39661, 39663, 53504, 53501, 39662, 30528, 53505, 53502, 53509, 39024, 53500, 40362, 39665, 39666, 30526, 30529, 53506, 53499, 53507, 53508, 31110, 54502, 40354, 40357, 54498, 40353, 40356, 40355, 31113, 40352, 40360, 54492, 54493, 40359, 54491, 40363, 40948, 40364, 54500, 54499, 54501, 54490, 54494, 54496, 54497, 40361, 40358, 40951, 40954, 40955, 40952, 40949, 40950, 31625, 55358, 40957, 31621, 40953, 55361, 55359, 40365, 55360, 40956, 41546, 41553, 41551, 41548, 41549, 41552, 56039, 41547, 56038, 41550, 41545, 42079, 32464, 42077, 32465, 32468, 56712, 32467, 42078, 57311, 56714, 56711, 56713, 42468, 32801, 32799, 42467, 57309, 32077, 42466, 42469, 57308, 57310, 57312, 42470, 57817, 57816, 42825, 57818, 58230, 43127, 58231, 43349, 43350, 58232, 43507, 58574, 58575, 58851, 58830, 33644, 43634, 33645, 43723, 43868, 43869, 44390, 35704, 35705, 27128, 27129, 27127, 45352, 45351, 45354, 18554, 45350, 27437, 45928, 45930, 45927, 36276, 27436, 36278, 36277, 45929, 45931, 45932, 36279, 36690, 27799, 27804, 27801, 36694, 36693, 36692, 46573, 27802, 27803, 27800, 46571, 46569, 36691, 36695, 46572, 46570, 37165, 37164, 47357, 47356, 47358, 37162, 28277, 37163, 37161, 47359, 37775, 28833, 37777, 48267, 48263, 28836, 48271, 37766, 37772, 37774, 48269, 37764, 48270, 37765, 48264, 37767, 28835, 37776, 48265, 37773, 48262, 37763, 37770, 48268, 37771, 37768, 48266, 38377, 49170, 38379, 38378, 38381, 49163, 49165, 37769, 38380, 38382, 49169, 49172, 38383, 49167, 49166, 49164, 49171, 49261, 29956, 50094, 39027, 50093, 50089, 50091, 50090, 39026, 50096, 39028, 50088, 53512, 39668, 39674, 39677, 39025, 53511, 39678, 39673, 39669, 39679, 39672, 53510, 39667, 39675, 39671, 39676, 53593, 30532, 40372, 40374, 31116, 40373, 31119, 40366, 31121, 54505, 40367, 40369, 40368, 40376, 40370, 40377, 54503, 40371, 40958, 40378, 54506, 40963, 40960, 55366, 31629, 40962, 55363, 55364, 55362, 40959, 55365, 54507, 40961, 41555, 41554, 32471, 56717, 56716, 42080, 56715, 57313, 57315, 42081, 32802, 42471, 57822, 57316, 57314, 42828, 57820, 33064, 33063, 42826, 57821, 42827, 43351, 58576, 43508, 59041, 58852, 43635, 59167, 43870, 44919, 44918, 35948, 35949, 27438, 27808, 36698, 36699, 27805, 36697, 36696, 27807, 46574, 46575, 47363, 28282, 47362, 47364, 47361, 28283, 37168, 28838, 48274, 37778, 37780, 37779, 37781, 48273, 29381, 29383, 38385, 29384, 49173, 38384, 49174, 49175, 38386, 39029, 50097, 39030, 29957, 53516, 30533, 39680, 53514, 31632, 54509, 40379, 40965, 41050, 55367, 40964, 41557, 55368, 56040, 41556, 57317, 57823, 56718, 42829, 58233, 59042, 35950, 45355, 35952, 35951, 36281, 36282, 36280, 45934, 45933, 36283, 36705, 36700, 27813, 36701, 36703, 36704, 46577, 36708, 36706, 36702, 46576, 46578, 36707, 36709, 27815, 47365, 47371, 37171, 28288, 37174, 47368, 37173, 47373, 28284, 37175, 47366, 36710, 37170, 47370, 47372, 37177, 37178, 47369, 37785, 37789, 37784, 37787, 28839, 28841, 48279, 37172, 28846, 37788, 37783, 28852, 28850, 28843, 48282, 28851, 48276, 37792, 48278, 48281, 37176, 37786, 37790, 38403, 38391, 38398, 29387, 38396, 38388, 29395, 29396, 38399, 29390, 37782, 49177, 38389, 38404, 38394, 38401, 38387, 38392, 38395, 49181, 49179, 49184, 49187, 49180, 49183, 49185, 50098, 38402, 38400, 38397, 38390, 49178, 48277, 49182, 49186, 49176, 39046, 38405, 29967, 39044, 50108, 29962, 50099, 50100, 39037, 39036, 39043, 29970, 50109, 39041, 50107, 39033, 39034, 50106, 50102, 39035, 39042, 39032, 39038, 50103, 38393, 39048, 50101, 39039, 50105, 39040, 29972, 39045, 39693, 53526, 53528, 39703, 30564, 39686, 53534, 53527, 39697, 30536, 30534, 39700, 39682, 39687, 39702, 53519, 39699, 39684, 31145, 39692, 39701, 30537, 30558, 30552, 30548, 39691, 39690, 39695, 53531, 39049, 39688, 53533, 53524, 53521, 39698, 53517, 53536, 30553, 53532, 30547, 53529, 39696, 53522, 53520, 39681, 53525, 53523, 39705, 53535, 40393, 31146, 31143, 40381, 40387, 40395, 54529, 40385, 31127, 40386, 31125, 40397, 53518, 54524, 31131, 40396, 31130, 54528, 31141, 54519, 54525, 31129, 40389, 54516, 31144, 40388, 40382, 54515, 54527, 31123, 40380, 54523, 31134, 40394, 54518, 40391, 31132, 54530, 54510, 54526, 39683, 40392, 40383, 54513, 54522, 54511, 40390, 40384, 54517, 54512, 54521, 54514, 40987, 40984, 31644, 40974, 40996, 40978, 31643, 31650, 31654, 55377, 40994, 31647, 40985, 40969, 40986, 40971, 41000, 40980, 40993, 40976, 41003, 55369, 40975, 40981, 40989, 31651, 40990, 55374, 41581, 40995, 40979, 55380, 55373, 40968, 41001, 40992, 40972, 55376, 40997, 40970, 40967, 40991, 31653, 32081, 41002, 40977, 40998, 40988, 54520, 40973, 55372, 55371, 55370, 55378, 55375, 55379, 31655, 31648, 41590, 41586, 41004, 32103, 41584, 41571, 41566, 32092, 41589, 41579, 22888, 41561, 32099, 32090, 41582, 41572, 41591, 32082, 56050, 41585, 41563, 41570, 32083, 32084, 41587, 56048, 41568, 41565, 41578, 56044, 41559, 56045, 32086, 56042, 32104, 41577, 56047, 41576, 56049, 56053, 56043, 41564, 32098, 41569, 41573, 41583, 41588, 41575, 41560, 56057, 56056, 41574, 41558, 41562, 56041, 56046, 56055, 56052, 42091, 42096, 56727, 32486, 56725, 42084, 32481, 32482, 32478, 42090, 32476, 32477, 56721, 32479, 42083, 32485, 32474, 56720, 42094, 42089, 42097, 42093, 42092, 42086, 42085, 42088, 56719, 56723, 42082, 42098, 56722, 56724, 56726, 42485, 42484, 42479, 32484, 42477, 57321, 42483, 32804, 57329, 32807, 42481, 42476, 33073, 57319, 42472, 42478, 42474, 57318, 57330, 42480, 57322, 57323, 42475, 57324, 57833, 57326, 57325, 57327, 57328, 57320, 42837, 42841, 42842, 33074, 33068, 42839, 42844, 57824, 42831, 42836, 42833, 32806, 42840, 42832, 42473, 57830, 42843, 42830, 57826, 42838, 33282, 42845, 57831, 57825, 57829, 57828, 57834, 57827, 58238, 33279, 33278, 43131, 43129, 42835, 43132, 58235, 42846, 58234, 43135, 33280, 43128, 58237, 57832, 43137, 43134, 43130, 43136, 43133, 58239, 58236, 58299, 33431, 43352, 58578, 43353, 33432, 33433, 33435, 58577, 43355, 58579, 43354, 58583, 58582, 58580, 58584, 58581, 43509, 58854, 58857, 43511, 43512, 58856, 43356, 58855, 58853, 43510, 58860, 33550, 58858, 43636, 59043, 59045, 59048, 33646, 59046, 58859, 59044, 43726, 43724, 43725, 59047, 59281, 59282, 59283, 43839, 43871, 59365, 33791, 43895, 43908, 35706, 35953, 45356, 45936, 36285, 45935, 36286, 46579, 36711, 46583, 36712, 46581, 36713, 46580, 46582, 28293, 37182, 28297, 37181, 28294, 37185, 37180, 37183, 37184, 28296, 37187, 37179, 47374, 48288, 47376, 47375, 37793, 28853, 48286, 48283, 48290, 37795, 28858, 48289, 48284, 48287, 38406, 29399, 49190, 38408, 38409, 37794, 38407, 49192, 49191, 28857, 38410, 38412, 38411, 49194, 49188, 49193, 50114, 39051, 50112, 50115, 39053, 29974, 49189, 50120, 50119, 39052, 50117, 39050, 39054, 50116, 50110, 50111, 53541, 53537, 30571, 39710, 53538, 53542, 30568, 39709, 39711, 39715, 39055, 39714, 39712, 53544, 53539, 39708, 30569, 39713, 30567, 53543, 39707, 39706, 40403, 40401, 41011, 31148, 40400, 31147, 54534, 54535, 40404, 54531, 40399, 40402, 40405, 54533, 41005, 41007, 55381, 41008, 41006, 41009, 41010, 55383, 55385, 55386, 55382, 31659, 41597, 56060, 32108, 41598, 41594, 56735, 41596, 41012, 56061, 41595, 57333, 41592, 56058, 42101, 56728, 56729, 32491, 32489, 42100, 42847, 56731, 56732, 56063, 32492, 32109, 42102, 56062, 42099, 56730, 56733, 56734, 57332, 42487, 57331, 33076, 33075, 42848, 57838, 57837, 57836, 43138, 58240, 43139, 33436, 33437, 58585, 43357, 58586, 58861, 43514, 43513, 43639, 59050, 43638, 43637, 59049, 59169, 33712, 43727, 59168, 43728, 59285, 59284, 43896, 59523, 35954, 45357, 35955, 35956, 36289, 45937, 45940, 36287, 36288, 45942, 45938, 36290, 45943, 46588, 46584, 27818, 46596, 27820, 46590, 46589, 46592, 36717, 27819, 27827, 46597, 46586, 27826, 46591, 27825, 46593, 46585, 36716, 46594, 36715, 36714, 46587, 27829, 46595, 37192, 37190, 28311, 28301, 28303, 47383, 28308, 37191, 28310, 47384, 37188, 28305, 47386, 47385, 47380, 47378, 47379, 37189, 47382, 47387, 37804, 37803, 37801, 37805, 48298, 28860, 48291, 48297, 28859, 28861, 48299, 47381, 48292, 48301, 48293, 37800, 48295, 48294, 48300, 37797, 37796, 37798, 48296, 37802, 49204, 49195, 38414, 38413, 29403, 49197, 29404, 49201, 49198, 29400, 38416, 38415, 49196, 49202, 28862, 29402, 49199, 38417, 49205, 49206, 29409, 49203, 49200, 29407, 29979, 39057, 29977, 39059, 50132, 50131, 39063, 29981, 39062, 29978, 50126, 50136, 50135, 50123, 29984, 39056, 38418, 50134, 39058, 50129, 50121, 39060, 39064, 50133, 50128, 29987, 50125, 50122, 50124, 50130, 30573, 30584, 53549, 30583, 30576, 39726, 39724, 31153, 39723, 39728, 39720, 30587, 39725, 53561, 53547, 53553, 39727, 39717, 53550, 53555, 39722, 30582, 30574, 53546, 53554, 53545, 53556, 50127, 53562, 53560, 39716, 39721, 39729, 53551, 53557, 53548, 53552, 54557, 31151, 54554, 54555, 31155, 54551, 54548, 40409, 40411, 54536, 54553, 54537, 55387, 54538, 54541, 40410, 40412, 40408, 41020, 31150, 40406, 40407, 31156, 54545, 54542, 54543, 54552, 31158, 54540, 40414, 54539, 54556, 54546, 40413, 54550, 54549, 54544, 54547, 55401, 55400, 41018, 41015, 31664, 55388, 41016, 55399, 31662, 55391, 41019, 41013, 55395, 55392, 55393, 55397, 41017, 55398, 55394, 41022, 55396, 55389, 32121, 32113, 56069, 32120, 32114, 56068, 56075, 32118, 31663, 56064, 41600, 41603, 41602, 56066, 56072, 41601, 56065, 56070, 56073, 56067, 56078, 56076, 56071, 56082, 41605, 56077, 41604, 56083, 56081, 56079, 56074, 32497, 32498, 56744, 32502, 56752, 42103, 56749, 32500, 56751, 32504, 42106, 32493, 42107, 56746, 56630, 32494, 56742, 42104, 56748, 56740, 56747, 42105, 56738, 56739, 56745, 56743, 56952, 56741, 56750, 32503, 57338, 57337, 42490, 42488, 32810, 57339, 57342, 57336, 57843, 56737, 42491, 57343, 57345, 57335, 33082, 57341, 57334, 57344, 57340, 42851, 33078, 57844, 42852, 33081, 33079, 33080, 58247, 57346, 57840, 57839, 57842, 33077, 57841, 42850, 57845, 43142, 58242, 43143, 43140, 33284, 43359, 58246, 43141, 58244, 58243, 58245, 33318, 33440, 58248, 58587, 58588, 33441, 33442, 33553, 43515, 58866, 58864, 58865, 58867, 43641, 58863, 43640, 59051, 59172, 59171, 59286, 59288, 59287, 59366, 43872, 59492, 44589, 27441, 36291, 27831, 46599, 36718, 37194, 47388, 37807, 47390, 47389, 48305, 28866, 48304, 37806, 49209, 49208, 29411, 29989, 50138, 39065, 50137, 53563, 53565, 30588, 53564, 40416, 40415, 41024, 55402, 41023, 56084, 56085, 56753, 32505, 42853, 32812, 33083, 57846, 33443, 58589, 58869, 58868, 43729, 59511, 44282, 44281, 26863, 44591, 44592, 44920, 44590, 45358, 45945, 27132, 45944, 45359, 27133, 44921, 26864, 45946, 27443, 27445, 36292, 35957, 46600, 46601, 46602, 36722, 46605, 46603, 27835, 27834, 45949, 45947, 45950, 47396, 36720, 47391, 47392, 47393, 47395, 47397, 45948, 46243, 36293, 27446, 47394, 48308, 47398, 46606, 48307, 47399, 36721, 37195, 48306, 37809, 37808, 28869, 48309, 49211, 38422, 49213, 48311, 38419, 38421, 49212, 49214, 48310, 49215, 49210, 50139, 50141, 50142, 50143, 50144, 50145, 50146, 50149, 39068, 53570, 50147, 39067, 49216, 39066, 50148, 50140, 53566, 53567, 53568, 53569, 39733, 39730, 50151, 53571, 39731, 39732, 50150, 53474, 54558, 54559, 54563, 54560, 40417, 54562, 31162, 55411, 54561, 54564, 39734, 40418, 31161, 53572, 53573, 55404, 55405, 55408, 41025, 54565, 31667, 41606, 55409, 55410, 56086, 56087, 56089, 56091, 32124, 32123, 41607, 56090, 56754, 55407, 41609, 42108, 56757, 32507, 56755, 56756, 57347, 57348, 57349, 57350, 42492, 42494, 57351, 42493, 42495, 57847, 57352, 43517, 33555, 58870, 43518, 43516, 59052, 59173, 59289, 59367, 59435, 26865, 26707, 45361, 35958, 45360, 45952, 45951, 27447, 46607, 46608, 47402, 46612, 46611, 46610, 46609, 47401, 47404, 37197, 28871, 47405, 28318, 37198, 37196, 47400, 47406, 37812, 37810, 48314, 28872, 48316, 37811, 48315, 48313, 48317, 47752, 49219, 38423, 49220, 49217, 38424, 49218, 49221, 38425, 39069, 50152, 50154, 39070, 50153, 39735, 30591, 53576, 53577, 30592, 54566, 53575, 30589, 40420, 40419, 31163, 54567, 31671, 31669, 41026, 55413, 55412, 55415, 31165, 55414, 41608, 32126, 41610, 56096, 56097, 32130, 56094, 56095, 56093, 32129, 42109, 56761, 43360, 56760, 57353, 56759, 42496, 57354, 57355, 57356, 57357, 56092, 42854, 57848, 57849, 43144, 58249, 58591, 58590, 59053, 59290, 59469, 45362, 45956, 45953, 45957, 36294, 27449, 27448, 27451, 45955, 27450, 45954, 27842, 46615, 36724, 36726, 36723, 27840, 27845, 27844, 46614, 36725, 27843, 27841, 46616, 27846, 37199, 47408, 47407, 47409, 47410, 47411, 47413, 47414, 28324, 47412, 37814, 28875, 48321, 48322, 48328, 37816, 28879, 48329, 48323, 48320, 48330, 48331, 37815, 48325, 48327, 48326, 48324, 38429, 38426, 29416, 49222, 49223, 49224, 38428, 38427, 48319, 39078, 39071, 50156, 39072, 39076, 39073, 39077, 39074, 39075, 50155, 39079, 39741, 39742, 53579, 39739, 30593, 39743, 39736, 53578, 39738, 50158, 39737, 53583, 53584, 53580, 30595, 53581, 30594, 53582, 54568, 54570, 40424, 54573, 54569, 54571, 31168, 40422, 40425, 40423, 39740, 40421, 54572, 40426, 31672, 55417, 41027, 55418, 56762, 41028, 55416, 41611, 32131, 56104, 41029, 32132, 56100, 56102, 56099, 56103, 56101, 56098, 32509, 42111, 42110, 56763, 57360, 57361, 57358, 33085, 57850, 57852, 57359, 57851, 58251, 58252, 58250, 44593, 45363, 44922, 27134, 27135, 46617, 28325, 36295, 47415, 48332, 53585, 54575, 54574, 45364, 45365, 35432, 27848, 37200, 37817, 38430, 50159, 53586, 53588, 39080, 54577, 54576, 55419, 35532, 45366, 45958, 45959, 37201, 47416, 28880, 37820, 37819, 29418, 49225, 50161, 39085, 39081, 39086, 39083, 39082, 39084, 30002, 50160, 39746, 39747, 39748, 39744, 39745, 53589, 40428, 40427, 31169, 31170, 54579, 54580, 54578, 41030, 31675, 55423, 55420, 55421, 41612, 31677, 56105, 55422, 56766, 41613, 56107, 56106, 56765, 42112, 56764, 33087, 57853, 33445, 43519, 43642, 35960, 35959, 45369, 45368, 36298, 36296, 36297, 27851, 46623, 27850, 46619, 36727, 46625, 46620, 46622, 46621, 46626, 46618, 36728, 47418, 28328, 28327, 28329, 47420, 37202, 47422, 47421, 47419, 47417, 37821, 48334, 48335, 37822, 48336, 48333, 49227, 49231, 38432, 38433, 49226, 49236, 49234, 49232, 38434, 49233, 49229, 49235, 49228, 49230, 39089, 39090, 39087, 30597, 50163, 39091, 39088, 39092, 50164, 39749, 53591, 39752, 53594, 39751, 39750, 30598, 39754, 53590, 53595, 39753, 53592, 40431, 40434, 40430, 40432, 40433, 54584, 54582, 54581, 54583, 40429, 41031, 41032, 41033, 55424, 31682, 31683, 41035, 41034, 55426, 55425, 22908, 56110, 41617, 41614, 32135, 56112, 41036, 56111, 41615, 41616, 56108, 56109, 56767, 42113, 42114, 56769, 56768, 57364, 57363, 57362, 42855, 57854, 57855, 43145, 58253, 33446, 35433, 45370, 36299, 47423, 48337, 47919, 49239, 50167, 50166, 53596, 54585, 57365, 35536, 35534, 45371, 45372, 44595, 35535, 35533, 35708, 35707, 44926, 44925, 44924, 44923, 45962, 45961, 45960, 35965, 35969, 45375, 27858, 45384, 45385, 45373, 35968, 45377, 35964, 35962, 45382, 35966, 27146, 45379, 45386, 45383, 27045, 45376, 45378, 35967, 45381, 45374, 46630, 46628, 27852, 35961, 46629, 45978, 27460, 36303, 45973, 36300, 36307, 45974, 27461, 47427, 45972, 27458, 45976, 27463, 45970, 36305, 45971, 36306, 36301, 27863, 36304, 45963, 45966, 45967, 45969, 45965, 45980, 45977, 45975, 45981, 45979, 47426, 47425, 47428, 47429, 46639, 47424, 36730, 27853, 28330, 27860, 46641, 36735, 27859, 46637, 36737, 46633, 36739, 37823, 36738, 46632, 36729, 46634, 27855, 48342, 36732, 36731, 36569, 46638, 46636, 46635, 46642, 48341, 48339, 48340, 48338, 45968, 36734, 36740, 36733, 37213, 47434, 47432, 37204, 28339, 37205, 27857, 37210, 28331, 28346, 38435, 28345, 47430, 37207, 47438, 28334, 37214, 37215, 47439, 47437, 28340, 37211, 47440, 47441, 47435, 47436, 49240, 49241, 49242, 37212, 37208, 37209, 48350, 37827, 48344, 37824, 48358, 48349, 28885, 37829, 48362, 48343, 50170, 37826, 48363, 49246, 28897, 37831, 48368, 48361, 48359, 48366, 37825, 39094, 48345, 48354, 48357, 48351, 48356, 48360, 48348, 48365, 48346, 48347, 50168, 50172, 50169, 37828, 48353, 37206, 37830, 37833, 37834, 48364, 37836, 48352, 50173, 50171, 38444, 29422, 38451, 38446, 38436, 38440, 38452, 49254, 29421, 49243, 28895, 38447, 38439, 49248, 29425, 49250, 29423, 49256, 49244, 38454, 49245, 49249, 38448, 49253, 38442, 38441, 38450, 38449, 49251, 38437, 49255, 29432, 49258, 49257, 53597, 53598, 49252, 38445, 38443, 30021, 39100, 30029, 30020, 39106, 50175, 39099, 30027, 39107, 39104, 30026, 39096, 39102, 30011, 30028, 39097, 50182, 50177, 39095, 50179, 39098, 50178, 39101, 54586, 39105, 30025, 50176, 50181, 49879, 38438, 39103, 30600, 39758, 53599, 30604, 53606, 39757, 30606, 55429, 53602, 39759, 53600, 30607, 55427, 39755, 53603, 53601, 53604, 53605, 55428, 50174, 39756, 54595, 40442, 40437, 31185, 31174, 40436, 31176, 54590, 54597, 40440, 40441, 31182, 39760, 40439, 54588, 54596, 40444, 54593, 42115, 31177, 54598, 53607, 54591, 54592, 54587, 54589, 54594, 56113, 56770, 56114, 40445, 40435, 40446, 40443, 40438, 56118, 41041, 41040, 55431, 31691, 31687, 31686, 41039, 41037, 32510, 56772, 41045, 55434, 55177, 55432, 56771, 56774, 41044, 55430, 41043, 41038, 55433, 56775, 32138, 41621, 41618, 41620, 41623, 56115, 41625, 56117, 41622, 56120, 41619, 42497, 41626, 56116, 56194, 32136, 32511, 56778, 56784, 42116, 42117, 41624, 56779, 56783, 56785, 56777, 56781, 56780, 56782, 56776, 56786, 57368, 42501, 42500, 32816, 32814, 42498, 57367, 57366, 33093, 57856, 42856, 58593, 57929, 58592, 33292, 33290, 58254, 58594, 43362, 58596, 58598, 58599, 43361, 58595, 33447, 58600, 58601, 58872, 43520, 58873, 43643, 59368, 43788, 43840, 44929, 26870, 46643, 48369, 48370, 50184, 56122, 42858, 59436, 43909, 44597, 44931, 26871, 44930, 45387, 36309, 45983, 36741, 46645, 27864, 46646, 46644, 47445, 47444, 48372, 48373, 49259, 39108, 30613, 30614, 39761, 53608, 31186, 40447, 55435, 41047, 41046, 42118, 32514, 42504, 56787, 42502, 42503, 59174, 44932, 45388, 45389, 46649, 46647, 46648, 37216, 28347, 48374, 38455, 39109, 39762, 53609, 39763, 54600, 31187, 40448, 31692, 41627, 41628, 26873, 44598, 44435, 45390, 45391, 27866, 45984, 46650, 46656, 46652, 46651, 27867, 46654, 46655, 47448, 37217, 46653, 47447, 47450, 47449, 37837, 48375, 37838, 39110, 49263, 49262, 49260, 50185, 50191, 50186, 50187, 39764, 53610, 50188, 50192, 50189, 53611, 53612, 53613, 50190, 39111, 39765, 39766, 53614, 53615, 54601, 53616, 53617, 54603, 54602, 41049, 54606, 54605, 54604, 41048, 41051, 55436, 56125, 56124, 41052, 32140, 56123, 56788, 41630, 41629, 56789, 57370, 42119, 42506, 42507, 42508, 57369, 56790, 42120, 57371, 57372, 42859, 58255, 58256, 58602, 43521, 59054, 43644, 43646, 43645, 59437, 59438, 59552, 43945, 45985, 27869, 27868, 46657, 46658, 46659, 36742, 36743, 47451, 47452, 47280, 48379, 48378, 48380, 39112, 30030, 38778, 30031, 49264, 50193, 50195, 50194, 53618, 53620, 53619, 54607, 40449, 54608, 55437, 41631, 56127, 56126, 42509, 42860, 58603, 43363, 39767, 39768, 57373, 58604, 58874, 59056, 43789, 35709, 27152, 27151, 45394, 45393, 45392, 35970, 27464, 27468, 27467, 45986, 45988, 45987, 46665, 36744, 46664, 46660, 36745, 27873, 27872, 46661, 46662, 46663, 37219, 28350, 28352, 47457, 37220, 47453, 47454, 37218, 37839, 48384, 48383, 28351, 28907, 28905, 28906, 28908, 48385, 38456, 49267, 38457, 49265, 49266, 49268, 49269, 38459, 50202, 39116, 39114, 30035, 50197, 50201, 50198, 39113, 39776, 30620, 30619, 39775, 39772, 39773, 39777, 39769, 53626, 53624, 39778, 53621, 53623, 53625, 53622, 39774, 39770, 39771, 40453, 40450, 40454, 54611, 40451, 54614, 54612, 54616, 40452, 54615, 54613, 54610, 55439, 31694, 41059, 41053, 41056, 41055, 41057, 41058, 32142, 41638, 56129, 41632, 41637, 41640, 41636, 32143, 32144, 41633, 41634, 41639, 32141, 56130, 56128, 41635, 56791, 42124, 42123, 42122, 42121, 56792, 56793, 42510, 57374, 42862, 42861, 57859, 43146, 43147, 33293, 58257, 57857, 57858, 33448, 58605, 59058, 59057, 59175, 43790, 33792, 45989, 37818, 57375, 37221, 37222, 47458, 37223, 49270, 49271, 49272, 50204, 50205, 50203, 53628, 53627, 53629, 40455, 40456, 54618, 54617, 42512, 42511, 57376, 35434, 44391, 26709, 44603, 44604, 45395, 44601, 35537, 44600, 44599, 26876, 26877, 26881, 44933, 26879, 44936, 44934, 44935, 44937, 45398, 27163, 27158, 27160, 35973, 27164, 27159, 27156, 35971, 45399, 35972, 27155, 46666, 44787, 45402, 35975, 27157, 45397, 45401, 46668, 46667, 45396, 27474, 27470, 27471, 27472, 36314, 46000, 45992, 27475, 45998, 45994, 36312, 45990, 45997, 45995, 45999, 46002, 46003, 36310, 36313, 36311, 45901, 45996, 45400, 48387, 36751, 27877, 27878, 27889, 36747, 36749, 36753, 27875, 36746, 36756, 27882, 36760, 27879, 27892, 36757, 27887, 46685, 46686, 36758, 46688, 36755, 27893, 46680, 46679, 48386, 47471, 46676, 36752, 46675, 46672, 46670, 46681, 46683, 36750, 46678, 36759, 36748, 46674, 46682, 46684, 46689, 46671, 37234, 37237, 37230, 28373, 37235, 28358, 28371, 28365, 47487, 28375, 28378, 47475, 47466, 47472, 37226, 47464, 47460, 28357, 37241, 47459, 47470, 47493, 28361, 47491, 48435, 47489, 46687, 48403, 28356, 37224, 28368, 47462, 47473, 37239, 47484, 47490, 47483, 47478, 37238, 47488, 47463, 47476, 37240, 38460, 49273, 49274, 47485, 47486, 47469, 37225, 37242, 47479, 37232, 37236, 37229, 48432, 47494, 47495, 47467, 47465, 37848, 47468, 37231, 47474, 47482, 47492, 37228, 37840, 28910, 37860, 37861, 37853, 37863, 37864, 37854, 28918, 48405, 48397, 48420, 48395, 48390, 37850, 37858, 37859, 48406, 48404, 37849, 37865, 37862, 28367, 28912, 28915, 28913, 28923, 37845, 28909, 48388, 48430, 28924, 48389, 37855, 48407, 48431, 48408, 48424, 48425, 28932, 48415, 28930, 48412, 37847, 48417, 48400, 48422, 48399, 48411, 48426, 48418, 37856, 50213, 50208, 50209, 37842, 48413, 48394, 48423, 39117, 48398, 48421, 48402, 48414, 48392, 48419, 28931, 37851, 37846, 48401, 48433, 50206, 37857, 50210, 37852, 48429, 50212, 50211, 48391, 48409, 48312, 37843, 48393, 48396, 48428, 48434, 50207, 37844, 48410, 29456, 49275, 49293, 38491, 49281, 49282, 38465, 29450, 49296, 49313, 29453, 29455, 38482, 49317, 38471, 29444, 29441, 49288, 49322, 38464, 49304, 49308, 38480, 49297, 29445, 29448, 38467, 49290, 29449, 29458, 38478, 29466, 38492, 29451, 38483, 49316, 38476, 29440, 29438, 49324, 29452, 49289, 38485, 38479, 38469, 38475, 49279, 49306, 49302, 49287, 49326, 38474, 49280, 49323, 49278, 38493, 49301, 49292, 49283, 38486, 38490, 38472, 38484, 49305, 49319, 49315, 49295, 49309, 38470, 29446, 49310, 38461, 38477, 38463, 38487, 49286, 29442, 29464, 49299, 38466, 38462, 49294, 49311, 53630, 49320, 38473, 49291, 49307, 49277, 49321, 49325, 49312, 29467, 38481, 38488, 49276, 49285, 49298, 49300, 49314, 49318, 38489, 29463, 49284, 48427, 38468, 30055, 50259, 39140, 50214, 50230, 39146, 30052, 50249, 30039, 50232, 30042, 50223, 39136, 50237, 30038, 50245, 39132, 50227, 50252, 39144, 39141, 50239, 39129, 30043, 50220, 50248, 50240, 50226, 39139, 39128, 39119, 30051, 50228, 30047, 50217, 30046, 30060, 30044, 39134, 53635, 50218, 39121, 39126, 39120, 39143, 39788, 30048, 39138, 50219, 30057, 50243, 39127, 50250, 50233, 50222, 39135, 39125, 54620, 39118, 39123, 50234, 50236, 50238, 50241, 50253, 50256, 50257, 50235, 39137, 50246, 50244, 49327, 39145, 50255, 50258, 50254, 50221, 50216, 50229, 50224, 49303, 50247, 30059, 30037, 39124, 39148, 54619, 39122, 50260, 39142, 39147, 40457, 39133, 53655, 30643, 39779, 30622, 30641, 53674, 39782, 53677, 53666, 53639, 39786, 53652, 53667, 53668, 53653, 53662, 39787, 53658, 30634, 39790, 39795, 53643, 53675, 39793, 39792, 40458, 39794, 39804, 53654, 53665, 53636, 53661, 53648, 39801, 39784, 30640, 53631, 53638, 53647, 53646, 53650, 39780, 53649, 53672, 53641, 39791, 53633, 39781, 39803, 53671, 53645, 53640, 53657, 30635, 39802, 39798, 53663, 40475, 30645, 39796, 53632, 53637, 53642, 53659, 53660, 53676, 30646, 53669, 39797, 53673, 53664, 53651, 39783, 53634, 39800, 39789, 50215, 56131, 54662, 31220, 54631, 31217, 31227, 54664, 40460, 31218, 40480, 54648, 40471, 31194, 31223, 40468, 40478, 54641, 31198, 40477, 40462, 40482, 54632, 40484, 31222, 54621, 40464, 40466, 54657, 40472, 40485, 54642, 54640, 39805, 31193, 40459, 40481, 54650, 54656, 54646, 40487, 40483, 53678, 53670, 54663, 41073, 31213, 54627, 31216, 54635, 40470, 31215, 31197, 39785, 54628, 40469, 54637, 40473, 40463, 54626, 54668, 54659, 31221, 40479, 54623, 31201, 54638, 56132, 54624, 54666, 31225, 54647, 54634, 54644, 40461, 40467, 40474, 54625, 54633, 54636, 54643, 54645, 54652, 54654, 54658, 54660, 54665, 54670, 54671, 54630, 31206, 54639, 54669, 54661, 40488, 40465, 54629, 54622, 54653, 54667, 40486, 40476, 54651, 55451, 31703, 31708, 55443, 56144, 55453, 31717, 31718, 40489, 41068, 41076, 41066, 55470, 55474, 41062, 31719, 31700, 55456, 31714, 41078, 55457, 55462, 55478, 41077, 41082, 55476, 41079, 41061, 41071, 55459, 41075, 55448, 55463, 55469, 41074, 31720, 41060, 41080, 31710, 55475, 41070, 31715, 41064, 41081, 55464, 41069, 55445, 55450, 56142, 55440, 55441, 55480, 55458, 31716, 55473, 55447, 55452, 56795, 55446, 55461, 55468, 54655, 55454, 55460, 55482, 41067, 39806, 31712, 56796, 41063, 41065, 55442, 55466, 55467, 55471, 55479, 31702, 55455, 55472, 55481, 55449, 41653, 56160, 32151, 56161, 41643, 32152, 41083, 41656, 56157, 41646, 41641, 56133, 41642, 41650, 41663, 41666, 56139, 41660, 56155, 32149, 41084, 41665, 41647, 41657, 56146, 41645, 41655, 56162, 32163, 41658, 32161, 32153, 32157, 41661, 41659, 56147, 57377, 56143, 56140, 32162, 56811, 41652, 56136, 56154, 56158, 32160, 55465, 56135, 56137, 56138, 56148, 56151, 56153, 56159, 56163, 56164, 32154, 56149, 41648, 56150, 56794, 41662, 41651, 32156, 56156, 41644, 41649, 41664, 56152, 56134, 42141, 42126, 57400, 42127, 42137, 42133, 32522, 32518, 42142, 42134, 56799, 56812, 42138, 42132, 32521, 42125, 42521, 56810, 42135, 56813, 42136, 56808, 56827, 56824, 56803, 42130, 42140, 56818, 56821, 56805, 56804, 56809, 56814, 57391, 56820, 56800, 56819, 56817, 57378, 42131, 42129, 32515, 42139, 56816, 56807, 56806, 56797, 56798, 56801, 56815, 56823, 56825, 56822, 57401, 57392, 57385, 42519, 42526, 57404, 42520, 42523, 32830, 57395, 42525, 32826, 42518, 42863, 57402, 42514, 57388, 57387, 57383, 42517, 42524, 57384, 32822, 57410, 42515, 57382, 57390, 57405, 57398, 56802, 57408, 42522, 32819, 57396, 42516, 57409, 57397, 42128, 57880, 58258, 57380, 42513, 42527, 57389, 57393, 57394, 57399, 57406, 57407, 57381, 57379, 57403, 57876, 33296, 42871, 57879, 57872, 42867, 33099, 33097, 57866, 33101, 42865, 57877, 42868, 57878, 33096, 42528, 42870, 57868, 57860, 42869, 57875, 57864, 57862, 57873, 33100, 42866, 42872, 42873, 57861, 57869, 57386, 57867, 58271, 42864, 57863, 57870, 57874, 57865, 43149, 33297, 43150, 43152, 43153, 58265, 43154, 33302, 33301, 58272, 58270, 58262, 58612, 43148, 43151, 58264, 33299, 33300, 58263, 33295, 58268, 58260, 58273, 58259, 58261, 58266, 58269, 58608, 58619, 33454, 43365, 33453, 43364, 33450, 33452, 33451, 33449, 43368, 58610, 58620, 43367, 43647, 58614, 43369, 58616, 58617, 58606, 58609, 43366, 58615, 58613, 58611, 58618, 58607, 43524, 43523, 43522, 58875, 43525, 58877, 58881, 58878, 58879, 58884, 58876, 58882, 43649, 58880, 58883, 43650, 59178, 43648, 59176, 59061, 59060, 59059, 59062, 43730, 43731, 59182, 59180, 59179, 59181, 59177, 59165, 33741, 59291, 43791, 33714, 33743, 43841, 33766, 59369, 59370, 43938, 59439, 43873, 59471, 59493, 43944, 43926, 59470, 27478, 46006, 46005, 37245, 37243, 28380, 28379, 47502, 28381, 47503, 47501, 47500, 46690, 48437, 37868, 48438, 38498, 38494, 38495, 49330, 49329, 49328, 39150, 50261, 50265, 30064, 50264, 50266, 50262, 50263, 39151, 30063, 53682, 53680, 54676, 39807, 53679, 53681, 53494, 40493, 40494, 40491, 40492, 31228, 40490, 54677, 54673, 54674, 31231, 31230, 40496, 54675, 40495, 54672, 31721, 55484, 56166, 41670, 32166, 56165, 32164, 56167, 41669, 56829, 56828, 32523, 56830, 57412, 42529, 57413, 57063, 42875, 57411, 42874, 42814, 57883, 57882, 43155, 58565, 33769, 35710, 44940, 27167, 45406, 27482, 46008, 27479, 27481, 46007, 36315, 46010, 46009, 46011, 27480, 36769, 46695, 36765, 36772, 46694, 36766, 36771, 46693, 27899, 27897, 27901, 36767, 46703, 36762, 46698, 36770, 36761, 46697, 36768, 36773, 46701, 46691, 36764, 46692, 46699, 46700, 36763, 46702, 37246, 28386, 47506, 37247, 37248, 37249, 37255, 28389, 28390, 47513, 37251, 28388, 37252, 47507, 37256, 47510, 28391, 28387, 47508, 47511, 47505, 47512, 47514, 37253, 47515, 28392, 47504, 37254, 37250, 37870, 48441, 28940, 48449, 37889, 37875, 37872, 37874, 37877, 37884, 37880, 48450, 48439, 48444, 37873, 37888, 48443, 48452, 48451, 37879, 48440, 37876, 37882, 48454, 48445, 48446, 49333, 37886, 37881, 49343, 37885, 48453, 48448, 37883, 37869, 48442, 28944, 49335, 49334, 29479, 29481, 49339, 29473, 38501, 38504, 38499, 29470, 29472, 38505, 38507, 38503, 38500, 29483, 29469, 49337, 49338, 49331, 49332, 50267, 49336, 49340, 38502, 49341, 56850, 49342, 49344, 39152, 39157, 39162, 39158, 39163, 30080, 39156, 30078, 50292, 39166, 30072, 39160, 30069, 50281, 50269, 50280, 30081, 39165, 50270, 50276, 39155, 50287, 39164, 39159, 50286, 50290, 39167, 50279, 50288, 50272, 39168, 39169, 50277, 50291, 39161, 50271, 50284, 50285, 50275, 39153, 50273, 39154, 50278, 50283, 29477, 50289, 50274, 30656, 53708, 39812, 30657, 30654, 53697, 30663, 39824, 53696, 53685, 39810, 53684, 53694, 53704, 39816, 30661, 30653, 53705, 53693, 39815, 53700, 53690, 53703, 40497, 30655, 30652, 39821, 39819, 39809, 39818, 39817, 53683, 39820, 30075, 39811, 39823, 39822, 30664, 53711, 53689, 53686, 53709, 53698, 53710, 53701, 53688, 50282, 53695, 53702, 39813, 30650, 39808, 53692, 53706, 53699, 53691, 40499, 31244, 40505, 40504, 31233, 40503, 40500, 54691, 54706, 40506, 31247, 40510, 31248, 31239, 31241, 40511, 54690, 31234, 54684, 31238, 54705, 40508, 40498, 40514, 40501, 55485, 40507, 54686, 31245, 40509, 54693, 54709, 40502, 54681, 40513, 54697, 31246, 39825, 54688, 54682, 40512, 54699, 31242, 54704, 54711, 54679, 54700, 54680, 54701, 54692, 54707, 54695, 54685, 54710, 54702, 54687, 54703, 54694, 54683, 54689, 31734, 41086, 41089, 31730, 55509, 55495, 31741, 31737, 55499, 55493, 55512, 31739, 55497, 53712, 31725, 41094, 55507, 55490, 31738, 55506, 41088, 41092, 55510, 31735, 55498, 55492, 41096, 31728, 55491, 31726, 55489, 55511, 41087, 55487, 55486, 55500, 31736, 41090, 41091, 55496, 55494, 55502, 55505, 55508, 55488, 41085, 55501, 55503, 41093, 32176, 32170, 56170, 56182, 56173, 56189, 41676, 41677, 41097, 32171, 41689, 56174, 32169, 41678, 32168, 32173, 41672, 41675, 41686, 32167, 41683, 56171, 41671, 41674, 41684, 56172, 56177, 56176, 41673, 56196, 56192, 41688, 56195, 41682, 41685, 56190, 41679, 56193, 41680, 56186, 56183, 56178, 56184, 56169, 56175, 56168, 56179, 56191, 56187, 56185, 32175, 56188, 41687, 32531, 56849, 56832, 56839, 56851, 56833, 56848, 56852, 32526, 42145, 42143, 56841, 56846, 56844, 42147, 56836, 56847, 56843, 56845, 57414, 56840, 56853, 56854, 56842, 42148, 56835, 56838, 56831, 56834, 32525, 32530, 56837, 56197, 57424, 57429, 42532, 57415, 32839, 42531, 42536, 57427, 57419, 42535, 57423, 42537, 42538, 57422, 42533, 57421, 57426, 57420, 57416, 42534, 57418, 57896, 57417, 57430, 57425, 33102, 33107, 57884, 57889, 42878, 57894, 57887, 57890, 42877, 57892, 42876, 42879, 57885, 33106, 57888, 33108, 33104, 57891, 42881, 57897, 57428, 57893, 33105, 57898, 42880, 42882, 57895, 57886, 43159, 33303, 43157, 43156, 58282, 58277, 43158, 43162, 43161, 58275, 43164, 43166, 43163, 58274, 33304, 58285, 58287, 58286, 58279, 58280, 43165, 43167, 58283, 58288, 43160, 58278, 58276, 43371, 33455, 33456, 58622, 43372, 33458, 58624, 58621, 43373, 58627, 43370, 58885, 58625, 33459, 58626, 43375, 58281, 43374, 43533, 58886, 33557, 43532, 43530, 58887, 43527, 33559, 58888, 43531, 43529, 33561, 43534, 43528, 43651, 33651, 43655, 43657, 33558, 59063, 43653, 59067, 59066, 59068, 43654, 43656, 59064, 43652, 59186, 59184, 59187, 59185, 59188, 59297, 59295, 43792, 59294, 59298, 59183, 59292, 59300, 59293, 59299, 59296, 59373, 33771, 59374, 43842, 43843, 59371, 59372, 43874, 59440, 59441, 43875, 33793, 59473, 59472, 59512, 35976, 45408, 45407, 27483, 46705, 36774, 46708, 46707, 48455, 48457, 38508, 49347, 49345, 49348, 49346, 39172, 39170, 39171, 50295, 50293, 53713, 39826, 53714, 53715, 50294, 40516, 40517, 40515, 54712, 54713, 41100, 41099, 32177, 32178, 56198, 56200, 32179, 56199, 42149, 42539, 57431, 57899, 58290, 58289, 58889, 59474, 27168, 45409, 27169, 46012, 46013, 36316, 36775, 46710, 46709, 36776, 47516, 37890, 48460, 48459, 48458, 49352, 49350, 29484, 49351, 49349, 30083, 39827, 50296, 50297, 31742, 55513, 32180, 56201, 56855, 57900, 58629, 35977, 45410, 45411, 45412, 36318, 46014, 27484, 27486, 36320, 46016, 36319, 46015, 36317, 36321, 46716, 36781, 27904, 46718, 46722, 36784, 46723, 46724, 27903, 46712, 36785, 46714, 36777, 46719, 46715, 46720, 46717, 36780, 46713, 46711, 36779, 46721, 46725, 46726, 28395, 37899, 28398, 28949, 37261, 28396, 47525, 37262, 37265, 37259, 37260, 37258, 47526, 47527, 37257, 47520, 47522, 47521, 47518, 47517, 47524, 47519, 37263, 47523, 37264, 37898, 48468, 48466, 37895, 48464, 37896, 37900, 28951, 48465, 48461, 28950, 48463, 37897, 37894, 37892, 38513, 37891, 48462, 48467, 48469, 37893, 38519, 38511, 38515, 29490, 38520, 38512, 38516, 29488, 38514, 38518, 49364, 29489, 49359, 49357, 49365, 38517, 38509, 49353, 49356, 49362, 49355, 49366, 49354, 49358, 38510, 30095, 30091, 50302, 50308, 30088, 39173, 39176, 30087, 39175, 37901, 50309, 39177, 50300, 50298, 50299, 50307, 50306, 39174, 50304, 39178, 50305, 50301, 30098, 50310, 50303, 30094, 39831, 53725, 30676, 39834, 53728, 30097, 53727, 39830, 30667, 53726, 54715, 39832, 53731, 53716, 30680, 30670, 30672, 53724, 30679, 30678, 39828, 53729, 53723, 53717, 39829, 53720, 39833, 53722, 53721, 53718, 53719, 53730, 40525, 40524, 54718, 40520, 40523, 54714, 31256, 54716, 31259, 55525, 40522, 40521, 54717, 31253, 54719, 54722, 31252, 40518, 54723, 40519, 54721, 54720, 41107, 41108, 55514, 41104, 55520, 55527, 31747, 41101, 41102, 41106, 41105, 55522, 55518, 55526, 56208, 55519, 53732, 55521, 55523, 41109, 55515, 55517, 41103, 56202, 32184, 56209, 56211, 41700, 41696, 56210, 32190, 41693, 41694, 41704, 32192, 32181, 56207, 41692, 32186, 32191, 41702, 56206, 56204, 41690, 32182, 41111, 41691, 56205, 56214, 56203, 41698, 41699, 41110, 41701, 41703, 41697, 56861, 42152, 42153, 32532, 56866, 56867, 42150, 42151, 56857, 56858, 56860, 56864, 56865, 56859, 56863, 32534, 56862, 56212, 57432, 42543, 57439, 42546, 42883, 42540, 32842, 57436, 42541, 57435, 57901, 57433, 42544, 56856, 42545, 42547, 57437, 57434, 42548, 57905, 57907, 42885, 33109, 57909, 57908, 42884, 57903, 57904, 33110, 57906, 58296, 57902, 33308, 58293, 33307, 33306, 43168, 58291, 58292, 58295, 58294, 43535, 58892, 58891, 58890, 43658, 59071, 59070, 59069, 59190, 43732, 59191, 59189, 59376, 59302, 59301, 59375, 43897, 59475, 59513, 43940, 59546, 35711, 45413, 27487, 36786, 27907, 46727, 47528, 49367, 30099, 50311, 50312, 50313, 53733, 54724, 54725, 55528, 42154, 57440, 57910, 35978, 45414, 27910, 36787, 37268, 37269, 47529, 47530, 37271, 37266, 28405, 28409, 37267, 37270, 48472, 28956, 48475, 48474, 37903, 48471, 28955, 48470, 49371, 38522, 38524, 38523, 49368, 49372, 38525, 49370, 50314, 39184, 39181, 39185, 30102, 50315, 39182, 50316, 39183, 30684, 53736, 39837, 30686, 39836, 53740, 39838, 49369, 53739, 39835, 39839, 53737, 53735, 53734, 53738, 40529, 40528, 40527, 31262, 54727, 40533, 55530, 31263, 31269, 31268, 40530, 40534, 54726, 40526, 40532, 55529, 41705, 41114, 41113, 55533, 55532, 55534, 55531, 41707, 32196, 32194, 56215, 41706, 56216, 56868, 56869, 42550, 57442, 57441, 42549, 57911, 33310, 43170, 33309, 43536, 58894, 58893, 43660, 43659, 59072, 33652, 43793, 43933, 59553, 45415, 45416, 46017, 36323, 27911, 46729, 27912, 46728, 47540, 28414, 37274, 37273, 47532, 47536, 28410, 47537, 37272, 47533, 28415, 47539, 47531, 47535, 47538, 47534, 37904, 28957, 48477, 48480, 37905, 48476, 48479, 48482, 48478, 28958, 28959, 48481, 38528, 38526, 38527, 49373, 50319, 39188, 30104, 50321, 39186, 39187, 50318, 50322, 50317, 50320, 53743, 39846, 53744, 39845, 39841, 39840, 30691, 30693, 30688, 53746, 30695, 39843, 53745, 53747, 39842, 53741, 53742, 39844, 54731, 54730, 31270, 40535, 31274, 40538, 40540, 31271, 54729, 54728, 40536, 40537, 40539, 54732, 41115, 55536, 55542, 55535, 41119, 41118, 55537, 54733, 41117, 55538, 55539, 55540, 31753, 55543, 55541, 41116, 56218, 56219, 32197, 56217, 56220, 32544, 42155, 32541, 32542, 56870, 56871, 56872, 56873, 32545, 57443, 42886, 57912, 43171, 33311, 58630, 43537, 59192, 33715, 59377, 59378, 43876, 59442, 35538, 35539, 45417, 46736, 27918, 27914, 27913, 27919, 36788, 46733, 46734, 46732, 46735, 46731, 28419, 47543, 47552, 28417, 47548, 37283, 37280, 47550, 28421, 37275, 28425, 47558, 37276, 47556, 47544, 47557, 37279, 47553, 47554, 47547, 47559, 47551, 47542, 47541, 47555, 47545, 37281, 48493, 28969, 28965, 37908, 48488, 48487, 48490, 48483, 28964, 48497, 28975, 28976, 37909, 48486, 48495, 48489, 48496, 28974, 37906, 37907, 48491, 48494, 48485, 48498, 48492, 38530, 29493, 29495, 49387, 38531, 37910, 38534, 29502, 29501, 49381, 49392, 49378, 49390, 29494, 29496, 38537, 38529, 29504, 49384, 49377, 49388, 49383, 49380, 29503, 38535, 49389, 38533, 38532, 49385, 49391, 38536, 49374, 49376, 29500, 49375, 49386, 49379, 50335, 30110, 39193, 30106, 39191, 39194, 30109, 30119, 50323, 50333, 30112, 50340, 30115, 50336, 30118, 50327, 39192, 50338, 50326, 30120, 50337, 50325, 39189, 39190, 50329, 30122, 50331, 38538, 50332, 50334, 50324, 50339, 50330, 53768, 39865, 53748, 39851, 39857, 53754, 53757, 53769, 53765, 53753, 39862, 30698, 39864, 39858, 39852, 39855, 53761, 39859, 30704, 39861, 30709, 53771, 53760, 53752, 39849, 39853, 53766, 53750, 39860, 39854, 39848, 39850, 39847, 53759, 53758, 53749, 53755, 39856, 53764, 53751, 39863, 53770, 53767, 53763, 53756, 54745, 40545, 31288, 54757, 31279, 31276, 31283, 54748, 54756, 54742, 40542, 54741, 40541, 54735, 31287, 31278, 54744, 31286, 54736, 31285, 54746, 54753, 31277, 54755, 54737, 31280, 54734, 54758, 54739, 54738, 54747, 54749, 40544, 54751, 31284, 54743, 40543, 54759, 54740, 54750, 31755, 41127, 41126, 55552, 31756, 41129, 31758, 55548, 31754, 41122, 41128, 41123, 55545, 55558, 31759, 56221, 41124, 55554, 55546, 41131, 55560, 55551, 55547, 41125, 31761, 55550, 55553, 55555, 55556, 31760, 41120, 55559, 41121, 55557, 55544, 55561, 55562, 55549, 32209, 32201, 56234, 32203, 56232, 41713, 56237, 56222, 32211, 41711, 40546, 32204, 41712, 56235, 56229, 41709, 32198, 56238, 32200, 41710, 32208, 56236, 56226, 56230, 56879, 56227, 32207, 56231, 56228, 56239, 56223, 56224, 56233, 32210, 56225, 42156, 42158, 56884, 32553, 56881, 56883, 32558, 32548, 42159, 32556, 56889, 32557, 42157, 32554, 56875, 56878, 56240, 56877, 56890, 57452, 56888, 32551, 42551, 56876, 32559, 56880, 57454, 56885, 56886, 56882, 56887, 32547, 32847, 32848, 42553, 42552, 57446, 42554, 57448, 32846, 57444, 42162, 57451, 57447, 57453, 57455, 57445, 57449, 57457, 57456, 57458, 57913, 33121, 57923, 57916, 57922, 33111, 57917, 42892, 57915, 57918, 33115, 42889, 42888, 33122, 58306, 58300, 33113, 42891, 42890, 57920, 57914, 57919, 42887, 57924, 43172, 43174, 43177, 43376, 33314, 58304, 33317, 43176, 33316, 43175, 58302, 58311, 57925, 43173, 58301, 58305, 58310, 33313, 58309, 58307, 58308, 33462, 33463, 58631, 43379, 43378, 43538, 58633, 58634, 58635, 58632, 58313, 58898, 58899, 58896, 33564, 58897, 58901, 58895, 58900, 58902, 33654, 59074, 43661, 59075, 59073, 43794, 59194, 59193, 43734, 33745, 59303, 59379, 33773, 59349, 59443, 59549, 35712, 27921, 36789, 36790, 28427, 28428, 28426, 47560, 28977, 38539, 38540, 49393, 30124, 39867, 30710, 39868, 39866, 40547, 54761, 54760, 55563, 41132, 56241, 56891, 56894, 42163, 56892, 42164, 56893, 57459, 56895, 42893, 43795, 59494, 46018, 46738, 46737, 28978, 37911, 48500, 38541, 29506, 49694, 30127, 50341, 30128, 53775, 53774, 53772, 39870, 39869, 53773, 40548, 31291, 54762, 40549, 54103, 41135, 55566, 41133, 55565, 41134, 55564, 41714, 32214, 56243, 32213, 41136, 56897, 42166, 56898, 56244, 56245, 42165, 42557, 42556, 42558, 42555, 42894, 43178, 43539, 43662, 43796, 59444, 44607, 35540, 36325, 36793, 36792, 46740, 46739, 47563, 47561, 37288, 47564, 47562, 28979, 48501, 28980, 37913, 37912, 48503, 37914, 48506, 48502, 29508, 38544, 29507, 49395, 49396, 38546, 38542, 38545, 49394, 48505, 38543, 38547, 50342, 50343, 30130, 30129, 50346, 39196, 39195, 50348, 50347, 50344, 50345, 39873, 30713, 53776, 53778, 39872, 39874, 53780, 53779, 39197, 39871, 53777, 39198, 53781, 40552, 40553, 40551, 54764, 31293, 54765, 54767, 54766, 40550, 54763, 41138, 41139, 41140, 41137, 55569, 55567, 55568, 32216, 41715, 41716, 56246, 56247, 56248, 32562, 42167, 40554, 56899, 32564, 42562, 42559, 57460, 42561, 42560, 33125, 42895, 57926, 57927, 58314, 58637, 58315, 58316, 58638, 58639, 43179, 58903, 59076, 58904, 43663, 43735, 59445, 59536, 36326, 46741, 37291, 37290, 28434, 37289, 28433, 47568, 47566, 48508, 37915, 37919, 37917, 37921, 37918, 48511, 48509, 37920, 37916, 48510, 48507, 29513, 29514, 29511, 49399, 38550, 49398, 38549, 29510, 29512, 49400, 38548, 50354, 50349, 39202, 39200, 39199, 50352, 39201, 50351, 50353, 50350, 50355, 39876, 39875, 30716, 39878, 39877, 39879, 30717, 53782, 53783, 30718, 53784, 54775, 40556, 54769, 54771, 54772, 31295, 40555, 54773, 40557, 54770, 54768, 54774, 31766, 41144, 55570, 41143, 31765, 41141, 41145, 41142, 56249, 32218, 56250, 32217, 41717, 56900, 41718, 42170, 56901, 42169, 56904, 57462, 56903, 42168, 42564, 42563, 57461, 42897, 42565, 42896, 57928, 58317, 58641, 58640, 43797, 36327, 27489, 46019, 27923, 46742, 36794, 36795, 46743, 47573, 47575, 47570, 47571, 47569, 47574, 37292, 47576, 28438, 47572, 28437, 48514, 28983, 37922, 37924, 48517, 48515, 48516, 49404, 37923, 48518, 48513, 37926, 29517, 49401, 49406, 49403, 38555, 38551, 49411, 49402, 38554, 38556, 38557, 49405, 49413, 49415, 38558, 49412, 49414, 49408, 38553, 50358, 30132, 39203, 50357, 50359, 50365, 50356, 50362, 39204, 30134, 50364, 49410, 53786, 53788, 39205, 30722, 53787, 39881, 30723, 39882, 53792, 53791, 53785, 53790, 54781, 40559, 54778, 54777, 40560, 54782, 54785, 31299, 54779, 40558, 50361, 54784, 54783, 54776, 54780, 40561, 55571, 41146, 40808, 41148, 40563, 41147, 31768, 55577, 55573, 55575, 55576, 55574, 56254, 41724, 56257, 41720, 56252, 56253, 56260, 41722, 41719, 41723, 56256, 56255, 56251, 56259, 41721, 56908, 56912, 42172, 41725, 56911, 56258, 42171, 32566, 56909, 42173, 56914, 56913, 42175, 56905, 56910, 56907, 56915, 56906, 42174, 32854, 42567, 32853, 42566, 57463, 57465, 57464, 42898, 33126, 42899, 42900, 57930, 58318, 43182, 43181, 58321, 58319, 58320, 58642, 33465, 43180, 58643, 58644, 58905, 58907, 58906, 59195, 45418, 46020, 46021, 37293, 48519, 28987, 49416, 39207, 53793, 40565, 40564, 54786, 41150, 41151, 41149, 41726, 56262, 56917, 56916, 42901, 58645, 45419, 45420, 46022, 27490, 36798, 46747, 46746, 36799, 46745, 27926, 37300, 47579, 37294, 28442, 37297, 37302, 37301, 28443, 47577, 47578, 37298, 37295, 37299, 37296, 37930, 37929, 37933, 37928, 48523, 48520, 38564, 37932, 37927, 48522, 28989, 37934, 49417, 48524, 48521, 49419, 38561, 29518, 49421, 29520, 38566, 38560, 38568, 38562, 29519, 49423, 49422, 38565, 49418, 49420, 50366, 50367, 30139, 39209, 39213, 50371, 39208, 39211, 39214, 50370, 50368, 39216, 30140, 39212, 50375, 39210, 50372, 50369, 39889, 39883, 30725, 39886, 39885, 39884, 39887, 53798, 39893, 39890, 53800, 39888, 53795, 53799, 53797, 50373, 53801, 54789, 39892, 39891, 53802, 53794, 31304, 31305, 31309, 54791, 40570, 31302, 31303, 31308, 54792, 31306, 54788, 54787, 40569, 40571, 54793, 54795, 54794, 40572, 40567, 40568, 41156, 41158, 31773, 41157, 31775, 31772, 41159, 31771, 41153, 31774, 41155, 41152, 55579, 41160, 55578, 41730, 41733, 32222, 56266, 56265, 41727, 41731, 41729, 41728, 41734, 41735, 56270, 56269, 41732, 56267, 56264, 56268, 56263, 40574, 42177, 42181, 42183, 32569, 32567, 42178, 42182, 42180, 42176, 56919, 42184, 42179, 56918, 56920, 32855, 32857, 32861, 32860, 42568, 57466, 57468, 42569, 57467, 33128, 42903, 42904, 57934, 57932, 57931, 57933, 42902, 43183, 43186, 33320, 43185, 43184, 43380, 43381, 58322, 58646, 58647, 43540, 43541, 43542, 33657, 59077, 43798, 43844, 45422, 45421, 46024, 36328, 46023, 46750, 27928, 46751, 46749, 36801, 36800, 46748, 46752, 28450, 47582, 28445, 37306, 47586, 37310, 47589, 37304, 37308, 47591, 47592, 37307, 47590, 47581, 47585, 47580, 47584, 47588, 37309, 37303, 47583, 37945, 37936, 37937, 37940, 48530, 37935, 48527, 28997, 37942, 37938, 37946, 37939, 48528, 49438, 37947, 48526, 48529, 37943, 38572, 38570, 49430, 38571, 38573, 49433, 49429, 38578, 38576, 49427, 49426, 38569, 49428, 49431, 49435, 38581, 49425, 49436, 38574, 38583, 38579, 49432, 38580, 38577, 49434, 39218, 49437, 49424, 50385, 39232, 30143, 39220, 39228, 39219, 39901, 39224, 50376, 50380, 39231, 39225, 39222, 39229, 39230, 39226, 38575, 39221, 39233, 50383, 39235, 50378, 39236, 50377, 50379, 50382, 50384, 50381, 39223, 53805, 30733, 39899, 39894, 39897, 39902, 53804, 53808, 30735, 53812, 30734, 39898, 39900, 30741, 39904, 39905, 30146, 53814, 39896, 53810, 53807, 53811, 53806, 53809, 39903, 39907, 39908, 39234, 54802, 40577, 39237, 40586, 31311, 54797, 40580, 54801, 54804, 54799, 40576, 54798, 54806, 39906, 54807, 40584, 40585, 40575, 40578, 54800, 40582, 40581, 54805, 31312, 40583, 31313, 54803, 41167, 41170, 41162, 55585, 41163, 41169, 41165, 31780, 55583, 56282, 55588, 41171, 31785, 55580, 55587, 55589, 41166, 31778, 55586, 54808, 55584, 31786, 55582, 41164, 41161, 56277, 32227, 56281, 32226, 41736, 41737, 41748, 41741, 32228, 41747, 41743, 56274, 42191, 56280, 56271, 41749, 56273, 41739, 56276, 41738, 41744, 32354, 32233, 41740, 56286, 41742, 56275, 56284, 56283, 56285, 56272, 41746, 56278, 55581, 41750, 42185, 56938, 42190, 42192, 56941, 42195, 56928, 41745, 42189, 56925, 42188, 42193, 32576, 56921, 32230, 56926, 56279, 56931, 42194, 56927, 56939, 56922, 56929, 42186, 42187, 56934, 56935, 56936, 56932, 42197, 42196, 56933, 56930, 56940, 56923, 56937, 32574, 32862, 42580, 42574, 57469, 42578, 42573, 42576, 57473, 57471, 32865, 42570, 32866, 57472, 42575, 42572, 42571, 57474, 57470, 57475, 57476, 42579, 42581, 42577, 33133, 57937, 33134, 42906, 57936, 57939, 33132, 33130, 42907, 57938, 57935, 42905, 43187, 57940, 58323, 43190, 43192, 43191, 43189, 58324, 43194, 58325, 58326, 43193, 43385, 43383, 43386, 58650, 58649, 43384, 43382, 33568, 58908, 43544, 43543, 33567, 43545, 58909, 59078, 58910, 59081, 33659, 59083, 59196, 59082, 59080, 59079, 43737, 43736, 43738, 59305, 43845, 59380, 43877, 59476, 44392, 44393, 44608, 36803, 46753, 36802, 37313, 37312, 37311, 47593, 47596, 47595, 47597, 47594, 47598, 47599, 28451, 37950, 48534, 37949, 48536, 48533, 37951, 48532, 48535, 49442, 38584, 49439, 49443, 49444, 49440, 49441, 49445, 39239, 50386, 50387, 39238, 50388, 50389, 53816, 39909, 30742, 53815, 40587, 31318, 40588, 54809, 55591, 55593, 55592, 55590, 41172, 41751, 56287, 56945, 56946, 56943, 56944, 56942, 32867, 57478, 57479, 57941, 42908, 57942, 57943, 57944, 58327, 43387, 43664, 46025, 36329, 46027, 46754, 36805, 46756, 46755, 36804, 37314, 47609, 47608, 47601, 28455, 37319, 37318, 47605, 37316, 47602, 47607, 47606, 37315, 37317, 47603, 47604, 28456, 48541, 48542, 37961, 37959, 48540, 48539, 48537, 37320, 37958, 37953, 37956, 37955, 48538, 37954, 37962, 37957, 37960, 49446, 49451, 38590, 49449, 49452, 38588, 29526, 38589, 38586, 49450, 38585, 49448, 29528, 38591, 50396, 50398, 39245, 30151, 50391, 50394, 39242, 50395, 50390, 50399, 39240, 39243, 50400, 50397, 39244, 39241, 53824, 50393, 39919, 53822, 53829, 53833, 53821, 39912, 53825, 53820, 53827, 39911, 39914, 39917, 30749, 50392, 53823, 53828, 53826, 39916, 39918, 53817, 39910, 53819, 53834, 53818, 53830, 53831, 53832, 39915, 39913, 54810, 40596, 54816, 40597, 54814, 40593, 54812, 54821, 40591, 40594, 40590, 54822, 54817, 54823, 40589, 54820, 54813, 54815, 54811, 31322, 40592, 55595, 55603, 41176, 55598, 55597, 55596, 55604, 31790, 55601, 31791, 55602, 41173, 41182, 31793, 41179, 41178, 55605, 41175, 41181, 55594, 55599, 55600, 41177, 41174, 41180, 32236, 56291, 32242, 41753, 41755, 56290, 56293, 56292, 56289, 56288, 41752, 41754, 42199, 56947, 56950, 56948, 56949, 42201, 32581, 32582, 42200, 42198, 42202, 56951, 56953, 32871, 42586, 42584, 57484, 42585, 42583, 57482, 42582, 57483, 57481, 57480, 42587, 57485, 33138, 42909, 33139, 57947, 57946, 57945, 58333, 33323, 58329, 58328, 33324, 58334, 58330, 58331, 58332, 58655, 58656, 43388, 58652, 58651, 58653, 58654, 43390, 43389, 43549, 43548, 43547, 58914, 58912, 58911, 43546, 58913, 43666, 43665, 43739, 43740, 59197, 43799, 59381, 59198, 59306, 43878, 59477, 44942, 45423, 46757, 47610, 37322, 37321, 29529, 49453, 39246, 39247, 53835, 53836, 53837, 39921, 54824, 40598, 54825, 41184, 41183, 41185, 41758, 41757, 56294, 56954, 32583, 56955, 57486, 58335, 58915, 59446, 59478, 44943, 45424, 49456, 49455, 49454, 54708, 32584, 57948, 44612, 44611, 44610, 26883, 44944, 26887, 46758, 44945, 46759, 44946, 35713, 46760, 47611, 35981, 35982, 35987, 45425, 45430, 35986, 27170, 35988, 35984, 27173, 45428, 45427, 45432, 35985, 35979, 45429, 35983, 45426, 45431, 36330, 36337, 36333, 46028, 36332, 46031, 36336, 36334, 27494, 27496, 36331, 46033, 46032, 27497, 46034, 46030, 48072, 36338, 36335, 46769, 46773, 36812, 46768, 36807, 36811, 27934, 36808, 36810, 46767, 46761, 46771, 27935, 46772, 46762, 38592, 46770, 36809, 46765, 46763, 36813, 37324, 37323, 46764, 47622, 37329, 28461, 47623, 37328, 46766, 37326, 47618, 47621, 47617, 47615, 47616, 47613, 47624, 47619, 47614, 37327, 28458, 47620, 37330, 37325, 47612, 37967, 37963, 37969, 37968, 29005, 48554, 29009, 29007, 37970, 48553, 53838, 48548, 48547, 48551, 48550, 29010, 48544, 48546, 48552, 48555, 48556, 48545, 37966, 48549, 37965, 37964, 29008, 48557, 49475, 49463, 49472, 49459, 29532, 29531, 49457, 38596, 49460, 49476, 49470, 49474, 49466, 49464, 49478, 49477, 37971, 29533, 49462, 49473, 49461, 49465, 49471, 49468, 49467, 49469, 49458, 38595, 38594, 38593, 50404, 50403, 50406, 50401, 50409, 39249, 50405, 50407, 50411, 39248, 39251, 50402, 50410, 55606, 50408, 55607, 55608, 55609, 39250, 53845, 53843, 53849, 53840, 53842, 30752, 39923, 30753, 39927, 39924, 30757, 53847, 39932, 53841, 53846, 53851, 53852, 53848, 53850, 56295, 53839, 56296, 53844, 39928, 39926, 39931, 39925, 39929, 39930, 39922, 54839, 40605, 40604, 40602, 54834, 40600, 54838, 54831, 54840, 31323, 54835, 54837, 54826, 54843, 56956, 54829, 54833, 54845, 54830, 54107, 54841, 54828, 54827, 54836, 54844, 40601, 40606, 40603, 54832, 40599, 41186, 31797, 55617, 41190, 55614, 41191, 55612, 57488, 54842, 55619, 55615, 41189, 41192, 55610, 55613, 55616, 55620, 41193, 41194, 41188, 41187, 55611, 41764, 56303, 32243, 56301, 41761, 56299, 56306, 56305, 41760, 56304, 56297, 56300, 41763, 41762, 41759, 56302, 56964, 56965, 56963, 56958, 56959, 56962, 56960, 56961, 56957, 42206, 42205, 57491, 42590, 57490, 42588, 57489, 42589, 58657, 33140, 57950, 42912, 57951, 57949, 42910, 42911, 42204, 57952, 42913, 43195, 33468, 58338, 58337, 58336, 58658, 58660, 58659, 59199, 58917, 58916, 43550, 59084, 59200, 59479, 44947, 35435, 35543, 35542, 35544, 35541, 26712, 44613, 44615, 26714, 26890, 35714, 26889, 26891, 26888, 44950, 26893, 35715, 28468, 44949, 47628, 47626, 47627, 44948, 26892, 27179, 47625, 27175, 27178, 27177, 46038, 27180, 35989, 35990, 48559, 45436, 48561, 45434, 45435, 45433, 48558, 48560, 35991, 36341, 36340, 36339, 27502, 27500, 36346, 29534, 36342, 49480, 49479, 49481, 46041, 46035, 46036, 46037, 46040, 46039, 36345, 36343, 36344, 36818, 36814, 27939, 46776, 36822, 36823, 36815, 36820, 36816, 27938, 46778, 27940, 46780, 50412, 50414, 50415, 46777, 46779, 46775, 36819, 36821, 36817, 36824, 50413, 46774, 39933, 30759, 28466, 37334, 37333, 37338, 37331, 37335, 28464, 47633, 37337, 53857, 53856, 47635, 53853, 53854, 53858, 53855, 47630, 47632, 47631, 47629, 47634, 37332, 37336, 36825, 29014, 37978, 37975, 37977, 29012, 37979, 48571, 37976, 38610, 37974, 37973, 48569, 48562, 29011, 54847, 48564, 48563, 48565, 48566, 48567, 48568, 48570, 54846, 37972, 55621, 38598, 38603, 38606, 38601, 38600, 29536, 50416, 38599, 38605, 38602, 38607, 38609, 29538, 38608, 49484, 38597, 49483, 49486, 38604, 30158, 39258, 39257, 39254, 39253, 39264, 39260, 39256, 50421, 50418, 50417, 39262, 39263, 56307, 56309, 56308, 56310, 50420, 39252, 30161, 50419, 41765, 39255, 39259, 39265, 30761, 56966, 39937, 53862, 30760, 39938, 30762, 40615, 39934, 39935, 53861, 53863, 30763, 56969, 56967, 53864, 53866, 53867, 53865, 53859, 53860, 39939, 54849, 39936, 56968, 42591, 40612, 40613, 57493, 31325, 54848, 40608, 40611, 54851, 40609, 40610, 31326, 54850, 57494, 57492, 42592, 55622, 55626, 41195, 31798, 41196, 57953, 57954, 57955, 55624, 55627, 55623, 41198, 41197, 57956, 55625, 41767, 56311, 56312, 41768, 42210, 41771, 56314, 56313, 41769, 41770, 58339, 41766, 56315, 56971, 56316, 42209, 56970, 42208, 56973, 56972, 32587, 40614, 42207, 32873, 42593, 57496, 57498, 57495, 57497, 33141, 57957, 57958, 58340, 57959, 58661, 58918, 58919, 43846, 59307, 27942, 46781, 37341, 37340, 47645, 47641, 37342, 28473, 47639, 47646, 47636, 28474, 37343, 47643, 47642, 47637, 47638, 47644, 28476, 47640, 47647, 48578, 37980, 37981, 29020, 48576, 38613, 29017, 29018, 48577, 48573, 48572, 29016, 48574, 48575, 48579, 38612, 38615, 38611, 49489, 49488, 38614, 50425, 39267, 39266, 50424, 50423, 50422, 53869, 39943, 53873, 39944, 39940, 53877, 39941, 53876, 53875, 53874, 53870, 53868, 39942, 53871, 53872, 53879, 53878, 54855, 54854, 40616, 54857, 40619, 54859, 31334, 54864, 31331, 31332, 54863, 40617, 54856, 54862, 54861, 40618, 54858, 54860, 54852, 54865, 41204, 41202, 41203, 41206, 31803, 55629, 41205, 31801, 55631, 41201, 55637, 41207, 55630, 55636, 55632, 55634, 55635, 41200, 41773, 41774, 41776, 56324, 56320, 32244, 56317, 41775, 32247, 41777, 55638, 32246, 56323, 41778, 56326, 56327, 56318, 56322, 56319, 41779, 56321, 56978, 56975, 42219, 42216, 42212, 42215, 42214, 42220, 42217, 42213, 42218, 56976, 56977, 56979, 56974, 56325, 42221, 42211, 57499, 42598, 42595, 42596, 42594, 42597, 57500, 57501, 57502, 57504, 57503, 33144, 33142, 33143, 42914, 57961, 57960, 58341, 58342, 58345, 43196, 58344, 58343, 58662, 58664, 43391, 58666, 58665, 43392, 58663, 43552, 33572, 58920, 58921, 43551, 59201, 43800, 59309, 59308, 59383, 59382, 59495, 59496, 46043, 37982, 37344, 50426, 50427, 39945, 53881, 53880, 40620, 54866, 41208, 56328, 43197, 37345, 46782, 47648, 48581, 37984, 37983, 50428, 53882, 41209, 41780, 42915, 57962, 46785, 46783, 37346, 47649, 47650, 48586, 48587, 48588, 48584, 48585, 48591, 48589, 48583, 48592, 48590, 29554, 38617, 29552, 29551, 49494, 49490, 49496, 49492, 49493, 49495, 49491, 39268, 39269, 50433, 39270, 50429, 30169, 50431, 50432, 50435, 50436, 53887, 30771, 39949, 53894, 53888, 53893, 53886, 39948, 53896, 53897, 53890, 39946, 53884, 53895, 53889, 53892, 53898, 53883, 39947, 40627, 40630, 40625, 31340, 40621, 40623, 54870, 54869, 54876, 54874, 54872, 40629, 31337, 54867, 54875, 54873, 40622, 54871, 40626, 40631, 40624, 41211, 41212, 55642, 31806, 41215, 41214, 55645, 40628, 41210, 55643, 41213, 41218, 55647, 55651, 55648, 55652, 55646, 55649, 55641, 55650, 31811, 41217, 41216, 41784, 32254, 32255, 41785, 32249, 32251, 56329, 41783, 41781, 42222, 56331, 41786, 32257, 56337, 56336, 41787, 41788, 56338, 56332, 56333, 56335, 56334, 32598, 56982, 56986, 42223, 56983, 42225, 56981, 56989, 56985, 56988, 56990, 56991, 56984, 56987, 32597, 56980, 41789, 32877, 57510, 57511, 42605, 57515, 42600, 32879, 42603, 42599, 57513, 57505, 57506, 42604, 32883, 57514, 42601, 57509, 57512, 57507, 57969, 33149, 57974, 57968, 57963, 33151, 33148, 57967, 57970, 57976, 57965, 57966, 57971, 57972, 57973, 57964, 43200, 58354, 58353, 58671, 58349, 58347, 58346, 58348, 43199, 43395, 33471, 43393, 58670, 58668, 58352, 58667, 58669, 58672, 43553, 58923, 58924, 58925, 58922, 58926, 33718, 59086, 59087, 59085, 59207, 59202, 59203, 59209, 59205, 59204, 43741, 59208, 59206, 59210, 43742, 43801, 59312, 59310, 59311, 59385, 59384, 59386, 59447, 59448, 43898, 45437, 44951, 36347, 37348, 47654, 37347, 37349, 47653, 47652, 47651, 37985, 37986, 29023, 48593, 48594, 49500, 49499, 29557, 49497, 49498, 38619, 38618, 39271, 30171, 50437, 50438, 39272, 39950, 39952, 40632, 39951, 39953, 39954, 40634, 54879, 40633, 55653, 54878, 54881, 54877, 55656, 31813, 41219, 31814, 55657, 55655, 55654, 56340, 41791, 56339, 41790, 42229, 42227, 42226, 42228, 42606, 57516, 57517, 33155, 57977, 58356, 58357, 58355, 43398, 43397, 43554, 58927, 59211, 59387, 36348, 36827, 36828, 36826, 46787, 37351, 37350, 47655, 37994, 37992, 37990, 29025, 37991, 29027, 20568, 37987, 37988, 37989, 48597, 48598, 37993, 48595, 48596, 29024, 29559, 49505, 29565, 29560, 29558, 49504, 38623, 38620, 38622, 38621, 49502, 29564, 29562, 49503, 49501, 39280, 39276, 39278, 30173, 39274, 30174, 39281, 50441, 39277, 39282, 30172, 39279, 39283, 50440, 50442, 50443, 39273, 53901, 39962, 39957, 53906, 39959, 39956, 53907, 30778, 39961, 39958, 53905, 53900, 53902, 53903, 53904, 39955, 39960, 39963, 31349, 31346, 40636, 40639, 54883, 40635, 40637, 40638, 54886, 54888, 54890, 54885, 54889, 54887, 31347, 31822, 31820, 41223, 55658, 41220, 41222, 41224, 41221, 55660, 31819, 55659, 31815, 55661, 55662, 55663, 55664, 41798, 41797, 41793, 32260, 56341, 41794, 41800, 41799, 56343, 41796, 41792, 41795, 56342, 56344, 42230, 56993, 56994, 32600, 42231, 56992, 32601, 32885, 42612, 42607, 42610, 42609, 42611, 42613, 32887, 57521, 42232, 57518, 57519, 42608, 57520, 42921, 42614, 33156, 42920, 42918, 42923, 42919, 43201, 57978, 58358, 58673, 43555, 58929, 58928, 43667, 33660, 33661, 59088, 59212, 59213, 43802, 45438, 35439, 35437, 26604, 35440, 26603, 35438, 35545, 26715, 44616, 35718, 26895, 26896, 35719, 35717, 35992, 45440, 35993, 35995, 35996, 27181, 35994, 45439, 45441, 36349, 46045, 46048, 27507, 36352, 46046, 50444, 46050, 46051, 46052, 46047, 36350, 46053, 46049, 46044, 46790, 36832, 36353, 46789, 36829, 36831, 46795, 46792, 46796, 36830, 46791, 46794, 46793, 37352, 47665, 47658, 28481, 28483, 28482, 37353, 47660, 47661, 47668, 47667, 50445, 47663, 47659, 47666, 47664, 54892, 47662, 37999, 38004, 38000, 38001, 38003, 48602, 48600, 37995, 37996, 37998, 48601, 48606, 55667, 48604, 38002, 48605, 48603, 55665, 37997, 49517, 38630, 38627, 49509, 49516, 49514, 38631, 38628, 38626, 50446, 49510, 49512, 38632, 38629, 49513, 56346, 49511, 56345, 38625, 49506, 49518, 49507, 38624, 49508, 49515, 49519, 55666, 50451, 50449, 50453, 30180, 30179, 39964, 30181, 30182, 39285, 50450, 50447, 30178, 39286, 39287, 50452, 50454, 56996, 50448, 39284, 39971, 39969, 39970, 53914, 39973, 39967, 39966, 53908, 39968, 39972, 39965, 57523, 53912, 53910, 53909, 53911, 53915, 40640, 40641, 31353, 54893, 40643, 40642, 54895, 57522, 42233, 54894, 41225, 41226, 55669, 55670, 55668, 43202, 41801, 56349, 32261, 56347, 56348, 42234, 56998, 57979, 57000, 43556, 56997, 56999, 58930, 57609, 42924, 57981, 57980, 59214, 59215, 58359, 58696, 58931, 43803, 43804, 59524, 59509, 49520, 30780, 53916, 40644, 54896, 31825, 56350, 56351, 42235, 57524, 46797, 46798, 46799, 47669, 37354, 28484, 47671, 47670, 47673, 47672, 29031, 48609, 29029, 48607, 49526, 48613, 48611, 48608, 29032, 29030, 48612, 48610, 49534, 38633, 49521, 49524, 49530, 49528, 49533, 49525, 49523, 49527, 49532, 49531, 49522, 49529, 50467, 50465, 39288, 50458, 50459, 50469, 50455, 50470, 50463, 30183, 50468, 50462, 39289, 50464, 50456, 39290, 30184, 50457, 50466, 50471, 50460, 53922, 53920, 53929, 53924, 53921, 39975, 53923, 53931, 53927, 53925, 53926, 53928, 53919, 53917, 39974, 53930, 53932, 31826, 31354, 40646, 54904, 54899, 54910, 54897, 54908, 54903, 54900, 54907, 54905, 54901, 40645, 54911, 31355, 54906, 54914, 54902, 53918, 54915, 54912, 54898, 54913, 54909, 31828, 55676, 55674, 55684, 55675, 55677, 55688, 55673, 55681, 55672, 55671, 55678, 41227, 55686, 55680, 55679, 55682, 55687, 54917, 55683, 55685, 56353, 56359, 56355, 56356, 56352, 41802, 56360, 56358, 41803, 56354, 56357, 57005, 57002, 57006, 57003, 42236, 57009, 32602, 42237, 57001, 57007, 57008, 32603, 57004, 57010, 57530, 57534, 57526, 57537, 57531, 57538, 57535, 57525, 42615, 57532, 57533, 42616, 57529, 57527, 57539, 57536, 57987, 33159, 57985, 57982, 57989, 57983, 57988, 57986, 57990, 57528, 57984, 58360, 58361, 33330, 58364, 58365, 58363, 58362, 58679, 58680, 58681, 33474, 58678, 58674, 58675, 58676, 58677, 58935, 58933, 58934, 58932, 59089, 59313, 59388, 59533, 36833, 47675, 47676, 28486, 47674, 38007, 38005, 38008, 38006, 29034, 48616, 29033, 48615, 29571, 38638, 38635, 38634, 38637, 38636, 49535, 38639, 39293, 30189, 39294, 39292, 39291, 30185, 30188, 50476, 30191, 50475, 50477, 50473, 50472, 53935, 53934, 39986, 39981, 39982, 39980, 39979, 39984, 39978, 31356, 39977, 53936, 53937, 53933, 39985, 39983, 41228, 54922, 31360, 40653, 40650, 31359, 54919, 40652, 40649, 54921, 40648, 54920, 54918, 40647, 54923, 40651, 31831, 31829, 31830, 41229, 31836, 41231, 31833, 55689, 41807, 55690, 55692, 41230, 55691, 55693, 41232, 41811, 41814, 56368, 56372, 41808, 56367, 41805, 56374, 56371, 32264, 41804, 41806, 56370, 56363, 56366, 41813, 56364, 56373, 56362, 56365, 41810, 41812, 41809, 42244, 42238, 42242, 42239, 42240, 32605, 42243, 42241, 42246, 32604, 57011, 57016, 57012, 42245, 57014, 57018, 57017, 57015, 57013, 57019, 57541, 32889, 57549, 32891, 42617, 33164, 32893, 57547, 57546, 42618, 32895, 32892, 32894, 57542, 57544, 57545, 57548, 57550, 57543, 57540, 33161, 33160, 57991, 42925, 42926, 33162, 33163, 57993, 42927, 42928, 57996, 57992, 57997, 57994, 43205, 43208, 33332, 58367, 43206, 58368, 58369, 43203, 43207, 43204, 58366, 43399, 58682, 58683, 43400, 43557, 33575, 33574, 58936, 58937, 58938, 33663, 43669, 33662, 43668, 59090, 43670, 43745, 59216, 43744, 59217, 59222, 43743, 59389, 33775, 59450, 59449, 59451, 43879, 59514, 59547, 59550, 33805, 28487, 48617, 49536, 30195, 54085, 54924, 40785, 56375, 42929, 46801, 45442, 46800, 28488, 47677, 28490, 48618, 38009, 29036, 48620, 48619, 49538, 49537, 30782, 53939, 53938, 54925, 57551, 57552, 48622, 48623, 48621, 29572, 29574, 38641, 38640, 49540, 49539, 50479, 39296, 30198, 50478, 39295, 50480, 30783, 39987, 39989, 39988, 53941, 53940, 40655, 40654, 40659, 40656, 40657, 40658, 54926, 55694, 41234, 41235, 41237, 41236, 55696, 41817, 56376, 41815, 41816, 32266, 42248, 42247, 42620, 42619, 57199, 57553, 42431, 42931, 57999, 42933, 42932, 57998, 58001, 58000, 58370, 58371, 58684, 43401, 58939, 43746, 59314, 59391, 59390, 38010, 29039, 48624, 38645, 38644, 49543, 49546, 38643, 49544, 38642, 49542, 49548, 49547, 29575, 29577, 39298, 30201, 39297, 50484, 50482, 39299, 39300, 30203, 39303, 39301, 39304, 39302, 50486, 30204, 50485, 50481, 50483, 53944, 39990, 53948, 53947, 30786, 53950, 39991, 30787, 53946, 30788, 39994, 30785, 39993, 39995, 53945, 39992, 53949, 53943, 54931, 40660, 40663, 31371, 31363, 31370, 40661, 40662, 54930, 54934, 54927, 54928, 54932, 54933, 55703, 55705, 41238, 41244, 31841, 41240, 55698, 31842, 54929, 41248, 55702, 31840, 55704, 41242, 41245, 55700, 41246, 55706, 54935, 41243, 55699, 55707, 55697, 41247, 41241, 32277, 41827, 41819, 32267, 41821, 41831, 56379, 56377, 32272, 41822, 32273, 56382, 56385, 41830, 56384, 32270, 41832, 56386, 56387, 56383, 41239, 56381, 56380, 41823, 41833, 56378, 41820, 41825, 41824, 41828, 32613, 42254, 42257, 42252, 32612, 42250, 57021, 42258, 57030, 42251, 32611, 57028, 32609, 57025, 32608, 57029, 42253, 57027, 57022, 57023, 42256, 42255, 57020, 42249, 32903, 42627, 32898, 42628, 42623, 57554, 42621, 57556, 32900, 42625, 32901, 32904, 42626, 57560, 57555, 57557, 57562, 57559, 42624, 57558, 42629, 32905, 57561, 42940, 58005, 33166, 58007, 58008, 42937, 42938, 42939, 42934, 42935, 58006, 43209, 58379, 58372, 33336, 43210, 58378, 58376, 58373, 58377, 43212, 43213, 58374, 58375, 43214, 43402, 43405, 43403, 58685, 43406, 43404, 58688, 58686, 58689, 58687, 43559, 43671, 58940, 43558, 43560, 59093, 59091, 59092, 43747, 59219, 59221, 43672, 59220, 59218, 43805, 59393, 59392, 43847, 59480, 43918, 59515, 59526, 59525, 43941, 38011, 29579, 29581, 49549, 38646, 50488, 39306, 39308, 39305, 39307, 50487, 39309, 30790, 39997, 30789, 30791, 53952, 53951, 53953, 53954, 53955, 39996, 39998, 40664, 54936, 54937, 40667, 40668, 40666, 54938, 40665, 31844, 55709, 41249, 55710, 31847, 31845, 41250, 41251, 55708, 55711, 56391, 56388, 32279, 56389, 55712, 41834, 56393, 56390, 57031, 57033, 57036, 57032, 57035, 57034, 57563, 42259, 42260, 57564, 57565, 32907, 42631, 42630, 42941, 42943, 42945, 33171, 58009, 42942, 42944, 58380, 33338, 43215, 58381, 58382, 43216, 58690, 58693, 58692, 58691, 33578, 59094, 43748, 59317, 59315, 59316, 43848, 43880, 43899, 38647, 49550, 39999, 54939, 31848, 55713, 57039, 57567, 32910, 42946, 57566, 58010, 58383, 58695, 58694, 59095, 38649, 38648, 39310, 30210, 39311, 40007, 53956, 40001, 40004, 53957, 40002, 40003, 40006, 40000, 31376, 40005, 40669, 54940, 55714, 41252, 41253, 41835, 41836, 41837, 32618, 42261, 42262, 57568, 57569, 42633, 42632, 42634, 58011, 42947, 41838, 43217, 43218, 33340, 58697, 33579, 43806, 43928, 46056, 47678, 37355, 38017, 38015, 38016, 38013, 29044, 38012, 29043, 48625, 29041, 29591, 38659, 29590, 38650, 38658, 49552, 29588, 39318, 38656, 29585, 29586, 29589, 49555, 38655, 38651, 49553, 49554, 49551, 38652, 38657, 39320, 50494, 50495, 39314, 39327, 39315, 30214, 30213, 39317, 39313, 30220, 39325, 39316, 53966, 39326, 50498, 50496, 50491, 39319, 39324, 50490, 39323, 50489, 50499, 39312, 50492, 50497, 40010, 30796, 53960, 53971, 40009, 40008, 30793, 53959, 53965, 30215, 53969, 40011, 30799, 53968, 53964, 54942, 53967, 53962, 53963, 53970, 53972, 53958, 53961, 40012, 31377, 40672, 31379, 40680, 54951, 40679, 40677, 54952, 54950, 40676, 40674, 54954, 54943, 40681, 40673, 40682, 40675, 40678, 31382, 54941, 40671, 54953, 31383, 54949, 54955, 54945, 54946, 54947, 54948, 40683, 40670, 40684, 31856, 31852, 31849, 55716, 41258, 31860, 41259, 31855, 41257, 41254, 41256, 31850, 41262, 55721, 31853, 55723, 41255, 55718, 31859, 55722, 55715, 55717, 41260, 41261, 55719, 55724, 41839, 32283, 41845, 41843, 32621, 41842, 41840, 56396, 41841, 32281, 41846, 41844, 56397, 56394, 56395, 57049, 42266, 57043, 57040, 42267, 32631, 57045, 42265, 42635, 42264, 42263, 57047, 57042, 32627, 57041, 57048, 57044, 57050, 57046, 32913, 32912, 42640, 42638, 57573, 42639, 32917, 57572, 32918, 42637, 57570, 57574, 32919, 57575, 57571, 42636, 57477, 42948, 42949, 58012, 42951, 58021, 58390, 33177, 33175, 58016, 58014, 58019, 42950, 42952, 42953, 58013, 58017, 58020, 58018, 58389, 43221, 43220, 58386, 58388, 43219, 58384, 58387, 58385, 58705, 58704, 58702, 43409, 43410, 33477, 43407, 58700, 33478, 58701, 58703, 58699, 58698, 33581, 58941, 43408, 33580, 58942, 33665, 43673, 43749, 59223, 43750, 59224, 59225, 33748, 59318, 59452, 47679, 48628, 29046, 48626, 38018, 48627, 38660, 38665, 29594, 38662, 38663, 49557, 49559, 38661, 29595, 49558, 48898, 38664, 49560, 30229, 39331, 30226, 39330, 39329, 39328, 30224, 50500, 30223, 50504, 50502, 50501, 30800, 40015, 30803, 53975, 53974, 53973, 40014, 53976, 40686, 40694, 40687, 54956, 54959, 40685, 40690, 40693, 54958, 54960, 40691, 40692, 54957, 40689, 40688, 55728, 31870, 41270, 41271, 31862, 41263, 55727, 31869, 41847, 41267, 31868, 41265, 41266, 41269, 41264, 41268, 55725, 55729, 55726, 32292, 56401, 56403, 41852, 56405, 41849, 41853, 32293, 41855, 32634, 41850, 56404, 41851, 41854, 41848, 56407, 56402, 56400, 56406, 56398, 42268, 32636, 32637, 32638, 42269, 57052, 57051, 57053, 57054, 57055, 42643, 42646, 42645, 32920, 42641, 32922, 42644, 42647, 42642, 32923, 58029, 33180, 33182, 42954, 58022, 42955, 58025, 58023, 58028, 58030, 58031, 58026, 58027, 58024, 58391, 58392, 58706, 43562, 33584, 58943, 58944, 43674, 59096, 43675, 33666, 33721, 43751, 43807, 59319, 43936, 59554, 46802, 38282, 53977, 57056, 42270, 58032, 33343, 43222, 46057, 46058, 46061, 46059, 36834, 46803, 46805, 38019, 37359, 37356, 47683, 47681, 37358, 47682, 47684, 48629, 37357, 48630, 48635, 29047, 38020, 48633, 48634, 29051, 38021, 49561, 38022, 48631, 48632, 29048, 49571, 49562, 38667, 38669, 38666, 38672, 29601, 38668, 50512, 38670, 49565, 49564, 50506, 29598, 49563, 50507, 49567, 38673, 49570, 40016, 49569, 49568, 50505, 29603, 38671, 50508, 53978, 50513, 39336, 39332, 50514, 39333, 30231, 50511, 39334, 53980, 50510, 53981, 30812, 53987, 30811, 40022, 40017, 40696, 30809, 40019, 40024, 40021, 30813, 40023, 53983, 40018, 53982, 55730, 40020, 53985, 53984, 40695, 53986, 40704, 31871, 40705, 31392, 54965, 54969, 41272, 40698, 54968, 40701, 54966, 40699, 54974, 31390, 54970, 54975, 40706, 54967, 54962, 40697, 54964, 54963, 54971, 41274, 54973, 55732, 54961, 40703, 54972, 40700, 40702, 55731, 41273, 41285, 55734, 41278, 41280, 41284, 41276, 55733, 41283, 41286, 31876, 41287, 55735, 55740, 56409, 55737, 41275, 56410, 55742, 41279, 55736, 55741, 55738, 41281, 55739, 56414, 41860, 41856, 32295, 32301, 41289, 32302, 41858, 41288, 41857, 56413, 56412, 57057, 32303, 41859, 57059, 57579, 56411, 56408, 56416, 57062, 57058, 32294, 56417, 56415, 42273, 57060, 42271, 32644, 32928, 57578, 42278, 42275, 42277, 42279, 57576, 32640, 42276, 41290, 42272, 57577, 32642, 57583, 57061, 57582, 32643, 42274, 57581, 42280, 32929, 57580, 57584, 57590, 58033, 42956, 57591, 42650, 32930, 42957, 42649, 57589, 57593, 42648, 57064, 57592, 57586, 57587, 57588, 58034, 57594, 57585, 42965, 42959, 58035, 33186, 42961, 42958, 58036, 42968, 58037, 42967, 42960, 42964, 42962, 58038, 42963, 42966, 33345, 43223, 43224, 58396, 58707, 58395, 43225, 58394, 58393, 43411, 58709, 43412, 43413, 43563, 58708, 43564, 43565, 33585, 58945, 58947, 58946, 43676, 59320, 43808, 46806, 47685, 50515, 53988, 50517, 50516, 40025, 31399, 31400, 55743, 55744, 54976, 54978, 54977, 57066, 57065, 56418, 57234, 57595, 58948, 33751, 29607, 49572, 38967, 50518, 50519, 50520, 53989, 54979, 55745, 56421, 41862, 41861, 41863, 56420, 56419, 42281, 32646, 32647, 57067, 57596, 42969, 58039, 58710, 43752, 37360, 37361, 38023, 48637, 48636, 38674, 49574, 49573, 49576, 49575, 39340, 50522, 50523, 39339, 30238, 50521, 50527, 39338, 53990, 53993, 50524, 50526, 39341, 53997, 40031, 54001, 53994, 40719, 40033, 40036, 40026, 40029, 40027, 40034, 53991, 40035, 53995, 40032, 53998, 53996, 40028, 53992, 53999, 40030, 54000, 54985, 31407, 54984, 40716, 31405, 31402, 31406, 31403, 54980, 40710, 31404, 40717, 40714, 54993, 40720, 40708, 40718, 40721, 40712, 54987, 54986, 54995, 54990, 54983, 54992, 40711, 54991, 40709, 54988, 54989, 54996, 54994, 54981, 54982, 41291, 55753, 41292, 55747, 31880, 55748, 55746, 41293, 31877, 55751, 55752, 39342, 55749, 41295, 41294, 56427, 41873, 41872, 41868, 32309, 41870, 41869, 32306, 41866, 41875, 32318, 32314, 32315, 32311, 41876, 41864, 32317, 56426, 56425, 56422, 41871, 32316, 56423, 41865, 56424, 41874, 42282, 42288, 42284, 32652, 57074, 41877, 57069, 41867, 42286, 42285, 42289, 57068, 42287, 42291, 32651, 42292, 57075, 57077, 42290, 57076, 57070, 57071, 57072, 57073, 22769, 57078, 32936, 57601, 57600, 42659, 42654, 42656, 42653, 32933, 42661, 32934, 32935, 32939, 42662, 42663, 42652, 57599, 33187, 42655, 42660, 42657, 57602, 57606, 57607, 57608, 57604, 57603, 57598, 57605, 57628, 57597, 42972, 42971, 42974, 33188, 42975, 42973, 33193, 58042, 58041, 58043, 58040, 58044, 58045, 43233, 58402, 42977, 58406, 58397, 43226, 58400, 42976, 43229, 43232, 43228, 58405, 33351, 43230, 58398, 58399, 58401, 43227, 43234, 58404, 58718, 58716, 43414, 43567, 58715, 58712, 43415, 58713, 58717, 58714, 58719, 58711, 43568, 58954, 58957, 43566, 58956, 58959, 58958, 58952, 58953, 58949, 58955, 43681, 59098, 43682, 43678, 33668, 43679, 59097, 43677, 43680, 33669, 59099, 43753, 43754, 33752, 59322, 59321, 33777, 59395, 59396, 59394, 59453, 43900, 59481, 59497, 59498, 59537, 38024, 29052, 49578, 49579, 49577, 49580, 30240, 30242, 39344, 50533, 39343, 30241, 50531, 50528, 50529, 50530, 50532, 30819, 30818, 40039, 40038, 54005, 55001, 40037, 40040, 30824, 54003, 54007, 54004, 30825, 54006, 40723, 40722, 31414, 55000, 54002, 54999, 54998, 55755, 31885, 55759, 31883, 55760, 41296, 55758, 55754, 55756, 55757, 41886, 56429, 32320, 56428, 41884, 56430, 41879, 42293, 41882, 41880, 41883, 41885, 55761, 41881, 57084, 42295, 42294, 57083, 57080, 42297, 42298, 42296, 57086, 57087, 57082, 57081, 57085, 57079, 32941, 42666, 42665, 42664, 57610, 57611, 57612, 33196, 42979, 58052, 33195, 42978, 42980, 58048, 58049, 42981, 58050, 58051, 58047, 33352, 58407, 33355, 58408, 33354, 58409, 58724, 58725, 43416, 33485, 43418, 33486, 58721, 43417, 58726, 58720, 58722, 58723, 33588, 43569, 33671, 59100, 59226, 43755, 59227, 59323, 59397, 43881, 29612, 30243, 38889, 39345, 50535, 50534, 54009, 55003, 55002, 31887, 41297, 56431, 57088, 42667, 33198, 58053, 58410, 58727, 58728, 58729, 58960, 59101, 59102, 59228, 59324, 33753, 59499, 48638, 48639, 49582, 49581, 30245, 39347, 50541, 50540, 50538, 50542, 50536, 50537, 39346, 39349, 40043, 54010, 54013, 30831, 54011, 40047, 30833, 54014, 40046, 30829, 30830, 40041, 30827, 40042, 40045, 40044, 54015, 54012, 55004, 31418, 55006, 40727, 55005, 31420, 31415, 31422, 40724, 40726, 31421, 31419, 55008, 40725, 55007, 31891, 31893, 55767, 41298, 41301, 41299, 55765, 41302, 41303, 41300, 55762, 31890, 55763, 55764, 55766, 55768, 56433, 41891, 32322, 41889, 41893, 41892, 56435, 41894, 57089, 56434, 32323, 41887, 32329, 41888, 41890, 56432, 32662, 57092, 57096, 42299, 42300, 42302, 32665, 57097, 57095, 57090, 42303, 42301, 57094, 57091, 32660, 57093, 42673, 57613, 42668, 42672, 42671, 42670, 32947, 32943, 42675, 42669, 32942, 57614, 57615, 57618, 57619, 42674, 42984, 42987, 42983, 58054, 33199, 33201, 42982, 33200, 42986, 58055, 42985, 58059, 58056, 58057, 43240, 43237, 58411, 43241, 43239, 43236, 43244, 43243, 43242, 43238, 43245, 58058, 33358, 58412, 58413, 43420, 33487, 33488, 43419, 58731, 58732, 58730, 33589, 58961, 43570, 33593, 33591, 43684, 59103, 43683, 33673, 59104, 43756, 59229, 59230, 59325, 33754, 43809, 59400, 59399, 43849, 33797, 44396, 44395, 38676, 39350, 39351, 50543, 54016, 55009, 55769, 56436, 32330, 57621, 58060, 42989, 58414, 58963, 58962, 43572, 43850, 54017, 30834, 31423, 56437, 57622, 58062, 58061, 58415, 58733, 43851, 29613, 49583, 50545, 50544, 54018, 55013, 31425, 40728, 55011, 55010, 31424, 55012, 41304, 55770, 32331, 56439, 56440, 56438, 57098, 42304, 57099, 32948, 57625, 57624, 57623, 57626, 58063, 33202, 58065, 42991, 58064, 58066, 58067, 43246, 58417, 58736, 58737, 43421, 33360, 33489, 58735, 43422, 58734, 58738, 33595, 33594, 58739, 58964, 59106, 59107, 43757, 59231, 59232, 59233, 33755, 59326, 59402, 59401, 59403, 59454, 43901, 33794, 43910, 59500, 59543, 59544, 48640, 38026, 49587, 38679, 49586, 29615, 38677, 49585, 38678, 29614, 49584, 49588, 39354, 39355, 39356, 39353, 39352, 39357, 50549, 50546, 50550, 50552, 50547, 50555, 50553, 50554, 50551, 50548, 30838, 40052, 54020, 54019, 40051, 40054, 40734, 40053, 30837, 54022, 40048, 40050, 54021, 40049, 40729, 55015, 40738, 40736, 55014, 31427, 40737, 55016, 40731, 40730, 40732, 40735, 55017, 40733, 31894, 41306, 41309, 41313, 31895, 55771, 41305, 41307, 41312, 41310, 55773, 55774, 55776, 41311, 55772, 55775, 41308, 41896, 56442, 32332, 41902, 56445, 41900, 41898, 56446, 56443, 56441, 56448, 41895, 56444, 56447, 41899, 42305, 42308, 57100, 42306, 57101, 57102, 41897, 42307, 57632, 32949, 57631, 42676, 57630, 57629, 42677, 57627, 42993, 42995, 42997, 33204, 58068, 58069, 42994, 42992, 58070, 42996, 43249, 32666, 58421, 33363, 43247, 58419, 33364, 43250, 43251, 43248, 33365, 58418, 43424, 43423, 43573, 43574, 33596, 58968, 58967, 58969, 58966, 43686, 43685, 59234, 33756, 59327, 59328, 33778, 43852, 43882, 43902, 43929, 27952, 29619, 29616, 49590, 29617, 49591, 38680, 50556, 39360, 30249, 39358, 39361, 30846, 30850, 30848, 30844, 54027, 40060, 40059, 54024, 54023, 40057, 30855, 40062, 40055, 40056, 54031, 54025, 30853, 40061, 54030, 54026, 54028, 30845, 40058, 40741, 40739, 55018, 40742, 31433, 31903, 40747, 40746, 31436, 55024, 55019, 55022, 55021, 40745, 55025, 40744, 55023, 40740, 55020, 41319, 31905, 41320, 41317, 41315, 31904, 55784, 41318, 55779, 55786, 55778, 31908, 55785, 41323, 41321, 55777, 31907, 55781, 41324, 41316, 55783, 41314, 41322, 41916, 41913, 41909, 41904, 56450, 32343, 41906, 56449, 41903, 41910, 41914, 41911, 41908, 41905, 56451, 56452, 55780, 41915, 41912, 57116, 57113, 32679, 57107, 42312, 32667, 42314, 57104, 57106, 32680, 41917, 32684, 42317, 32676, 57103, 32675, 32686, 57115, 57108, 57114, 32673, 57110, 42321, 42313, 57105, 42319, 42315, 57109, 57112, 32668, 42322, 42309, 42311, 57111, 42682, 57635, 42681, 42323, 42684, 57633, 32955, 42686, 57636, 57634, 42683, 32953, 42679, 57639, 32961, 42680, 42678, 32963, 57637, 42687, 57641, 42685, 42999, 33212, 43004, 43008, 43430, 42998, 43007, 33205, 58078, 43001, 58079, 43012, 58074, 43009, 43002, 58080, 58082, 58071, 58081, 43011, 58075, 58076, 58072, 58073, 43010, 58077, 43005, 58425, 58423, 43257, 33371, 43253, 43254, 58431, 58428, 43255, 58433, 58430, 43259, 58427, 58432, 58424, 58426, 58422, 58435, 58436, 43258, 58429, 58434, 43256, 43427, 58743, 43429, 33493, 33494, 43425, 58742, 32959, 58975, 58740, 58751, 58741, 43426, 58750, 58747, 43428, 58744, 58745, 58748, 58749, 58746, 58972, 43581, 43585, 43579, 58970, 33604, 33601, 43578, 43586, 33600, 43584, 43583, 43576, 58980, 58976, 43577, 58977, 58971, 58973, 58974, 43582, 58979, 58978, 59114, 43687, 33675, 43688, 59109, 59027, 59112, 59110, 43690, 59113, 59111, 43689, 59108, 59240, 59235, 59237, 59238, 59239, 43758, 43759, 59236, 43811, 43810, 59329, 43812, 59330, 43813, 59331, 59407, 43854, 43853, 43856, 59405, 59408, 59404, 43855, 59406, 43886, 43885, 43884, 43883, 59455, 43903, 43904, 59482, 43911, 43920, 59516, 43919, 48641, 48642, 29620, 49592, 38682, 38683, 49597, 49593, 49594, 38681, 49595, 49596, 50557, 39365, 50558, 39364, 30251, 30252, 50559, 50560, 50561, 30253, 39363, 39362, 30868, 54037, 54048, 54034, 54038, 54044, 40066, 40070, 40072, 40068, 54041, 54047, 40074, 40063, 30860, 40076, 40073, 40064, 30861, 40077, 54045, 30859, 54040, 30866, 30857, 40078, 30869, 54035, 54046, 54033, 54042, 54043, 40065, 40069, 40075, 54036, 54039, 40071, 55032, 40753, 40755, 40750, 40748, 31439, 40752, 40758, 40751, 55044, 55039, 40756, 31449, 55041, 40757, 55037, 40754, 55040, 55033, 55026, 55035, 55034, 55036, 55045, 55043, 55028, 55029, 55042, 31446, 31444, 48643, 55030, 40749, 55027, 55790, 31909, 41327, 41338, 55793, 31916, 41336, 55794, 41326, 41330, 55787, 41333, 41340, 41329, 41331, 31917, 55796, 41325, 41332, 31921, 55788, 31924, 41341, 55797, 55792, 41337, 41339, 55789, 41328, 31923, 55795, 41334, 41335, 55791, 31920, 56458, 41342, 56462, 41922, 41928, 41930, 32349, 41933, 41919, 41924, 41923, 41920, 56460, 56455, 32348, 56461, 41921, 41934, 32351, 56470, 41925, 56467, 56459, 41931, 56464, 56465, 56469, 41927, 56456, 41926, 56471, 56453, 56463, 56454, 41932, 56466, 42324, 57118, 42325, 57123, 42329, 42341, 42331, 57131, 57125, 42326, 57129, 57132, 57124, 42343, 42328, 42342, 32692, 42333, 42336, 57121, 57119, 42339, 42335, 57117, 57127, 57133, 42332, 32694, 57130, 42337, 57122, 42338, 57136, 42340, 56472, 57126, 57128, 57134, 42334, 57135, 57120, 32690, 42699, 42691, 57647, 32968, 42705, 57656, 42693, 42709, 32697, 57643, 42690, 32966, 42692, 32977, 32971, 42694, 42688, 42698, 42711, 42700, 32976, 32969, 42701, 42703, 42707, 32970, 42689, 42702, 42697, 42706, 57652, 57648, 57653, 57642, 57644, 42704, 42696, 42695, 42710, 57645, 57651, 57650, 57646, 57657, 57654, 57649, 42708, 56457, 43019, 58086, 43027, 58091, 43018, 43021, 43016, 43026, 43025, 58092, 58090, 58087, 43029, 58098, 58097, 58095, 43017, 43022, 42712, 43015, 43023, 58093, 58089, 43030, 43031, 43020, 58094, 58084, 58099, 58083, 58088, 43013, 58085, 43014, 43273, 43268, 33373, 33382, 43267, 33377, 43274, 43264, 42713, 43275, 43271, 43270, 33380, 58439, 58449, 58447, 58453, 33379, 58448, 58451, 43266, 33378, 58446, 43262, 58445, 43263, 43277, 43028, 58454, 43272, 58452, 58444, 58096, 43269, 58443, 58441, 58438, 58440, 43265, 58760, 58756, 58766, 43446, 58764, 43441, 43436, 33498, 58767, 58771, 43432, 43443, 43437, 43435, 43442, 58761, 43434, 43433, 43451, 43438, 33504, 33497, 58770, 43444, 58765, 58768, 43440, 58442, 43448, 58450, 58769, 43449, 58762, 58753, 58755, 58763, 58758, 58757, 43445, 58759, 58754, 33496, 58772, 58982, 43592, 43594, 43598, 43590, 43450, 43593, 58983, 43595, 43596, 58984, 58985, 58989, 43597, 58988, 58981, 58986, 43588, 43591, 43587, 58987, 33610, 43589, 33608, 43696, 43692, 43695, 59117, 33678, 43693, 43691, 33679, 59115, 43694, 59119, 59116, 59118, 33681, 43765, 59244, 43763, 33726, 43767, 43766, 43762, 43764, 33725, 59243, 43761, 59246, 43768, 59248, 59245, 59241, 59247, 43817, 59333, 59335, 43818, 43815, 43814, 43820, 43819, 43816, 59336, 33759, 59332, 59334, 43857, 59409, 59458, 59411, 59413, 59410, 59414, 43858, 59412, 33779, 43887, 59459, 59460, 43888, 59457, 59461, 59456, 59484, 59483, 43906, 43905, 43912, 59502, 59501, 43921, 59517, 43922, 59527, 43930, 43937, 59538, 30254, 30255, 40079, 54051, 54050, 54049, 40759, 40761, 55047, 55048, 55046, 41935, 55798, 32698, 57137, 42344, 57138, 57659, 42715, 42716, 57660, 42714, 57662, 57661, 33218, 58102, 58101, 43032, 58456, 58455, 33507, 58773, 58774, 43452, 58990, 33612, 43697, 33682, 59249, 43821, 49598, 39367, 54057, 40080, 54056, 54055, 54053, 40081, 54054, 40082, 54058, 54052, 55050, 40762, 41344, 41347, 41345, 31925, 41348, 41346, 55800, 55799, 55803, 55802, 41343, 56477, 41940, 41937, 41936, 56474, 56476, 56473, 41939, 56475, 41938, 42346, 42345, 42348, 32700, 57140, 42347, 57139, 42049, 57664, 32701, 32978, 57141, 57663, 57665, 42717, 33220, 58103, 58104, 33219, 43278, 33383, 43453, 43455, 43454, 58775, 58776, 58991, 33613, 58992, 43700, 43699, 43599, 33683, 33727, 59415, 59462, 43935, 59540, 49600, 49599, 38684, 30258, 50562, 40086, 40085, 30878, 40084, 40083, 54060, 54064, 54059, 30877, 54061, 40087, 54063, 54062, 55054, 55052, 55051, 55056, 31454, 55055, 47802, 40763, 55053, 41349, 41350, 55805, 55806, 55807, 55804, 56479, 41941, 56481, 41942, 41944, 56482, 41943, 56480, 56478, 32707, 32705, 57146, 57148, 57142, 42351, 42349, 57147, 42352, 42350, 57145, 32708, 57144, 57143, 42718, 57672, 57671, 42719, 57669, 32979, 57668, 42721, 42720, 57670, 57667, 57666, 43033, 58106, 43036, 58107, 43035, 58108, 58105, 43034, 43282, 43283, 58457, 43280, 43285, 58464, 58459, 58460, 58465, 58462, 43281, 58458, 58461, 58463, 43458, 33510, 43457, 43459, 43456, 43600, 43602, 43601, 58994, 58777, 33614, 58993, 33728, 59250, 59338, 59337, 43859, 59416, 33795, 43913, 39371, 39369, 39370, 40089, 30879, 40088, 54065, 40766, 55057, 40764, 40765, 41353, 41351, 41352, 41945, 57149, 42353, 57150, 32982, 58109, 43037, 58467, 33511, 58521, 58778, 33512, 43914, 54067, 40767, 40769, 40768, 41355, 41947, 41354, 41948, 41946, 42354, 32713, 32984, 32983, 42723, 42722, 32986, 57673, 57674, 57675, 57676, 43040, 43039, 43038, 58110, 58111, 43286, 33384, 33385, 58470, 58469, 58468, 58779, 43603, 58995, 43604, 59120, 43701, 59508, 30259, 40090, 30880, 55061, 55059, 40771, 40770, 40772, 41359, 55809, 41357, 55808, 41356, 31927, 41358, 55810, 55811, 41950, 41949, 32987, 42724, 42726, 43041, 58113, 58112, 43287, 33515, 43461, 43460, 33514, 59251, 59121, 33729, 43861, 59417, 43860, 50563, 38685, 50565, 50564, 54069, 30884, 30883, 40091, 54070, 54071, 55063, 40775, 40773, 40774, 55062, 55064, 55065, 31929, 55813, 41360, 55812, 41953, 41951, 56483, 42355, 41361, 41954, 42357, 42356, 42358, 42360, 42359, 57152, 57151, 42729, 42730, 57680, 42734, 42732, 42728, 57677, 32993, 32990, 57681, 42733, 32989, 57679, 57678, 58115, 33232, 33230, 43045, 33229, 43048, 58114, 43042, 43046, 43044, 33233, 43043, 33234, 33389, 58116, 58117, 43047, 43288, 33388, 33390, 58477, 58474, 58473, 33387, 58476, 58475, 43289, 58472, 43466, 58782, 43465, 43463, 43464, 43462, 43467, 58780, 43607, 43608, 58998, 33617, 33621, 43606, 58997, 43605, 33620, 33619, 33618, 58781, 58996, 43703, 43704, 43705, 43702, 33688, 59122, 59123, 33689, 43769, 59339, 59418, 33761, 59340, 43822, 33760, 43862, 43863, 59419, 33787, 43889, 59485, 43939, 59551, 56484, 32995, 43049, 33236, 43468, 50566, 54073, 54072, 41363, 55066, 31930, 55814, 55815, 56487, 41957, 56488, 56486, 56485, 32368, 57155, 57156, 55816, 57154, 57683, 57684, 57682, 43050, 58118, 33391, 58479, 58484, 58485, 58481, 58483, 58480, 58478, 58482, 43469, 58783, 43609, 43706, 43770, 33690, 59252, 43823, 59253, 59420, 48644, 55067, 55068, 40776, 56540, 59421, 40777, 41364, 55818, 41958, 56489, 41959, 57158, 42363, 57157, 42361, 42362, 32716, 32996, 57685, 33394, 33237, 58119, 58120, 43290, 58487, 58488, 43292, 33393, 58486, 43291, 58784, 58999, 43610, 59000, 43707, 59254, 43824, 43890, 54074, 40778, 55819, 40779, 41367, 41369, 41370, 41368, 41366, 55821, 41365, 55820, 41371, 31931, 56491, 57163, 41962, 41963, 41961, 41960, 56490, 57161, 42364, 42366, 42365, 57164, 57165, 57160, 57687, 57689, 57688, 42736, 42737, 57162, 57690, 42735, 57686, 43052, 43051, 58121, 43294, 58489, 43295, 43296, 43293, 33395, 58785, 43470, 33520, 58789, 33518, 33521, 58788, 58787, 58786, 43614, 33624, 43612, 43611, 59001, 59125, 59124, 33692, 43708, 43825, 43892, 43891, 59486, 59503, 30886, 55069, 55070, 55823, 55822, 41964, 56493, 56494, 56492, 42367, 42368, 57691, 42738, 42739, 57693, 33240, 43053, 58122, 58123, 43054, 43055, 58490, 43471, 58790, 43613, 59002, 43709, 43710, 59257, 43771, 59256, 59341, 33796, 43915, 31463, 31934, 56495, 32719, 57166, 42542, 32997, 33396, 43712, 43711, 59126, 59422, 41373, 55824, 56498, 32374, 56497, 57167, 42369, 32721, 57168, 57171, 57169, 57170, 57172, 57173, 42370, 57696, 42742, 42741, 33001, 57694, 33003, 57698, 33002, 57699, 57695, 30261, 57697, 58129, 43061, 43058, 58126, 58125, 33243, 43059, 33244, 33242, 58127, 43056, 43062, 58128, 58130, 43060, 58124, 43057, 58491, 33399, 43299, 43298, 43301, 58499, 58498, 43302, 58493, 43303, 33400, 58492, 43297, 58494, 58496, 58497, 58495, 43300, 43474, 43473, 33525, 33529, 33530, 33526, 33527, 43475, 58795, 58793, 33524, 58791, 58792, 58796, 33531, 33628, 43615, 59008, 33629, 59006, 43616, 59128, 33626, 59004, 59007, 59005, 59003, 59009, 43617, 33697, 33693, 59130, 43715, 33699, 33696, 43713, 59132, 33698, 59129, 59131, 59133, 59134, 59127, 43714, 59259, 43773, 59258, 43775, 43772, 43774, 59343, 33763, 59342, 43826, 43828, 43827, 59345, 59346, 59344, 33783, 59425, 43864, 59424, 59423, 59464, 59488, 59489, 43907, 59487, 59490, 43916, 59505, 59504, 43924, 59519, 43923, 59518, 59530, 59529, 43934, 59534, 59541, 43943, 43942, 42371, 57174, 32723, 57701, 57700, 57249, 42743, 58131, 58501, 58500, 58502, 58503, 43476, 43946, 55071, 55825, 56499, 58132, 42744, 33004, 42746, 42745, 33005, 57704, 57702, 57703, 43063, 43065, 58134, 43066, 42373, 43064, 57819, 58133, 57176, 57175, 43865, 59040, 43829, 43477, 59347, 43931, 43067, 59136, 59135, 43777, 43776, 59261, 59260, 43830, 33784, 59506, 33799, 59545, 44953, 44196, 44180, 44625, 44637, 26912, 45466, 46832, 48656, 29061, 49619, 44417, 18003, 18286, 18287, 46839, 57181, 44227, 17856, 44424, 17718, 46095, 26538, 44301, 17986, 55079, 35352, 44203, 44998, 45487, 47728, 20620, 45500, 46115, 28525, 26522, 44311, 17770, 44314, 17868, 45519, 47741, 45028, 45524, 46868, 46869, 20027, 17962, 44244, 44684, 36864, 44332, 35407, 17887, 26755, 44695, 26754, 45053, 19084, 46153, 28003, 46903, 47761, 47763, 47767, 47768, 47770, 29093, 49690, 48713, 49688, 53079, 54118, 17763, 44480, 46174, 46917, 46916, 19537, 28567, 48733, 53101, 56523, 48746, 35597, 44488, 48753, 47805, 44344, 46197, 46198, 46957, 46953, 47816, 48764, 23048, 56542, 44501, 28027, 49727, 23051, 59014, 44744, 46224, 44504, 26527, 36084, 47842, 26528, 18737, 45635, 47856, 47866, 20679, 48804, 49754, 44765, 49766, 47868, 46259, 47873, 54194, 54196, 59015, 36102, 47037, 47036, 19614, 48817, 38788, 44263, 44785, 45134, 45673, 45144, 54210, 43083, 18754, 47061, 36511, 19620, 44806, 35649, 45705, 45699, 27301, 47937, 47933, 21229, 48861, 48855, 49825, 49823, 29752, 54216, 54232, 53200, 22529, 31971, 56595, 18148, 47096, 35515, 45186, 45183, 45730, 46328, 19653, 47115, 47104, 47981, 47955, 53219, 49843, 38833, 53216, 30368, 55202, 27673, 47994, 19677, 46363, 48907, 38854, 45760, 47148, 48027, 49878, 45216, 35855, 28135, 47149, 38233, 26828, 44851, 27049, 18820, 46383, 19235, 27695, 46389, 37035, 20235, 48941, 38244, 20757, 49891, 53285, 54311, 32421, 58188, 44558, 48064, 53291, 58831, 48966, 27704, 48078, 45247, 44569, 45272, 45262, 18849, 45802, 45811, 27358, 27715, 46448, 46425, 46436, 19730, 48102, 48100, 29252, 49014, 49020, 49943, 53344, 53353, 54365, 31550, 57253, 57779, 57771, 45277, 45274, 45817, 28741, 49030, 43894, 22596, 47252, 47254, 47261, 49975, 45843, 48161, 56672, 44279, 45311, 48166, 29875, 55996, 47282, 20334, 45866, 27389, 37104, 48181, 29309, 47299, 57806, 45333, 37116, 45344, 45336, 45900, 45888, 36665, 46542, 46543, 47321, 48217, 54467, 44586, 45345, 20886, 49142, 53482, 55348, 45913, 30519, 53492, 46564, 47352, 29954, 31114, 54495, 50092, 53515, 53513, 54508, 50104, 53530, 56051, 42486, 54532, 55384, 32110, 56059, 18947, 45941, 21411, 53559, 53558, 32811, 59170, 48303, 55403, 55406, 56758, 58871, 48318, 27453, 53587, 50162, 39093, 44928, 27143, 45380, 19411, 37835, 48355, 30603, 31690, 28348, 48377, 20966, 50200, 18245, 44605, 44938, 44939, 45403, 45404, 46001, 45405, 46673, 28376, 47480, 28377, 47461, 47496, 28927, 47499, 47497, 47498, 48436, 50225, 50242, 30638, 53644, 53656, 54649, 55444, 56145, 57871, 33098, 46004, 29468, 55483, 23129, 46704, 28942, 48447, 30077, 30662, 53687, 56181, 56180, 23136, 32836, 31251, 44606, 36783, 49363, 49361, 55524, 43733, 46730, 28424, 50328, 54754, 58312, 44941, 49397, 49409, 23685, 46744, 54796, 54790, 21038, 53803, 46026, 27929, 54818, 31324, 55618, 44614, 28469, 49482, 49485, 55628, 50434, 50430, 31343, 57508, 50439, 54891, 54882, 48599, 50461, 54916, 22741, 41233, 55695, 57026, 32909, 57038, 38014, 38654, 49556, 50493, 31857, 50503, 46804, 49566, 31398, 32305, 50525, 55750, 54008, 57617, 58437, 31922, 56468, 32358, 32695, 57658, 43261, 43260, 55801, 47687, 42727, 49601, 27185, 23232, 40092, 57159, 30260, 58794 }; #define cns11643_forward(index) \ ( cns11643_forward_16[index] | \ (((cns11643_forward_2[(index)/16] >> (((index)&15)*2)) & 3) << 16) ) /* This returns ERROR if the code point doesn't exist. */ long int cns11643_to_unicode(int p, int r, int c) { assert(p >= 0 && p < 7); assert(r >= 0 && r < 94); assert(c >= 0 && c < 94); return cns11643_forward((p*94+r)*94+c); } /* This one returns 1 on success, 0 if the code point doesn't exist. */ int unicode_to_cns11643(long int unicode, int *p, int *r, int *c) { int index, pp, rr, cc; long int uu; int i, j, k; i = -1; j = lenof(cns11643_backward); while (j - i > 1) { k = (i + j) / 2; index = cns11643_backward[k]; uu = cns11643_forward(index); if (unicode > uu) i = k; else if (unicode < uu) j = k; else { cc = index % 94; rr = index / 94; pp = rr / 94; rr %= 94; *p = pp; *r = rr; *c = cc; return 1; } } return 0; } #ifdef TESTMODE #include <stdio.h> int main(void) { int i, p, r, c, pp, rr, cc, index, ret; long int u, uu; u = 0; for (i = 0; i < lenof(cns11643_backward); i++) { index = cns11643_backward[i]; uu = cns11643_forward(index); if (uu <= u) printf("%d out of order [U+%04lX,U+%04lX]\n",index,u,uu); u = uu; } for (p = 0; p < 7; p++) { for (r = 0; r < 94; r++) { for (c = 0; c < 94; c++) { u = cns11643_to_unicode(p, r, c); if (u != ERROR) { ret = unicode_to_cns11643(u, &pp, &rr, &cc); if (!ret) printf("(%d,%d,%d) -> U-%08lx but didn't convert back\n", p, r, c, u); else if (rr != r || cc != c) printf("(%d,%d,%d) -> U-%08lx -> (%d,%d,%d)\n", p, r, c, u, pp, rr, cc); } } } } for (u = 0; u < 0x30000L; u++) { ret = unicode_to_cns11643(u, &p, &r, &c); if (ret) { uu = cns11643_to_unicode(p, r, c); if (uu == ERROR) printf("U-%08lx -> (%d,%d,%d) but didn't convert back\n", u, p, r, c); else if (uu != u) printf("U-%08lx -> (%d,%d,%d) -> U-%08lx\n", u, p, r, c, uu); } } return 0; } #endif ���������������������������������halibut-1.1/charset/confuse.c�����������������������������������������������������������������������0000644�0001753�0001753�00000011160�12444773746�013212� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * libcharset client utility which, given two Unicode code points, * will search for character sets which encode the two code points the * same way. The idea is that if you see some piece of misencoded text * which uses (say) an oe ligature where you expected (as it might be) * a pound sign, you can use this utility to suggest which two * character sets might have been confused with each other to cause * that effect. */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <locale.h> #include "charset.h" #define MAXENCLEN 20 int main(int argc, char **argv) { wchar_t *chars; struct enc { char string[MAXENCLEN]; int len; } *encodings; int nchars; int i, j, k, cs; const char *sep; setlocale(LC_ALL, ""); chars = malloc(argc * sizeof(wchar_t)); if (!chars) { fprintf(stderr, "out of memory\n"); return 1; } nchars = 0; while (--argc) { char *p = *++argv; char *orig = p; char *end; int base = 16, semi_ok = 0; wchar_t ch; if ((p[0] == 'U' || p[0] == 'u') && (p[1] == '-' || p[1] == '+')) { p += 2; } else if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { p += 2; } else if (p[0] == '&' && p[1] == '#') { p += 2; if (p[0] == 'x' || p[0] == 'X') p++; else base = 10; semi_ok = 1; } else if (mbtowc(&ch, p, strlen(p)) == strlen(p)) { chars[nchars++] = ch; continue; } chars[nchars++] = strtoul(p, &end, base); if (!*end || (semi_ok && !strcmp(end, ";"))) continue; else { fprintf(stderr, "unable to parse '%s' as a Unicode code point\n", orig); return 1; } } encodings = malloc(nchars * CS_LIMIT * sizeof(struct enc)); for (cs = 0; cs < CS_LIMIT; cs++) { for (i = 0; i < nchars; i++) { wchar_t inbuf[1]; const wchar_t *inptr; int inlen, error, ret; if (!charset_exists(cs)) { encodings[i*CS_LIMIT+cs].len = 0; continue; } inbuf[0] = chars[i]; inptr = inbuf; inlen = 1; error = 0; ret = charset_from_unicode(&inptr, &inlen, encodings[i*CS_LIMIT+cs].string, MAXENCLEN, cs, NULL, &error); if (error || inlen > 0) encodings[i*CS_LIMIT+cs].len = 0; else encodings[i*CS_LIMIT+cs].len = ret; } } /* * Really simple and slow approach to finding each distinct string * and outputting it. */ for (i = 0; i < nchars*CS_LIMIT; i++) { const char *thisstr = encodings[i].string; int thislen = encodings[i].len; if (thislen == 0) continue; for (j = 0; j < i; j++) if (encodings[j].len == thislen && !memcmp(encodings[j].string, thisstr, thislen)) break; if (j < i) continue; /* not the first instance of this encoding */ /* * See if every character is encoded like this somewhere. */ for (j = 0; j < nchars; j++) { for (cs = 0; cs < CS_LIMIT; cs++) { if (encodings[j*CS_LIMIT+cs].len == thislen && !memcmp(encodings[j*CS_LIMIT+cs].string, thisstr, thislen)) break; } if (cs == CS_LIMIT) break; /* this char not in any cs */ } if (j < nchars) continue; /* some char not in any cs */ /* * Match! Print the encoding, then all charsets. */ for (j = 0; j < nchars; j++) { for (k = 0; k < thislen; k++) printf("%s%02X", k>0?" ":"", (unsigned)(thisstr[k] & 0xFF)); printf(" = "); if (chars[j] >= 0x10000) printf("U-%08X", (unsigned)chars[j]); else printf("U+%04X", (unsigned)chars[j]); printf(" in:"); sep = " "; for (cs = 0; cs < CS_LIMIT; cs++) if (encodings[j*CS_LIMIT+cs].len == thislen && !memcmp(encodings[j*CS_LIMIT+cs].string, thisstr, thislen)) { printf("%s%s", sep, charset_to_localenc(cs)); sep = ", "; } printf("\n"); } printf("\n"); } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/cp949.c�������������������������������������������������������������������������0000644�0001753�0001753�00000004055�12444773746�012425� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * cp949.c - CP949 / KS_C_5601_1987 multibyte encoding */ #ifndef ENUM_CHARSETS #include "charset.h" #include "internal.h" /* * CP949 has no associated data, so `charset' may be ignored. */ static void read_cp949(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { UNUSEDARG(charset); /* * For reading CP949, state->s0 simply contains the single * stored lead byte when we are half way through a double-byte * character, or 0 if we aren't. */ if (state->s0 == 0) { if (input_chr >= 0x81 && input_chr <= 0xFE) { /* * Lead byte. Just store it. */ state->s0 = input_chr; } else { /* * Anything else we pass straight through unchanged. */ emit(emitctx, input_chr); } } else { /* * We have a stored lead byte. We expect a valid followup * byte. */ if ((input_chr >= 0x40 && input_chr <= 0xFF)) { emit(emitctx, cp949_to_unicode(state->s0 - 0x80, input_chr - 0x40)); } else { emit(emitctx, ERROR); } state->s0 = 0; } } /* * CP949 is a stateless multi-byte encoding (in the sense that just * after any character has been completed, the state is always the * same); hence when writing it, there is no need to use the * charset_state. */ static int write_cp949(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { UNUSEDARG(charset); UNUSEDARG(state); if (input_chr == -1) return TRUE; /* stateless; no cleanup required */ if (input_chr < 0x80) { emit(emitctx, input_chr); return TRUE; } else { int r, c; if (unicode_to_cp949(input_chr, &r, &c)) { emit(emitctx, r + 0x80); emit(emitctx, c + 0x40); return TRUE; } else { return FALSE; } } } const charset_spec charset_CS_CP949 = { CS_CP949, read_cp949, write_cp949, NULL }; #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_CP949) #endif /* ENUM_CHARSETS */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/cstable.c�����������������������������������������������������������������������0000644�0001753�0001753�00000005144�12444773746�013172� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * cstable.c - libcharset supporting utility which draws up a map * of the whole Unicode BMP and annotates it with details of which * other character sets each character appears in. * * Note this is not a libcharset _client_; it is part of the * libcharset _package_, using libcharset internals. */ #include <stdio.h> #include <string.h> #include "charset.h" #include "internal.h" #include "sbcsdat.h" #define ENUM_CHARSET(x) extern charset_spec const charset_##x; #include "enum.c" #undef ENUM_CHARSET static charset_spec const *const cs_table[] = { #define ENUM_CHARSET(x) &charset_##x, #include "enum.c" #undef ENUM_CHARSET }; static const char *const cs_names[] = { #define ENUM_CHARSET(x) #x, #include "enum.c" #undef ENUM_CHARSET }; int main(int argc, char **argv) { long int c; int internal_names = FALSE; int verbose = FALSE; while (--argc) { char *p = *++argv; if (!strcmp(p, "-i")) internal_names = TRUE; else if (!strcmp(p, "-v")) verbose = TRUE; } for (c = 0; c < 0x30000; c++) { int i, plane, row, col, chr; char const *sep = ""; printf("U+%04x:", (unsigned)c); /* * Look up in SBCSes. */ for (i = 0; i < lenof(cs_table); i++) if (cs_table[i]->read == read_sbcs && (chr = sbcs_from_unicode(cs_table[i]->data, c)) != ERROR) { printf("%s %s", sep, (internal_names ? cs_names[i] : charset_to_localenc(cs_table[i]->charset))); if (verbose) printf("[%d]", chr); sep = ";"; } /* * Look up individually in MBCS base charsets. The * `internal_names' flag does not affect these, because * MBCS base charsets aren't directly encoded by CS_* * constants. */ if (unicode_to_big5(c, &row, &col)) { printf("%s Big5", sep); if (verbose) printf("[%d,%d]", row, col); sep = ";"; } if (unicode_to_gb2312(c, &row, &col)) { printf("%s GB2312", sep); if (verbose) printf("[%d,%d]", row, col); sep = ";"; } if (unicode_to_jisx0208(c, &row, &col)) { printf("%s JIS X 0208", sep); if (verbose) printf("[%d,%d]", row, col); sep = ";"; } if (unicode_to_ksx1001(c, &row, &col)) { printf("%s KS X 1001", sep); if (verbose) printf("[%d,%d]", row, col); sep = ";"; } if (unicode_to_cp949(c, &row, &col)) { printf("%s CP949", sep); if (verbose) printf("[%d,%d]", row, col); sep = ";"; } if (unicode_to_cns11643(c, &plane, &row, &col)) { printf("%s CNS11643", sep); if (verbose) printf("[%d,%d,%d]", plane, row, col); sep = ";"; } if (!*sep) printf(" unicode-only"); printf("\n"); } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/emacsenc.c����������������������������������������������������������������������0000644�0001753�0001753�00000007273�12444773746�013340� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * emacsenc.c - translate our internal character set codes to and from * GNU Emacs coding system symbols. Derived from running M-x * list-coding-systems in Emacs 21.3. * */ #include <ctype.h> #include "charset.h" #include "internal.h" static const struct { const char *name; int charset; } emacsencs[] = { /* * Where multiple encoding names map to the same encoding id * (such as iso-latin-1 and iso-8859-1), the first is considered * canonical and will be returned when translating the id to a * string. */ { "us-ascii", CS_ASCII }, { "iso-latin-9", CS_ISO8859_15 }, { "iso-8859-15", CS_ISO8859_15 }, { "latin-9", CS_ISO8859_15 }, { "latin-0", CS_ISO8859_15 }, { "iso-latin-1", CS_ISO8859_1 }, { "iso-8859-1", CS_ISO8859_1 }, { "latin-1", CS_ISO8859_1 }, { "iso-latin-2", CS_ISO8859_2 }, { "iso-8859-2", CS_ISO8859_2 }, { "latin-2", CS_ISO8859_2 }, { "iso-latin-3", CS_ISO8859_3 }, { "iso-8859-3", CS_ISO8859_3 }, { "latin-3", CS_ISO8859_3 }, { "iso-latin-4", CS_ISO8859_4 }, { "iso-8859-4", CS_ISO8859_4 }, { "latin-4", CS_ISO8859_4 }, { "cyrillic-iso-8bit", CS_ISO8859_5 }, { "iso-8859-5", CS_ISO8859_5 }, { "greek-iso-8bit", CS_ISO8859_7 }, { "iso-8859-7", CS_ISO8859_7 }, { "hebrew-iso-8bit", CS_ISO8859_8 }, { "iso-8859-8", CS_ISO8859_8 }, { "iso-8859-8-e", CS_ISO8859_8 }, { "iso-8859-8-i", CS_ISO8859_8 }, { "iso-latin-5", CS_ISO8859_9 }, { "iso-8859-9", CS_ISO8859_9 }, { "latin-5", CS_ISO8859_9 }, { "chinese-big5", CS_BIG5 }, { "big5", CS_BIG5 }, { "cn-big5", CS_BIG5 }, { "cp437", CS_CP437 }, { "cp850", CS_CP850 }, { "cp866", CS_CP866 }, { "cp1250", CS_CP1250 }, { "cp1251", CS_CP1251 }, { "cp1253", CS_CP1253 }, { "cp1257", CS_CP1257 }, { "japanese-iso-8bit", CS_EUC_JP }, { "euc-japan-1990", CS_EUC_JP }, { "euc-japan", CS_EUC_JP }, { "euc-jp", CS_EUC_JP }, { "iso-2022-jp", CS_ISO2022_JP }, { "junet", CS_ISO2022_JP }, { "korean-iso-8bit", CS_EUC_KR }, { "euc-kr", CS_EUC_KR }, { "euc-korea", CS_EUC_KR }, { "iso-2022-kr", CS_ISO2022_KR }, { "korean-iso-7bit-lock", CS_ISO2022_KR }, { "mac-roman", CS_MAC_ROMAN }, { "cyrillic-koi8", CS_KOI8_R }, { "koi8-r", CS_KOI8_R }, { "koi8", CS_KOI8_R }, { "japanese-shift-jis", CS_SHIFT_JIS }, { "shift_jis", CS_SHIFT_JIS }, { "sjis", CS_SHIFT_JIS }, { "thai-tis620", CS_ISO8859_11 }, { "th-tis620", CS_ISO8859_11 }, { "tis620", CS_ISO8859_11 }, { "tis-620", CS_ISO8859_11 }, { "mule-utf-16-be", CS_UTF16BE }, { "utf-16-be", CS_UTF16BE }, { "mule-utf-16-le", CS_UTF16LE }, { "utf-16-le", CS_UTF16LE }, { "mule-utf-8", CS_UTF8 }, { "utf-8", CS_UTF8 }, { "vietnamese-viscii", CS_VISCII }, { "viscii", CS_VISCII }, { "iso-latin-8", CS_ISO8859_14 }, { "iso-8859-14", CS_ISO8859_14 }, { "latin-8", CS_ISO8859_14 }, { "compound-text", CS_CTEXT }, { "x-ctext", CS_CTEXT }, { "ctext", CS_CTEXT }, { "chinese-hz", CS_HZ }, { "hz-gb-2312", CS_HZ }, { "hz", CS_HZ }, }; const char *charset_to_emacsenc(int charset) { int i; for (i = 0; i < (int)lenof(emacsencs); i++) if (charset == emacsencs[i].charset) return emacsencs[i].name; return NULL; /* not found */ } int charset_from_emacsenc(const char *name) { int i; for (i = 0; i < (int)lenof(emacsencs); i++) { const char *p, *q; p = name; q = emacsencs[i].name; while (*p || *q) { if (tolower((unsigned char)*p) != tolower((unsigned char)*q)) break; p++; q++; } if (!*p && !*q) return emacsencs[i].charset; } return CS_NONE; /* not found */ } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/enum.c��������������������������������������������������������������������������0000644�0001753�0001753�00000001534�12444773746�012520� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * enum.c - enumerate all charsets defined by the library. * * This file maintains a list of every other source file which * contains ENUM_CHARSET definitions. It #includes each one with * ENUM_CHARSETS defined, which causes those source files to do * nothing at all except call the ENUM_CHARSET macro on each * charset they define. * * This file in turn is included from various other places, with * the ENUM_CHARSET macro defined to various different things. This * allows us to have multiple implementations of the master charset * lookup table (a static one and a dynamic one). */ #define ENUM_CHARSETS #include "sbcsdat.c" #include "utf8.c" #include "utf7.c" #include "utf16.c" #include "euc.c" #include "iso2022.c" #include "iso2022s.c" #include "big5enc.c" #include "shiftjis.c" #include "hz.c" #include "cp949.c" #undef ENUM_CHARSETS ��������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/euc.c���������������������������������������������������������������������������0000644�0001753�0001753�00000016244�12444773746�012334� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * euc.c - routines to handle the various EUC multibyte encodings. */ #ifndef ENUM_CHARSETS #include "charset.h" #include "internal.h" struct euc { int nchars[3]; /* GR, SS2+GR, SS3+GR */ long int (*to_ucs)(unsigned long state); unsigned long (*from_ucs)(long int ucs); }; static void read_euc(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { struct euc const *euc = (struct euc *)charset->data; /* * For EUC input, our state variable divides into three parts: * * - Topmost nibble (bits 31:28) is nonzero if we're * accumulating a multibyte character, and it indicates * which section we're in: 1 for GR chars, 2 for things * beginning with SS2, 3 for things beginning with SS3. * * - Next nibble (bits 27:24) indicates how many bytes of the * character we've accumulated so far. * * - The rest (bits 23:0) are those bytes in full, accumulated * as a large integer (so that seeing A1 A2 A3, in a * hypothetical EUC whose GR encoding is three-byte, runs * our state variable from 0 -> 0x110000A1 -> 0x1200A1A2 -> * 0x13A1A2A3, at which point it gets translated and output * and resets to zero). */ if (state->s0 != 0) { /* * At this point, no matter whether we had an SS2 or SS3 * introducer or not, we _always_ expect a GR character. * Anything else causes us to emit ERROR for an incomplete * character, and then reset to state 0 to process the * character in its own way. */ if (input_chr < 0xA1 || input_chr == 0xFF) { emit(emitctx, ERROR); state->s0 = 0; } else state->s0 = (((state->s0 & 0xFF000000) + 0x01000000) | ((state->s0 & 0x0000FFFF) << 8) | input_chr); } if (state->s0 == 0) { /* * The input character determines which of the four * possible charsets we're going to be in. */ if (input_chr < 0x80) { /* this is always ASCII */ emit(emitctx, input_chr); } else if (input_chr == 0x8E) {/* SS2 means charset 2 */ state->s0 = 0x20000000; } else if (input_chr == 0x8F) {/* SS3 means charset 3 */ state->s0 = 0x30000000; } else if (input_chr < 0xA1 || input_chr == 0xFF) { /* errors */ emit(emitctx, ERROR); } else { /* A1-FE means charset 1 */ state->s0 = 0x11000000 | input_chr; } } /* * Finally, if we have accumulated a complete character, output * it. */ if (state->s0 != 0 && ((state->s0 & 0x0F000000) >> 24) >= (unsigned)euc->nchars[(state->s0 >> 28)-1]) { emit(emitctx, euc->to_ucs(state->s0)); state->s0 = 0; } } /* * All EUCs are stateless multi-byte encodings (in the sense that * just after any character has been completed, the state is always * the same); hence when writing them, there is no need to use the * charset_state. */ static int write_euc(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { struct euc const *euc = (struct euc *)charset->data; unsigned long c; int cset, len; UNUSEDARG(state); if (input_chr == -1) return TRUE; /* stateless; no cleanup required */ /* ASCII is the easy bit, and is always the same. */ if (input_chr < 0x80) { emit(emitctx, input_chr); return TRUE; } c = euc->from_ucs(input_chr); if (!c) { return FALSE; } cset = c >> 28; len = euc->nchars[cset-1]; c &= 0xFFFFFF; if (cset > 1) emit(emitctx, 0x8C + cset); /* SS2/SS3 */ while (len--) emit(emitctx, (c >> (8*len)) & 0xFF); return TRUE; } /* * EUC-CN encodes GB2312 only. */ static long int euc_cn_to_ucs(unsigned long state) { switch (state >> 28) { case 1: return gb2312_to_unicode(((state >> 8) & 0xFF) - 0xA1, ((state ) & 0xFF) - 0xA1); default: return ERROR; } } static unsigned long euc_cn_from_ucs(long int ucs) { int r, c; if (unicode_to_gb2312(ucs, &r, &c)) return 0x10000000 | ((r+0xA1) << 8) | (c+0xA1); else return 0; } static const struct euc euc_cn = { {2,0,0}, euc_cn_to_ucs, euc_cn_from_ucs }; const charset_spec charset_CS_EUC_CN = { CS_EUC_CN, read_euc, write_euc, &euc_cn }; /* * EUC-KR encodes KS X 1001 only. */ static long int euc_kr_to_ucs(unsigned long state) { switch (state >> 28) { case 1: return ksx1001_to_unicode(((state >> 8) & 0xFF) - 0xA1, ((state ) & 0xFF) - 0xA1); default: return ERROR; } } static unsigned long euc_kr_from_ucs(long int ucs) { int r, c; if (unicode_to_ksx1001(ucs, &r, &c)) return 0x10000000 | ((r+0xA1) << 8) | (c+0xA1); else return 0; } static const struct euc euc_kr = { {2,0,0}, euc_kr_to_ucs, euc_kr_from_ucs }; const charset_spec charset_CS_EUC_KR = { CS_EUC_KR, read_euc, write_euc, &euc_kr }; /* * EUC-JP encodes several character sets. */ static long int euc_jp_to_ucs(unsigned long state) { switch (state >> 28) { case 1: return jisx0208_to_unicode(((state >> 8) & 0xFF) - 0xA1, ((state ) & 0xFF) - 0xA1); case 2: /* * This is the top half of JIS X 0201. That means A1-DF map * to FF61-FF9F, and nothing else is valid. */ { int c = state & 0xFF; if (c >= 0xA1 && c <= 0xDF) return c + (0xFF61 - 0xA1); else return ERROR; } /* (no break needed since all control paths have returned) */ case 3: return jisx0212_to_unicode(((state >> 8) & 0xFF) - 0xA1, ((state ) & 0xFF) - 0xA1); default: return ERROR; /* placate optimisers */ } } static unsigned long euc_jp_from_ucs(long int ucs) { int r, c; if (ucs >= 0xFF61 && ucs <= 0xFF9F) return 0x20000000 | (ucs - (0xFF61 - 0xA1)); else if (unicode_to_jisx0208(ucs, &r, &c)) return 0x10000000 | ((r+0xA1) << 8) | (c+0xA1); else if (unicode_to_jisx0212(ucs, &r, &c)) return 0x30000000 | ((r+0xA1) << 8) | (c+0xA1); else return 0; } static const struct euc euc_jp = { {2,1,2}, euc_jp_to_ucs, euc_jp_from_ucs }; const charset_spec charset_CS_EUC_JP = { CS_EUC_JP, read_euc, write_euc, &euc_jp }; /* * EUC-TW encodes CNS 11643 (all planes). */ static long int euc_tw_to_ucs(unsigned long state) { int plane; switch (state >> 28) { case 1: return cns11643_to_unicode(0, ((state >> 8) & 0xFF) - 0xA1, ((state ) & 0xFF) - 0xA1); case 2: plane = ((state >> 8) & 0xFF) - 0xA1; if (plane >= 7) return ERROR; return cns11643_to_unicode(plane, ((state >> 8) & 0xFF) - 0xA1, ((state ) & 0xFF) - 0xA1); default: return ERROR; } } static unsigned long euc_tw_from_ucs(long int ucs) { int p, r, c; if (unicode_to_cns11643(ucs, &p, &r, &c)) { if (p == 0) return 0x10000000 | ((r+0xA1) << 8) | (c+0xA1); else return 0x20000000 | ((p + 0xA1) << 16) | ((r+0xA1) << 8) | (c+0xA1); } else return 0; } static const struct euc euc_tw = { {2,3,0}, euc_tw_to_ucs, euc_tw_from_ucs }; const charset_spec charset_CS_EUC_TW = { CS_EUC_TW, read_euc, write_euc, &euc_tw }; #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_EUC_CN) ENUM_CHARSET(CS_EUC_KR) ENUM_CHARSET(CS_EUC_JP) ENUM_CHARSET(CS_EUC_TW) #endif /* ENUM_CHARSETS */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/fromucs.c�����������������������������������������������������������������������0000644�0001753�0001753�00000003647�12444773746�013241� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * fromucs.c - convert Unicode to other character sets. */ #include "charset.h" #include "internal.h" struct charset_emit_param { char *output; int outlen; int writtenlen; int stopped; }; static void charset_emit(void *ctx, long int output) { struct charset_emit_param *param = (struct charset_emit_param *)ctx; if (param->outlen != 0) { if (param->output) *param->output++ = output; if (param->outlen > 0) param->outlen--; param->writtenlen++; } else { param->stopped = 1; } } int charset_from_unicode(const wchar_t **input, int *inlen, char *output, int outlen, int charset, charset_state *state, int *error) { charset_spec const *spec = charset_find_spec(charset); charset_state localstate = CHARSET_INIT_STATE; struct charset_emit_param param; int locallen; if (!input) { locallen = 1; inlen = &locallen; } param.output = output; param.outlen = outlen; param.writtenlen = 0; param.stopped = 0; if (state) localstate = *state; /* structure copy */ if (error) *error = FALSE; while (*inlen > 0) { int lenbefore = param.writtenlen; int ret; if (input) ret = spec->write(spec, **input, &localstate, charset_emit, ¶m); else ret = spec->write(spec, -1, &localstate, charset_emit, ¶m); if (error && !ret) { /* * We have hit a difficult character, which the user * wants to know about. Leave now. */ *error = TRUE; return lenbefore; } if (param.stopped) { /* * The emit function has _tried_ to output some * characters, but ran up against the end of the * buffer. Leave immediately, and return what happened * _before_ attempting to process this character. */ return lenbefore; } if (state) *state = localstate; /* structure copy */ if (input) (*input)++; (*inlen)--; } return param.writtenlen; } �����������������������������������������������������������������������������������������halibut-1.1/charset/gb2312.c������������������������������������������������������������������������0000644�0001753�0001753�00000443712�12444773746�012464� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * GB2312 implementation for libcharset. (This is the character set * itself, not any particular multibyte encoding of it. Multibyte * encodings of this character set are handled separately.) */ #include <assert.h> #include "charset.h" #include "internal.h" /* * These tables are generated from the GB2312 <-> Unicode character * mapping found at * * http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/GB/GB2312.TXT */ /* * Mapping from GB2312 to Unicode. For these purposes GB2312 is * considered to be a 94x94 square array, with coordinates running * from (0,0) to (93,93). * * Generated by running the following sh+Perl over GB2312.TXT: cat GB2312.TXT | \ perl -ne '$a{hex$1,hex$2}=$3 if /^0x(\S\S)(\S\S)\s+(0x\S+)\s/;' \ -e 'END {for $r (0..93) { $o=" {"; for $c (0..93) {' \ -e '$k=$a{$r+33,$c+33}; $k=" ERROR" unless defined $k;' \ -e '$o .= ", " if $c > 0; (print "$o\n"), $o=" " if length $o > 70;' \ -e '$o .= $k; } print "$o},\n"; }}' */ static const unsigned short gb2312_forward[94][94] = { {0x3000, 0x3001, 0x3002, 0x30FB, 0x02C9, 0x02C7, 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, ERROR, ERROR, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, ERROR, ERROR, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, ERROR, ERROR}, {0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3}, {0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265}, {0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3}, {0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316}, {0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A}, {0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E}, {0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0}, {0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C}, {0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D}, {0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9}, {0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8}, {0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56}, {0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95}, {0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6}, {0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78}, {0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB}, {0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080}, {0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0}, {0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF}, {0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B}, {0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478}, {0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81}, {0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7}, {0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390}, {0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20}, {0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1}, {0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3}, {0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31}, {0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854}, {0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3}, {0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01}, {0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A}, {0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653}, {0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384}, {0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476}, {0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690}, {0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89}, {0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67}, {0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F}, {0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51}, {0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D}, {0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC}, {0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA}, {0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4, 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD, 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD, 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF, 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729, 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B, 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768, 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF, 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9, 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD}, {0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365}, {0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A}, {0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496}, {0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0, 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2, 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB, 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466, 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6, 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC, 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF, 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522, 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5, 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C}, {0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C}, {0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA}, {0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042}, {0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083, 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8, 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4, 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1, 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606, 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35, 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C, 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6, 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE}, {0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1}, {0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3}, {0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9}, {0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9, 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1, 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08, 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C, 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31, 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095, 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1, 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C, 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A, 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C}, {0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9}, {0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B}, {0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0}, {0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD, 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2, 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1, 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112, 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191, 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB}, {0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0}, {0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768}, {0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA}, {0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5, 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F, 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E, 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572, 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14}, {0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619}, {0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883}, {0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2}, {0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB, 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1, 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813, 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42, 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04, 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E, 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B}, {0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164}, {0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC}, {0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB}, {0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F, 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B, 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0, 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22, 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, }; /* * Mapping from Unicode back to GB2312. * * This inverse is done the same way the SBCS ones are done: I * provide a list of GB2312 positions, sorted into ascending * order of their Unicode values. Then we can binary-search through * this list, referring to the above table for each comparison, to * find the coordinates for a given code point. * * Generated by running the following sh+Perl over GB2312.TXT: cat GB2312.TXT | \ perl -ne '$a{$3}=[hex$1,hex$2] if /^0x(\S\S)(\S\S)\s+(0x\S+)\s/;' \ -e 'END {$o=" ";for $k (sort keys %a) { ($r,$c) = @{$a{$k}}; ' \ -e '$o .= $C; $C = ", "; (print "$o\n"), $o=" " if length $o > 70;' \ -e '$o .= sprintf "{%d,%d}", $r-33,$c-33; } print "$o\n"; }' */ static const struct { unsigned char r, c; } gb2312_backward[] = { {0,71}, {0,75}, {0,6}, {0,66}, {0,31}, {0,32}, {7,3}, {7,1}, {7,7}, {7,5}, {7,25}, {7,11}, {7,9}, {7,15}, {7,13}, {0,33}, {7,19}, {7,17}, {7,24}, {7,0}, {7,4}, {7,6}, {7,8}, {7,12}, {7,16}, {7,2}, {7,10}, {7,14}, {7,18}, {7,20}, {7,21}, {7,22}, {7,23}, {0,5}, {0,4}, {5,0}, {5,1}, {5,2}, {5,3}, {5,4}, {5,5}, {5,6}, {5,7}, {5,8}, {5,9}, {5,10}, {5,11}, {5,12}, {5,13}, {5,14}, {5,15}, {5,16}, {5,17}, {5,18}, {5,19}, {5,20}, {5,21}, {5,22}, {5,23}, {5,32}, {5,33}, {5,34}, {5,35}, {5,36}, {5,37}, {5,38}, {5,39}, {5,40}, {5,41}, {5,42}, {5,43}, {5,44}, {5,45}, {5,46}, {5,47}, {5,48}, {5,49}, {5,50}, {5,51}, {5,52}, {5,53}, {5,54}, {5,55}, {6,6}, {6,0}, {6,1}, {6,2}, {6,3}, {6,4}, {6,5}, {6,7}, {6,8}, {6,9}, {6,10}, {6,11}, {6,12}, {6,13}, {6,14}, {6,15}, {6,16}, {6,17}, {6,18}, {6,19}, {6,20}, {6,21}, {6,22}, {6,23}, {6,24}, {6,25}, {6,26}, {6,27}, {6,28}, {6,29}, {6,30}, {6,31}, {6,32}, {6,48}, {6,49}, {6,50}, {6,51}, {6,52}, {6,53}, {6,55}, {6,56}, {6,57}, {6,58}, {6,59}, {6,60}, {6,61}, {6,62}, {6,63}, {6,64}, {6,65}, {6,66}, {6,67}, {6,68}, {6,69}, {6,70}, {6,71}, {6,72}, {6,73}, {6,74}, {6,75}, {6,76}, {6,77}, {6,78}, {6,79}, {6,80}, {6,54}, {0,9}, {0,11}, {0,13}, {0,14}, {0,15}, {0,16}, {0,12}, {0,74}, {0,67}, {0,68}, {0,88}, {0,69}, {0,76}, {1,80}, {1,81}, {1,82}, {1,83}, {1,84}, {1,85}, {1,86}, {1,87}, {1,88}, {1,89}, {1,90}, {1,91}, {0,90}, {0,91}, {0,89}, {0,92}, {0,41}, {0,38}, {0,37}, {0,43}, {0,55}, {0,61}, {0,46}, {0,45}, {0,35}, {0,36}, {0,40}, {0,39}, {0,49}, {0,50}, {0,63}, {0,62}, {0,34}, {0,42}, {0,54}, {0,53}, {0,52}, {0,56}, {0,51}, {0,59}, {0,60}, {0,57}, {0,58}, {0,48}, {0,44}, {0,47}, {1,56}, {1,57}, {1,58}, {1,59}, {1,60}, {1,61}, {1,62}, {1,63}, {1,64}, {1,65}, {1,36}, {1,37}, {1,38}, {1,39}, {1,40}, {1,41}, {1,42}, {1,43}, {1,44}, {1,45}, {1,46}, {1,47}, {1,48}, {1,49}, {1,50}, {1,51}, {1,52}, {1,53}, {1,54}, {1,55}, {1,16}, {1,17}, {1,18}, {1,19}, {1,20}, {1,21}, {1,22}, {1,23}, {1,24}, {1,25}, {1,26}, {1,27}, {1,28}, {1,29}, {1,30}, {1,31}, {1,32}, {1,33}, {1,34}, {1,35}, {8,3}, {8,4}, {8,5}, {8,6}, {8,7}, {8,8}, {8,9}, {8,10}, {8,11}, {8,12}, {8,13}, {8,14}, {8,15}, {8,16}, {8,17}, {8,18}, {8,19}, {8,20}, {8,21}, {8,22}, {8,23}, {8,24}, {8,25}, {8,26}, {8,27}, {8,28}, {8,29}, {8,30}, {8,31}, {8,32}, {8,33}, {8,34}, {8,35}, {8,36}, {8,37}, {8,38}, {8,39}, {8,40}, {8,41}, {8,42}, {8,43}, {8,44}, {8,45}, {8,46}, {8,47}, {8,48}, {8,49}, {8,50}, {8,51}, {8,52}, {8,53}, {8,54}, {8,55}, {8,56}, {8,57}, {8,58}, {8,59}, {8,60}, {8,61}, {8,62}, {8,63}, {8,64}, {8,65}, {8,66}, {8,67}, {8,68}, {8,69}, {8,70}, {8,71}, {8,72}, {8,73}, {8,74}, {8,75}, {8,76}, {8,77}, {8,78}, {0,85}, {0,84}, {0,87}, {0,86}, {0,83}, {0,82}, {0,79}, {0,81}, {0,80}, {0,78}, {0,77}, {0,65}, {0,64}, {0,0}, {0,1}, {0,2}, {0,7}, {0,8}, {0,19}, {0,20}, {0,21}, {0,22}, {0,23}, {0,24}, {0,25}, {0,26}, {0,29}, {0,30}, {0,93}, {0,17}, {0,18}, {0,27}, {0,28}, {3,0}, {3,1}, {3,2}, {3,3}, {3,4}, {3,5}, {3,6}, {3,7}, {3,8}, {3,9}, {3,10}, {3,11}, {3,12}, {3,13}, {3,14}, {3,15}, {3,16}, {3,17}, {3,18}, {3,19}, {3,20}, {3,21}, {3,22}, {3,23}, {3,24}, {3,25}, {3,26}, {3,27}, {3,28}, {3,29}, {3,30}, {3,31}, {3,32}, {3,33}, {3,34}, {3,35}, {3,36}, {3,37}, {3,38}, {3,39}, {3,40}, {3,41}, {3,42}, {3,43}, {3,44}, {3,45}, {3,46}, {3,47}, {3,48}, {3,49}, {3,50}, {3,51}, {3,52}, {3,53}, {3,54}, {3,55}, {3,56}, {3,57}, {3,58}, {3,59}, {3,60}, {3,61}, {3,62}, {3,63}, {3,64}, {3,65}, {3,66}, {3,67}, {3,68}, {3,69}, {3,70}, {3,71}, {3,72}, {3,73}, {3,74}, {3,75}, {3,76}, {3,77}, {3,78}, {3,79}, {3,80}, {3,81}, {3,82}, {4,0}, {4,1}, {4,2}, {4,3}, {4,4}, {4,5}, {4,6}, {4,7}, {4,8}, {4,9}, {4,10}, {4,11}, {4,12}, {4,13}, {4,14}, {4,15}, {4,16}, {4,17}, {4,18}, {4,19}, {4,20}, {4,21}, {4,22}, {4,23}, {4,24}, {4,25}, {4,26}, {4,27}, {4,28}, {4,29}, {4,30}, {4,31}, {4,32}, {4,33}, {4,34}, {4,35}, {4,36}, {4,37}, {4,38}, {4,39}, {4,40}, {4,41}, {4,42}, {4,43}, {4,44}, {4,45}, {4,46}, {4,47}, {4,48}, {4,49}, {4,50}, {4,51}, {4,52}, {4,53}, {4,54}, {4,55}, {4,56}, {4,57}, {4,58}, {4,59}, {4,60}, {4,61}, {4,62}, {4,63}, {4,64}, {4,65}, {4,66}, {4,67}, {4,68}, {4,69}, {4,70}, {4,71}, {4,72}, {4,73}, {4,74}, {4,75}, {4,76}, {4,77}, {4,78}, {4,79}, {4,80}, {4,81}, {4,82}, {4,83}, {4,84}, {4,85}, {0,3}, {7,36}, {7,37}, {7,38}, {7,39}, {7,40}, {7,41}, {7,42}, {7,43}, {7,44}, {7,45}, {7,46}, {7,47}, {7,48}, {7,49}, {7,50}, {7,51}, {7,52}, {7,53}, {7,54}, {7,55}, {7,56}, {7,57}, {7,58}, {7,59}, {7,60}, {7,61}, {7,62}, {7,63}, {7,64}, {7,65}, {7,66}, {7,67}, {7,68}, {7,69}, {7,70}, {7,71}, {7,72}, {1,68}, {1,69}, {1,70}, {1,71}, {1,72}, {1,73}, {1,74}, {1,75}, {1,76}, {1,77}, {49,26}, {21,0}, {37,62}, {44,81}, {52,40}, {39,92}, {40,46}, {46,33}, {55,1}, {17,26}, {50,74}, {55,3}, {18,82}, {54,7}, {38,49}, {55,6}, {41,31}, {38,79}, {16,90}, {49,20}, {19,51}, {21,10}, {42,30}, {55,8}, {21,9}, {32,28}, {48,46}, {40,4}, {55,12}, {23,85}, {48,29}, {66,59}, {53,47}, {22,64}, {19,13}, {32,56}, {55,27}, {44,71}, {20,3}, {45,9}, {53,86}, {31,85}, {29,56}, {55,14}, {35,42}, {29,34}, {55,16}, {34,19}, {49,68}, {53,13}, {45,57}, {52,6}, {25,84}, {22,5}, {31,53}, {37,24}, {36,49}, {38,38}, {24,51}, {18,42}, {49,49}, {55,30}, {29,36}, {37,81}, {49,17}, {46,15}, {46,70}, {41,72}, {55,31}, {33,81}, {33,49}, {39,72}, {38,11}, {32,42}, {50,71}, {52,88}, {41,33}, {21,93}, {55,0}, {50,57}, {30,86}, {51,37}, {26,4}, {55,32}, {45,68}, {29,13}, {55,7}, {48,38}, {47,8}, {55,28}, {56,78}, {44,85}, {30,25}, {28,26}, {25,4}, {49,63}, {17,89}, {25,63}, {35,21}, {46,76}, {29,8}, {44,3}, {32,32}, {38,54}, {56,80}, {56,83}, {39,42}, {55,72}, {49,57}, {41,17}, {39,41}, {55,75}, {55,73}, {55,37}, {28,85}, {37,44}, {18,79}, {55,74}, {28,80}, {28,72}, {39,51}, {19,50}, {33,55}, {17,53}, {54,47}, {41,42}, {42,90}, {52,43}, {23,21}, {46,40}, {56,57}, {55,79}, {38,9}, {55,77}, {19,89}, {32,77}, {49,51}, {55,76}, {49,38}, {55,78}, {34,38}, {48,85}, {53,56}, {55,81}, {55,84}, {27,93}, {27,58}, {39,45}, {22,60}, {22,33}, {37,82}, {55,87}, {49,32}, {45,72}, {27,30}, {22,91}, {22,4}, {47,60}, {53,57}, {50,36}, {26,78}, {26,64}, {55,80}, {40,0}, {45,15}, {19,10}, {55,82}, {40,42}, {55,85}, {33,54}, {55,86}, {45,16}, {55,88}, {17,13}, {24,31}, {56,2}, {15,72}, {32,69}, {40,75}, {42,36}, {42,37}, {56,3}, {20,71}, {20,10}, {45,26}, {20,44}, {54,0}, {54,83}, {50,50}, {43,68}, {25,45}, {56,1}, {56,59}, {50,63}, {55,92}, {22,79}, {54,86}, {55,93}, {55,89}, {56,0}, {35,66}, {50,21}, {55,83}, {56,60}, {55,90}, {36,68}, {31,47}, {48,79}, {15,58}, {27,48}, {56,5}, {56,4}, {56,11}, {56,13}, {56,10}, {41,24}, {56,8}, {53,21}, {18,61}, {56,7}, {31,92}, {41,43}, {56,9}, {56,6}, {56,15}, {21,16}, {24,8}, {49,31}, {46,31}, {33,33}, {28,35}, {52,75}, {17,63}, {38,39}, {30,74}, {56,12}, {56,14}, {45,73}, {25,77}, {38,53}, {16,66}, {19,56}, {21,76}, {56,19}, {30,0}, {56,61}, {38,45}, {31,93}, {56,23}, {42,54}, {22,92}, {56,20}, {56,22}, {16,2}, {50,64}, {56,24}, {47,36}, {56,21}, {56,16}, {56,17}, {32,8}, {56,18}, {27,82}, {47,61}, {23,8}, {29,66}, {56,28}, {56,25}, {15,18}, {56,33}, {56,35}, {16,21}, {56,30}, {20,24}, {29,82}, {43,39}, {25,81}, {49,47}, {56,34}, {28,71}, {18,10}, {56,36}, {29,74}, {56,37}, {56,26}, {35,62}, {56,29}, {56,32}, {56,31}, {52,13}, {53,20}, {38,66}, {56,39}, {27,56}, {56,41}, {56,27}, {56,42}, {37,10}, {56,40}, {54,85}, {44,2}, {28,0}, {56,43}, {36,27}, {44,20}, {56,44}, {56,38}, {18,4}, {30,93}, {23,20}, {31,91}, {15,87}, {19,85}, {56,45}, {56,46}, {19,1}, {56,47}, {19,62}, {15,32}, {56,48}, {40,20}, {46,80}, {56,49}, {32,36}, {56,53}, {40,13}, {56,52}, {56,51}, {56,54}, {42,58}, {28,8}, {37,6}, {56,50}, {56,55}, {56,56}, {39,68}, {31,59}, {21,88}, {55,2}, {51,41}, {51,9}, {47,53}, {18,67}, {52,54}, {46,39}, {24,65}, {30,42}, {34,65}, {21,49}, {44,34}, {56,77}, {56,79}, {20,18}, {21,20}, {29,3}, {39,74}, {39,10}, {15,42}, {24,10}, {32,88}, {56,65}, {31,27}, {24,17}, {24,55}, {47,42}, {16,87}, {37,67}, {29,62}, {20,67}, {54,39}, {48,87}, {27,69}, {41,61}, {27,28}, {56,69}, {55,70}, {35,57}, {23,51}, {39,28}, {17,64}, {51,56}, {34,15}, {34,64}, {57,1}, {39,62}, {47,19}, {29,91}, {36,8}, {24,57}, {57,2}, {51,8}, {57,3}, {56,90}, {21,11}, {22,74}, {16,88}, {56,91}, {18,68}, {29,85}, {30,85}, {49,16}, {31,67}, {21,18}, {56,93}, {56,92}, {29,26}, {37,63}, {54,27}, {57,0}, {32,24}, {20,81}, {32,71}, {27,84}, {19,52}, {32,60}, {35,92}, {27,23}, {22,17}, {22,78}, {56,75}, {37,29}, {30,12}, {26,42}, {20,41}, {58,40}, {47,54}, {44,24}, {15,27}, {18,85}, {26,86}, {58,41}, {25,14}, {51,67}, {20,21}, {20,82}, {55,53}, {39,47}, {22,53}, {38,47}, {55,54}, {30,14}, {58,26}, {55,55}, {47,43}, {26,13}, {74,29}, {32,47}, {32,84}, {51,81}, {23,52}, {19,19}, {18,84}, {40,29}, {36,47}, {36,56}, {31,90}, {16,79}, {55,56}, {24,45}, {20,28}, {55,57}, {53,37}, {42,1}, {39,14}, {40,17}, {19,43}, {30,43}, {24,83}, {55,58}, {55,59}, {21,70}, {27,32}, {43,73}, {46,86}, {55,60}, {38,15}, {24,47}, {28,2}, {43,61}, {37,41}, {55,63}, {55,61}, {55,62}, {15,93}, {29,70}, {41,2}, {27,83}, {23,16}, {23,77}, {55,65}, {28,42}, {55,67}, {55,66}, {36,91}, {55,68}, {55,69}, {32,5}, {39,15}, {15,75}, {24,5}, {27,50}, {45,80}, {58,28}, {32,50}, {21,14}, {53,89}, {36,11}, {28,56}, {58,29}, {58,30}, {31,87}, {29,1}, {31,44}, {58,31}, {41,37}, {17,9}, {50,33}, {34,66}, {48,10}, {58,33}, {31,52}, {58,34}, {30,16}, {35,27}, {38,57}, {58,35}, {56,71}, {40,54}, {24,19}, {45,79}, {51,39}, {15,91}, {19,49}, {47,56}, {56,72}, {61,42}, {56,74}, {55,15}, {26,14}, {16,16}, {18,54}, {55,45}, {51,48}, {28,18}, {30,78}, {46,26}, {55,47}, {22,42}, {55,48}, {37,4}, {38,87}, {49,28}, {55,49}, {35,67}, {41,13}, {38,6}, {55,5}, {40,92}, {45,70}, {26,59}, {15,74}, {26,9}, {47,12}, {16,15}, {54,67}, {54,30}, {20,4}, {33,83}, {35,46}, {17,8}, {17,22}, {16,68}, {62,17}, {52,27}, {30,7}, {33,11}, {55,52}, {33,16}, {55,51}, {45,51}, {57,63}, {45,31}, {55,19}, {34,13}, {50,0}, {45,2}, {27,19}, {39,19}, {33,48}, {29,76}, {47,21}, {57,64}, {38,67}, {18,6}, {21,81}, {43,91}, {31,89}, {31,86}, {48,24}, {48,64}, {55,38}, {17,61}, {31,68}, {25,80}, {55,39}, {51,12}, {46,64}, {55,40}, {55,41}, {46,34}, {18,87}, {29,38}, {55,42}, {58,43}, {39,4}, {46,55}, {39,93}, {17,45}, {50,53}, {17,69}, {27,15}, {50,48}, {42,10}, {22,19}, {22,1}, {41,68}, {39,0}, {41,59}, {16,67}, {47,79}, {36,48}, {58,36}, {20,93}, {30,57}, {24,36}, {29,67}, {32,76}, {62,21}, {62,20}, {53,26}, {28,47}, {52,56}, {15,39}, {21,2}, {30,40}, {43,7}, {62,18}, {41,22}, {50,49}, {55,46}, {49,21}, {25,36}, {42,29}, {43,29}, {62,22}, {20,79}, {62,19}, {50,84}, {18,51}, {23,86}, {62,25}, {25,46}, {27,9}, {20,84}, {44,11}, {34,90}, {25,82}, {31,83}, {44,33}, {46,81}, {62,23}, {46,36}, {33,31}, {62,24}, {33,79}, {29,92}, {32,62}, {44,43}, {49,86}, {22,44}, {62,32}, {62,35}, {22,80}, {15,40}, {21,53}, {22,51}, {25,11}, {43,92}, {30,51}, {42,16}, {37,83}, {53,7}, {62,36}, {45,65}, {18,18}, {45,91}, {19,20}, {45,38}, {25,79}, {45,64}, {48,28}, {62,31}, {19,83}, {18,41}, {23,69}, {62,26}, {35,36}, {62,27}, {62,28}, {62,29}, {36,26}, {62,30}, {62,33}, {51,16}, {62,34}, {38,25}, {45,55}, {35,55}, {62,41}, {62,46}, {53,59}, {62,40}, {62,57}, {45,21}, {25,38}, {62,45}, {62,39}, {36,61}, {40,74}, {25,83}, {34,91}, {29,54}, {62,37}, {62,44}, {36,55}, {52,5}, {25,44}, {29,43}, {50,28}, {23,31}, {53,67}, {62,38}, {24,29}, {30,6}, {32,91}, {62,42}, {62,43}, {62,47}, {62,58}, {62,68}, {62,54}, {62,53}, {54,40}, {62,66}, {62,67}, {68,74}, {49,6}, {62,49}, {30,8}, {51,58}, {30,39}, {62,51}, {46,43}, {62,60}, {48,41}, {62,61}, {15,6}, {37,22}, {62,50}, {25,68}, {21,62}, {44,58}, {24,93}, {51,52}, {62,62}, {46,75}, {15,4}, {62,70}, {62,48}, {48,37}, {62,52}, {62,55}, {62,56}, {62,59}, {26,8}, {62,63}, {62,64}, {62,65}, {62,69}, {62,71}, {50,19}, {23,70}, {36,21}, {62,73}, {40,57}, {32,7}, {35,35}, {30,61}, {46,87}, {52,59}, {62,77}, {17,23}, {25,62}, {62,75}, {58,32}, {48,67}, {42,83}, {19,28}, {15,5}, {62,80}, {43,37}, {62,81}, {62,76}, {62,72}, {62,74}, {62,78}, {62,79}, {26,28}, {62,82}, {62,83}, {26,2}, {41,58}, {45,7}, {63,6}, {18,9}, {63,5}, {63,0}, {62,93}, {44,56}, {62,91}, {62,89}, {30,47}, {54,35}, {40,43}, {62,87}, {15,0}, {62,92}, {62,90}, {63,1}, {63,7}, {22,39}, {37,0}, {40,21}, {31,17}, {62,84}, {36,29}, {55,35}, {62,88}, {35,85}, {63,2}, {63,3}, {63,4}, {47,4}, {63,19}, {43,67}, {63,16}, {30,5}, {63,14}, {45,24}, {63,10}, {40,37}, {31,13}, {63,13}, {25,76}, {25,15}, {63,8}, {62,85}, {63,18}, {63,23}, {19,12}, {63,24}, {46,17}, {25,39}, {63,15}, {47,89}, {63,11}, {51,90}, {62,86}, {36,70}, {63,12}, {50,86}, {63,21}, {63,22}, {63,35}, {47,64}, {63,27}, {63,40}, {63,41}, {63,29}, {63,9}, {40,3}, {63,32}, {63,17}, {41,39}, {63,34}, {63,20}, {45,42}, {42,34}, {63,44}, {63,37}, {63,33}, {63,42}, {63,25}, {63,30}, {63,31}, {63,36}, {63,38}, {63,39}, {63,43}, {63,26}, {42,51}, {63,52}, {63,53}, {63,49}, {63,47}, {27,45}, {63,48}, {23,33}, {55,36}, {47,73}, {33,78}, {63,46}, {63,28}, {63,51}, {63,50}, {63,54}, {63,59}, {63,55}, {53,85}, {18,15}, {54,75}, {42,26}, {63,57}, {45,90}, {25,56}, {63,64}, {63,60}, {49,12}, {63,65}, {63,58}, {63,56}, {63,62}, {63,63}, {63,61}, {63,67}, {37,86}, {55,11}, {51,74}, {63,69}, {41,40}, {63,68}, {23,32}, {63,70}, {63,71}, {63,72}, {63,66}, {25,30}, {43,70}, {63,73}, {46,88}, {63,74}, {39,33}, {28,31}, {35,49}, {63,75}, {63,76}, {38,83}, {42,35}, {63,77}, {26,55}, {55,21}, {49,81}, {63,78}, {44,36}, {21,57}, {63,80}, {51,15}, {31,6}, {19,48}, {45,6}, {63,79}, {63,81}, {24,43}, {24,89}, {44,27}, {63,82}, {37,51}, {63,83}, {51,17}, {39,5}, {63,85}, {63,84}, {63,86}, {44,32}, {41,4}, {51,57}, {58,54}, {58,56}, {58,55}, {24,70}, {58,59}, {58,60}, {20,55}, {58,57}, {58,58}, {18,0}, {58,62}, {26,87}, {53,22}, {58,63}, {29,88}, {22,26}, {58,47}, {43,13}, {30,17}, {26,20}, {54,87}, {30,50}, {30,72}, {27,64}, {43,18}, {58,61}, {15,50}, {45,74}, {22,55}, {54,24}, {37,33}, {31,3}, {43,24}, {58,70}, {58,64}, {37,25}, {58,66}, {58,71}, {36,86}, {58,73}, {58,72}, {30,31}, {58,69}, {58,68}, {19,24}, {31,11}, {33,1}, {58,65}, {58,67}, {47,44}, {58,76}, {31,60}, {58,81}, {21,65}, {58,82}, {58,49}, {24,23}, {51,10}, {58,75}, {30,48}, {58,79}, {58,48}, {20,69}, {58,74}, {30,68}, {58,77}, {58,80}, {58,88}, {24,0}, {15,2}, {33,80}, {18,38}, {58,78}, {58,87}, {37,49}, {58,83}, {58,84}, {58,86}, {58,85}, {58,93}, {50,81}, {17,25}, {58,92}, {59,3}, {58,90}, {58,89}, {58,91}, {36,63}, {26,88}, {59,2}, {59,4}, {43,34}, {21,48}, {60,31}, {59,0}, {59,1}, {38,20}, {21,72}, {59,6}, {59,5}, {59,8}, {16,3}, {20,43}, {30,15}, {48,62}, {21,33}, {59,7}, {42,89}, {74,82}, {42,59}, {42,93}, {43,32}, {39,90}, {59,9}, {43,77}, {59,10}, {58,50}, {59,14}, {59,11}, {29,18}, {41,90}, {59,12}, {40,41}, {35,24}, {38,28}, {59,13}, {51,85}, {47,69}, {35,10}, {21,52}, {58,51}, {16,57}, {58,52}, {58,53}, {25,29}, {39,31}, {41,30}, {39,40}, {54,18}, {40,88}, {30,38}, {25,87}, {49,27}, {65,25}, {19,5}, {16,23}, {23,19}, {46,35}, {56,70}, {46,5}, {44,65}, {56,76}, {21,63}, {49,24}, {24,26}, {65,24}, {65,22}, {19,82}, {43,75}, {43,10}, {22,81}, {55,17}, {48,74}, {25,26}, {41,6}, {44,22}, {49,35}, {30,67}, {27,47}, {21,64}, {61,36}, {61,37}, {58,27}, {48,56}, {37,69}, {35,45}, {22,77}, {22,59}, {30,91}, {54,63}, {37,84}, {16,27}, {61,39}, {28,16}, {43,54}, {61,41}, {61,40}, {20,75}, {40,60}, {15,33}, {36,13}, {36,10}, {35,43}, {27,72}, {42,92}, {25,34}, {68,88}, {39,70}, {68,89}, {44,92}, {54,16}, {23,29}, {33,71}, {39,48}, {68,90}, {21,41}, {27,42}, {48,92}, {69,0}, {34,77}, {69,3}, {68,93}, {69,4}, {44,54}, {22,32}, {68,91}, {68,92}, {69,2}, {35,60}, {69,7}, {69,6}, {34,34}, {37,61}, {69,9}, {35,22}, {69,1}, {41,27}, {28,66}, {24,34}, {69,5}, {47,52}, {45,14}, {69,8}, {69,15}, {49,5}, {28,9}, {69,12}, {69,14}, {31,48}, {49,43}, {27,6}, {69,16}, {49,85}, {54,42}, {44,93}, {44,61}, {33,5}, {69,10}, {69,11}, {28,30}, {69,13}, {69,18}, {69,17}, {69,21}, {69,23}, {35,78}, {35,39}, {29,73}, {40,78}, {69,22}, {21,79}, {34,67}, {50,72}, {69,19}, {69,20}, {39,1}, {69,28}, {69,24}, {37,36}, {44,80}, {69,26}, {69,27}, {26,72}, {69,29}, {69,25}, {31,22}, {50,3}, {69,30}, {40,83}, {69,34}, {69,35}, {47,85}, {34,28}, {34,35}, {69,33}, {69,32}, {69,38}, {46,16}, {74,83}, {69,41}, {69,36}, {27,61}, {40,8}, {27,20}, {46,50}, {69,39}, {69,40}, {69,45}, {69,47}, {69,48}, {69,42}, {20,52}, {69,43}, {69,46}, {35,58}, {69,37}, {69,44}, {69,49}, {69,51}, {69,50}, {69,52}, {56,87}, {69,53}, {69,54}, {54,50}, {69,60}, {69,61}, {30,54}, {51,47}, {54,53}, {19,69}, {42,78}, {69,57}, {55,34}, {54,45}, {47,1}, {34,46}, {69,62}, {27,29}, {24,33}, {69,58}, {48,6}, {25,1}, {33,46}, {55,10}, {41,74}, {68,77}, {69,59}, {22,84}, {39,69}, {35,84}, {68,17}, {35,93}, {42,91}, {68,18}, {52,11}, {50,77}, {41,55}, {15,17}, {42,45}, {44,73}, {25,73}, {68,20}, {68,19}, {54,57}, {24,56}, {53,69}, {21,7}, {44,79}, {49,42}, {16,5}, {41,20}, {18,71}, {40,82}, {30,44}, {47,90}, {41,49}, {68,21}, {26,33}, {46,59}, {24,11}, {51,54}, {25,5}, {48,70}, {46,91}, {27,49}, {68,22}, {39,60}, {30,76}, {16,85}, {42,61}, {27,36}, {27,35}, {49,89}, {34,59}, {30,59}, {23,26}, {34,33}, {25,13}, {51,1}, {38,61}, {35,14}, {17,75}, {24,48}, {68,26}, {32,39}, {52,14}, {68,27}, {68,29}, {19,70}, {21,51}, {42,33}, {48,15}, {20,27}, {41,56}, {22,65}, {40,67}, {28,10}, {45,29}, {54,79}, {47,0}, {40,56}, {21,90}, {69,55}, {27,65}, {18,29}, {40,47}, {69,56}, {18,1}, {61,43}, {50,39}, {61,44}, {49,1}, {61,45}, {29,44}, {61,46}, {41,11}, {49,91}, {18,62}, {68,73}, {35,64}, {29,0}, {45,17}, {35,81}, {29,53}, {37,7}, {17,66}, {29,50}, {38,91}, {43,74}, {28,75}, {45,60}, {41,25}, {37,32}, {68,75}, {47,27}, {52,24}, {68,76}, {41,83}, {44,31}, {33,36}, {68,78}, {33,35}, {68,79}, {68,87}, {44,44}, {40,28}, {49,56}, {64,7}, {50,75}, {42,73}, {37,80}, {64,11}, {64,6}, {64,8}, {64,9}, {64,14}, {17,76}, {64,10}, {23,57}, {64,12}, {64,13}, {64,15}, {20,25}, {64,16}, {64,18}, {64,23}, {48,49}, {64,21}, {64,20}, {32,74}, {64,22}, {51,31}, {64,17}, {64,25}, {15,21}, {64,19}, {30,88}, {64,24}, {64,26}, {64,29}, {64,27}, {53,36}, {46,30}, {64,28}, {64,30}, {33,44}, {21,74}, {50,87}, {38,44}, {22,68}, {29,93}, {64,31}, {64,32}, {64,38}, {18,70}, {37,72}, {19,61}, {48,33}, {64,39}, {64,37}, {64,36}, {64,34}, {64,33}, {16,31}, {52,23}, {64,35}, {64,42}, {64,43}, {64,41}, {78,89}, {64,50}, {64,49}, {38,21}, {64,40}, {64,45}, {64,47}, {64,51}, {64,48}, {64,44}, {64,46}, {64,52}, {64,53}, {64,54}, {64,55}, {64,57}, {64,58}, {45,0}, {70,60}, {19,7}, {53,60}, {48,17}, {18,17}, {24,3}, {54,82}, {38,40}, {29,61}, {24,13}, {45,54}, {17,77}, {58,46}, {27,25}, {49,48}, {42,39}, {15,44}, {46,78}, {56,66}, {28,76}, {16,49}, {41,47}, {17,27}, {42,6}, {22,10}, {41,5}, {46,2}, {63,87}, {52,41}, {63,90}, {63,89}, {36,32}, {43,90}, {32,16}, {63,88}, {53,66}, {17,14}, {53,35}, {20,58}, {19,87}, {53,0}, {46,14}, {15,78}, {63,91}, {64,0}, {18,2}, {63,92}, {63,93}, {34,16}, {34,60}, {64,1}, {22,88}, {26,46}, {64,2}, {35,26}, {64,3}, {64,4}, {64,5}, {19,16}, {23,40}, {37,28}, {35,73}, {17,1}, {47,49}, {70,58}, {26,34}, {50,54}, {50,35}, {24,66}, {65,46}, {54,14}, {38,75}, {16,50}, {19,17}, {65,48}, {47,81}, {33,13}, {65,47}, {30,65}, {50,5}, {20,54}, {65,49}, {20,73}, {34,76}, {23,92}, {23,13}, {36,50}, {22,46}, {65,51}, {65,50}, {21,39}, {54,88}, {44,4}, {65,55}, {65,53}, {41,91}, {30,20}, {50,24}, {65,52}, {65,54}, {32,13}, {31,39}, {65,58}, {65,57}, {31,9}, {32,45}, {65,59}, {65,60}, {65,61}, {58,39}, {48,50}, {44,1}, {28,7}, {61,34}, {55,4}, {30,9}, {58,44}, {49,75}, {37,89}, {36,9}, {61,35}, {16,54}, {62,13}, {41,28}, {62,16}, {24,12}, {49,92}, {23,4}, {25,74}, {18,57}, {20,59}, {52,36}, {34,53}, {46,49}, {26,0}, {68,82}, {68,81}, {68,83}, {44,67}, {39,84}, {20,14}, {38,30}, {68,85}, {75,15}, {68,69}, {24,72}, {20,16}, {33,27}, {68,71}, {68,70}, {68,72}, {49,44}, {64,73}, {47,45}, {44,13}, {48,68}, {17,41}, {16,74}, {16,81}, {36,76}, {52,34}, {50,15}, {64,59}, {64,60}, {49,58}, {18,24}, {16,42}, {44,88}, {52,86}, {64,61}, {29,21}, {19,92}, {64,62}, {25,59}, {64,63}, {26,17}, {33,40}, {64,64}, {47,75}, {44,28}, {64,65}, {20,34}, {36,38}, {64,66}, {64,67}, {50,88}, {64,68}, {48,12}, {64,69}, {45,1}, {64,70}, {20,33}, {64,71}, {26,52}, {47,35}, {65,63}, {16,55}, {49,67}, {65,64}, {27,40}, {39,43}, {65,66}, {75,93}, {75,92}, {62,14}, {65,65}, {53,29}, {44,91}, {34,5}, {66,34}, {53,49}, {65,70}, {65,71}, {50,38}, {65,75}, {30,75}, {65,76}, {65,68}, {18,31}, {35,77}, {65,77}, {47,34}, {25,85}, {65,72}, {22,61}, {26,18}, {43,11}, {42,42}, {65,67}, {65,69}, {65,73}, {65,74}, {65,86}, {65,83}, {51,84}, {65,82}, {36,12}, {52,89}, {36,33}, {17,31}, {65,78}, {65,81}, {32,14}, {42,27}, {20,0}, {65,88}, {27,16}, {65,80}, {47,51}, {51,24}, {65,84}, {24,53}, {65,85}, {38,50}, {65,79}, {54,59}, {76,0}, {65,87}, {76,4}, {65,93}, {41,48}, {32,20}, {26,47}, {30,53}, {25,66}, {42,0}, {76,5}, {76,2}, {76,1}, {26,53}, {76,6}, {47,83}, {76,3}, {25,61}, {21,86}, {66,0}, {21,17}, {43,80}, {24,6}, {46,1}, {38,0}, {30,49}, {21,80}, {65,89}, {65,90}, {65,92}, {65,91}, {35,52}, {66,1}, {50,32}, {66,6}, {38,35}, {46,3}, {66,8}, {25,22}, {66,7}, {26,57}, {66,2}, {66,3}, {66,9}, {66,5}, {45,81}, {50,37}, {26,27}, {51,34}, {35,89}, {76,7}, {47,91}, {66,4}, {34,84}, {66,12}, {16,14}, {66,17}, {27,33}, {66,11}, {20,30}, {38,72}, {66,15}, {29,9}, {44,78}, {26,82}, {43,71}, {66,14}, {66,16}, {46,6}, {66,13}, {45,8}, {26,60}, {20,74}, {29,68}, {17,49}, {18,44}, {16,24}, {66,10}, {17,48}, {20,11}, {24,62}, {21,71}, {46,74}, {66,22}, {26,43}, {39,38}, {47,41}, {66,23}, {18,77}, {76,8}, {50,89}, {50,67}, {76,9}, {66,24}, {49,65}, {66,20}, {50,61}, {23,47}, {66,18}, {66,21}, {22,62}, {66,19}, {31,1}, {66,25}, {51,23}, {19,39}, {66,26}, {26,36}, {40,86}, {40,68}, {35,28}, {76,10}, {33,92}, {26,58}, {30,13}, {45,30}, {66,27}, {30,21}, {16,78}, {51,86}, {66,29}, {76,12}, {66,30}, {25,8}, {76,11}, {66,28}, {66,31}, {25,21}, {21,13}, {47,23}, {15,34}, {76,13}, {76,14}, {31,32}, {66,32}, {36,18}, {66,33}, {59,17}, {76,15}, {23,73}, {45,75}, {73,6}, {47,70}, {41,88}, {39,53}, {46,22}, {18,40}, {45,49}, {28,67}, {66,61}, {26,81}, {73,7}, {52,28}, {37,60}, {73,8}, {73,9}, {73,11}, {73,10}, {73,13}, {73,12}, {28,55}, {73,14}, {33,29}, {19,32}, {19,86}, {26,6}, {75,69}, {75,68}, {22,30}, {42,88}, {16,65}, {75,70}, {40,39}, {75,71}, {75,72}, {41,53}, {61,47}, {17,36}, {51,89}, {37,42}, {15,38}, {19,81}, {39,50}, {44,47}, {30,23}, {30,58}, {38,3}, {53,19}, {31,8}, {61,48}, {40,7}, {48,78}, {36,3}, {15,70}, {18,21}, {39,36}, {15,65}, {22,85}, {36,89}, {21,82}, {52,49}, {18,47}, {27,27}, {18,12}, {29,80}, {15,48}, {49,53}, {41,66}, {54,4}, {44,21}, {21,21}, {30,24}, {52,58}, {23,6}, {36,54}, {61,49}, {30,56}, {33,52}, {38,31}, {26,3}, {16,7}, {36,73}, {36,90}, {43,6}, {16,6}, {20,53}, {35,7}, {61,50}, {48,25}, {18,72}, {34,81}, {22,86}, {53,83}, {20,2}, {17,79}, {35,19}, {35,72}, {31,12}, {61,51}, {15,71}, {36,35}, {32,63}, {24,52}, {29,59}, {44,55}, {15,45}, {44,46}, {61,53}, {29,47}, {54,29}, {61,52}, {52,47}, {15,60}, {35,65}, {33,2}, {27,79}, {50,20}, {31,24}, {36,0}, {17,5}, {51,80}, {31,7}, {41,34}, {61,54}, {52,91}, {24,15}, {39,12}, {42,8}, {61,56}, {30,28}, {37,19}, {54,6}, {41,15}, {35,34}, {18,53}, {24,49}, {53,23}, {73,91}, {15,19}, {30,69}, {43,83}, {44,57}, {53,30}, {33,45}, {45,45}, {43,1}, {47,13}, {35,50}, {20,17}, {61,55}, {52,84}, {27,22}, {26,50}, {15,3}, {36,17}, {19,75}, {52,80}, {73,92}, {61,57}, {44,5}, {44,75}, {45,69}, {61,59}, {44,16}, {31,5}, {54,28}, {61,58}, {15,37}, {25,19}, {40,50}, {35,82}, {29,71}, {17,21}, {31,43}, {42,79}, {27,80}, {26,26}, {20,22}, {36,84}, {61,69}, {61,66}, {29,60}, {61,62}, {19,22}, {28,60}, {61,63}, {35,76}, {46,37}, {20,63}, {21,61}, {41,57}, {20,83}, {61,68}, {52,37}, {61,64}, {43,44}, {37,93}, {36,36}, {49,19}, {29,81}, {33,50}, {43,28}, {18,23}, {28,50}, {30,55}, {44,37}, {48,57}, {19,74}, {61,67}, {61,60}, {61,70}, {73,93}, {33,15}, {61,65}, {53,31}, {20,6}, {17,83}, {61,71}, {61,81}, {61,76}, {61,80}, {39,63}, {54,64}, {61,78}, {34,71}, {43,64}, {17,68}, {49,29}, {61,77}, {61,74}, {45,52}, {19,6}, {30,10}, {29,29}, {28,49}, {61,72}, {51,13}, {61,61}, {61,73}, {31,30}, {61,75}, {17,82}, {23,72}, {33,6}, {28,32}, {61,84}, {61,87}, {17,10}, {19,3}, {19,73}, {40,5}, {61,85}, {42,48}, {23,66}, {61,86}, {61,89}, {61,88}, {43,33}, {15,64}, {19,77}, {68,25}, {47,14}, {17,74}, {74,0}, {61,83}, {40,66}, {61,82}, {15,57}, {49,0}, {16,86}, {43,14}, {61,79}, {42,3}, {52,9}, {61,90}, {19,60}, {35,5}, {61,92}, {34,93}, {35,0}, {62,0}, {32,43}, {61,91}, {29,78}, {37,17}, {18,36}, {39,85}, {42,25}, {61,93}, {62,3}, {54,17}, {18,22}, {32,34}, {38,42}, {17,4}, {19,72}, {54,10}, {35,75}, {62,1}, {62,2}, {62,4}, {25,18}, {62,5}, {31,61}, {40,34}, {17,56}, {38,69}, {62,6}, {38,59}, {62,7}, {74,1}, {42,50}, {62,9}, {62,8}, {17,32}, {36,41}, {62,10}, {51,59}, {39,32}, {62,11}, {29,79}, {62,12}, {53,6}, {73,22}, {74,21}, {41,52}, {55,91}, {23,35}, {24,4}, {22,36}, {52,93}, {24,41}, {47,6}, {83,44}, {20,47}, {34,83}, {29,39}, {74,22}, {15,28}, {28,43}, {32,17}, {16,53}, {18,7}, {23,49}, {40,1}, {21,55}, {74,23}, {29,19}, {41,92}, {38,34}, {52,90}, {22,82}, {45,35}, {52,10}, {16,82}, {75,18}, {15,62}, {75,20}, {21,22}, {32,46}, {84,89}, {47,16}, {52,68}, {45,50}, {28,78}, {18,65}, {23,10}, {52,21}, {76,28}, {21,46}, {42,24}, {47,33}, {22,28}, {75,21}, {41,8}, {36,51}, {75,24}, {75,23}, {33,34}, {75,22}, {47,92}, {75,25}, {75,26}, {54,68}, {75,27}, {75,28}, {37,75}, {45,61}, {27,39}, {39,52}, {20,8}, {29,40}, {53,27}, {51,70}, {48,13}, {47,80}, {73,23}, {73,24}, {73,25}, {25,20}, {41,16}, {30,84}, {44,89}, {73,31}, {15,25}, {73,29}, {31,4}, {73,26}, {17,92}, {34,86}, {26,71}, {49,54}, {45,83}, {73,30}, {73,27}, {73,34}, {47,38}, {50,18}, {19,25}, {34,32}, {54,81}, {52,48}, {41,38}, {73,36}, {73,35}, {73,38}, {73,37}, {53,70}, {46,51}, {73,42}, {26,45}, {28,89}, {40,45}, {73,43}, {40,24}, {46,93}, {73,41}, {51,45}, {73,44}, {73,46}, {44,76}, {73,40}, {73,45}, {45,77}, {26,61}, {18,30}, {37,52}, {29,15}, {45,89}, {38,70}, {29,6}, {73,47}, {53,38}, {32,31}, {51,60}, {73,48}, {46,29}, {73,49}, {41,77}, {36,14}, {15,20}, {73,51}, {73,50}, {83,62}, {35,25}, {16,8}, {68,62}, {73,52}, {41,78}, {73,53}, {73,54}, {37,55}, {73,55}, {73,56}, {51,26}, {38,89}, {49,22}, {23,91}, {73,33}, {17,59}, {33,91}, {51,87}, {43,69}, {54,77}, {51,33}, {50,47}, {74,34}, {36,82}, {22,93}, {74,51}, {42,22}, {74,61}, {31,41}, {44,90}, {18,14}, {37,57}, {74,91}, {35,29}, {45,19}, {35,8}, {16,29}, {51,92}, {41,84}, {53,75}, {37,50}, {21,67}, {26,89}, {47,63}, {40,16}, {51,50}, {39,7}, {23,42}, {71,29}, {40,27}, {71,26}, {31,77}, {47,50}, {17,35}, {19,68}, {71,27}, {52,39}, {21,36}, {71,28}, {41,87}, {23,59}, {43,84}, {31,19}, {48,77}, {71,30}, {71,33}, {25,27}, {16,12}, {28,59}, {73,28}, {71,34}, {71,37}, {71,42}, {71,43}, {42,40}, {15,68}, {27,10}, {24,24}, {71,32}, {44,86}, {71,41}, {45,85}, {52,76}, {32,53}, {71,35}, {34,21}, {24,90}, {53,5}, {71,39}, {41,63}, {51,69}, {71,31}, {71,36}, {71,38}, {38,24}, {22,66}, {71,40}, {30,60}, {71,49}, {71,54}, {71,52}, {27,59}, {27,46}, {71,58}, {71,61}, {71,57}, {16,89}, {15,55}, {35,18}, {23,43}, {37,65}, {39,29}, {39,64}, {71,46}, {71,51}, {71,53}, {24,80}, {71,55}, {54,84}, {35,90}, {71,59}, {17,72}, {71,48}, {27,76}, {30,33}, {71,44}, {53,88}, {32,87}, {17,80}, {71,62}, {41,32}, {71,56}, {52,3}, {16,73}, {52,26}, {71,45}, {71,47}, {21,15}, {71,50}, {71,60}, {31,23}, {41,86}, {42,7}, {37,59}, {31,84}, {71,72}, {47,2}, {71,81}, {53,73}, {71,63}, {71,64}, {48,88}, {25,42}, {23,88}, {23,80}, {51,51}, {71,78}, {71,77}, {71,75}, {24,79}, {43,49}, {71,69}, {45,5}, {30,81}, {15,23}, {71,80}, {71,79}, {54,31}, {71,67}, {44,8}, {40,2}, {26,23}, {28,58}, {71,73}, {71,65}, {71,66}, {71,68}, {20,20}, {71,70}, {38,36}, {71,74}, {71,76}, {28,15}, {54,13}, {71,87}, {71,84}, {44,15}, {71,85}, {32,25}, {71,71}, {34,22}, {15,79}, {71,83}, {71,86}, {24,2}, {40,49}, {34,45}, {45,63}, {31,69}, {42,82}, {43,60}, {47,20}, {41,64}, {71,82}, {27,75}, {71,88}, {34,61}, {37,68}, {24,86}, {15,83}, {54,55}, {27,11}, {36,78}, {43,35}, {72,5}, {40,12}, {72,1}, {31,65}, {30,34}, {71,93}, {24,54}, {71,90}, {72,3}, {49,45}, {72,2}, {53,17}, {54,20}, {72,6}, {28,22}, {71,91}, {71,92}, {72,0}, {44,53}, {49,11}, {72,17}, {72,8}, {19,9}, {19,26}, {72,10}, {47,7}, {72,4}, {18,93}, {72,11}, {31,66}, {72,9}, {72,24}, {72,23}, {72,13}, {71,89}, {72,7}, {30,11}, {72,16}, {72,25}, {33,4}, {72,14}, {23,36}, {72,12}, {50,59}, {72,19}, {72,20}, {72,22}, {72,38}, {31,37}, {72,36}, {72,15}, {72,26}, {15,80}, {72,27}, {52,4}, {72,29}, {72,30}, {72,32}, {32,80}, {39,21}, {72,28}, {72,33}, {72,34}, {72,18}, {72,21}, {26,16}, {72,31}, {27,86}, {72,35}, {72,37}, {72,41}, {72,45}, {17,58}, {72,39}, {22,13}, {72,42}, {72,43}, {52,32}, {35,2}, {72,55}, {25,64}, {72,40}, {50,2}, {72,51}, {72,54}, {72,47}, {72,46}, {38,32}, {72,49}, {72,56}, {18,39}, {72,50}, {46,79}, {72,44}, {18,86}, {72,53}, {72,57}, {43,19}, {46,12}, {72,52}, {72,59}, {72,58}, {72,61}, {72,48}, {72,60}, {72,62}, {34,41}, {38,22}, {19,45}, {26,21}, {47,31}, {75,2}, {36,22}, {50,90}, {75,3}, {75,4}, {37,58}, {30,77}, {75,5}, {75,6}, {47,9}, {38,23}, {23,71}, {75,7}, {53,24}, {52,92}, {19,42}, {17,28}, {45,67}, {37,70}, {44,64}, {19,84}, {42,31}, {27,62}, {72,65}, {72,66}, {48,73}, {72,68}, {19,88}, {72,67}, {48,18}, {41,65}, {17,47}, {72,71}, {72,69}, {72,70}, {53,18}, {72,72}, {72,73}, {72,74}, {72,75}, {75,14}, {36,24}, {21,45}, {49,82}, {20,77}, {26,56}, {75,16}, {49,66}, {45,66}, {35,23}, {34,30}, {21,29}, {55,24}, {16,39}, {16,46}, {16,48}, {36,93}, {16,47}, {34,10}, {52,16}, {74,3}, {25,32}, {43,25}, {74,4}, {74,6}, {74,7}, {74,5}, {74,8}, {74,10}, {74,9}, {74,11}, {41,46}, {55,20}, {34,80}, {34,4}, {37,87}, {74,12}, {35,41}, {74,13}, {74,14}, {74,15}, {22,52}, {22,89}, {74,16}, {38,65}, {74,18}, {25,3}, {48,84}, {15,16}, {74,17}, {74,19}, {20,9}, {33,39}, {38,71}, {74,20}, {42,13}, {66,62}, {50,31}, {56,58}, {44,0}, {53,12}, {38,82}, {56,63}, {26,66}, {25,25}, {66,65}, {46,10}, {66,63}, {40,38}, {25,24}, {48,19}, {66,64}, {39,73}, {24,14}, {28,12}, {18,55}, {45,58}, {43,31}, {66,71}, {66,72}, {44,83}, {43,12}, {27,18}, {66,73}, {66,74}, {47,57}, {37,90}, {22,57}, {38,62}, {49,41}, {45,53}, {66,67}, {66,75}, {40,81}, {18,32}, {66,70}, {37,66}, {66,68}, {76,18}, {66,69}, {40,18}, {36,69}, {24,20}, {34,26}, {66,66}, {36,28}, {32,3}, {33,56}, {17,54}, {66,76}, {26,5}, {35,12}, {66,79}, {29,57}, {66,90}, {66,84}, {25,50}, {22,47}, {50,44}, {53,45}, {52,50}, {24,32}, {52,19}, {48,55}, {47,24}, {38,85}, {39,9}, {17,19}, {34,57}, {66,77}, {66,91}, {66,78}, {22,7}, {66,86}, {66,83}, {22,25}, {36,1}, {66,85}, {36,60}, {17,7}, {37,91}, {35,63}, {54,1}, {31,64}, {66,88}, {66,89}, {66,92}, {43,8}, {66,82}, {50,29}, {16,34}, {76,19}, {66,80}, {66,81}, {66,87}, {47,25}, {37,34}, {51,82}, {66,93}, {28,63}, {67,6}, {67,5}, {48,82}, {67,2}, {67,8}, {39,86}, {46,19}, {67,7}, {67,13}, {33,68}, {21,19}, {28,81}, {67,1}, {25,72}, {67,9}, {67,11}, {21,92}, {53,61}, {67,17}, {67,12}, {67,0}, {26,77}, {44,60}, {38,1}, {36,40}, {32,86}, {67,3}, {38,18}, {28,11}, {28,28}, {67,4}, {54,38}, {17,65}, {67,10}, {27,34}, {67,14}, {26,74}, {67,15}, {36,7}, {67,16}, {52,66}, {30,2}, {67,25}, {67,22}, {67,26}, {67,28}, {37,53}, {25,37}, {31,42}, {23,0}, {67,19}, {51,0}, {25,2}, {28,93}, {67,27}, {44,30}, {35,88}, {46,90}, {40,69}, {50,30}, {46,48}, {67,18}, {67,23}, {67,24}, {43,72}, {43,45}, {31,51}, {67,20}, {32,15}, {67,21}, {45,47}, {26,32}, {20,50}, {39,82}, {28,6}, {52,38}, {40,11}, {23,1}, {67,41}, {67,43}, {48,35}, {49,25}, {25,12}, {25,51}, {67,34}, {20,76}, {54,44}, {67,31}, {46,92}, {67,30}, {32,59}, {43,41}, {41,70}, {35,54}, {43,51}, {67,39}, {67,38}, {67,32}, {67,35}, {20,12}, {50,56}, {67,37}, {49,88}, {19,66}, {26,19}, {40,77}, {19,29}, {26,75}, {48,44}, {43,76}, {76,20}, {38,68}, {51,7}, {67,42}, {54,52}, {67,33}, {28,4}, {67,36}, {50,69}, {67,40}, {40,87}, {67,29}, {50,68}, {38,93}, {21,40}, {51,91}, {17,18}, {67,54}, {45,33}, {67,44}, {45,27}, {23,58}, {67,53}, {30,41}, {50,45}, {34,75}, {36,39}, {67,55}, {44,35}, {67,46}, {67,51}, {67,52}, {25,93}, {46,69}, {52,30}, {67,49}, {67,47}, {67,45}, {44,68}, {41,9}, {31,2}, {28,5}, {67,50}, {23,39}, {67,70}, {51,19}, {67,58}, {32,78}, {67,72}, {49,70}, {67,62}, {67,63}, {46,9}, {42,60}, {67,57}, {67,48}, {67,68}, {39,59}, {67,66}, {35,70}, {67,65}, {67,64}, {18,91}, {67,71}, {20,64}, {54,43}, {67,69}, {26,11}, {54,49}, {43,46}, {74,87}, {67,67}, {24,85}, {53,44}, {67,56}, {67,59}, {33,89}, {67,61}, {33,42}, {31,35}, {33,47}, {16,84}, {43,17}, {20,45}, {67,78}, {37,14}, {37,64}, {67,84}, {33,8}, {31,75}, {48,60}, {67,77}, {35,13}, {67,76}, {67,85}, {67,83}, {33,93}, {67,60}, {67,79}, {41,93}, {52,35}, {67,80}, {48,89}, {67,74}, {67,75}, {67,81}, {45,10}, {36,42}, {38,16}, {33,25}, {67,73}, {32,41}, {43,21}, {18,16}, {67,90}, {67,82}, {67,89}, {67,92}, {67,91}, {18,45}, {18,25}, {67,86}, {67,88}, {67,87}, {36,75}, {31,28}, {51,71}, {68,1}, {15,35}, {68,3}, {68,2}, {27,3}, {68,4}, {68,0}, {67,93}, {16,83}, {68,7}, {68,8}, {68,5}, {68,6}, {68,9}, {37,56}, {68,10}, {68,12}, {68,11}, {68,14}, {68,13}, {24,63}, {68,15}, {68,16}, {26,79}, {75,64}, {34,79}, {20,37}, {26,49}, {32,72}, {51,77}, {29,35}, {54,37}, {51,53}, {17,50}, {75,29}, {73,32}, {33,14}, {19,21}, {48,54}, {18,19}, {39,17}, {30,26}, {75,31}, {53,42}, {75,30}, {75,32}, {75,36}, {29,69}, {43,30}, {36,57}, {29,27}, {75,37}, {16,93}, {75,35}, {52,7}, {20,66}, {75,33}, {32,21}, {18,66}, {75,34}, {42,23}, {31,34}, {43,93}, {32,49}, {75,39}, {25,69}, {31,50}, {53,81}, {48,43}, {30,29}, {22,18}, {40,52}, {75,38}, {26,65}, {43,43}, {28,92}, {39,39}, {46,8}, {44,72}, {36,74}, {22,72}, {48,40}, {25,23}, {75,40}, {75,41}, {26,31}, {75,42}, {75,65}, {16,25}, {22,56}, {28,24}, {75,43}, {48,69}, {75,44}, {39,26}, {75,48}, {75,50}, {26,44}, {27,68}, {75,46}, {40,22}, {34,25}, {75,66}, {52,52}, {75,47}, {53,82}, {75,49}, {75,45}, {75,51}, {75,52}, {40,30}, {46,7}, {47,59}, {48,11}, {39,58}, {75,53}, {45,84}, {41,75}, {75,57}, {75,56}, {15,29}, {75,54}, {75,55}, {75,67}, {39,27}, {32,38}, {75,59}, {48,63}, {75,58}, {51,78}, {75,60}, {58,37}, {75,61}, {16,11}, {75,62}, {75,63}, {54,5}, {36,31}, {74,27}, {15,13}, {29,83}, {23,23}, {49,14}, {15,53}, {20,88}, {55,18}, {42,11}, {66,60}, {37,11}, {15,69}, {36,37}, {74,24}, {74,25}, {74,26}, {48,31}, {36,2}, {73,81}, {35,17}, {35,20}, {31,45}, {73,82}, {35,32}, {45,78}, {73,79}, {73,83}, {40,91}, {38,2}, {43,55}, {45,93}, {73,84}, {73,85}, {46,11}, {31,70}, {73,86}, {21,30}, {73,87}, {73,88}, {73,89}, {73,90}, {73,80}, {39,13}, {64,74}, {22,23}, {64,75}, {64,76}, {54,19}, {64,77}, {64,78}, {50,43}, {64,80}, {30,80}, {64,79}, {20,49}, {16,22}, {64,82}, {64,81}, {25,91}, {64,83}, {24,22}, {29,48}, {35,91}, {25,60}, {28,37}, {64,84}, {64,86}, {21,31}, {46,32}, {41,7}, {64,85}, {52,87}, {50,91}, {64,87}, {64,91}, {64,88}, {64,89}, {31,73}, {64,93}, {65,0}, {31,38}, {64,90}, {64,92}, {65,4}, {32,51}, {65,2}, {65,7}, {17,93}, {65,1}, {34,44}, {17,33}, {65,6}, {65,5}, {65,3}, {65,8}, {65,10}, {47,40}, {53,76}, {34,7}, {65,11}, {46,54}, {65,13}, {25,78}, {72,63}, {65,12}, {65,9}, {26,10}, {51,18}, {65,15}, {65,14}, {72,64}, {65,16}, {65,17}, {65,18}, {43,0}, {65,19}, {65,20}, {47,93}, {33,41}, {50,80}, {44,84}, {70,63}, {70,64}, {29,32}, {33,73}, {70,67}, {70,66}, {44,69}, {34,20}, {70,65}, {26,22}, {46,53}, {32,64}, {70,72}, {70,71}, {70,83}, {17,2}, {70,73}, {70,69}, {70,75}, {70,74}, {40,25}, {52,67}, {70,68}, {22,8}, {70,70}, {70,77}, {70,82}, {53,72}, {70,76}, {70,81}, {70,80}, {15,63}, {70,84}, {38,81}, {31,36}, {31,76}, {32,79}, {70,79}, {70,85}, {42,85}, {71,1}, {71,0}, {54,32}, {70,89}, {70,88}, {70,90}, {70,86}, {70,93}, {70,92}, {70,91}, {32,52}, {38,56}, {36,92}, {36,34}, {38,76}, {71,2}, {71,5}, {71,4}, {71,6}, {25,86}, {70,87}, {71,3}, {39,79}, {40,9}, {71,8}, {24,68}, {48,93}, {71,7}, {71,9}, {71,12}, {71,13}, {32,6}, {71,14}, {71,15}, {71,11}, {71,19}, {71,10}, {71,16}, {71,20}, {71,17}, {71,18}, {71,22}, {71,21}, {24,46}, {79,11}, {79,12}, {37,15}, {15,73}, {39,30}, {44,62}, {45,44}, {73,16}, {73,17}, {37,30}, {19,40}, {73,18}, {52,70}, {60,88}, {73,19}, {73,20}, {73,21}, {23,41}, {62,15}, {40,84}, {43,79}, {40,89}, {40,90}, {50,34}, {42,5}, {23,5}, {79,13}, {16,33}, {68,23}, {43,78}, {50,40}, {27,54}, {40,73}, {20,70}, {35,47}, {20,72}, {77,13}, {26,12}, {70,61}, {77,14}, {18,8}, {77,17}, {77,16}, {28,70}, {77,15}, {45,22}, {36,46}, {32,83}, {58,45}, {77,18}, {47,82}, {33,51}, {37,71}, {22,11}, {77,19}, {18,74}, {26,90}, {77,20}, {70,59}, {77,21}, {28,13}, {80,65}, {41,71}, {49,40}, {79,57}, {79,58}, {79,59}, {32,37}, {23,76}, {29,45}, {79,61}, {36,16}, {79,60}, {48,80}, {79,63}, {15,43}, {28,73}, {49,62}, {79,62}, {19,14}, {22,71}, {79,69}, {79,68}, {37,2}, {79,64}, {79,65}, {19,34}, {79,66}, {52,77}, {43,58}, {29,49}, {27,17}, {79,71}, {79,70}, {79,67}, {17,0}, {53,1}, {50,23}, {29,22}, {39,11}, {79,73}, {48,86}, {53,43}, {25,58}, {79,72}, {21,26}, {44,19}, {37,5}, {32,0}, {79,74}, {79,77}, {79,76}, {79,79}, {79,75}, {26,29}, {79,78}, {43,20}, {79,81}, {18,52}, {16,51}, {79,82}, {79,83}, {79,85}, {19,64}, {79,80}, {79,86}, {79,89}, {79,87}, {79,84}, {79,92}, {79,88}, {79,91}, {79,93}, {80,0}, {45,32}, {80,3}, {80,2}, {32,85}, {79,90}, {41,60}, {19,80}, {16,80}, {43,16}, {80,5}, {80,6}, {80,11}, {52,45}, {80,8}, {39,18}, {80,1}, {80,10}, {80,7}, {80,4}, {80,9}, {15,8}, {80,12}, {80,14}, {80,16}, {80,15}, {80,13}, {48,1}, {80,17}, {80,18}, {24,78}, {20,38}, {15,54}, {15,56}, {51,76}, {20,35}, {28,51}, {26,41}, {79,6}, {23,61}, {79,7}, {15,7}, {79,8}, {44,77}, {79,9}, {79,10}, {37,3}, {53,68}, {80,67}, {80,68}, {34,82}, {50,58}, {53,48}, {36,71}, {50,14}, {49,69}, {77,32}, {15,26}, {52,20}, {48,45}, {27,63}, {25,47}, {30,87}, {23,38}, {20,32}, {36,43}, {41,1}, {34,42}, {77,33}, {35,30}, {21,1}, {76,75}, {34,3}, {53,16}, {46,63}, {76,78}, {36,45}, {21,59}, {41,0}, {76,76}, {76,79}, {76,80}, {34,27}, {30,19}, {76,77}, {76,83}, {76,81}, {52,69}, {34,62}, {76,82}, {76,85}, {52,2}, {48,2}, {76,84}, {34,47}, {76,86}, {30,83}, {29,75}, {76,87}, {43,86}, {48,58}, {54,36}, {52,85}, {76,91}, {76,90}, {76,88}, {76,89}, {76,92}, {29,5}, {42,14}, {77,0}, {21,28}, {77,1}, {35,31}, {76,93}, {28,61}, {17,38}, {21,34}, {77,4}, {55,25}, {77,2}, {77,5}, {34,72}, {18,81}, {77,6}, {77,3}, {46,24}, {77,7}, {33,86}, {77,8}, {77,9}, {61,10}, {37,18}, {38,37}, {53,84}, {20,40}, {42,17}, {77,10}, {44,10}, {77,11}, {52,15}, {77,12}, {85,35}, {58,38}, {19,2}, {34,11}, {80,69}, {41,23}, {49,50}, {53,9}, {78,81}, {29,55}, {28,34}, {78,82}, {21,43}, {15,10}, {41,14}, {76,21}, {76,22}, {45,88}, {22,14}, {30,82}, {76,23}, {33,74}, {40,15}, {76,24}, {37,85}, {30,18}, {76,27}, {36,87}, {48,47}, {54,8}, {76,25}, {76,26}, {48,65}, {76,30}, {76,31}, {76,35}, {76,39}, {76,37}, {76,45}, {52,71}, {76,40}, {76,38}, {76,29}, {36,72}, {37,37}, {40,72}, {51,49}, {76,32}, {76,33}, {76,34}, {76,36}, {31,88}, {19,0}, {24,71}, {76,47}, {76,48}, {76,41}, {76,46}, {45,87}, {42,21}, {76,43}, {76,44}, {46,84}, {76,49}, {32,81}, {50,17}, {76,42}, {39,22}, {27,78}, {36,79}, {76,53}, {20,78}, {33,20}, {15,12}, {42,72}, {16,13}, {76,51}, {44,74}, {20,65}, {76,52}, {76,50}, {76,54}, {20,89}, {76,55}, {76,56}, {76,59}, {16,43}, {36,85}, {27,77}, {76,57}, {43,27}, {17,73}, {76,58}, {35,74}, {19,36}, {15,84}, {76,62}, {31,57}, {19,71}, {36,44}, {76,60}, {30,35}, {76,61}, {35,4}, {76,63}, {76,64}, {76,66}, {32,54}, {26,38}, {28,23}, {76,65}, {76,67}, {76,69}, {76,68}, {76,70}, {41,29}, {75,73}, {31,80}, {40,70}, {75,74}, {37,77}, {75,75}, {37,76}, {75,76}, {75,79}, {54,69}, {75,82}, {75,80}, {75,77}, {75,78}, {54,2}, {40,80}, {42,77}, {75,83}, {75,81}, {46,72}, {75,85}, {37,16}, {27,31}, {75,84}, {20,26}, {26,85}, {75,86}, {56,86}, {28,90}, {33,26}, {75,87}, {75,88}, {23,2}, {75,89}, {75,90}, {75,91}, {50,76}, {55,13}, {31,74}, {38,60}, {25,43}, {47,66}, {42,28}, {44,25}, {23,48}, {16,91}, {38,78}, {53,53}, {30,37}, {34,74}, {78,84}, {34,55}, {54,65}, {78,86}, {18,50}, {38,55}, {48,76}, {53,39}, {78,87}, {78,85}, {26,92}, {18,37}, {28,52}, {49,37}, {26,63}, {46,0}, {78,91}, {78,90}, {78,88}, {18,43}, {40,51}, {42,15}, {78,93}, {15,61}, {53,40}, {78,92}, {18,76}, {85,52}, {45,39}, {79,1}, {79,0}, {20,29}, {27,57}, {26,91}, {23,68}, {35,33}, {79,2}, {42,74}, {79,5}, {48,7}, {29,30}, {38,77}, {80,21}, {80,22}, {30,52}, {19,8}, {80,23}, {44,26}, {38,51}, {52,12}, {80,24}, {80,25}, {38,46}, {49,3}, {53,46}, {80,26}, {28,48}, {19,15}, {29,28}, {19,59}, {45,48}, {30,62}, {80,28}, {30,89}, {80,27}, {80,30}, {80,29}, {80,31}, {80,32}, {32,93}, {32,1}, {41,89}, {52,29}, {29,25}, {29,24}, {52,33}, {30,1}, {44,14}, {80,20}, {28,62}, {21,42}, {53,80}, {82,34}, {82,35}, {23,44}, {82,37}, {82,38}, {15,41}, {82,36}, {82,40}, {42,80}, {82,42}, {47,5}, {16,41}, {82,39}, {82,46}, {20,48}, {82,54}, {82,49}, {82,51}, {82,50}, {22,90}, {16,30}, {82,45}, {82,41}, {20,57}, {82,47}, {82,48}, {82,52}, {82,44}, {27,66}, {32,92}, {82,53}, {82,57}, {82,43}, {20,39}, {28,77}, {82,59}, {22,3}, {30,79}, {53,93}, {44,17}, {19,79}, {17,62}, {82,55}, {82,56}, {40,23}, {82,60}, {82,61}, {82,64}, {82,62}, {82,66}, {82,65}, {82,58}, {30,73}, {18,78}, {82,63}, {38,8}, {27,81}, {82,74}, {24,30}, {82,67}, {17,12}, {26,93}, {42,66}, {82,76}, {82,72}, {24,59}, {82,77}, {82,68}, {82,69}, {82,73}, {33,64}, {82,75}, {82,78}, {82,71}, {27,92}, {46,67}, {82,79}, {82,70}, {82,81}, {54,12}, {37,9}, {82,82}, {82,80}, {33,7}, {23,60}, {82,84}, {82,83}, {19,58}, {82,85}, {82,86}, {82,87}, {31,25}, {31,72}, {36,80}, {82,90}, {82,89}, {19,55}, {82,93}, {82,88}, {82,91}, {82,92}, {83,0}, {83,2}, {26,40}, {83,1}, {83,3}, {17,29}, {83,5}, {83,4}, {27,13}, {34,54}, {56,64}, {31,63}, {83,43}, {54,48}, {22,58}, {83,45}, {32,2}, {37,40}, {19,53}, {52,18}, {83,47}, {83,46}, {83,48}, {42,57}, {83,49}, {51,32}, {53,63}, {22,63}, {32,23}, {32,26}, {83,50}, {29,11}, {19,65}, {83,51}, {83,52}, {29,10}, {83,53}, {83,58}, {83,54}, {83,57}, {25,92}, {83,55}, {83,56}, {23,65}, {43,38}, {83,59}, {17,57}, {34,50}, {51,66}, {30,22}, {83,60}, {36,19}, {83,72}, {46,20}, {45,40}, {42,55}, {42,86}, {28,83}, {54,46}, {31,58}, {47,84}, {83,73}, {83,74}, {83,75}, {86,66}, {22,16}, {83,76}, {54,74}, {83,77}, {69,88}, {29,31}, {69,89}, {25,75}, {69,90}, {46,42}, {69,91}, {51,27}, {27,21}, {69,92}, {69,93}, {27,44}, {39,49}, {45,18}, {70,0}, {19,30}, {70,1}, {40,19}, {23,56}, {35,40}, {54,60}, {33,57}, {22,54}, {53,28}, {45,37}, {22,35}, {36,5}, {70,2}, {46,62}, {70,3}, {70,4}, {70,5}, {32,22}, {54,72}, {40,79}, {46,23}, {53,14}, {53,52}, {70,6}, {15,76}, {70,7}, {70,8}, {40,59}, {49,78}, {29,12}, {70,9}, {15,82}, {39,61}, {28,64}, {70,10}, {39,37}, {70,11}, {26,69}, {23,87}, {48,3}, {70,12}, {33,70}, {29,87}, {28,41}, {44,18}, {70,13}, {70,14}, {29,77}, {47,68}, {42,70}, {43,47}, {27,43}, {70,15}, {27,7}, {47,86}, {70,16}, {47,87}, {70,17}, {70,18}, {19,33}, {70,19}, {70,20}, {40,93}, {45,11}, {34,63}, {70,22}, {16,32}, {18,80}, {70,23}, {70,24}, {54,58}, {52,31}, {70,25}, {33,43}, {54,25}, {70,26}, {70,27}, {70,28}, {27,73}, {34,68}, {31,33}, {70,29}, {70,30}, {27,8}, {70,31}, {70,32}, {70,21}, {21,47}, {70,33}, {70,34}, {70,35}, {26,25}, {20,61}, {33,37}, {16,63}, {70,36}, {51,20}, {70,37}, {23,30}, {70,39}, {70,38}, {22,75}, {70,40}, {17,87}, {70,41}, {70,42}, {70,43}, {70,44}, {70,45}, {70,46}, {70,47}, {50,6}, {42,84}, {70,48}, {70,49}, {70,50}, {70,51}, {40,40}, {70,52}, {70,53}, {70,54}, {70,55}, {70,56}, {28,40}, {70,57}, {82,29}, {23,54}, {39,16}, {82,30}, {82,31}, {82,32}, {24,61}, {44,87}, {55,71}, {25,16}, {33,61}, {77,22}, {22,2}, {77,24}, {77,23}, {15,52}, {77,26}, {52,53}, {54,78}, {53,34}, {77,28}, {41,79}, {77,27}, {77,29}, {77,31}, {77,30}, {48,81}, {38,27}, {34,31}, {23,64}, {32,70}, {83,37}, {47,62}, {83,38}, {46,58}, {39,25}, {83,39}, {83,40}, {83,41}, {83,42}, {56,89}, {23,93}, {68,80}, {50,79}, {83,63}, {45,43}, {18,64}, {80,19}, {49,77}, {83,64}, {46,71}, {83,65}, {38,43}, {20,51}, {19,67}, {83,67}, {83,66}, {83,68}, {83,69}, {83,70}, {25,17}, {15,30}, {83,71}, {22,12}, {49,76}, {49,10}, {31,46}, {30,27}, {74,2}, {52,62}, {73,39}, {80,82}, {21,87}, {42,2}, {35,44}, {80,70}, {80,71}, {23,90}, {80,72}, {25,35}, {51,36}, {15,49}, {80,73}, {80,74}, {80,75}, {80,76}, {80,77}, {80,78}, {80,80}, {80,79}, {36,52}, {80,81}, {21,89}, {80,83}, {49,13}, {61,38}, {42,41}, {18,59}, {20,1}, {24,1}, {35,83}, {80,84}, {80,85}, {32,35}, {32,90}, {53,15}, {80,86}, {80,87}, {32,9}, {37,23}, {29,58}, {80,88}, {19,46}, {80,89}, {76,17}, {76,16}, {42,63}, {49,61}, {42,32}, {52,55}, {39,65}, {31,62}, {27,0}, {74,32}, {47,3}, {53,65}, {21,38}, {23,55}, {74,31}, {23,45}, {74,30}, {18,5}, {24,40}, {53,10}, {22,83}, {22,41}, {27,70}, {22,29}, {74,37}, {74,38}, {15,24}, {30,46}, {74,36}, {50,92}, {74,39}, {74,40}, {22,45}, {74,33}, {74,35}, {40,85}, {53,54}, {52,44}, {47,17}, {74,46}, {45,23}, {74,47}, {20,7}, {16,18}, {74,49}, {43,4}, {36,53}, {74,50}, {74,48}, {36,62}, {74,45}, {41,3}, {74,52}, {15,90}, {25,89}, {55,22}, {80,66}, {74,41}, {74,42}, {74,43}, {74,44}, {74,53}, {69,31}, {74,56}, {30,71}, {49,39}, {74,54}, {74,59}, {23,75}, {74,55}, {28,25}, {47,55}, {15,22}, {74,60}, {35,59}, {53,11}, {19,63}, {33,85}, {27,24}, {74,57}, {74,58}, {51,63}, {37,73}, {35,51}, {74,62}, {36,6}, {56,84}, {17,16}, {74,67}, {28,36}, {74,65}, {74,66}, {23,11}, {44,48}, {74,68}, {74,64}, {32,18}, {37,1}, {43,82}, {74,69}, {31,15}, {49,23}, {74,70}, {23,14}, {23,12}, {74,71}, {38,26}, {44,82}, {74,73}, {74,74}, {74,76}, {47,39}, {74,81}, {74,77}, {74,80}, {39,88}, {48,91}, {74,75}, {74,72}, {23,24}, {46,56}, {35,68}, {74,78}, {74,79}, {43,57}, {44,39}, {15,81}, {74,85}, {74,84}, {17,17}, {23,63}, {74,86}, {16,75}, {43,36}, {35,3}, {46,4}, {74,88}, {75,1}, {36,81}, {74,89}, {40,36}, {65,62}, {74,93}, {44,45}, {75,0}, {16,58}, {50,22}, {49,59}, {74,92}, {74,90}, {18,27}, {73,15}, {54,51}, {83,10}, {18,83}, {53,32}, {53,33}, {52,72}, {29,41}, {83,6}, {49,7}, {83,7}, {83,8}, {83,9}, {29,42}, {50,62}, {40,63}, {40,64}, {82,33}, {41,69}, {43,81}, {65,21}, {42,19}, {45,71}, {53,58}, {83,12}, {83,13}, {83,14}, {83,17}, {25,28}, {83,18}, {15,66}, {83,15}, {83,16}, {28,1}, {17,52}, {83,21}, {83,22}, {21,69}, {17,15}, {46,46}, {83,19}, {19,11}, {83,20}, {83,23}, {83,24}, {44,6}, {83,25}, {83,26}, {83,27}, {42,49}, {83,28}, {83,29}, {83,30}, {83,61}, {32,27}, {27,71}, {40,10}, {48,61}, {68,84}, {59,18}, {49,52}, {59,19}, {15,11}, {59,20}, {28,57}, {59,24}, {55,33}, {59,22}, {50,82}, {40,53}, {59,25}, {59,21}, {59,26}, {34,1}, {59,27}, {59,36}, {59,28}, {45,62}, {53,4}, {59,46}, {59,44}, {59,49}, {28,69}, {33,10}, {59,23}, {59,42}, {59,45}, {59,29}, {22,49}, {15,36}, {59,38}, {47,29}, {59,32}, {26,7}, {22,27}, {59,43}, {59,37}, {59,30}, {38,58}, {48,30}, {59,31}, {59,41}, {59,47}, {45,12}, {59,33}, {59,34}, {59,39}, {59,40}, {17,51}, {59,48}, {42,52}, {51,22}, {59,58}, {59,62}, {43,5}, {59,69}, {34,70}, {59,59}, {30,32}, {59,56}, {15,89}, {24,21}, {59,68}, {59,50}, {59,35}, {59,53}, {39,83}, {30,63}, {40,26}, {16,28}, {50,1}, {59,57}, {59,52}, {37,26}, {59,61}, {54,33}, {34,14}, {22,21}, {38,48}, {34,8}, {59,65}, {59,55}, {59,74}, {59,51}, {59,60}, {29,4}, {59,54}, {59,63}, {59,66}, {59,67}, {59,87}, {59,64}, {60,1}, {59,70}, {27,74}, {19,35}, {34,2}, {17,70}, {59,89}, {59,81}, {59,78}, {59,91}, {59,77}, {49,79}, {17,71}, {39,54}, {39,66}, {59,90}, {59,76}, {59,86}, {59,84}, {29,2}, {59,83}, {17,60}, {59,82}, {27,85}, {59,71}, {26,35}, {31,82}, {27,51}, {59,72}, {59,73}, {59,80}, {59,85}, {59,88}, {20,19}, {39,56}, {26,70}, {59,93}, {59,92}, {50,10}, {60,0}, {60,2}, {60,4}, {49,80}, {60,3}, {60,5}, {60,6}, {49,8}, {25,40}, {60,8}, {60,21}, {60,16}, {60,19}, {60,15}, {37,45}, {31,81}, {40,14}, {59,75}, {60,13}, {60,22}, {59,79}, {60,14}, {60,23}, {60,11}, {60,24}, {60,18}, {60,12}, {35,9}, {60,7}, {31,18}, {32,10}, {60,9}, {60,10}, {60,17}, {26,80}, {60,20}, {50,7}, {60,25}, {60,26}, {34,6}, {60,49}, {60,27}, {60,48}, {24,28}, {29,52}, {29,89}, {25,41}, {60,41}, {60,36}, {60,30}, {17,42}, {60,34}, {60,42}, {17,3}, {60,52}, {60,29}, {37,47}, {60,47}, {60,51}, {32,65}, {22,37}, {60,45}, {60,46}, {60,35}, {60,28}, {60,44}, {43,48}, {60,40}, {60,33}, {34,39}, {37,27}, {45,13}, {60,43}, {60,39}, {60,32}, {60,37}, {33,59}, {50,8}, {50,9}, {60,50}, {46,83}, {39,87}, {60,69}, {60,38}, {60,63}, {33,67}, {60,64}, {60,54}, {53,87}, {60,56}, {60,55}, {23,79}, {60,53}, {37,46}, {21,12}, {60,65}, {25,88}, {51,64}, {60,70}, {19,47}, {60,57}, {30,90}, {60,66}, {60,62}, {60,60}, {20,56}, {60,58}, {60,59}, {60,61}, {28,14}, {60,67}, {60,68}, {60,84}, {34,40}, {42,65}, {60,81}, {55,64}, {37,48}, {60,83}, {52,83}, {60,82}, {60,79}, {60,75}, {60,78}, {60,71}, {47,77}, {39,55}, {60,77}, {60,72}, {60,73}, {42,81}, {60,76}, {16,44}, {31,21}, {27,26}, {60,80}, {60,86}, {60,85}, {60,74}, {36,77}, {60,90}, {61,3}, {61,2}, {60,87}, {34,78}, {33,90}, {52,64}, {45,20}, {60,92}, {17,43}, {35,71}, {41,62}, {38,29}, {60,89}, {60,91}, {60,93}, {61,1}, {15,9}, {16,45}, {61,11}, {61,5}, {28,21}, {39,78}, {61,0}, {61,4}, {61,8}, {61,7}, {61,6}, {61,12}, {51,43}, {61,18}, {61,9}, {61,13}, {31,56}, {16,0}, {61,21}, {61,16}, {61,17}, {48,5}, {61,20}, {61,14}, {61,15}, {47,28}, {61,19}, {41,76}, {61,24}, {61,23}, {61,22}, {61,26}, {28,68}, {17,55}, {34,73}, {61,25}, {36,25}, {61,27}, {43,56}, {22,9}, {51,68}, {61,28}, {61,30}, {35,1}, {61,32}, {61,29}, {61,31}, {52,25}, {61,33}, {81,13}, {26,1}, {33,17}, {36,15}, {33,38}, {81,14}, {47,72}, {50,60}, {74,28}, {18,69}, {81,15}, {81,16}, {41,12}, {25,70}, {81,18}, {81,20}, {81,19}, {42,67}, {46,25}, {81,17}, {41,19}, {49,46}, {33,75}, {45,34}, {81,23}, {15,85}, {81,22}, {81,29}, {17,46}, {48,32}, {81,25}, {81,27}, {51,72}, {81,26}, {81,21}, {81,30}, {81,28}, {81,24}, {81,38}, {81,35}, {81,37}, {81,41}, {81,33}, {81,31}, {81,36}, {53,90}, {81,32}, {38,88}, {40,62}, {81,39}, {24,37}, {20,15}, {81,34}, {81,40}, {81,47}, {81,53}, {26,54}, {81,52}, {44,59}, {53,74}, {81,49}, {81,51}, {23,81}, {81,42}, {81,45}, {33,88}, {52,60}, {81,43}, {81,44}, {81,46}, {81,50}, {81,56}, {50,27}, {21,73}, {41,80}, {22,67}, {81,54}, {81,55}, {81,57}, {81,60}, {81,58}, {81,59}, {48,48}, {81,48}, {44,40}, {45,46}, {53,8}, {81,66}, {34,58}, {81,63}, {31,14}, {81,75}, {81,61}, {81,64}, {81,71}, {81,65}, {81,70}, {81,69}, {81,72}, {81,62}, {81,67}, {81,73}, {50,11}, {81,68}, {17,84}, {81,81}, {47,10}, {81,84}, {26,39}, {81,88}, {81,79}, {81,85}, {81,87}, {81,89}, {81,82}, {81,80}, {25,90}, {20,90}, {81,78}, {81,86}, {81,76}, {81,77}, {81,74}, {82,5}, {82,2}, {82,1}, {81,83}, {39,57}, {81,90}, {82,4}, {34,87}, {81,92}, {82,6}, {82,8}, {82,3}, {81,91}, {82,10}, {82,9}, {33,60}, {82,13}, {82,15}, {82,0}, {82,16}, {82,11}, {82,14}, {81,93}, {82,12}, {82,17}, {82,19}, {82,7}, {82,18}, {82,20}, {47,22}, {82,23}, {56,88}, {82,24}, {82,22}, {39,67}, {82,21}, {82,25}, {82,26}, {19,31}, {77,34}, {82,27}, {82,28}, {48,9}, {83,11}, {47,37}, {47,47}, {48,59}, {46,45}, {28,53}, {48,34}, {25,65}, {64,72}, {49,33}, {80,33}, {17,24}, {16,76}, {80,34}, {40,31}, {18,35}, {56,81}, {42,4}, {80,35}, {53,51}, {80,36}, {83,31}, {80,37}, {51,11}, {80,38}, {15,31}, {83,32}, {83,33}, {19,91}, {36,58}, {43,26}, {47,67}, {44,63}, {80,39}, {56,82}, {16,26}, {46,13}, {23,3}, {80,41}, {80,42}, {17,34}, {32,48}, {54,15}, {80,40}, {80,43}, {80,45}, {56,85}, {49,64}, {51,2}, {83,34}, {39,24}, {83,35}, {80,44}, {80,46}, {30,66}, {80,47}, {80,51}, {80,53}, {80,48}, {40,48}, {36,64}, {33,66}, {24,91}, {80,50}, {80,52}, {24,50}, {80,58}, {25,53}, {15,92}, {80,56}, {80,55}, {80,49}, {80,57}, {80,54}, {39,75}, {44,41}, {80,60}, {68,28}, {80,59}, {80,61}, {80,62}, {46,68}, {83,36}, {28,82}, {80,63}, {80,64}, {45,86}, {49,9}, {80,90}, {23,17}, {27,90}, {24,58}, {24,69}, {34,56}, {41,50}, {73,71}, {31,31}, {29,84}, {73,72}, {73,73}, {73,74}, {73,75}, {73,76}, {73,77}, {73,78}, {28,38}, {84,90}, {84,92}, {84,93}, {84,91}, {28,65}, {85,0}, {19,4}, {85,1}, {85,2}, {75,17}, {48,51}, {56,73}, {85,3}, {77,25}, {52,17}, {50,93}, {43,59}, {41,35}, {68,31}, {85,4}, {29,14}, {37,8}, {57,4}, {27,37}, {21,8}, {23,27}, {39,46}, {27,4}, {57,5}, {57,6}, {43,53}, {39,34}, {57,7}, {37,92}, {48,20}, {49,72}, {48,21}, {27,38}, {28,17}, {26,67}, {57,8}, {57,9}, {48,39}, {57,10}, {47,76}, {21,78}, {33,58}, {42,46}, {22,76}, {40,71}, {22,34}, {29,86}, {53,3}, {57,11}, {57,12}, {37,31}, {54,70}, {41,21}, {52,8}, {42,62}, {52,78}, {57,13}, {53,62}, {19,41}, {57,15}, {57,14}, {49,74}, {57,16}, {57,17}, {57,18}, {41,51}, {57,19}, {41,10}, {57,20}, {57,21}, {18,46}, {53,78}, {57,22}, {26,15}, {20,13}, {57,23}, {57,24}, {24,77}, {48,14}, {49,71}, {57,25}, {23,34}, {46,73}, {17,78}, {57,26}, {57,27}, {28,74}, {45,59}, {50,78}, {57,28}, {45,82}, {57,29}, {50,52}, {26,68}, {57,30}, {42,20}, {42,47}, {57,31}, {38,74}, {53,77}, {57,32}, {36,20}, {21,32}, {57,33}, {22,43}, {30,45}, {57,34}, {57,35}, {42,12}, {57,36}, {20,86}, {57,37}, {32,33}, {54,26}, {57,38}, {43,23}, {49,73}, {35,16}, {57,39}, {20,92}, {26,48}, {57,40}, {47,18}, {57,41}, {57,42}, {45,28}, {57,43}, {57,44}, {57,45}, {17,86}, {57,48}, {57,46}, {48,71}, {57,47}, {34,52}, {57,49}, {57,50}, {57,51}, {57,52}, {47,26}, {49,4}, {15,88}, {57,53}, {38,10}, {57,54}, {28,86}, {34,0}, {57,55}, {57,56}, {34,92}, {43,22}, {57,57}, {57,58}, {31,29}, {37,54}, {57,59}, {57,60}, {38,19}, {57,61}, {57,62}, {24,39}, {26,76}, {21,24}, {83,87}, {83,88}, {44,66}, {84,24}, {74,63}, {46,82}, {26,30}, {25,31}, {51,4}, {64,56}, {84,83}, {16,9}, {17,81}, {84,84}, {84,86}, {25,48}, {84,85}, {34,17}, {84,88}, {84,87}, {16,19}, {52,73}, {23,25}, {24,16}, {17,37}, {51,79}, {46,44}, {15,59}, {52,42}, {26,84}, {53,41}, {22,22}, {43,15}, {37,21}, {16,64}, {24,25}, {53,91}, {24,64}, {22,0}, {27,89}, {73,57}, {73,58}, {43,88}, {24,82}, {73,59}, {19,90}, {34,18}, {22,48}, {25,55}, {73,60}, {51,83}, {73,61}, {27,53}, {26,62}, {73,62}, {32,61}, {33,23}, {51,62}, {54,41}, {73,63}, {73,64}, {73,67}, {73,65}, {73,66}, {40,61}, {23,18}, {21,35}, {73,68}, {41,73}, {40,44}, {19,44}, {65,56}, {36,65}, {73,69}, {31,20}, {54,23}, {73,70}, {54,11}, {39,91}, {55,50}, {55,44}, {51,61}, {51,88}, {40,35}, {50,13}, {23,50}, {18,63}, {40,65}, {83,85}, {25,52}, {83,86}, {54,62}, {83,80}, {23,15}, {52,51}, {23,46}, {37,79}, {18,34}, {83,81}, {18,11}, {51,28}, {38,86}, {83,83}, {83,82}, {43,42}, {39,3}, {83,84}, {54,66}, {36,30}, {84,31}, {84,26}, {84,34}, {84,33}, {53,25}, {84,32}, {51,29}, {84,35}, {84,43}, {15,46}, {20,87}, {84,40}, {84,41}, {36,59}, {84,36}, {84,37}, {84,38}, {84,42}, {29,63}, {84,39}, {23,89}, {84,47}, {84,50}, {30,70}, {24,81}, {84,27}, {84,44}, {33,22}, {43,87}, {27,88}, {84,45}, {84,46}, {84,48}, {21,68}, {84,49}, {84,52}, {84,28}, {84,51}, {50,26}, {18,75}, {43,3}, {84,53}, {84,54}, {29,64}, {84,55}, {43,62}, {84,58}, {17,39}, {54,56}, {84,56}, {84,57}, {84,59}, {84,65}, {84,63}, {84,62}, {84,60}, {84,64}, {84,61}, {84,67}, {84,68}, {43,66}, {68,30}, {20,23}, {84,66}, {84,71}, {43,2}, {84,69}, {84,70}, {84,29}, {16,35}, {84,30}, {20,36}, {17,67}, {84,75}, {84,72}, {21,54}, {84,76}, {84,73}, {84,74}, {19,57}, {51,73}, {84,77}, {18,88}, {84,78}, {84,80}, {84,79}, {84,81}, {84,82}, {40,76}, {24,9}, {38,90}, {21,66}, {43,40}, {73,5}, {18,20}, {51,93}, {24,75}, {47,88}, {72,76}, {54,9}, {72,77}, {33,53}, {39,76}, {25,67}, {72,78}, {72,79}, {72,80}, {53,64}, {72,81}, {72,82}, {72,84}, {72,83}, {72,85}, {72,86}, {38,64}, {72,87}, {51,55}, {72,88}, {28,45}, {72,89}, {72,90}, {28,46}, {72,91}, {23,7}, {32,29}, {72,92}, {16,17}, {26,51}, {24,84}, {72,93}, {73,0}, {73,1}, {73,2}, {22,87}, {27,12}, {41,67}, {63,45}, {51,14}, {46,28}, {52,22}, {73,3}, {52,61}, {73,4}, {47,32}, {24,27}, {19,38}, {16,56}, {31,16}, {16,69}, {16,70}, {16,71}, {18,28}, {39,71}, {68,32}, {16,62}, {32,40}, {19,78}, {38,7}, {50,55}, {37,88}, {48,23}, {24,92}, {33,84}, {50,12}, {51,42}, {28,91}, {68,33}, {22,20}, {68,34}, {26,24}, {52,65}, {28,87}, {51,21}, {45,4}, {32,11}, {18,56}, {43,85}, {68,37}, {68,35}, {68,39}, {68,41}, {68,38}, {20,46}, {37,39}, {20,91}, {68,36}, {41,85}, {68,40}, {34,51}, {16,36}, {27,2}, {54,22}, {44,42}, {42,44}, {41,41}, {43,50}, {68,43}, {68,42}, {35,69}, {48,0}, {48,22}, {68,44}, {68,47}, {44,23}, {53,79}, {68,46}, {20,60}, {44,29}, {68,48}, {21,25}, {44,7}, {24,67}, {41,36}, {18,48}, {42,56}, {51,75}, {68,49}, {22,73}, {68,45}, {68,52}, {19,93}, {68,53}, {68,50}, {68,51}, {49,60}, {33,62}, {16,37}, {50,65}, {21,60}, {42,75}, {68,54}, {50,85}, {16,72}, {21,83}, {68,57}, {68,55}, {68,56}, {20,31}, {49,36}, {68,59}, {68,61}, {68,60}, {38,17}, {49,2}, {68,58}, {51,65}, {52,57}, {68,63}, {54,80}, {68,64}, {16,59}, {48,90}, {68,65}, {68,67}, {68,66}, {68,68}, {49,55}, {20,42}, {70,62}, {57,84}, {57,87}, {57,85}, {57,86}, {57,89}, {47,46}, {35,38}, {15,77}, {47,15}, {57,88}, {50,41}, {25,9}, {58,1}, {38,80}, {57,91}, {57,90}, {40,58}, {57,92}, {58,0}, {54,61}, {57,93}, {32,57}, {58,4}, {50,83}, {58,6}, {58,3}, {58,7}, {28,27}, {31,40}, {58,2}, {58,5}, {53,2}, {58,8}, {58,12}, {58,13}, {58,11}, {25,33}, {30,3}, {58,10}, {58,9}, {51,38}, {17,30}, {58,14}, {24,88}, {58,15}, {18,26}, {20,5}, {21,27}, {58,16}, {21,84}, {58,17}, {16,40}, {58,19}, {58,18}, {58,20}, {58,22}, {58,21}, {58,23}, {58,24}, {58,25}, {50,46}, {83,89}, {38,84}, {54,34}, {36,67}, {83,91}, {83,92}, {83,90}, {29,37}, {47,78}, {22,50}, {51,44}, {43,9}, {84,1}, {84,0}, {25,7}, {83,93}, {42,53}, {84,3}, {31,49}, {18,73}, {44,9}, {84,4}, {84,2}, {28,19}, {84,7}, {84,8}, {28,44}, {34,23}, {30,64}, {42,64}, {84,9}, {84,5}, {84,6}, {35,79}, {84,11}, {19,27}, {54,76}, {19,54}, {84,10}, {84,13}, {84,12}, {84,14}, {47,48}, {34,48}, {39,8}, {84,15}, {84,16}, {84,17}, {84,18}, {84,19}, {84,20}, {84,22}, {84,21}, {84,23}, {17,40}, {50,51}, {41,44}, {31,78}, {53,55}, {49,15}, {32,30}, {28,79}, {23,9}, {27,87}, {85,37}, {85,38}, {85,39}, {85,40}, {85,41}, {85,43}, {85,42}, {86,72}, {85,44}, {85,45}, {77,35}, {77,36}, {77,37}, {52,74}, {21,3}, {77,39}, {77,38}, {77,40}, {77,41}, {38,4}, {77,42}, {77,43}, {22,15}, {20,85}, {77,44}, {77,46}, {77,45}, {23,37}, {77,47}, {77,48}, {77,49}, {21,58}, {18,13}, {53,50}, {35,37}, {16,20}, {23,53}, {77,50}, {77,51}, {51,30}, {38,52}, {29,90}, {45,56}, {24,18}, {77,53}, {77,52}, {77,55}, {77,54}, {36,4}, {77,56}, {77,57}, {38,13}, {77,58}, {38,14}, {77,59}, {17,6}, {77,60}, {77,61}, {77,62}, {77,63}, {77,64}, {54,73}, {77,65}, {77,66}, {27,55}, {77,67}, {50,42}, {43,89}, {17,11}, {32,68}, {77,68}, {38,5}, {34,12}, {77,69}, {77,70}, {77,71}, {77,72}, {77,73}, {77,74}, {77,75}, {77,76}, {77,77}, {77,78}, {77,79}, {77,80}, {77,81}, {77,83}, {77,82}, {77,84}, {44,12}, {33,32}, {77,85}, {77,86}, {77,87}, {52,0}, {77,88}, {46,18}, {77,89}, {77,90}, {77,91}, {77,92}, {78,0}, {77,93}, {78,1}, {23,84}, {34,89}, {78,2}, {78,3}, {28,33}, {49,30}, {17,88}, {78,4}, {78,5}, {78,6}, {49,87}, {78,7}, {53,92}, {78,8}, {37,43}, {78,9}, {78,10}, {32,19}, {78,11}, {46,89}, {42,87}, {78,13}, {78,12}, {18,89}, {24,87}, {78,14}, {78,15}, {47,65}, {78,16}, {78,17}, {22,69}, {47,30}, {78,18}, {78,19}, {78,20}, {39,80}, {43,63}, {78,21}, {78,22}, {78,23}, {78,24}, {78,25}, {52,63}, {78,26}, {19,76}, {34,9}, {78,27}, {78,28}, {78,29}, {78,30}, {45,92}, {78,31}, {33,63}, {19,23}, {54,21}, {28,84}, {46,38}, {78,34}, {78,32}, {78,33}, {78,35}, {21,6}, {27,91}, {29,65}, {34,43}, {78,36}, {78,37}, {78,38}, {78,46}, {78,39}, {78,40}, {78,41}, {38,33}, {78,80}, {21,44}, {78,42}, {78,43}, {78,44}, {21,37}, {34,29}, {78,45}, {78,47}, {78,48}, {78,49}, {52,81}, {78,50}, {35,86}, {78,51}, {35,87}, {78,52}, {78,53}, {23,67}, {15,86}, {78,54}, {78,55}, {78,56}, {78,57}, {78,58}, {78,59}, {78,60}, {78,61}, {29,20}, {78,64}, {78,62}, {78,63}, {78,65}, {78,66}, {32,44}, {78,67}, {78,68}, {78,69}, {78,70}, {78,71}, {78,72}, {78,73}, {78,74}, {78,75}, {31,55}, {78,76}, {32,12}, {78,77}, {78,78}, {78,79}, {46,65}, {18,3}, {34,36}, {66,36}, {40,32}, {66,37}, {16,52}, {45,41}, {19,18}, {39,81}, {66,38}, {46,47}, {66,39}, {27,67}, {66,40}, {66,41}, {34,37}, {52,1}, {35,53}, {24,74}, {45,36}, {66,42}, {34,85}, {66,43}, {22,6}, {23,82}, {25,49}, {66,44}, {66,45}, {51,35}, {66,46}, {66,47}, {48,42}, {66,48}, {66,49}, {66,50}, {66,51}, {48,53}, {66,52}, {17,90}, {31,26}, {66,53}, {31,10}, {66,54}, {66,55}, {66,56}, {66,57}, {66,58}, {23,22}, {57,65}, {21,50}, {57,67}, {57,66}, {57,69}, {39,77}, {57,68}, {22,31}, {48,83}, {49,84}, {52,82}, {28,54}, {54,71}, {57,71}, {57,70}, {15,1}, {44,50}, {57,72}, {23,28}, {27,41}, {33,28}, {33,3}, {18,33}, {57,73}, {33,9}, {35,15}, {28,20}, {46,61}, {57,74}, {40,33}, {16,60}, {57,75}, {21,23}, {51,25}, {18,92}, {57,76}, {51,40}, {46,52}, {36,66}, {57,77}, {57,78}, {57,79}, {32,73}, {43,52}, {46,60}, {50,70}, {33,0}, {57,80}, {42,68}, {57,81}, {42,69}, {49,93}, {23,83}, {57,82}, {15,14}, {46,21}, {52,46}, {42,76}, {57,83}, {66,35}, {32,4}, {85,30}, {85,31}, {85,32}, {35,48}, {39,23}, {48,66}, {47,58}, {48,36}, {27,14}, {24,44}, {78,83}, {19,37}, {50,25}, {85,33}, {18,90}, {85,34}, {20,80}, {85,36}, {50,73}, {85,6}, {48,8}, {85,8}, {85,7}, {32,66}, {31,54}, {16,1}, {45,76}, {47,71}, {85,10}, {46,85}, {85,9}, {52,79}, {85,11}, {34,24}, {26,83}, {85,13}, {85,12}, {35,61}, {32,55}, {42,9}, {46,27}, {85,14}, {85,15}, {85,16}, {33,21}, {15,51}, {36,88}, {85,17}, {38,63}, {85,5}, {29,23}, {29,17}, {20,68}, {22,38}, {30,30}, {34,49}, {34,69}, {55,43}, {23,78}, {28,88}, {48,4}, {15,47}, {86,15}, {86,16}, {47,11}, {15,15}, {86,17}, {86,18}, {86,19}, {38,41}, {29,46}, {86,22}, {86,21}, {16,61}, {86,20}, {86,23}, {86,24}, {45,3}, {39,44}, {25,10}, {71,23}, {71,24}, {71,25}, {29,33}, {49,83}, {51,46}, {40,55}, {49,18}, {21,4}, {38,73}, {80,91}, {46,77}, {42,18}, {47,74}, {70,78}, {44,70}, {24,42}, {21,56}, {80,92}, {15,67}, {42,43}, {80,93}, {51,3}, {33,12}, {32,75}, {37,35}, {29,16}, {81,0}, {27,52}, {81,1}, {81,2}, {81,3}, {49,34}, {37,20}, {44,38}, {81,4}, {50,16}, {30,36}, {43,65}, {81,5}, {81,6}, {48,52}, {21,77}, {81,7}, {81,8}, {20,62}, {81,9}, {81,10}, {17,91}, {81,11}, {81,12}, {39,6}, {22,70}, {75,8}, {75,9}, {75,10}, {75,11}, {37,13}, {75,12}, {75,13}, {22,40}, {41,18}, {65,23}, {86,46}, {86,47}, {17,44}, {86,48}, {86,50}, {86,49}, {65,26}, {27,1}, {65,27}, {65,28}, {65,29}, {65,30}, {65,31}, {65,32}, {22,24}, {49,90}, {28,3}, {41,45}, {16,4}, {42,38}, {65,33}, {21,91}, {39,35}, {65,34}, {28,39}, {16,92}, {65,35}, {21,85}, {65,36}, {35,56}, {65,37}, {46,57}, {24,60}, {65,38}, {31,0}, {65,39}, {17,85}, {65,40}, {32,82}, {65,41}, {65,42}, {33,87}, {65,43}, {65,44}, {65,45}, {41,54}, {55,23}, {56,68}, {46,66}, {79,4}, {59,15}, {33,76}, {51,5}, {44,51}, {48,16}, {18,58}, {38,92}, {17,20}, {33,30}, {69,63}, {41,26}, {69,64}, {69,65}, {29,51}, {69,66}, {54,3}, {44,52}, {69,68}, {27,60}, {69,67}, {69,69}, {69,70}, {33,77}, {28,29}, {69,71}, {33,69}, {25,6}, {69,72}, {69,73}, {18,49}, {48,72}, {30,4}, {69,74}, {37,78}, {69,75}, {69,76}, {69,77}, {37,12}, {69,78}, {40,6}, {69,79}, {69,80}, {69,81}, {68,24}, {69,82}, {69,83}, {33,65}, {69,84}, {69,85}, {53,71}, {69,86}, {69,87}, {24,38}, {86,26}, {86,25}, {86,29}, {86,27}, {25,0}, {86,30}, {86,31}, {86,33}, {86,32}, {86,35}, {86,34}, {86,36}, {86,37}, {86,38}, {42,71}, {23,62}, {86,51}, {86,52}, {86,53}, {86,55}, {86,57}, {86,54}, {86,58}, {86,56}, {54,54}, {86,59}, {86,60}, {86,61}, {86,62}, {86,63}, {58,42}, {55,9}, {68,86}, {24,76}, {30,92}, {26,73}, {86,40}, {37,38}, {86,39}, {86,41}, {86,43}, {86,42}, {86,44}, {45,25}, {86,45}, {35,6}, {50,66}, {85,46}, {33,18}, {85,47}, {85,48}, {85,49}, {85,50}, {85,51}, {85,53}, {16,10}, {85,54}, {85,55}, {85,56}, {85,57}, {85,58}, {85,59}, {85,60}, {85,61}, {46,41}, {85,62}, {85,63}, {85,64}, {85,65}, {85,66}, {85,67}, {31,79}, {85,68}, {85,69}, {85,70}, {85,71}, {85,72}, {85,73}, {85,74}, {85,75}, {85,76}, {85,77}, {85,78}, {85,79}, {85,80}, {85,81}, {85,82}, {85,83}, {29,7}, {85,84}, {85,85}, {85,86}, {85,87}, {39,89}, {85,88}, {85,89}, {85,90}, {85,91}, {85,92}, {85,93}, {86,0}, {86,1}, {86,2}, {86,3}, {86,4}, {86,5}, {86,6}, {86,7}, {16,77}, {86,8}, {86,9}, {86,10}, {86,11}, {86,12}, {32,58}, {86,13}, {86,14}, {35,80}, {79,14}, {27,5}, {79,15}, {34,88}, {36,23}, {48,26}, {79,16}, {79,17}, {79,18}, {79,19}, {79,20}, {48,27}, {48,75}, {79,22}, {79,21}, {51,6}, {44,49}, {79,23}, {79,25}, {79,24}, {79,26}, {79,27}, {23,74}, {79,28}, {25,71}, {79,29}, {79,30}, {29,72}, {79,31}, {21,75}, {79,32}, {79,33}, {79,34}, {79,35}, {39,20}, {79,36}, {79,37}, {79,38}, {36,83}, {79,39}, {79,40}, {79,41}, {86,28}, {79,42}, {79,43}, {79,44}, {79,45}, {79,46}, {25,54}, {79,47}, {79,48}, {79,49}, {79,50}, {79,51}, {79,52}, {79,53}, {79,55}, {50,4}, {79,54}, {79,56}, {84,25}, {33,24}, {86,67}, {86,68}, {86,69}, {86,70}, {86,71}, {33,19}, {86,73}, {86,74}, {33,82}, {83,79}, {83,78}, {33,72}, {86,64}, {86,65}, {26,37}, {56,67}, {41,81}, {31,71}, {79,3}, {25,57}, {38,12}, {35,11}, {86,75}, {86,76}, {86,77}, {86,79}, {86,78}, {86,80}, {86,83}, {86,82}, {86,81}, {86,84}, {86,85}, {76,72}, {76,73}, {76,74}, {85,27}, {85,28}, {85,29}, {21,5}, {55,29}, {24,35}, {55,26}, {59,16}, {41,82}, {86,86}, {86,87}, {86,88}, {86,90}, {86,89}, {16,38}, {86,91}, {86,92}, {86,93}, {37,74}, {75,19}, {18,60}, {85,18}, {85,19}, {32,67}, {85,20}, {85,21}, {85,22}, {85,23}, {85,24}, {85,25}, {39,2}, {85,26}, {32,89}, {24,7}, {76,71}, {24,73}, {56,62}, {2,0}, {2,1}, {2,2}, {0,70}, {2,4}, {2,5}, {2,6}, {2,7}, {2,8}, {2,9}, {2,10}, {2,11}, {2,12}, {2,13}, {2,14}, {2,15}, {2,16}, {2,17}, {2,18}, {2,19}, {2,20}, {2,21}, {2,22}, {2,23}, {2,24}, {2,25}, {2,26}, {2,27}, {2,28}, {2,29}, {2,30}, {2,31}, {2,32}, {2,33}, {2,34}, {2,35}, {2,36}, {2,37}, {2,38}, {2,39}, {2,40}, {2,41}, {2,42}, {2,43}, {2,44}, {2,45}, {2,46}, {2,47}, {2,48}, {2,49}, {2,50}, {2,51}, {2,52}, {2,53}, {2,54}, {2,55}, {2,56}, {2,57}, {2,58}, {2,59}, {2,60}, {2,61}, {2,62}, {2,63}, {2,64}, {2,65}, {2,66}, {2,67}, {2,68}, {2,69}, {2,70}, {2,71}, {2,72}, {2,73}, {2,74}, {2,75}, {2,76}, {2,77}, {2,78}, {2,79}, {2,80}, {2,81}, {2,82}, {2,83}, {2,84}, {2,85}, {2,86}, {2,87}, {2,88}, {2,89}, {2,90}, {2,91}, {2,92}, {0,10}, {0,72}, {0,73}, {2,93}, {2,3} }; /* This returns ERROR if the code point doesn't exist. */ long int gb2312_to_unicode(int r, int c) { assert(r >= 0 && r < 94); assert(c >= 0 && c < 94); return gb2312_forward[r][c]; } /* This one returns 1 on success, 0 if the code point doesn't exist. */ int unicode_to_gb2312(long int unicode, int *r, int *c) { int rr, cc; long int uu; int i, j, k; i = -1; j = lenof(gb2312_backward); while (j - i > 1) { k = (i + j) / 2; rr = gb2312_backward[k].r; cc = gb2312_backward[k].c; uu = gb2312_forward[rr][cc]; if (unicode > uu) i = k; else if (unicode < uu) j = k; else { *r = rr; *c = cc; return 1; } } return 0; } #ifdef TESTMODE #include <stdio.h> int main(void) { int r, c, rr, cc, ret; long int u, uu; for (r = 0; r < 94; r++) { for (c = 0; c < 94; c++) { u = gb2312_to_unicode(r, c); if (u != ERROR) { ret = unicode_to_gb2312(u, &rr, &cc); if (!ret) printf("(%d,%d) -> U-%08lx but didn't convert back\n", r, c, u); else if (rr != r || cc != c) printf("(%d,%d) -> U-%08lx -> (%d,%d)\n", r, c, u, rr, cc); } } } for (u = 0; u < 0x10000L; u++) { ret = unicode_to_gb2312(u, &r, &c); if (ret) { uu = gb2312_to_unicode(r, c); if (uu == ERROR) printf("U-%08lx -> (%d,%d) but didn't convert back\n", u, r, c); else if (uu != u) printf("U-%08lx -> (%d,%d) -> U-%08lx\n", u, r, c, uu); } } return 0; } #endif ������������������������������������������������������halibut-1.1/charset/hz.c����������������������������������������������������������������������������0000644�0001753�0001753�00000006054�12444773746�012177� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * hz.c - HZ textual encoding of ASCII and GB2312, as defined in RFC 1843. */ #ifndef ENUM_CHARSETS #include <assert.h> #include "charset.h" #include "internal.h" static void read_hz(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { /* * When reading, our state variables are: * * - s0 is 0 in ASCII mode, 1 in GB2312 mode. * * - s1 stores a character we have just seen but not fully * processed. So in ASCII mode, this can only ever be zero * (no character) or 0x7E (~); in GB2312 mode it can be * anything from 0x21-0x7E. */ UNUSEDARG(charset); if (state->s0 == 0) { /* * ASCII mode. */ if (state->s1) { assert(state->s1 == '~'); state->s1 = 0; /* Process the character after a tilde. */ switch (input_chr) { case '~': emit(emitctx, input_chr); return; case '\n': return; /* ~\n is ignored */ case '{': state->s0 = 1; /* switch to GB2312 mode */ return; } } else if (input_chr == '~') { state->s1 = '~'; return; } else { /* In ASCII mode, any non-tildes go straight */ emit(emitctx, input_chr); return; } } else { /* * GB2312 mode. As I understand it, we expect never to see * anything in this mode that isn't 0x21-0x7E. So if we do, * we'll simply throw an error and return to ASCII mode. */ if (input_chr < 0x21 || input_chr > 0x7E) { emit(emitctx, ERROR); state->s0 = state->s1 = 0; return; } /* * So if we don't have a character stored already, store * this one... */ if (!state->s1) { state->s1 = input_chr; return; } /* * ... otherwise, combine the stored char with this one. * This will give either `~}', the escape sequence to * return to ASCII mode, or something which we translate * through GB2312. */ if (state->s1 == '~' && input_chr == '}') { state->s1 = state->s0 = 0; return; } emit(emitctx, gb2312_to_unicode(state->s1 - 0x21, input_chr - 0x21)); state->s1 = 0; } } static int write_hz(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { int desired_state, r, c; UNUSEDARG(charset); /* * Analyse the input char. */ if (input_chr < 0x80) { desired_state = 0; c = input_chr; } else if (unicode_to_gb2312(input_chr, &r, &c)) { desired_state = 1; } else { return FALSE; } if (state->s0 != (unsigned)desired_state) { emit(emitctx, '~'); emit(emitctx, desired_state ? '{' : '}'); state->s0 = desired_state; } if (input_chr < 0) return TRUE; /* special case: just reset state */ if (state->s0) { /* * GB mode. */ emit(emitctx, 0x21 + r); emit(emitctx, 0x21 + c); } else { emit(emitctx, c); } return TRUE; } const charset_spec charset_CS_HZ = { CS_HZ, read_hz, write_hz, NULL }; #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_HZ) #endif /* ENUM_CHARSETS */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/internal.h����������������������������������������������������������������������0000644�0001753�0001753�00000010752�12444773746�013377� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * internal.h - internal header stuff for the charset library. */ #ifndef charset_internal_h #define charset_internal_h /* This invariably comes in handy */ #define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) /* This is an invalid Unicode value used to indicate an error. */ #define ERROR 0xFFFFL /* Unicode value representing error */ #undef TRUE #define TRUE 1 #undef FALSE #define FALSE 0 typedef struct charset_spec charset_spec; typedef struct sbcs_data sbcs_data; struct charset_spec { int charset; /* numeric identifier */ /* * A function to read the character set and output Unicode * characters. The `emit' function expects to get Unicode chars * passed to it; it should be sent ERROR for any encoding error * on the input. */ void (*read)(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx); /* * A function to read Unicode characters and output in this * character set. The `emit' function expects to get byte * values passed to it. * * A non-representable input character should cause a FALSE * return, _before_ `emit' is called. Successful conversion * causes a TRUE return. * * If `input_chr' is -1, this function must revert the encoding * state to any default required at the end of a piece of * encoded text. */ int (*write)(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx); void const *data; }; /* * This is the format of `data' used by the SBCS read and write * functions; so it's the format used in all SBCS definitions. */ struct sbcs_data { /* * This is a simple mapping table converting each SBCS position * to a Unicode code point. Some positions may contain ERROR, * indicating that that byte value is not defined in the SBCS * in question and its occurrence in input is an error. */ unsigned long sbcs2ucs[256]; /* * This lookup table is used to convert Unicode back to the * SBCS. It consists of the valid byte values in the SBCS, * sorted in order of their Unicode translation. So given a * Unicode value U, you can do a binary search on this table * using the above table as a lookup: when testing the Xth * position in this table, you branch according to whether * sbcs2ucs[ucs2sbcs[X]] is less than, greater than, or equal * to U. * * Note that since there may be fewer than 256 valid byte * values in a particular SBCS, we must supply the length of * this table as well as the contents. */ unsigned char ucs2sbcs[256]; int nvalid; }; /* * Prototypes for internal library functions. */ charset_spec const *charset_find_spec(int charset); void read_sbcs(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx); int write_sbcs(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx); long int sbcs_to_unicode(const struct sbcs_data *sd, long int input_chr); long int sbcs_from_unicode(const struct sbcs_data *sd, long int input_chr); void read_utf8(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx); int write_utf8(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx); long int big5_to_unicode(int r, int c); int unicode_to_big5(long int unicode, int *r, int *c); long int cns11643_to_unicode(int p, int r, int c); int unicode_to_cns11643(long int unicode, int *p, int *r, int *c); long int cp949_to_unicode(int r, int c); int unicode_to_cp949(long int unicode, int *r, int *c); long int ksx1001_to_unicode(int r, int c); int unicode_to_ksx1001(long int unicode, int *r, int *c); long int gb2312_to_unicode(int r, int c); int unicode_to_gb2312(long int unicode, int *r, int *c); long int jisx0208_to_unicode(int r, int c); int unicode_to_jisx0208(long int unicode, int *r, int *c); long int jisx0212_to_unicode(int r, int c); int unicode_to_jisx0212(long int unicode, int *r, int *c); /* * Placate compiler warning about unused parameters, of which we * expect to have some in this library. */ #define UNUSEDARG(x) ( (x) = (x) ) #endif /* charset_internal_h */ ����������������������halibut-1.1/charset/iso2022.c�����������������������������������������������������������������������0000644�0001753�0001753�00000125051�12444773746�012655� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * iso2022.c - support for ISO/IEC 2022 (alias ECMA-35). * * This isn't a complete implementation of ISO/IEC 2022, but it's * close. It can decode 8-bit and 7-bit versions, with support for * single-byte and multi-byte character sets, all four containers * (G0, G1, G2, and G3), using both single-shift and locking-shift * sequences. * * The general principle is that any valid ISO/IEC 2022 sequence * should either be correctly decoded or should emit an ERROR. The * only exception to this is that the C0 and C1 sets are fixed as * those of ISO/IEC 6429. Escape sequences for designating control * sets are passed through, so a post-processor could fix them up if * necessary. * * DOCS to UTF-8 works. Other DOCS sequences are ignored, which will * produce surprising results. */ #ifndef ENUM_CHARSETS #include <assert.h> #include <string.h> #include "charset.h" #include "internal.h" #include "sbcsdat.h" #define LS1 (0x0E) #define LS0 (0x0F) #define ESC (0x1B) #define SS2 (0x8E) #define SS3 (0x8F) enum {S4, S6, M4, M6}; static long int emacs_big5_1_to_unicode(int, int); static long int emacs_big5_2_to_unicode(int, int); static int unicode_to_emacs_big5(long int, int *, int *, int *); static long int cns11643_1_to_unicode(int, int); static long int cns11643_2_to_unicode(int, int); static long int cns11643_3_to_unicode(int, int); static long int cns11643_4_to_unicode(int, int); static long int cns11643_5_to_unicode(int, int); static long int cns11643_6_to_unicode(int, int); static long int cns11643_7_to_unicode(int, int); static long int null_dbcs_to_unicode(int, int); static int unicode_to_null_dbcs(long int, int *, int *); typedef int (*to_dbcs_t)(long int, int *, int *); typedef int (*to_dbcs_planar_t)(long int, int *, int *, int *); /* * These macros cast between to_dbcs_planar_t and to_dbcs_t, in * such a way as to cause a compile-time error if the input is not * of the appropriate type. * * Defining these portably is quite fiddly. My first effort was as * follows: * #define DEPLANARISE(x) ( (x) == (to_dbcs_planar_t)NULL, (to_dbcs_t)(x) ) * * so that the comparison on the left of the comma provokes the * type check error, and the cast on the right is the actual * desired result. * * gcc was entirely happy with this. However, when used in a static * initialiser, MSVC objected - justifiably - that the first half * of the comma expression wasn't constant and thus the expression * as a whole was not a constant expression. We can get round this * by enclosing the comparison in `sizeof', so that it isn't * actually evaluated. * * But then we run into a second problem, which is that C actually * disallows the use of the comma operator within a constant * expression for any purpose at all! Presumably this is on the * basis that its purpose is to have side effects and constant * expressions can't; unfortunately, this specific case is one in * which the desired side effect is a compile-time rather than a * run-time one. * * We are permitted to use ?:, however, and that works quite well * since the actual result of the sizeof expression _is_ evaluable * at compile time. So here's my final answer: */ #define TYPECHECK(x,y) ( sizeof((x)) == sizeof((x)) ? (y) : (y) ) #define DEPLANARISE(x) TYPECHECK((x) == (to_dbcs_planar_t)NULL, (to_dbcs_t)(x)) #define REPLANARISE(x) TYPECHECK((x) == (to_dbcs_t)NULL, (to_dbcs_planar_t)(x)) /* * Values used in the `enable' field. Each of these identifies a * class of character sets; we then have a bitmask indicating which * classes are allowable in a given mode. * * These values are currently only checked on output: for input, * any ISO 2022 we can comprehend at all is considered acceptable. */ #define CCS 1 /* CTEXT standard */ #define COS 2 /* other standard */ #define CPU 3 /* private use */ #define CDC 4 /* DOCS for CTEXT */ #define CDU 5 /* DOCS for UTF-8 */ #define CNU 31 /* never used */ struct iso2022_mode { int enable_mask; char ltype, li, lf, rtype, ri, rf; }; const struct iso2022_subcharset { char type, i, f, enable; int offset; const sbcs_data *sbcs_base; long int (*from_dbcs)(int, int); /* * If to_dbcs_plane < 0, then to_dbcs is used as expected. * However, if to_dbcs_plane >= 0, then to_dbcs is expected to * be cast to a to_dbcs_planar_t before use, and the returned * plane value (the first int *) must equal to_dbcs_plane. * * I'd have preferred to do this by means of a union, but you * can't initialise a selected field of a union at compile * time. Function pointer casts are guaranteed to work sensibly * in ISO C (that is, it's undefined what happens if you call a * function via the wrong type of pointer, but if you cast it * back to the right type before calling it then it must work), * so this is safe if ugly. */ to_dbcs_t to_dbcs; int to_dbcs_plane; /* use to_dbcs_planar iff >= 0 */ } iso2022_subcharsets[] = { /* * We list these subcharsets in preference order for output. * Since the best-defined use of ISO 2022 output is compound * text, we'll use a preference order which matches that. So we * begin with the charsets defined in the compound text spec. */ { S4, 0, 'B', CCS, 0x00, &sbcsdata_CS_ASCII, NULL, NULL, 0 }, { S6, 0, 'A', CCS, 0x80, &sbcsdata_CS_ISO8859_1, NULL, NULL, 0 }, { S6, 0, 'B', CCS, 0x80, &sbcsdata_CS_ISO8859_2, NULL, NULL, 0 }, { S6, 0, 'C', CCS, 0x80, &sbcsdata_CS_ISO8859_3, NULL, NULL, 0 }, { S6, 0, 'D', CCS, 0x80, &sbcsdata_CS_ISO8859_4, NULL, NULL, 0 }, { S6, 0, 'F', CCS, 0x80, &sbcsdata_CS_ISO8859_7, NULL, NULL, 0 }, { S6, 0, 'G', CCS, 0x80, &sbcsdata_CS_ISO8859_6, NULL, NULL, 0 }, { S6, 0, 'H', CCS, 0x80, &sbcsdata_CS_ISO8859_8, NULL, NULL, 0 }, { S6, 0, 'L', CCS, 0x80, &sbcsdata_CS_ISO8859_5, NULL, NULL, 0 }, { S6, 0, 'M', CCS, 0x80, &sbcsdata_CS_ISO8859_9, NULL, NULL, 0 }, { S4, 0, 'I', CCS, 0x80, &sbcsdata_CS_JISX0201, NULL, NULL, 0 }, { S4, 0, 'J', CCS, 0x00, &sbcsdata_CS_JISX0201, NULL, NULL, 0 }, { M4, 0, 'A', CCS, -0x21, 0, &gb2312_to_unicode, &unicode_to_gb2312, -1 }, { M4, 0, 'B', CCS, -0x21, 0, &jisx0208_to_unicode, &unicode_to_jisx0208, -1 }, { M4, 0, 'C', CCS, -0x21, 0, &ksx1001_to_unicode, &unicode_to_ksx1001, -1 }, { M4, 0, 'D', CCS, -0x21, 0, &jisx0212_to_unicode, &unicode_to_jisx0212, -1 }, /* * Next, other reasonably standard things: the rest of the ISO * 8859 sets, UK-ASCII, and CNS 11643. */ { S6, 0, 'T', COS, 0x80, &sbcsdata_CS_ISO8859_11, NULL, NULL, 0 }, { S6, 0, 'V', COS, 0x80, &sbcsdata_CS_ISO8859_10, NULL, NULL, 0 }, { S6, 0, 'Y', COS, 0x80, &sbcsdata_CS_ISO8859_13, NULL, NULL, 0 }, { S6, 0, '_', COS, 0x80, &sbcsdata_CS_ISO8859_14, NULL, NULL, 0 }, { S6, 0, 'b', COS, 0x80, &sbcsdata_CS_ISO8859_15, NULL, NULL, 0 }, { S6, 0, 'f', COS, 0x80, &sbcsdata_CS_ISO8859_16, NULL, NULL, 0 }, { S4, 0, 'A', COS, 0x00, &sbcsdata_CS_BS4730, NULL, NULL, 0 }, { M4, 0, 'G', COS, -0x21, 0, &cns11643_1_to_unicode, DEPLANARISE(&unicode_to_cns11643), 0 }, { M4, 0, 'H', COS, -0x21, 0, &cns11643_2_to_unicode, DEPLANARISE(&unicode_to_cns11643), 1 }, { M4, 0, 'I', COS, -0x21, 0, &cns11643_3_to_unicode, DEPLANARISE(&unicode_to_cns11643), 2 }, { M4, 0, 'J', COS, -0x21, 0, &cns11643_4_to_unicode, DEPLANARISE(&unicode_to_cns11643), 3 }, { M4, 0, 'K', COS, -0x21, 0, &cns11643_5_to_unicode, DEPLANARISE(&unicode_to_cns11643), 4 }, { M4, 0, 'L', COS, -0x21, 0, &cns11643_6_to_unicode, DEPLANARISE(&unicode_to_cns11643), 5 }, { M4, 0, 'M', COS, -0x21, 0, &cns11643_7_to_unicode, DEPLANARISE(&unicode_to_cns11643), 6 }, /* * Private-use designations: DEC private sets and Emacs's Big5 * abomination. */ { S4, 0, '0', CPU, 0x00, &sbcsdata_CS_DEC_GRAPHICS, NULL, NULL, 0 }, { S4, 0, '<', CPU, 0x80, &sbcsdata_CS_DEC_MCS, NULL, NULL, 0 }, { M4, 0, '0', CPU, -0x21, 0, &emacs_big5_1_to_unicode, DEPLANARISE(&unicode_to_emacs_big5), 1 }, { M4, 0, '1', CPU, -0x21, 0, &emacs_big5_2_to_unicode, DEPLANARISE(&unicode_to_emacs_big5), 2 }, /* * Ben left this conditioned out without explanation, * presumably on the grounds that we don't have a translation * table for it. */ #if 0 { M4, 0, '@', CNU }, /* JIS C 6226-1978 */ #endif /* * Finally, fallback entries for null character sets. */ { S4, 0, '~', CNU, 0, NULL, NULL, NULL, 0 }, { S6, 0, '~', CNU, 0, NULL, NULL, NULL, 0 }, /* empty 96-set */ { M4, 0, '~', CNU, 0, 0, &null_dbcs_to_unicode, &unicode_to_null_dbcs, -1 }, /* empty 94^n-set */ { M6, 0, '~', CNU, 0, 0, &null_dbcs_to_unicode, &unicode_to_null_dbcs, -1 }, /* empty 96^n-set */ }; static long int null_dbcs_to_unicode(int r, int c) { UNUSEDARG(r); UNUSEDARG(c); return ERROR; } static int unicode_to_null_dbcs(long int unicode, int *r, int *c) { UNUSEDARG(unicode); UNUSEDARG(r); UNUSEDARG(c); return 0; /* failed to convert anything */ } /* * Emacs encodes Big5 in COMPOUND_TEXT as two 94x94 character sets. * We treat Big5 as a 94x191 character set with a bunch of undefined * columns in the middle, so we have to mess around a bit to make * things fit. */ static long int emacs_big5_1_to_unicode(int r, int c) { unsigned long s; s = r * 94 + c; r = s / 157; c = s % 157; if (c >= 64) c += 34; /* Skip over the gap */ return big5_to_unicode(r, c); } static long int emacs_big5_2_to_unicode(int r, int c) { unsigned long s; s = r * 94 + c; r = s / 157 + 40; c = s % 157; if (c >= 64) c += 34; /* Skip over the gap */ return big5_to_unicode(r, c); } static int unicode_to_emacs_big5(long int unicode, int *p, int *r, int *c) { int rr, cc, s; if (!unicode_to_big5(unicode, &rr, &cc)) return 0; if (cc >= 64) { cc -= 34; assert(cc >= 64); } s = rr * 157 + cc; if (s >= 40*157) { *p = 2; s -= 40*157; } else { *p = 1; } *r = s / 94; *c = s % 94; return 1; } /* Wrappers for cns11643_to_unicode() */ static long int cns11643_1_to_unicode(int r, int c) { return cns11643_to_unicode(0, r, c); } static long int cns11643_2_to_unicode(int r, int c) { return cns11643_to_unicode(1, r, c); } static long int cns11643_3_to_unicode(int r, int c) { return cns11643_to_unicode(2, r, c); } static long int cns11643_4_to_unicode(int r, int c) { return cns11643_to_unicode(3, r, c); } static long int cns11643_5_to_unicode(int r, int c) { return cns11643_to_unicode(4, r, c); } static long int cns11643_6_to_unicode(int r, int c) { return cns11643_to_unicode(5, r, c); } static long int cns11643_7_to_unicode(int r, int c) { return cns11643_to_unicode(6, r, c); } /* States, or "what we're currently accumulating". */ enum { IDLE, /* None of the below */ SS2CHAR, /* Accumulating a character after SS2 */ SS3CHAR, /* Accumulating a character after SS3 */ ESCSEQ, /* Accumulating an escape sequence */ ESCDROP, /* Discarding an escape sequence */ ESCPASS, /* Passing through an escape sequence */ DOCSUTF8, /* DOCSed into UTF-8 */ DOCSCTEXT /* DOCSed into a COMPOUND_TEXT extended segment */ }; #if 0 #include <stdio.h> static void dump_state(charset_state *s) { unsigned s0 = s->s0, s1 = s->s1; char const * const modes[] = { "IDLE", "SS2CHAR", "SS3CHAR", "ESCSEQ", "ESCDROP", "ESCPASS", "DOCSUTF8" }; fprintf(stderr, "s0: %s", modes[s0 >> 29]); fprintf(stderr, " %02x %02x %02x ", (s0 >> 16) & 0xff, (s0 >> 8) & 0xff, s0 & 0xff); fprintf(stderr, "s1: LS%d LS%dR", (s1 >> 30) & 3, (s1 >> 28) & 3); fprintf(stderr, " %d %d %d %d\n", s1 & 0x7f, (s1 >> 7) & 0x7f, (s1 >> 14) & 0x7f, (s1 >> 21) & 0x7f); } #endif static void designate(charset_state *state, int container, int type, int ibyte, int fbyte) { unsigned long i; assert(container >= 0 && container <= 3); assert(type == S4 || type == S6 || type == M4 || type == M6); for (i = 0; i < lenof(iso2022_subcharsets); i++) { if (iso2022_subcharsets[i].type == type && iso2022_subcharsets[i].i == ibyte && iso2022_subcharsets[i].f == fbyte) { state->s1 &= ~(0x7fL << (container * 7)); state->s1 |= (i << (container * 7)); return; } } /* * If we don't find the charset, invoke the empty one, so we * output ERROR rather than garbage. */ designate(state, container, type, 0, '~'); } static void do_utf8(long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { charset_state ustate; ustate.s1 = 0; ustate.s0 = state->s0 & 0x03ffffffL; read_utf8(NULL, input_chr, &ustate, emit, emitctx); state->s0 = (state->s0 & ~0x03ffffffL) | (ustate.s0 & 0x03ffffffL); } static void docs_utf8(long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { int retstate; /* * Bits [25:0] of s0 are reserved for read_utf8(). * Bits [27:26] are a tiny state machine to recognise ESC % @. */ retstate = (state->s0 & 0x0c000000L) >> 26; if (retstate == 1 && input_chr == '%') retstate = 2; else if (retstate == 2 && input_chr == '@') { /* If we've got a partial UTF-8 sequence, complain. */ if (state->s0 & 0x03ffffffL) emit(emitctx, ERROR); state->s0 = 0; return; } else { if (retstate >= 1) do_utf8(ESC, state, emit, emitctx); if (retstate >= 2) do_utf8('%', state, emit, emitctx); retstate = 0; if (input_chr == ESC) retstate = 1; else { do_utf8(input_chr, state, emit, emitctx); } } state->s0 = (state->s0 & ~0x0c000000L) | (retstate << 26); } struct ctext_encoding { char const *name; char octets_per_char, enable; charset_spec const *subcs; }; /* * In theory, this list is in <ftp://ftp.x.org/pub/DOCS/registry>, * but XLib appears to have its own ideas, and encodes these three * (as of X11R6.8.2) */ extern charset_spec const charset_CS_ISO8859_14; extern charset_spec const charset_CS_ISO8859_15; extern charset_spec const charset_CS_BIG5; static struct ctext_encoding const ctext_encodings[] = { { "big5-0\2", 0 /* variable */, CDC, &charset_CS_BIG5 }, { "iso8859-14\2", 1, CDC, &charset_CS_ISO8859_14 }, { "iso8859-15\2", 1, CDC, &charset_CS_ISO8859_15 } }; static void docs_ctext(long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { /* * s0[27:26] = first entry in ctext_encodings that matches * s0[25:22] = number of characters successfully matched, 0xf if all * s0[21:8] count the number of octets left in the segment * s0[7:0] are for sub-charset use */ int n = (state->s0 >> 22) & 0xf, i = (state->s0 >> 26) & 3, oi = i, j; int length = (state->s0 >> 8) & 0x3fff; /* * Note that we do not bother checking the octets-per-character * byte against the selected charset when reading. It's * extremely unlikely that this code will ever have to deal * with two charset identifiers with the same name and * different octets-per-character values! If it ever happens, * we'll have to edit this file anyway so we can modify the * code then... */ if (!length) { /* Haven't read length yet */ if ((state->s0 & 0xff) == 0) /* ... or even the first byte */ state->s0 |= input_chr; else { length = (state->s0 & 0x7f) * 0x80 + (input_chr & 0x7f); if (length == 0) state->s0 = 0; else state->s0 = (state->s0 & 0xf0000000) | (length << 8); } return; } j = i; if (n == 0xe) { /* Skipping unknown encoding. Look out for STX. */ if (input_chr == 2) state->s0 = (state->s0 & 0xf0000000) | (i << 26) | (0xf << 22); } else if (n != 0xf) { while ((unsigned)j < lenof(ctext_encodings) && !memcmp(ctext_encodings[j].name, ctext_encodings[oi].name, n)) { if (ctext_encodings[j].name[n] < input_chr) i = ++j; else break; } if ((unsigned)i >= lenof(ctext_encodings) || memcmp(ctext_encodings[i].name, ctext_encodings[oi].name, n) || ctext_encodings[i].name[n] != input_chr) { /* Doom! We haven't heard of this encoding */ i = lenof(ctext_encodings); n = 0xe; } else { /* * Otherwise, we have found an additional character in our * encoding name. See if we have reached the _end_ of our * name. */ n++; if (!ctext_encodings[i].name[n]) n = 0xf; } /* * Failing _that_, we simply update our encoding-name- * tracking state. */ assert(i < 4 && n < 16); state->s0 = (state->s0 & 0xf0000000) | (i << 26) | (n << 22); } else { if ((unsigned)i >= lenof(ctext_encodings)) emit(emitctx, ERROR); else { charset_state substate; charset_spec const *subcs = ctext_encodings[i].subcs; substate.s1 = 0; substate.s0 = state->s0 & 0xff; subcs->read(subcs, input_chr, &substate, emit, emitctx); state->s0 = (state->s0 & ~0xff) | (substate.s0 & 0xff); } } if (!--length) state->s0 = 0; else state->s0 = (state->s0 &~0x003fff00) | (length << 8); } static void read_iso2022(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { struct iso2022_mode const *mode = (struct iso2022_mode *)charset->data; /* dump_state(state); */ /* * We have to make fairly efficient use of the 64 bits of state * available to us. Long-term state goes in s1, and consists of * the identities of the character sets designated as G0/G1/G2/G3 * and the locking-shift states for GL and GR. Short-term state * goes in s0: The bottom half of s0 accumulates characters for an * escape sequence or a multi-byte character, while the top three * bits indicate what they're being accumulated for. After DOCS, * the bottom 29 bits of state are available for the DOCS function * to use -- the UTF-8 one uses the bottom 26 for UTF-8 decoding * and the top two to recognised ESC % @. * * s0[31:29] = state enum * s0[24:0] = accumulated bytes * s1[31:30] = GL locking-shift state * s1[29:28] = GR locking-shift state * s1[27:21] = G3 charset * s1[20:14] = G2 charset * s1[13:7] = G1 charset * s1[6:0] = G0 charset */ #define LEFT 30 #define RIGHT 28 #define LOCKING_SHIFT(n,side) \ (state->s1 = (state->s1 & ~(3UL<<(side))) | ((n ## UL)<<(side))) #define MODE ((state->s0 & 0xe0000000UL) >> 29) #define ENTER_MODE(m) (state->s0 = (state->s0 & ~0xe0000000UL) | ((unsigned long)(m)<<29)) #define SINGLE_SHIFT(n) ENTER_MODE(SS2CHAR - 2 + (n)) #define ASSERT_IDLE do { \ if (state->s0 != 0) emit(emitctx, ERROR); \ state->s0 = 0; \ } while (0) if (state->s1 == 0) { /* * Since there's no LS0R, this means we must just have started. * Set up a sane initial state (LS0, LS1R, ASCII in G0/G1/G2/G3). */ LOCKING_SHIFT(0, LEFT); LOCKING_SHIFT(1, RIGHT); designate(state, 0, mode->ltype, mode->li, mode->lf); designate(state, 1, mode->rtype, mode->ri, mode->rf); designate(state, 2, S4, 0, 'B'); designate(state, 3, S4, 0, 'B'); } if (MODE == DOCSUTF8) { docs_utf8(input_chr, state, emit, emitctx); return; } if (MODE == DOCSCTEXT) { docs_ctext(input_chr, state, emit, emitctx); return; } if ((input_chr & 0x60) == 0x00) { /* C0 or C1 control */ ASSERT_IDLE; switch (input_chr) { case ESC: ENTER_MODE(ESCSEQ); break; case LS0: LOCKING_SHIFT(0, LEFT); break; case LS1: LOCKING_SHIFT(1, LEFT); break; case SS2: SINGLE_SHIFT(2); break; case SS3: SINGLE_SHIFT(3); break; default: emit(emitctx, input_chr); break; } } else if ((input_chr & 0x80) || MODE < ESCSEQ) { int is_gl = 0; struct iso2022_subcharset const *subcs; unsigned container; long input_7bit; /* * Actual data. * Force idle state if we're in mid escape sequence, or in a * multi-byte character with a different top bit. */ if (MODE >= ESCSEQ || ((state->s0 & 0x00ff0000L) != 0 && (((state->s0 >> 16) ^ input_chr) & 0x80))) ASSERT_IDLE; if (MODE == SS2CHAR || MODE == SS3CHAR) /* Single-shift */ container = MODE - SS2CHAR + 2; else if (input_chr >= 0x80) /* GR */ container = (state->s1 >> 28) & 3; else { /* GL */ container = state->s1 >> 30; is_gl = 1; } input_7bit = input_chr & ~0x80; subcs = &iso2022_subcharsets[(state->s1 >> (container * 7)) & 0x7f]; if ((subcs->type == S4 || subcs->type == M4) && (input_7bit == 0x20 || input_7bit == 0x7f)) { /* characters not in 94-char set */ if (is_gl) emit(emitctx, input_7bit); else emit(emitctx, ERROR); } else if (subcs->type == M4 || subcs->type == M6) { if ((state->s0 & 0x00ff0000L) == 0) { state->s0 |= input_chr << 16; return; } else { emit(emitctx, subcs->from_dbcs(((state->s0 >> 16) & 0x7f) + subcs->offset, input_7bit + subcs->offset)); } } else { if ((state->s0 & 0x00ff0000L) != 0) emit(emitctx, ERROR); emit(emitctx, subcs->sbcs_base ? sbcs_to_unicode(subcs->sbcs_base, input_7bit + subcs->offset): ERROR); } state->s0 = 0; } else { unsigned i1, i2; if (MODE == ESCPASS) { emit(emitctx, input_chr); if ((input_chr & 0xf0) != 0x20) ENTER_MODE(IDLE); return; } /* * Intermediate bytes shall be any of the 16 positions of * column 02 of the code table; they are denoted by the symbol * I. */ if ((input_chr & 0xf0) == 0x20) { if (((state->s0 >> 16) & 0xff) == 0) state->s0 |= input_chr << 16; else if (((state->s0 >> 8) & 0xff) == 0) state->s0 |= input_chr << 8; else { /* Long escape sequence. Switch to ESCPASS or ESCDROP. */ i1 = (state->s0 >> 16) & 0xff; i2 = (state->s0 >> 8) & 0xff; switch (i1) { case '(': case ')': case '*': case '+': case '-': case '.': case '/': case '$': ENTER_MODE(ESCDROP); break; default: emit(emitctx, ESC); emit(emitctx, i1); emit(emitctx, i2); emit(emitctx, input_chr); state->s0 = 0; ENTER_MODE(ESCPASS); break; } } return; } /* * Final bytes shall be any of the 79 positions of columns 03 * to 07 of the code table excluding position 07/15; they are * denoted by the symbol F. */ i1 = (state->s0 >> 16) & 0xff; i2 = (state->s0 >> 8) & 0xff; if (MODE == ESCDROP) input_chr = 0; /* Make sure it won't match. */ state->s0 = 0; switch (i1) { case 0: /* No intermediate bytes */ switch (input_chr) { case 'N': /* SS2 */ SINGLE_SHIFT(2); break; case 'O': /* SS3 */ SINGLE_SHIFT(3); break; case 'n': /* LS2 */ LOCKING_SHIFT(2, LEFT); break; case 'o': /* LS3 */ LOCKING_SHIFT(3, LEFT); break; case '|': /* LS3R */ LOCKING_SHIFT(3, RIGHT); break; case '}': /* LS2R */ LOCKING_SHIFT(2, RIGHT); break; case '~': /* LS1R */ LOCKING_SHIFT(1, RIGHT); break; default: /* Unsupported escape sequence. Spit it back out. */ emit(emitctx, ESC); emit(emitctx, input_chr); } break; case ' ': /* ACS */ /* * Various coding structure facilities specify that designating * a code element also invokes it. As far as I can see, invoking * it now will have the same practical effect, since those * facilities also ban the use of locking shifts. */ switch (input_chr) { case 'A': /* G0 element used and invoked into GL */ LOCKING_SHIFT(0, LEFT); break; case 'C': /* G0 in GL, G1 in GR */ case 'D': /* Ditto, at least for 8-bit codes */ case 'L': /* ISO 4873 (ECMA-43) level 1 */ case 'M': /* ISO 4873 (ECMA-43) level 2 */ LOCKING_SHIFT(0, LEFT); LOCKING_SHIFT(1, RIGHT); break; } break; case '&': /* IRR */ /* * IRR (Identify Revised Registration) is ignored here, * since any revised registration must be * upward-compatible with the old one, so either we'll * support the new one or we'll emit ERROR when we run * into a new character. In either case, there's nothing * to be done here. */ break; case '(': /* GZD4 */ case ')': /* G1D4 */ case '*': /* G2D4 */ case '+': /* G3D4 */ designate(state, i1 - '(', S4, i2, input_chr); break; case '-': /* G1D6 */ case '.': /* G2D6 */ case '/': /* G3D6 */ designate(state, i1 - ',', S6, i2, input_chr); break; case '$': /* G?DM? */ switch (i2) { case 0: /* Obsolete version of GZDM4 */ i2 = '('; case '(': /* GZDM4 */ case ')': /* G1DM4 */ case '*': /* G2DM4 */ case '+': /* G3DM4 */ designate(state, i2 - '(', M4, 0, input_chr); break; case '-': /* G1DM6 */ case '.': /* G2DM6 */ case '/': /* G3DM6 */ designate(state, i2 - ',', M6, 0, input_chr); break; default: emit(emitctx, ERROR); break; } case '%': /* DOCS */ /* XXX What's a reasonable way to handle an unrecognised DOCS? */ switch (i2) { case 0: switch (input_chr) { case 'G': ENTER_MODE(DOCSUTF8); break; } break; case '/': switch (input_chr) { case '1': case '2': ENTER_MODE(DOCSCTEXT); break; } break; } break; default: /* Unsupported nF escape sequence. Re-emit it. */ emit(emitctx, ESC); emit(emitctx, i1); if (i2) emit(emitctx, i2); emit(emitctx, input_chr); break; } } } static void oselect(charset_state *state, int i, int right, void (*emit)(void *ctx, long int output), void *emitctx) { int shift = (right ? 31-7 : 31-7-7); struct iso2022_subcharset const *subcs = &iso2022_subcharsets[i]; if (((state->s1 >> shift) & 0x7F) != (unsigned)i) { state->s1 &= ~(0x7FL << shift); state->s1 |= (i << shift); if (emit) { emit(emitctx, ESC); if (subcs->type == M4 || subcs->type == M6) emit(emitctx, '$'); if (subcs->type == S6 || subcs->type == M6) { assert(right); emit(emitctx, '-'); } else if (right) { emit(emitctx, ')'); } else { emit(emitctx, '('); } if (subcs->i) emit(emitctx, subcs->i); emit(emitctx, subcs->f); } } } static void docs_char(charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx, int cset, char *data, int datalen) { int curr_cset, currlen, i; /* * cset is the index into ctext_encodings[]. It can also be -1 * to mean DOCS UTF-8, or -2 to mean no DOCS (ordinary 2022). * In the latter case, `chr' is ignored. */ /* * First, terminate a DOCS segment if necessary. We always have * to terminate a DOCS segment if one is active and we're about * to switch to a different one; we might also have to * terminate a length-encoded DOCS segment if we've run out of * storage space to accumulate characters in it. */ curr_cset = ((state->s1 >> 14) & 7) - 2; currlen = ((state->s1 >> 11) & 7); if ((curr_cset != -2 && curr_cset != cset) || (curr_cset >= 0 && currlen + datalen > 5)) { if (curr_cset == -1) { /* * Terminating DOCS UTF-8 is easy. */ emit(emitctx, ESC); emit(emitctx, '%'); emit(emitctx, '@'); } else { int len; /* * To terminate a length-encoded DOCS segment we must * actually output the whole thing. */ emit(emitctx, ESC); emit(emitctx, '%'); emit(emitctx, '/'); emit(emitctx, '0' + ctext_encodings[curr_cset].octets_per_char); len = currlen + datalen + strlen(ctext_encodings[curr_cset].name); assert(len < (1 << 14)); emit(emitctx, 0x80 | ((len >> 7) & 0x7F)); emit(emitctx, 0x80 | ((len ) & 0x7F)); /* The name stored in ctext_encodings[] includes the trailing \2 */ for (i = 0; ctext_encodings[curr_cset].name[i]; i++) emit(emitctx, ctext_encodings[curr_cset].name[i]); for (i = 0; i < currlen; i++) emit(emitctx, (i == 0 ? state->s1 : state->s0 >> (8*(4-i))) & 0xFF); for (i = 0; i < datalen; i++) emit(emitctx, data[i]); /* * We've now dealt with the input data, so clear it so * we don't try to do so again below. */ datalen = 0; } curr_cset = -2; } /* * Now, start a DOCS segment if necessary. */ if (curr_cset != cset) { assert(cset != -2); if (cset == -1) { /* * Start DOCS UTF-8. */ emit(emitctx, ESC); emit(emitctx, '%'); emit(emitctx, 'G'); } else { /* * Starting a length-encoded DOCS segment is simply a * matter of setting our stored length counter to zero. */ currlen = 0; state->s1 &= ~(7 << 11); state->s1 &= ~0xFF; state->s0 = 0; } } state->s1 &= ~(7 << 14); assert((cset+2) >= 0 && (cset+2) < 8); state->s1 |= ((cset+2) << 14); /* * Now we're in the right DOCS state. Actually deal with the * input data, if we haven't already done so above. */ if (datalen > 0) { assert(cset != 2); if (cset == -1) { /* * In DOCS UTF-8, we output data as soon as we get it. */ for (i = 0; i < datalen; i++) emit(emitctx, data[i]); } else { /* * In length-encoded DOCS, we just store our data and * bide our time. It'll all be output when we fill up * or switch to another character set. */ assert(currlen + datalen <= 5); /* overflow handled already */ for (i = 0; i < datalen; i++) { if (currlen + i == 0) state->s1 |= data[i] & 0xFF; else state->s0 |= (data[i] & 0xFF) << (8*(4-(currlen+i))); } currlen += datalen; assert(currlen >= 0 && currlen < 8); state->s1 &= ~(7 << 11); state->s1 |= (currlen << 11); } } } static void write_to_pointer(void *ctx, long int output) { char **ptr = (char **)ctx; *(*ptr)++ = output; } /* * Writing full ISO-2022 is not useful in very many circumstances. * One of the few situations in which it _is_ useful is generating * X11 COMPOUND_TEXT; therefore, this writing function will obey * the compound text restrictions and hence output the subset of * ISO-2022 that's usable in that context. * * The subset in question is roughly that we use GL/GR for G0/G1 * always, and that the _only_ escape sequences we output (other * than the occasional DOCS) are those which designate different * subcharsets into G0 and G1. There are additional constraints * about which things go in which container; see below. * * FIXME: this wants some decent tests to be written, and also the * exact output policy for compound text wants thinking about more * carefully. */ static int write_iso2022(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { int i; struct iso2022_subcharset const *subcs; struct iso2022_mode const *mode = (struct iso2022_mode *)charset->data; to_dbcs_planar_t last_planar_dbcs = NULL; int last_p, last_r, last_c; long int c1, c2; /* * For output, I allocate the state variables as follows: * * s1[31] == 1 if output state has been initialised * s1[30:24] == G1 charset (always in GR) * s1[23:17] == G0 charset (always in GL) * s1[16:14] == DOCS index plus 2 (because -1 and -2 are special) * s1[13:11] == number of DOCS accumulated characters (up to five) * s1[7:0] + s0[31:0] == DOCS collected characters */ if (!state->s1) { state->s0 = 0x00000000UL; state->s1 = 0x80000000UL; /* * Start with US-ASCII in GL and also in GR. */ for (i = 0; (unsigned)i < lenof(iso2022_subcharsets); i++) { subcs = &iso2022_subcharsets[i]; if (subcs->type == mode->ltype && subcs->i == mode->li && subcs->f == mode->lf) oselect(state, i, FALSE, NULL, NULL); if (subcs->type == mode->rtype && subcs->i == mode->ri && subcs->f == mode->rf) oselect(state, i, TRUE, NULL, NULL); } } if (input_chr == -1) { /* * Special case: reset encoding state. */ docs_char(state, emit, emitctx, -2, NULL, 0); /* leave DOCS */ for (i = 0; (unsigned)i < lenof(iso2022_subcharsets); i++) { subcs = &iso2022_subcharsets[i]; if (subcs->type == mode->ltype && subcs->i == mode->li && subcs->f == mode->lf) oselect(state, i, FALSE, emit, emitctx); if (subcs->type == mode->rtype && subcs->i == mode->ri && subcs->f == mode->rf) oselect(state, i, TRUE, emit, emitctx); } return TRUE; } /* * Special-case characters: Space, Delete, and anything in C0 * or C1 are output unchanged. */ if (input_chr <= 0x20 || (input_chr >= 0x7F && input_chr < 0xA0)) { emit(emitctx, input_chr); return TRUE; } /* * Analyse the input character and work out which subcharset it * belongs to. */ for (i = 0; (unsigned)i < lenof(iso2022_subcharsets); i++) { subcs = &iso2022_subcharsets[i]; if (!(mode->enable_mask & (1 << subcs->enable))) continue; /* this charset is disabled */ if (subcs->sbcs_base) { c1 = sbcs_from_unicode(subcs->sbcs_base, input_chr); c1 -= subcs->offset; if (c1 >= 0x20 && c1 <= 0x7f) { c2 = 0; break; } } else if (subcs->to_dbcs) { if (subcs->to_dbcs_plane >= 0) { /* * Since multiplanar DBCSes almost by definition * involve several entries in iso2022_subcharsets * with the same to_dbcs function and different * plane values, we remember the last such function * we called and what its result was, so that we * don't (for example) have to call * unicode_to_cns11643 seven times. */ if (last_planar_dbcs != REPLANARISE(subcs->to_dbcs)) { last_planar_dbcs = REPLANARISE(subcs->to_dbcs); if (!last_planar_dbcs(input_chr, &last_p, &last_r, &last_c)) last_p = -1; } } else { last_p = subcs->to_dbcs_plane; if (!subcs->to_dbcs(input_chr, &last_r, &last_c)) last_p = 0; /* cannot match since to_dbcs_plane<0 */ } if (last_p == subcs->to_dbcs_plane) { c1 = last_r - subcs->offset; c2 = last_c - subcs->offset; assert(c1 >= 0x20 && c1 <= 0x7f); assert(c2 >= 0x20 && c2 <= 0x7f); break; } } } if ((unsigned)i < lenof(iso2022_subcharsets)) { int right; /* * Our character is represented by c1 (and possibly also * c2) in subcharset `subcs'. So now we must decide whether * to designate that character set into G0/GL or G1/GR. * * Any S6 or M6 subcharset has to go in GR because it won't * fit in GL. In addition, the compound text rules state * that any single-byte subcharset defined as the * right-hand half of some SBCS must go in GR. * * M4 subcharsets can go in either half according to the * rules. I choose to put them in GR always because it's a * simple policy with reasonable behaviour (facilitates * switching between them and ASCII). */ right = (subcs->type == S6 || subcs->type == M6 || subcs->type == M4 || (subcs->sbcs_base && subcs->offset == 0x80)); /* * If we're in a DOCS mode, leave it. */ docs_char(state, emit, emitctx, -2, NULL, 0); /* * If this subcharset is not already selected in that * container, select it. */ oselect(state, i, right, emit, emitctx); /* * Now emit the actual characters. */ if (right) { assert(c1 >= 0x20 && c1 <= 0x7f); emit(emitctx, c1 | 0x80); if (c2) { assert(c2 >= 0x20 && c2 <= 0x7f); emit(emitctx, c2 | 0x80); } } else { assert(c1 > 0x20 && c1 < 0x7f); emit(emitctx, c1); if (c2) { assert(c2 > 0x20 && c2 < 0x7f); emit(emitctx, c2); } } return TRUE; } /* * Fall back to DOCS. */ { char data[10]; char *p = data; int i, cs; cs = -2; /* means failure */ for (i = 0; (unsigned)i <= lenof(ctext_encodings); i++) { charset_state substate; charset_spec const *subcs = ctext_encodings[i].subcs; /* * We assume that all character sets dealt with by DOCS * are stateless for output purposes. */ substate.s1 = substate.s0 = 0; p = data; if ((unsigned)i < lenof(ctext_encodings)) { if ((mode->enable_mask & (1 << ctext_encodings[i].enable)) && subcs->write(subcs, input_chr, &substate, write_to_pointer, &p)) { cs = i; break; } } else { if ((mode->enable_mask & (1 << CDU)) && write_utf8(NULL, input_chr, NULL, write_to_pointer, &p)) { cs = -1; break; } } } if (cs != -2) { docs_char(state, emit, emitctx, cs, data, p - data); return TRUE; } } return FALSE; } /* * Full ISO 2022 output with all options on. Not entirely sure what * if anything this is useful for, but here it is anyway. All * output character sets and DOCS variants are permitted; all * containers start out with ASCII in them. */ static const struct iso2022_mode iso2022_all = { (1<<CCS) | (1<<COS) | (1<<CPU) | (1<<CDC) | (1<<CDU), S4, 0, 'B', S4, 0, 'B', }; const charset_spec charset_CS_ISO2022 = { CS_ISO2022, read_iso2022, write_iso2022, &iso2022_all }; /* * X11 compound text. A subset of output charsets is permitted, and * G1/GR starts off in ISO8859-1. */ static const struct iso2022_mode iso2022_ctext = { (1<<CCS) | (1<<CDC), S4, 0, 'B', S6, 0, 'A', }; const charset_spec charset_CS_CTEXT = { CS_CTEXT, read_iso2022, write_iso2022, &iso2022_ctext }; #ifdef TESTMODE #include <stdio.h> #include <stdarg.h> #include <string.h> int total_errs = 0; void iso2022_emit(void *ctx, long output) { wchar_t **p = (wchar_t **)ctx; *(*p)++ = output; } void iso2022_read_test(int line, char *input, int inlen, ...) { va_list ap; wchar_t *p, str[512]; int i; charset_state state; unsigned long l; state.s0 = state.s1 = 0; p = str; for (i = 0; i < inlen; i++) read_iso2022(NULL, input[i] & 0xFF, &state, iso2022_emit, &p); va_start(ap, inlen); l = 0; for (i = 0; i < p - str; i++) { l = va_arg(ap, long int); if (l == -1) { printf("%d: correct string shorter than output\n", line); total_errs++; break; } if (l != str[i]) { printf("%d: char %d came out as %08x, should be %08lx\n", line, i, str[i], l); total_errs++; } } if (l != -1) { l = va_arg(ap, long int); if (l != -1) { printf("%d: correct string longer than output\n", line); total_errs++; } } va_end(ap); } /* Macro to concoct the first three parameters of iso2022_read_test. */ #define TESTSTR(x) __LINE__, x, lenof(x) int main(void) { printf("read tests beginning\n"); /* Simple test (Emacs sample text for Japanese, in ISO-2022-JP) */ iso2022_read_test(TESTSTR("Japanese (\x1b$BF|K\\8l\x1b(B)\t" "\x1b$B$3$s$K$A$O\x1b(B, " "\x1b$B%3%s%K%A%O\x1b(B\n"), 'J','a','p','a','n','e','s','e',' ','(', 0x65E5, 0x672C, 0x8A9E, ')', '\t', 0x3053, 0x3093, 0x306b, 0x3061, 0x306f, ',', ' ', 0x30b3, 0x30f3, 0x30cb, 0x30c1, 0x30cf, '\n', 0, -1); /* Same thing in EUC-JP (with designations, and half-width katakana) */ iso2022_read_test(TESTSTR("\x1b$)B\x1b*I\x1b$+D" "Japanese (\xc6\xfc\xcb\xdc\xb8\xec)\t" "\xa4\xb3\xa4\xf3\xa4\xcb\xa4\xc1\xa4\xcf, " "\x8e\xba\x8e\xdd\x8e\xc6\x8e\xc1\x8e\xca\n"), 'J','a','p','a','n','e','s','e',' ','(', 0x65E5, 0x672C, 0x8A9E, ')', '\t', 0x3053, 0x3093, 0x306b, 0x3061, 0x306f, ',', ' ', 0xff7a, 0xff9d, 0xff86, 0xff81, 0xff8a, '\n', 0, -1); /* Multibyte single-shift */ iso2022_read_test(TESTSTR("\x1b$)B\x1b*I\x1b$+D\x8f\"/!"), 0x02D8, '!', 0, -1); /* Non-existent SBCS */ iso2022_read_test(TESTSTR("\x1b(!Zfnord\n"), ERROR, ERROR, ERROR, ERROR, ERROR, '\n', 0, -1); /* Pass-through of ordinary escape sequences, including a long one */ iso2022_read_test(TESTSTR("\x1b""b\x1b#5\x1b#!!!5"), 0x1B, 'b', 0x1B, '#', '5', 0x1B, '#', '!', '!', '!', '5', 0, -1); /* Non-existent DBCS (also 5-byte escape sequence) */ iso2022_read_test(TESTSTR("\x1b$(!Bfnord!"), ERROR, ERROR, ERROR, 0, -1); /* Incomplete DB characters */ iso2022_read_test(TESTSTR("\x1b$B(,(\x1b(BHi\x1b$B(,(\n"), 0x2501, ERROR, 'H', 'i', 0x2501, ERROR, '\n', 0, -1); iso2022_read_test(TESTSTR("\x1b$)B\x1b*I\x1b$+D\xa4""B"), ERROR, 'B', 0, -1); iso2022_read_test(TESTSTR("\x1b$)B\x1b*I\x1b$+D\x0e\x1b|$\xa2\xaf"), ERROR, 0x02D8, 0, -1); /* Incomplete escape sequence */ iso2022_read_test(TESTSTR("\x1b\n"), ERROR, '\n', 0, -1); iso2022_read_test(TESTSTR("\x1b-A\x1b~\x1b\xa1"), ERROR, 0xa1, 0, -1); /* Incomplete single-shift */ iso2022_read_test(TESTSTR("\x8e\n"), ERROR, '\n', 0, -1); iso2022_read_test(TESTSTR("\x1b$*B\x8e(\n"), ERROR, '\n', 0, -1); /* Corner cases (02/00 and 07/15) */ iso2022_read_test(TESTSTR("\x1b(B\x20\x7f"), 0x20, 0x7f, 0, -1); iso2022_read_test(TESTSTR("\x1b(I\x20\x7f"), 0x20, 0x7f, 0, -1); iso2022_read_test(TESTSTR("\x1b$B\x20\x7f"), 0x20, 0x7f, 0, -1); iso2022_read_test(TESTSTR("\x1b-A\x0e\x20\x7f"), 0xa0, 0xff, 0, -1); iso2022_read_test(TESTSTR("\x1b$-~\x0e\x20\x7f"), ERROR, 0, -1); iso2022_read_test(TESTSTR("\x1b)B\xa0\xff"), ERROR, ERROR, 0, -1); iso2022_read_test(TESTSTR("\x1b)I\xa0\xff"), ERROR, ERROR, 0, -1); iso2022_read_test(TESTSTR("\x1b$)B\xa0\xff"), ERROR, ERROR, 0, -1); iso2022_read_test(TESTSTR("\x1b-A\x1b~\xa0\xff"), 0xa0, 0xff, 0, -1); iso2022_read_test(TESTSTR("\x1b$-~\x1b~\xa0\xff"), ERROR, 0, -1); /* Designate control sets */ iso2022_read_test(TESTSTR("\x1b!@"), 0x1b, '!', '@', 0, -1); /* Designate other coding system (UTF-8) */ iso2022_read_test(TESTSTR("\x1b%G" "\xCE\xBA\xE1\xBD\xB9\xCF\x83\xCE\xBC\xCE\xB5"), 0x03BA, 0x1F79, 0x03C3, 0x03BC, 0x03B5, 0, -1); iso2022_read_test(TESTSTR("\x1b-A\x1b%G\xCE\xBA\x1b%@\xa0"), 0x03BA, 0xA0, 0, -1); iso2022_read_test(TESTSTR("\x1b%G\xCE\x1b%@"), ERROR, 0, -1); iso2022_read_test(TESTSTR("\x1b%G\xCE\xBA\x1b%\x1b%@"), 0x03BA, 0x1B, '%', 0, -1); /* DOCS (COMPOUND_TEXT extended segment) */ iso2022_read_test(TESTSTR("\x1b%/1\x80\x80"), 0, -1); iso2022_read_test(TESTSTR("\x1b%/1\x80\x8fiso-8859-15\2xyz\x1b(B"), ERROR, ERROR, ERROR, 0, -1); iso2022_read_test(TESTSTR("\x1b%/1\x80\x8eiso8859-15\2xyz\x1b(B"), 'x', 'y', 'z', 0, -1); iso2022_read_test(TESTSTR("\x1b-A\x1b%/2\x80\x89" "big5-0\2\xa1\x40\xa1\x40"), 0x3000, 0xa1, 0x40, 0, -1); /* Emacs Big5-in-ISO-2022 mapping */ iso2022_read_test(TESTSTR("\x1b$(0&x86\x1b(B \x1b$(0DeBv"), 0x5143, 0x6c23, ' ', ' ', 0x958b, 0x767c, 0, -1); /* Test from RFC 1922 (ISO-2022-CN) */ iso2022_read_test(TESTSTR("\x1b$)A\x0e=;;;\x1b$)GG(_P\x0f"), 0x4EA4, 0x6362, 0x4EA4, 0x63db, 0, -1); printf("read tests completed\n"); printf("total: %d errors\n", total_errs); return (total_errs != 0); } #endif /* TESTMODE */ #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_ISO2022) #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/iso2022s.c����������������������������������������������������������������������0000644�0001753�0001753�00000040230�12444773746�013033� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * iso2022s.c - support for ISO-2022 subset encodings. */ #ifndef ENUM_CHARSETS #include <stdio.h> #include <string.h> #include <assert.h> #include "charset.h" #include "internal.h" #include "sbcsdat.h" #define SO (0x0E) #define SI (0x0F) #define ESC (0x1B) /* Functional description of a single ISO 2022 escape sequence. */ struct iso2022_escape { char const *sequence; unsigned long andbits, xorbits; /* * For output, these variables help us figure out which escape * sequences we need to get where we want to be. * * `container' should be in the range 0-3, but can also be ORed * with the bit flag RO to indicate that this is not a * preferred container to use for this charset during output. */ int container, subcharset; }; #define RO 0x80 struct iso2022 { /* * List of escape sequences supported in this subset. Must be * in ASCII order, so that we can narrow down the list as * necessary. */ const struct iso2022_escape *escapes;/* must be sorted in ASCII order! */ int nescapes; /* * We assign indices from 0 upwards to the sub-charsets of a * given ISO 2022 subset. nbytes[i] tells us how many bytes per * character are required by sub-charset i. (It's a string * mainly because that makes it easier to declare in C syntax * than an int array.) */ char const *nbytes; /* * The characters in this string are indices-plus-one (so that * NUL can still terminate) of escape sequences in `escapes'. * These escapes are output in the given sequence to reset the * encoding state, unless it turns out that a given escape * would not change the state at all. */ char const *reset; /* * Initial value of s1, in case the default container contents * needs to be something other than charset 0 in all cases. * (Note that this must have the top bit set!) */ unsigned long s1; /* * For output, some ISO 2022 subsets _mandate_ an initial shift * sequence. If so, here it is so we can output it. (For the * sake of basic sanity we won't bother to _require_ it on * input, although it should of course be listed under * `escapes' above so that we ignore it when present.) */ char const *initial_sequence; /* * Is this an 8-bit ISO 2022 subset? */ int eightbit; /* * Function calls to do the actual translation. */ long int (*to_ucs)(int subcharset, unsigned long bytes); int (*from_ucs)(long int ucs, int *subcharset, unsigned long *bytes); }; static void read_iso2022s(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { struct iso2022 const *iso = (struct iso2022 *)charset->data; /* * For reading ISO-2022 subsets, we divide up our state * variables as follows: * * - The top byte of s0 (bits 31:24) indicates, if nonzero, * that we are part-way through a recognised ISO-2022 escape * sequence. Five of those bits (31:27) give the index of * the first member of the escapes list matching what we * have so far; the remaining three (26:24) give the number * of characters we have seen so far. * * - The top bit of s1 (bit 31) is non-zero at all times, to * indicate that we have performed any necessary * initialisation. When we start, we detect a zero s1 and * respond to it by initialising the default container * contents. * * - The next three bits of s1 (bits 30:28) indicate which * _container_ is currently selected. This isn't quite as * simple as it sounds, since we have to preserve memory of * which of the SI/SO containers we came from when we're * temporarily in SS2/SS3. Hence, what happens is: * + bit 28 indicates SI/SO. * + if we're in an SS2/SS3 container, that's indicated by * the two bits above that being nonzero and holding * either 2 or 3. * + Hence: 0 is SI, 1 is SO, 4 is SS2-from-SI, 5 is * SS2-from-SO, 6 is SS3-from-SI, 7 is SS3-from-SO. * + For added fun: in an _8-bit_ ISO 2022 subset, we have * the further special value 2, which means that we're * theoretically in SI but the current character being * accumulated is composed of 8-bit characters and will * therefore be interpreted as if in SO. * * - The next nibble of s1 (27:24) indicates how many bytes * have been accumulated in the current character. * * - The remaining three bytes of s1 are divided into four * six-bit sections, and each section gives the current * sub-charset selected in one of the possible containers. * (Those containers are SI, SO, SS2 and SS3, respectively * and in order from the bottom of s0 to the top.) * * - The bottom 24 bits of s0 give the accumulated character * data so far. * * (Note that this means s1 contains all the parts of the state * which might need to be operated on by escape sequences. * Cunning, eh?) */ if (!(state->s1 & 0x80000000)) { state->s1 = iso->s1; } /* * So. Firstly, we process escape sequences, if we're in the * middle of one or if we see a possible introducer (SI, SO, * ESC). */ if ((state->s0 >> 24) || (input_chr == SO || input_chr == SI || input_chr == ESC)) { int n = (state->s0 >> 24) & 7, i = (state->s0 >> 27), oi = i, j; /* * If this is the start of an escape sequence, we might be * in mid-character. If so, clear the character state and * emit an error token for the incomplete character. */ if (state->s1 & 0x0F000000) { state->s1 &= ~0x0F000000; state->s0 &= 0xFF000000; /* * If we were in the SS2 or SS3 container, we * automatically exit it. */ if (state->s1 & 0x60000000) state->s1 &= 0x9FFFFFFF; emit(emitctx, ERROR); } j = i; while (j < iso->nescapes && !memcmp(iso->escapes[j].sequence, iso->escapes[oi].sequence, n)) { if (iso->escapes[j].sequence[n] < input_chr) i = ++j; else break; } if (i >= iso->nescapes || memcmp(iso->escapes[i].sequence, iso->escapes[oi].sequence, n) || iso->escapes[i].sequence[n] != input_chr) { /* * This character does not appear in any valid escape * sequence. Therefore, we must emit all the characters * we had previously swallowed, plus this one, and * return to non-escape-sequence state. */ for (j = 0; j < n; j++) emit(emitctx, iso->escapes[oi].sequence[j]); emit(emitctx, input_chr); state->s0 = 0; return; } /* * Otherwise, we have found an additional character in our * escape sequence. See if we have reached the _end_ of our * sequence (and therefore must process the sequence). */ n++; if (!iso->escapes[i].sequence[n]) { state->s0 = 0; state->s1 &= iso->escapes[i].andbits; state->s1 ^= iso->escapes[i].xorbits; return; } /* * Failing _that_, we simply update our escape-sequence- * tracking state. */ assert(i < 32 && n < 8); state->s0 = (i << 27) | (n << 24); return; } /* * If this isn't an escape sequence, it must be part of a * character. One possibility is that it's a control character * (00-20 or 7F-9F; also in non-8-bit ISO 2022 subsets I'm * going to treat all top-half characters as controls), in * which case we output it verbatim. */ if (input_chr < 0x21 || (input_chr > 0x7E && (!iso->eightbit || input_chr < 0xA0))) { /* * We might be in mid-multibyte-character. If so, clear the * character state and emit an error token for the * incomplete character. */ if (state->s1 & 0x0F000000) { state->s1 &= ~0x0F000000; state->s0 &= 0xFF000000; emit(emitctx, ERROR); /* * If we were in the SS2 or SS3 container, we * automatically exit it. */ if (state->s1 & 0x60000000) state->s1 &= 0x9FFFFFFF; } emit(emitctx, input_chr); return; } /* * Otherwise, accumulate character data. */ { unsigned long chr; int chrlen, cont, subcharset, bytes; /* * Verify that we've seen the right kind of character for * what we're currently doing. This only matters in 8-bit * subsets. */ if (iso->eightbit) { cont = (state->s1 >> 28) & 7; /* * If cont==0, we're entitled to see either GL or GR * characters. If cont==2, we expect only GR; otherwise * we expect only GL. * * If we see a GR character while cont==0, we set * cont=2 immediately. */ if ((cont == 2 && !(input_chr & 0x80)) || (cont != 0 && cont != 2 && (input_chr & 0x80))) { /* * Clear the previous character; it was prematurely * terminated by this error. */ state->s1 &= ~0x0F000000; state->s0 &= 0xFF000000; emit(emitctx, ERROR); /* * If we were in the SS2 or SS3 container, we * automatically exit it. */ if (state->s1 & 0x60000000) state->s1 &= 0x9FFFFFFF; } if (cont == 0 && (input_chr & 0x80)) { state->s1 |= 0x20000000; } } /* The current character and its length. */ chr = ((state->s0 & 0x00FFFFFF) << 8) | (input_chr & 0x7F); chrlen = ((state->s1 >> 24) & 0xF) + 1; /* The current sub-charset. */ cont = (state->s1 >> 28) & 7; if (cont > 1) cont >>= 1; subcharset = (state->s1 >> (6*cont)) & 0x3F; /* The number of bytes-per-character in that sub-charset. */ bytes = iso->nbytes[subcharset]; /* * If this character is now complete, we convert and emit * it. Otherwise, we simply update the state and return. */ if (chrlen >= bytes) { emit(emitctx, iso->to_ucs(subcharset, chr)); chr = chrlen = 0; /* * If we were in the SS2 or SS3 container, we * automatically exit it. */ if (state->s1 & 0x60000000) state->s1 &= 0x9FFFFFFF; } state->s0 = (state->s0 & 0xFF000000) | chr; state->s1 = (state->s1 & 0xF0FFFFFF) | (chrlen << 24); } } static int write_iso2022s(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { struct iso2022 const *iso = (struct iso2022 *)charset->data; int subcharset, len, i, j, cont, topbit = 0; unsigned long bytes; /* * For output, our s1 state variable contains most of the same * stuff as it did for input - initial-state indicator bit, * current container, and current subcharset selected in each * container. */ /* * Analyse the character and find out what subcharset it needs * to go in. */ if (input_chr >= 0 && !iso->from_ucs(input_chr, &subcharset, &bytes)) return FALSE; if (!(state->s1 & 0x80000000)) { state->s1 = iso->s1; if (iso->initial_sequence) for (i = 0; iso->initial_sequence[i]; i++) emit(emitctx, iso->initial_sequence[i]); } if (input_chr == -1) { unsigned long oldstate; int k; /* * Special case: reset encoding state. */ for (i = 0; iso->reset[i]; i++) { j = iso->reset[i] - 1; oldstate = state->s1; state->s1 &= iso->escapes[j].andbits; state->s1 ^= iso->escapes[j].xorbits; if (state->s1 != oldstate) { /* We must actually emit this sequence. */ for (k = 0; iso->escapes[j].sequence[k]; k++) emit(emitctx, iso->escapes[j].sequence[k]); } } return TRUE; } /* * Now begins the fun. We now know what subcharset we want. So * we must find out which container we should select it into, * select it into it if necessary, select that _container_ if * necessary, and then output the given bytes. */ for (i = 0; i < iso->nescapes; i++) if (iso->escapes[i].subcharset == subcharset && !(iso->escapes[i].container & RO)) break; assert(i < iso->nescapes); /* * We've found the escape sequence which would select this * subcharset into a container. However, that subcharset might * already _be_ selected in that container! Check before we go * to the effort of emitting the sequence. */ cont = iso->escapes[i].container &~ RO; if (((state->s1 >> (6*cont)) & 0x3F) != (unsigned)subcharset) { for (j = 0; iso->escapes[i].sequence[j]; j++) emit(emitctx, iso->escapes[i].sequence[j]); state->s1 &= iso->escapes[i].andbits; state->s1 ^= iso->escapes[i].xorbits; } /* * Now we know what container our subcharset is in, so we want * to select that container. */ if (cont > 1) { /* SS2 or SS3; just output the sequence and be done. */ emit(emitctx, ESC); emit(emitctx, 'L' + cont); /* comes out to 'N' or 'O' */ } else { /* * Emit SI or SO, but only if the current container isn't already * the right one. * * Also, in an 8-bit subset, we need not do this; we'll * just use 8-bit characters to output SO-container * characters. */ if (iso->eightbit && cont == 1 && ((state->s1 >> 28) & 7) == 0) { topbit = 0x80; } else if (((state->s1 >> 28) & 7) != (unsigned)cont) { emit(emitctx, cont ? SO : SI); state->s1 = (state->s1 & 0x8FFFFFFF) | (cont << 28); } } /* * We're done. Subcharset is selected in container, container * is selected. All we need now is to write out the bytes. */ len = iso->nbytes[subcharset]; while (len--) emit(emitctx, ((bytes >> (8*len)) & 0xFF) | topbit); return TRUE; } /* * ISO-2022-JP, defined in RFC 1468. */ static long int iso2022jp_to_ucs(int subcharset, unsigned long bytes) { switch (subcharset) { case 1: /* JIS X 0201 bottom half */ if (bytes == 0x5C) return 0xA5; else if (bytes == 0x7E) return 0x203E; /* else fall through to ASCII */ case 0: return bytes; /* one-byte ASCII */ /* (no break needed since all control paths have returned) */ case 2: return jisx0208_to_unicode(((bytes >> 8) & 0xFF) - 0x21, ((bytes ) & 0xFF) - 0x21); default: return ERROR; } } static int iso2022jp_from_ucs(long int ucs, int *subcharset, unsigned long *bytes) { int r, c; if (ucs < 0x80) { *subcharset = 0; *bytes = ucs; return 1; } else if (ucs == 0xA5 || ucs == 0x203E) { *subcharset = 1; *bytes = (ucs == 0xA5 ? 0x5C : 0x7E); return 1; } else if (unicode_to_jisx0208(ucs, &r, &c)) { *subcharset = 2; *bytes = ((r+0x21) << 8) | (c+0x21); return 1; } else { return 0; } } static const struct iso2022_escape iso2022jp_escapes[] = { {"\033$@", 0xFFFFFFC0, 0x00000002, -1, -1}, /* we ignore this one */ {"\033$B", 0xFFFFFFC0, 0x00000002, 0, 2}, {"\033(B", 0xFFFFFFC0, 0x00000000, 0, 0}, {"\033(J", 0xFFFFFFC0, 0x00000001, 0, 1}, }; static const struct iso2022 iso2022jp = { iso2022jp_escapes, lenof(iso2022jp_escapes), "\1\1\2", "\3", 0x80000000, NULL, FALSE, iso2022jp_to_ucs, iso2022jp_from_ucs }; const charset_spec charset_CS_ISO2022_JP = { CS_ISO2022_JP, read_iso2022s, write_iso2022s, &iso2022jp }; /* * ISO-2022-KR, defined in RFC 1557. */ static long int iso2022kr_to_ucs(int subcharset, unsigned long bytes) { switch (subcharset) { case 0: return bytes; /* one-byte ASCII */ case 1: return ksx1001_to_unicode(((bytes >> 8) & 0xFF) - 0x21, ((bytes ) & 0xFF) - 0x21); default: return ERROR; } } static int iso2022kr_from_ucs(long int ucs, int *subcharset, unsigned long *bytes) { int r, c; if (ucs < 0x80) { *subcharset = 0; *bytes = ucs; return 1; } else if (unicode_to_ksx1001(ucs, &r, &c)) { *subcharset = 1; *bytes = ((r+0x21) << 8) | (c+0x21); return 1; } else { return 0; } } static const struct iso2022_escape iso2022kr_escapes[] = { {"\016", 0x8FFFFFFF, 0x10000000, -1, -1}, {"\017", 0x8FFFFFFF, 0x00000000, 0, 0}, {"\033$)C", 0xFFFFF03F, 0x00000040, 1, 1}, /* bits[11:6] <- 1 */ }; static const struct iso2022 iso2022kr = { iso2022kr_escapes, lenof(iso2022kr_escapes), "\1\2", "\2", 0x80000040, "\033$)C", FALSE, iso2022kr_to_ucs, iso2022kr_from_ucs }; const charset_spec charset_CS_ISO2022_KR = { CS_ISO2022_KR, read_iso2022s, write_iso2022s, &iso2022kr }; #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_ISO2022_JP) ENUM_CHARSET(CS_ISO2022_KR) #endif /* ENUM_CHARSETS */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/istate.c������������������������������������������������������������������������0000644�0001753�0001753�00000000123�12444773746�013036� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "charset.h" const charset_state charset_init_state = CHARSET_INIT_STATE; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/jisx0208.c����������������������������������������������������������������������0000644�0001753�0001753�00000431640�12444773746�013050� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * JIS X 0208 implementation for libcharset. (This is the character * set itself, not any particular multibyte encoding of it. * Multibyte encodings of this character set are handled * separately.) */ #include <assert.h> #include "charset.h" #include "internal.h" /* * These tables are generated from the JIS X 0208 <-> Unicode * character mapping found at * * http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT */ /* * Mapping from JIS X 0208 to Unicode. For these purposes JIS X * 0208 is considered to be a 94x94 square array, with coordinates * running from (0,0) to (93,93). * * Generated by running the following sh+Perl over JIS0208.TXT: cat JIS0208.TXT | \ perl -ne '$a{hex$1,hex$2}=$3 if /^[^#]\S+\s+0x(\S\S)(\S\S)\s+(0x\S+)\s/;' \ -e 'END {for $r (0..93) { $o=" {"; for $c (0..93) {' \ -e '$k=$a{$r+33,$c+33}; $k=" ERROR" unless defined $k;' \ -e '$o .= ", " if $c > 0; (print "$o\n"), $o=" " if length $o > 70;' \ -e '$o .= $k; } print "$o},\n"; }}' */ static const unsigned short jisx0208_forward[94][94] = { {0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8, 0xFF3E, 0xFFE3, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, 0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, 0x005C, 0x301C, 0x2016, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019, 0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D, 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 0x2212, 0x00B1, 0x00D7, 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E, 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5, 0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20, 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7}, {0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x2227, 0x2228, 0x00AC, 0x21D2, 0x21D4, 0x2200, 0x2203, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x212B, 0x2030, 0x266F, 0x266D, 0x266A, 0x2020, 0x2021, 0x00B6, ERROR, ERROR, ERROR, ERROR, 0x25EF}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, ERROR, ERROR, ERROR, ERROR}, {0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x4E9C, 0x5516, 0x5A03, 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, 0x8475, 0x831C, 0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, 0x82A6, 0x9BF5, 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, 0x867B, 0x98F4, 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, 0x5B89, 0x5EB5, 0x6309, 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A, 0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 0x59D4, 0x5A01, 0x5C09, 0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570, 0x79FB, 0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, 0x8B02, 0x9055, 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 0x80B2, 0x90C1, 0x78EF, 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, 0x828B, 0x9C2F, 0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, 0x98F2, 0x6DEB, 0x80E4, 0x852D}, {0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B, 0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C, 0x7ABA, 0x4E11, 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D, 0x851A, 0x9C3B, 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642, 0x4E91, 0x904B, 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30, 0x5F71, 0x6620, 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B, 0x76C8, 0x7A4E, 0x9834, 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2, 0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E, 0x53AD, 0x5186, 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028, 0x63A9, 0x63F4, 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5, 0x733F, 0x7E01, 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B, 0x5869, 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80, 0x5FDC}, {0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1, 0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55, 0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1, 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3, 0x706B, 0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB, 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8, 0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259, 0x753B, 0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5, 0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB, 0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539}, {0x9B41, 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, 0x82A5, 0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, 0x5916, 0x54B3, 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, 0x8857, 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, 0x67FF, 0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9, 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, 0x89D2, 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3, 0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B, 0x6A7F, 0x68B6, 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, 0x6D3B, 0x6E07, 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, 0x53F6, 0x691B, 0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, 0x91DC, 0x938C, 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431}, {0x7CA5, 0x5208, 0x82C5, 0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7, 0x5DFB, 0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, 0x5BDB, 0x5E72, 0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 0x63DB, 0x6562, 0x67D1, 0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, 0x6F97, 0x6F45, 0x74B0, 0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9, 0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 0x89B3, 0x8ACC, 0x8CAB, 0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, 0x97D3, 0x9928, 0x8218, 0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, 0x764C, 0x773C, 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 0x9854, 0x9858, 0x4F01, 0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, 0x5B09, 0x5BC4, 0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2, 0x671F, 0x68CB, 0x68C4}, {0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D, 0x757F, 0x7948, 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18, 0x8CB4, 0x8D77, 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80, 0x507D, 0x5100, 0x5993, 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A, 0x72A0, 0x7591, 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC, 0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70, 0x7827, 0x6775, 0x9ECD, 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006, 0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13, 0x6025, 0x6551, 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403, 0x7A76, 0x7AAE, 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A, 0x8A31, 0x8DDD, 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB, 0x4EAC}, {0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6, 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37, 0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1, 0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7, 0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681, 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5, 0x52E4, 0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434, 0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F, 0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5, 0x533A, 0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8, 0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3, 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48}, {0x6398, 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, 0x7C82, 0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, 0x85AB, 0x8A13, 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 0x50BE, 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, 0x5F62, 0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C, 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, 0x7D99, 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, 0x8B66, 0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8, 0x5287, 0x621F, 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, 0x6C7A, 0x6F54, 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, 0x5039, 0x5026, 0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC, 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372}, {0x691C, 0x6A29, 0x727D, 0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B, 0x8B19, 0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, 0x9855, 0x9A13, 0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 0x5F26, 0x6E1B, 0x6E90, 0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, 0x9650, 0x4E4E, 0x500B, 0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, 0x5DF1, 0x5EAB, 0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 0x72D0, 0x7CCA, 0x88B4, 0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, 0x96C7, 0x9867, 0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, 0x5449, 0x543E, 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 0x6A8E, 0x745A, 0x7881, 0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C, 0x4FAF, 0x5019, 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE, 0x539A, 0x53E3, 0x5411}, {0x540E, 0x5589, 0x5751, 0x57A2, 0x597D, 0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83, 0x5E9A, 0x5EB7, 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7, 0x653B, 0x6602, 0x6643, 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB, 0x6C5F, 0x6D2A, 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C, 0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003, 0x80AF, 0x80B1, 0x8154, 0x818F, 0x822A, 0x8352, 0x884C, 0x8861, 0x8B1B, 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC, 0x95A4, 0x964D, 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB, 0x53F7, 0x5408, 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9, 0x514B, 0x523B, 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2, 0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB, 0x8FBC}, {0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A, 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5, 0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F, 0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396, 0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700, 0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D, 0x6B73, 0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D, 0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728, 0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A, 0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A, 0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22, 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237}, {0x5BDF, 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690, 0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, 0x4E09, 0x5098, 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 0x73CA, 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, 0x9910, 0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, 0x523A, 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, 0x59FF, 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, 0x652F, 0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, 0x6B7B, 0x6C0F, 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 0x8102, 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, 0x8AEE, 0x8CC7, 0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150, 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642}, {0x6B21, 0x6ECB, 0x6CBB, 0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA, 0x8494, 0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA, 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 0x57F7, 0x5931, 0x5AC9, 0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, 0x5B9F, 0x8500, 0x7BE0, 0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, 0x820E, 0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 0x716E, 0x793E, 0x7D17, 0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA, 0x5C3A, 0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, 0x932B, 0x82E5, 0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 0x5B88, 0x624B, 0x6731, 0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, 0x9152, 0x9996, 0x5112, 0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, 0x7DAC, 0x9700, 0x56DA, 0x53CE, 0x5468}, {0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101, 0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED, 0x821F, 0x8490, 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031, 0x914B, 0x916C, 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341, 0x5F93, 0x620E, 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD, 0x9283, 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B, 0x587E, 0x719F, 0x51FA, 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625, 0x77AC, 0x7AE3, 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F, 0x6B89, 0x6DF3, 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075, 0x9187, 0x9806, 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A, 0x5EB6, 0x7DD2, 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9, 0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7, 0x511F}, {0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531, 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11, 0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB, 0x638C, 0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2, 0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126, 0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0, 0x7B11, 0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D, 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4, 0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E, 0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38, 0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63, 0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE}, {0x62ED, 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF, 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5, 0x5507, 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, 0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6, 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B, 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 0x58EC, 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D, 0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439, 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 0x7FE0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE}, {0x6F84, 0x647A, 0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3, 0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2, 0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, 0x8056, 0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, 0x901D, 0x9192, 0x9752, 0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC, 0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 0x7A4D, 0x7C4D, 0x7E3E, 0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9, 0x63A5, 0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, 0x8AAC, 0x96EA, 0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 0x5343, 0x5360, 0x5BA3, 0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, 0x6813, 0x6834, 0x6CC9, 0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, 0x717D, 0x65CB, 0x7A7F, 0x7BAD, 0x7DDA}, {0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239, 0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291, 0x9583, 0x9BAE, 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985, 0x7E55, 0x81B3, 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE, 0x66FD, 0x695A, 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF, 0x7C97, 0x7D20, 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20, 0x50E7, 0x5275, 0x53CC, 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F, 0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383, 0x633F, 0x63BB, 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD, 0x6F15, 0x71E5, 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF, 0x7D9C, 0x8061, 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5, 0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897, 0x618E}, {0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247, 0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7, 0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3, 0x5B58, 0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A, 0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253, 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806, 0x5BFE, 0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234, 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8, 0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927, 0x7B2C, 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544, 0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17, 0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA}, {0x53E9, 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, 0x8FBF, 0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0, 0x4E39, 0x5358, 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, 0x6E5B, 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, 0x86CB, 0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80, 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, 0x6065, 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045, 0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4, 0x9010, 0x79E9, 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 0x5FE0, 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, 0x8A3B, 0x914E, 0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7, 0x8457, 0x8CAF, 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5}, {0x5E16, 0x5E33, 0x5E81, 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, 0x671D, 0x6F6E, 0x7252, 0x753A, 0x773A, 0x8074, 0x8139, 0x8178, 0x8776, 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 0x9577, 0x9802, 0x9CE5, 0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, 0x8CC3, 0x93AE, 0x9673, 0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB, 0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 0x4F43, 0x6F2C, 0x67D8, 0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, 0x576A, 0x58F7, 0x5B2C, 0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E, 0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 0x5824, 0x5B9A, 0x5E1D, 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, 0x633A, 0x63D0, 0x68AF, 0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02, 0x8AE6, 0x8E44, 0x9013}, {0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5, 0x6458, 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1, 0x6EBA, 0x54F2, 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178, 0x586B, 0x5929, 0x5C55, 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC, 0x8EE2, 0x985B, 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB, 0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597, 0x675C, 0x6E21, 0x767B, 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D, 0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012, 0x515A, 0x51AC, 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5B95, 0x5CF6, 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843, 0x68BC, 0x68DF, 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8, 0x5F53, 0x75D8, 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71, 0x5230}, {0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F, 0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD, 0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3, 0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F, 0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2, 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A, 0x9CF6, 0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7, 0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D, 0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058, 0x637A, 0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960, 0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302, 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165}, {0x5982, 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, 0x79B0, 0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, 0x5FF5, 0x637B, 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 0x56A2, 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, 0x8997, 0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E, 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, 0x5EC3, 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA, 0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885, 0x6973, 0x7164, 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, 0x877F, 0x79E4, 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, 0x67CF, 0x6CCA, 0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, 0x66DD, 0x6F20, 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6}, {0x51FD, 0x7BB1, 0x7872, 0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560, 0x516B, 0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, 0x4F10, 0x7F70, 0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 0x5859, 0x86E4, 0x96BC, 0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, 0x642C, 0x6591, 0x677F, 0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, 0x7554, 0x7E41, 0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 0x7169, 0x9812, 0x98EF, 0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, 0x86EE, 0x532A, 0x5351, 0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, 0x6249, 0x6279, 0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 0x76AE, 0x7891, 0x79D8, 0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, 0x907F, 0x975E, 0x98DB, 0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8, 0x7435, 0x7709, 0x7F8E}, {0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B, 0x9AED, 0x5F66, 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562, 0x7B46, 0x903C, 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C, 0x4FF5, 0x5F6A, 0x6A19, 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8A55, 0x8C79, 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328, 0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C, 0x7015, 0x8CA7, 0x8CD3, 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8, 0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016, 0x6276, 0x6577, 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150, 0x819A, 0x8299, 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644, 0x4FAE, 0x64AB, 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01, 0x6953, 0x98A8, 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45, 0x670D}, {0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255, 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3, 0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0, 0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73, 0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801, 0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86, 0x504F, 0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D, 0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA, 0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF, 0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023, 0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF, 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B}, {0x6CD5, 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC, 0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, 0x98FD, 0x9CF3, 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, 0x5192, 0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632, 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, 0x6734, 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, 0x5800, 0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, 0x6469, 0x78E8, 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, 0x54E9, 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, 0x9C52, 0x685D, 0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD, 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80}, {0x6F2B, 0x8513, 0x5473, 0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A, 0x84D1, 0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, 0x7720, 0x52D9, 0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 0x9D61, 0x690B, 0x5A7F, 0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, 0x8FF7, 0x9298, 0x9CF4, 0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, 0x7DBF, 0x7DEC, 0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 0x5984, 0x5B5F, 0x6BDB, 0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9, 0x76EE, 0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, 0x7C7E, 0x8CB0, 0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 0x4E5F, 0x51B6, 0x591C, 0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, 0x5F79, 0x7D04, 0x85AC, 0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109, 0x6108, 0x6CB9, 0x7652}, {0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A, 0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709, 0x67DA, 0x6E67, 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5, 0x8A98, 0x904A, 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88, 0x4F59, 0x4E0E, 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996, 0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8, 0x6D0B, 0x6EB6, 0x7194, 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449, 0x84C9, 0x8981, 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E, 0x6291, 0x6B32, 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85, 0x87BA, 0x88F8, 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61, 0x843D, 0x916A, 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD, 0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406, 0x7483}, {0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B, 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6, 0x616E, 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC, 0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C, 0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B, 0x7DD1, 0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8, 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F, 0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C, 0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97, 0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9, 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F}, {0x84EE, 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF, 0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717, 0x697C, 0x6994, 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, 0x874B, 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, 0x502D, 0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1, 0x67A0, 0x9DF2, 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, 0x6E7E, 0x7897, 0x8155, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36, 0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B, 0x4E8A, 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2, 0x4EB0, 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2, 0x4ED7, 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30, 0x4F5B, 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98, 0x4F7B, 0x4F69, 0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118, 0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0, 0x4FE4, 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005, 0x4F1C, 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011, 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505A, 0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2}, {0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED, 0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, 0x5116, 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B, 0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169, 0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189, 0x518F, 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9, 0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD, 0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, 0x51F0, 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A, 0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, 0x525E, 0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, 0x528D, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8}, {0x8FA7, 0x52AC, 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, 0x52E3, 0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, 0x5306, 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 0x531A, 0x5323, 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4E17, 0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B, 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 0x53AE, 0x53B0, 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE, 0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, 0x542D, 0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 0x548F, 0x5475, 0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, 0x54A5, 0x54AC, 0x54C4, 0x54C8, 0x54A8}, {0x54AB, 0x54C2, 0x54A4, 0x54BE, 0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE, 0x54ED, 0x54FA, 0x54E2, 0x5539, 0x5540, 0x5563, 0x554C, 0x552E, 0x555C, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555D, 0x5599, 0x5580, 0x54AF, 0x558A, 0x559F, 0x557B, 0x557E, 0x5598, 0x559E, 0x55AE, 0x557C, 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5, 0x55DF, 0x55C4, 0x55DC, 0x55E4, 0x55D4, 0x5614, 0x55F7, 0x5616, 0x55FE, 0x55FD, 0x561B, 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634, 0x5636, 0x5632, 0x5638, 0x566B, 0x5664, 0x562F, 0x566C, 0x566A, 0x5686, 0x5680, 0x568A, 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE, 0x56B6, 0x56B4, 0x56C2, 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8, 0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF, 0x5704, 0x5709}, {0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716, 0x55C7, 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740, 0x574F, 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793, 0x57A0, 0x57B3, 0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4, 0x57D2, 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D, 0x5872, 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D, 0x5879, 0x5885, 0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB, 0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8, 0x58E5, 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB, 0x58FC, 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925, 0x592C, 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950, 0x594E, 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969}, {0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6, 0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F, 0x5A11, 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36, 0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD, 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C, 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43, 0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69, 0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, 0x5B83, 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4, 0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, 0x5BF3, 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22, 0x5C28, 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53}, {0x5C50, 0x5C4F, 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, 0x5C91, 0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, 0x5CC5, 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 0x5CED, 0x5D8C, 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, 0x5D11, 0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E, 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 0x5D82, 0x5DA2, 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9, 0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, 0x5DF5, 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 0x5E37, 0x5E44, 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, 0x5E64, 0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, 0x5EC1, 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF}, {0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA, 0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3, 0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C, 0x5F0B, 0x5F11, 0x5F16, 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48, 0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61, 0x5F6D, 0x5F73, 0x5F77, 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88, 0x5F91, 0x5F87, 0x5F9E, 0x5F99, 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD, 0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3, 0x5FFF, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600E, 0x6031, 0x601B, 0x6015, 0x602B, 0x6026, 0x600F, 0x603A, 0x605A, 0x6041, 0x606A, 0x6077, 0x605F, 0x604A, 0x6046, 0x604D, 0x6063, 0x6043, 0x6064, 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7, 0x6083, 0x609A}, {0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7, 0x608B, 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD, 0x60C6, 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7, 0x6100, 0x60F4, 0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D, 0x610E, 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 0x613F, 0x613C, 0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615A, 0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F, 0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194, 0x619A, 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9, 0x61F7, 0x61C8, 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD, 0x61E6, 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC, 0x61FE, 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B}, {0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241, 0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C, 0x6282, 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294, 0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8, 0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, 0x630C, 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350, 0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB, 0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B, 0x6369, 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, 0x63F6, 0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651D, 0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E, 0x652A, 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC}, {0x64DA, 0x64D2, 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209, 0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, 0x64F4, 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 0x6505, 0x6524, 0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754B, 0x6548, 0x6556, 0x6555, 0x654D, 0x6558, 0x655E, 0x655D, 0x6572, 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 0x65AB, 0x65B7, 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, 0x65D9, 0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, 0x6773, 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 0x6649, 0x6641, 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, 0x6670, 0x6683, 0x6688, 0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1, 0x66B9, 0x66C9, 0x66BE, 0x66BC}, {0x66C4, 0x66B8, 0x66D6, 0x66DA, 0x66E0, 0x663F, 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F, 0x6716, 0x671E, 0x6726, 0x6727, 0x9738, 0x672E, 0x673F, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, 0x675E, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B, 0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3, 0x67E9, 0x67B8, 0x67E4, 0x67DE, 0x67DD, 0x67E2, 0x67EE, 0x67B9, 0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840, 0x684D, 0x6832, 0x684E, 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877, 0x687F, 0x689F, 0x688F, 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883, 0x6AAE, 0x68B9, 0x6874, 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D, 0x687E, 0x6901, 0x68CA, 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1, 0x690C, 0x68CD}, {0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904, 0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A, 0x691A, 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978, 0x696B, 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959, 0x6930, 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE, 0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA, 0x69DD, 0x69BB, 0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C, 0x6995, 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A, 0x69F9, 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14, 0x69EB, 0x6A0A, 0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C, 0x6A72, 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48, 0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3}, {0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC, 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, 0x6B05, 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37, 0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59, 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, 0x6B80, 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA, 0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6, 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF, 0x9EBE, 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, 0x6C55, 0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, 0x6C7E, 0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD, 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE}, {0x6CBA, 0x6CDB, 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D, 0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, 0x6D93, 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 0x6FE4, 0x6D85, 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, 0x6DC6, 0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, 0x6DD9, 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 0x6E2E, 0x6E19, 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, 0x6E4D, 0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, 0x6E38, 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 0x6EBD, 0x6EAF, 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, 0x6E9F, 0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2, 0x6F31, 0x6EEF, 0x6F32, 0x6ECC}, {0x6F3E, 0x6F13, 0x6EF7, 0x6F86, 0x6F7A, 0x6F78, 0x6F81, 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D, 0x6F82, 0x6F7C, 0x6F58, 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3, 0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5, 0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B, 0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74, 0x701D, 0x7018, 0x701F, 0x7030, 0x703E, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE, 0x70DF, 0x70CB, 0x70DD, 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714C, 0x7156, 0x716C, 0x718F, 0x71FB, 0x7184, 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9, 0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7, 0x71F5, 0x71FC}, {0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228, 0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, 0x7240, 0x7246, 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6, 0x72C4, 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7, 0x500F, 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F, 0x7329, 0x7325, 0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A, 0x7368, 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3, 0x73CE, 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405, 0x746F, 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F, 0x7459, 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 0x746A, 0x7476, 0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1}, {0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1, 0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, 0x750D, 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D, 0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567, 0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758A, 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2, 0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD, 0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, 0x75FC, 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609, 0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, 0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, 0x7662, 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670}, {0x7672, 0x7676, 0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, 0x7696, 0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, 0x76BA, 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 0x76E5, 0x76E7, 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724, 0x771E, 0x7725, 0x7726, 0x771B, 0x7737, 0x7738, 0x7747, 0x775A, 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 0x7779, 0x778E, 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF, 0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, 0x77DC, 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 0x7820, 0x792A, 0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, 0x78A3, 0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, 0x78BE, 0x78BC, 0x78C5, 0x78CA, 0x78EC}, {0x78E7, 0x78DA, 0x78FD, 0x78F4, 0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, 0x7940, 0x7960, 0x7957, 0x795F, 0x795A, 0x7955, 0x7953, 0x797A, 0x797F, 0x798A, 0x799D, 0x79A7, 0x9F4B, 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA, 0x79C9, 0x79D5, 0x79E7, 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D, 0x7A18, 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E, 0x7A37, 0x7A43, 0x7A57, 0x7A49, 0x7A61, 0x7A62, 0x7A69, 0x9F9D, 0x7A70, 0x7A79, 0x7A7D, 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96, 0x7AA9, 0x7AC8, 0x7AB0, 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083, 0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA, 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F, 0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28, 0x7B36, 0x7B50}, {0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45, 0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E, 0x7B9D, 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92, 0x7B8F, 0x7B5D, 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4, 0x7BC6, 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60, 0x7C00, 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6, 0x7C23, 0x7C27, 0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C, 0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64, 0x7C56, 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD, 0x7CA2, 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE, 0x7CB9, 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC, 0x7CE2, 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06}, {0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32, 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72, 0x7D68, 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D, 0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB, 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8, 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A, 0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22, 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, 0x7E32, 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79, 0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, 0x8FAE, 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93, 0x7E94, 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A}, {0x7F45, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, 0x7F5F, 0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, 0x7F83, 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 0x7F9A, 0x7FA3, 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, 0x7FC5, 0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3, 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 0x8018, 0x8019, 0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052, 0x8058, 0x805A, 0x805F, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 0x8085, 0x809B, 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, 0x80D9, 0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, 0x811B, 0x8129, 0x8123, 0x812F, 0x814B}, {0x968B, 0x8146, 0x813E, 0x8153, 0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818A, 0x8180, 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3, 0x815F, 0x8193, 0x81A9, 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD, 0x81C0, 0x81C2, 0x81BA, 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8, 0x81C8, 0x81DA, 0x81DF, 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE, 0x8201, 0x8202, 0x8205, 0x8207, 0x820A, 0x820D, 0x8210, 0x8216, 0x8229, 0x822B, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825D, 0x825A, 0x825F, 0x8264, 0x8262, 0x8268, 0x826A, 0x826B, 0x822E, 0x8271, 0x8277, 0x8278, 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F, 0x82BB, 0x82AC, 0x82E1, 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3, 0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC, 0x8309, 0x82D9}, {0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385, 0x839A, 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387, 0x838A, 0x837C, 0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8, 0x83F4, 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B, 0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420, 0x83BD, 0x8438, 0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A, 0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446, 0x842C, 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF, 0x849F, 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6, 0x84D6, 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C, 0x851F, 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548}, {0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591, 0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587, 0x859C, 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0, 0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B, 0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, 0x864D, 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9, 0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0, 0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, 0x86DF, 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB, 0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, 0x8737, 0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778, 0x874C, 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759}, {0x8753, 0x8763, 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, 0x87BD, 0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, 0x87C6, 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 0x87FE, 0x87F6, 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852, 0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 0x889E, 0x8875, 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, 0x8899, 0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, 0x88C4, 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 0x88FC, 0x88F4, 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, 0x891E, 0x8925, 0x892A, 0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938, 0x894C, 0x891D, 0x8960, 0x895E}, {0x8966, 0x8964, 0x896D, 0x896A, 0x896F, 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993, 0x8998, 0x89A1, 0x89A9, 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA, 0x89BD, 0x89BF, 0x89C0, 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4, 0x89F8, 0x8A03, 0x8A16, 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25, 0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D, 0x8A6C, 0x8A62, 0x8A85, 0x8A82, 0x8A84, 0x8AA8, 0x8AA1, 0x8A91, 0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA, 0x8AEB, 0x8AF3, 0x8AE7, 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2, 0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16, 0x8B10, 0x8B17, 0x8B20, 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E, 0x8B28, 0x8B41, 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B, 0x8B5A, 0x8B6B}, {0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80, 0x8B8C, 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A, 0x8C41, 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62, 0x8C6C, 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D, 0x8C8E, 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD, 0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3, 0x8CDA, 0x8CFD, 0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07, 0x8D0F, 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16, 0x8D67, 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE, 0x8DBA, 0x8DCF, 0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA, 0x8DEB, 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D, 0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A}, {0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60, 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, 0x8E87, 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99, 0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5, 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE, 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F, 0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42, 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C, 0x8F62, 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, 0x8FB7, 0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, 0x9005, 0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, 0x9016, 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8}, {0x904F, 0x9050, 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E, 0x9068, 0x906F, 0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, 0x9081, 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 0x90B1, 0x90B5, 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, 0x9132, 0x9130, 0x914A, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173, 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 0x91AF, 0x91AA, 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, 0x91D0, 0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, 0x921E, 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, 0x929C, 0x9296, 0x9293, 0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9, 0x930F, 0x92FA, 0x9344, 0x932E}, {0x9319, 0x9322, 0x931A, 0x9323, 0x933A, 0x9335, 0x933B, 0x935C, 0x9360, 0x937C, 0x936E, 0x9356, 0x93B0, 0x93AC, 0x93AD, 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8, 0x93E5, 0x93D8, 0x93C3, 0x93DD, 0x93D0, 0x93C8, 0x93E4, 0x941A, 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942B, 0x9435, 0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, 0x9462, 0x945E, 0x946A, 0x9229, 0x9470, 0x9475, 0x9477, 0x947D, 0x945A, 0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594, 0x9596, 0x9598, 0x9599, 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC, 0x95BB, 0x95B9, 0x95BE, 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC, 0x95D5, 0x95D4, 0x95D6, 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621, 0x9628, 0x962E, 0x962F, 0x9642, 0x964C, 0x964F, 0x964B, 0x9677, 0x965C, 0x965E}, {0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D, 0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0, 0x96B4, 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD, 0x894D, 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 0x9724, 0x972A, 0x9730, 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975C, 0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B, 0x9771, 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 0x9786, 0x978B, 0x978F, 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4, 0x97C3, 0x97C6, 0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2, 0x7ADF, 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 0x9824, 0x9821, 0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870}, {0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4, 0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, 0x9914, 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E, 0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951, 0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD, 0x99AE, 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE, 0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2, 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43, 0x9A3E, 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, 0x9A64, 0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, 0x9ACF, 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7}, {0x9AFB, 0x9B06, 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, 0x9B4F, 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 0x9B83, 0x9B91, 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, 0x9BCA, 0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, 0x9BE4, 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 0x9C15, 0x9C14, 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04, 0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, 0x9C32, 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 0x9C78, 0x9CE7, 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, 0x9D2A, 0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41, 0x9D3F, 0x9D3E, 0x9D46, 0x9D48}, {0x9D5D, 0x9D5E, 0x9D64, 0x9D51, 0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A, 0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8, 0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6, 0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79, 0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91, 0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, 0x9EAA, 0x9EAD, 0x9761, 0x9ECC, 0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0, 0x9EE5, 0x9EE8, 0x9EEF, 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB, 0x9EFC, 0x9EFD, 0x9F07, 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C, 0x9F3E, 0x9F4A, 0x9F52, 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61, 0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95, 0x9F9C, 0x9FA0}, {0x582F, 0x69C7, 0x9059, 0x7464, 0x51DC, 0x7199, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, }; /* * Mapping from Unicode back to JIS X 0208. * * This inverse is done the same way the SBCS ones are done: I * provide a list of JIS X 0208 positions, sorted into ascending * order of their Unicode values. Then we can binary-search through * this list, referring to the above table for each comparison, to * find the coordinates for a given code point. * * Generated by running the following sh+Perl over JIS0208.TXT: cat JIS0208.TXT | \ perl -ne '$a{$3}=[hex$1,hex$2] if /^[^#]\S+\s+0x(\S\S)(\S\S)\s+(0x\S+)\s/;' \ -e 'END {$o=" ";for $k (sort keys %a) { ($r,$c) = @{$a{$k}}; ' \ -e '$o .= $C; $C = ", "; (print "$o\n"), $o=" " if length $o > 70;' \ -e '$o .= sprintf "{%d,%d}", $r-33,$c-33; } print "$o\n"; }' */ static const struct { unsigned char r, c; } jisx0208_backward[] = { {0,31}, {0,80}, {0,81}, {0,87}, {0,14}, {1,43}, {0,74}, {0,61}, {0,12}, {1,88}, {0,62}, {0,63}, {5,0}, {5,1}, {5,2}, {5,3}, {5,4}, {5,5}, {5,6}, {5,7}, {5,8}, {5,9}, {5,10}, {5,11}, {5,12}, {5,13}, {5,14}, {5,15}, {5,16}, {5,17}, {5,18}, {5,19}, {5,20}, {5,21}, {5,22}, {5,23}, {5,32}, {5,33}, {5,34}, {5,35}, {5,36}, {5,37}, {5,38}, {5,39}, {5,40}, {5,41}, {5,42}, {5,43}, {5,44}, {5,45}, {5,46}, {5,47}, {5,48}, {5,49}, {5,50}, {5,51}, {5,52}, {5,53}, {5,54}, {5,55}, {6,6}, {6,0}, {6,1}, {6,2}, {6,3}, {6,4}, {6,5}, {6,7}, {6,8}, {6,9}, {6,10}, {6,11}, {6,12}, {6,13}, {6,14}, {6,15}, {6,16}, {6,17}, {6,18}, {6,19}, {6,20}, {6,21}, {6,22}, {6,23}, {6,24}, {6,25}, {6,26}, {6,27}, {6,28}, {6,29}, {6,30}, {6,31}, {6,32}, {6,48}, {6,49}, {6,50}, {6,51}, {6,52}, {6,53}, {6,55}, {6,56}, {6,57}, {6,58}, {6,59}, {6,60}, {6,61}, {6,62}, {6,63}, {6,64}, {6,65}, {6,66}, {6,67}, {6,68}, {6,69}, {6,70}, {6,71}, {6,72}, {6,73}, {6,74}, {6,75}, {6,76}, {6,77}, {6,78}, {6,79}, {6,80}, {6,54}, {0,29}, {0,28}, {0,33}, {0,37}, {0,38}, {0,39}, {0,40}, {1,86}, {1,87}, {0,36}, {0,35}, {1,82}, {0,75}, {0,76}, {1,7}, {0,77}, {1,81}, {1,10}, {1,11}, {1,9}, {1,12}, {1,44}, {1,45}, {1,46}, {1,62}, {1,47}, {1,63}, {1,25}, {1,26}, {0,60}, {1,68}, {1,70}, {0,70}, {1,59}, {1,41}, {1,42}, {1,32}, {1,31}, {1,72}, {1,73}, {0,71}, {1,71}, {1,69}, {1,65}, {0,65}, {1,64}, {0,68}, {0,69}, {1,66}, {1,67}, {1,29}, {1,30}, {1,27}, {1,28}, {1,60}, {1,61}, {7,0}, {7,11}, {7,1}, {7,12}, {7,2}, {7,13}, {7,3}, {7,14}, {7,5}, {7,16}, {7,4}, {7,15}, {7,6}, {7,27}, {7,22}, {7,17}, {7,8}, {7,29}, {7,24}, {7,19}, {7,7}, {7,23}, {7,28}, {7,18}, {7,9}, {7,25}, {7,30}, {7,20}, {7,10}, {7,26}, {7,31}, {7,21}, {1,2}, {1,1}, {1,4}, {1,3}, {1,6}, {1,5}, {1,0}, {0,93}, {0,90}, {0,92}, {0,91}, {1,93}, {0,89}, {0,88}, {0,73}, {0,72}, {1,85}, {1,84}, {1,83}, {0,0}, {0,1}, {0,2}, {0,22}, {0,24}, {0,25}, {0,26}, {0,49}, {0,50}, {0,51}, {0,52}, {0,53}, {0,54}, {0,55}, {0,56}, {0,57}, {0,58}, {1,8}, {1,13}, {0,43}, {0,44}, {0,32}, {3,0}, {3,1}, {3,2}, {3,3}, {3,4}, {3,5}, {3,6}, {3,7}, {3,8}, {3,9}, {3,10}, {3,11}, {3,12}, {3,13}, {3,14}, {3,15}, {3,16}, {3,17}, {3,18}, {3,19}, {3,20}, {3,21}, {3,22}, {3,23}, {3,24}, {3,25}, {3,26}, {3,27}, {3,28}, {3,29}, {3,30}, {3,31}, {3,32}, {3,33}, {3,34}, {3,35}, {3,36}, {3,37}, {3,38}, {3,39}, {3,40}, {3,41}, {3,42}, {3,43}, {3,44}, {3,45}, {3,46}, {3,47}, {3,48}, {3,49}, {3,50}, {3,51}, {3,52}, {3,53}, {3,54}, {3,55}, {3,56}, {3,57}, {3,58}, {3,59}, {3,60}, {3,61}, {3,62}, {3,63}, {3,64}, {3,65}, {3,66}, {3,67}, {3,68}, {3,69}, {3,70}, {3,71}, {3,72}, {3,73}, {3,74}, {3,75}, {3,76}, {3,77}, {3,78}, {3,79}, {3,80}, {3,81}, {3,82}, {0,10}, {0,11}, {0,20}, {0,21}, {4,0}, {4,1}, {4,2}, {4,3}, {4,4}, {4,5}, {4,6}, {4,7}, {4,8}, {4,9}, {4,10}, {4,11}, {4,12}, {4,13}, {4,14}, {4,15}, {4,16}, {4,17}, {4,18}, {4,19}, {4,20}, {4,21}, {4,22}, {4,23}, {4,24}, {4,25}, {4,26}, {4,27}, {4,28}, {4,29}, {4,30}, {4,31}, {4,32}, {4,33}, {4,34}, {4,35}, {4,36}, {4,37}, {4,38}, {4,39}, {4,40}, {4,41}, {4,42}, {4,43}, {4,44}, {4,45}, {4,46}, {4,47}, {4,48}, {4,49}, {4,50}, {4,51}, {4,52}, {4,53}, {4,54}, {4,55}, {4,56}, {4,57}, {4,58}, {4,59}, {4,60}, {4,61}, {4,62}, {4,63}, {4,64}, {4,65}, {4,66}, {4,67}, {4,68}, {4,69}, {4,70}, {4,71}, {4,72}, {4,73}, {4,74}, {4,75}, {4,76}, {4,77}, {4,78}, {4,79}, {4,80}, {4,81}, {4,82}, {4,83}, {4,84}, {4,85}, {0,5}, {0,27}, {0,18}, {0,19}, {15,75}, {34,89}, {27,22}, {42,91}, {29,69}, {26,15}, {29,68}, {17,27}, {40,51}, {44,30}, {47,1}, {16,14}, {18,77}, {47,2}, {31,3}, {49,33}, {20,53}, {41,25}, {29,70}, {45,29}, {41,33}, {47,3}, {34,69}, {47,4}, {21,89}, {47,5}, {19,60}, {34,15}, {27,70}, {47,6}, {47,7}, {47,8}, {38,20}, {20,54}, {38,22}, {37,66}, {23,34}, {42,18}, {72,40}, {47,9}, {29,71}, {47,10}, {17,20}, {21,68}, {23,79}, {43,72}, {53,5}, {44,79}, {37,92}, {19,4}, {20,20}, {47,11}, {47,12}, {45,26}, {44,28}, {32,71}, {47,14}, {26,85}, {37,82}, {47,17}, {16,29}, {23,62}, {23,61}, {15,69}, {46,42}, {46,41}, {25,18}, {15,0}, {47,18}, {47,19}, {47,20}, {42,19}, {47,21}, {23,81}, {15,70}, {42,81}, {20,91}, {20,92}, {20,93}, {35,65}, {45,27}, {47,22}, {47,23}, {47,24}, {30,44}, {28,25}, {30,45}, {47,29}, {47,27}, {47,28}, {20,55}, {25,2}, {17,79}, {47,26}, {47,25}, {41,8}, {26,37}, {26,36}, {33,29}, {47,30}, {40,52}, {31,70}, {0,23}, {47,31}, {47,33}, {33,68}, {45,64}, {15,41}, {47,32}, {17,29}, {21,35}, {34,70}, {22,78}, {47,34}, {38,3}, {19,74}, {47,35}, {15,42}, {23,63}, {19,75}, {40,89}, {39,17}, {20,56}, {17,80}, {47,70}, {36,32}, {38,75}, {47,37}, {39,27}, {45,65}, {30,12}, {26,38}, {26,86}, {17,31}, {35,48}, {34,1}, {47,41}, {15,43}, {35,66}, {28,26}, {25,19}, {44,3}, {33,45}, {17,30}, {47,40}, {44,29}, {47,36}, {47,38}, {25,77}, {47,39}, {52,3}, {47,47}, {47,50}, {47,48}, {17,33}, {41,26}, {47,42}, {47,46}, {23,82}, {26,39}, {19,5}, {47,51}, {47,43}, {45,66}, {26,87}, {47,44}, {47,49}, {47,52}, {47,45}, {21,0}, {15,44}, {21,1}, {17,32}, {52,4}, {42,88}, {40,77}, {23,83}, {30,14}, {45,22}, {41,55}, {22,23}, {33,4}, {17,67}, {28,50}, {47,56}, {47,61}, {47,59}, {47,54}, {33,14}, {47,57}, {47,60}, {47,58}, {41,60}, {47,55}, {30,13}, {42,82}, {47,62}, {47,63}, {28,3}, {47,76}, {38,47}, {40,21}, {47,71}, {41,79}, {17,21}, {47,75}, {47,69}, {47,78}, {32,49}, {23,35}, {38,59}, {63,38}, {47,77}, {36,60}, {47,66}, {23,85}, {23,84}, {47,64}, {27,57}, {47,72}, {41,78}, {34,44}, {47,68}, {22,80}, {47,65}, {47,73}, {47,67}, {45,48}, {47,74}, {46,32}, {21,69}, {22,79}, {47,79}, {47,80}, {47,84}, {15,45}, {41,47}, {47,83}, {47,82}, {47,86}, {47,85}, {35,67}, {22,81}, {47,87}, {27,36}, {33,5}, {35,68}, {21,85}, {47,88}, {20,21}, {47,89}, {47,91}, {42,20}, {22,69}, {26,16}, {39,86}, {47,90}, {25,36}, {44,34}, {47,93}, {48,2}, {47,92}, {25,35}, {28,92}, {22,24}, {48,3}, {21,46}, {48,0}, {48,1}, {37,14}, {32,91}, {21,2}, {42,44}, {48,4}, {45,28}, {48,5}, {48,8}, {48,6}, {32,45}, {48,7}, {48,9}, {48,11}, {48,10}, {41,39}, {20,22}, {48,13}, {48,14}, {17,14}, {48,12}, {27,83}, {48,17}, {48,16}, {48,15}, {47,53}, {48,18}, {28,93}, {48,19}, {44,4}, {43,56}, {48,21}, {48,20}, {48,23}, {48,22}, {48,24}, {48,25}, {15,83}, {23,20}, {22,26}, {28,27}, {34,90}, {21,3}, {31,71}, {23,86}, {24,77}, {48,27}, {43,39}, {36,37}, {26,88}, {48,26}, {48,28}, {36,61}, {18,84}, {48,29}, {37,93}, {32,19}, {48,31}, {48,32}, {39,11}, {23,87}, {46,26}, {48,33}, {21,5}, {41,27}, {33,21}, {21,80}, {36,20}, {22,82}, {48,34}, {48,35}, {37,65}, {16,62}, {48,38}, {25,92}, {48,37}, {25,37}, {48,39}, {69,77}, {48,40}, {42,32}, {48,41}, {48,42}, {48,43}, {29,72}, {27,43}, {19,6}, {48,46}, {48,44}, {43,28}, {48,45}, {40,57}, {48,47}, {48,48}, {48,49}, {36,62}, {48,53}, {48,51}, {48,52}, {48,50}, {25,66}, {48,54}, {43,73}, {45,67}, {48,55}, {31,7}, {48,56}, {28,57}, {48,57}, {34,91}, {45,30}, {36,63}, {49,36}, {48,58}, {83,4}, {21,36}, {48,59}, {42,61}, {28,71}, {33,91}, {48,61}, {37,67}, {48,62}, {48,63}, {18,13}, {48,64}, {21,6}, {37,43}, {16,89}, {28,47}, {39,0}, {48,65}, {36,64}, {30,46}, {48,66}, {41,11}, {31,57}, {19,1}, {19,8}, {48,67}, {48,69}, {22,25}, {48,68}, {45,82}, {28,72}, {39,28}, {41,43}, {48,70}, {44,87}, {48,71}, {48,72}, {36,93}, {48,73}, {31,8}, {25,93}, {22,83}, {48,74}, {26,40}, {24,78}, {35,69}, {48,76}, {33,6}, {25,78}, {48,77}, {48,78}, {32,15}, {48,75}, {48,80}, {42,21}, {24,67}, {48,79}, {22,84}, {25,61}, {38,76}, {48,83}, {48,81}, {40,90}, {29,73}, {48,90}, {18,67}, {48,84}, {48,82}, {32,46}, {48,86}, {48,85}, {18,35}, {22,63}, {48,91}, {45,12}, {48,87}, {48,92}, {48,89}, {48,88}, {45,46}, {23,88}, {17,34}, {45,83}, {28,84}, {36,55}, {24,68}, {49,1}, {49,2}, {45,68}, {46,10}, {49,4}, {23,89}, {49,3}, {18,14}, {49,5}, {42,53}, {35,27}, {44,5}, {41,56}, {49,6}, {79,52}, {37,15}, {49,7}, {19,9}, {43,18}, {29,0}, {49,8}, {41,70}, {49,12}, {31,9}, {49,9}, {21,47}, {49,10}, {19,10}, {22,13}, {49,13}, {49,14}, {49,15}, {49,16}, {27,58}, {23,90}, {43,61}, {43,71}, {37,86}, {41,80}, {49,17}, {49,18}, {49,20}, {49,22}, {49,21}, {49,23}, {17,28}, {42,43}, {25,91}, {49,24}, {32,56}, {29,1}, {21,8}, {49,25}, {39,58}, {49,26}, {49,27}, {49,28}, {49,29}, {40,3}, {21,71}, {15,68}, {37,30}, {49,30}, {28,28}, {31,72}, {49,32}, {49,31}, {29,2}, {23,64}, {49,34}, {39,29}, {49,35}, {39,59}, {33,19}, {33,77}, {21,7}, {37,77}, {34,16}, {38,77}, {42,45}, {49,37}, {31,73}, {22,20}, {49,38}, {49,39}, {16,11}, {15,84}, {19,76}, {33,7}, {20,48}, {44,80}, {49,42}, {17,22}, {49,41}, {21,9}, {49,43}, {43,80}, {49,44}, {45,49}, {23,91}, {23,21}, {49,45}, {49,47}, {49,46}, {30,62}, {16,24}, {16,61}, {49,48}, {49,49}, {23,22}, {49,50}, {20,77}, {26,17}, {49,51}, {42,83}, {25,20}, {20,57}, {44,6}, {32,47}, {39,30}, {27,92}, {28,38}, {27,71}, {27,84}, {28,85}, {39,31}, {49,54}, {16,34}, {32,48}, {23,92}, {23,36}, {21,70}, {49,58}, {34,0}, {33,93}, {21,10}, {29,3}, {49,59}, {49,57}, {17,35}, {33,69}, {27,23}, {26,42}, {16,5}, {18,79}, {24,69}, {26,41}, {49,60}, {49,61}, {20,40}, {18,37}, {24,70}, {20,39}, {35,62}, {16,4}, {37,16}, {43,29}, {24,0}, {44,88}, {36,38}, {23,93}, {22,14}, {49,70}, {21,66}, {42,41}, {39,60}, {49,69}, {19,61}, {49,64}, {49,65}, {49,67}, {49,68}, {20,58}, {30,64}, {41,12}, {49,66}, {49,62}, {23,66}, {49,63}, {46,3}, {41,81}, {35,71}, {23,65}, {24,79}, {49,71}, {37,60}, {49,75}, {27,93}, {27,85}, {49,78}, {49,76}, {43,2}, {49,73}, {49,82}, {49,77}, {49,80}, {23,37}, {43,30}, {49,81}, {49,83}, {49,85}, {25,79}, {46,33}, {49,74}, {49,72}, {49,84}, {49,79}, {49,87}, {50,2}, {49,89}, {49,93}, {50,0}, {49,90}, {50,29}, {25,72}, {18,16}, {49,88}, {50,4}, {15,85}, {50,3}, {15,4}, {40,41}, {50,1}, {49,91}, {49,86}, {49,92}, {25,39}, {50,5}, {15,86}, {50,14}, {50,6}, {50,7}, {29,4}, {42,72}, {50,12}, {50,11}, {36,14}, {50,13}, {50,10}, {16,19}, {25,21}, {30,15}, {50,8}, {36,65}, {50,9}, {15,1}, {50,19}, {44,2}, {29,6}, {50,25}, {50,24}, {50,15}, {33,34}, {50,16}, {33,78}, {50,21}, {29,5}, {50,18}, {43,67}, {22,27}, {50,22}, {50,23}, {50,20}, {50,26}, {50,17}, {50,32}, {50,37}, {50,33}, {50,28}, {50,38}, {32,16}, {50,40}, {24,1}, {50,30}, {34,92}, {50,34}, {50,27}, {19,12}, {19,77}, {18,68}, {50,35}, {50,31}, {22,85}, {50,41}, {50,39}, {32,50}, {20,41}, {21,11}, {50,36}, {21,83}, {16,35}, {50,45}, {50,43}, {51,6}, {50,48}, {50,42}, {50,46}, {50,44}, {26,43}, {50,47}, {50,50}, {50,55}, {50,53}, {50,52}, {34,17}, {17,36}, {50,49}, {50,51}, {29,7}, {16,18}, {50,54}, {17,61}, {50,65}, {29,91}, {50,61}, {50,59}, {50,60}, {50,62}, {16,28}, {32,24}, {50,56}, {50,57}, {18,89}, {50,64}, {19,78}, {50,67}, {50,63}, {50,66}, {41,13}, {37,52}, {39,23}, {50,69}, {50,68}, {18,36}, {50,70}, {50,73}, {50,72}, {50,71}, {38,24}, {50,74}, {50,75}, {50,77}, {50,76}, {50,79}, {50,82}, {50,80}, {50,78}, {50,81}, {50,83}, {50,84}, {50,85}, {50,86}, {50,87}, {48,36}, {27,91}, {26,44}, {17,82}, {15,87}, {34,35}, {50,88}, {25,3}, {15,46}, {30,61}, {50,89}, {23,38}, {24,80}, {50,91}, {50,90}, {41,63}, {50,92}, {51,0}, {50,93}, {51,1}, {51,2}, {22,86}, {16,63}, {51,3}, {51,5}, {51,4}, {51,7}, {36,57}, {51,8}, {15,20}, {25,62}, {22,28}, {34,46}, {51,9}, {51,10}, {51,12}, {51,13}, {25,67}, {21,48}, {42,22}, {51,11}, {51,14}, {25,32}, {24,2}, {51,18}, {25,4}, {34,18}, {51,15}, {35,57}, {51,19}, {30,65}, {51,17}, {51,20}, {22,30}, {51,21}, {51,22}, {24,3}, {18,31}, {51,24}, {51,25}, {51,26}, {51,23}, {51,16}, {51,27}, {51,28}, {42,67}, {29,74}, {51,30}, {51,31}, {51,29}, {51,33}, {38,23}, {15,71}, {40,53}, {51,34}, {29,92}, {27,24}, {38,60}, {19,79}, {25,74}, {42,56}, {37,17}, {22,87}, {33,46}, {51,32}, {51,35}, {33,35}, {51,36}, {51,37}, {51,39}, {35,72}, {19,13}, {83,0}, {16,64}, {41,82}, {29,75}, {36,39}, {25,69}, {51,45}, {41,28}, {45,60}, {17,83}, {51,41}, {32,25}, {51,44}, {36,66}, {36,40}, {36,67}, {39,24}, {35,44}, {25,40}, {51,40}, {16,85}, {36,21}, {51,42}, {51,38}, {30,47}, {51,46}, {28,45}, {21,12}, {51,47}, {41,71}, {32,92}, {35,37}, {51,49}, {42,46}, {51,50}, {51,55}, {41,14}, {51,54}, {51,48}, {51,51}, {51,53}, {25,5}, {41,40}, {51,56}, {34,36}, {17,84}, {29,76}, {51,58}, {51,57}, {24,71}, {51,59}, {51,61}, {51,60}, {51,63}, {51,52}, {51,65}, {51,64}, {51,62}, {26,45}, {30,48}, {32,51}, {51,66}, {31,27}, {15,76}, {38,67}, {35,58}, {51,68}, {51,67}, {51,69}, {51,70}, {51,71}, {51,72}, {41,48}, {51,73}, {17,37}, {51,74}, {44,27}, {18,15}, {49,40}, {28,39}, {33,30}, {51,75}, {43,74}, {43,19}, {51,77}, {33,70}, {36,22}, {33,31}, {40,54}, {51,78}, {51,79}, {16,90}, {27,25}, {51,80}, {15,47}, {51,81}, {51,82}, {16,65}, {19,80}, {37,63}, {41,83}, {51,86}, {32,52}, {51,85}, {22,31}, {42,58}, {51,84}, {36,68}, {51,88}, {51,87}, {51,90}, {51,89}, {16,91}, {51,91}, {29,8}, {51,93}, {34,4}, {51,92}, {41,18}, {28,86}, {36,58}, {52,0}, {24,4}, {52,1}, {38,0}, {39,61}, {43,48}, {38,4}, {52,10}, {20,23}, {44,36}, {43,14}, {53,11}, {52,2}, {52,5}, {33,36}, {42,23}, {36,41}, {52,6}, {42,68}, {25,41}, {29,9}, {52,7}, {26,47}, {26,46}, {15,24}, {23,39}, {31,10}, {15,48}, {52,11}, {52,12}, {52,9}, {16,23}, {19,14}, {52,8}, {43,36}, {40,16}, {15,7}, {15,88}, {26,48}, {15,49}, {15,2}, {52,17}, {52,15}, {43,27}, {52,18}, {52,16}, {52,14}, {30,16}, {52,13}, {41,57}, {23,67}, {52,22}, {52,23}, {29,10}, {52,19}, {46,11}, {38,43}, {52,21}, {25,6}, {52,24}, {40,55}, {52,25}, {52,20}, {43,26}, {38,61}, {52,26}, {40,17}, {52,27}, {52,31}, {52,28}, {17,38}, {52,30}, {27,26}, {52,29}, {22,88}, {52,43}, {52,36}, {52,33}, {34,67}, {52,32}, {52,34}, {52,35}, {52,37}, {52,38}, {19,81}, {52,40}, {52,39}, {52,41}, {29,77}, {52,44}, {35,59}, {16,36}, {52,42}, {52,45}, {52,46}, {52,49}, {52,47}, {52,48}, {26,49}, {52,50}, {24,5}, {52,51}, {26,89}, {33,23}, {52,52}, {52,53}, {26,57}, {24,6}, {43,49}, {20,7}, {23,40}, {52,54}, {18,55}, {52,55}, {33,24}, {52,56}, {53,2}, {52,57}, {52,58}, {52,59}, {52,61}, {52,62}, {52,63}, {33,79}, {16,6}, {27,72}, {15,33}, {32,54}, {19,15}, {27,20}, {24,7}, {36,69}, {28,0}, {19,16}, {34,71}, {35,73}, {15,23}, {20,24}, {41,84}, {27,33}, {20,49}, {31,74}, {27,27}, {44,7}, {52,64}, {20,59}, {25,42}, {18,17}, {16,66}, {29,11}, {17,39}, {52,65}, {44,37}, {28,40}, {27,67}, {52,66}, {19,82}, {37,49}, {43,8}, {52,67}, {52,68}, {40,56}, {52,70}, {19,7}, {21,86}, {52,69}, {19,17}, {30,17}, {52,74}, {26,0}, {17,40}, {52,73}, {52,71}, {52,75}, {52,72}, {38,10}, {59,44}, {30,18}, {52,76}, {45,31}, {52,77}, {52,79}, {34,93}, {52,78}, {31,2}, {26,90}, {33,47}, {27,86}, {40,84}, {31,75}, {27,44}, {52,80}, {29,12}, {52,81}, {52,82}, {15,50}, {33,25}, {30,49}, {52,83}, {37,18}, {29,13}, {29,14}, {52,84}, {31,76}, {29,15}, {52,85}, {52,86}, {43,63}, {52,87}, {21,37}, {28,1}, {52,88}, {52,89}, {27,59}, {30,11}, {37,83}, {30,51}, {39,87}, {38,1}, {21,40}, {52,90}, {20,78}, {52,91}, {21,93}, {37,46}, {17,15}, {26,50}, {52,92}, {53,1}, {53,0}, {21,92}, {52,93}, {36,23}, {33,15}, {36,42}, {27,39}, {32,55}, {44,89}, {53,3}, {53,4}, {37,53}, {26,18}, {53,6}, {53,7}, {53,8}, {19,83}, {53,9}, {53,10}, {17,11}, {32,26}, {19,67}, {53,12}, {43,7}, {33,49}, {18,56}, {53,14}, {53,16}, {19,62}, {53,13}, {53,15}, {53,18}, {53,17}, {53,19}, {53,20}, {37,28}, {21,13}, {17,68}, {53,21}, {53,26}, {53,24}, {41,86}, {41,85}, {36,70}, {53,23}, {28,51}, {53,22}, {30,81}, {53,27}, {25,73}, {53,33}, {53,34}, {53,28}, {18,18}, {53,29}, {53,38}, {53,37}, {53,36}, {53,32}, {53,31}, {53,35}, {41,87}, {53,42}, {53,39}, {53,41}, {44,81}, {53,40}, {53,30}, {30,82}, {53,43}, {25,22}, {53,44}, {53,45}, {53,48}, {53,47}, {53,46}, {36,71}, {53,25}, {53,54}, {53,50}, {53,49}, {53,51}, {53,52}, {53,55}, {45,69}, {53,56}, {53,53}, {53,57}, {19,63}, {53,58}, {53,60}, {53,59}, {53,61}, {53,62}, {31,77}, {28,2}, {28,67}, {32,66}, {24,8}, {25,23}, {24,9}, {20,79}, {53,63}, {25,24}, {23,41}, {53,64}, {43,5}, {38,34}, {53,65}, {24,10}, {19,11}, {34,6}, {21,49}, {26,51}, {40,58}, {39,32}, {53,66}, {19,84}, {53,69}, {35,0}, {53,68}, {53,67}, {53,70}, {35,74}, {30,66}, {26,52}, {31,41}, {33,50}, {20,1}, {35,1}, {53,71}, {53,72}, {29,78}, {42,24}, {53,75}, {53,74}, {53,73}, {40,92}, {53,82}, {42,57}, {53,76}, {53,78}, {42,74}, {53,77}, {53,79}, {39,7}, {53,80}, {41,29}, {53,81}, {19,18}, {41,30}, {38,14}, {53,83}, {53,84}, {24,11}, {19,19}, {53,85}, {23,23}, {44,35}, {44,8}, {19,85}, {53,87}, {35,2}, {24,12}, {29,16}, {39,62}, {29,17}, {28,87}, {35,75}, {41,88}, {36,24}, {24,13}, {40,59}, {53,88}, {36,56}, {25,33}, {23,42}, {35,76}, {15,34}, {28,77}, {24,14}, {44,38}, {53,89}, {53,90}, {38,48}, {53,91}, {45,86}, {46,12}, {53,93}, {53,92}, {18,38}, {54,0}, {54,3}, {54,4}, {54,2}, {40,31}, {29,18}, {54,6}, {54,5}, {54,1}, {54,7}, {54,8}, {54,9}, {54,12}, {54,10}, {54,11}, {54,13}, {16,67}, {35,77}, {54,14}, {22,89}, {17,85}, {38,21}, {54,15}, {37,90}, {41,58}, {54,16}, {46,13}, {54,17}, {41,31}, {54,20}, {47,0}, {47,16}, {27,15}, {37,84}, {54,21}, {20,60}, {35,3}, {15,89}, {54,22}, {41,5}, {24,15}, {34,47}, {35,78}, {43,78}, {23,24}, {23,43}, {54,23}, {54,24}, {54,30}, {27,68}, {35,4}, {21,14}, {54,25}, {40,10}, {34,37}, {54,26}, {54,27}, {21,15}, {54,28}, {54,29}, {54,31}, {36,85}, {54,32}, {54,33}, {54,34}, {54,19}, {54,18}, {54,35}, {22,32}, {40,6}, {25,43}, {40,22}, {35,5}, {40,42}, {54,36}, {29,19}, {16,37}, {54,37}, {54,38}, {43,81}, {39,63}, {54,41}, {16,92}, {31,11}, {54,40}, {54,39}, {22,33}, {33,51}, {54,45}, {54,43}, {54,42}, {45,6}, {23,68}, {28,88}, {54,44}, {36,43}, {28,29}, {37,31}, {54,48}, {54,47}, {54,46}, {54,49}, {23,69}, {54,50}, {40,91}, {28,58}, {54,51}, {39,88}, {37,32}, {35,6}, {36,15}, {54,52}, {20,10}, {30,19}, {40,11}, {19,86}, {38,5}, {54,53}, {26,53}, {42,25}, {42,26}, {16,93}, {54,58}, {34,72}, {54,55}, {17,86}, {55,12}, {54,57}, {38,15}, {54,56}, {54,54}, {24,89}, {54,60}, {54,66}, {54,72}, {54,64}, {36,59}, {54,69}, {40,60}, {54,63}, {54,68}, {45,70}, {26,54}, {33,52}, {54,61}, {20,61}, {54,71}, {31,12}, {16,68}, {54,65}, {17,87}, {54,70}, {21,16}, {54,67}, {54,73}, {54,75}, {54,85}, {54,83}, {54,80}, {54,79}, {45,87}, {54,81}, {21,17}, {24,16}, {28,89}, {54,88}, {54,74}, {54,78}, {54,62}, {17,89}, {54,82}, {54,84}, {34,48}, {25,7}, {17,23}, {54,76}, {54,87}, {54,86}, {21,18}, {33,8}, {18,69}, {22,34}, {54,77}, {54,89}, {54,92}, {55,0}, {27,28}, {55,6}, {35,79}, {54,90}, {55,4}, {17,88}, {55,2}, {55,3}, {54,93}, {55,1}, {23,70}, {44,9}, {19,20}, {16,56}, {55,5}, {38,25}, {15,12}, {39,64}, {54,59}, {55,11}, {55,15}, {43,68}, {55,8}, {36,72}, {55,13}, {29,79}, {55,14}, {37,54}, {46,38}, {55,10}, {55,16}, {24,90}, {31,42}, {15,51}, {55,9}, {55,7}, {32,57}, {54,91}, {26,19}, {33,37}, {55,28}, {32,58}, {55,23}, {55,20}, {55,21}, {27,69}, {55,24}, {55,27}, {55,22}, {28,4}, {55,25}, {55,19}, {43,91}, {43,90}, {55,29}, {55,30}, {15,52}, {55,18}, {21,81}, {15,5}, {19,21}, {55,26}, {55,34}, {55,33}, {55,38}, {55,39}, {55,37}, {55,40}, {55,32}, {55,36}, {55,41}, {55,42}, {55,31}, {26,91}, {55,35}, {33,53}, {24,17}, {55,17}, {30,20}, {55,55}, {41,72}, {55,45}, {55,46}, {55,47}, {55,54}, {55,53}, {42,92}, {19,22}, {55,51}, {22,36}, {18,19}, {55,48}, {45,23}, {55,50}, {15,53}, {55,52}, {55,43}, {55,49}, {55,56}, {22,35}, {55,44}, {44,60}, {44,10}, {55,59}, {55,63}, {32,93}, {45,88}, {55,64}, {55,61}, {55,58}, {55,57}, {55,62}, {41,15}, {37,19}, {22,37}, {55,65}, {55,60}, {55,66}, {22,90}, {17,16}, {55,74}, {19,23}, {55,72}, {55,73}, {25,8}, {55,71}, {55,69}, {55,68}, {55,75}, {55,67}, {55,77}, {17,90}, {55,79}, {55,78}, {35,7}, {55,82}, {55,80}, {55,70}, {22,91}, {55,81}, {55,85}, {55,84}, {55,86}, {55,83}, {55,87}, {55,88}, {55,89}, {41,73}, {55,91}, {55,90}, {28,30}, {31,13}, {17,69}, {17,91}, {55,92}, {15,30}, {31,43}, {55,93}, {75,34}, {56,0}, {22,64}, {56,1}, {31,78}, {56,2}, {56,3}, {20,25}, {56,4}, {56,5}, {56,6}, {33,54}, {23,44}, {43,64}, {42,27}, {28,73}, {56,7}, {31,79}, {77,28}, {39,65}, {27,73}, {25,44}, {56,8}, {33,38}, {41,6}, {33,80}, {56,11}, {56,9}, {56,12}, {56,10}, {56,13}, {41,16}, {15,22}, {40,61}, {39,66}, {56,14}, {56,17}, {29,20}, {20,26}, {56,15}, {56,22}, {29,21}, {56,16}, {38,35}, {44,61}, {56,18}, {56,19}, {56,23}, {36,73}, {56,20}, {24,18}, {31,61}, {56,37}, {39,19}, {33,81}, {39,67}, {57,12}, {41,89}, {35,80}, {42,84}, {56,26}, {17,0}, {34,73}, {56,35}, {34,19}, {56,29}, {56,36}, {56,31}, {56,38}, {56,34}, {56,33}, {38,78}, {56,27}, {17,92}, {56,25}, {20,80}, {33,82}, {56,21}, {56,24}, {24,19}, {31,58}, {29,22}, {56,32}, {38,49}, {20,81}, {18,39}, {18,70}, {30,0}, {56,40}, {56,45}, {56,41}, {22,92}, {56,46}, {26,1}, {24,72}, {28,5}, {56,28}, {26,92}, {56,43}, {26,55}, {56,44}, {15,35}, {56,39}, {35,8}, {20,82}, {21,19}, {56,42}, {15,6}, {25,34}, {30,21}, {35,81}, {39,51}, {56,48}, {32,61}, {33,9}, {26,10}, {56,49}, {56,51}, {56,47}, {41,64}, {35,28}, {32,59}, {41,90}, {27,45}, {56,63}, {56,62}, {30,87}, {22,93}, {56,56}, {29,24}, {37,71}, {38,16}, {56,54}, {32,60}, {27,87}, {56,59}, {29,23}, {56,53}, {56,58}, {38,50}, {56,52}, {22,0}, {18,60}, {56,60}, {45,10}, {25,45}, {34,20}, {56,57}, {31,59}, {24,20}, {30,67}, {16,69}, {32,27}, {56,55}, {20,36}, {22,38}, {35,46}, {56,61}, {32,62}, {56,64}, {56,66}, {33,22}, {56,72}, {56,67}, {56,69}, {40,32}, {35,82}, {56,70}, {44,11}, {44,39}, {19,24}, {15,13}, {56,68}, {56,65}, {19,87}, {16,70}, {56,71}, {44,40}, {56,75}, {33,26}, {56,82}, {56,76}, {56,73}, {56,80}, {56,50}, {56,77}, {56,81}, {39,33}, {36,74}, {56,74}, {56,78}, {22,39}, {25,80}, {31,60}, {56,86}, {36,5}, {56,83}, {42,63}, {56,84}, {56,85}, {43,45}, {31,1}, {22,65}, {56,92}, {26,20}, {56,89}, {56,88}, {38,17}, {37,20}, {36,16}, {56,90}, {56,91}, {40,78}, {38,36}, {26,2}, {31,80}, {42,47}, {18,40}, {57,4}, {56,93}, {44,41}, {57,6}, {57,2}, {57,3}, {32,63}, {57,1}, {56,30}, {57,5}, {57,0}, {57,10}, {57,11}, {36,6}, {57,13}, {26,3}, {57,8}, {20,27}, {57,14}, {57,7}, {57,18}, {57,17}, {57,16}, {57,19}, {57,21}, {29,80}, {57,20}, {57,24}, {57,22}, {57,23}, {56,79}, {57,26}, {57,25}, {56,87}, {57,27}, {57,15}, {26,56}, {57,28}, {57,29}, {57,31}, {57,30}, {57,32}, {17,93}, {24,21}, {41,91}, {31,14}, {23,45}, {57,34}, {57,37}, {40,49}, {20,62}, {57,36}, {57,35}, {38,51}, {57,38}, {21,20}, {57,40}, {57,39}, {19,25}, {26,21}, {37,55}, {22,40}, {30,83}, {57,41}, {31,15}, {36,7}, {40,62}, {57,42}, {57,43}, {57,44}, {41,23}, {52,60}, {31,37}, {40,43}, {25,55}, {39,68}, {39,34}, {36,44}, {45,32}, {57,46}, {27,47}, {57,47}, {15,21}, {21,51}, {31,44}, {40,63}, {57,48}, {26,33}, {34,38}, {26,58}, {30,22}, {57,49}, {41,92}, {16,86}, {26,59}, {57,52}, {57,50}, {57,53}, {45,24}, {57,51}, {31,90}, {57,54}, {33,17}, {57,55}, {19,89}, {57,57}, {57,56}, {57,58}, {57,59}, {19,90}, {37,91}, {34,21}, {20,75}, {26,60}, {32,64}, {28,59}, {15,15}, {57,60}, {17,1}, {57,64}, {24,22}, {57,63}, {25,10}, {29,25}, {57,62}, {29,26}, {43,31}, {25,9}, {15,54}, {31,45}, {57,69}, {31,16}, {16,38}, {28,52}, {42,69}, {25,81}, {29,27}, {31,6}, {57,68}, {57,66}, {57,67}, {34,74}, {58,5}, {57,73}, {26,93}, {24,23}, {57,71}, {57,72}, {30,23}, {57,70}, {26,14}, {57,75}, {57,74}, {57,79}, {57,80}, {57,76}, {18,1}, {57,77}, {57,78}, {39,52}, {40,64}, {22,41}, {57,81}, {31,17}, {29,28}, {34,49}, {21,38}, {57,82}, {57,86}, {17,42}, {57,83}, {57,85}, {57,84}, {28,74}, {34,39}, {15,36}, {57,87}, {57,88}, {35,9}, {45,80}, {26,34}, {41,74}, {42,28}, {58,1}, {57,90}, {57,93}, {57,92}, {57,89}, {58,0}, {37,61}, {57,91}, {58,2}, {28,75}, {58,3}, {44,42}, {38,87}, {58,4}, {58,6}, {58,7}, {58,8}, {21,41}, {16,39}, {24,24}, {58,9}, {58,10}, {28,80}, {32,65}, {49,55}, {32,29}, {32,28}, {33,55}, {25,38}, {47,81}, {22,77}, {44,12}, {41,93}, {40,93}, {58,11}, {25,82}, {35,30}, {58,12}, {46,14}, {42,29}, {35,10}, {58,13}, {19,91}, {58,14}, {58,15}, {43,57}, {43,3}, {42,85}, {42,59}, {26,4}, {58,17}, {27,74}, {42,48}, {58,19}, {58,22}, {58,21}, {19,88}, {20,63}, {58,18}, {58,20}, {58,23}, {30,88}, {44,90}, {15,40}, {25,63}, {33,27}, {27,60}, {29,82}, {58,26}, {36,45}, {58,24}, {33,10}, {58,25}, {29,81}, {43,60}, {58,27}, {58,28}, {44,71}, {58,33}, {24,25}, {38,52}, {58,30}, {36,75}, {57,61}, {57,65}, {20,46}, {38,38}, {58,32}, {29,29}, {39,35}, {58,38}, {39,89}, {58,29}, {58,35}, {58,34}, {31,46}, {42,76}, {45,50}, {42,70}, {17,43}, {26,61}, {46,39}, {58,37}, {30,84}, {58,36}, {58,31}, {23,46}, {58,43}, {58,41}, {17,44}, {58,39}, {58,45}, {58,51}, {33,39}, {41,32}, {58,53}, {40,1}, {58,52}, {38,79}, {42,30}, {19,26}, {31,86}, {28,31}, {35,50}, {44,13}, {58,48}, {58,47}, {58,49}, {58,46}, {58,54}, {58,44}, {58,42}, {58,50}, {58,40}, {34,75}, {43,87}, {27,37}, {25,83}, {25,25}, {42,78}, {18,32}, {35,45}, {37,41}, {16,40}, {31,81}, {31,19}, {22,9}, {58,56}, {24,26}, {18,91}, {58,58}, {18,83}, {58,64}, {58,61}, {31,82}, {18,42}, {25,11}, {18,41}, {25,46}, {58,59}, {22,68}, {22,42}, {36,76}, {58,57}, {15,37}, {58,60}, {58,62}, {21,44}, {22,11}, {19,27}, {20,42}, {58,65}, {25,88}, {42,80}, {26,22}, {58,66}, {40,15}, {58,78}, {17,18}, {58,67}, {58,84}, {58,68}, {45,33}, {58,75}, {38,62}, {58,83}, {58,70}, {15,19}, {58,72}, {24,27}, {58,74}, {58,73}, {58,69}, {58,80}, {29,30}, {51,76}, {23,71}, {44,91}, {58,71}, {35,83}, {18,2}, {25,12}, {58,63}, {58,79}, {18,64}, {58,77}, {58,81}, {36,77}, {19,93}, {59,17}, {43,40}, {58,86}, {19,92}, {58,93}, {42,31}, {59,0}, {59,2}, {59,6}, {58,88}, {34,9}, {36,78}, {59,10}, {58,91}, {59,7}, {59,1}, {30,24}, {59,11}, {31,18}, {59,9}, {19,28}, {46,47}, {58,85}, {59,5}, {15,55}, {58,87}, {43,25}, {58,92}, {30,1}, {35,38}, {58,82}, {59,4}, {30,89}, {59,14}, {18,80}, {23,0}, {59,16}, {58,89}, {59,15}, {59,8}, {58,90}, {59,12}, {59,13}, {59,30}, {37,45}, {59,3}, {59,26}, {59,28}, {35,55}, {44,43}, {40,85}, {59,23}, {33,41}, {59,29}, {32,30}, {59,20}, {59,33}, {59,32}, {37,78}, {59,31}, {37,73}, {59,35}, {59,22}, {21,39}, {59,25}, {28,60}, {38,63}, {59,27}, {21,42}, {59,19}, {59,21}, {59,18}, {46,15}, {18,57}, {59,24}, {59,34}, {18,20}, {25,70}, {16,60}, {59,51}, {46,16}, {59,54}, {30,25}, {59,53}, {59,52}, {59,49}, {59,37}, {59,66}, {59,36}, {59,55}, {59,47}, {59,42}, {59,39}, {59,40}, {59,48}, {83,1}, {59,45}, {24,28}, {35,39}, {32,67}, {59,43}, {59,38}, {59,41}, {44,44}, {42,73}, {59,46}, {59,56}, {59,64}, {59,57}, {59,70}, {59,68}, {59,63}, {59,62}, {35,47}, {32,68}, {59,60}, {59,58}, {59,65}, {59,71}, {39,84}, {59,77}, {59,72}, {59,75}, {59,69}, {34,83}, {40,23}, {59,59}, {59,67}, {29,31}, {43,46}, {59,87}, {59,74}, {23,1}, {17,2}, {18,62}, {59,50}, {29,32}, {59,79}, {59,86}, {27,88}, {18,81}, {34,13}, {59,76}, {59,81}, {59,85}, {21,21}, {20,43}, {59,83}, {20,0}, {37,42}, {59,82}, {59,84}, {59,78}, {59,80}, {18,63}, {34,40}, {59,91}, {59,89}, {23,72}, {59,88}, {60,0}, {58,55}, {59,90}, {59,92}, {59,93}, {60,11}, {60,7}, {58,76}, {60,6}, {60,5}, {60,2}, {59,73}, {60,4}, {60,3}, {60,9}, {46,5}, {60,12}, {21,90}, {60,8}, {60,10}, {39,6}, {60,13}, {60,17}, {60,14}, {44,82}, {60,15}, {59,61}, {60,18}, {60,19}, {16,20}, {60,21}, {22,70}, {27,0}, {21,52}, {17,3}, {44,62}, {60,23}, {60,22}, {60,25}, {20,28}, {21,53}, {19,29}, {60,28}, {60,27}, {60,29}, {17,45}, {34,22}, {60,30}, {19,30}, {60,32}, {60,31}, {60,33}, {60,34}, {60,35}, {26,62}, {31,20}, {25,0}, {40,79}, {41,65}, {46,35}, {26,84}, {25,47}, {45,81}, {60,36}, {60,37}, {26,63}, {60,38}, {60,39}, {60,41}, {60,40}, {42,55}, {28,61}, {27,75}, {26,35}, {60,42}, {60,44}, {30,2}, {60,43}, {60,45}, {60,46}, {60,47}, {60,48}, {60,49}, {60,51}, {60,50}, {60,52}, {17,4}, {34,41}, {60,53}, {26,5}, {18,43}, {60,54}, {36,33}, {51,43}, {20,2}, {60,55}, {60,56}, {41,75}, {42,71}, {37,38}, {60,57}, {39,69}, {39,90}, {43,50}, {60,58}, {60,60}, {60,59}, {60,62}, {60,61}, {60,64}, {26,64}, {43,16}, {60,65}, {60,66}, {20,3}, {60,67}, {60,69}, {60,68}, {30,68}, {40,24}, {16,41}, {39,36}, {35,84}, {28,32}, {20,64}, {39,37}, {27,13}, {60,71}, {19,31}, {16,87}, {37,81}, {60,70}, {24,29}, {34,50}, {60,72}, {60,80}, {60,73}, {33,32}, {20,65}, {60,81}, {22,71}, {20,4}, {60,79}, {60,77}, {60,74}, {44,63}, {35,31}, {37,56}, {60,75}, {60,83}, {60,82}, {22,2}, {17,12}, {25,26}, {60,76}, {60,78}, {42,54}, {33,83}, {42,86}, {60,91}, {60,92}, {17,46}, {41,7}, {43,92}, {61,0}, {27,2}, {29,33}, {60,87}, {60,93}, {16,71}, {21,22}, {60,84}, {60,89}, {31,83}, {38,80}, {39,70}, {60,86}, {42,0}, {60,88}, {61,3}, {61,1}, {60,90}, {42,1}, {38,39}, {20,66}, {36,4}, {34,76}, {61,4}, {61,2}, {33,56}, {60,85}, {16,42}, {44,45}, {61,15}, {61,14}, {31,85}, {61,11}, {44,75}, {37,21}, {61,5}, {35,36}, {16,43}, {24,30}, {61,8}, {28,6}, {61,13}, {61,12}, {61,7}, {61,10}, {18,71}, {61,9}, {38,40}, {45,13}, {29,83}, {31,84}, {61,21}, {61,19}, {40,44}, {61,16}, {61,18}, {16,25}, {24,31}, {46,17}, {18,28}, {40,65}, {44,64}, {18,3}, {30,26}, {61,20}, {61,25}, {29,34}, {44,15}, {61,22}, {61,17}, {61,23}, {45,61}, {36,82}, {37,33}, {18,21}, {16,52}, {61,29}, {61,32}, {45,34}, {44,67}, {61,39}, {61,33}, {61,30}, {45,51}, {61,36}, {28,41}, {61,38}, {61,43}, {36,80}, {61,41}, {61,35}, {34,23}, {61,42}, {61,31}, {61,37}, {61,44}, {15,91}, {61,34}, {61,45}, {30,27}, {28,62}, {41,4}, {25,13}, {61,26}, {61,40}, {36,25}, {31,21}, {18,72}, {25,48}, {29,35}, {61,28}, {28,33}, {22,43}, {61,27}, {61,49}, {28,76}, {23,25}, {61,64}, {61,58}, {20,83}, {36,46}, {61,53}, {61,62}, {15,14}, {16,17}, {17,24}, {61,55}, {33,11}, {61,46}, {61,48}, {24,32}, {61,65}, {61,60}, {61,52}, {61,59}, {43,10}, {61,57}, {61,61}, {23,47}, {29,36}, {34,24}, {61,51}, {44,14}, {61,54}, {61,47}, {36,81}, {61,50}, {61,56}, {46,48}, {27,29}, {42,93}, {61,66}, {39,13}, {61,78}, {23,26}, {28,63}, {61,68}, {45,14}, {24,33}, {61,81}, {15,77}, {61,79}, {61,67}, {61,73}, {61,75}, {44,46}, {61,70}, {36,13}, {61,72}, {61,80}, {61,74}, {43,38}, {61,69}, {27,1}, {61,93}, {18,73}, {61,71}, {61,76}, {61,77}, {33,75}, {33,57}, {61,85}, {61,91}, {61,89}, {36,8}, {62,2}, {61,86}, {61,87}, {61,63}, {20,88}, {40,25}, {27,30}, {24,86}, {46,18}, {61,83}, {62,1}, {16,72}, {32,69}, {38,88}, {19,32}, {45,89}, {43,0}, {35,49}, {61,90}, {61,92}, {32,17}, {62,0}, {61,88}, {61,82}, {19,34}, {22,72}, {62,14}, {62,9}, {31,87}, {18,66}, {28,64}, {62,18}, {62,11}, {35,11}, {62,8}, {35,56}, {62,43}, {62,5}, {62,4}, {62,13}, {62,7}, {62,6}, {62,12}, {31,0}, {62,3}, {62,15}, {62,16}, {19,33}, {62,21}, {62,20}, {62,22}, {62,25}, {36,34}, {62,19}, {62,23}, {22,66}, {33,88}, {62,17}, {38,26}, {62,24}, {62,29}, {62,27}, {62,30}, {62,33}, {62,26}, {24,73}, {38,7}, {61,24}, {44,83}, {62,28}, {62,32}, {33,84}, {62,31}, {62,10}, {78,72}, {62,36}, {62,40}, {62,38}, {62,34}, {62,35}, {62,39}, {62,37}, {40,45}, {62,45}, {62,42}, {62,41}, {62,44}, {37,51}, {62,46}, {34,84}, {33,76}, {31,4}, {62,47}, {62,49}, {62,48}, {61,84}, {62,50}, {37,70}, {62,51}, {17,47}, {36,83}, {18,4}, {20,67}, {27,61}, {25,49}, {46,6}, {30,69}, {16,73}, {62,53}, {62,52}, {62,56}, {34,25}, {62,59}, {62,54}, {62,58}, {62,57}, {36,31}, {15,56}, {45,84}, {62,61}, {16,7}, {62,63}, {62,62}, {62,60}, {62,55}, {42,2}, {62,65}, {62,64}, {16,74}, {62,67}, {41,17}, {62,66}, {43,20}, {29,38}, {32,18}, {29,37}, {45,90}, {62,73}, {31,88}, {62,69}, {62,74}, {16,75}, {62,72}, {38,64}, {62,68}, {62,71}, {29,39}, {39,48}, {62,75}, {27,48}, {31,89}, {62,78}, {62,70}, {22,6}, {62,76}, {44,47}, {62,79}, {83,5}, {28,46}, {62,80}, {62,81}, {38,13}, {62,83}, {62,84}, {38,18}, {36,84}, {62,86}, {62,88}, {45,52}, {62,85}, {62,87}, {16,76}, {62,82}, {50,58}, {62,89}, {32,70}, {26,23}, {62,91}, {62,90}, {30,3}, {49,56}, {62,92}, {63,0}, {62,77}, {62,93}, {63,1}, {38,89}, {63,2}, {63,3}, {63,4}, {63,5}, {35,61}, {63,7}, {63,6}, {63,8}, {63,9}, {27,62}, {40,66}, {43,75}, {63,10}, {63,11}, {32,53}, {27,3}, {63,12}, {63,13}, {63,14}, {41,49}, {39,38}, {63,15}, {38,54}, {35,12}, {63,16}, {17,70}, {20,76}, {43,37}, {43,21}, {17,19}, {46,19}, {42,49}, {41,9}, {31,22}, {63,17}, {37,34}, {23,2}, {63,18}, {25,51}, {63,20}, {63,19}, {63,21}, {63,22}, {63,23}, {20,29}, {63,24}, {63,25}, {23,3}, {39,39}, {63,27}, {29,84}, {63,26}, {21,23}, {63,28}, {63,30}, {63,29}, {63,31}, {23,48}, {63,32}, {21,72}, {32,31}, {24,92}, {63,34}, {63,35}, {63,33}, {27,76}, {37,39}, {21,24}, {63,37}, {34,11}, {63,36}, {46,20}, {38,65}, {63,40}, {63,42}, {63,39}, {43,51}, {63,41}, {63,43}, {45,35}, {63,47}, {63,46}, {34,85}, {38,12}, {23,4}, {63,45}, {63,44}, {44,16}, {44,17}, {63,48}, {16,77}, {24,85}, {26,65}, {63,49}, {63,50}, {63,52}, {28,34}, {63,54}, {63,53}, {63,55}, {18,44}, {63,57}, {63,56}, {63,59}, {63,58}, {23,27}, {45,7}, {21,43}, {17,5}, {21,73}, {19,64}, {45,71}, {63,61}, {63,63}, {63,64}, {17,48}, {63,60}, {26,24}, {35,32}, {63,62}, {63,67}, {27,77}, {63,65}, {22,29}, {39,40}, {63,66}, {63,93}, {63,72}, {23,28}, {20,68}, {63,69}, {44,92}, {45,15}, {33,85}, {63,71}, {63,73}, {45,53}, {21,54}, {39,91}, {38,41}, {63,74}, {63,76}, {63,79}, {63,75}, {63,78}, {23,73}, {16,44}, {63,80}, {30,79}, {63,77}, {45,59}, {63,83}, {83,3}, {63,81}, {63,84}, {63,70}, {63,82}, {25,27}, {63,85}, {63,86}, {44,93}, {63,87}, {63,88}, {63,68}, {63,89}, {19,35}, {27,4}, {63,90}, {63,91}, {63,92}, {16,26}, {64,0}, {40,26}, {64,1}, {19,3}, {64,2}, {64,3}, {64,4}, {64,6}, {64,7}, {64,5}, {40,50}, {64,9}, {64,8}, {64,11}, {64,10}, {64,12}, {64,13}, {64,15}, {64,14}, {24,88}, {64,17}, {64,16}, {19,36}, {30,50}, {36,27}, {64,18}, {31,23}, {26,25}, {16,88}, {64,19}, {44,48}, {41,66}, {64,20}, {36,35}, {44,18}, {24,34}, {30,28}, {34,42}, {49,19}, {35,13}, {17,71}, {64,21}, {64,22}, {64,27}, {64,25}, {64,24}, {57,33}, {18,5}, {64,23}, {15,57}, {39,9}, {39,41}, {45,16}, {64,28}, {64,26}, {34,59}, {31,5}, {39,10}, {40,12}, {64,30}, {45,11}, {22,44}, {64,31}, {64,29}, {39,53}, {64,32}, {64,33}, {15,58}, {29,85}, {64,38}, {64,35}, {37,76}, {64,34}, {20,5}, {64,41}, {64,36}, {64,37}, {64,40}, {64,39}, {40,4}, {32,33}, {32,32}, {20,30}, {64,42}, {64,43}, {64,44}, {64,46}, {64,45}, {16,53}, {64,54}, {39,71}, {64,48}, {64,50}, {64,52}, {30,29}, {64,53}, {64,51}, {27,31}, {64,47}, {64,49}, {40,33}, {29,40}, {64,56}, {64,55}, {64,57}, {27,5}, {25,14}, {36,86}, {64,58}, {35,42}, {64,60}, {45,0}, {64,59}, {32,72}, {64,65}, {64,67}, {64,68}, {34,51}, {64,66}, {64,63}, {64,61}, {64,62}, {64,64}, {64,71}, {64,69}, {64,70}, {64,72}, {64,74}, {64,75}, {64,76}, {64,77}, {64,73}, {64,79}, {64,78}, {64,80}, {45,36}, {64,83}, {64,81}, {64,82}, {19,65}, {43,93}, {41,41}, {64,85}, {64,84}, {64,86}, {64,87}, {64,91}, {64,88}, {64,89}, {64,90}, {64,92}, {64,93}, {65,0}, {65,1}, {65,2}, {39,14}, {36,47}, {65,3}, {38,81}, {40,19}, {65,4}, {65,5}, {36,9}, {18,6}, {24,35}, {65,6}, {65,7}, {65,8}, {26,8}, {65,10}, {65,9}, {65,11}, {65,12}, {39,72}, {65,13}, {65,14}, {82,72}, {65,15}, {65,16}, {65,17}, {26,13}, {65,18}, {38,53}, {42,62}, {16,45}, {16,54}, {65,19}, {65,21}, {65,20}, {36,79}, {31,24}, {60,24}, {65,22}, {43,32}, {65,23}, {19,37}, {39,54}, {65,24}, {65,25}, {65,26}, {43,59}, {43,52}, {35,29}, {32,73}, {65,28}, {28,65}, {29,41}, {65,31}, {65,30}, {65,29}, {39,92}, {19,38}, {23,8}, {65,37}, {65,34}, {30,30}, {43,17}, {65,33}, {65,35}, {65,36}, {65,32}, {65,38}, {65,39}, {35,14}, {19,66}, {34,68}, {65,40}, {65,41}, {65,44}, {30,70}, {37,35}, {65,45}, {42,50}, {65,42}, {65,43}, {65,48}, {65,47}, {65,46}, {65,50}, {65,49}, {65,51}, {65,53}, {65,52}, {41,44}, {28,53}, {45,37}, {65,54}, {37,22}, {65,55}, {65,56}, {65,60}, {65,58}, {65,59}, {65,57}, {65,61}, {65,62}, {65,63}, {65,64}, {43,22}, {65,65}, {43,79}, {65,66}, {34,45}, {38,73}, {21,74}, {34,26}, {65,67}, {21,25}, {31,47}, {65,68}, {25,28}, {65,69}, {65,70}, {23,5}, {25,52}, {65,72}, {36,53}, {25,53}, {20,45}, {42,3}, {38,42}, {36,54}, {24,59}, {65,74}, {29,42}, {45,17}, {24,36}, {23,6}, {39,2}, {65,76}, {65,78}, {23,74}, {65,77}, {35,85}, {65,80}, {18,22}, {65,75}, {39,73}, {16,15}, {25,75}, {46,49}, {65,79}, {65,81}, {41,42}, {31,56}, {65,83}, {65,84}, {65,82}, {18,45}, {65,90}, {65,89}, {27,6}, {65,91}, {65,86}, {65,92}, {65,87}, {39,55}, {65,85}, {65,88}, {66,1}, {66,0}, {42,64}, {65,93}, {15,74}, {66,3}, {66,2}, {29,43}, {66,4}, {32,34}, {66,6}, {66,5}, {66,7}, {65,71}, {65,73}, {66,9}, {66,8}, {27,7}, {45,72}, {27,49}, {66,10}, {22,22}, {20,31}, {20,6}, {26,66}, {44,19}, {66,16}, {66,15}, {32,35}, {66,12}, {66,14}, {28,42}, {30,31}, {66,13}, {66,11}, {38,9}, {29,44}, {40,27}, {25,54}, {36,87}, {66,17}, {66,18}, {66,40}, {21,55}, {46,28}, {32,20}, {66,19}, {17,49}, {35,86}, {41,0}, {66,20}, {20,89}, {66,21}, {66,23}, {66,24}, {38,8}, {66,25}, {66,26}, {66,27}, {21,56}, {17,50}, {37,36}, {28,7}, {26,67}, {66,28}, {28,8}, {17,41}, {40,34}, {66,29}, {39,74}, {32,36}, {66,32}, {66,33}, {38,72}, {30,32}, {66,30}, {34,64}, {66,31}, {29,45}, {15,59}, {20,8}, {66,34}, {35,87}, {66,35}, {31,38}, {43,12}, {40,2}, {66,36}, {66,37}, {34,52}, {45,38}, {66,39}, {66,38}, {27,78}, {66,41}, {15,79}, {66,44}, {66,42}, {17,51}, {22,45}, {66,43}, {24,37}, {24,81}, {41,69}, {66,45}, {42,51}, {66,47}, {31,48}, {16,46}, {17,25}, {15,11}, {66,46}, {66,48}, {66,49}, {29,86}, {66,50}, {18,46}, {66,52}, {22,73}, {20,69}, {66,53}, {21,84}, {66,54}, {31,91}, {37,44}, {31,63}, {25,84}, {66,55}, {34,65}, {32,74}, {66,57}, {66,59}, {66,56}, {66,58}, {22,1}, {66,60}, {22,5}, {20,70}, {44,49}, {66,62}, {66,63}, {16,13}, {66,66}, {18,85}, {66,65}, {66,64}, {66,68}, {66,61}, {66,69}, {45,8}, {66,70}, {66,71}, {51,83}, {66,73}, {66,72}, {66,74}, {66,75}, {45,20}, {66,76}, {79,78}, {29,46}, {66,77}, {66,78}, {28,54}, {37,23}, {66,79}, {34,7}, {66,80}, {34,27}, {66,81}, {21,4}, {48,30}, {34,60}, {27,18}, {19,39}, {66,82}, {67,1}, {66,85}, {20,71}, {66,84}, {67,3}, {66,83}, {29,47}, {66,87}, {66,88}, {36,10}, {66,89}, {18,61}, {30,57}, {40,67}, {66,91}, {33,71}, {66,86}, {66,90}, {66,92}, {25,90}, {67,5}, {40,13}, {39,5}, {36,88}, {21,57}, {67,4}, {67,2}, {39,20}, {66,93}, {34,61}, {36,90}, {36,89}, {25,85}, {67,23}, {67,7}, {67,9}, {67,12}, {67,13}, {67,10}, {67,11}, {67,8}, {67,6}, {67,0}, {41,46}, {17,52}, {67,20}, {67,17}, {67,22}, {67,21}, {38,82}, {43,6}, {26,26}, {67,15}, {67,24}, {67,19}, {67,18}, {67,14}, {67,16}, {19,40}, {34,28}, {31,92}, {39,1}, {67,29}, {39,3}, {31,64}, {67,26}, {39,46}, {67,30}, {41,50}, {34,58}, {67,25}, {67,27}, {67,28}, {67,31}, {27,35}, {37,37}, {67,36}, {67,35}, {67,32}, {46,21}, {67,41}, {67,45}, {67,42}, {67,38}, {67,39}, {67,44}, {67,33}, {49,52}, {67,40}, {67,34}, {67,43}, {67,49}, {19,41}, {67,46}, {67,47}, {67,48}, {67,51}, {67,50}, {39,85}, {67,52}, {45,91}, {41,76}, {67,57}, {67,54}, {67,53}, {31,49}, {67,56}, {67,58}, {67,55}, {67,62}, {67,59}, {67,60}, {67,37}, {67,61}, {67,63}, {67,64}, {41,37}, {67,65}, {43,65}, {21,45}, {22,8}, {67,66}, {41,19}, {30,71}, {43,15}, {67,67}, {45,18}, {38,83}, {32,37}, {38,19}, {28,44}, {15,31}, {67,72}, {67,70}, {67,68}, {19,0}, {29,48}, {67,73}, {67,71}, {67,69}, {67,77}, {67,76}, {67,75}, {67,74}, {67,78}, {67,79}, {31,25}, {67,80}, {67,82}, {67,81}, {23,49}, {32,23}, {67,84}, {36,91}, {67,83}, {67,85}, {41,20}, {32,75}, {24,38}, {67,86}, {45,39}, {67,88}, {67,89}, {67,90}, {67,91}, {26,68}, {67,92}, {22,46}, {20,73}, {20,9}, {68,0}, {43,82}, {24,39}, {67,93}, {68,3}, {43,69}, {38,27}, {40,18}, {28,66}, {68,2}, {27,50}, {24,40}, {26,69}, {20,72}, {41,21}, {68,1}, {32,38}, {42,33}, {25,86}, {26,70}, {35,60}, {68,6}, {45,62}, {25,56}, {68,7}, {30,33}, {68,9}, {29,49}, {25,15}, {68,8}, {28,9}, {23,29}, {32,39}, {68,4}, {68,10}, {68,5}, {22,47}, {68,13}, {68,17}, {22,74}, {68,12}, {68,21}, {24,41}, {44,76}, {15,27}, {68,18}, {20,74}, {68,15}, {68,16}, {36,92}, {68,14}, {68,11}, {18,7}, {31,67}, {23,7}, {68,23}, {68,20}, {68,22}, {68,19}, {22,48}, {33,18}, {68,24}, {32,77}, {68,37}, {68,33}, {68,27}, {68,31}, {27,89}, {15,60}, {68,26}, {68,34}, {68,38}, {24,42}, {43,53}, {35,53}, {68,28}, {68,36}, {68,25}, {34,29}, {68,30}, {15,28}, {43,41}, {68,29}, {21,58}, {39,75}, {32,76}, {45,47}, {28,78}, {68,77}, {68,39}, {31,93}, {68,35}, {68,40}, {68,42}, {35,88}, {68,45}, {68,41}, {41,51}, {19,42}, {43,42}, {15,61}, {68,44}, {45,92}, {68,43}, {16,78}, {37,75}, {68,46}, {68,53}, {68,47}, {68,54}, {68,50}, {38,90}, {27,41}, {68,52}, {68,49}, {68,55}, {68,48}, {28,35}, {42,4}, {28,43}, {68,51}, {68,63}, {68,59}, {68,62}, {68,60}, {68,64}, {68,58}, {68,32}, {31,50}, {39,42}, {68,61}, {68,56}, {32,0}, {22,49}, {28,10}, {30,4}, {32,21}, {68,67}, {68,69}, {68,70}, {68,66}, {68,68}, {68,57}, {68,65}, {68,73}, {68,72}, {42,89}, {22,10}, {68,71}, {68,75}, {68,74}, {68,78}, {68,80}, {26,27}, {68,76}, {68,81}, {68,82}, {68,83}, {68,89}, {36,26}, {68,85}, {68,84}, {68,86}, {68,87}, {68,88}, {68,90}, {68,91}, {19,43}, {68,92}, {68,93}, {69,0}, {69,1}, {69,2}, {69,3}, {69,4}, {69,5}, {69,7}, {69,6}, {69,8}, {69,9}, {69,10}, {69,13}, {69,11}, {69,12}, {25,64}, {22,50}, {34,53}, {39,18}, {28,79}, {38,44}, {39,76}, {69,14}, {55,76}, {69,15}, {69,17}, {44,68}, {69,16}, {69,19}, {69,18}, {44,50}, {69,20}, {39,93}, {69,21}, {69,24}, {69,23}, {69,22}, {69,25}, {22,17}, {32,1}, {20,32}, {69,29}, {69,26}, {69,27}, {69,30}, {69,31}, {69,28}, {16,8}, {17,6}, {69,33}, {69,34}, {69,35}, {44,65}, {28,11}, {69,37}, {69,36}, {30,72}, {69,38}, {69,39}, {69,40}, {19,68}, {19,44}, {69,41}, {69,42}, {42,60}, {44,66}, {44,51}, {46,22}, {24,44}, {69,45}, {27,51}, {69,44}, {69,46}, {27,8}, {33,48}, {69,47}, {24,43}, {43,54}, {69,48}, {69,49}, {69,50}, {69,51}, {69,52}, {27,9}, {43,76}, {69,54}, {34,30}, {69,53}, {69,56}, {69,55}, {69,57}, {31,26}, {69,58}, {69,59}, {41,24}, {69,60}, {32,78}, {69,61}, {69,62}, {45,93}, {69,65}, {69,64}, {69,63}, {35,15}, {69,66}, {30,5}, {69,67}, {69,68}, {46,23}, {69,69}, {69,70}, {69,72}, {69,71}, {39,4}, {37,88}, {46,29}, {39,8}, {69,74}, {29,50}, {40,9}, {69,75}, {69,73}, {19,45}, {23,51}, {26,71}, {39,77}, {23,9}, {42,34}, {69,78}, {69,76}, {24,45}, {24,46}, {15,72}, {25,71}, {38,56}, {15,62}, {69,83}, {34,31}, {38,55}, {33,58}, {69,85}, {69,81}, {69,84}, {69,79}, {69,82}, {42,5}, {23,52}, {15,92}, {69,80}, {69,87}, {69,88}, {37,24}, {21,26}, {70,5}, {38,28}, {26,72}, {21,27}, {31,39}, {46,37}, {43,13}, {69,86}, {31,51}, {20,50}, {69,89}, {69,91}, {69,90}, {69,92}, {34,5}, {38,29}, {35,16}, {70,2}, {70,1}, {69,93}, {30,52}, {40,68}, {70,4}, {70,3}, {24,47}, {46,50}, {70,20}, {70,8}, {70,9}, {27,79}, {70,7}, {24,87}, {70,6}, {70,10}, {35,17}, {41,1}, {32,2}, {33,59}, {70,14}, {70,15}, {70,11}, {70,12}, {70,13}, {24,48}, {70,21}, {70,17}, {40,69}, {42,75}, {40,7}, {70,16}, {70,19}, {70,18}, {42,35}, {70,22}, {70,23}, {32,22}, {70,24}, {70,26}, {70,30}, {70,27}, {70,25}, {38,30}, {70,28}, {70,29}, {17,17}, {70,36}, {70,31}, {70,32}, {70,33}, {33,0}, {70,35}, {70,34}, {70,37}, {70,38}, {70,39}, {30,34}, {17,72}, {70,40}, {45,54}, {27,10}, {28,12}, {26,73}, {34,54}, {70,41}, {70,42}, {16,16}, {70,43}, {70,44}, {70,45}, {70,46}, {70,47}, {21,28}, {57,9}, {70,48}, {31,68}, {70,49}, {27,42}, {70,50}, {47,15}, {70,51}, {41,61}, {19,59}, {32,3}, {28,55}, {40,80}, {28,13}, {70,52}, {24,49}, {70,53}, {39,43}, {70,67}, {70,55}, {33,40}, {38,84}, {23,30}, {70,54}, {32,4}, {70,56}, {35,89}, {70,58}, {70,57}, {70,60}, {70,59}, {70,61}, {70,63}, {70,62}, {19,46}, {70,64}, {70,65}, {70,66}, {25,16}, {45,40}, {70,68}, {30,6}, {16,79}, {70,69}, {70,70}, {70,71}, {15,81}, {70,72}, {70,73}, {40,70}, {27,38}, {70,75}, {18,8}, {15,17}, {70,74}, {70,77}, {38,45}, {30,35}, {17,53}, {42,6}, {22,60}, {21,59}, {70,76}, {17,73}, {19,2}, {16,80}, {70,81}, {45,73}, {33,60}, {40,35}, {70,93}, {17,54}, {70,91}, {70,89}, {70,80}, {70,78}, {70,79}, {27,66}, {21,75}, {34,86}, {37,48}, {16,48}, {70,83}, {70,82}, {70,88}, {70,84}, {70,87}, {43,47}, {70,86}, {17,55}, {18,92}, {70,90}, {70,92}, {22,51}, {71,2}, {71,11}, {71,12}, {15,10}, {71,19}, {15,80}, {71,10}, {71,9}, {71,4}, {71,3}, {71,1}, {71,0}, {34,66}, {33,90}, {71,6}, {71,5}, {71,8}, {32,79}, {22,52}, {16,32}, {71,7}, {24,50}, {32,80}, {71,25}, {71,26}, {17,56}, {17,13}, {71,23}, {71,13}, {71,21}, {71,28}, {71,22}, {71,20}, {70,85}, {71,18}, {71,14}, {19,47}, {71,16}, {71,27}, {71,17}, {71,29}, {71,15}, {38,91}, {44,72}, {71,24}, {71,46}, {71,38}, {30,90}, {20,37}, {21,60}, {71,33}, {17,58}, {29,51}, {71,36}, {25,57}, {36,48}, {71,41}, {41,77}, {71,32}, {17,57}, {23,53}, {40,8}, {71,42}, {71,30}, {71,39}, {71,49}, {71,34}, {71,35}, {37,25}, {71,40}, {71,37}, {42,7}, {71,43}, {15,63}, {71,31}, {71,45}, {71,44}, {38,74}, {71,51}, {71,62}, {18,93}, {71,65}, {71,47}, {71,52}, {44,77}, {71,61}, {44,52}, {45,9}, {34,87}, {18,74}, {40,81}, {71,67}, {37,0}, {15,16}, {71,60}, {71,56}, {32,81}, {71,50}, {71,58}, {71,63}, {38,11}, {15,9}, {71,55}, {71,64}, {40,87}, {71,59}, {71,54}, {29,52}, {28,14}, {27,11}, {43,55}, {40,38}, {71,70}, {71,79}, {71,57}, {18,86}, {29,87}, {71,68}, {71,73}, {32,82}, {71,69}, {71,76}, {34,62}, {71,77}, {44,53}, {71,66}, {18,23}, {71,72}, {71,75}, {43,11}, {71,78}, {71,71}, {71,74}, {42,8}, {46,0}, {71,82}, {71,89}, {71,81}, {27,34}, {71,48}, {41,45}, {43,1}, {71,88}, {71,87}, {71,83}, {71,84}, {16,21}, {71,86}, {71,80}, {35,52}, {71,85}, {15,93}, {33,1}, {41,34}, {71,90}, {72,0}, {39,56}, {71,93}, {29,53}, {27,40}, {72,2}, {21,29}, {72,3}, {40,88}, {71,92}, {71,53}, {71,91}, {46,46}, {37,1}, {40,82}, {72,10}, {72,16}, {72,17}, {72,4}, {38,85}, {72,14}, {72,6}, {72,8}, {72,18}, {72,7}, {72,11}, {16,81}, {37,68}, {72,12}, {72,15}, {72,5}, {32,5}, {72,9}, {26,6}, {30,36}, {22,15}, {43,83}, {43,88}, {28,81}, {72,22}, {72,20}, {46,45}, {72,19}, {44,84}, {72,21}, {72,23}, {72,24}, {72,27}, {72,25}, {37,2}, {72,26}, {39,44}, {72,13}, {28,82}, {72,28}, {72,33}, {32,83}, {72,32}, {72,1}, {72,34}, {32,40}, {72,29}, {72,31}, {72,30}, {60,16}, {60,1}, {72,36}, {72,35}, {44,85}, {65,27}, {72,37}, {72,38}, {72,39}, {23,54}, {20,51}, {72,41}, {48,60}, {20,84}, {45,25}, {21,82}, {72,42}, {72,43}, {34,77}, {72,44}, {37,89}, {15,25}, {17,66}, {72,49}, {72,50}, {72,45}, {26,28}, {72,46}, {38,33}, {72,47}, {72,48}, {72,58}, {72,52}, {72,55}, {72,51}, {72,53}, {72,54}, {27,55}, {72,56}, {34,32}, {22,53}, {18,33}, {72,59}, {18,30}, {72,64}, {72,60}, {72,63}, {39,25}, {72,61}, {72,62}, {40,39}, {39,57}, {72,65}, {33,92}, {72,75}, {72,71}, {17,74}, {72,69}, {42,9}, {72,70}, {72,67}, {72,68}, {72,73}, {72,76}, {72,74}, {72,72}, {72,66}, {34,55}, {72,83}, {43,9}, {72,81}, {72,82}, {72,77}, {72,79}, {72,80}, {72,78}, {31,69}, {46,24}, {72,87}, {72,88}, {73,0}, {30,9}, {72,90}, {72,93}, {72,85}, {72,84}, {73,1}, {17,59}, {72,91}, {73,2}, {72,92}, {72,89}, {35,18}, {72,86}, {38,71}, {73,6}, {44,26}, {73,5}, {73,4}, {73,13}, {73,7}, {73,15}, {44,69}, {73,18}, {73,9}, {73,10}, {73,14}, {73,17}, {73,16}, {73,8}, {73,11}, {73,28}, {73,21}, {73,19}, {73,20}, {73,25}, {73,26}, {18,9}, {20,33}, {73,24}, {73,3}, {73,23}, {73,27}, {73,22}, {73,29}, {73,31}, {73,30}, {73,33}, {73,32}, {72,57}, {73,37}, {73,34}, {73,35}, {73,36}, {73,38}, {22,75}, {73,40}, {73,39}, {28,15}, {24,51}, {61,6}, {73,41}, {28,48}, {18,24}, {73,42}, {16,49}, {29,54}, {73,43}, {24,52}, {73,44}, {15,64}, {40,28}, {73,45}, {30,73}, {73,52}, {73,49}, {34,78}, {73,50}, {73,47}, {21,61}, {73,46}, {73,53}, {22,21}, {33,61}, {73,59}, {73,55}, {33,20}, {73,54}, {73,57}, {73,48}, {73,58}, {73,60}, {39,78}, {73,56}, {73,61}, {73,63}, {23,50}, {73,51}, {15,32}, {73,62}, {25,58}, {45,85}, {73,64}, {73,65}, {32,84}, {45,1}, {73,66}, {44,20}, {73,67}, {73,68}, {41,67}, {73,69}, {25,31}, {45,2}, {73,74}, {73,75}, {29,55}, {73,73}, {44,70}, {73,70}, {73,72}, {31,28}, {30,93}, {73,71}, {73,76}, {41,2}, {73,78}, {73,77}, {18,75}, {42,10}, {73,79}, {73,91}, {73,81}, {73,82}, {73,83}, {73,84}, {73,88}, {73,89}, {73,87}, {73,85}, {73,80}, {73,86}, {73,90}, {79,22}, {17,7}, {73,93}, {21,62}, {73,92}, {74,1}, {74,0}, {74,3}, {74,2}, {74,4}, {28,16}, {74,5}, {74,6}, {74,7}, {31,29}, {44,54}, {74,8}, {41,3}, {38,37}, {74,9}, {74,10}, {23,10}, {20,11}, {74,11}, {26,74}, {38,32}, {74,12}, {18,47}, {74,13}, {74,15}, {44,86}, {74,14}, {30,37}, {74,16}, {74,17}, {74,18}, {19,48}, {74,19}, {74,20}, {74,21}, {74,22}, {18,48}, {74,23}, {74,24}, {74,25}, {17,81}, {30,7}, {74,26}, {74,27}, {74,28}, {23,31}, {35,90}, {74,29}, {22,54}, {30,53}, {74,32}, {37,3}, {74,31}, {22,16}, {74,30}, {33,86}, {20,12}, {74,33}, {74,34}, {29,56}, {22,76}, {74,35}, {42,11}, {31,62}, {20,85}, {43,84}, {32,41}, {74,36}, {30,38}, {34,79}, {29,57}, {74,37}, {74,40}, {74,41}, {25,29}, {33,33}, {74,39}, {29,58}, {40,29}, {74,38}, {26,75}, {16,50}, {74,45}, {22,55}, {26,77}, {26,76}, {46,44}, {74,44}, {74,43}, {32,6}, {20,44}, {46,34}, {18,25}, {29,59}, {74,42}, {74,47}, {74,48}, {74,46}, {23,55}, {44,31}, {26,78}, {38,6}, {74,51}, {31,31}, {34,33}, {44,21}, {74,54}, {23,75}, {31,30}, {74,50}, {74,55}, {23,76}, {74,52}, {74,53}, {74,49}, {31,65}, {37,40}, {34,14}, {17,60}, {39,79}, {20,34}, {35,19}, {74,58}, {74,56}, {34,43}, {31,32}, {19,49}, {74,57}, {30,58}, {45,41}, {46,31}, {74,59}, {74,70}, {35,20}, {74,69}, {74,66}, {74,74}, {74,67}, {74,63}, {35,91}, {74,62}, {74,60}, {44,0}, {26,79}, {74,64}, {74,61}, {74,68}, {28,83}, {23,32}, {33,89}, {42,36}, {16,57}, {15,65}, {37,4}, {74,72}, {74,71}, {37,69}, {74,76}, {74,65}, {74,75}, {74,77}, {23,11}, {74,73}, {24,53}, {27,52}, {74,78}, {44,55}, {74,81}, {74,84}, {74,82}, {40,20}, {74,79}, {21,63}, {74,83}, {74,85}, {74,89}, {74,86}, {74,88}, {74,87}, {74,90}, {27,16}, {74,92}, {74,91}, {40,71}, {75,0}, {22,56}, {74,93}, {75,1}, {75,2}, {20,35}, {69,32}, {29,88}, {75,3}, {23,77}, {75,4}, {75,5}, {26,29}, {57,45}, {75,6}, {75,7}, {28,17}, {75,8}, {75,9}, {75,10}, {75,11}, {75,12}, {34,10}, {75,13}, {75,15}, {75,14}, {37,5}, {75,16}, {42,12}, {75,17}, {75,18}, {75,19}, {75,20}, {37,57}, {29,60}, {75,21}, {24,74}, {47,13}, {75,22}, {75,23}, {40,30}, {75,24}, {75,32}, {75,25}, {75,27}, {75,26}, {75,28}, {42,37}, {75,29}, {75,30}, {75,31}, {75,33}, {18,12}, {35,70}, {40,72}, {25,65}, {24,54}, {40,46}, {17,62}, {39,45}, {75,36}, {19,50}, {31,52}, {75,35}, {75,40}, {34,88}, {43,66}, {75,38}, {75,39}, {20,13}, {75,41}, {38,66}, {33,62}, {39,80}, {36,28}, {75,37}, {42,38}, {17,75}, {75,43}, {46,7}, {35,33}, {46,36}, {26,80}, {75,42}, {33,16}, {75,59}, {32,7}, {37,87}, {40,47}, {75,46}, {26,30}, {26,81}, {29,61}, {38,68}, {23,12}, {75,45}, {75,44}, {40,73}, {27,32}, {36,49}, {75,48}, {75,49}, {24,55}, {75,47}, {75,50}, {75,51}, {75,53}, {33,2}, {75,52}, {19,69}, {75,55}, {75,54}, {75,56}, {75,58}, {75,60}, {75,61}, {31,53}, {27,46}, {75,62}, {18,49}, {75,63}, {32,85}, {75,64}, {75,65}, {40,74}, {20,14}, {75,66}, {35,21}, {16,58}, {75,67}, {27,80}, {30,85}, {33,12}, {75,70}, {75,69}, {75,68}, {75,76}, {75,74}, {75,71}, {75,73}, {75,72}, {75,75}, {20,86}, {75,79}, {31,54}, {75,80}, {23,56}, {75,77}, {75,78}, {46,8}, {35,22}, {32,8}, {75,81}, {75,84}, {75,82}, {75,83}, {44,56}, {37,6}, {75,87}, {75,85}, {75,86}, {75,88}, {76,8}, {75,91}, {75,92}, {75,90}, {75,89}, {35,92}, {76,0}, {76,4}, {76,1}, {75,93}, {76,2}, {76,3}, {76,10}, {76,5}, {31,55}, {76,7}, {76,9}, {76,6}, {76,12}, {28,18}, {76,11}, {76,13}, {76,14}, {76,17}, {76,16}, {76,15}, {76,19}, {76,18}, {43,85}, {76,21}, {76,20}, {76,22}, {76,23}, {76,25}, {76,24}, {30,39}, {76,26}, {21,76}, {76,27}, {76,29}, {76,30}, {76,31}, {76,28}, {76,32}, {27,53}, {76,33}, {20,15}, {22,18}, {23,13}, {76,34}, {37,79}, {36,29}, {76,35}, {76,38}, {27,19}, {76,37}, {76,36}, {22,57}, {76,39}, {18,50}, {76,41}, {25,59}, {76,40}, {76,49}, {76,43}, {76,45}, {41,68}, {76,42}, {76,44}, {76,48}, {76,46}, {20,16}, {76,47}, {76,50}, {38,57}, {45,55}, {28,19}, {76,51}, {44,1}, {76,53}, {76,52}, {76,56}, {44,32}, {76,55}, {18,76}, {76,54}, {76,59}, {76,58}, {76,57}, {36,17}, {76,60}, {76,61}, {76,62}, {24,75}, {22,4}, {76,63}, {76,64}, {76,65}, {30,40}, {76,66}, {27,12}, {76,67}, {76,68}, {49,0}, {48,93}, {76,69}, {68,79}, {76,70}, {34,3}, {30,10}, {38,31}, {76,71}, {41,52}, {35,51}, {24,93}, {34,8}, {16,9}, {42,87}, {30,54}, {22,61}, {21,64}, {41,53}, {76,72}, {76,74}, {76,73}, {17,63}, {37,85}, {76,75}, {38,86}, {36,18}, {76,76}, {28,49}, {76,78}, {43,33}, {76,93}, {76,80}, {76,81}, {35,40}, {33,63}, {32,86}, {37,7}, {76,79}, {20,52}, {76,88}, {76,85}, {77,4}, {37,8}, {34,63}, {76,82}, {35,93}, {36,50}, {76,83}, {76,87}, {30,63}, {38,70}, {35,43}, {31,33}, {76,86}, {33,13}, {33,3}, {76,84}, {15,8}, {46,1}, {76,89}, {33,64}, {28,20}, {30,41}, {76,91}, {76,90}, {15,78}, {76,92}, {40,14}, {77,6}, {37,58}, {30,74}, {34,56}, {21,87}, {77,5}, {44,22}, {16,30}, {41,54}, {17,64}, {77,0}, {77,1}, {77,2}, {77,3}, {37,26}, {34,2}, {15,66}, {77,7}, {77,8}, {83,2}, {33,28}, {77,9}, {16,82}, {32,43}, {23,14}, {44,57}, {77,10}, {36,11}, {32,87}, {27,54}, {77,11}, {77,14}, {28,68}, {77,12}, {32,10}, {32,9}, {15,67}, {45,42}, {77,16}, {39,81}, {77,18}, {77,17}, {77,15}, {66,67}, {19,51}, {76,77}, {77,20}, {77,19}, {77,21}, {44,23}, {37,64}, {42,13}, {77,22}, {27,56}, {77,23}, {77,24}, {77,25}, {36,0}, {15,73}, {24,56}, {46,25}, {77,29}, {22,19}, {77,26}, {77,27}, {40,83}, {18,51}, {44,24}, {21,30}, {36,51}, {77,30}, {77,31}, {77,32}, {36,1}, {77,34}, {77,33}, {37,50}, {77,35}, {28,21}, {27,63}, {38,58}, {34,80}, {27,81}, {30,75}, {77,36}, {77,37}, {30,60}, {77,38}, {77,39}, {77,40}, {44,78}, {28,22}, {77,42}, {77,41}, {24,57}, {24,82}, {26,31}, {77,45}, {28,69}, {77,44}, {77,43}, {33,72}, {23,78}, {31,34}, {39,15}, {28,24}, {77,46}, {29,62}, {77,49}, {77,47}, {77,48}, {77,51}, {77,50}, {29,89}, {77,52}, {77,53}, {77,54}, {39,47}, {25,50}, {27,64}, {77,55}, {77,56}, {45,3}, {28,36}, {43,77}, {45,43}, {77,57}, {21,65}, {77,58}, {36,2}, {77,61}, {18,87}, {30,42}, {77,59}, {77,60}, {35,63}, {42,52}, {21,91}, {77,63}, {77,64}, {77,62}, {77,66}, {37,62}, {18,34}, {77,70}, {77,67}, {77,69}, {77,65}, {78,46}, {77,68}, {45,74}, {23,57}, {77,78}, {36,19}, {77,73}, {77,76}, {77,74}, {77,79}, {77,80}, {77,72}, {77,85}, {16,83}, {77,71}, {39,12}, {77,75}, {29,63}, {24,58}, {42,39}, {21,67}, {28,37}, {37,27}, {32,12}, {77,83}, {77,77}, {77,82}, {43,34}, {35,23}, {77,84}, {77,81}, {32,11}, {77,88}, {77,87}, {77,86}, {42,14}, {28,90}, {77,89}, {41,62}, {16,51}, {40,37}, {34,81}, {20,87}, {77,91}, {24,60}, {26,11}, {77,90}, {30,76}, {30,77}, {78,0}, {78,2}, {29,90}, {78,1}, {78,3}, {21,50}, {40,36}, {27,65}, {46,2}, {77,93}, {25,87}, {46,30}, {78,5}, {78,4}, {78,6}, {77,92}, {37,72}, {36,52}, {35,54}, {78,11}, {34,34}, {78,7}, {78,8}, {22,12}, {78,10}, {23,15}, {78,9}, {29,64}, {18,88}, {78,15}, {25,30}, {32,88}, {35,41}, {18,26}, {78,13}, {78,14}, {35,34}, {78,12}, {78,16}, {78,22}, {78,25}, {78,24}, {36,12}, {78,17}, {78,18}, {78,21}, {78,23}, {21,31}, {78,26}, {78,20}, {78,19}, {78,30}, {78,31}, {78,32}, {78,29}, {78,28}, {29,65}, {37,9}, {78,27}, {78,36}, {78,34}, {78,35}, {78,33}, {33,87}, {78,37}, {78,38}, {78,40}, {19,52}, {78,39}, {43,89}, {78,51}, {78,41}, {78,44}, {78,42}, {78,43}, {78,45}, {78,47}, {78,48}, {78,49}, {78,52}, {78,50}, {78,53}, {78,55}, {78,54}, {35,24}, {43,70}, {78,56}, {32,13}, {78,57}, {41,35}, {78,58}, {18,10}, {16,27}, {19,54}, {19,53}, {78,59}, {78,60}, {78,61}, {78,62}, {78,63}, {19,55}, {18,52}, {24,61}, {39,21}, {78,65}, {78,64}, {78,66}, {16,59}, {78,69}, {78,68}, {78,67}, {78,70}, {78,73}, {15,38}, {78,71}, {78,75}, {78,74}, {78,77}, {78,76}, {78,78}, {37,13}, {78,79}, {78,80}, {78,82}, {78,81}, {40,75}, {78,83}, {78,84}, {25,68}, {78,85}, {78,86}, {42,40}, {32,42}, {15,3}, {33,42}, {78,87}, {40,76}, {78,90}, {78,88}, {24,62}, {78,89}, {23,33}, {41,36}, {78,92}, {79,0}, {78,93}, {79,1}, {16,0}, {30,55}, {28,91}, {19,56}, {79,2}, {38,69}, {79,4}, {16,1}, {79,3}, {35,35}, {45,44}, {37,10}, {78,91}, {45,5}, {23,16}, {44,58}, {21,88}, {45,19}, {22,7}, {33,65}, {70,0}, {79,5}, {18,11}, {30,78}, {18,53}, {79,7}, {79,8}, {79,6}, {22,67}, {25,60}, {29,66}, {16,2}, {45,56}, {79,10}, {77,13}, {79,9}, {79,13}, {79,11}, {79,12}, {79,14}, {79,15}, {45,75}, {79,16}, {79,17}, {31,40}, {39,26}, {30,92}, {19,70}, {44,25}, {17,76}, {28,23}, {23,58}, {79,20}, {79,19}, {26,82}, {79,21}, {79,18}, {26,7}, {79,25}, {73,12}, {49,53}, {30,86}, {79,23}, {45,4}, {37,80}, {16,10}, {31,66}, {27,21}, {41,22}, {16,31}, {45,76}, {44,74}, {79,26}, {36,36}, {27,90}, {79,27}, {79,28}, {30,43}, {79,29}, {45,77}, {79,24}, {79,31}, {79,33}, {79,32}, {79,30}, {79,34}, {79,35}, {32,89}, {17,65}, {79,36}, {43,23}, {79,37}, {79,38}, {46,9}, {58,16}, {79,39}, {79,40}, {79,41}, {79,45}, {79,42}, {79,43}, {79,44}, {79,46}, {31,35}, {43,86}, {31,36}, {79,47}, {39,82}, {79,48}, {82,50}, {43,43}, {79,49}, {79,50}, {79,51}, {18,54}, {79,53}, {30,56}, {79,54}, {22,3}, {79,55}, {79,59}, {79,57}, {79,58}, {18,82}, {79,56}, {79,60}, {79,61}, {15,39}, {79,62}, {79,63}, {29,67}, {79,64}, {20,38}, {79,67}, {79,66}, {79,65}, {74,80}, {41,59}, {79,68}, {79,69}, {79,70}, {79,71}, {79,72}, {79,73}, {19,57}, {79,74}, {79,75}, {38,2}, {79,77}, {17,26}, {79,80}, {79,79}, {16,3}, {21,32}, {41,38}, {35,25}, {25,1}, {24,63}, {28,70}, {30,59}, {79,82}, {79,81}, {44,33}, {19,71}, {39,49}, {37,59}, {30,91}, {45,45}, {22,58}, {79,85}, {79,84}, {42,42}, {37,11}, {16,47}, {79,86}, {79,83}, {40,48}, {44,73}, {79,87}, {79,88}, {79,90}, {33,73}, {18,58}, {18,59}, {79,89}, {19,72}, {23,17}, {19,73}, {36,30}, {45,63}, {23,59}, {79,91}, {79,92}, {79,93}, {80,0}, {80,2}, {80,1}, {40,86}, {80,3}, {80,4}, {80,5}, {80,6}, {80,8}, {80,7}, {80,9}, {39,83}, {69,43}, {30,8}, {20,17}, {80,10}, {80,11}, {49,11}, {60,26}, {39,50}, {15,90}, {15,26}, {26,83}, {42,15}, {29,93}, {80,12}, {43,62}, {80,13}, {44,59}, {16,33}, {26,32}, {80,14}, {17,77}, {80,15}, {80,16}, {80,18}, {80,19}, {80,21}, {80,17}, {80,20}, {19,58}, {80,22}, {80,23}, {80,24}, {80,25}, {80,26}, {80,28}, {80,27}, {80,30}, {80,33}, {80,29}, {80,31}, {80,32}, {80,34}, {21,33}, {27,82}, {80,35}, {80,36}, {24,64}, {80,37}, {18,29}, {38,46}, {80,38}, {80,39}, {34,57}, {37,74}, {80,40}, {38,92}, {33,43}, {16,55}, {21,77}, {21,78}, {34,82}, {80,45}, {21,79}, {17,78}, {80,44}, {80,42}, {80,43}, {80,41}, {80,55}, {80,46}, {80,47}, {80,48}, {80,49}, {80,51}, {80,50}, {28,56}, {80,52}, {80,54}, {20,18}, {80,53}, {32,90}, {23,18}, {80,56}, {33,44}, {80,57}, {37,12}, {80,58}, {80,63}, {80,61}, {80,60}, {80,62}, {80,59}, {80,65}, {80,64}, {80,67}, {21,34}, {80,66}, {80,68}, {80,69}, {80,71}, {80,70}, {80,72}, {80,74}, {80,73}, {24,91}, {80,75}, {80,76}, {18,27}, {80,77}, {80,78}, {30,80}, {80,79}, {80,80}, {80,81}, {80,82}, {24,65}, {80,83}, {80,84}, {80,85}, {80,86}, {80,87}, {39,16}, {80,89}, {40,5}, {80,90}, {80,88}, {80,92}, {80,91}, {80,93}, {81,0}, {81,1}, {81,2}, {81,3}, {81,4}, {81,5}, {81,6}, {81,7}, {81,8}, {81,9}, {81,10}, {81,11}, {81,12}, {81,13}, {60,20}, {81,14}, {67,87}, {20,19}, {18,0}, {25,17}, {81,16}, {81,15}, {43,4}, {81,18}, {81,19}, {81,17}, {81,20}, {42,65}, {81,21}, {20,90}, {46,4}, {81,22}, {81,24}, {15,29}, {81,25}, {41,10}, {81,23}, {81,26}, {81,27}, {81,28}, {81,29}, {81,30}, {42,77}, {26,12}, {25,89}, {32,14}, {81,31}, {81,34}, {81,32}, {81,35}, {23,80}, {81,33}, {81,36}, {81,37}, {81,38}, {81,42}, {26,9}, {33,67}, {81,43}, {81,40}, {81,39}, {81,41}, {22,62}, {81,47}, {81,46}, {81,45}, {15,18}, {81,57}, {81,53}, {81,54}, {81,50}, {81,56}, {81,52}, {18,65}, {46,43}, {81,55}, {81,51}, {81,49}, {81,48}, {81,59}, {81,62}, {81,61}, {81,60}, {40,40}, {81,58}, {15,82}, {81,63}, {81,65}, {18,78}, {81,44}, {16,22}, {81,67}, {81,66}, {81,64}, {34,12}, {42,79}, {45,57}, {81,68}, {81,69}, {81,70}, {81,71}, {81,72}, {35,26}, {81,73}, {39,22}, {81,78}, {81,74}, {81,75}, {42,16}, {43,35}, {37,47}, {81,79}, {81,80}, {37,29}, {81,77}, {81,76}, {17,9}, {81,88}, {81,87}, {16,84}, {81,85}, {81,84}, {81,82}, {18,90}, {81,81}, {27,17}, {17,8}, {24,66}, {81,91}, {81,90}, {81,89}, {81,86}, {81,92}, {81,93}, {82,4}, {82,3}, {82,5}, {16,12}, {82,0}, {82,1}, {24,83}, {43,24}, {82,2}, {42,17}, {82,10}, {82,6}, {82,11}, {82,8}, {82,7}, {22,59}, {82,12}, {82,13}, {82,14}, {82,9}, {81,83}, {82,15}, {35,64}, {82,19}, {82,20}, {82,18}, {82,17}, {82,23}, {82,16}, {82,21}, {82,22}, {82,25}, {82,24}, {82,27}, {82,28}, {82,29}, {46,40}, {82,26}, {33,74}, {25,76}, {82,30}, {82,31}, {82,32}, {82,33}, {82,34}, {23,19}, {82,35}, {82,36}, {27,14}, {82,37}, {82,38}, {82,39}, {82,40}, {82,43}, {82,41}, {46,27}, {82,42}, {45,78}, {82,44}, {45,58}, {82,45}, {38,93}, {82,46}, {82,48}, {82,49}, {82,47}, {24,76}, {43,44}, {42,66}, {53,86}, {60,63}, {42,90}, {17,10}, {82,51}, {20,47}, {82,52}, {82,53}, {82,54}, {24,84}, {82,55}, {63,51}, {43,58}, {33,66}, {82,56}, {82,58}, {82,57}, {82,59}, {82,60}, {82,61}, {82,62}, {82,63}, {82,64}, {82,65}, {82,66}, {82,67}, {82,68}, {82,69}, {82,70}, {82,71}, {36,3}, {23,60}, {82,73}, {32,44}, {82,74}, {82,75}, {40,0}, {82,76}, {82,77}, {66,22}, {75,57}, {79,76}, {82,78}, {82,79}, {82,81}, {82,82}, {82,83}, {45,79}, {82,80}, {82,84}, {82,85}, {82,87}, {82,86}, {82,89}, {82,90}, {82,88}, {45,21}, {82,91}, {82,92}, {66,51}, {82,93}, {0,9}, {0,83}, {0,79}, {0,82}, {0,84}, {0,41}, {0,42}, {0,85}, {0,59}, {0,3}, {0,4}, {0,30}, {2,15}, {2,16}, {2,17}, {2,18}, {2,19}, {2,20}, {2,21}, {2,22}, {2,23}, {2,24}, {0,6}, {0,7}, {0,66}, {0,64}, {0,67}, {0,8}, {0,86}, {2,32}, {2,33}, {2,34}, {2,35}, {2,36}, {2,37}, {2,38}, {2,39}, {2,40}, {2,41}, {2,42}, {2,43}, {2,44}, {2,45}, {2,46}, {2,47}, {2,48}, {2,49}, {2,50}, {2,51}, {2,52}, {2,53}, {2,54}, {2,55}, {2,56}, {2,57}, {0,45}, {0,46}, {0,15}, {0,17}, {0,13}, {2,64}, {2,65}, {2,66}, {2,67}, {2,68}, {2,69}, {2,70}, {2,71}, {2,72}, {2,73}, {2,74}, {2,75}, {2,76}, {2,77}, {2,78}, {2,79}, {2,80}, {2,81}, {2,82}, {2,83}, {2,84}, {2,85}, {2,86}, {2,87}, {2,88}, {2,89}, {0,47}, {0,34}, {0,48}, {0,16}, {0,78} }; /* This returns ERROR if the code point doesn't exist. */ long int jisx0208_to_unicode(int r, int c) { assert(r >= 0 && r < 94); assert(c >= 0 && c < 94); return jisx0208_forward[r][c]; } /* This one returns 1 on success, 0 if the code point doesn't exist. */ int unicode_to_jisx0208(long int unicode, int *r, int *c) { int rr, cc; long int uu; int i, j, k; i = -1; j = lenof(jisx0208_backward); while (j - i > 1) { k = (i + j) / 2; rr = jisx0208_backward[k].r; cc = jisx0208_backward[k].c; uu = jisx0208_forward[rr][cc]; if (unicode > uu) i = k; else if (unicode < uu) j = k; else { *r = rr; *c = cc; return 1; } } return 0; } #ifdef TESTMODE #include <stdio.h> int main(void) { int r, c, rr, cc, ret; long int u, uu; for (r = 0; r < 94; r++) { for (c = 0; c < 94; c++) { u = jisx0208_to_unicode(r, c); if (u != ERROR) { ret = unicode_to_jisx0208(u, &rr, &cc); if (!ret) printf("(%d,%d) -> U-%08lx but didn't convert back\n", r, c, u); else if (rr != r || cc != c) printf("(%d,%d) -> U-%08lx -> (%d,%d)\n", r, c, u, rr, cc); } } } for (u = 0; u < 0x10000L; u++) { ret = unicode_to_jisx0208(u, &r, &c); if (ret) { uu = jisx0208_to_unicode(r, c); if (uu == ERROR) printf("U-%08lx -> (%d,%d) but didn't convert back\n", u, r, c); else if (uu != u) printf("U-%08lx -> (%d,%d) -> U-%08lx\n", u, r, c, uu); } } return 0; } #endif ������������������������������������������������������������������������������������������������halibut-1.1/charset/jisx0212.c����������������������������������������������������������������������0000644�0001753�0001753�00000413310�12444773746�013035� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * JIS X 0212 implementation for libcharset. (This is the character * set itself, not any particular multibyte encoding of it. * Multibyte encodings of this character set are handled * separately.) */ #include <assert.h> #include "charset.h" #include "internal.h" /* * These tables are generated from the JIS X 0212 <-> Unicode * character mapping found at * * http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0212.TXT */ /* * Mapping from JIS X 0212 to Unicode. For these purposes JIS X * 0212 is considered to be a 94x94 square array, with coordinates * running from (0,0) to (93,93). * * Generated by running the following sh+Perl over JIS0212.TXT: cat JIS0212.TXT | \ perl -ne '$a{hex$1,hex$2}=$3 if /^0x(\S\S)(\S\S)\s+(0x\S+)\s/;' \ -e 'END {for $r (0..93) { $o=" {"; for $c (0..93) {' \ -e '$k=$a{$r+33,$c+33}; $k=" ERROR" unless defined $k;' \ -e '$o .= ", " if $c > 0; (print "$o\n"), $o=" " if length $o > 70;' \ -e '$o .= $k; } print "$o},\n"; }}' */ static const unsigned short jisx0212_forward[94][94] = { { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x02D8, 0x02C7, 0x00B8, 0x02D9, 0x02DD, 0x00AF, 0x02DB, 0x02DA, 0x007E, 0x0384, 0x0385, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x00A1, 0x00A6, 0x00BF, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x00BA, 0x00AA, 0x00A9, 0x00AE, 0x2122, 0x00A4, 0x2116, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x0386, 0x0388, 0x0389, 0x038A, 0x03AA, ERROR, 0x038C, ERROR, 0x038E, 0x03AB, ERROR, 0x038F, ERROR, ERROR, ERROR, ERROR, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03CA, 0x0390, 0x03CC, 0x03C2, 0x03CD, 0x03CB, 0x03B0, 0x03CE, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x040E, 0x040F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x045E, 0x045F}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x00C6, 0x0110, ERROR, 0x0126, ERROR, 0x0132, ERROR, 0x0141, 0x013F, ERROR, 0x014A, 0x00D8, 0x0152, ERROR, 0x0166, 0x00DE, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0142, 0x0140, 0x0149, 0x014B, 0x00F8, 0x0153, 0x00DF, 0x0167, 0x00FE, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x00C1, 0x00C0, 0x00C4, 0x00C2, 0x0102, 0x01CD, 0x0100, 0x0104, 0x00C5, 0x00C3, 0x0106, 0x0108, 0x010C, 0x00C7, 0x010A, 0x010E, 0x00C9, 0x00C8, 0x00CB, 0x00CA, 0x011A, 0x0116, 0x0112, 0x0118, ERROR, 0x011C, 0x011E, 0x0122, 0x0120, 0x0124, 0x00CD, 0x00CC, 0x00CF, 0x00CE, 0x01CF, 0x0130, 0x012A, 0x012E, 0x0128, 0x0134, 0x0136, 0x0139, 0x013D, 0x013B, 0x0143, 0x0147, 0x0145, 0x00D1, 0x00D3, 0x00D2, 0x00D6, 0x00D4, 0x01D1, 0x0150, 0x014C, 0x00D5, 0x0154, 0x0158, 0x0156, 0x015A, 0x015C, 0x0160, 0x015E, 0x0164, 0x0162, 0x00DA, 0x00D9, 0x00DC, 0x00DB, 0x016C, 0x01D3, 0x0170, 0x016A, 0x0172, 0x016E, 0x0168, 0x01D7, 0x01DB, 0x01D9, 0x01D5, 0x0174, 0x00DD, 0x0178, 0x0176, 0x0179, 0x017D, 0x017B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x00E1, 0x00E0, 0x00E4, 0x00E2, 0x0103, 0x01CE, 0x0101, 0x0105, 0x00E5, 0x00E3, 0x0107, 0x0109, 0x010D, 0x00E7, 0x010B, 0x010F, 0x00E9, 0x00E8, 0x00EB, 0x00EA, 0x011B, 0x0117, 0x0113, 0x0119, 0x01F5, 0x011D, 0x011F, ERROR, 0x0121, 0x0125, 0x00ED, 0x00EC, 0x00EF, 0x00EE, 0x01D0, ERROR, 0x012B, 0x012F, 0x0129, 0x0135, 0x0137, 0x013A, 0x013E, 0x013C, 0x0144, 0x0148, 0x0146, 0x00F1, 0x00F3, 0x00F2, 0x00F6, 0x00F4, 0x01D2, 0x0151, 0x014D, 0x00F5, 0x0155, 0x0159, 0x0157, 0x015B, 0x015D, 0x0161, 0x015F, 0x0165, 0x0163, 0x00FA, 0x00F9, 0x00FC, 0x00FB, 0x016D, 0x01D4, 0x0171, 0x016B, 0x0173, 0x016F, 0x0169, 0x01D8, 0x01DC, 0x01DA, 0x01D6, 0x0175, 0x00FD, 0x00FF, 0x0177, 0x017A, 0x017E, 0x017C, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, {0x4E02, 0x4E04, 0x4E05, 0x4E0C, 0x4E12, 0x4E1F, 0x4E23, 0x4E24, 0x4E28, 0x4E2B, 0x4E2E, 0x4E2F, 0x4E30, 0x4E35, 0x4E40, 0x4E41, 0x4E44, 0x4E47, 0x4E51, 0x4E5A, 0x4E5C, 0x4E63, 0x4E68, 0x4E69, 0x4E74, 0x4E75, 0x4E79, 0x4E7F, 0x4E8D, 0x4E96, 0x4E97, 0x4E9D, 0x4EAF, 0x4EB9, 0x4EC3, 0x4ED0, 0x4EDA, 0x4EDB, 0x4EE0, 0x4EE1, 0x4EE2, 0x4EE8, 0x4EEF, 0x4EF1, 0x4EF3, 0x4EF5, 0x4EFD, 0x4EFE, 0x4EFF, 0x4F00, 0x4F02, 0x4F03, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F15, 0x4F16, 0x4F17, 0x4F19, 0x4F2E, 0x4F31, 0x4F60, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, 0x4F3E, 0x4F40, 0x4F42, 0x4F48, 0x4F49, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F58, 0x4F5F, 0x4F63, 0x4F6A, 0x4F6C, 0x4F6E, 0x4F71, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F7E, 0x4F81, 0x4F82, 0x4F84}, {0x4F85, 0x4F89, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F94, 0x4F97, 0x4F99, 0x4F9A, 0x4F9E, 0x4F9F, 0x4FB2, 0x4FB7, 0x4FB9, 0x4FBB, 0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC5, 0x4FC6, 0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FCF, 0x4FD2, 0x4FDC, 0x4FE0, 0x4FE2, 0x4FF0, 0x4FF2, 0x4FFC, 0x4FFD, 0x4FFF, 0x5000, 0x5001, 0x5004, 0x5007, 0x500A, 0x500C, 0x500E, 0x5010, 0x5013, 0x5017, 0x5018, 0x501B, 0x501C, 0x501D, 0x501E, 0x5022, 0x5027, 0x502E, 0x5030, 0x5032, 0x5033, 0x5035, 0x5040, 0x5041, 0x5042, 0x5045, 0x5046, 0x504A, 0x504C, 0x504E, 0x5051, 0x5052, 0x5053, 0x5057, 0x5059, 0x505F, 0x5060, 0x5062, 0x5063, 0x5066, 0x5067, 0x506A, 0x506D, 0x5070, 0x5071, 0x503B, 0x5081, 0x5083, 0x5084, 0x5086, 0x508A, 0x508E, 0x508F, 0x5090}, {0x5092, 0x5093, 0x5094, 0x5096, 0x509B, 0x509C, 0x509E, 0x509F, 0x50A0, 0x50A1, 0x50A2, 0x50AA, 0x50AF, 0x50B0, 0x50B9, 0x50BA, 0x50BD, 0x50C0, 0x50C3, 0x50C4, 0x50C7, 0x50CC, 0x50CE, 0x50D0, 0x50D3, 0x50D4, 0x50D8, 0x50DC, 0x50DD, 0x50DF, 0x50E2, 0x50E4, 0x50E6, 0x50E8, 0x50E9, 0x50EF, 0x50F1, 0x50F6, 0x50FA, 0x50FE, 0x5103, 0x5106, 0x5107, 0x5108, 0x510B, 0x510C, 0x510D, 0x510E, 0x50F2, 0x5110, 0x5117, 0x5119, 0x511B, 0x511C, 0x511D, 0x511E, 0x5123, 0x5127, 0x5128, 0x512C, 0x512D, 0x512F, 0x5131, 0x5133, 0x5134, 0x5135, 0x5138, 0x5139, 0x5142, 0x514A, 0x514F, 0x5153, 0x5155, 0x5157, 0x5158, 0x515F, 0x5164, 0x5166, 0x517E, 0x5183, 0x5184, 0x518B, 0x518E, 0x5198, 0x519D, 0x51A1, 0x51A3, 0x51AD, 0x51B8, 0x51BA, 0x51BC, 0x51BE, 0x51BF, 0x51C2}, {0x51C8, 0x51CF, 0x51D1, 0x51D2, 0x51D3, 0x51D5, 0x51D8, 0x51DE, 0x51E2, 0x51E5, 0x51EE, 0x51F2, 0x51F3, 0x51F4, 0x51F7, 0x5201, 0x5202, 0x5205, 0x5212, 0x5213, 0x5215, 0x5216, 0x5218, 0x5222, 0x5228, 0x5231, 0x5232, 0x5235, 0x523C, 0x5245, 0x5249, 0x5255, 0x5257, 0x5258, 0x525A, 0x525C, 0x525F, 0x5260, 0x5261, 0x5266, 0x526E, 0x5277, 0x5278, 0x5279, 0x5280, 0x5282, 0x5285, 0x528A, 0x528C, 0x5293, 0x5295, 0x5296, 0x5297, 0x5298, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AF, 0x52B0, 0x52B6, 0x52B7, 0x52B8, 0x52BA, 0x52BB, 0x52BD, 0x52C0, 0x52C4, 0x52C6, 0x52C8, 0x52CC, 0x52CF, 0x52D1, 0x52D4, 0x52D6, 0x52DB, 0x52DC, 0x52E1, 0x52E5, 0x52E8, 0x52E9, 0x52EA, 0x52EC, 0x52F0, 0x52F1, 0x52F4, 0x52F6, 0x52F7, 0x5300, 0x5303, 0x530A, 0x530B}, {0x530C, 0x5311, 0x5313, 0x5318, 0x531B, 0x531C, 0x531E, 0x531F, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, 0x532C, 0x532D, 0x5330, 0x5332, 0x5335, 0x533C, 0x533D, 0x533E, 0x5342, 0x534C, 0x534B, 0x5359, 0x535B, 0x5361, 0x5363, 0x5365, 0x536C, 0x536D, 0x5372, 0x5379, 0x537E, 0x5383, 0x5387, 0x5388, 0x538E, 0x5393, 0x5394, 0x5399, 0x539D, 0x53A1, 0x53A4, 0x53AA, 0x53AB, 0x53AF, 0x53B2, 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53BA, 0x53BD, 0x53C0, 0x53C5, 0x53CF, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DD, 0x53DE, 0x53E0, 0x53E6, 0x53E7, 0x53F5, 0x5402, 0x5413, 0x541A, 0x5421, 0x5427, 0x5428, 0x542A, 0x542F, 0x5431, 0x5434, 0x5435, 0x5443, 0x5444, 0x5447, 0x544D, 0x544F, 0x545E, 0x5462, 0x5464, 0x5466, 0x5467, 0x5469, 0x546B, 0x546D, 0x546E, 0x5474, 0x547F}, {0x5481, 0x5483, 0x5485, 0x5488, 0x5489, 0x548D, 0x5491, 0x5495, 0x5496, 0x549C, 0x549F, 0x54A1, 0x54A6, 0x54A7, 0x54A9, 0x54AA, 0x54AD, 0x54AE, 0x54B1, 0x54B7, 0x54B9, 0x54BA, 0x54BB, 0x54BF, 0x54C6, 0x54CA, 0x54CD, 0x54CE, 0x54E0, 0x54EA, 0x54EC, 0x54EF, 0x54F6, 0x54FC, 0x54FE, 0x54FF, 0x5500, 0x5501, 0x5505, 0x5508, 0x5509, 0x550C, 0x550D, 0x550E, 0x5515, 0x552A, 0x552B, 0x5532, 0x5535, 0x5536, 0x553B, 0x553C, 0x553D, 0x5541, 0x5547, 0x5549, 0x554A, 0x554D, 0x5550, 0x5551, 0x5558, 0x555A, 0x555B, 0x555E, 0x5560, 0x5561, 0x5564, 0x5566, 0x557F, 0x5581, 0x5582, 0x5586, 0x5588, 0x558E, 0x558F, 0x5591, 0x5592, 0x5593, 0x5594, 0x5597, 0x55A3, 0x55A4, 0x55AD, 0x55B2, 0x55BF, 0x55C1, 0x55C3, 0x55C6, 0x55C9, 0x55CB, 0x55CC, 0x55CE, 0x55D1, 0x55D2}, {0x55D3, 0x55D7, 0x55D8, 0x55DB, 0x55DE, 0x55E2, 0x55E9, 0x55F6, 0x55FF, 0x5605, 0x5608, 0x560A, 0x560D, 0x560E, 0x560F, 0x5610, 0x5611, 0x5612, 0x5619, 0x562C, 0x5630, 0x5633, 0x5635, 0x5637, 0x5639, 0x563B, 0x563C, 0x563D, 0x563F, 0x5640, 0x5641, 0x5643, 0x5644, 0x5646, 0x5649, 0x564B, 0x564D, 0x564F, 0x5654, 0x565E, 0x5660, 0x5661, 0x5662, 0x5663, 0x5666, 0x5669, 0x566D, 0x566F, 0x5671, 0x5672, 0x5675, 0x5684, 0x5685, 0x5688, 0x568B, 0x568C, 0x5695, 0x5699, 0x569A, 0x569D, 0x569E, 0x569F, 0x56A6, 0x56A7, 0x56A8, 0x56A9, 0x56AB, 0x56AC, 0x56AD, 0x56B1, 0x56B3, 0x56B7, 0x56BE, 0x56C5, 0x56C9, 0x56CA, 0x56CB, 0x56CF, 0x56D0, 0x56CC, 0x56CD, 0x56D9, 0x56DC, 0x56DD, 0x56DF, 0x56E1, 0x56E4, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56F1, 0x56EB, 0x56ED}, {0x56F6, 0x56F7, 0x5701, 0x5702, 0x5707, 0x570A, 0x570C, 0x5711, 0x5715, 0x571A, 0x571B, 0x571D, 0x5720, 0x5722, 0x5723, 0x5724, 0x5725, 0x5729, 0x572A, 0x572C, 0x572E, 0x572F, 0x5733, 0x5734, 0x573D, 0x573E, 0x573F, 0x5745, 0x5746, 0x574C, 0x574D, 0x5752, 0x5762, 0x5765, 0x5767, 0x5768, 0x576B, 0x576D, 0x576E, 0x576F, 0x5770, 0x5771, 0x5773, 0x5774, 0x5775, 0x5777, 0x5779, 0x577A, 0x577B, 0x577C, 0x577E, 0x5781, 0x5783, 0x578C, 0x5794, 0x5797, 0x5799, 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A1, 0x5795, 0x57A7, 0x57A8, 0x57A9, 0x57AC, 0x57B8, 0x57BD, 0x57C7, 0x57C8, 0x57CC, 0x57CF, 0x57D5, 0x57DD, 0x57DE, 0x57E4, 0x57E6, 0x57E7, 0x57E9, 0x57ED, 0x57F0, 0x57F5, 0x57F6, 0x57F8, 0x57FD, 0x57FE, 0x57FF, 0x5803, 0x5804, 0x5808, 0x5809, 0x57E1}, {0x580C, 0x580D, 0x581B, 0x581E, 0x581F, 0x5820, 0x5826, 0x5827, 0x582D, 0x5832, 0x5839, 0x583F, 0x5849, 0x584C, 0x584D, 0x584F, 0x5850, 0x5855, 0x585F, 0x5861, 0x5864, 0x5867, 0x5868, 0x5878, 0x587C, 0x587F, 0x5880, 0x5881, 0x5887, 0x5888, 0x5889, 0x588A, 0x588C, 0x588D, 0x588F, 0x5890, 0x5894, 0x5896, 0x589D, 0x58A0, 0x58A1, 0x58A2, 0x58A6, 0x58A9, 0x58B1, 0x58B2, 0x58C4, 0x58BC, 0x58C2, 0x58C8, 0x58CD, 0x58CE, 0x58D0, 0x58D2, 0x58D4, 0x58D6, 0x58DA, 0x58DD, 0x58E1, 0x58E2, 0x58E9, 0x58F3, 0x5905, 0x5906, 0x590B, 0x590C, 0x5912, 0x5913, 0x5914, 0x8641, 0x591D, 0x5921, 0x5923, 0x5924, 0x5928, 0x592F, 0x5930, 0x5933, 0x5935, 0x5936, 0x593F, 0x5943, 0x5946, 0x5952, 0x5953, 0x5959, 0x595B, 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x596B, 0x596D}, {0x596F, 0x5972, 0x5975, 0x5976, 0x5979, 0x597B, 0x597C, 0x598B, 0x598C, 0x598E, 0x5992, 0x5995, 0x5997, 0x599F, 0x59A4, 0x59A7, 0x59AD, 0x59AE, 0x59AF, 0x59B0, 0x59B3, 0x59B7, 0x59BA, 0x59BC, 0x59C1, 0x59C3, 0x59C4, 0x59C8, 0x59CA, 0x59CD, 0x59D2, 0x59DD, 0x59DE, 0x59DF, 0x59E3, 0x59E4, 0x59E7, 0x59EE, 0x59EF, 0x59F1, 0x59F2, 0x59F4, 0x59F7, 0x5A00, 0x5A04, 0x5A0C, 0x5A0D, 0x5A0E, 0x5A12, 0x5A13, 0x5A1E, 0x5A23, 0x5A24, 0x5A27, 0x5A28, 0x5A2A, 0x5A2D, 0x5A30, 0x5A44, 0x5A45, 0x5A47, 0x5A48, 0x5A4C, 0x5A50, 0x5A55, 0x5A5E, 0x5A63, 0x5A65, 0x5A67, 0x5A6D, 0x5A77, 0x5A7A, 0x5A7B, 0x5A7E, 0x5A8B, 0x5A90, 0x5A93, 0x5A96, 0x5A99, 0x5A9C, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA2, 0x5AA7, 0x5AAC, 0x5AB1, 0x5AB2, 0x5AB3, 0x5AB5, 0x5AB8, 0x5ABA, 0x5ABB, 0x5ABF}, {0x5AC4, 0x5AC6, 0x5AC8, 0x5ACF, 0x5ADA, 0x5ADC, 0x5AE0, 0x5AE5, 0x5AEA, 0x5AEE, 0x5AF5, 0x5AF6, 0x5AFD, 0x5B00, 0x5B01, 0x5B08, 0x5B17, 0x5B34, 0x5B19, 0x5B1B, 0x5B1D, 0x5B21, 0x5B25, 0x5B2D, 0x5B38, 0x5B41, 0x5B4B, 0x5B4C, 0x5B52, 0x5B56, 0x5B5E, 0x5B68, 0x5B6E, 0x5B6F, 0x5B7C, 0x5B7D, 0x5B7E, 0x5B7F, 0x5B81, 0x5B84, 0x5B86, 0x5B8A, 0x5B8E, 0x5B90, 0x5B91, 0x5B93, 0x5B94, 0x5B96, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAF, 0x5BB1, 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BCD, 0x5BCF, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, 0x5BE0, 0x5BEF, 0x5BF1, 0x5BF4, 0x5BFD, 0x5C0C, 0x5C17, 0x5C1E, 0x5C1F, 0x5C23, 0x5C26, 0x5C29, 0x5C2B, 0x5C2C, 0x5C2E, 0x5C30, 0x5C32, 0x5C35, 0x5C36, 0x5C59, 0x5C5A, 0x5C5C, 0x5C62, 0x5C63, 0x5C67, 0x5C68, 0x5C69}, {0x5C6D, 0x5C70, 0x5C74, 0x5C75, 0x5C7A, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C87, 0x5C88, 0x5C8A, 0x5C8F, 0x5C92, 0x5C9D, 0x5C9F, 0x5CA0, 0x5CA2, 0x5CA3, 0x5CA6, 0x5CAA, 0x5CB2, 0x5CB4, 0x5CB5, 0x5CBA, 0x5CC9, 0x5CCB, 0x5CD2, 0x5CDD, 0x5CD7, 0x5CEE, 0x5CF1, 0x5CF2, 0x5CF4, 0x5D01, 0x5D06, 0x5D0D, 0x5D12, 0x5D2B, 0x5D23, 0x5D24, 0x5D26, 0x5D27, 0x5D31, 0x5D34, 0x5D39, 0x5D3D, 0x5D3F, 0x5D42, 0x5D43, 0x5D46, 0x5D48, 0x5D55, 0x5D51, 0x5D59, 0x5D4A, 0x5D5F, 0x5D60, 0x5D61, 0x5D62, 0x5D64, 0x5D6A, 0x5D6D, 0x5D70, 0x5D79, 0x5D7A, 0x5D7E, 0x5D7F, 0x5D81, 0x5D83, 0x5D88, 0x5D8A, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D99, 0x5D9B, 0x5D9F, 0x5DA0, 0x5DA7, 0x5DAB, 0x5DB0, 0x5DB4, 0x5DB8, 0x5DB9, 0x5DC3, 0x5DC7, 0x5DCB, 0x5DD0, 0x5DCE, 0x5DD8, 0x5DD9, 0x5DE0, 0x5DE4}, {0x5DE9, 0x5DF8, 0x5DF9, 0x5E00, 0x5E07, 0x5E0D, 0x5E12, 0x5E14, 0x5E15, 0x5E18, 0x5E1F, 0x5E20, 0x5E2E, 0x5E28, 0x5E32, 0x5E35, 0x5E3E, 0x5E4B, 0x5E50, 0x5E49, 0x5E51, 0x5E56, 0x5E58, 0x5E5B, 0x5E5C, 0x5E5E, 0x5E68, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D, 0x5E6E, 0x5E70, 0x5E80, 0x5E8B, 0x5E8E, 0x5EA2, 0x5EA4, 0x5EA5, 0x5EA8, 0x5EAA, 0x5EAC, 0x5EB1, 0x5EB3, 0x5EBD, 0x5EBE, 0x5EBF, 0x5EC6, 0x5ECC, 0x5ECB, 0x5ECE, 0x5ED1, 0x5ED2, 0x5ED4, 0x5ED5, 0x5EDC, 0x5EDE, 0x5EE5, 0x5EEB, 0x5F02, 0x5F06, 0x5F07, 0x5F08, 0x5F0E, 0x5F19, 0x5F1C, 0x5F1D, 0x5F21, 0x5F22, 0x5F23, 0x5F24, 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F34, 0x5F36, 0x5F3B, 0x5F3D, 0x5F3F, 0x5F40, 0x5F44, 0x5F45, 0x5F47, 0x5F4D, 0x5F50, 0x5F54, 0x5F58, 0x5F5B, 0x5F60, 0x5F63, 0x5F64, 0x5F67}, {0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F78, 0x5F7A, 0x5F7D, 0x5F7E, 0x5F89, 0x5F8D, 0x5F8F, 0x5F96, 0x5F9C, 0x5F9D, 0x5FA2, 0x5FA7, 0x5FAB, 0x5FA4, 0x5FAC, 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB8, 0x5FC4, 0x5FC7, 0x5FC8, 0x5FC9, 0x5FCB, 0x5FD0, 0x5FD1, 0x5FD2, 0x5FD3, 0x5FD4, 0x5FDE, 0x5FE1, 0x5FE2, 0x5FE8, 0x5FE9, 0x5FEA, 0x5FEC, 0x5FED, 0x5FEE, 0x5FEF, 0x5FF2, 0x5FF3, 0x5FF6, 0x5FFA, 0x5FFC, 0x6007, 0x600A, 0x600D, 0x6013, 0x6014, 0x6017, 0x6018, 0x601A, 0x601F, 0x6024, 0x602D, 0x6033, 0x6035, 0x6040, 0x6047, 0x6048, 0x6049, 0x604C, 0x6051, 0x6054, 0x6056, 0x6057, 0x605D, 0x6061, 0x6067, 0x6071, 0x607E, 0x607F, 0x6082, 0x6086, 0x6088, 0x608A, 0x608E, 0x6091, 0x6093, 0x6095, 0x6098, 0x609D, 0x609E, 0x60A2, 0x60A4, 0x60A5, 0x60A8, 0x60B0, 0x60B1, 0x60B7}, {0x60BB, 0x60BE, 0x60C2, 0x60C4, 0x60C8, 0x60C9, 0x60CA, 0x60CB, 0x60CE, 0x60CF, 0x60D4, 0x60D5, 0x60D9, 0x60DB, 0x60DD, 0x60DE, 0x60E2, 0x60E5, 0x60F2, 0x60F5, 0x60F8, 0x60FC, 0x60FD, 0x6102, 0x6107, 0x610A, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6119, 0x611C, 0x611E, 0x6122, 0x612A, 0x612B, 0x6130, 0x6131, 0x6135, 0x6136, 0x6137, 0x6139, 0x6141, 0x6145, 0x6146, 0x6149, 0x615E, 0x6160, 0x616C, 0x6172, 0x6178, 0x617B, 0x617C, 0x617F, 0x6180, 0x6181, 0x6183, 0x6184, 0x618B, 0x618D, 0x6192, 0x6193, 0x6197, 0x6198, 0x619C, 0x619D, 0x619F, 0x61A0, 0x61A5, 0x61A8, 0x61AA, 0x61AD, 0x61B8, 0x61B9, 0x61BC, 0x61C0, 0x61C1, 0x61C2, 0x61CE, 0x61CF, 0x61D5, 0x61DC, 0x61DD, 0x61DE, 0x61DF, 0x61E1, 0x61E2, 0x61E7, 0x61E9, 0x61E5}, {0x61EC, 0x61ED, 0x61EF, 0x6201, 0x6203, 0x6204, 0x6207, 0x6213, 0x6215, 0x621C, 0x6220, 0x6222, 0x6223, 0x6227, 0x6229, 0x622B, 0x6239, 0x623D, 0x6242, 0x6243, 0x6244, 0x6246, 0x624C, 0x6250, 0x6251, 0x6252, 0x6254, 0x6256, 0x625A, 0x625C, 0x6264, 0x626D, 0x626F, 0x6273, 0x627A, 0x627D, 0x628D, 0x628E, 0x628F, 0x6290, 0x62A6, 0x62A8, 0x62B3, 0x62B6, 0x62B7, 0x62BA, 0x62BE, 0x62BF, 0x62C4, 0x62CE, 0x62D5, 0x62D6, 0x62DA, 0x62EA, 0x62F2, 0x62F4, 0x62FC, 0x62FD, 0x6303, 0x6304, 0x630A, 0x630B, 0x630D, 0x6310, 0x6313, 0x6316, 0x6318, 0x6329, 0x632A, 0x632D, 0x6335, 0x6336, 0x6339, 0x633C, 0x6341, 0x6342, 0x6343, 0x6344, 0x6346, 0x634A, 0x634B, 0x634E, 0x6352, 0x6353, 0x6354, 0x6358, 0x635B, 0x6365, 0x6366, 0x636C, 0x636D, 0x6371, 0x6374, 0x6375}, {0x6378, 0x637C, 0x637D, 0x637F, 0x6382, 0x6384, 0x6387, 0x638A, 0x6390, 0x6394, 0x6395, 0x6399, 0x639A, 0x639E, 0x63A4, 0x63A6, 0x63AD, 0x63AE, 0x63AF, 0x63BD, 0x63C1, 0x63C5, 0x63C8, 0x63CE, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63DC, 0x63E0, 0x63E5, 0x63EA, 0x63EC, 0x63F2, 0x63F3, 0x63F5, 0x63F8, 0x63F9, 0x6409, 0x640A, 0x6410, 0x6412, 0x6414, 0x6418, 0x641E, 0x6420, 0x6422, 0x6424, 0x6425, 0x6429, 0x642A, 0x642F, 0x6430, 0x6435, 0x643D, 0x643F, 0x644B, 0x644F, 0x6451, 0x6452, 0x6453, 0x6454, 0x645A, 0x645B, 0x645C, 0x645D, 0x645F, 0x6460, 0x6461, 0x6463, 0x646D, 0x6473, 0x6474, 0x647B, 0x647D, 0x6485, 0x6487, 0x648F, 0x6490, 0x6491, 0x6498, 0x6499, 0x649B, 0x649D, 0x649F, 0x64A1, 0x64A3, 0x64A6, 0x64A8, 0x64AC, 0x64B3, 0x64BD, 0x64BE, 0x64BF}, {0x64C4, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CE, 0x64D0, 0x64D1, 0x64D5, 0x64D7, 0x64E4, 0x64E5, 0x64E9, 0x64EA, 0x64ED, 0x64F0, 0x64F5, 0x64F7, 0x64FB, 0x64FF, 0x6501, 0x6504, 0x6508, 0x6509, 0x650A, 0x650F, 0x6513, 0x6514, 0x6516, 0x6519, 0x651B, 0x651E, 0x651F, 0x6522, 0x6526, 0x6529, 0x652E, 0x6531, 0x653A, 0x653C, 0x653D, 0x6543, 0x6547, 0x6549, 0x6550, 0x6552, 0x6554, 0x655F, 0x6560, 0x6567, 0x656B, 0x657A, 0x657D, 0x6581, 0x6585, 0x658A, 0x6592, 0x6595, 0x6598, 0x659D, 0x65A0, 0x65A3, 0x65A6, 0x65AE, 0x65B2, 0x65B3, 0x65B4, 0x65BF, 0x65C2, 0x65C8, 0x65C9, 0x65CE, 0x65D0, 0x65D4, 0x65D6, 0x65D8, 0x65DF, 0x65F0, 0x65F2, 0x65F4, 0x65F5, 0x65F9, 0x65FE, 0x65FF, 0x6600, 0x6604, 0x6608, 0x6609, 0x660D, 0x6611, 0x6612, 0x6615, 0x6616, 0x661D}, {0x661E, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, 0x6631, 0x6633, 0x6639, 0x6637, 0x6640, 0x6645, 0x6646, 0x664A, 0x664C, 0x6651, 0x664E, 0x6657, 0x6658, 0x6659, 0x665B, 0x665C, 0x6660, 0x6661, 0x66FB, 0x666A, 0x666B, 0x666C, 0x667E, 0x6673, 0x6675, 0x667F, 0x6677, 0x6678, 0x6679, 0x667B, 0x6680, 0x667C, 0x668B, 0x668C, 0x668D, 0x6690, 0x6692, 0x6699, 0x669A, 0x669B, 0x669C, 0x669F, 0x66A0, 0x66A4, 0x66AD, 0x66B1, 0x66B2, 0x66B5, 0x66BB, 0x66BF, 0x66C0, 0x66C2, 0x66C3, 0x66C8, 0x66CC, 0x66CE, 0x66CF, 0x66D4, 0x66DB, 0x66DF, 0x66E8, 0x66EB, 0x66EC, 0x66EE, 0x66FA, 0x6705, 0x6707, 0x670E, 0x6713, 0x6719, 0x671C, 0x6720, 0x6722, 0x6733, 0x673E, 0x6745, 0x6747, 0x6748, 0x674C, 0x6754, 0x6755, 0x675D}, {0x6766, 0x676C, 0x676E, 0x6774, 0x6776, 0x677B, 0x6781, 0x6784, 0x678E, 0x678F, 0x6791, 0x6793, 0x6796, 0x6798, 0x6799, 0x679B, 0x67B0, 0x67B1, 0x67B2, 0x67B5, 0x67BB, 0x67BC, 0x67BD, 0x67F9, 0x67C0, 0x67C2, 0x67C3, 0x67C5, 0x67C8, 0x67C9, 0x67D2, 0x67D7, 0x67D9, 0x67DC, 0x67E1, 0x67E6, 0x67F0, 0x67F2, 0x67F6, 0x67F7, 0x6852, 0x6814, 0x6819, 0x681D, 0x681F, 0x6828, 0x6827, 0x682C, 0x682D, 0x682F, 0x6830, 0x6831, 0x6833, 0x683B, 0x683F, 0x6844, 0x6845, 0x684A, 0x684C, 0x6855, 0x6857, 0x6858, 0x685B, 0x686B, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872, 0x6875, 0x6879, 0x687A, 0x687B, 0x687C, 0x6882, 0x6884, 0x6886, 0x6888, 0x6896, 0x6898, 0x689A, 0x689C, 0x68A1, 0x68A3, 0x68A5, 0x68A9, 0x68AA, 0x68AE, 0x68B2, 0x68BB, 0x68C5, 0x68C8, 0x68CC, 0x68CF}, {0x68D0, 0x68D1, 0x68D3, 0x68D6, 0x68D9, 0x68DC, 0x68DD, 0x68E5, 0x68E8, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68F0, 0x68F1, 0x68F5, 0x68F6, 0x68FB, 0x68FC, 0x68FD, 0x6906, 0x6909, 0x690A, 0x6910, 0x6911, 0x6913, 0x6916, 0x6917, 0x6931, 0x6933, 0x6935, 0x6938, 0x693B, 0x6942, 0x6945, 0x6949, 0x694E, 0x6957, 0x695B, 0x6963, 0x6964, 0x6965, 0x6966, 0x6968, 0x6969, 0x696C, 0x6970, 0x6971, 0x6972, 0x697A, 0x697B, 0x697F, 0x6980, 0x698D, 0x6992, 0x6996, 0x6998, 0x69A1, 0x69A5, 0x69A6, 0x69A8, 0x69AB, 0x69AD, 0x69AF, 0x69B7, 0x69B8, 0x69BA, 0x69BC, 0x69C5, 0x69C8, 0x69D1, 0x69D6, 0x69D7, 0x69E2, 0x69E5, 0x69EE, 0x69EF, 0x69F1, 0x69F3, 0x69F5, 0x69FE, 0x6A00, 0x6A01, 0x6A03, 0x6A0F, 0x6A11, 0x6A15, 0x6A1A, 0x6A1D, 0x6A20, 0x6A24, 0x6A28, 0x6A30, 0x6A32}, {0x6A34, 0x6A37, 0x6A3B, 0x6A3E, 0x6A3F, 0x6A45, 0x6A46, 0x6A49, 0x6A4A, 0x6A4E, 0x6A50, 0x6A51, 0x6A52, 0x6A55, 0x6A56, 0x6A5B, 0x6A64, 0x6A67, 0x6A6A, 0x6A71, 0x6A73, 0x6A7E, 0x6A81, 0x6A83, 0x6A86, 0x6A87, 0x6A89, 0x6A8B, 0x6A91, 0x6A9B, 0x6A9D, 0x6A9E, 0x6A9F, 0x6AA5, 0x6AAB, 0x6AAF, 0x6AB0, 0x6AB1, 0x6AB4, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC6, 0x6AC9, 0x6AC8, 0x6ACC, 0x6AD0, 0x6AD4, 0x6AD5, 0x6AD6, 0x6ADC, 0x6ADD, 0x6AE4, 0x6AE7, 0x6AEC, 0x6AF0, 0x6AF1, 0x6AF2, 0x6AFC, 0x6AFD, 0x6B02, 0x6B03, 0x6B06, 0x6B07, 0x6B09, 0x6B0F, 0x6B10, 0x6B11, 0x6B17, 0x6B1B, 0x6B1E, 0x6B24, 0x6B28, 0x6B2B, 0x6B2C, 0x6B2F, 0x6B35, 0x6B36, 0x6B3B, 0x6B3F, 0x6B46, 0x6B4A, 0x6B4D, 0x6B52, 0x6B56, 0x6B58, 0x6B5D, 0x6B60, 0x6B67, 0x6B6B, 0x6B6E, 0x6B70, 0x6B75, 0x6B7D}, {0x6B7E, 0x6B82, 0x6B85, 0x6B97, 0x6B9B, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA8, 0x6BA9, 0x6BAC, 0x6BAD, 0x6BAE, 0x6BB0, 0x6BB8, 0x6BB9, 0x6BBD, 0x6BBE, 0x6BC3, 0x6BC4, 0x6BC9, 0x6BCC, 0x6BD6, 0x6BDA, 0x6BE1, 0x6BE3, 0x6BE6, 0x6BE7, 0x6BEE, 0x6BF1, 0x6BF7, 0x6BF9, 0x6BFF, 0x6C02, 0x6C04, 0x6C05, 0x6C09, 0x6C0D, 0x6C0E, 0x6C10, 0x6C12, 0x6C19, 0x6C1F, 0x6C26, 0x6C27, 0x6C28, 0x6C2C, 0x6C2E, 0x6C33, 0x6C35, 0x6C36, 0x6C3A, 0x6C3B, 0x6C3F, 0x6C4A, 0x6C4B, 0x6C4D, 0x6C4F, 0x6C52, 0x6C54, 0x6C59, 0x6C5B, 0x6C5C, 0x6C6B, 0x6C6D, 0x6C6F, 0x6C74, 0x6C76, 0x6C78, 0x6C79, 0x6C7B, 0x6C85, 0x6C86, 0x6C87, 0x6C89, 0x6C94, 0x6C95, 0x6C97, 0x6C98, 0x6C9C, 0x6C9F, 0x6CB0, 0x6CB2, 0x6CB4, 0x6CC2, 0x6CC6, 0x6CCD, 0x6CCF, 0x6CD0, 0x6CD1, 0x6CD2, 0x6CD4, 0x6CD6}, {0x6CDA, 0x6CDC, 0x6CE0, 0x6CE7, 0x6CE9, 0x6CEB, 0x6CEC, 0x6CEE, 0x6CF2, 0x6CF4, 0x6D04, 0x6D07, 0x6D0A, 0x6D0E, 0x6D0F, 0x6D11, 0x6D13, 0x6D1A, 0x6D26, 0x6D27, 0x6D28, 0x6C67, 0x6D2E, 0x6D2F, 0x6D31, 0x6D39, 0x6D3C, 0x6D3F, 0x6D57, 0x6D5E, 0x6D5F, 0x6D61, 0x6D65, 0x6D67, 0x6D6F, 0x6D70, 0x6D7C, 0x6D82, 0x6D87, 0x6D91, 0x6D92, 0x6D94, 0x6D96, 0x6D97, 0x6D98, 0x6DAA, 0x6DAC, 0x6DB4, 0x6DB7, 0x6DB9, 0x6DBD, 0x6DBF, 0x6DC4, 0x6DC8, 0x6DCA, 0x6DCE, 0x6DCF, 0x6DD6, 0x6DDB, 0x6DDD, 0x6DDF, 0x6DE0, 0x6DE2, 0x6DE5, 0x6DE9, 0x6DEF, 0x6DF0, 0x6DF4, 0x6DF6, 0x6DFC, 0x6E00, 0x6E04, 0x6E1E, 0x6E22, 0x6E27, 0x6E32, 0x6E36, 0x6E39, 0x6E3B, 0x6E3C, 0x6E44, 0x6E45, 0x6E48, 0x6E49, 0x6E4B, 0x6E4F, 0x6E51, 0x6E52, 0x6E53, 0x6E54, 0x6E57, 0x6E5C, 0x6E5D, 0x6E5E}, {0x6E62, 0x6E63, 0x6E68, 0x6E73, 0x6E7B, 0x6E7D, 0x6E8D, 0x6E93, 0x6E99, 0x6EA0, 0x6EA7, 0x6EAD, 0x6EAE, 0x6EB1, 0x6EB3, 0x6EBB, 0x6EBF, 0x6EC0, 0x6EC1, 0x6EC3, 0x6EC7, 0x6EC8, 0x6ECA, 0x6ECD, 0x6ECE, 0x6ECF, 0x6EEB, 0x6EED, 0x6EEE, 0x6EF9, 0x6EFB, 0x6EFD, 0x6F04, 0x6F08, 0x6F0A, 0x6F0C, 0x6F0D, 0x6F16, 0x6F18, 0x6F1A, 0x6F1B, 0x6F26, 0x6F29, 0x6F2A, 0x6F2F, 0x6F30, 0x6F33, 0x6F36, 0x6F3B, 0x6F3C, 0x6F2D, 0x6F4F, 0x6F51, 0x6F52, 0x6F53, 0x6F57, 0x6F59, 0x6F5A, 0x6F5D, 0x6F5E, 0x6F61, 0x6F62, 0x6F68, 0x6F6C, 0x6F7D, 0x6F7E, 0x6F83, 0x6F87, 0x6F88, 0x6F8B, 0x6F8C, 0x6F8D, 0x6F90, 0x6F92, 0x6F93, 0x6F94, 0x6F96, 0x6F9A, 0x6F9F, 0x6FA0, 0x6FA5, 0x6FA6, 0x6FA7, 0x6FA8, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB5, 0x6FB6, 0x6FBC, 0x6FC5, 0x6FC7, 0x6FC8, 0x6FCA}, {0x6FDA, 0x6FDE, 0x6FE8, 0x6FE9, 0x6FF0, 0x6FF5, 0x6FF9, 0x6FFC, 0x6FFD, 0x7000, 0x7005, 0x7006, 0x7007, 0x700D, 0x7017, 0x7020, 0x7023, 0x702F, 0x7034, 0x7037, 0x7039, 0x703C, 0x7043, 0x7044, 0x7048, 0x7049, 0x704A, 0x704B, 0x7054, 0x7055, 0x705D, 0x705E, 0x704E, 0x7064, 0x7065, 0x706C, 0x706E, 0x7075, 0x7076, 0x707E, 0x7081, 0x7085, 0x7086, 0x7094, 0x7095, 0x7096, 0x7097, 0x7098, 0x709B, 0x70A4, 0x70AB, 0x70B0, 0x70B1, 0x70B4, 0x70B7, 0x70CA, 0x70D1, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D8, 0x70DC, 0x70E4, 0x70FA, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x710B, 0x710C, 0x710F, 0x711E, 0x7120, 0x712B, 0x712D, 0x712F, 0x7130, 0x7131, 0x7138, 0x7141, 0x7145, 0x7146, 0x7147, 0x714A, 0x714B, 0x7150, 0x7152, 0x7157, 0x715A, 0x715C, 0x715E, 0x7160}, {0x7168, 0x7179, 0x7180, 0x7185, 0x7187, 0x718C, 0x7192, 0x719A, 0x719B, 0x71A0, 0x71A2, 0x71AF, 0x71B0, 0x71B2, 0x71B3, 0x71BA, 0x71BF, 0x71C0, 0x71C1, 0x71C4, 0x71CB, 0x71CC, 0x71D3, 0x71D6, 0x71D9, 0x71DA, 0x71DC, 0x71F8, 0x71FE, 0x7200, 0x7207, 0x7208, 0x7209, 0x7213, 0x7217, 0x721A, 0x721D, 0x721F, 0x7224, 0x722B, 0x722F, 0x7234, 0x7238, 0x7239, 0x7241, 0x7242, 0x7243, 0x7245, 0x724E, 0x724F, 0x7250, 0x7253, 0x7255, 0x7256, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7268, 0x726B, 0x726E, 0x726F, 0x7271, 0x7277, 0x7278, 0x727B, 0x727C, 0x727F, 0x7284, 0x7289, 0x728D, 0x728E, 0x7293, 0x729B, 0x72A8, 0x72AD, 0x72AE, 0x72B1, 0x72B4, 0x72BE, 0x72C1, 0x72C7, 0x72C9, 0x72CC, 0x72D5, 0x72D6, 0x72D8, 0x72DF, 0x72E5, 0x72F3, 0x72F4, 0x72FA, 0x72FB}, {0x72FE, 0x7302, 0x7304, 0x7305, 0x7307, 0x730B, 0x730D, 0x7312, 0x7313, 0x7318, 0x7319, 0x731E, 0x7322, 0x7324, 0x7327, 0x7328, 0x732C, 0x7331, 0x7332, 0x7335, 0x733A, 0x733B, 0x733D, 0x7343, 0x734D, 0x7350, 0x7352, 0x7356, 0x7358, 0x735D, 0x735E, 0x735F, 0x7360, 0x7366, 0x7367, 0x7369, 0x736B, 0x736C, 0x736E, 0x736F, 0x7371, 0x7377, 0x7379, 0x737C, 0x7380, 0x7381, 0x7383, 0x7385, 0x7386, 0x738E, 0x7390, 0x7393, 0x7395, 0x7397, 0x7398, 0x739C, 0x739E, 0x739F, 0x73A0, 0x73A2, 0x73A5, 0x73A6, 0x73AA, 0x73AB, 0x73AD, 0x73B5, 0x73B7, 0x73B9, 0x73BC, 0x73BD, 0x73BF, 0x73C5, 0x73C6, 0x73C9, 0x73CB, 0x73CC, 0x73CF, 0x73D2, 0x73D3, 0x73D6, 0x73D9, 0x73DD, 0x73E1, 0x73E3, 0x73E6, 0x73E7, 0x73E9, 0x73F4, 0x73F5, 0x73F7, 0x73F9, 0x73FA, 0x73FB, 0x73FD}, {0x73FF, 0x7400, 0x7401, 0x7404, 0x7407, 0x740A, 0x7411, 0x741A, 0x741B, 0x7424, 0x7426, 0x7428, 0x7429, 0x742A, 0x742B, 0x742C, 0x742D, 0x742E, 0x742F, 0x7430, 0x7431, 0x7439, 0x7440, 0x7443, 0x7444, 0x7446, 0x7447, 0x744B, 0x744D, 0x7451, 0x7452, 0x7457, 0x745D, 0x7462, 0x7466, 0x7467, 0x7468, 0x746B, 0x746D, 0x746E, 0x7471, 0x7472, 0x7480, 0x7481, 0x7485, 0x7486, 0x7487, 0x7489, 0x748F, 0x7490, 0x7491, 0x7492, 0x7498, 0x7499, 0x749A, 0x749C, 0x749F, 0x74A0, 0x74A1, 0x74A3, 0x74A6, 0x74A8, 0x74A9, 0x74AA, 0x74AB, 0x74AE, 0x74AF, 0x74B1, 0x74B2, 0x74B5, 0x74B9, 0x74BB, 0x74BF, 0x74C8, 0x74C9, 0x74CC, 0x74D0, 0x74D3, 0x74D8, 0x74DA, 0x74DB, 0x74DE, 0x74DF, 0x74E4, 0x74E8, 0x74EA, 0x74EB, 0x74EF, 0x74F4, 0x74FA, 0x74FB, 0x74FC, 0x74FF, 0x7506}, {0x7512, 0x7516, 0x7517, 0x7520, 0x7521, 0x7524, 0x7527, 0x7529, 0x752A, 0x752F, 0x7536, 0x7539, 0x753D, 0x753E, 0x753F, 0x7540, 0x7543, 0x7547, 0x7548, 0x754E, 0x7550, 0x7552, 0x7557, 0x755E, 0x755F, 0x7561, 0x756F, 0x7571, 0x7579, 0x757A, 0x757B, 0x757C, 0x757D, 0x757E, 0x7581, 0x7585, 0x7590, 0x7592, 0x7593, 0x7595, 0x7599, 0x759C, 0x75A2, 0x75A4, 0x75B4, 0x75BA, 0x75BF, 0x75C0, 0x75C1, 0x75C4, 0x75C6, 0x75CC, 0x75CE, 0x75CF, 0x75D7, 0x75DC, 0x75DF, 0x75E0, 0x75E1, 0x75E4, 0x75E7, 0x75EC, 0x75EE, 0x75EF, 0x75F1, 0x75F9, 0x7600, 0x7602, 0x7603, 0x7604, 0x7607, 0x7608, 0x760A, 0x760C, 0x760F, 0x7612, 0x7613, 0x7615, 0x7616, 0x7619, 0x761B, 0x761C, 0x761D, 0x761E, 0x7623, 0x7625, 0x7626, 0x7629, 0x762D, 0x7632, 0x7633, 0x7635, 0x7638, 0x7639}, {0x763A, 0x763C, 0x764A, 0x7640, 0x7641, 0x7643, 0x7644, 0x7645, 0x7649, 0x764B, 0x7655, 0x7659, 0x765F, 0x7664, 0x7665, 0x766D, 0x766E, 0x766F, 0x7671, 0x7674, 0x7681, 0x7685, 0x768C, 0x768D, 0x7695, 0x769B, 0x769C, 0x769D, 0x769F, 0x76A0, 0x76A2, 0x76A3, 0x76A4, 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76AA, 0x76AD, 0x76BD, 0x76C1, 0x76C5, 0x76C9, 0x76CB, 0x76CC, 0x76CE, 0x76D4, 0x76D9, 0x76E0, 0x76E6, 0x76E8, 0x76EC, 0x76F0, 0x76F1, 0x76F6, 0x76F9, 0x76FC, 0x7700, 0x7706, 0x770A, 0x770E, 0x7712, 0x7714, 0x7715, 0x7717, 0x7719, 0x771A, 0x771C, 0x7722, 0x7728, 0x772D, 0x772E, 0x772F, 0x7734, 0x7735, 0x7736, 0x7739, 0x773D, 0x773E, 0x7742, 0x7745, 0x7746, 0x774A, 0x774D, 0x774E, 0x774F, 0x7752, 0x7756, 0x7757, 0x775C, 0x775E, 0x775F, 0x7760, 0x7762}, {0x7764, 0x7767, 0x776A, 0x776C, 0x7770, 0x7772, 0x7773, 0x7774, 0x777A, 0x777D, 0x7780, 0x7784, 0x778C, 0x778D, 0x7794, 0x7795, 0x7796, 0x779A, 0x779F, 0x77A2, 0x77A7, 0x77AA, 0x77AE, 0x77AF, 0x77B1, 0x77B5, 0x77BE, 0x77C3, 0x77C9, 0x77D1, 0x77D2, 0x77D5, 0x77D9, 0x77DE, 0x77DF, 0x77E0, 0x77E4, 0x77E6, 0x77EA, 0x77EC, 0x77F0, 0x77F1, 0x77F4, 0x77F8, 0x77FB, 0x7805, 0x7806, 0x7809, 0x780D, 0x780E, 0x7811, 0x781D, 0x7821, 0x7822, 0x7823, 0x782D, 0x782E, 0x7830, 0x7835, 0x7837, 0x7843, 0x7844, 0x7847, 0x7848, 0x784C, 0x784E, 0x7852, 0x785C, 0x785E, 0x7860, 0x7861, 0x7863, 0x7864, 0x7868, 0x786A, 0x786E, 0x787A, 0x787E, 0x788A, 0x788F, 0x7894, 0x7898, 0x78A1, 0x789D, 0x789E, 0x789F, 0x78A4, 0x78A8, 0x78AC, 0x78AD, 0x78B0, 0x78B1, 0x78B2, 0x78B3}, {0x78BB, 0x78BD, 0x78BF, 0x78C7, 0x78C8, 0x78C9, 0x78CC, 0x78CE, 0x78D2, 0x78D3, 0x78D5, 0x78D6, 0x78E4, 0x78DB, 0x78DF, 0x78E0, 0x78E1, 0x78E6, 0x78EA, 0x78F2, 0x78F3, 0x7900, 0x78F6, 0x78F7, 0x78FA, 0x78FB, 0x78FF, 0x7906, 0x790C, 0x7910, 0x791A, 0x791C, 0x791E, 0x791F, 0x7920, 0x7925, 0x7927, 0x7929, 0x792D, 0x7931, 0x7934, 0x7935, 0x793B, 0x793D, 0x793F, 0x7944, 0x7945, 0x7946, 0x794A, 0x794B, 0x794F, 0x7951, 0x7954, 0x7958, 0x795B, 0x795C, 0x7967, 0x7969, 0x796B, 0x7972, 0x7979, 0x797B, 0x797C, 0x797E, 0x798B, 0x798C, 0x7991, 0x7993, 0x7994, 0x7995, 0x7996, 0x7998, 0x799B, 0x799C, 0x79A1, 0x79A8, 0x79A9, 0x79AB, 0x79AF, 0x79B1, 0x79B4, 0x79B8, 0x79BB, 0x79C2, 0x79C4, 0x79C7, 0x79C8, 0x79CA, 0x79CF, 0x79D4, 0x79D6, 0x79DA, 0x79DD, 0x79DE}, {0x79E0, 0x79E2, 0x79E5, 0x79EA, 0x79EB, 0x79ED, 0x79F1, 0x79F8, 0x79FC, 0x7A02, 0x7A03, 0x7A07, 0x7A09, 0x7A0A, 0x7A0C, 0x7A11, 0x7A15, 0x7A1B, 0x7A1E, 0x7A21, 0x7A27, 0x7A2B, 0x7A2D, 0x7A2F, 0x7A30, 0x7A34, 0x7A35, 0x7A38, 0x7A39, 0x7A3A, 0x7A44, 0x7A45, 0x7A47, 0x7A48, 0x7A4C, 0x7A55, 0x7A56, 0x7A59, 0x7A5C, 0x7A5D, 0x7A5F, 0x7A60, 0x7A65, 0x7A67, 0x7A6A, 0x7A6D, 0x7A75, 0x7A78, 0x7A7E, 0x7A80, 0x7A82, 0x7A85, 0x7A86, 0x7A8A, 0x7A8B, 0x7A90, 0x7A91, 0x7A94, 0x7A9E, 0x7AA0, 0x7AA3, 0x7AAC, 0x7AB3, 0x7AB5, 0x7AB9, 0x7ABB, 0x7ABC, 0x7AC6, 0x7AC9, 0x7ACC, 0x7ACE, 0x7AD1, 0x7ADB, 0x7AE8, 0x7AE9, 0x7AEB, 0x7AEC, 0x7AF1, 0x7AF4, 0x7AFB, 0x7AFD, 0x7AFE, 0x7B07, 0x7B14, 0x7B1F, 0x7B23, 0x7B27, 0x7B29, 0x7B2A, 0x7B2B, 0x7B2D, 0x7B2E, 0x7B2F, 0x7B30}, {0x7B31, 0x7B34, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B47, 0x7B4E, 0x7B55, 0x7B60, 0x7B64, 0x7B66, 0x7B69, 0x7B6A, 0x7B6D, 0x7B6F, 0x7B72, 0x7B73, 0x7B77, 0x7B84, 0x7B89, 0x7B8E, 0x7B90, 0x7B91, 0x7B96, 0x7B9B, 0x7B9E, 0x7BA0, 0x7BA5, 0x7BAC, 0x7BAF, 0x7BB0, 0x7BB2, 0x7BB5, 0x7BB6, 0x7BBA, 0x7BBB, 0x7BBC, 0x7BBD, 0x7BC2, 0x7BC5, 0x7BC8, 0x7BCA, 0x7BD4, 0x7BD6, 0x7BD7, 0x7BD9, 0x7BDA, 0x7BDB, 0x7BE8, 0x7BEA, 0x7BF2, 0x7BF4, 0x7BF5, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFC, 0x7BFE, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C06, 0x7C09, 0x7C0B, 0x7C0C, 0x7C0E, 0x7C0F, 0x7C19, 0x7C1B, 0x7C20, 0x7C25, 0x7C26, 0x7C28, 0x7C2C, 0x7C31, 0x7C33, 0x7C34, 0x7C36, 0x7C39, 0x7C3A, 0x7C46, 0x7C4A, 0x7C55, 0x7C51, 0x7C52, 0x7C53, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5C, 0x7C5D, 0x7C5E}, {0x7C61, 0x7C63, 0x7C67, 0x7C69, 0x7C6D, 0x7C6E, 0x7C70, 0x7C72, 0x7C79, 0x7C7C, 0x7C7D, 0x7C86, 0x7C87, 0x7C8F, 0x7C94, 0x7C9E, 0x7CA0, 0x7CA6, 0x7CB0, 0x7CB6, 0x7CB7, 0x7CBA, 0x7CBB, 0x7CBC, 0x7CBF, 0x7CC4, 0x7CC7, 0x7CC8, 0x7CC9, 0x7CCD, 0x7CCF, 0x7CD3, 0x7CD4, 0x7CD5, 0x7CD7, 0x7CD9, 0x7CDA, 0x7CDD, 0x7CE6, 0x7CE9, 0x7CEB, 0x7CF5, 0x7D03, 0x7D07, 0x7D08, 0x7D09, 0x7D0F, 0x7D11, 0x7D12, 0x7D13, 0x7D16, 0x7D1D, 0x7D1E, 0x7D23, 0x7D26, 0x7D2A, 0x7D2D, 0x7D31, 0x7D3C, 0x7D3D, 0x7D3E, 0x7D40, 0x7D41, 0x7D47, 0x7D48, 0x7D4D, 0x7D51, 0x7D53, 0x7D57, 0x7D59, 0x7D5A, 0x7D5C, 0x7D5D, 0x7D65, 0x7D67, 0x7D6A, 0x7D70, 0x7D78, 0x7D7A, 0x7D7B, 0x7D7F, 0x7D81, 0x7D82, 0x7D83, 0x7D85, 0x7D86, 0x7D88, 0x7D8B, 0x7D8C, 0x7D8D, 0x7D91, 0x7D96, 0x7D97, 0x7D9D}, {0x7D9E, 0x7DA6, 0x7DA7, 0x7DAA, 0x7DB3, 0x7DB6, 0x7DB7, 0x7DB9, 0x7DC2, 0x7DC3, 0x7DC4, 0x7DC5, 0x7DC6, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DD7, 0x7DD9, 0x7E00, 0x7DE2, 0x7DE5, 0x7DE6, 0x7DEA, 0x7DEB, 0x7DED, 0x7DF1, 0x7DF5, 0x7DF6, 0x7DF9, 0x7DFA, 0x7E08, 0x7E10, 0x7E11, 0x7E15, 0x7E17, 0x7E1C, 0x7E1D, 0x7E20, 0x7E27, 0x7E28, 0x7E2C, 0x7E2D, 0x7E2F, 0x7E33, 0x7E36, 0x7E3F, 0x7E44, 0x7E45, 0x7E47, 0x7E4E, 0x7E50, 0x7E52, 0x7E58, 0x7E5F, 0x7E61, 0x7E62, 0x7E65, 0x7E6B, 0x7E6E, 0x7E6F, 0x7E73, 0x7E78, 0x7E7E, 0x7E81, 0x7E86, 0x7E87, 0x7E8A, 0x7E8D, 0x7E91, 0x7E95, 0x7E98, 0x7E9A, 0x7E9D, 0x7E9E, 0x7F3C, 0x7F3B, 0x7F3D, 0x7F3E, 0x7F3F, 0x7F43, 0x7F44, 0x7F47, 0x7F4F, 0x7F52, 0x7F53, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F61, 0x7F63, 0x7F64, 0x7F65, 0x7F66, 0x7F6D}, {0x7F71, 0x7F7D, 0x7F7E, 0x7F7F, 0x7F80, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, 0x7F91, 0x7F96, 0x7F97, 0x7F9C, 0x7FA1, 0x7FA2, 0x7FA6, 0x7FAA, 0x7FAD, 0x7FB4, 0x7FBC, 0x7FBF, 0x7FC0, 0x7FC3, 0x7FC8, 0x7FCE, 0x7FCF, 0x7FDB, 0x7FDF, 0x7FE3, 0x7FE5, 0x7FE8, 0x7FEC, 0x7FEE, 0x7FEF, 0x7FF2, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF, 0x8007, 0x8008, 0x800A, 0x800D, 0x800E, 0x800F, 0x8011, 0x8013, 0x8014, 0x8016, 0x801D, 0x801E, 0x801F, 0x8020, 0x8024, 0x8026, 0x802C, 0x802E, 0x8030, 0x8034, 0x8035, 0x8037, 0x8039, 0x803A, 0x803C, 0x803E, 0x8040, 0x8044, 0x8060, 0x8064, 0x8066, 0x806D, 0x8071, 0x8075, 0x8081, 0x8088, 0x808E, 0x809C, 0x809E, 0x80A6, 0x80A7, 0x80AB, 0x80B8, 0x80B9, 0x80C8, 0x80CD, 0x80CF, 0x80D2, 0x80D4, 0x80D5, 0x80D7, 0x80D8, 0x80E0, 0x80ED, 0x80EE}, {0x80F0, 0x80F2, 0x80F3, 0x80F6, 0x80F9, 0x80FA, 0x80FE, 0x8103, 0x810B, 0x8116, 0x8117, 0x8118, 0x811C, 0x811E, 0x8120, 0x8124, 0x8127, 0x812C, 0x8130, 0x8135, 0x813A, 0x813C, 0x8145, 0x8147, 0x814A, 0x814C, 0x8152, 0x8157, 0x8160, 0x8161, 0x8167, 0x8168, 0x8169, 0x816D, 0x816F, 0x8177, 0x8181, 0x8190, 0x8184, 0x8185, 0x8186, 0x818B, 0x818E, 0x8196, 0x8198, 0x819B, 0x819E, 0x81A2, 0x81AE, 0x81B2, 0x81B4, 0x81BB, 0x81CB, 0x81C3, 0x81C5, 0x81CA, 0x81CE, 0x81CF, 0x81D5, 0x81D7, 0x81DB, 0x81DD, 0x81DE, 0x81E1, 0x81E4, 0x81EB, 0x81EC, 0x81F0, 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F8, 0x81F9, 0x81FD, 0x81FF, 0x8200, 0x8203, 0x820F, 0x8213, 0x8214, 0x8219, 0x821A, 0x821D, 0x8221, 0x8222, 0x8228, 0x8232, 0x8234, 0x823A, 0x8243, 0x8244, 0x8245, 0x8246}, {0x824B, 0x824E, 0x824F, 0x8251, 0x8256, 0x825C, 0x8260, 0x8263, 0x8267, 0x826D, 0x8274, 0x827B, 0x827D, 0x827F, 0x8280, 0x8281, 0x8283, 0x8284, 0x8287, 0x8289, 0x828A, 0x828E, 0x8291, 0x8294, 0x8296, 0x8298, 0x829A, 0x829B, 0x82A0, 0x82A1, 0x82A3, 0x82A4, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AE, 0x82B0, 0x82B2, 0x82B4, 0x82B7, 0x82BA, 0x82BC, 0x82BE, 0x82BF, 0x82C6, 0x82D0, 0x82D5, 0x82DA, 0x82E0, 0x82E2, 0x82E4, 0x82E8, 0x82EA, 0x82ED, 0x82EF, 0x82F6, 0x82F7, 0x82FD, 0x82FE, 0x8300, 0x8301, 0x8307, 0x8308, 0x830A, 0x830B, 0x8354, 0x831B, 0x831D, 0x831E, 0x831F, 0x8321, 0x8322, 0x832C, 0x832D, 0x832E, 0x8330, 0x8333, 0x8337, 0x833A, 0x833C, 0x833D, 0x8342, 0x8343, 0x8344, 0x8347, 0x834D, 0x834E, 0x8351, 0x8355, 0x8356, 0x8357, 0x8370, 0x8378}, {0x837D, 0x837F, 0x8380, 0x8382, 0x8384, 0x8386, 0x838D, 0x8392, 0x8394, 0x8395, 0x8398, 0x8399, 0x839B, 0x839C, 0x839D, 0x83A6, 0x83A7, 0x83A9, 0x83AC, 0x83BE, 0x83BF, 0x83C0, 0x83C7, 0x83C9, 0x83CF, 0x83D0, 0x83D1, 0x83D4, 0x83DD, 0x8353, 0x83E8, 0x83EA, 0x83F6, 0x83F8, 0x83F9, 0x83FC, 0x8401, 0x8406, 0x840A, 0x840F, 0x8411, 0x8415, 0x8419, 0x83AD, 0x842F, 0x8439, 0x8445, 0x8447, 0x8448, 0x844A, 0x844D, 0x844F, 0x8451, 0x8452, 0x8456, 0x8458, 0x8459, 0x845A, 0x845C, 0x8460, 0x8464, 0x8465, 0x8467, 0x846A, 0x8470, 0x8473, 0x8474, 0x8476, 0x8478, 0x847C, 0x847D, 0x8481, 0x8485, 0x8492, 0x8493, 0x8495, 0x849E, 0x84A6, 0x84A8, 0x84A9, 0x84AA, 0x84AF, 0x84B1, 0x84B4, 0x84BA, 0x84BD, 0x84BE, 0x84C0, 0x84C2, 0x84C7, 0x84C8, 0x84CC, 0x84CF, 0x84D3}, {0x84DC, 0x84E7, 0x84EA, 0x84EF, 0x84F0, 0x84F1, 0x84F2, 0x84F7, 0x8532, 0x84FA, 0x84FB, 0x84FD, 0x8502, 0x8503, 0x8507, 0x850C, 0x850E, 0x8510, 0x851C, 0x851E, 0x8522, 0x8523, 0x8524, 0x8525, 0x8527, 0x852A, 0x852B, 0x852F, 0x8533, 0x8534, 0x8536, 0x853F, 0x8546, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8556, 0x8559, 0x855C, 0x855D, 0x855E, 0x855F, 0x8560, 0x8561, 0x8562, 0x8564, 0x856B, 0x856F, 0x8579, 0x857A, 0x857B, 0x857D, 0x857F, 0x8581, 0x8585, 0x8586, 0x8589, 0x858B, 0x858C, 0x858F, 0x8593, 0x8598, 0x859D, 0x859F, 0x85A0, 0x85A2, 0x85A5, 0x85A7, 0x85B4, 0x85B6, 0x85B7, 0x85B8, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C2, 0x85C7, 0x85CA, 0x85CB, 0x85CE, 0x85AD, 0x85D8, 0x85DA, 0x85DF, 0x85E0, 0x85E6, 0x85E8, 0x85ED, 0x85F3, 0x85F6, 0x85FC}, {0x85FF, 0x8600, 0x8604, 0x8605, 0x860D, 0x860E, 0x8610, 0x8611, 0x8612, 0x8618, 0x8619, 0x861B, 0x861E, 0x8621, 0x8627, 0x8629, 0x8636, 0x8638, 0x863A, 0x863C, 0x863D, 0x8640, 0x8642, 0x8646, 0x8652, 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865D, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8669, 0x866C, 0x866F, 0x8675, 0x8676, 0x8677, 0x867A, 0x868D, 0x8691, 0x8696, 0x8698, 0x869A, 0x869C, 0x86A1, 0x86A6, 0x86A7, 0x86A8, 0x86AD, 0x86B1, 0x86B3, 0x86B4, 0x86B5, 0x86B7, 0x86B8, 0x86B9, 0x86BF, 0x86C0, 0x86C1, 0x86C3, 0x86C5, 0x86D1, 0x86D2, 0x86D5, 0x86D7, 0x86DA, 0x86DC, 0x86E0, 0x86E3, 0x86E5, 0x86E7, 0x8688, 0x86FA, 0x86FC, 0x86FD, 0x8704, 0x8705, 0x8707, 0x870B, 0x870E, 0x870F, 0x8710, 0x8713, 0x8714, 0x8719, 0x871E, 0x871F, 0x8721, 0x8723}, {0x8728, 0x872E, 0x872F, 0x8731, 0x8732, 0x8739, 0x873A, 0x873C, 0x873D, 0x873E, 0x8740, 0x8743, 0x8745, 0x874D, 0x8758, 0x875D, 0x8761, 0x8764, 0x8765, 0x876F, 0x8771, 0x8772, 0x877B, 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878B, 0x878C, 0x8790, 0x8793, 0x8795, 0x8797, 0x8798, 0x8799, 0x879E, 0x87A0, 0x87A3, 0x87A7, 0x87AC, 0x87AD, 0x87AE, 0x87B1, 0x87B5, 0x87BE, 0x87BF, 0x87C1, 0x87C8, 0x87C9, 0x87CA, 0x87CE, 0x87D5, 0x87D6, 0x87D9, 0x87DA, 0x87DC, 0x87DF, 0x87E2, 0x87E3, 0x87E4, 0x87EA, 0x87EB, 0x87ED, 0x87F1, 0x87F3, 0x87F8, 0x87FA, 0x87FF, 0x8801, 0x8803, 0x8806, 0x8809, 0x880A, 0x880B, 0x8810, 0x8819, 0x8812, 0x8813, 0x8814, 0x8818, 0x881A, 0x881B, 0x881C, 0x881E, 0x881F, 0x8828, 0x882D, 0x882E, 0x8830, 0x8832, 0x8835}, {0x883A, 0x883C, 0x8841, 0x8843, 0x8845, 0x8848, 0x8849, 0x884A, 0x884B, 0x884E, 0x8851, 0x8855, 0x8856, 0x8858, 0x885A, 0x885C, 0x885F, 0x8860, 0x8864, 0x8869, 0x8871, 0x8879, 0x887B, 0x8880, 0x8898, 0x889A, 0x889B, 0x889C, 0x889F, 0x88A0, 0x88A8, 0x88AA, 0x88BA, 0x88BD, 0x88BE, 0x88C0, 0x88CA, 0x88CB, 0x88CC, 0x88CD, 0x88CE, 0x88D1, 0x88D2, 0x88D3, 0x88DB, 0x88DE, 0x88E7, 0x88EF, 0x88F0, 0x88F1, 0x88F5, 0x88F7, 0x8901, 0x8906, 0x890D, 0x890E, 0x890F, 0x8915, 0x8916, 0x8918, 0x8919, 0x891A, 0x891C, 0x8920, 0x8926, 0x8927, 0x8928, 0x8930, 0x8931, 0x8932, 0x8935, 0x8939, 0x893A, 0x893E, 0x8940, 0x8942, 0x8945, 0x8946, 0x8949, 0x894F, 0x8952, 0x8957, 0x895A, 0x895B, 0x895C, 0x8961, 0x8962, 0x8963, 0x896B, 0x896E, 0x8970, 0x8973, 0x8975, 0x897A}, {0x897B, 0x897C, 0x897D, 0x8989, 0x898D, 0x8990, 0x8994, 0x8995, 0x899B, 0x899C, 0x899F, 0x89A0, 0x89A5, 0x89B0, 0x89B4, 0x89B5, 0x89B6, 0x89B7, 0x89BC, 0x89D4, 0x89D5, 0x89D6, 0x89D7, 0x89D8, 0x89E5, 0x89E9, 0x89EB, 0x89ED, 0x89F1, 0x89F3, 0x89F6, 0x89F9, 0x89FD, 0x89FF, 0x8A04, 0x8A05, 0x8A07, 0x8A0F, 0x8A11, 0x8A12, 0x8A14, 0x8A15, 0x8A1E, 0x8A20, 0x8A22, 0x8A24, 0x8A26, 0x8A2B, 0x8A2C, 0x8A2F, 0x8A35, 0x8A37, 0x8A3D, 0x8A3E, 0x8A40, 0x8A43, 0x8A45, 0x8A47, 0x8A49, 0x8A4D, 0x8A4E, 0x8A53, 0x8A56, 0x8A57, 0x8A58, 0x8A5C, 0x8A5D, 0x8A61, 0x8A65, 0x8A67, 0x8A75, 0x8A76, 0x8A77, 0x8A79, 0x8A7A, 0x8A7B, 0x8A7E, 0x8A7F, 0x8A80, 0x8A83, 0x8A86, 0x8A8B, 0x8A8F, 0x8A90, 0x8A92, 0x8A96, 0x8A97, 0x8A99, 0x8A9F, 0x8AA7, 0x8AA9, 0x8AAE, 0x8AAF, 0x8AB3}, {0x8AB6, 0x8AB7, 0x8ABB, 0x8ABE, 0x8AC3, 0x8AC6, 0x8AC8, 0x8AC9, 0x8ACA, 0x8AD1, 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD7, 0x8ADD, 0x8ADF, 0x8AEC, 0x8AF0, 0x8AF4, 0x8AF5, 0x8AF6, 0x8AFC, 0x8AFF, 0x8B05, 0x8B06, 0x8B0B, 0x8B11, 0x8B1C, 0x8B1E, 0x8B1F, 0x8B0A, 0x8B2D, 0x8B30, 0x8B37, 0x8B3C, 0x8B42, 0x8B43, 0x8B44, 0x8B45, 0x8B46, 0x8B48, 0x8B52, 0x8B53, 0x8B54, 0x8B59, 0x8B4D, 0x8B5E, 0x8B63, 0x8B6D, 0x8B76, 0x8B78, 0x8B79, 0x8B7C, 0x8B7E, 0x8B81, 0x8B84, 0x8B85, 0x8B8B, 0x8B8D, 0x8B8F, 0x8B94, 0x8B95, 0x8B9C, 0x8B9E, 0x8B9F, 0x8C38, 0x8C39, 0x8C3D, 0x8C3E, 0x8C45, 0x8C47, 0x8C49, 0x8C4B, 0x8C4F, 0x8C51, 0x8C53, 0x8C54, 0x8C57, 0x8C58, 0x8C5B, 0x8C5D, 0x8C59, 0x8C63, 0x8C64, 0x8C66, 0x8C68, 0x8C69, 0x8C6D, 0x8C73, 0x8C75, 0x8C76, 0x8C7B, 0x8C7E, 0x8C86}, {0x8C87, 0x8C8B, 0x8C90, 0x8C92, 0x8C93, 0x8C99, 0x8C9B, 0x8C9C, 0x8CA4, 0x8CB9, 0x8CBA, 0x8CC5, 0x8CC6, 0x8CC9, 0x8CCB, 0x8CCF, 0x8CD6, 0x8CD5, 0x8CD9, 0x8CDD, 0x8CE1, 0x8CE8, 0x8CEC, 0x8CEF, 0x8CF0, 0x8CF2, 0x8CF5, 0x8CF7, 0x8CF8, 0x8CFE, 0x8CFF, 0x8D01, 0x8D03, 0x8D09, 0x8D12, 0x8D17, 0x8D1B, 0x8D65, 0x8D69, 0x8D6C, 0x8D6E, 0x8D7F, 0x8D82, 0x8D84, 0x8D88, 0x8D8D, 0x8D90, 0x8D91, 0x8D95, 0x8D9E, 0x8D9F, 0x8DA0, 0x8DA6, 0x8DAB, 0x8DAC, 0x8DAF, 0x8DB2, 0x8DB5, 0x8DB7, 0x8DB9, 0x8DBB, 0x8DC0, 0x8DC5, 0x8DC6, 0x8DC7, 0x8DC8, 0x8DCA, 0x8DCE, 0x8DD1, 0x8DD4, 0x8DD5, 0x8DD7, 0x8DD9, 0x8DE4, 0x8DE5, 0x8DE7, 0x8DEC, 0x8DF0, 0x8DBC, 0x8DF1, 0x8DF2, 0x8DF4, 0x8DFD, 0x8E01, 0x8E04, 0x8E05, 0x8E06, 0x8E0B, 0x8E11, 0x8E14, 0x8E16, 0x8E20, 0x8E21, 0x8E22}, {0x8E23, 0x8E26, 0x8E27, 0x8E31, 0x8E33, 0x8E36, 0x8E37, 0x8E38, 0x8E39, 0x8E3D, 0x8E40, 0x8E41, 0x8E4B, 0x8E4D, 0x8E4E, 0x8E4F, 0x8E54, 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E61, 0x8E62, 0x8E69, 0x8E6C, 0x8E6D, 0x8E6F, 0x8E70, 0x8E71, 0x8E79, 0x8E7A, 0x8E7B, 0x8E82, 0x8E83, 0x8E89, 0x8E90, 0x8E92, 0x8E95, 0x8E9A, 0x8E9B, 0x8E9D, 0x8E9E, 0x8EA2, 0x8EA7, 0x8EA9, 0x8EAD, 0x8EAE, 0x8EB3, 0x8EB5, 0x8EBA, 0x8EBB, 0x8EC0, 0x8EC1, 0x8EC3, 0x8EC4, 0x8EC7, 0x8ECF, 0x8ED1, 0x8ED4, 0x8EDC, 0x8EE8, 0x8EEE, 0x8EF0, 0x8EF1, 0x8EF7, 0x8EF9, 0x8EFA, 0x8EED, 0x8F00, 0x8F02, 0x8F07, 0x8F08, 0x8F0F, 0x8F10, 0x8F16, 0x8F17, 0x8F18, 0x8F1E, 0x8F20, 0x8F21, 0x8F23, 0x8F25, 0x8F27, 0x8F28, 0x8F2C, 0x8F2D, 0x8F2E, 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F3A, 0x8F40, 0x8F41}, {0x8F43, 0x8F47, 0x8F4F, 0x8F51, 0x8F52, 0x8F53, 0x8F54, 0x8F55, 0x8F58, 0x8F5D, 0x8F5E, 0x8F65, 0x8F9D, 0x8FA0, 0x8FA1, 0x8FA4, 0x8FA5, 0x8FA6, 0x8FB5, 0x8FB6, 0x8FB8, 0x8FBE, 0x8FC0, 0x8FC1, 0x8FC6, 0x8FCA, 0x8FCB, 0x8FCD, 0x8FD0, 0x8FD2, 0x8FD3, 0x8FD5, 0x8FE0, 0x8FE3, 0x8FE4, 0x8FE8, 0x8FEE, 0x8FF1, 0x8FF5, 0x8FF6, 0x8FFB, 0x8FFE, 0x9002, 0x9004, 0x9008, 0x900C, 0x9018, 0x901B, 0x9028, 0x9029, 0x902F, 0x902A, 0x902C, 0x902D, 0x9033, 0x9034, 0x9037, 0x903F, 0x9043, 0x9044, 0x904C, 0x905B, 0x905D, 0x9062, 0x9066, 0x9067, 0x906C, 0x9070, 0x9074, 0x9079, 0x9085, 0x9088, 0x908B, 0x908C, 0x908E, 0x9090, 0x9095, 0x9097, 0x9098, 0x9099, 0x909B, 0x90A0, 0x90A1, 0x90A2, 0x90A5, 0x90B0, 0x90B2, 0x90B3, 0x90B4, 0x90B6, 0x90BD, 0x90CC, 0x90BE, 0x90C3}, {0x90C4, 0x90C5, 0x90C7, 0x90C8, 0x90D5, 0x90D7, 0x90D8, 0x90D9, 0x90DC, 0x90DD, 0x90DF, 0x90E5, 0x90D2, 0x90F6, 0x90EB, 0x90EF, 0x90F0, 0x90F4, 0x90FE, 0x90FF, 0x9100, 0x9104, 0x9105, 0x9106, 0x9108, 0x910D, 0x9110, 0x9114, 0x9116, 0x9117, 0x9118, 0x911A, 0x911C, 0x911E, 0x9120, 0x9125, 0x9122, 0x9123, 0x9127, 0x9129, 0x912E, 0x912F, 0x9131, 0x9134, 0x9136, 0x9137, 0x9139, 0x913A, 0x913C, 0x913D, 0x9143, 0x9147, 0x9148, 0x914F, 0x9153, 0x9157, 0x9159, 0x915A, 0x915B, 0x9161, 0x9164, 0x9167, 0x916D, 0x9174, 0x9179, 0x917A, 0x917B, 0x9181, 0x9183, 0x9185, 0x9186, 0x918A, 0x918E, 0x9191, 0x9193, 0x9194, 0x9195, 0x9198, 0x919E, 0x91A1, 0x91A6, 0x91A8, 0x91AC, 0x91AD, 0x91AE, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B6, 0x91BB, 0x91BC, 0x91BD, 0x91BF}, {0x91C2, 0x91C3, 0x91C5, 0x91D3, 0x91D4, 0x91D7, 0x91D9, 0x91DA, 0x91DE, 0x91E4, 0x91E5, 0x91E9, 0x91EA, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F7, 0x91F9, 0x91FB, 0x91FD, 0x9200, 0x9201, 0x9204, 0x9205, 0x9206, 0x9207, 0x9209, 0x920A, 0x920C, 0x9210, 0x9212, 0x9213, 0x9216, 0x9218, 0x921C, 0x921D, 0x9223, 0x9224, 0x9225, 0x9226, 0x9228, 0x922E, 0x922F, 0x9230, 0x9233, 0x9235, 0x9236, 0x9238, 0x9239, 0x923A, 0x923C, 0x923E, 0x9240, 0x9242, 0x9243, 0x9246, 0x9247, 0x924A, 0x924D, 0x924E, 0x924F, 0x9251, 0x9258, 0x9259, 0x925C, 0x925D, 0x9260, 0x9261, 0x9265, 0x9267, 0x9268, 0x9269, 0x926E, 0x926F, 0x9270, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927B, 0x927C, 0x927D, 0x927F, 0x9288, 0x9289, 0x928A, 0x928D, 0x928E, 0x9292, 0x9297}, {0x9299, 0x929F, 0x92A0, 0x92A4, 0x92A5, 0x92A7, 0x92A8, 0x92AB, 0x92AF, 0x92B2, 0x92B6, 0x92B8, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92D0, 0x92D3, 0x92D5, 0x92D7, 0x92D8, 0x92D9, 0x92DC, 0x92DD, 0x92DF, 0x92E0, 0x92E1, 0x92E3, 0x92E5, 0x92E7, 0x92E8, 0x92EC, 0x92EE, 0x92F0, 0x92F9, 0x92FB, 0x92FF, 0x9300, 0x9302, 0x9308, 0x930D, 0x9311, 0x9314, 0x9315, 0x931C, 0x931D, 0x931E, 0x931F, 0x9321, 0x9324, 0x9325, 0x9327, 0x9329, 0x932A, 0x9333, 0x9334, 0x9336, 0x9337, 0x9347, 0x9348, 0x9349, 0x9350, 0x9351, 0x9352, 0x9355, 0x9357, 0x9358, 0x935A, 0x935E, 0x9364, 0x9365, 0x9367, 0x9369, 0x936A, 0x936D, 0x936F, 0x9370, 0x9371, 0x9373, 0x9374, 0x9376}, {0x937A, 0x937D, 0x937F, 0x9380, 0x9381, 0x9382, 0x9388, 0x938A, 0x938B, 0x938D, 0x938F, 0x9392, 0x9395, 0x9398, 0x939B, 0x939E, 0x93A1, 0x93A3, 0x93A4, 0x93A6, 0x93A8, 0x93AB, 0x93B4, 0x93B5, 0x93B6, 0x93BA, 0x93A9, 0x93C1, 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C9, 0x93CA, 0x93CB, 0x93CC, 0x93CD, 0x93D3, 0x93D9, 0x93DC, 0x93DE, 0x93DF, 0x93E2, 0x93E6, 0x93E7, 0x93F9, 0x93F7, 0x93F8, 0x93FA, 0x93FB, 0x93FD, 0x9401, 0x9402, 0x9404, 0x9408, 0x9409, 0x940D, 0x940E, 0x940F, 0x9415, 0x9416, 0x9417, 0x941F, 0x942E, 0x942F, 0x9431, 0x9432, 0x9433, 0x9434, 0x943B, 0x943F, 0x943D, 0x9443, 0x9445, 0x9448, 0x944A, 0x944C, 0x9455, 0x9459, 0x945C, 0x945F, 0x9461, 0x9463, 0x9468, 0x946B, 0x946D, 0x946E, 0x946F, 0x9471, 0x9472, 0x9484, 0x9483, 0x9578, 0x9579}, {0x957E, 0x9584, 0x9588, 0x958C, 0x958D, 0x958E, 0x959D, 0x959E, 0x959F, 0x95A1, 0x95A6, 0x95A9, 0x95AB, 0x95AC, 0x95B4, 0x95B6, 0x95BA, 0x95BD, 0x95BF, 0x95C6, 0x95C8, 0x95C9, 0x95CB, 0x95D0, 0x95D1, 0x95D2, 0x95D3, 0x95D9, 0x95DA, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E4, 0x95E6, 0x961D, 0x961E, 0x9622, 0x9624, 0x9625, 0x9626, 0x962C, 0x9631, 0x9633, 0x9637, 0x9638, 0x9639, 0x963A, 0x963C, 0x963D, 0x9641, 0x9652, 0x9654, 0x9656, 0x9657, 0x9658, 0x9661, 0x966E, 0x9674, 0x967B, 0x967C, 0x967E, 0x967F, 0x9681, 0x9682, 0x9683, 0x9684, 0x9689, 0x9691, 0x9696, 0x969A, 0x969D, 0x969F, 0x96A4, 0x96A5, 0x96A6, 0x96A9, 0x96AE, 0x96AF, 0x96B3, 0x96BA, 0x96CA, 0x96D2, 0x5DB2, 0x96D8, 0x96DA, 0x96DD, 0x96DE, 0x96DF, 0x96E9, 0x96EF, 0x96F1, 0x96FA, 0x9702}, {0x9703, 0x9705, 0x9709, 0x971A, 0x971B, 0x971D, 0x9721, 0x9722, 0x9723, 0x9728, 0x9731, 0x9733, 0x9741, 0x9743, 0x974A, 0x974E, 0x974F, 0x9755, 0x9757, 0x9758, 0x975A, 0x975B, 0x9763, 0x9767, 0x976A, 0x976E, 0x9773, 0x9776, 0x9777, 0x9778, 0x977B, 0x977D, 0x977F, 0x9780, 0x9789, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979E, 0x979F, 0x97A2, 0x97AC, 0x97AE, 0x97B1, 0x97B2, 0x97B5, 0x97B6, 0x97B8, 0x97B9, 0x97BA, 0x97BC, 0x97BE, 0x97BF, 0x97C1, 0x97C4, 0x97C5, 0x97C7, 0x97C9, 0x97CA, 0x97CC, 0x97CD, 0x97CE, 0x97D0, 0x97D1, 0x97D4, 0x97D7, 0x97D8, 0x97D9, 0x97DD, 0x97DE, 0x97E0, 0x97DB, 0x97E1, 0x97E4, 0x97EF, 0x97F1, 0x97F4, 0x97F7, 0x97F8, 0x97FA, 0x9807, 0x980A, 0x9819, 0x980D, 0x980E, 0x9814, 0x9816, 0x981C, 0x981E, 0x9820, 0x9823, 0x9826}, {0x982B, 0x982E, 0x982F, 0x9830, 0x9832, 0x9833, 0x9835, 0x9825, 0x983E, 0x9844, 0x9847, 0x984A, 0x9851, 0x9852, 0x9853, 0x9856, 0x9857, 0x9859, 0x985A, 0x9862, 0x9863, 0x9865, 0x9866, 0x986A, 0x986C, 0x98AB, 0x98AD, 0x98AE, 0x98B0, 0x98B4, 0x98B7, 0x98B8, 0x98BA, 0x98BB, 0x98BF, 0x98C2, 0x98C5, 0x98C8, 0x98CC, 0x98E1, 0x98E3, 0x98E5, 0x98E6, 0x98E7, 0x98EA, 0x98F3, 0x98F6, 0x9902, 0x9907, 0x9908, 0x9911, 0x9915, 0x9916, 0x9917, 0x991A, 0x991B, 0x991C, 0x991F, 0x9922, 0x9926, 0x9927, 0x992B, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9939, 0x993A, 0x993B, 0x993C, 0x9940, 0x9941, 0x9946, 0x9947, 0x9948, 0x994D, 0x994E, 0x9954, 0x9958, 0x9959, 0x995B, 0x995C, 0x995E, 0x995F, 0x9960, 0x999B, 0x999D, 0x999F, 0x99A6, 0x99B0, 0x99B1, 0x99B2, 0x99B5}, {0x99B9, 0x99BA, 0x99BD, 0x99BF, 0x99C3, 0x99C9, 0x99D3, 0x99D4, 0x99D9, 0x99DA, 0x99DC, 0x99DE, 0x99E7, 0x99EA, 0x99EB, 0x99EC, 0x99F0, 0x99F4, 0x99F5, 0x99F9, 0x99FD, 0x99FE, 0x9A02, 0x9A03, 0x9A04, 0x9A0B, 0x9A0C, 0x9A10, 0x9A11, 0x9A16, 0x9A1E, 0x9A20, 0x9A22, 0x9A23, 0x9A24, 0x9A27, 0x9A2D, 0x9A2E, 0x9A33, 0x9A35, 0x9A36, 0x9A38, 0x9A47, 0x9A41, 0x9A44, 0x9A4A, 0x9A4B, 0x9A4C, 0x9A4E, 0x9A51, 0x9A54, 0x9A56, 0x9A5D, 0x9AAA, 0x9AAC, 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB4, 0x9AB5, 0x9AB6, 0x9AB9, 0x9ABB, 0x9ABE, 0x9ABF, 0x9AC1, 0x9AC3, 0x9AC6, 0x9AC8, 0x9ACE, 0x9AD0, 0x9AD2, 0x9AD5, 0x9AD6, 0x9AD7, 0x9ADB, 0x9ADC, 0x9AE0, 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE9, 0x9AEC, 0x9AF2, 0x9AF3, 0x9AF5, 0x9AF9, 0x9AFA, 0x9AFD, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B03}, {0x9B04, 0x9B05, 0x9B08, 0x9B09, 0x9B0B, 0x9B0C, 0x9B0D, 0x9B0E, 0x9B10, 0x9B12, 0x9B16, 0x9B19, 0x9B1B, 0x9B1C, 0x9B20, 0x9B26, 0x9B2B, 0x9B2D, 0x9B33, 0x9B34, 0x9B35, 0x9B37, 0x9B39, 0x9B3A, 0x9B3D, 0x9B48, 0x9B4B, 0x9B4C, 0x9B55, 0x9B56, 0x9B57, 0x9B5B, 0x9B5E, 0x9B61, 0x9B63, 0x9B65, 0x9B66, 0x9B68, 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B73, 0x9B75, 0x9B77, 0x9B78, 0x9B79, 0x9B7F, 0x9B80, 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B89, 0x9B8A, 0x9B8B, 0x9B8D, 0x9B8F, 0x9B90, 0x9B94, 0x9B9A, 0x9B9D, 0x9B9E, 0x9BA6, 0x9BA7, 0x9BA9, 0x9BAC, 0x9BB0, 0x9BB1, 0x9BB2, 0x9BB7, 0x9BB8, 0x9BBB, 0x9BBC, 0x9BBE, 0x9BBF, 0x9BC1, 0x9BC7, 0x9BC8, 0x9BCE, 0x9BD0, 0x9BD7, 0x9BD8, 0x9BDD, 0x9BDF, 0x9BE5, 0x9BE7, 0x9BEA, 0x9BEB, 0x9BEF, 0x9BF3, 0x9BF7, 0x9BF8}, {0x9BF9, 0x9BFA, 0x9BFD, 0x9BFF, 0x9C00, 0x9C02, 0x9C0B, 0x9C0F, 0x9C11, 0x9C16, 0x9C18, 0x9C19, 0x9C1A, 0x9C1C, 0x9C1E, 0x9C22, 0x9C23, 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, 0x9C31, 0x9C35, 0x9C36, 0x9C37, 0x9C3D, 0x9C41, 0x9C43, 0x9C44, 0x9C45, 0x9C49, 0x9C4A, 0x9C4E, 0x9C4F, 0x9C50, 0x9C53, 0x9C54, 0x9C56, 0x9C58, 0x9C5B, 0x9C5D, 0x9C5E, 0x9C5F, 0x9C63, 0x9C69, 0x9C6A, 0x9C5C, 0x9C6B, 0x9C68, 0x9C6E, 0x9C70, 0x9C72, 0x9C75, 0x9C77, 0x9C7B, 0x9CE6, 0x9CF2, 0x9CF7, 0x9CF9, 0x9D0B, 0x9D02, 0x9D11, 0x9D17, 0x9D18, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D2F, 0x9D30, 0x9D32, 0x9D33, 0x9D34, 0x9D3A, 0x9D3C, 0x9D45, 0x9D3D, 0x9D42, 0x9D43, 0x9D47, 0x9D4A, 0x9D53, 0x9D54, 0x9D5F, 0x9D63, 0x9D62, 0x9D65, 0x9D69, 0x9D6A, 0x9D6B, 0x9D70, 0x9D76, 0x9D77, 0x9D7B}, {0x9D7C, 0x9D7E, 0x9D83, 0x9D84, 0x9D86, 0x9D8A, 0x9D8D, 0x9D8E, 0x9D92, 0x9D93, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9DA1, 0x9DAA, 0x9DAC, 0x9DAE, 0x9DB1, 0x9DB5, 0x9DB9, 0x9DBC, 0x9DBF, 0x9DC3, 0x9DC7, 0x9DC9, 0x9DCA, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7, 0x9DDA, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE5, 0x9DE7, 0x9DE9, 0x9DEB, 0x9DEE, 0x9DF0, 0x9DF3, 0x9DF4, 0x9DFE, 0x9E0A, 0x9E02, 0x9E07, 0x9E0E, 0x9E10, 0x9E11, 0x9E12, 0x9E15, 0x9E16, 0x9E19, 0x9E1C, 0x9E1D, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E80, 0x9E82, 0x9E83, 0x9E84, 0x9E85, 0x9E87, 0x9E8E, 0x9E8F, 0x9E96, 0x9E98, 0x9E9B, 0x9E9E, 0x9EA4, 0x9EA8, 0x9EAC, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB3, 0x9EB4, 0x9EB5, 0x9EC6, 0x9EC8, 0x9ECB, 0x9ED5, 0x9EDF, 0x9EE4, 0x9EE7, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF2, 0x9EF5}, {0x9EF8, 0x9EFF, 0x9F02, 0x9F03, 0x9F09, 0x9F0F, 0x9F10, 0x9F11, 0x9F12, 0x9F14, 0x9F16, 0x9F17, 0x9F19, 0x9F1A, 0x9F1B, 0x9F1F, 0x9F22, 0x9F26, 0x9F2A, 0x9F2B, 0x9F2F, 0x9F31, 0x9F32, 0x9F34, 0x9F37, 0x9F39, 0x9F3A, 0x9F3C, 0x9F3D, 0x9F3F, 0x9F41, 0x9F43, 0x9F44, 0x9F45, 0x9F46, 0x9F47, 0x9F53, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F5A, 0x9F5D, 0x9F5E, 0x9F68, 0x9F69, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F73, 0x9F75, 0x9F7A, 0x9F7D, 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F94, 0x9F96, 0x9F97, 0x9F9E, 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, }; /* * Mapping from Unicode back to JIS X 0212. * * This inverse is done the same way the SBCS ones are done: I * provide a list of JIS X 0212 positions, sorted into ascending * order of their Unicode values. Then we can binary-search through * this list, referring to the above table for each comparison, to * find the coordinates for a given code point. * * Generated by running the following sh+Perl over JIS0212.TXT: cat JIS0212.TXT | \ perl -ne '$a{$3}=[hex$1,hex$2] if /^0x(\S\S)(\S\S)\s+(0x\S+)\s/;' \ -e 'END {$o=" ";for $k (sort keys %a) { ($r,$c) = @{$a{$k}}; ' \ -e '$o .= $C; $C = ", "; (print "$o\n"), $o=" " if length $o > 70;' \ -e '$o .= sprintf "{%d,%d}", $r-33,$c-33; } print "$o\n"; }' */ static const struct { unsigned char r, c; } jisx0212_backward[] = { {1,22}, {1,33}, {1,79}, {1,34}, {1,76}, {1,75}, {1,77}, {1,19}, {1,16}, {1,74}, {1,35}, {9,1}, {9,0}, {9,3}, {9,9}, {9,2}, {9,8}, {8,0}, {9,13}, {9,17}, {9,16}, {9,19}, {9,18}, {9,31}, {9,30}, {9,33}, {9,32}, {9,47}, {9,49}, {9,48}, {9,51}, {9,55}, {9,50}, {8,11}, {9,66}, {9,65}, {9,68}, {9,67}, {9,81}, {8,15}, {8,45}, {10,1}, {10,0}, {10,3}, {10,9}, {10,2}, {10,8}, {8,32}, {10,13}, {10,17}, {10,16}, {10,19}, {10,18}, {10,31}, {10,30}, {10,33}, {10,32}, {8,34}, {10,47}, {10,49}, {10,48}, {10,51}, {10,55}, {10,50}, {8,43}, {10,66}, {10,65}, {10,68}, {10,67}, {10,81}, {8,47}, {10,82}, {9,6}, {10,6}, {9,4}, {10,4}, {9,7}, {10,7}, {9,10}, {10,10}, {9,11}, {10,11}, {9,14}, {10,14}, {9,12}, {10,12}, {9,15}, {10,15}, {8,1}, {8,33}, {9,22}, {10,22}, {9,21}, {10,21}, {9,23}, {10,23}, {9,20}, {10,20}, {9,25}, {10,25}, {9,26}, {10,26}, {9,28}, {10,28}, {9,27}, {9,29}, {10,29}, {8,3}, {8,35}, {9,38}, {10,38}, {9,36}, {10,36}, {9,37}, {10,37}, {9,35}, {8,36}, {8,5}, {8,37}, {9,39}, {10,39}, {9,40}, {10,40}, {8,38}, {9,41}, {10,41}, {9,43}, {10,43}, {9,42}, {10,42}, {8,8}, {8,40}, {8,7}, {8,39}, {9,44}, {10,44}, {9,46}, {10,46}, {9,45}, {10,45}, {8,41}, {8,10}, {8,42}, {9,54}, {10,54}, {9,53}, {10,53}, {8,12}, {8,44}, {9,56}, {10,56}, {9,58}, {10,58}, {9,57}, {10,57}, {9,59}, {10,59}, {9,60}, {10,60}, {9,62}, {10,62}, {9,61}, {10,61}, {9,64}, {10,64}, {9,63}, {10,63}, {8,14}, {8,46}, {9,75}, {10,75}, {9,72}, {10,72}, {9,69}, {10,69}, {9,74}, {10,74}, {9,71}, {10,71}, {9,73}, {10,73}, {9,80}, {10,80}, {9,83}, {10,83}, {9,82}, {9,84}, {10,84}, {9,86}, {10,86}, {9,85}, {10,85}, {9,5}, {10,5}, {9,34}, {10,34}, {9,52}, {10,52}, {9,70}, {10,70}, {9,79}, {10,79}, {9,76}, {10,76}, {9,78}, {10,78}, {9,77}, {10,77}, {10,24}, {1,15}, {1,14}, {1,17}, {1,21}, {1,20}, {1,18}, {1,23}, {1,24}, {5,64}, {5,65}, {5,66}, {5,67}, {5,70}, {5,72}, {5,75}, {5,85}, {5,68}, {5,73}, {5,80}, {5,81}, {5,82}, {5,83}, {5,90}, {5,87}, {5,84}, {5,89}, {5,86}, {5,88}, {5,91}, {6,33}, {6,34}, {6,35}, {6,36}, {6,37}, {6,38}, {6,39}, {6,40}, {6,41}, {6,42}, {6,43}, {6,44}, {6,45}, {6,81}, {6,82}, {6,83}, {6,84}, {6,85}, {6,86}, {6,87}, {6,88}, {6,89}, {6,90}, {6,91}, {6,92}, {6,93}, {1,80}, {1,78}, {15,0}, {15,1}, {15,2}, {15,3}, {15,4}, {15,5}, {15,6}, {15,7}, {15,8}, {15,9}, {15,10}, {15,11}, {15,12}, {15,13}, {15,14}, {15,15}, {15,16}, {15,17}, {15,18}, {15,19}, {15,20}, {15,21}, {15,22}, {15,23}, {15,24}, {15,25}, {15,26}, {15,27}, {15,28}, {15,29}, {15,30}, {15,31}, {15,32}, {15,33}, {15,34}, {15,35}, {15,36}, {15,37}, {15,38}, {15,39}, {15,40}, {15,41}, {15,42}, {15,43}, {15,44}, {15,45}, {15,46}, {15,47}, {15,48}, {15,49}, {15,50}, {15,51}, {15,52}, {15,53}, {15,54}, {15,55}, {15,56}, {15,57}, {15,58}, {15,59}, {15,60}, {15,61}, {15,63}, {15,64}, {15,65}, {15,66}, {15,67}, {15,68}, {15,69}, {15,70}, {15,71}, {15,72}, {15,73}, {15,74}, {15,75}, {15,76}, {15,77}, {15,78}, {15,79}, {15,62}, {15,80}, {15,81}, {15,82}, {15,83}, {15,84}, {15,85}, {15,86}, {15,87}, {15,88}, {15,89}, {15,90}, {15,91}, {15,92}, {15,93}, {16,0}, {16,1}, {16,2}, {16,3}, {16,4}, {16,5}, {16,6}, {16,7}, {16,8}, {16,9}, {16,10}, {16,11}, {16,12}, {16,13}, {16,14}, {16,15}, {16,16}, {16,17}, {16,18}, {16,19}, {16,20}, {16,21}, {16,22}, {16,23}, {16,24}, {16,25}, {16,26}, {16,27}, {16,28}, {16,29}, {16,30}, {16,31}, {16,32}, {16,33}, {16,34}, {16,35}, {16,36}, {16,37}, {16,38}, {16,39}, {16,40}, {16,41}, {16,42}, {16,43}, {16,44}, {16,45}, {16,46}, {16,47}, {16,48}, {16,49}, {16,50}, {16,51}, {16,52}, {16,53}, {16,54}, {16,55}, {16,56}, {16,57}, {16,58}, {16,59}, {16,60}, {16,61}, {16,85}, {16,62}, {16,63}, {16,64}, {16,65}, {16,66}, {16,67}, {16,68}, {16,69}, {16,70}, {16,71}, {16,72}, {16,73}, {16,74}, {16,75}, {16,76}, {16,77}, {16,78}, {16,79}, {16,80}, {16,81}, {16,82}, {16,83}, {16,84}, {16,86}, {16,87}, {16,88}, {16,89}, {16,90}, {16,91}, {16,92}, {16,93}, {17,0}, {17,1}, {17,2}, {17,3}, {17,4}, {17,5}, {17,6}, {17,7}, {17,8}, {17,9}, {17,10}, {17,11}, {17,12}, {17,13}, {17,14}, {17,15}, {17,16}, {17,17}, {17,18}, {17,19}, {17,20}, {17,21}, {17,22}, {17,23}, {17,24}, {17,25}, {17,26}, {17,27}, {17,28}, {17,29}, {17,30}, {17,31}, {17,32}, {17,33}, {17,34}, {17,35}, {17,36}, {17,48}, {17,37}, {17,38}, {17,39}, {17,40}, {17,41}, {17,42}, {17,43}, {17,44}, {17,45}, {17,46}, {17,47}, {17,49}, {17,50}, {17,51}, {17,52}, {17,53}, {17,54}, {17,55}, {17,56}, {17,57}, {17,58}, {17,59}, {17,60}, {17,61}, {17,62}, {17,63}, {17,64}, {17,65}, {17,66}, {17,67}, {17,68}, {17,69}, {17,70}, {17,71}, {17,72}, {17,73}, {17,74}, {17,75}, {17,76}, {17,77}, {17,78}, {17,79}, {17,80}, {17,81}, {17,82}, {17,83}, {17,84}, {17,85}, {17,86}, {17,87}, {17,88}, {17,89}, {17,90}, {17,91}, {17,92}, {17,93}, {18,0}, {18,1}, {18,2}, {18,3}, {18,4}, {18,5}, {18,6}, {18,7}, {18,8}, {18,9}, {18,10}, {18,11}, {18,12}, {18,13}, {18,14}, {18,15}, {18,16}, {18,17}, {18,18}, {18,19}, {18,20}, {18,21}, {18,22}, {18,23}, {18,24}, {18,25}, {18,26}, {18,27}, {18,28}, {18,29}, {18,30}, {18,31}, {18,32}, {18,33}, {18,34}, {18,35}, {18,36}, {18,37}, {18,38}, {18,39}, {18,40}, {18,41}, {18,42}, {18,43}, {18,44}, {18,45}, {18,46}, {18,47}, {18,48}, {18,49}, {18,50}, {18,51}, {18,52}, {18,53}, {18,54}, {18,55}, {18,56}, {18,57}, {18,58}, {18,59}, {18,60}, {18,61}, {18,62}, {18,63}, {18,64}, {18,65}, {18,66}, {18,67}, {18,68}, {18,69}, {18,70}, {18,71}, {18,72}, {18,73}, {18,74}, {18,75}, {18,76}, {18,77}, {18,78}, {18,79}, {18,80}, {18,81}, {18,82}, {18,83}, {18,84}, {18,85}, {18,86}, {18,87}, {18,88}, {18,89}, {18,90}, {18,91}, {18,92}, {18,93}, {19,0}, {19,1}, {19,2}, {19,3}, {19,4}, {19,5}, {19,6}, {19,7}, {19,8}, {19,9}, {19,10}, {19,11}, {19,12}, {19,13}, {19,14}, {19,15}, {19,16}, {19,17}, {19,18}, {19,19}, {19,20}, {19,21}, {19,23}, {19,22}, {19,24}, {19,25}, {19,26}, {19,27}, {19,28}, {19,29}, {19,30}, {19,31}, {19,32}, {19,33}, {19,34}, {19,35}, {19,36}, {19,37}, {19,38}, {19,39}, {19,40}, {19,41}, {19,42}, {19,43}, {19,44}, {19,45}, {19,46}, {19,47}, {19,48}, {19,49}, {19,50}, {19,51}, {19,52}, {19,53}, {19,54}, {19,55}, {19,56}, {19,57}, {19,58}, {19,59}, {19,60}, {19,61}, {19,62}, {19,63}, {19,64}, {19,65}, {19,66}, {19,67}, {19,68}, {19,69}, {19,70}, {19,71}, {19,72}, {19,73}, {19,74}, {19,75}, {19,76}, {19,77}, {19,78}, {19,79}, {19,80}, {19,81}, {19,82}, {19,83}, {19,84}, {19,85}, {19,86}, {19,87}, {19,88}, {19,89}, {19,90}, {19,91}, {19,92}, {19,93}, {20,0}, {20,1}, {20,2}, {20,3}, {20,4}, {20,5}, {20,6}, {20,7}, {20,8}, {20,9}, {20,10}, {20,11}, {20,12}, {20,13}, {20,14}, {20,15}, {20,16}, {20,17}, {20,18}, {20,19}, {20,20}, {20,21}, {20,22}, {20,23}, {20,24}, {20,25}, {20,26}, {20,27}, {20,28}, {20,29}, {20,30}, {20,31}, {20,32}, {20,33}, {20,34}, {20,35}, {20,36}, {20,37}, {20,38}, {20,39}, {20,40}, {20,41}, {20,42}, {20,43}, {20,44}, {20,45}, {20,46}, {20,47}, {20,48}, {20,49}, {20,50}, {20,51}, {20,52}, {20,53}, {20,54}, {20,55}, {20,56}, {20,57}, {20,58}, {20,59}, {20,60}, {20,61}, {20,62}, {20,63}, {20,64}, {20,65}, {20,66}, {20,67}, {20,68}, {20,69}, {20,70}, {20,71}, {20,72}, {20,73}, {20,74}, {20,75}, {20,76}, {20,77}, {20,78}, {20,79}, {20,80}, {20,81}, {20,82}, {20,83}, {20,84}, {20,85}, {20,86}, {20,87}, {20,88}, {20,89}, {20,90}, {20,91}, {20,92}, {20,93}, {21,0}, {21,1}, {21,2}, {21,3}, {21,4}, {21,5}, {21,6}, {21,7}, {21,8}, {21,9}, {21,10}, {21,11}, {21,12}, {21,13}, {21,14}, {21,15}, {21,16}, {21,17}, {21,18}, {21,19}, {21,20}, {21,21}, {21,22}, {21,23}, {21,24}, {21,25}, {21,26}, {21,27}, {21,28}, {21,29}, {21,30}, {21,31}, {21,32}, {21,33}, {21,34}, {21,35}, {21,36}, {21,37}, {21,38}, {21,39}, {21,40}, {21,41}, {21,42}, {21,43}, {21,44}, {21,45}, {21,46}, {21,47}, {21,48}, {21,49}, {21,50}, {21,51}, {21,52}, {21,53}, {21,54}, {21,55}, {21,56}, {21,57}, {21,58}, {21,59}, {21,60}, {21,61}, {21,62}, {21,63}, {21,64}, {21,65}, {21,66}, {21,67}, {21,68}, {21,69}, {21,70}, {21,71}, {21,72}, {21,73}, {21,74}, {21,75}, {21,76}, {21,79}, {21,80}, {21,77}, {21,78}, {21,81}, {21,82}, {21,83}, {21,84}, {21,85}, {21,86}, {21,87}, {21,88}, {21,89}, {21,90}, {21,92}, {21,93}, {21,91}, {22,0}, {22,1}, {22,2}, {22,3}, {22,4}, {22,5}, {22,6}, {22,7}, {22,8}, {22,9}, {22,10}, {22,11}, {22,12}, {22,13}, {22,14}, {22,15}, {22,16}, {22,17}, {22,18}, {22,19}, {22,20}, {22,21}, {22,22}, {22,23}, {22,24}, {22,25}, {22,26}, {22,27}, {22,28}, {22,29}, {22,30}, {22,31}, {22,32}, {22,33}, {22,34}, {22,35}, {22,36}, {22,37}, {22,38}, {22,39}, {22,40}, {22,41}, {22,42}, {22,43}, {22,44}, {22,45}, {22,46}, {22,47}, {22,48}, {22,49}, {22,50}, {22,51}, {22,52}, {22,53}, {22,54}, {22,63}, {22,55}, {22,56}, {22,57}, {22,58}, {22,59}, {22,60}, {22,61}, {22,62}, {22,64}, {22,65}, {22,66}, {22,67}, {22,68}, {22,69}, {22,70}, {22,71}, {22,72}, {22,73}, {22,74}, {22,75}, {22,76}, {22,93}, {22,77}, {22,78}, {22,79}, {22,80}, {22,81}, {22,82}, {22,83}, {22,84}, {22,85}, {22,86}, {22,87}, {22,88}, {22,89}, {22,90}, {22,91}, {22,92}, {23,0}, {23,1}, {23,2}, {23,3}, {23,4}, {23,5}, {23,6}, {23,7}, {23,8}, {23,9}, {23,10}, {23,11}, {23,12}, {23,13}, {23,14}, {23,15}, {23,16}, {23,17}, {23,18}, {23,19}, {23,20}, {23,21}, {23,22}, {23,23}, {23,24}, {23,25}, {23,26}, {23,27}, {23,28}, {23,29}, {23,30}, {23,31}, {23,32}, {23,33}, {23,34}, {23,35}, {23,36}, {23,37}, {23,38}, {23,39}, {23,40}, {23,41}, {23,42}, {23,43}, {23,44}, {23,45}, {23,47}, {23,48}, {23,46}, {23,49}, {23,50}, {23,51}, {23,52}, {23,53}, {23,54}, {23,55}, {23,56}, {23,57}, {23,58}, {23,59}, {23,60}, {23,61}, {23,62}, {23,63}, {23,64}, {23,65}, {23,66}, {23,67}, {23,68}, {23,70}, {23,71}, {23,72}, {23,73}, {23,74}, {23,75}, {23,76}, {23,77}, {23,78}, {23,79}, {23,80}, {23,81}, {23,82}, {23,83}, {23,84}, {23,85}, {23,86}, {23,87}, {23,88}, {23,89}, {23,90}, {23,91}, {23,92}, {23,93}, {24,0}, {24,1}, {24,2}, {24,3}, {24,4}, {24,5}, {24,6}, {24,7}, {24,8}, {24,9}, {24,10}, {24,11}, {24,12}, {24,13}, {24,14}, {24,15}, {24,16}, {24,17}, {24,18}, {24,19}, {24,20}, {24,21}, {24,22}, {24,23}, {24,24}, {24,25}, {24,26}, {24,27}, {24,28}, {24,29}, {24,30}, {24,31}, {24,32}, {24,33}, {24,34}, {24,35}, {24,36}, {24,37}, {24,38}, {24,39}, {24,40}, {24,41}, {24,42}, {24,43}, {24,44}, {24,45}, {24,46}, {24,47}, {24,48}, {24,49}, {24,50}, {24,51}, {24,52}, {24,53}, {24,54}, {24,55}, {24,56}, {24,57}, {24,58}, {24,59}, {24,60}, {24,61}, {24,62}, {24,63}, {24,64}, {24,65}, {24,66}, {24,67}, {24,68}, {24,69}, {24,70}, {24,71}, {24,72}, {24,73}, {24,74}, {24,75}, {24,76}, {24,77}, {24,78}, {24,79}, {24,80}, {24,81}, {24,82}, {24,83}, {24,84}, {24,85}, {24,86}, {24,87}, {24,88}, {24,89}, {24,90}, {24,91}, {24,92}, {24,93}, {25,0}, {25,1}, {25,2}, {25,3}, {25,4}, {25,5}, {25,6}, {25,7}, {25,8}, {25,9}, {25,10}, {25,11}, {25,12}, {25,13}, {25,14}, {25,15}, {25,16}, {25,18}, {25,19}, {25,20}, {25,21}, {25,22}, {25,23}, {25,17}, {25,24}, {25,25}, {25,26}, {25,27}, {25,28}, {25,29}, {25,30}, {25,31}, {25,32}, {25,33}, {25,34}, {25,35}, {25,36}, {25,37}, {25,38}, {25,39}, {25,40}, {25,41}, {25,42}, {25,43}, {25,44}, {25,45}, {25,46}, {25,47}, {25,48}, {25,49}, {25,50}, {25,51}, {25,52}, {25,53}, {25,54}, {25,55}, {25,56}, {25,57}, {25,58}, {25,59}, {25,60}, {25,61}, {25,62}, {25,63}, {25,64}, {25,65}, {25,66}, {25,67}, {25,68}, {25,69}, {25,70}, {25,71}, {25,72}, {25,73}, {25,74}, {25,75}, {25,76}, {25,77}, {25,78}, {25,79}, {25,80}, {25,81}, {25,82}, {25,83}, {25,84}, {25,85}, {25,86}, {25,87}, {25,88}, {25,89}, {25,90}, {25,91}, {25,92}, {25,93}, {26,0}, {26,1}, {26,2}, {26,3}, {26,4}, {26,5}, {26,6}, {26,7}, {26,8}, {26,9}, {26,10}, {26,11}, {26,12}, {26,13}, {26,14}, {26,15}, {26,16}, {26,17}, {26,18}, {26,19}, {26,20}, {26,21}, {26,22}, {26,23}, {26,24}, {26,25}, {26,26}, {26,28}, {26,27}, {26,29}, {26,30}, {26,31}, {26,32}, {26,33}, {26,34}, {26,35}, {26,36}, {26,38}, {26,39}, {26,40}, {26,41}, {26,37}, {26,42}, {26,43}, {26,44}, {26,45}, {26,46}, {26,47}, {26,48}, {26,49}, {26,50}, {26,54}, {26,52}, {26,51}, {26,53}, {26,55}, {26,56}, {26,57}, {26,58}, {26,59}, {26,60}, {26,61}, {26,62}, {26,63}, {26,64}, {26,65}, {26,66}, {26,67}, {26,68}, {26,69}, {26,70}, {26,71}, {26,72}, {26,73}, {26,74}, {26,75}, {26,76}, {26,77}, {26,78}, {26,79}, {26,80}, {26,81}, {69,83}, {26,82}, {26,83}, {26,84}, {26,85}, {26,86}, {26,87}, {26,89}, {26,88}, {26,90}, {26,91}, {26,92}, {26,93}, {27,0}, {27,1}, {27,2}, {27,3}, {27,4}, {27,5}, {27,6}, {27,7}, {27,8}, {27,9}, {27,10}, {27,11}, {27,13}, {27,12}, {27,14}, {27,15}, {27,16}, {27,19}, {27,17}, {27,18}, {27,20}, {27,21}, {27,22}, {27,23}, {27,24}, {27,25}, {27,26}, {27,27}, {27,28}, {27,29}, {27,30}, {27,31}, {27,32}, {27,33}, {27,34}, {27,35}, {27,36}, {27,37}, {27,38}, {27,39}, {27,40}, {27,41}, {27,42}, {27,43}, {27,44}, {27,45}, {27,46}, {27,47}, {27,49}, {27,48}, {27,50}, {27,51}, {27,52}, {27,53}, {27,54}, {27,55}, {27,56}, {27,57}, {27,58}, {27,59}, {27,60}, {27,61}, {27,62}, {27,63}, {27,64}, {27,65}, {27,66}, {27,67}, {27,68}, {27,69}, {27,70}, {27,71}, {27,72}, {27,73}, {27,74}, {27,75}, {27,76}, {27,77}, {27,78}, {27,79}, {27,80}, {27,81}, {27,82}, {27,83}, {27,84}, {27,85}, {27,86}, {27,87}, {27,88}, {27,89}, {27,90}, {27,91}, {27,92}, {27,93}, {28,0}, {28,1}, {28,2}, {28,3}, {28,4}, {28,5}, {28,6}, {28,7}, {28,8}, {28,9}, {28,10}, {28,11}, {28,12}, {28,13}, {28,14}, {28,17}, {28,15}, {28,16}, {28,18}, {28,19}, {28,20}, {28,21}, {28,22}, {28,23}, {28,24}, {28,25}, {28,26}, {28,27}, {28,28}, {28,29}, {28,30}, {28,31}, {28,32}, {28,33}, {28,34}, {28,35}, {28,36}, {28,37}, {28,38}, {28,39}, {28,40}, {28,41}, {28,42}, {28,43}, {28,44}, {28,45}, {28,46}, {28,47}, {28,48}, {28,49}, {28,50}, {28,51}, {28,52}, {28,53}, {28,54}, {28,55}, {28,56}, {28,57}, {28,58}, {28,59}, {28,60}, {28,61}, {28,62}, {28,63}, {28,64}, {28,65}, {28,66}, {28,67}, {28,68}, {28,69}, {28,70}, {28,71}, {28,72}, {28,73}, {28,74}, {28,75}, {28,76}, {28,77}, {28,78}, {28,79}, {28,80}, {28,81}, {28,82}, {28,83}, {28,84}, {28,85}, {28,86}, {28,87}, {28,88}, {28,89}, {28,90}, {28,91}, {28,92}, {28,93}, {29,0}, {29,1}, {29,2}, {29,3}, {29,4}, {29,5}, {29,6}, {29,7}, {29,8}, {29,9}, {29,10}, {29,11}, {29,12}, {29,13}, {29,14}, {29,15}, {29,16}, {29,17}, {29,18}, {29,19}, {29,20}, {29,21}, {29,22}, {29,23}, {29,24}, {29,25}, {29,26}, {29,27}, {29,28}, {29,29}, {29,30}, {29,31}, {29,32}, {29,33}, {29,34}, {29,35}, {29,36}, {29,37}, {29,38}, {29,39}, {29,40}, {29,41}, {29,42}, {29,43}, {29,44}, {29,45}, {29,46}, {29,47}, {29,48}, {29,49}, {29,50}, {29,51}, {29,52}, {29,53}, {29,54}, {29,55}, {29,56}, {29,57}, {29,58}, {29,59}, {29,60}, {29,61}, {29,62}, {29,63}, {29,64}, {29,65}, {29,66}, {29,67}, {29,68}, {29,69}, {29,70}, {29,71}, {29,72}, {29,73}, {29,74}, {29,75}, {29,76}, {29,77}, {29,78}, {29,79}, {29,80}, {29,81}, {29,82}, {29,83}, {29,84}, {29,85}, {29,86}, {29,87}, {29,88}, {29,89}, {29,90}, {29,93}, {29,91}, {29,92}, {30,0}, {30,1}, {30,2}, {30,3}, {30,4}, {30,5}, {30,6}, {30,7}, {30,8}, {30,9}, {30,10}, {30,11}, {30,12}, {30,13}, {30,14}, {30,15}, {30,16}, {30,17}, {30,18}, {30,19}, {30,20}, {30,21}, {30,22}, {30,23}, {30,24}, {30,25}, {30,26}, {30,27}, {30,28}, {30,29}, {30,30}, {30,31}, {30,32}, {30,33}, {30,34}, {30,35}, {30,36}, {30,37}, {30,38}, {30,39}, {30,40}, {30,41}, {30,42}, {30,43}, {30,44}, {30,45}, {30,46}, {30,47}, {30,48}, {30,49}, {30,50}, {30,51}, {30,52}, {30,53}, {30,54}, {30,55}, {30,56}, {30,57}, {30,58}, {30,59}, {30,60}, {30,61}, {30,62}, {30,63}, {30,64}, {30,65}, {30,66}, {30,67}, {30,68}, {30,69}, {30,70}, {30,71}, {30,72}, {30,73}, {30,74}, {30,75}, {30,76}, {30,77}, {30,78}, {30,79}, {30,80}, {30,81}, {30,82}, {30,83}, {30,84}, {30,85}, {30,86}, {30,87}, {30,88}, {30,89}, {30,90}, {30,91}, {30,92}, {30,93}, {31,0}, {31,1}, {31,2}, {31,3}, {31,4}, {31,5}, {31,6}, {31,7}, {31,8}, {31,9}, {31,10}, {31,11}, {31,12}, {31,13}, {31,14}, {31,15}, {31,16}, {31,17}, {31,18}, {31,19}, {31,20}, {31,21}, {31,22}, {31,23}, {31,24}, {31,25}, {31,26}, {31,27}, {31,28}, {31,29}, {31,30}, {31,31}, {31,32}, {31,33}, {31,34}, {31,35}, {31,36}, {31,37}, {31,38}, {31,39}, {31,40}, {31,41}, {31,42}, {31,43}, {31,44}, {31,45}, {31,46}, {31,47}, {31,48}, {31,49}, {31,50}, {31,51}, {31,52}, {31,53}, {31,54}, {31,55}, {31,56}, {31,57}, {31,58}, {31,59}, {31,60}, {31,61}, {31,62}, {31,63}, {31,64}, {31,65}, {31,66}, {31,67}, {31,68}, {31,69}, {31,70}, {31,71}, {31,72}, {31,73}, {31,74}, {31,75}, {31,76}, {31,77}, {31,78}, {31,79}, {31,80}, {31,81}, {31,82}, {31,83}, {31,84}, {31,85}, {31,86}, {31,87}, {31,88}, {31,89}, {31,90}, {31,91}, {31,92}, {31,93}, {32,0}, {32,1}, {32,2}, {32,3}, {32,4}, {32,5}, {32,6}, {32,7}, {32,8}, {32,9}, {32,10}, {32,11}, {32,12}, {32,13}, {32,14}, {32,15}, {32,16}, {32,17}, {32,18}, {32,19}, {32,20}, {32,21}, {32,22}, {32,23}, {32,24}, {32,25}, {32,26}, {32,27}, {32,28}, {32,29}, {32,30}, {32,31}, {32,32}, {32,33}, {32,34}, {32,35}, {32,36}, {32,37}, {32,38}, {32,39}, {32,40}, {32,41}, {32,42}, {32,43}, {32,44}, {32,45}, {32,46}, {32,47}, {32,48}, {32,49}, {32,50}, {32,51}, {32,52}, {32,53}, {32,54}, {32,55}, {32,56}, {32,57}, {32,58}, {32,59}, {32,60}, {32,61}, {32,62}, {32,63}, {32,64}, {32,65}, {32,66}, {32,67}, {32,68}, {32,69}, {32,70}, {32,71}, {32,72}, {32,73}, {32,74}, {32,75}, {32,76}, {32,77}, {32,78}, {32,79}, {32,80}, {32,81}, {32,82}, {32,83}, {32,84}, {32,85}, {32,86}, {32,87}, {32,88}, {32,89}, {32,90}, {32,91}, {32,92}, {32,93}, {33,0}, {33,1}, {33,2}, {33,3}, {33,4}, {33,5}, {33,6}, {33,7}, {33,8}, {33,9}, {33,10}, {33,11}, {33,12}, {33,13}, {33,15}, {33,14}, {33,16}, {33,17}, {33,18}, {33,19}, {33,20}, {33,22}, {33,21}, {33,23}, {33,24}, {33,25}, {33,26}, {33,27}, {33,28}, {33,29}, {33,31}, {33,32}, {33,33}, {33,35}, {33,36}, {33,38}, {33,39}, {33,40}, {33,41}, {33,43}, {33,34}, {33,37}, {33,42}, {33,44}, {33,45}, {33,46}, {33,47}, {33,48}, {33,49}, {33,50}, {33,51}, {33,52}, {33,53}, {33,54}, {33,55}, {33,56}, {33,57}, {33,58}, {33,59}, {33,60}, {33,61}, {33,62}, {33,63}, {33,64}, {33,65}, {33,66}, {33,67}, {33,68}, {33,69}, {33,70}, {33,71}, {33,72}, {33,73}, {33,74}, {33,75}, {33,76}, {33,30}, {33,77}, {33,78}, {33,79}, {33,80}, {33,81}, {33,82}, {33,83}, {33,84}, {33,85}, {33,86}, {33,87}, {33,88}, {33,89}, {33,90}, {33,91}, {33,92}, {33,93}, {34,0}, {34,1}, {34,2}, {34,3}, {34,4}, {34,5}, {34,6}, {34,7}, {34,8}, {34,9}, {34,10}, {34,11}, {34,12}, {34,13}, {34,14}, {34,15}, {34,16}, {34,17}, {34,18}, {34,19}, {34,20}, {34,21}, {34,22}, {34,24}, {34,25}, {34,26}, {34,27}, {34,28}, {34,29}, {34,30}, {34,31}, {34,32}, {34,33}, {34,34}, {34,35}, {34,36}, {34,37}, {34,38}, {34,39}, {34,23}, {34,41}, {34,42}, {34,43}, {34,44}, {34,46}, {34,45}, {34,47}, {34,48}, {34,49}, {34,50}, {34,51}, {34,52}, {34,53}, {34,54}, {34,55}, {34,56}, {34,57}, {34,58}, {34,40}, {34,59}, {34,60}, {34,61}, {34,62}, {34,63}, {34,64}, {34,65}, {34,66}, {34,67}, {34,68}, {34,69}, {34,70}, {34,71}, {34,72}, {34,73}, {34,74}, {34,75}, {34,76}, {34,77}, {34,78}, {34,79}, {34,80}, {34,81}, {34,82}, {34,83}, {34,84}, {34,85}, {34,86}, {34,87}, {34,88}, {34,89}, {34,90}, {34,91}, {34,92}, {34,93}, {35,0}, {35,1}, {35,2}, {35,3}, {35,4}, {35,5}, {35,6}, {35,7}, {35,8}, {35,9}, {35,10}, {35,11}, {35,12}, {35,13}, {35,14}, {35,15}, {35,16}, {35,17}, {35,18}, {35,19}, {35,20}, {35,21}, {35,22}, {35,23}, {35,24}, {35,25}, {35,26}, {35,27}, {35,28}, {35,29}, {35,30}, {35,31}, {35,32}, {35,33}, {35,34}, {35,35}, {35,36}, {35,37}, {35,38}, {35,39}, {35,40}, {35,41}, {35,42}, {35,43}, {35,44}, {35,45}, {35,46}, {35,47}, {35,48}, {35,49}, {35,50}, {35,51}, {35,52}, {35,53}, {35,54}, {35,55}, {35,56}, {35,57}, {35,58}, {35,59}, {35,60}, {35,61}, {35,62}, {35,63}, {35,64}, {35,65}, {35,66}, {35,67}, {35,68}, {35,69}, {35,70}, {35,71}, {35,72}, {35,73}, {35,74}, {35,75}, {35,76}, {35,77}, {35,78}, {35,79}, {35,80}, {35,81}, {35,82}, {35,83}, {35,84}, {35,85}, {35,86}, {35,87}, {35,88}, {35,89}, {35,90}, {35,91}, {35,92}, {35,93}, {36,0}, {36,1}, {36,2}, {36,3}, {36,4}, {36,5}, {36,6}, {36,7}, {36,8}, {36,9}, {36,10}, {36,11}, {36,12}, {36,13}, {36,14}, {36,15}, {36,16}, {36,17}, {36,18}, {36,19}, {36,20}, {36,21}, {36,22}, {36,23}, {36,24}, {36,25}, {36,26}, {36,27}, {36,28}, {36,29}, {36,30}, {36,31}, {36,32}, {36,33}, {36,34}, {36,35}, {36,36}, {36,37}, {36,38}, {36,39}, {36,40}, {36,41}, {36,42}, {36,44}, {36,43}, {36,45}, {36,46}, {36,47}, {36,48}, {36,49}, {36,50}, {36,51}, {36,52}, {36,53}, {36,54}, {36,55}, {36,56}, {36,57}, {36,58}, {36,59}, {36,60}, {36,61}, {36,62}, {36,63}, {36,64}, {36,65}, {36,66}, {36,67}, {36,68}, {36,69}, {36,70}, {36,71}, {36,72}, {36,73}, {36,74}, {36,75}, {36,76}, {36,77}, {36,78}, {36,79}, {36,80}, {36,81}, {36,82}, {36,83}, {36,84}, {36,85}, {36,86}, {36,87}, {36,88}, {36,89}, {36,90}, {36,91}, {36,92}, {36,93}, {37,0}, {37,1}, {37,2}, {37,3}, {37,4}, {37,5}, {37,6}, {37,7}, {37,8}, {37,9}, {37,10}, {37,11}, {37,12}, {37,13}, {37,14}, {37,15}, {37,16}, {37,17}, {37,18}, {37,19}, {37,20}, {37,21}, {37,22}, {37,23}, {37,24}, {37,25}, {37,26}, {37,27}, {37,28}, {37,29}, {37,30}, {37,31}, {37,32}, {37,33}, {37,34}, {37,35}, {37,36}, {37,37}, {37,38}, {37,39}, {37,40}, {37,41}, {37,42}, {37,43}, {37,44}, {37,45}, {37,46}, {37,47}, {37,48}, {37,49}, {37,50}, {37,51}, {37,52}, {37,53}, {37,54}, {37,55}, {37,56}, {37,57}, {37,58}, {37,59}, {37,60}, {37,61}, {37,62}, {37,63}, {38,21}, {37,64}, {37,65}, {37,66}, {37,67}, {37,68}, {37,69}, {37,70}, {37,71}, {37,72}, {37,73}, {37,74}, {37,75}, {37,76}, {37,77}, {37,78}, {37,79}, {37,80}, {37,81}, {37,82}, {37,83}, {37,84}, {37,85}, {37,86}, {37,87}, {37,88}, {37,89}, {37,90}, {37,91}, {37,92}, {37,93}, {38,0}, {38,1}, {38,2}, {38,3}, {38,4}, {38,5}, {38,6}, {38,7}, {38,8}, {38,9}, {38,10}, {38,11}, {38,12}, {38,13}, {38,14}, {38,15}, {38,16}, {38,17}, {38,18}, {38,19}, {38,20}, {38,22}, {38,23}, {38,24}, {38,25}, {38,26}, {38,27}, {38,28}, {38,29}, {38,30}, {38,31}, {38,32}, {38,33}, {38,34}, {38,35}, {38,36}, {38,37}, {38,38}, {38,39}, {38,40}, {38,41}, {38,42}, {38,43}, {38,44}, {38,45}, {38,46}, {38,47}, {38,48}, {38,49}, {38,50}, {38,51}, {38,52}, {38,53}, {38,54}, {38,55}, {38,56}, {38,57}, {38,58}, {38,59}, {38,60}, {38,61}, {38,62}, {38,63}, {38,64}, {38,65}, {38,66}, {38,67}, {38,68}, {38,69}, {38,70}, {38,71}, {38,72}, {38,73}, {38,74}, {38,75}, {38,76}, {38,77}, {38,78}, {38,79}, {38,80}, {38,81}, {38,82}, {38,83}, {38,84}, {38,85}, {38,86}, {38,87}, {38,88}, {38,89}, {38,90}, {38,91}, {38,92}, {38,93}, {39,0}, {39,1}, {39,2}, {39,3}, {39,4}, {39,5}, {39,6}, {39,7}, {39,8}, {39,9}, {39,10}, {39,11}, {39,12}, {39,13}, {39,14}, {39,15}, {39,16}, {39,17}, {39,18}, {39,19}, {39,20}, {39,21}, {39,22}, {39,23}, {39,24}, {39,25}, {39,26}, {39,27}, {39,28}, {39,29}, {39,30}, {39,31}, {39,32}, {39,33}, {39,34}, {39,35}, {39,36}, {39,37}, {39,38}, {39,39}, {39,40}, {39,41}, {39,42}, {39,43}, {39,50}, {39,44}, {39,45}, {39,46}, {39,47}, {39,48}, {39,49}, {39,51}, {39,52}, {39,53}, {39,54}, {39,55}, {39,56}, {39,57}, {39,58}, {39,59}, {39,60}, {39,61}, {39,62}, {39,63}, {39,64}, {39,65}, {39,66}, {39,67}, {39,68}, {39,69}, {39,70}, {39,71}, {39,72}, {39,73}, {39,74}, {39,75}, {39,76}, {39,77}, {39,78}, {39,79}, {39,80}, {39,81}, {39,82}, {39,83}, {39,84}, {39,85}, {39,86}, {39,87}, {39,88}, {39,89}, {39,90}, {39,91}, {39,92}, {39,93}, {40,0}, {40,1}, {40,2}, {40,3}, {40,4}, {40,5}, {40,6}, {40,7}, {40,8}, {40,9}, {40,10}, {40,11}, {40,12}, {40,13}, {40,14}, {40,15}, {40,16}, {40,17}, {40,18}, {40,19}, {40,20}, {40,21}, {40,22}, {40,23}, {40,24}, {40,25}, {40,26}, {40,27}, {40,32}, {40,28}, {40,29}, {40,30}, {40,31}, {40,33}, {40,34}, {40,35}, {40,36}, {40,37}, {40,38}, {40,39}, {40,40}, {40,41}, {40,42}, {40,43}, {40,44}, {40,45}, {40,46}, {40,47}, {40,48}, {40,49}, {40,50}, {40,51}, {40,52}, {40,53}, {40,54}, {40,55}, {40,56}, {40,57}, {40,58}, {40,59}, {40,60}, {40,61}, {40,62}, {40,63}, {40,64}, {40,65}, {40,66}, {40,67}, {40,68}, {40,69}, {40,70}, {40,71}, {40,72}, {40,73}, {40,74}, {40,75}, {40,76}, {40,77}, {40,78}, {40,79}, {40,80}, {40,81}, {40,82}, {40,83}, {40,84}, {40,85}, {40,86}, {40,87}, {40,88}, {40,89}, {40,90}, {40,91}, {40,92}, {40,93}, {41,0}, {41,1}, {41,2}, {41,3}, {41,4}, {41,5}, {41,6}, {41,7}, {41,8}, {41,9}, {41,10}, {41,11}, {41,12}, {41,13}, {41,14}, {41,15}, {41,16}, {41,17}, {41,18}, {41,19}, {41,20}, {41,21}, {41,22}, {41,23}, {41,24}, {41,25}, {41,26}, {41,27}, {41,28}, {41,29}, {41,30}, {41,31}, {41,32}, {41,33}, {41,34}, {41,35}, {41,36}, {41,37}, {41,38}, {41,39}, {41,40}, {41,41}, {41,42}, {41,43}, {41,44}, {41,45}, {41,46}, {41,47}, {41,48}, {41,49}, {41,50}, {41,51}, {41,52}, {41,53}, {41,54}, {41,55}, {41,56}, {41,57}, {41,58}, {41,59}, {41,60}, {41,61}, {41,62}, {41,63}, {41,64}, {41,65}, {41,66}, {41,67}, {41,68}, {41,69}, {41,70}, {41,71}, {41,72}, {41,73}, {41,74}, {41,75}, {41,76}, {41,77}, {41,78}, {41,79}, {41,80}, {41,81}, {41,82}, {41,83}, {41,84}, {41,85}, {41,86}, {41,87}, {41,88}, {41,89}, {41,90}, {41,91}, {41,92}, {41,93}, {42,0}, {42,1}, {42,2}, {42,3}, {42,4}, {42,5}, {42,6}, {42,7}, {42,8}, {42,9}, {42,10}, {42,11}, {42,12}, {42,13}, {42,14}, {42,15}, {42,16}, {42,17}, {42,18}, {42,19}, {42,20}, {42,21}, {42,22}, {42,23}, {42,24}, {42,25}, {42,26}, {42,27}, {42,28}, {42,29}, {42,30}, {42,31}, {42,32}, {42,33}, {42,34}, {42,35}, {42,36}, {42,37}, {42,38}, {42,39}, {42,40}, {42,41}, {42,42}, {42,43}, {42,44}, {42,45}, {42,46}, {42,47}, {42,48}, {42,49}, {42,50}, {42,51}, {42,52}, {42,53}, {42,54}, {42,55}, {42,56}, {42,57}, {42,58}, {42,59}, {42,60}, {42,61}, {42,62}, {42,63}, {42,64}, {42,65}, {42,66}, {42,67}, {42,68}, {42,69}, {42,70}, {42,71}, {42,72}, {42,73}, {42,74}, {42,75}, {42,76}, {42,77}, {42,78}, {42,79}, {42,80}, {42,81}, {42,82}, {42,83}, {42,84}, {42,85}, {42,86}, {42,87}, {42,88}, {42,89}, {42,90}, {42,91}, {42,92}, {42,93}, {43,0}, {43,1}, {43,2}, {43,3}, {43,4}, {43,5}, {43,6}, {43,7}, {43,8}, {43,9}, {43,10}, {43,11}, {43,12}, {43,13}, {43,14}, {43,15}, {43,16}, {43,17}, {43,18}, {43,19}, {43,20}, {43,21}, {43,22}, {43,23}, {43,24}, {43,25}, {43,26}, {43,27}, {43,28}, {43,29}, {43,30}, {43,31}, {43,32}, {43,33}, {43,34}, {43,35}, {43,36}, {43,37}, {43,38}, {43,39}, {43,40}, {43,41}, {43,42}, {43,43}, {43,44}, {43,45}, {43,46}, {43,47}, {43,48}, {43,49}, {43,50}, {43,51}, {43,52}, {43,53}, {43,54}, {43,55}, {43,56}, {43,57}, {43,58}, {43,59}, {43,60}, {43,61}, {43,62}, {43,63}, {43,64}, {43,65}, {43,66}, {43,67}, {43,68}, {43,69}, {43,70}, {43,71}, {43,72}, {43,73}, {43,74}, {43,75}, {43,76}, {43,77}, {43,78}, {43,79}, {43,80}, {43,81}, {43,82}, {43,83}, {43,84}, {43,85}, {43,86}, {43,87}, {43,88}, {43,89}, {43,90}, {43,91}, {43,92}, {43,93}, {44,0}, {44,1}, {44,2}, {44,3}, {44,4}, {44,5}, {44,6}, {44,7}, {44,8}, {44,9}, {44,10}, {44,11}, {44,12}, {44,13}, {44,14}, {44,15}, {44,16}, {44,17}, {44,18}, {44,19}, {44,20}, {44,21}, {44,22}, {44,23}, {44,24}, {44,25}, {44,26}, {44,27}, {44,28}, {44,29}, {44,30}, {44,31}, {44,32}, {44,33}, {44,34}, {44,35}, {44,36}, {44,37}, {44,38}, {44,39}, {44,40}, {44,41}, {44,42}, {44,43}, {44,44}, {44,45}, {44,46}, {44,47}, {44,48}, {44,49}, {44,50}, {44,51}, {44,52}, {44,53}, {44,54}, {44,55}, {44,56}, {44,57}, {44,58}, {44,59}, {44,60}, {44,61}, {44,62}, {44,63}, {44,64}, {44,65}, {44,66}, {44,67}, {44,68}, {44,69}, {44,70}, {44,71}, {44,72}, {44,73}, {44,74}, {44,75}, {44,76}, {44,77}, {44,78}, {44,79}, {44,80}, {44,81}, {44,82}, {44,83}, {44,84}, {44,85}, {44,86}, {44,87}, {44,88}, {44,89}, {44,90}, {44,91}, {44,92}, {44,93}, {45,0}, {45,1}, {45,3}, {45,4}, {45,5}, {45,6}, {45,7}, {45,8}, {45,2}, {45,9}, {45,10}, {45,11}, {45,12}, {45,13}, {45,14}, {45,15}, {45,16}, {45,17}, {45,18}, {45,19}, {45,20}, {45,21}, {45,22}, {45,23}, {45,24}, {45,25}, {45,26}, {45,27}, {45,28}, {45,29}, {45,30}, {45,31}, {45,32}, {45,33}, {45,34}, {45,35}, {45,36}, {45,37}, {45,38}, {45,39}, {45,40}, {45,41}, {45,42}, {45,43}, {45,44}, {45,45}, {45,46}, {45,47}, {45,48}, {45,49}, {45,50}, {45,51}, {45,52}, {45,53}, {45,54}, {45,55}, {45,56}, {45,57}, {45,58}, {45,59}, {45,60}, {45,61}, {45,62}, {45,63}, {45,64}, {45,65}, {45,66}, {45,67}, {45,68}, {45,69}, {45,70}, {45,71}, {45,72}, {45,73}, {45,74}, {45,75}, {45,76}, {45,77}, {45,78}, {45,79}, {45,80}, {45,81}, {45,82}, {45,83}, {45,84}, {45,85}, {45,86}, {45,87}, {45,88}, {45,89}, {45,90}, {45,91}, {45,92}, {45,93}, {46,0}, {46,1}, {46,2}, {46,3}, {46,4}, {46,5}, {46,6}, {46,7}, {46,8}, {46,9}, {46,10}, {46,11}, {46,12}, {46,13}, {46,14}, {46,15}, {46,16}, {46,17}, {46,18}, {46,19}, {46,20}, {46,21}, {46,22}, {46,23}, {46,24}, {46,25}, {46,26}, {46,27}, {46,28}, {46,29}, {46,30}, {46,31}, {46,32}, {46,33}, {46,34}, {46,35}, {46,36}, {46,37}, {46,38}, {46,39}, {46,40}, {46,41}, {46,42}, {46,43}, {46,44}, {46,45}, {46,46}, {46,47}, {46,48}, {46,49}, {46,50}, {46,51}, {46,52}, {46,53}, {46,54}, {46,55}, {46,56}, {46,57}, {46,58}, {46,59}, {46,60}, {46,61}, {46,62}, {46,63}, {46,64}, {46,65}, {46,66}, {46,67}, {46,68}, {46,69}, {46,70}, {46,71}, {46,72}, {46,73}, {46,74}, {46,75}, {46,76}, {46,77}, {46,78}, {46,79}, {46,80}, {46,81}, {46,83}, {46,84}, {46,85}, {46,82}, {46,86}, {46,87}, {46,88}, {46,89}, {46,90}, {46,91}, {46,92}, {46,93}, {47,0}, {47,1}, {47,2}, {47,3}, {47,4}, {47,5}, {47,6}, {47,7}, {47,8}, {47,9}, {47,10}, {47,11}, {47,13}, {47,14}, {47,15}, {47,16}, {47,12}, {47,17}, {47,18}, {47,19}, {47,20}, {47,22}, {47,23}, {47,24}, {47,25}, {47,26}, {47,21}, {47,27}, {47,28}, {47,29}, {47,30}, {47,31}, {47,32}, {47,33}, {47,34}, {47,35}, {47,36}, {47,37}, {47,38}, {47,39}, {47,40}, {47,41}, {47,42}, {47,43}, {47,44}, {47,45}, {47,46}, {47,47}, {47,48}, {47,49}, {47,50}, {47,51}, {47,52}, {47,53}, {47,54}, {47,55}, {47,56}, {47,57}, {47,58}, {47,59}, {47,60}, {47,61}, {47,62}, {47,63}, {47,64}, {47,65}, {47,66}, {47,67}, {47,68}, {47,69}, {47,70}, {47,71}, {47,72}, {47,73}, {47,74}, {47,75}, {47,76}, {47,77}, {47,78}, {47,79}, {47,80}, {47,81}, {47,82}, {47,83}, {47,84}, {47,85}, {47,86}, {47,87}, {47,88}, {47,89}, {47,90}, {47,91}, {47,92}, {47,93}, {48,0}, {48,1}, {48,2}, {48,3}, {48,4}, {48,5}, {48,6}, {48,7}, {48,8}, {48,9}, {48,10}, {48,11}, {48,12}, {48,13}, {48,14}, {48,15}, {48,16}, {48,17}, {48,18}, {48,19}, {48,20}, {48,21}, {48,22}, {48,23}, {48,24}, {48,25}, {48,26}, {48,27}, {48,28}, {48,29}, {48,30}, {48,31}, {48,32}, {48,33}, {48,34}, {48,35}, {48,36}, {48,37}, {48,38}, {48,39}, {48,40}, {48,41}, {48,42}, {48,43}, {48,44}, {48,45}, {48,46}, {48,47}, {48,48}, {48,49}, {48,50}, {48,51}, {48,52}, {48,53}, {48,54}, {48,55}, {48,56}, {48,57}, {48,58}, {48,59}, {48,60}, {48,61}, {48,62}, {48,63}, {48,64}, {48,65}, {48,66}, {48,67}, {48,68}, {48,69}, {48,70}, {48,71}, {48,72}, {48,73}, {48,74}, {48,75}, {48,76}, {48,77}, {48,78}, {48,79}, {48,80}, {48,81}, {48,82}, {48,83}, {48,84}, {48,85}, {48,86}, {48,87}, {48,88}, {48,89}, {48,90}, {48,91}, {48,92}, {48,93}, {49,0}, {49,1}, {49,2}, {49,3}, {49,4}, {49,5}, {49,6}, {49,7}, {49,8}, {49,9}, {49,10}, {49,11}, {49,12}, {49,13}, {49,14}, {49,15}, {49,16}, {49,17}, {49,18}, {49,19}, {49,20}, {49,21}, {49,22}, {49,23}, {49,24}, {49,25}, {49,26}, {49,27}, {49,28}, {49,29}, {49,30}, {49,31}, {49,32}, {49,33}, {49,34}, {49,35}, {49,36}, {49,37}, {49,38}, {49,39}, {49,40}, {49,41}, {49,42}, {49,43}, {49,44}, {49,45}, {49,46}, {49,47}, {49,48}, {49,49}, {49,50}, {49,51}, {49,52}, {49,53}, {49,54}, {49,55}, {49,56}, {49,57}, {49,58}, {49,59}, {49,60}, {49,61}, {49,62}, {49,63}, {49,64}, {49,65}, {49,66}, {49,67}, {49,68}, {49,69}, {49,70}, {49,71}, {49,72}, {49,73}, {49,74}, {49,75}, {49,76}, {49,77}, {49,78}, {49,79}, {49,80}, {49,81}, {49,82}, {49,83}, {49,85}, {49,86}, {49,87}, {49,84}, {49,88}, {49,89}, {49,90}, {49,91}, {49,92}, {49,93}, {50,0}, {50,1}, {50,2}, {50,3}, {50,4}, {50,5}, {50,6}, {50,7}, {50,8}, {50,9}, {50,10}, {50,11}, {50,12}, {50,13}, {50,14}, {50,15}, {50,16}, {50,17}, {50,18}, {50,19}, {50,20}, {50,21}, {50,22}, {50,23}, {50,24}, {50,25}, {50,26}, {50,27}, {50,28}, {50,29}, {50,30}, {50,31}, {50,32}, {50,33}, {50,34}, {50,35}, {50,36}, {50,37}, {50,38}, {50,39}, {50,40}, {50,41}, {50,42}, {50,43}, {50,44}, {50,45}, {50,46}, {50,47}, {50,48}, {50,49}, {50,50}, {50,51}, {50,52}, {50,53}, {50,54}, {50,55}, {50,56}, {50,57}, {50,58}, {50,59}, {50,60}, {50,61}, {50,62}, {50,63}, {50,64}, {50,65}, {50,66}, {50,67}, {50,68}, {50,69}, {50,70}, {50,71}, {50,72}, {50,73}, {50,74}, {50,75}, {50,76}, {50,77}, {50,78}, {50,79}, {50,80}, {50,81}, {50,82}, {50,83}, {50,84}, {50,85}, {50,86}, {50,87}, {50,88}, {50,89}, {50,90}, {50,91}, {50,92}, {50,93}, {51,0}, {51,1}, {51,2}, {51,3}, {51,4}, {51,5}, {51,6}, {51,7}, {51,8}, {51,9}, {51,10}, {51,11}, {51,12}, {51,13}, {51,14}, {51,15}, {51,16}, {51,17}, {51,19}, {51,20}, {51,21}, {51,22}, {51,23}, {51,24}, {51,25}, {51,26}, {51,27}, {51,28}, {51,29}, {51,18}, {51,30}, {51,31}, {51,32}, {51,33}, {51,34}, {51,35}, {51,36}, {51,37}, {51,38}, {51,39}, {51,40}, {51,41}, {51,42}, {51,43}, {51,44}, {51,45}, {51,46}, {51,47}, {51,48}, {51,49}, {51,50}, {51,51}, {51,52}, {51,53}, {51,54}, {51,55}, {51,56}, {51,57}, {51,58}, {51,59}, {51,60}, {51,61}, {51,62}, {51,63}, {51,64}, {51,65}, {51,66}, {51,67}, {51,68}, {51,69}, {51,70}, {51,71}, {51,72}, {51,73}, {51,75}, {51,74}, {51,76}, {51,77}, {51,78}, {51,79}, {51,80}, {51,81}, {51,82}, {51,83}, {51,84}, {51,85}, {51,86}, {51,87}, {51,88}, {51,89}, {51,90}, {51,91}, {51,92}, {51,93}, {52,0}, {52,1}, {52,2}, {52,3}, {52,4}, {52,5}, {52,6}, {52,7}, {52,8}, {52,9}, {52,10}, {52,11}, {52,12}, {52,13}, {52,14}, {52,15}, {52,16}, {52,17}, {52,18}, {52,19}, {52,20}, {52,21}, {52,22}, {52,23}, {52,24}, {52,25}, {52,26}, {52,27}, {52,28}, {52,29}, {52,30}, {52,31}, {52,32}, {52,33}, {52,34}, {52,35}, {52,36}, {52,37}, {52,38}, {52,39}, {52,40}, {52,41}, {52,42}, {52,43}, {52,44}, {52,45}, {52,46}, {52,47}, {52,48}, {52,49}, {52,50}, {52,51}, {52,52}, {52,53}, {52,54}, {52,55}, {52,56}, {52,57}, {52,58}, {52,59}, {52,60}, {52,61}, {52,62}, {52,63}, {52,64}, {52,65}, {52,66}, {52,67}, {52,68}, {52,69}, {52,70}, {52,71}, {52,72}, {52,73}, {52,74}, {52,75}, {52,76}, {52,77}, {52,78}, {52,79}, {52,80}, {52,81}, {52,82}, {52,83}, {52,84}, {52,85}, {52,86}, {52,87}, {52,88}, {52,89}, {52,90}, {52,91}, {52,92}, {52,93}, {53,0}, {53,1}, {53,2}, {53,3}, {53,4}, {53,5}, {53,6}, {53,7}, {53,8}, {53,9}, {53,10}, {53,11}, {53,12}, {53,13}, {53,14}, {53,15}, {53,16}, {53,17}, {53,18}, {53,19}, {53,20}, {53,21}, {53,22}, {53,23}, {53,24}, {53,25}, {53,26}, {53,27}, {53,28}, {53,29}, {53,30}, {53,31}, {53,32}, {53,33}, {53,34}, {53,35}, {53,36}, {53,38}, {53,39}, {53,40}, {53,41}, {53,42}, {53,37}, {53,43}, {53,44}, {53,45}, {53,46}, {53,47}, {53,48}, {53,49}, {53,50}, {53,51}, {53,53}, {53,54}, {53,55}, {53,52}, {53,56}, {53,57}, {53,58}, {53,59}, {53,60}, {53,61}, {53,62}, {53,63}, {53,64}, {53,65}, {53,66}, {53,67}, {53,68}, {53,69}, {53,70}, {53,71}, {53,72}, {53,73}, {53,74}, {53,75}, {53,76}, {53,77}, {53,78}, {53,79}, {53,80}, {53,81}, {53,82}, {53,83}, {53,84}, {53,85}, {53,86}, {53,87}, {53,88}, {53,89}, {53,90}, {53,91}, {53,92}, {53,93}, {54,0}, {54,1}, {54,2}, {54,3}, {54,4}, {54,5}, {54,6}, {54,7}, {54,8}, {54,9}, {54,10}, {54,11}, {54,12}, {54,13}, {54,14}, {54,15}, {54,16}, {54,17}, {54,18}, {54,19}, {54,20}, {54,21}, {54,22}, {54,23}, {54,24}, {54,25}, {54,26}, {54,27}, {54,28}, {54,29}, {54,30}, {54,31}, {54,32}, {54,33}, {54,34}, {54,35}, {54,36}, {54,37}, {54,38}, {54,39}, {54,40}, {54,41}, {54,42}, {54,43}, {54,44}, {54,45}, {54,46}, {54,47}, {54,48}, {54,49}, {54,50}, {54,51}, {54,52}, {54,53}, {54,54}, {54,55}, {54,56}, {54,57}, {54,58}, {54,59}, {54,60}, {54,61}, {54,62}, {54,63}, {54,64}, {54,65}, {54,67}, {54,68}, {54,69}, {54,70}, {54,71}, {54,72}, {54,73}, {54,74}, {54,75}, {54,76}, {54,77}, {54,78}, {54,79}, {54,80}, {54,81}, {54,82}, {54,83}, {54,84}, {54,85}, {54,86}, {54,87}, {54,88}, {55,29}, {54,66}, {54,89}, {54,90}, {54,91}, {54,92}, {54,93}, {55,0}, {55,1}, {55,2}, {55,3}, {55,4}, {55,5}, {55,6}, {55,7}, {55,8}, {55,9}, {55,10}, {55,11}, {55,12}, {55,13}, {55,14}, {55,15}, {55,16}, {55,17}, {55,18}, {55,43}, {55,19}, {55,20}, {55,21}, {55,22}, {55,23}, {55,24}, {55,25}, {55,26}, {55,27}, {55,28}, {55,30}, {55,31}, {55,32}, {55,33}, {55,34}, {55,35}, {55,36}, {55,37}, {55,38}, {55,39}, {55,40}, {55,41}, {55,42}, {55,44}, {55,45}, {55,46}, {55,47}, {55,48}, {55,49}, {55,50}, {55,51}, {55,52}, {55,53}, {55,54}, {55,55}, {55,56}, {55,57}, {55,58}, {55,59}, {55,60}, {55,61}, {55,62}, {55,63}, {55,64}, {55,65}, {55,66}, {55,67}, {55,68}, {55,69}, {55,70}, {55,71}, {55,72}, {55,73}, {55,74}, {55,75}, {55,76}, {55,77}, {55,78}, {55,79}, {55,80}, {55,81}, {55,82}, {55,83}, {55,84}, {55,85}, {55,86}, {55,87}, {55,88}, {55,89}, {55,90}, {55,91}, {55,92}, {55,93}, {56,0}, {56,1}, {56,2}, {56,3}, {56,4}, {56,5}, {56,6}, {56,7}, {56,9}, {56,10}, {56,11}, {56,12}, {56,13}, {56,14}, {56,15}, {56,16}, {56,17}, {56,18}, {56,19}, {56,20}, {56,21}, {56,22}, {56,23}, {56,24}, {56,25}, {56,26}, {56,27}, {56,8}, {56,28}, {56,29}, {56,30}, {56,31}, {56,32}, {56,33}, {56,34}, {56,35}, {56,36}, {56,37}, {56,38}, {56,39}, {56,40}, {56,41}, {56,42}, {56,43}, {56,44}, {56,45}, {56,46}, {56,47}, {56,48}, {56,49}, {56,50}, {56,51}, {56,52}, {56,53}, {56,54}, {56,55}, {56,56}, {56,57}, {56,58}, {56,59}, {56,60}, {56,61}, {56,62}, {56,63}, {56,64}, {56,65}, {56,66}, {56,67}, {56,68}, {56,69}, {56,83}, {56,70}, {56,71}, {56,72}, {56,73}, {56,74}, {56,75}, {56,76}, {56,77}, {56,78}, {56,79}, {56,80}, {56,81}, {56,82}, {56,84}, {56,85}, {56,86}, {56,87}, {56,88}, {56,89}, {56,90}, {56,91}, {56,92}, {56,93}, {57,0}, {57,1}, {57,2}, {57,3}, {57,4}, {57,5}, {57,6}, {57,7}, {57,8}, {57,9}, {57,10}, {57,11}, {57,12}, {57,13}, {57,14}, {57,15}, {57,16}, {57,17}, {57,18}, {57,19}, {57,20}, {57,21}, {23,69}, {57,22}, {57,23}, {57,24}, {57,25}, {57,26}, {57,27}, {57,28}, {57,29}, {57,30}, {57,31}, {57,32}, {57,33}, {57,34}, {57,35}, {57,36}, {57,37}, {57,38}, {57,39}, {57,40}, {57,41}, {57,42}, {57,76}, {57,43}, {57,44}, {57,45}, {57,46}, {57,47}, {57,48}, {57,49}, {57,50}, {57,51}, {57,52}, {57,53}, {57,54}, {57,55}, {57,56}, {57,57}, {57,58}, {57,59}, {57,60}, {57,61}, {57,62}, {57,63}, {57,64}, {57,65}, {57,66}, {57,67}, {57,68}, {57,69}, {57,70}, {57,71}, {57,72}, {57,73}, {57,74}, {57,75}, {57,77}, {57,78}, {57,79}, {57,80}, {57,81}, {57,82}, {57,83}, {57,84}, {57,85}, {57,86}, {57,87}, {57,88}, {57,89}, {57,90}, {57,91}, {57,92}, {57,93}, {58,0}, {58,1}, {58,2}, {58,3}, {58,4}, {58,5}, {58,6}, {58,7}, {58,8}, {58,9}, {58,10}, {58,11}, {58,12}, {58,13}, {58,14}, {58,15}, {58,16}, {58,17}, {58,18}, {58,19}, {58,20}, {58,21}, {58,22}, {58,23}, {58,24}, {58,25}, {58,26}, {58,27}, {58,28}, {58,29}, {58,30}, {58,31}, {58,32}, {58,33}, {58,34}, {58,35}, {58,36}, {58,37}, {58,38}, {58,39}, {58,40}, {58,41}, {58,42}, {58,43}, {58,44}, {58,45}, {58,46}, {58,47}, {58,48}, {58,49}, {58,50}, {58,51}, {58,52}, {58,53}, {58,54}, {58,55}, {58,56}, {58,57}, {58,58}, {58,59}, {58,60}, {58,61}, {58,62}, {58,63}, {58,64}, {58,65}, {58,66}, {58,67}, {58,68}, {58,69}, {58,70}, {58,71}, {58,72}, {58,73}, {58,74}, {58,75}, {58,76}, {58,77}, {58,79}, {58,80}, {58,81}, {58,82}, {58,78}, {58,83}, {58,84}, {58,85}, {58,86}, {58,87}, {58,88}, {58,89}, {58,90}, {58,91}, {58,92}, {58,93}, {59,0}, {59,1}, {59,2}, {59,3}, {59,4}, {59,5}, {59,6}, {59,7}, {59,8}, {59,9}, {59,10}, {59,11}, {59,12}, {59,13}, {59,14}, {59,15}, {59,16}, {59,17}, {59,18}, {59,19}, {59,20}, {59,21}, {59,22}, {59,23}, {59,24}, {59,25}, {59,26}, {59,27}, {59,28}, {59,29}, {59,30}, {59,31}, {59,32}, {59,33}, {59,34}, {59,35}, {59,36}, {59,37}, {59,38}, {59,39}, {59,40}, {59,41}, {59,42}, {59,43}, {59,44}, {59,45}, {59,46}, {59,47}, {59,48}, {59,49}, {59,50}, {59,51}, {59,52}, {59,53}, {59,54}, {59,55}, {59,56}, {59,57}, {59,58}, {59,59}, {59,60}, {59,61}, {59,62}, {59,63}, {59,64}, {59,65}, {59,66}, {59,67}, {59,68}, {59,69}, {59,70}, {59,71}, {59,72}, {59,73}, {59,74}, {59,75}, {59,76}, {59,77}, {59,78}, {59,79}, {59,80}, {59,81}, {59,82}, {59,83}, {59,84}, {59,85}, {59,86}, {59,87}, {59,88}, {59,89}, {59,90}, {59,91}, {59,92}, {59,93}, {60,0}, {60,1}, {60,2}, {60,3}, {60,4}, {60,5}, {60,6}, {60,7}, {60,8}, {60,9}, {60,10}, {60,11}, {60,12}, {60,13}, {60,14}, {60,15}, {60,16}, {60,17}, {60,18}, {60,19}, {60,20}, {60,21}, {60,22}, {60,23}, {60,24}, {60,25}, {60,26}, {60,27}, {60,28}, {60,29}, {60,30}, {60,31}, {60,32}, {60,33}, {60,34}, {60,35}, {60,36}, {60,37}, {60,38}, {60,39}, {60,40}, {60,41}, {60,42}, {60,43}, {60,44}, {60,45}, {60,46}, {60,47}, {60,48}, {60,49}, {60,50}, {60,51}, {60,52}, {60,53}, {60,54}, {60,55}, {60,56}, {60,57}, {60,58}, {60,59}, {60,60}, {60,61}, {60,62}, {60,63}, {60,64}, {60,65}, {60,66}, {60,67}, {60,68}, {60,69}, {60,70}, {60,71}, {60,72}, {60,73}, {60,74}, {60,75}, {60,76}, {60,77}, {60,78}, {60,79}, {60,80}, {60,81}, {60,82}, {60,83}, {60,84}, {60,85}, {60,86}, {60,87}, {60,88}, {60,89}, {60,90}, {60,91}, {60,92}, {60,93}, {61,0}, {61,1}, {61,2}, {61,3}, {61,4}, {61,5}, {61,6}, {61,7}, {61,8}, {61,9}, {61,10}, {61,11}, {61,12}, {61,13}, {61,14}, {61,15}, {61,16}, {61,17}, {61,18}, {61,19}, {61,20}, {61,21}, {61,22}, {61,23}, {61,24}, {61,30}, {61,25}, {61,26}, {61,27}, {61,28}, {61,29}, {61,31}, {61,32}, {61,33}, {61,34}, {61,35}, {61,36}, {61,37}, {61,38}, {61,39}, {61,40}, {61,45}, {61,41}, {61,42}, {61,43}, {61,44}, {61,46}, {61,47}, {61,48}, {61,49}, {61,50}, {61,51}, {61,52}, {61,53}, {61,54}, {61,55}, {61,56}, {61,57}, {61,58}, {61,59}, {61,60}, {61,61}, {61,62}, {61,63}, {61,64}, {61,65}, {61,66}, {61,67}, {61,68}, {61,69}, {61,70}, {61,71}, {61,72}, {61,73}, {61,74}, {61,75}, {61,76}, {61,77}, {61,78}, {61,81}, {61,79}, {61,80}, {61,82}, {61,83}, {61,84}, {61,85}, {61,86}, {61,87}, {61,88}, {61,89}, {61,90}, {61,91}, {61,92}, {61,93}, {62,0}, {62,1}, {62,2}, {62,3}, {62,4}, {62,5}, {62,6}, {62,7}, {62,8}, {62,9}, {62,10}, {62,11}, {62,12}, {62,13}, {62,14}, {62,15}, {62,17}, {62,16}, {62,18}, {62,19}, {62,20}, {62,21}, {62,22}, {62,23}, {62,24}, {62,25}, {62,26}, {62,27}, {62,28}, {62,29}, {62,30}, {62,31}, {62,32}, {62,33}, {62,34}, {62,35}, {62,36}, {62,37}, {62,38}, {62,39}, {62,40}, {62,41}, {62,42}, {62,43}, {62,44}, {62,45}, {62,46}, {62,47}, {62,48}, {62,49}, {62,50}, {62,51}, {62,52}, {62,53}, {62,54}, {62,55}, {62,56}, {62,57}, {62,58}, {62,59}, {62,60}, {62,78}, {62,61}, {62,62}, {62,63}, {62,64}, {62,65}, {62,66}, {62,67}, {62,68}, {62,69}, {62,70}, {62,71}, {62,72}, {62,73}, {62,74}, {62,75}, {62,76}, {62,77}, {62,79}, {62,80}, {62,81}, {62,82}, {62,83}, {62,84}, {62,85}, {62,86}, {62,87}, {62,88}, {62,89}, {62,90}, {62,91}, {62,92}, {62,93}, {63,0}, {63,1}, {63,2}, {63,3}, {63,4}, {63,5}, {63,6}, {63,7}, {63,8}, {63,9}, {63,10}, {63,11}, {63,12}, {63,13}, {63,14}, {63,15}, {63,16}, {63,17}, {63,18}, {63,19}, {63,20}, {63,21}, {63,22}, {63,23}, {63,24}, {63,25}, {63,26}, {63,27}, {63,28}, {63,29}, {63,30}, {63,31}, {63,32}, {63,33}, {63,34}, {63,35}, {63,36}, {63,37}, {63,38}, {63,39}, {63,40}, {63,41}, {63,42}, {63,43}, {63,44}, {63,45}, {63,46}, {63,47}, {63,48}, {63,49}, {63,50}, {63,51}, {63,52}, {63,53}, {63,54}, {63,55}, {63,56}, {63,57}, {63,58}, {63,59}, {63,60}, {63,67}, {63,61}, {63,62}, {63,63}, {63,64}, {63,65}, {63,66}, {63,68}, {63,69}, {63,70}, {63,71}, {63,72}, {63,73}, {63,74}, {63,75}, {63,76}, {63,77}, {63,78}, {63,79}, {63,80}, {63,81}, {63,82}, {63,83}, {63,84}, {63,85}, {63,86}, {63,87}, {63,88}, {63,89}, {63,90}, {63,91}, {63,92}, {63,93}, {64,0}, {64,1}, {64,2}, {64,3}, {64,4}, {64,5}, {64,6}, {64,7}, {64,8}, {64,9}, {64,10}, {64,11}, {64,12}, {64,13}, {64,14}, {64,15}, {64,16}, {64,17}, {64,18}, {64,19}, {64,20}, {64,21}, {64,22}, {64,23}, {64,24}, {64,25}, {64,26}, {64,27}, {64,28}, {64,29}, {64,30}, {64,31}, {64,32}, {64,33}, {64,34}, {64,35}, {64,36}, {64,37}, {64,38}, {64,39}, {64,40}, {64,41}, {64,42}, {64,43}, {64,44}, {64,45}, {64,46}, {64,47}, {64,48}, {64,49}, {64,51}, {64,52}, {64,53}, {64,50}, {64,54}, {64,55}, {64,56}, {64,57}, {64,58}, {64,59}, {64,60}, {64,61}, {64,62}, {64,63}, {64,64}, {64,65}, {64,66}, {64,67}, {64,68}, {64,69}, {64,70}, {64,71}, {64,72}, {64,73}, {64,74}, {64,75}, {64,76}, {64,77}, {64,78}, {64,79}, {64,80}, {64,81}, {64,82}, {64,83}, {64,84}, {64,85}, {64,86}, {64,87}, {64,88}, {64,89}, {64,90}, {64,92}, {64,93}, {65,0}, {65,1}, {65,2}, {65,3}, {64,91}, {65,12}, {65,4}, {65,5}, {65,6}, {65,7}, {65,8}, {65,9}, {65,10}, {65,11}, {65,14}, {65,15}, {65,16}, {65,17}, {65,13}, {65,18}, {65,19}, {65,20}, {65,21}, {65,22}, {65,23}, {65,24}, {65,25}, {65,26}, {65,27}, {65,28}, {65,29}, {65,30}, {65,31}, {65,32}, {65,33}, {65,34}, {65,36}, {65,37}, {65,35}, {65,38}, {65,39}, {65,40}, {65,41}, {65,42}, {65,43}, {65,44}, {65,45}, {65,46}, {65,47}, {65,48}, {65,49}, {65,50}, {65,51}, {65,52}, {65,53}, {65,54}, {65,55}, {65,56}, {65,57}, {65,58}, {65,59}, {65,60}, {65,61}, {65,62}, {65,63}, {65,64}, {65,65}, {65,66}, {65,67}, {65,68}, {65,69}, {65,70}, {65,71}, {65,72}, {65,73}, {65,74}, {65,75}, {65,76}, {65,77}, {65,78}, {65,79}, {65,80}, {65,81}, {65,82}, {65,83}, {65,84}, {65,85}, {65,86}, {65,87}, {65,88}, {65,89}, {65,90}, {65,91}, {65,92}, {65,93}, {66,0}, {66,1}, {66,2}, {66,3}, {66,4}, {66,5}, {66,6}, {66,7}, {66,8}, {66,9}, {66,10}, {66,11}, {66,12}, {66,13}, {66,14}, {66,15}, {66,16}, {66,17}, {66,18}, {66,19}, {66,20}, {66,21}, {66,22}, {66,23}, {66,24}, {66,25}, {66,26}, {66,27}, {66,28}, {66,29}, {66,30}, {66,31}, {66,32}, {66,33}, {66,34}, {66,35}, {66,36}, {66,37}, {66,38}, {66,39}, {66,40}, {66,41}, {66,42}, {66,43}, {66,44}, {66,45}, {66,46}, {66,47}, {66,48}, {66,49}, {66,50}, {66,51}, {66,52}, {66,53}, {66,54}, {66,55}, {66,56}, {66,57}, {66,58}, {66,59}, {66,60}, {66,61}, {66,62}, {66,63}, {66,64}, {66,65}, {66,66}, {66,67}, {66,68}, {66,69}, {66,70}, {66,71}, {66,72}, {66,73}, {66,74}, {66,75}, {66,76}, {66,77}, {66,78}, {66,79}, {66,80}, {66,81}, {66,82}, {66,83}, {66,84}, {66,85}, {66,86}, {66,87}, {66,88}, {66,89}, {66,90}, {66,91}, {66,92}, {66,93}, {67,0}, {67,1}, {67,2}, {67,3}, {67,4}, {67,5}, {67,6}, {67,7}, {67,8}, {67,9}, {67,10}, {67,11}, {67,12}, {67,13}, {67,14}, {67,15}, {67,16}, {67,17}, {67,18}, {67,19}, {67,20}, {67,21}, {67,22}, {67,23}, {67,24}, {67,25}, {67,26}, {67,27}, {67,28}, {67,29}, {67,30}, {67,31}, {67,32}, {67,33}, {67,34}, {67,35}, {67,36}, {67,37}, {67,38}, {67,39}, {67,40}, {67,41}, {67,42}, {67,43}, {67,44}, {67,45}, {67,46}, {67,47}, {67,48}, {67,49}, {67,50}, {67,51}, {67,52}, {67,53}, {67,54}, {67,55}, {67,56}, {67,57}, {67,58}, {67,59}, {67,60}, {67,61}, {67,62}, {67,63}, {67,64}, {67,65}, {67,66}, {67,67}, {67,68}, {67,69}, {67,70}, {67,71}, {67,72}, {67,73}, {67,74}, {67,75}, {67,76}, {67,77}, {67,78}, {67,79}, {67,80}, {67,81}, {67,82}, {67,83}, {67,84}, {67,85}, {67,86}, {67,87}, {67,88}, {67,89}, {67,90}, {67,91}, {67,92}, {67,93}, {68,0}, {68,1}, {68,2}, {68,3}, {68,4}, {68,5}, {68,6}, {68,7}, {68,8}, {68,9}, {68,10}, {68,11}, {68,12}, {68,13}, {68,14}, {68,15}, {68,16}, {68,17}, {68,18}, {68,19}, {68,20}, {68,26}, {68,21}, {68,22}, {68,23}, {68,24}, {68,25}, {68,27}, {68,28}, {68,29}, {68,30}, {68,31}, {68,32}, {68,33}, {68,34}, {68,35}, {68,36}, {68,37}, {68,38}, {68,39}, {68,40}, {68,41}, {68,42}, {68,43}, {68,44}, {68,46}, {68,47}, {68,45}, {68,48}, {68,49}, {68,50}, {68,51}, {68,52}, {68,53}, {68,54}, {68,55}, {68,56}, {68,57}, {68,58}, {68,59}, {68,60}, {68,61}, {68,62}, {68,63}, {68,64}, {68,65}, {68,66}, {68,67}, {68,68}, {68,69}, {68,71}, {68,70}, {68,72}, {68,73}, {68,74}, {68,75}, {68,76}, {68,77}, {68,78}, {68,79}, {68,80}, {68,81}, {68,82}, {68,83}, {68,84}, {68,85}, {68,86}, {68,87}, {68,88}, {68,89}, {68,91}, {68,90}, {68,92}, {68,93}, {69,0}, {69,1}, {69,2}, {69,3}, {69,4}, {69,5}, {69,6}, {69,7}, {69,8}, {69,9}, {69,10}, {69,11}, {69,12}, {69,13}, {69,14}, {69,15}, {69,16}, {69,17}, {69,18}, {69,19}, {69,20}, {69,21}, {69,22}, {69,23}, {69,24}, {69,25}, {69,26}, {69,27}, {69,28}, {69,29}, {69,30}, {69,31}, {69,32}, {69,33}, {69,34}, {69,35}, {69,36}, {69,37}, {69,38}, {69,39}, {69,40}, {69,41}, {69,42}, {69,43}, {69,44}, {69,45}, {69,46}, {69,47}, {69,48}, {69,49}, {69,50}, {69,51}, {69,52}, {69,53}, {69,54}, {69,55}, {69,56}, {69,57}, {69,58}, {69,59}, {69,60}, {69,61}, {69,62}, {69,63}, {69,64}, {69,65}, {69,66}, {69,67}, {69,68}, {69,69}, {69,70}, {69,71}, {69,72}, {69,73}, {69,74}, {69,75}, {69,76}, {69,77}, {69,78}, {69,79}, {69,80}, {69,81}, {69,82}, {69,84}, {69,85}, {69,86}, {69,87}, {69,88}, {69,89}, {69,90}, {69,91}, {69,92}, {69,93}, {70,0}, {70,1}, {70,2}, {70,3}, {70,4}, {70,5}, {70,6}, {70,7}, {70,8}, {70,9}, {70,10}, {70,11}, {70,12}, {70,13}, {70,14}, {70,15}, {70,16}, {70,17}, {70,18}, {70,19}, {70,20}, {70,21}, {70,22}, {70,23}, {70,24}, {70,25}, {70,26}, {70,27}, {70,28}, {70,29}, {70,30}, {70,31}, {70,32}, {70,33}, {70,34}, {70,35}, {70,36}, {70,37}, {70,38}, {70,39}, {70,40}, {70,41}, {70,42}, {70,43}, {70,44}, {70,45}, {70,46}, {70,47}, {70,48}, {70,49}, {70,50}, {70,51}, {70,52}, {70,53}, {70,54}, {70,55}, {70,56}, {70,57}, {70,58}, {70,59}, {70,60}, {70,61}, {70,62}, {70,63}, {70,64}, {70,65}, {70,66}, {70,67}, {70,68}, {70,69}, {70,73}, {70,70}, {70,71}, {70,72}, {70,74}, {70,75}, {70,76}, {70,77}, {70,78}, {70,79}, {70,80}, {70,81}, {70,82}, {70,83}, {70,85}, {70,86}, {70,87}, {70,88}, {70,84}, {70,89}, {70,90}, {70,91}, {70,92}, {71,7}, {70,93}, {71,0}, {71,1}, {71,2}, {71,3}, {71,4}, {71,5}, {71,6}, {71,8}, {71,9}, {71,10}, {71,11}, {71,12}, {71,13}, {71,14}, {71,15}, {71,16}, {71,17}, {71,18}, {71,19}, {71,20}, {71,21}, {71,22}, {71,23}, {71,24}, {71,25}, {71,26}, {71,27}, {71,28}, {71,29}, {71,30}, {71,31}, {71,32}, {71,33}, {71,34}, {71,35}, {71,36}, {71,37}, {71,38}, {71,39}, {71,40}, {71,41}, {71,42}, {71,43}, {71,44}, {71,45}, {71,46}, {71,47}, {71,48}, {71,49}, {71,50}, {71,51}, {71,52}, {71,53}, {71,54}, {71,55}, {71,56}, {71,57}, {71,58}, {71,59}, {71,60}, {71,61}, {71,62}, {71,63}, {71,64}, {71,65}, {71,66}, {71,67}, {71,68}, {71,69}, {71,70}, {71,71}, {71,72}, {71,73}, {71,74}, {71,75}, {71,76}, {71,77}, {71,78}, {71,79}, {71,80}, {71,81}, {71,82}, {71,83}, {71,84}, {71,85}, {71,86}, {71,87}, {71,88}, {71,89}, {71,90}, {71,91}, {71,92}, {71,93}, {72,0}, {72,1}, {72,2}, {72,3}, {72,4}, {72,5}, {72,6}, {72,7}, {72,8}, {72,9}, {72,10}, {72,11}, {72,12}, {72,13}, {72,14}, {72,15}, {72,16}, {72,17}, {72,18}, {72,19}, {72,20}, {72,21}, {72,22}, {72,23}, {72,24}, {72,25}, {72,26}, {72,27}, {72,28}, {72,29}, {72,30}, {72,31}, {72,32}, {72,33}, {72,34}, {72,35}, {72,36}, {72,37}, {72,38}, {72,39}, {72,40}, {72,41}, {72,43}, {72,44}, {72,42}, {72,45}, {72,46}, {72,47}, {72,48}, {72,49}, {72,50}, {72,51}, {72,52}, {72,53}, {72,54}, {72,55}, {72,56}, {72,57}, {72,58}, {72,59}, {72,60}, {72,61}, {72,62}, {72,63}, {72,64}, {72,65}, {72,66}, {72,67}, {72,68}, {72,69}, {72,70}, {72,71}, {72,72}, {72,73}, {72,74}, {72,75}, {72,76}, {72,77}, {72,78}, {72,79}, {72,80}, {72,81}, {72,82}, {72,83}, {72,84}, {72,85}, {72,86}, {72,87}, {72,88}, {72,89}, {72,90}, {72,91}, {72,92}, {72,93}, {73,0}, {73,1}, {73,2}, {73,3}, {73,4}, {73,5}, {73,6}, {73,7}, {73,8}, {73,9}, {73,10}, {73,11}, {73,12}, {73,13}, {73,14}, {73,15}, {73,16}, {73,17}, {73,18}, {73,19}, {73,20}, {73,21}, {73,22}, {73,23}, {73,24}, {73,25}, {73,26}, {73,27}, {73,28}, {73,29}, {73,30}, {73,31}, {73,32}, {73,33}, {73,34}, {73,35}, {73,36}, {73,37}, {73,38}, {73,39}, {73,40}, {73,41}, {73,42}, {73,43}, {73,44}, {73,45}, {73,46}, {73,47}, {73,48}, {73,49}, {73,50}, {73,51}, {73,52}, {73,53}, {73,54}, {73,55}, {73,56}, {73,57}, {73,58}, {73,59}, {73,60}, {73,61}, {73,62}, {73,63}, {73,64}, {73,65}, {73,66}, {73,67}, {73,68}, {73,69}, {73,70}, {73,71}, {73,72}, {73,73}, {73,74}, {73,75}, {73,76}, {73,77}, {73,78}, {73,79}, {73,80}, {73,81}, {73,82}, {73,83}, {73,84}, {73,85}, {73,86}, {73,87}, {73,88}, {73,89}, {73,90}, {73,91}, {73,92}, {73,93}, {74,0}, {74,1}, {74,2}, {74,3}, {74,4}, {74,5}, {74,6}, {74,7}, {74,8}, {74,9}, {74,10}, {74,11}, {74,12}, {74,13}, {74,14}, {74,15}, {74,16}, {74,17}, {74,18}, {74,19}, {74,20}, {74,21}, {74,22}, {74,23}, {74,24}, {74,25}, {74,26}, {74,27}, {74,28}, {74,29}, {74,30}, {74,31}, {74,32}, {74,33}, {74,34}, {74,35}, {74,36}, {74,37}, {74,38}, {74,39}, {74,40}, {74,47}, {74,41}, {74,42}, {74,43}, {74,44}, {74,49}, {74,45}, {74,46}, {74,48}, {74,50}, {74,51}, {74,52}, {74,53}, {74,54}, {74,55}, {74,56}, {74,57}, {74,58}, {74,59}, {74,61}, {74,60}, {74,62}, {74,63}, {74,64}, {74,65}, {74,66}, {74,67}, {74,68}, {74,69}, {74,70}, {74,71}, {74,72}, {74,73}, {74,74}, {74,76}, {74,77}, {74,78}, {74,75}, {74,79}, {74,80}, {74,81}, {74,82}, {74,83}, {74,85}, {74,84}, {74,86}, {74,87}, {74,88}, {74,89}, {74,90}, {74,91}, {74,92}, {74,93}, {75,0}, {75,1}, {75,2}, {75,3}, {75,4}, {75,5}, {75,6}, {75,7}, {75,8}, {75,9}, {75,10}, {75,11}, {75,12}, {75,13}, {75,14}, {75,15}, {75,16}, {75,17}, {75,18}, {75,19}, {75,20}, {75,21}, {75,22}, {75,23}, {75,24}, {75,25}, {75,26}, {75,27}, {75,28}, {75,29}, {75,30}, {75,31}, {75,32}, {75,33}, {75,34}, {75,35}, {75,36}, {75,37}, {75,38}, {75,39}, {75,40}, {75,41}, {75,42}, {75,43}, {75,45}, {75,46}, {75,44}, {75,47}, {75,48}, {75,49}, {75,50}, {75,51}, {75,52}, {75,53}, {75,54}, {75,55}, {75,56}, {75,57}, {75,58}, {75,59}, {75,60}, {75,61}, {75,62}, {75,63}, {75,64}, {75,65}, {75,66}, {75,67}, {75,68}, {75,69}, {75,70}, {75,71}, {75,72}, {75,73}, {75,74}, {75,75}, {75,76}, {75,77}, {75,78}, {75,79}, {75,80}, {75,81}, {75,82}, {75,83}, {75,84}, {75,85}, {75,86}, {75,87}, {75,88}, {75,89}, {75,90}, {75,91}, {75,92}, {75,93}, {76,0}, {76,1}, {76,2}, {76,3}, {76,4}, {76,5}, {76,6}, {76,7}, {76,8}, {76,9}, {76,10}, {76,11}, {76,12}, {76,13}, {76,14}, {76,15}, {76,16}, {76,17}, {76,18}, {76,19}, {76,20}, {76,21}, {76,22}, {76,23}, {76,24}, {76,25}, {76,26}, {76,27}, {76,28}, {76,29}, {76,30}, {76,31}, {76,32}, {76,33}, {76,34}, {76,35}, {76,36}, {76,37}, {76,38}, {76,39}, {76,40}, {76,41}, {76,42}, {76,43}, {76,44}, {76,45}, {76,46}, {76,47}, {76,48}, {76,49}, {76,50}, {76,51}, {76,52}, {76,53}, {76,54}, {76,55}, {76,56}, {76,57}, {76,58}, {76,59}, {76,60}, {76,61}, {76,62}, {76,63}, {76,64}, {76,65}, {76,66} }; /* This returns ERROR if the code point doesn't exist. */ long int jisx0212_to_unicode(int r, int c) { assert(r >= 0 && r < 94); assert(c >= 0 && c < 94); return jisx0212_forward[r][c]; } /* This one returns 1 on success, 0 if the code point doesn't exist. */ int unicode_to_jisx0212(long int unicode, int *r, int *c) { int rr, cc; long int uu; int i, j, k; i = -1; j = lenof(jisx0212_backward); while (j - i > 1) { k = (i + j) / 2; rr = jisx0212_backward[k].r; cc = jisx0212_backward[k].c; uu = jisx0212_forward[rr][cc]; if (unicode > uu) i = k; else if (unicode < uu) j = k; else { *r = rr; *c = cc; return 1; } } return 0; } #ifdef TESTMODE #include <stdio.h> int main(void) { int r, c, rr, cc, ret; long int u, uu; for (r = 0; r < 94; r++) { for (c = 0; c < 94; c++) { u = jisx0212_to_unicode(r, c); if (u != ERROR) { ret = unicode_to_jisx0212(u, &rr, &cc); if (!ret) printf("(%d,%d) -> U-%08lx but didn't convert back\n", r, c, u); else if (rr != r || cc != c) printf("(%d,%d) -> U-%08lx -> (%d,%d)\n", r, c, u, rr, cc); } } } for (u = 0; u < 0x10000L; u++) { ret = unicode_to_jisx0212(u, &r, &c); if (ret) { uu = jisx0212_to_unicode(r, c); if (uu == ERROR) printf("U-%08lx -> (%d,%d) but didn't convert back\n", u, r, c); else if (uu != u) printf("U-%08lx -> (%d,%d) -> U-%08lx\n", u, r, c, uu); } } return 0; } #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/ksx1001.c�����������������������������������������������������������������������0000644�0001753�0001753�00001373511�12444773746�012673� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * KS X 1001 and MS CP949 implementation for libcharset. */ #include <assert.h> #include "charset.h" #include "internal.h" /* * There is a KS X 1001 <-> Unicode character mapping available at * http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/KSC/KSX1001.TXT * * but in fact the square (A1A1-FEFE) subset of the Microsoft CP949 * mapping is superior, since it's slightly more up to date * (contains the Euro sign, for example). So this file actually * implements a mapping between the double-byte portion of CP949 * and Unicode, and also provides ksx1001 conversion functions to * access that square subset. * * The file I'm actually working from is at * http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT */ /* * Mapping from KS X 1001 to Unicode. For these purposes KS X 1001 * is considered to be a 128x192 square array, with coordinates * running from (0,0) to (127,191). * * Generated by running the following sh+Perl over CP949.TXT: cat CP949.TXT | \ perl -ne '$a{hex$1,hex$2}=$3 if /^0x(\S\S)(\S\S)\s+(0x\S+)\s/;' \ -e 'END {for $r (0..127) { $o=" {"; for $c (0..191) {' \ -e '$k=$a{$r+128,$c+64}; $k=" ERROR" unless defined $k;' \ -e '$o .= ", " if $c > 0; (print "$o\n"), $o=" " if length $o > 70;' \ -e '$o .= $k; } print "$o},\n"; }}' */ static const unsigned short cp949_forward[128][192] = { { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xAC02, 0xAC03, 0xAC05, 0xAC06, 0xAC0B, 0xAC0C, 0xAC0D, 0xAC0E, 0xAC0F, 0xAC18, 0xAC1E, 0xAC1F, 0xAC21, 0xAC22, 0xAC23, 0xAC25, 0xAC26, 0xAC27, 0xAC28, 0xAC29, 0xAC2A, 0xAC2B, 0xAC2E, 0xAC32, 0xAC33, 0xAC34, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xAC35, 0xAC36, 0xAC37, 0xAC3A, 0xAC3B, 0xAC3D, 0xAC3E, 0xAC3F, 0xAC41, 0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47, 0xAC48, 0xAC49, 0xAC4A, 0xAC4C, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53, 0xAC55, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xAC56, 0xAC57, 0xAC59, 0xAC5A, 0xAC5B, 0xAC5D, 0xAC5E, 0xAC5F, 0xAC60, 0xAC61, 0xAC62, 0xAC63, 0xAC64, 0xAC65, 0xAC66, 0xAC67, 0xAC68, 0xAC69, 0xAC6A, 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E, 0xAC6F, 0xAC72, 0xAC73, 0xAC75, 0xAC76, 0xAC79, 0xAC7B, 0xAC7C, 0xAC7D, 0xAC7E, 0xAC7F, 0xAC82, 0xAC87, 0xAC88, 0xAC8D, 0xAC8E, 0xAC8F, 0xAC91, 0xAC92, 0xAC93, 0xAC95, 0xAC96, 0xAC97, 0xAC98, 0xAC99, 0xAC9A, 0xAC9B, 0xAC9E, 0xACA2, 0xACA3, 0xACA4, 0xACA5, 0xACA6, 0xACA7, 0xACAB, 0xACAD, 0xACAE, 0xACB1, 0xACB2, 0xACB3, 0xACB4, 0xACB5, 0xACB6, 0xACB7, 0xACBA, 0xACBE, 0xACBF, 0xACC0, 0xACC2, 0xACC3, 0xACC5, 0xACC6, 0xACC7, 0xACC9, 0xACCA, 0xACCB, 0xACCD, 0xACCE, 0xACCF, 0xACD0, 0xACD1, 0xACD2, 0xACD3, 0xACD4, 0xACD6, 0xACD8, 0xACD9, 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE, 0xACDF, 0xACE2, 0xACE3, 0xACE5, 0xACE6, 0xACE9, 0xACEB, 0xACED, 0xACEE, 0xACF2, 0xACF4, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB, 0xACFE, 0xACFF, 0xAD01, 0xAD02, 0xAD03, 0xAD05, 0xAD07, 0xAD08, 0xAD09, 0xAD0A, 0xAD0B, 0xAD0E, 0xAD10, 0xAD12, 0xAD13, ERROR}, { ERROR, 0xAD14, 0xAD15, 0xAD16, 0xAD17, 0xAD19, 0xAD1A, 0xAD1B, 0xAD1D, 0xAD1E, 0xAD1F, 0xAD21, 0xAD22, 0xAD23, 0xAD24, 0xAD25, 0xAD26, 0xAD27, 0xAD28, 0xAD2A, 0xAD2B, 0xAD2E, 0xAD2F, 0xAD30, 0xAD31, 0xAD32, 0xAD33, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xAD36, 0xAD37, 0xAD39, 0xAD3A, 0xAD3B, 0xAD3D, 0xAD3E, 0xAD3F, 0xAD40, 0xAD41, 0xAD42, 0xAD43, 0xAD46, 0xAD48, 0xAD4A, 0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD51, 0xAD52, 0xAD53, 0xAD55, 0xAD56, 0xAD57, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D, 0xAD5E, 0xAD5F, 0xAD60, 0xAD62, 0xAD64, 0xAD65, 0xAD66, 0xAD67, 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6E, 0xAD6F, 0xAD71, 0xAD72, 0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7E, 0xAD80, 0xAD83, 0xAD84, 0xAD85, 0xAD86, 0xAD87, 0xAD8A, 0xAD8B, 0xAD8D, 0xAD8E, 0xAD8F, 0xAD91, 0xAD92, 0xAD93, 0xAD94, 0xAD95, 0xAD96, 0xAD97, 0xAD98, 0xAD99, 0xAD9A, 0xAD9B, 0xAD9E, 0xAD9F, 0xADA0, 0xADA1, 0xADA2, 0xADA3, 0xADA5, 0xADA6, 0xADA7, 0xADA8, 0xADA9, 0xADAA, 0xADAB, 0xADAC, 0xADAD, 0xADAE, 0xADAF, 0xADB0, 0xADB1, 0xADB2, 0xADB3, 0xADB4, 0xADB5, 0xADB6, 0xADB8, 0xADB9, 0xADBA, 0xADBB, 0xADBC, 0xADBD, 0xADBE, 0xADBF, 0xADC2, 0xADC3, 0xADC5, 0xADC6, 0xADC7, 0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE, 0xADCF, 0xADD2, 0xADD4, 0xADD5, 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB, 0xADDD, 0xADDE, 0xADDF, 0xADE1, 0xADE2, 0xADE3, 0xADE5, 0xADE6, 0xADE7, 0xADE8, 0xADE9, 0xADEA, 0xADEB, 0xADEC, 0xADED, 0xADEE, 0xADEF, 0xADF0, 0xADF1, 0xADF2, 0xADF3, 0xADF4, 0xADF5, 0xADF6, 0xADF7, ERROR}, { ERROR, 0xADFA, 0xADFB, 0xADFD, 0xADFE, 0xAE02, 0xAE03, 0xAE04, 0xAE05, 0xAE06, 0xAE07, 0xAE0A, 0xAE0C, 0xAE0E, 0xAE0F, 0xAE10, 0xAE11, 0xAE12, 0xAE13, 0xAE15, 0xAE16, 0xAE17, 0xAE18, 0xAE19, 0xAE1A, 0xAE1B, 0xAE1C, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xAE1D, 0xAE1E, 0xAE1F, 0xAE20, 0xAE21, 0xAE22, 0xAE23, 0xAE24, 0xAE25, 0xAE26, 0xAE27, 0xAE28, 0xAE29, 0xAE2A, 0xAE2B, 0xAE2C, 0xAE2D, 0xAE2E, 0xAE2F, 0xAE32, 0xAE33, 0xAE35, 0xAE36, 0xAE39, 0xAE3B, 0xAE3C, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xAE3D, 0xAE3E, 0xAE3F, 0xAE42, 0xAE44, 0xAE47, 0xAE48, 0xAE49, 0xAE4B, 0xAE4F, 0xAE51, 0xAE52, 0xAE53, 0xAE55, 0xAE57, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B, 0xAE5E, 0xAE62, 0xAE63, 0xAE64, 0xAE66, 0xAE67, 0xAE6A, 0xAE6B, 0xAE6D, 0xAE6E, 0xAE6F, 0xAE71, 0xAE72, 0xAE73, 0xAE74, 0xAE75, 0xAE76, 0xAE77, 0xAE7A, 0xAE7E, 0xAE7F, 0xAE80, 0xAE81, 0xAE82, 0xAE83, 0xAE86, 0xAE87, 0xAE88, 0xAE89, 0xAE8A, 0xAE8B, 0xAE8D, 0xAE8E, 0xAE8F, 0xAE90, 0xAE91, 0xAE92, 0xAE93, 0xAE94, 0xAE95, 0xAE96, 0xAE97, 0xAE98, 0xAE99, 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D, 0xAE9E, 0xAE9F, 0xAEA0, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4, 0xAEA5, 0xAEA6, 0xAEA7, 0xAEA8, 0xAEA9, 0xAEAA, 0xAEAB, 0xAEAC, 0xAEAD, 0xAEAE, 0xAEAF, 0xAEB0, 0xAEB1, 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5, 0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, 0xAEBB, 0xAEBF, 0xAEC1, 0xAEC2, 0xAEC3, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, 0xAEC9, 0xAECA, 0xAECB, 0xAECE, 0xAED2, 0xAED3, 0xAED4, 0xAED5, 0xAED6, 0xAED7, 0xAEDA, 0xAEDB, 0xAEDD, 0xAEDE, 0xAEDF, 0xAEE0, 0xAEE1, 0xAEE2, 0xAEE3, 0xAEE4, 0xAEE5, ERROR}, { ERROR, 0xAEE6, 0xAEE7, 0xAEE9, 0xAEEA, 0xAEEC, 0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, 0xAEF5, 0xAEF6, 0xAEF7, 0xAEF9, 0xAEFA, 0xAEFB, 0xAEFD, 0xAEFE, 0xAEFF, 0xAF00, 0xAF01, 0xAF02, 0xAF03, 0xAF04, 0xAF05, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xAF06, 0xAF09, 0xAF0A, 0xAF0B, 0xAF0C, 0xAF0E, 0xAF0F, 0xAF11, 0xAF12, 0xAF13, 0xAF14, 0xAF15, 0xAF16, 0xAF17, 0xAF18, 0xAF19, 0xAF1A, 0xAF1B, 0xAF1C, 0xAF1D, 0xAF1E, 0xAF1F, 0xAF20, 0xAF21, 0xAF22, 0xAF23, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xAF24, 0xAF25, 0xAF26, 0xAF27, 0xAF28, 0xAF29, 0xAF2A, 0xAF2B, 0xAF2E, 0xAF2F, 0xAF31, 0xAF33, 0xAF35, 0xAF36, 0xAF37, 0xAF38, 0xAF39, 0xAF3A, 0xAF3B, 0xAF3E, 0xAF40, 0xAF44, 0xAF45, 0xAF46, 0xAF47, 0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, 0xAF51, 0xAF52, 0xAF53, 0xAF54, 0xAF55, 0xAF56, 0xAF57, 0xAF58, 0xAF59, 0xAF5A, 0xAF5B, 0xAF5E, 0xAF5F, 0xAF60, 0xAF61, 0xAF62, 0xAF63, 0xAF66, 0xAF67, 0xAF68, 0xAF69, 0xAF6A, 0xAF6B, 0xAF6C, 0xAF6D, 0xAF6E, 0xAF6F, 0xAF70, 0xAF71, 0xAF72, 0xAF73, 0xAF74, 0xAF75, 0xAF76, 0xAF77, 0xAF78, 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, 0xAF7E, 0xAF7F, 0xAF81, 0xAF82, 0xAF83, 0xAF85, 0xAF86, 0xAF87, 0xAF89, 0xAF8A, 0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, 0xAF8F, 0xAF92, 0xAF93, 0xAF94, 0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, 0xAF9D, 0xAF9E, 0xAF9F, 0xAFA0, 0xAFA1, 0xAFA2, 0xAFA3, 0xAFA4, 0xAFA5, 0xAFA6, 0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA, 0xAFAB, 0xAFAC, 0xAFAD, 0xAFAE, 0xAFAF, 0xAFB0, 0xAFB1, 0xAFB2, 0xAFB3, 0xAFB4, 0xAFB5, 0xAFB6, 0xAFB7, 0xAFBA, 0xAFBB, 0xAFBD, 0xAFBE, ERROR}, { ERROR, 0xAFBF, 0xAFC1, 0xAFC2, 0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6, 0xAFCA, 0xAFCC, 0xAFCF, 0xAFD0, 0xAFD1, 0xAFD2, 0xAFD3, 0xAFD5, 0xAFD6, 0xAFD7, 0xAFD8, 0xAFD9, 0xAFDA, 0xAFDB, 0xAFDD, 0xAFDE, 0xAFDF, 0xAFE0, 0xAFE1, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xAFE2, 0xAFE3, 0xAFE4, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFEA, 0xAFEB, 0xAFEC, 0xAFED, 0xAFEE, 0xAFEF, 0xAFF2, 0xAFF3, 0xAFF5, 0xAFF6, 0xAFF7, 0xAFF9, 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, 0xAFFF, 0xB002, 0xB003, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB005, 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B, 0xB00D, 0xB00E, 0xB00F, 0xB011, 0xB012, 0xB013, 0xB015, 0xB016, 0xB017, 0xB018, 0xB019, 0xB01A, 0xB01B, 0xB01E, 0xB01F, 0xB020, 0xB021, 0xB022, 0xB023, 0xB024, 0xB025, 0xB026, 0xB027, 0xB029, 0xB02A, 0xB02B, 0xB02C, 0xB02D, 0xB02E, 0xB02F, 0xB030, 0xB031, 0xB032, 0xB033, 0xB034, 0xB035, 0xB036, 0xB037, 0xB038, 0xB039, 0xB03A, 0xB03B, 0xB03C, 0xB03D, 0xB03E, 0xB03F, 0xB040, 0xB041, 0xB042, 0xB043, 0xB046, 0xB047, 0xB049, 0xB04B, 0xB04D, 0xB04F, 0xB050, 0xB051, 0xB052, 0xB056, 0xB058, 0xB05A, 0xB05B, 0xB05C, 0xB05E, 0xB05F, 0xB060, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065, 0xB066, 0xB067, 0xB068, 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D, 0xB06E, 0xB06F, 0xB070, 0xB071, 0xB072, 0xB073, 0xB074, 0xB075, 0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, 0xB07B, 0xB07E, 0xB07F, 0xB081, 0xB082, 0xB083, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089, 0xB08A, 0xB08B, 0xB08E, 0xB090, 0xB092, 0xB093, 0xB094, 0xB095, 0xB096, 0xB097, 0xB09B, 0xB09D, 0xB09E, 0xB0A3, 0xB0A4, ERROR}, { ERROR, 0xB0A5, 0xB0A6, 0xB0A7, 0xB0AA, 0xB0B0, 0xB0B2, 0xB0B6, 0xB0B7, 0xB0B9, 0xB0BA, 0xB0BB, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, 0xB0C1, 0xB0C2, 0xB0C3, 0xB0C6, 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, 0xB0CE, 0xB0CF, 0xB0D2, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB0D3, 0xB0D5, 0xB0D6, 0xB0D7, 0xB0D9, 0xB0DA, 0xB0DB, 0xB0DC, 0xB0DD, 0xB0DE, 0xB0DF, 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4, 0xB0E6, 0xB0E7, 0xB0E8, 0xB0E9, 0xB0EA, 0xB0EB, 0xB0EC, 0xB0ED, 0xB0EE, 0xB0EF, 0xB0F0, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB0F1, 0xB0F2, 0xB0F3, 0xB0F4, 0xB0F5, 0xB0F6, 0xB0F7, 0xB0F8, 0xB0F9, 0xB0FA, 0xB0FB, 0xB0FC, 0xB0FD, 0xB0FE, 0xB0FF, 0xB100, 0xB101, 0xB102, 0xB103, 0xB104, 0xB105, 0xB106, 0xB107, 0xB10A, 0xB10D, 0xB10E, 0xB10F, 0xB111, 0xB114, 0xB115, 0xB116, 0xB117, 0xB11A, 0xB11E, 0xB11F, 0xB120, 0xB121, 0xB122, 0xB126, 0xB127, 0xB129, 0xB12A, 0xB12B, 0xB12D, 0xB12E, 0xB12F, 0xB130, 0xB131, 0xB132, 0xB133, 0xB136, 0xB13A, 0xB13B, 0xB13C, 0xB13D, 0xB13E, 0xB13F, 0xB142, 0xB143, 0xB145, 0xB146, 0xB147, 0xB149, 0xB14A, 0xB14B, 0xB14C, 0xB14D, 0xB14E, 0xB14F, 0xB152, 0xB153, 0xB156, 0xB157, 0xB159, 0xB15A, 0xB15B, 0xB15D, 0xB15E, 0xB15F, 0xB161, 0xB162, 0xB163, 0xB164, 0xB165, 0xB166, 0xB167, 0xB168, 0xB169, 0xB16A, 0xB16B, 0xB16C, 0xB16D, 0xB16E, 0xB16F, 0xB170, 0xB171, 0xB172, 0xB173, 0xB174, 0xB175, 0xB176, 0xB177, 0xB17A, 0xB17B, 0xB17D, 0xB17E, 0xB17F, 0xB181, 0xB183, 0xB184, 0xB185, 0xB186, 0xB187, 0xB18A, 0xB18C, 0xB18E, 0xB18F, 0xB190, 0xB191, 0xB195, 0xB196, 0xB197, 0xB199, 0xB19A, 0xB19B, 0xB19D, ERROR}, { ERROR, 0xB19E, 0xB19F, 0xB1A0, 0xB1A1, 0xB1A2, 0xB1A3, 0xB1A4, 0xB1A5, 0xB1A6, 0xB1A7, 0xB1A9, 0xB1AA, 0xB1AB, 0xB1AC, 0xB1AD, 0xB1AE, 0xB1AF, 0xB1B0, 0xB1B1, 0xB1B2, 0xB1B3, 0xB1B4, 0xB1B5, 0xB1B6, 0xB1B7, 0xB1B8, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB1B9, 0xB1BA, 0xB1BB, 0xB1BC, 0xB1BD, 0xB1BE, 0xB1BF, 0xB1C0, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, 0xB1C5, 0xB1C6, 0xB1C7, 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB, 0xB1CD, 0xB1CE, 0xB1CF, 0xB1D1, 0xB1D2, 0xB1D3, 0xB1D5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB1D6, 0xB1D7, 0xB1D8, 0xB1D9, 0xB1DA, 0xB1DB, 0xB1DE, 0xB1E0, 0xB1E1, 0xB1E2, 0xB1E3, 0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, 0xB1EA, 0xB1EB, 0xB1ED, 0xB1EE, 0xB1EF, 0xB1F1, 0xB1F2, 0xB1F3, 0xB1F4, 0xB1F5, 0xB1F6, 0xB1F7, 0xB1F8, 0xB1FA, 0xB1FC, 0xB1FE, 0xB1FF, 0xB200, 0xB201, 0xB202, 0xB203, 0xB206, 0xB207, 0xB209, 0xB20A, 0xB20D, 0xB20E, 0xB20F, 0xB210, 0xB211, 0xB212, 0xB213, 0xB216, 0xB218, 0xB21A, 0xB21B, 0xB21C, 0xB21D, 0xB21E, 0xB21F, 0xB221, 0xB222, 0xB223, 0xB224, 0xB225, 0xB226, 0xB227, 0xB228, 0xB229, 0xB22A, 0xB22B, 0xB22C, 0xB22D, 0xB22E, 0xB22F, 0xB230, 0xB231, 0xB232, 0xB233, 0xB235, 0xB236, 0xB237, 0xB238, 0xB239, 0xB23A, 0xB23B, 0xB23D, 0xB23E, 0xB23F, 0xB240, 0xB241, 0xB242, 0xB243, 0xB244, 0xB245, 0xB246, 0xB247, 0xB248, 0xB249, 0xB24A, 0xB24B, 0xB24C, 0xB24D, 0xB24E, 0xB24F, 0xB250, 0xB251, 0xB252, 0xB253, 0xB254, 0xB255, 0xB256, 0xB257, 0xB259, 0xB25A, 0xB25B, 0xB25D, 0xB25E, 0xB25F, 0xB261, 0xB262, 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, 0xB26A, 0xB26B, 0xB26C, 0xB26D, 0xB26E, ERROR}, { ERROR, 0xB26F, 0xB270, 0xB271, 0xB272, 0xB273, 0xB276, 0xB277, 0xB278, 0xB279, 0xB27A, 0xB27B, 0xB27D, 0xB27E, 0xB27F, 0xB280, 0xB281, 0xB282, 0xB283, 0xB286, 0xB287, 0xB288, 0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB28F, 0xB292, 0xB293, 0xB295, 0xB296, 0xB297, 0xB29B, 0xB29C, 0xB29D, 0xB29E, 0xB29F, 0xB2A2, 0xB2A4, 0xB2A7, 0xB2A8, 0xB2A9, 0xB2AB, 0xB2AD, 0xB2AE, 0xB2AF, 0xB2B1, 0xB2B2, 0xB2B3, 0xB2B5, 0xB2B6, 0xB2B7, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB2B8, 0xB2B9, 0xB2BA, 0xB2BB, 0xB2BC, 0xB2BD, 0xB2BE, 0xB2BF, 0xB2C0, 0xB2C1, 0xB2C2, 0xB2C3, 0xB2C4, 0xB2C5, 0xB2C6, 0xB2C7, 0xB2CA, 0xB2CB, 0xB2CD, 0xB2CE, 0xB2CF, 0xB2D1, 0xB2D3, 0xB2D4, 0xB2D5, 0xB2D6, 0xB2D7, 0xB2DA, 0xB2DC, 0xB2DE, 0xB2DF, 0xB2E0, 0xB2E1, 0xB2E3, 0xB2E7, 0xB2E9, 0xB2EA, 0xB2F0, 0xB2F1, 0xB2F2, 0xB2F6, 0xB2FC, 0xB2FD, 0xB2FE, 0xB302, 0xB303, 0xB305, 0xB306, 0xB307, 0xB309, 0xB30A, 0xB30B, 0xB30C, 0xB30D, 0xB30E, 0xB30F, 0xB312, 0xB316, 0xB317, 0xB318, 0xB319, 0xB31A, 0xB31B, 0xB31D, 0xB31E, 0xB31F, 0xB320, 0xB321, 0xB322, 0xB323, 0xB324, 0xB325, 0xB326, 0xB327, 0xB328, 0xB329, 0xB32A, 0xB32B, 0xB32C, 0xB32D, 0xB32E, 0xB32F, 0xB330, 0xB331, 0xB332, 0xB333, 0xB334, 0xB335, 0xB336, 0xB337, 0xB338, 0xB339, 0xB33A, 0xB33B, 0xB33C, 0xB33D, 0xB33E, 0xB33F, 0xB340, 0xB341, 0xB342, 0xB343, 0xB344, 0xB345, 0xB346, 0xB347, 0xB348, 0xB349, 0xB34A, 0xB34B, 0xB34C, 0xB34D, 0xB34E, 0xB34F, 0xB350, 0xB351, 0xB352, 0xB353, 0xB357, 0xB359, 0xB35A, 0xB35D, 0xB360, 0xB361, 0xB362, 0xB363, ERROR}, { ERROR, 0xB366, 0xB368, 0xB36A, 0xB36C, 0xB36D, 0xB36F, 0xB372, 0xB373, 0xB375, 0xB376, 0xB377, 0xB379, 0xB37A, 0xB37B, 0xB37C, 0xB37D, 0xB37E, 0xB37F, 0xB382, 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, 0xB38D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB38E, 0xB38F, 0xB391, 0xB392, 0xB393, 0xB395, 0xB396, 0xB397, 0xB398, 0xB399, 0xB39A, 0xB39B, 0xB39C, 0xB39D, 0xB39E, 0xB39F, 0xB3A2, 0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0xB3A9, 0xB3AA, 0xB3AB, 0xB3AD, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB3AE, 0xB3AF, 0xB3B0, 0xB3B1, 0xB3B2, 0xB3B3, 0xB3B4, 0xB3B5, 0xB3B6, 0xB3B7, 0xB3B8, 0xB3B9, 0xB3BA, 0xB3BB, 0xB3BC, 0xB3BD, 0xB3BE, 0xB3BF, 0xB3C0, 0xB3C1, 0xB3C2, 0xB3C3, 0xB3C6, 0xB3C7, 0xB3C9, 0xB3CA, 0xB3CD, 0xB3CF, 0xB3D1, 0xB3D2, 0xB3D3, 0xB3D6, 0xB3D8, 0xB3DA, 0xB3DC, 0xB3DE, 0xB3DF, 0xB3E1, 0xB3E2, 0xB3E3, 0xB3E5, 0xB3E6, 0xB3E7, 0xB3E9, 0xB3EA, 0xB3EB, 0xB3EC, 0xB3ED, 0xB3EE, 0xB3EF, 0xB3F0, 0xB3F1, 0xB3F2, 0xB3F3, 0xB3F4, 0xB3F5, 0xB3F6, 0xB3F7, 0xB3F8, 0xB3F9, 0xB3FA, 0xB3FB, 0xB3FD, 0xB3FE, 0xB3FF, 0xB400, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405, 0xB406, 0xB407, 0xB408, 0xB409, 0xB40A, 0xB40B, 0xB40C, 0xB40D, 0xB40E, 0xB40F, 0xB411, 0xB412, 0xB413, 0xB414, 0xB415, 0xB416, 0xB417, 0xB419, 0xB41A, 0xB41B, 0xB41D, 0xB41E, 0xB41F, 0xB421, 0xB422, 0xB423, 0xB424, 0xB425, 0xB426, 0xB427, 0xB42A, 0xB42C, 0xB42D, 0xB42E, 0xB42F, 0xB430, 0xB431, 0xB432, 0xB433, 0xB435, 0xB436, 0xB437, 0xB438, 0xB439, 0xB43A, 0xB43B, 0xB43C, 0xB43D, 0xB43E, 0xB43F, 0xB440, 0xB441, 0xB442, 0xB443, 0xB444, ERROR}, { ERROR, 0xB445, 0xB446, 0xB447, 0xB448, 0xB449, 0xB44A, 0xB44B, 0xB44C, 0xB44D, 0xB44E, 0xB44F, 0xB452, 0xB453, 0xB455, 0xB456, 0xB457, 0xB459, 0xB45A, 0xB45B, 0xB45C, 0xB45D, 0xB45E, 0xB45F, 0xB462, 0xB464, 0xB466, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, 0xB46D, 0xB46E, 0xB46F, 0xB470, 0xB471, 0xB472, 0xB473, 0xB474, 0xB475, 0xB476, 0xB477, 0xB478, 0xB479, 0xB47A, 0xB47B, 0xB47C, 0xB47D, 0xB47E, 0xB47F, 0xB481, 0xB482, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB483, 0xB484, 0xB485, 0xB486, 0xB487, 0xB489, 0xB48A, 0xB48B, 0xB48C, 0xB48D, 0xB48E, 0xB48F, 0xB490, 0xB491, 0xB492, 0xB493, 0xB494, 0xB495, 0xB496, 0xB497, 0xB498, 0xB499, 0xB49A, 0xB49B, 0xB49C, 0xB49E, 0xB49F, 0xB4A0, 0xB4A1, 0xB4A2, 0xB4A3, 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A9, 0xB4AA, 0xB4AB, 0xB4AD, 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2, 0xB4B3, 0xB4B4, 0xB4B6, 0xB4B8, 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF, 0xB4C1, 0xB4C2, 0xB4C3, 0xB4C5, 0xB4C6, 0xB4C7, 0xB4C9, 0xB4CA, 0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE, 0xB4CF, 0xB4D1, 0xB4D2, 0xB4D3, 0xB4D4, 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, 0xB4DA, 0xB4DB, 0xB4DE, 0xB4DF, 0xB4E1, 0xB4E2, 0xB4E5, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA, 0xB4EB, 0xB4EE, 0xB4F0, 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, 0xB4F6, 0xB4F7, 0xB4F9, 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, 0xB4FE, 0xB4FF, 0xB500, 0xB501, 0xB502, 0xB503, 0xB504, 0xB505, 0xB506, 0xB507, 0xB508, 0xB509, 0xB50A, 0xB50B, 0xB50C, 0xB50D, 0xB50E, 0xB50F, 0xB510, 0xB511, 0xB512, 0xB513, 0xB516, 0xB517, 0xB519, 0xB51A, 0xB51D, ERROR}, { ERROR, 0xB51E, 0xB51F, 0xB520, 0xB521, 0xB522, 0xB523, 0xB526, 0xB52B, 0xB52C, 0xB52D, 0xB52E, 0xB52F, 0xB532, 0xB533, 0xB535, 0xB536, 0xB537, 0xB539, 0xB53A, 0xB53B, 0xB53C, 0xB53D, 0xB53E, 0xB53F, 0xB542, 0xB546, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54E, 0xB54F, 0xB551, 0xB552, 0xB553, 0xB555, 0xB556, 0xB557, 0xB558, 0xB559, 0xB55A, 0xB55B, 0xB55E, 0xB562, 0xB563, 0xB564, 0xB565, 0xB566, 0xB567, 0xB568, 0xB569, 0xB56A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB56B, 0xB56C, 0xB56D, 0xB56E, 0xB56F, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575, 0xB576, 0xB577, 0xB578, 0xB579, 0xB57A, 0xB57B, 0xB57C, 0xB57D, 0xB57E, 0xB57F, 0xB580, 0xB581, 0xB582, 0xB583, 0xB584, 0xB585, 0xB586, 0xB587, 0xB588, 0xB589, 0xB58A, 0xB58B, 0xB58C, 0xB58D, 0xB58E, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593, 0xB594, 0xB595, 0xB596, 0xB597, 0xB598, 0xB599, 0xB59A, 0xB59B, 0xB59C, 0xB59D, 0xB59E, 0xB59F, 0xB5A2, 0xB5A3, 0xB5A5, 0xB5A6, 0xB5A7, 0xB5A9, 0xB5AC, 0xB5AD, 0xB5AE, 0xB5AF, 0xB5B2, 0xB5B6, 0xB5B7, 0xB5B8, 0xB5B9, 0xB5BA, 0xB5BE, 0xB5BF, 0xB5C1, 0xB5C2, 0xB5C3, 0xB5C5, 0xB5C6, 0xB5C7, 0xB5C8, 0xB5C9, 0xB5CA, 0xB5CB, 0xB5CE, 0xB5D2, 0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, 0xB5D7, 0xB5D9, 0xB5DA, 0xB5DB, 0xB5DC, 0xB5DD, 0xB5DE, 0xB5DF, 0xB5E0, 0xB5E1, 0xB5E2, 0xB5E3, 0xB5E4, 0xB5E5, 0xB5E6, 0xB5E7, 0xB5E8, 0xB5E9, 0xB5EA, 0xB5EB, 0xB5ED, 0xB5EE, 0xB5EF, 0xB5F0, 0xB5F1, 0xB5F2, 0xB5F3, 0xB5F4, 0xB5F5, 0xB5F6, 0xB5F7, 0xB5F8, 0xB5F9, 0xB5FA, 0xB5FB, 0xB5FC, 0xB5FD, 0xB5FE, 0xB5FF, ERROR}, { ERROR, 0xB600, 0xB601, 0xB602, 0xB603, 0xB604, 0xB605, 0xB606, 0xB607, 0xB608, 0xB609, 0xB60A, 0xB60B, 0xB60C, 0xB60D, 0xB60E, 0xB60F, 0xB612, 0xB613, 0xB615, 0xB616, 0xB617, 0xB619, 0xB61A, 0xB61B, 0xB61C, 0xB61D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB61E, 0xB61F, 0xB620, 0xB621, 0xB622, 0xB623, 0xB624, 0xB626, 0xB627, 0xB628, 0xB629, 0xB62A, 0xB62B, 0xB62D, 0xB62E, 0xB62F, 0xB630, 0xB631, 0xB632, 0xB633, 0xB635, 0xB636, 0xB637, 0xB638, 0xB639, 0xB63A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB63B, 0xB63C, 0xB63D, 0xB63E, 0xB63F, 0xB640, 0xB641, 0xB642, 0xB643, 0xB644, 0xB645, 0xB646, 0xB647, 0xB649, 0xB64A, 0xB64B, 0xB64C, 0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, 0xB653, 0xB654, 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, 0xB65B, 0xB65C, 0xB65D, 0xB65E, 0xB65F, 0xB660, 0xB661, 0xB662, 0xB663, 0xB665, 0xB666, 0xB667, 0xB669, 0xB66A, 0xB66B, 0xB66C, 0xB66D, 0xB66E, 0xB66F, 0xB670, 0xB671, 0xB672, 0xB673, 0xB674, 0xB675, 0xB676, 0xB677, 0xB678, 0xB679, 0xB67A, 0xB67B, 0xB67C, 0xB67D, 0xB67E, 0xB67F, 0xB680, 0xB681, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686, 0xB687, 0xB688, 0xB689, 0xB68A, 0xB68B, 0xB68C, 0xB68D, 0xB68E, 0xB68F, 0xB690, 0xB691, 0xB692, 0xB693, 0xB694, 0xB695, 0xB696, 0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, 0xB69E, 0xB69F, 0xB6A1, 0xB6A2, 0xB6A3, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA, 0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B2, 0xB6B3, 0xB6B4, 0xB6B5, 0xB6B6, 0xB6B7, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, 0xB6BC, 0xB6BD, 0xB6BE, 0xB6BF, 0xB6C0, 0xB6C1, 0xB6C2, ERROR}, { ERROR, 0xB6C3, 0xB6C4, 0xB6C5, 0xB6C6, 0xB6C7, 0xB6C8, 0xB6C9, 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD, 0xB6CE, 0xB6CF, 0xB6D0, 0xB6D1, 0xB6D2, 0xB6D3, 0xB6D5, 0xB6D6, 0xB6D7, 0xB6D8, 0xB6D9, 0xB6DA, 0xB6DB, 0xB6DC, 0xB6DD, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB6DE, 0xB6DF, 0xB6E0, 0xB6E1, 0xB6E2, 0xB6E3, 0xB6E4, 0xB6E5, 0xB6E6, 0xB6E7, 0xB6E8, 0xB6E9, 0xB6EA, 0xB6EB, 0xB6EC, 0xB6ED, 0xB6EE, 0xB6EF, 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F5, 0xB6F6, 0xB6F7, 0xB6F9, 0xB6FA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE, 0xB6FF, 0xB702, 0xB703, 0xB704, 0xB706, 0xB707, 0xB708, 0xB709, 0xB70A, 0xB70B, 0xB70C, 0xB70D, 0xB70E, 0xB70F, 0xB710, 0xB711, 0xB712, 0xB713, 0xB714, 0xB715, 0xB716, 0xB717, 0xB718, 0xB719, 0xB71A, 0xB71B, 0xB71C, 0xB71D, 0xB71E, 0xB71F, 0xB720, 0xB721, 0xB722, 0xB723, 0xB724, 0xB725, 0xB726, 0xB727, 0xB72A, 0xB72B, 0xB72D, 0xB72E, 0xB731, 0xB732, 0xB733, 0xB734, 0xB735, 0xB736, 0xB737, 0xB73A, 0xB73C, 0xB73D, 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, 0xB745, 0xB746, 0xB747, 0xB749, 0xB74A, 0xB74B, 0xB74D, 0xB74E, 0xB74F, 0xB750, 0xB751, 0xB752, 0xB753, 0xB756, 0xB757, 0xB758, 0xB759, 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xB75F, 0xB761, 0xB762, 0xB763, 0xB765, 0xB766, 0xB767, 0xB769, 0xB76A, 0xB76B, 0xB76C, 0xB76D, 0xB76E, 0xB76F, 0xB772, 0xB774, 0xB776, 0xB777, 0xB778, 0xB779, 0xB77A, 0xB77B, 0xB77E, 0xB77F, 0xB781, 0xB782, 0xB783, 0xB785, 0xB786, 0xB787, 0xB788, 0xB789, 0xB78A, 0xB78B, 0xB78E, 0xB793, 0xB794, 0xB795, 0xB79A, 0xB79B, 0xB79D, 0xB79E, ERROR}, { ERROR, 0xB79F, 0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6, 0xB7A7, 0xB7AA, 0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, 0xB7B6, 0xB7B7, 0xB7B9, 0xB7BA, 0xB7BB, 0xB7BC, 0xB7BD, 0xB7BE, 0xB7BF, 0xB7C0, 0xB7C1, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB7C2, 0xB7C3, 0xB7C4, 0xB7C5, 0xB7C6, 0xB7C8, 0xB7CA, 0xB7CB, 0xB7CC, 0xB7CD, 0xB7CE, 0xB7CF, 0xB7D0, 0xB7D1, 0xB7D2, 0xB7D3, 0xB7D4, 0xB7D5, 0xB7D6, 0xB7D7, 0xB7D8, 0xB7D9, 0xB7DA, 0xB7DB, 0xB7DC, 0xB7DD, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB7DE, 0xB7DF, 0xB7E0, 0xB7E1, 0xB7E2, 0xB7E3, 0xB7E4, 0xB7E5, 0xB7E6, 0xB7E7, 0xB7E8, 0xB7E9, 0xB7EA, 0xB7EB, 0xB7EE, 0xB7EF, 0xB7F1, 0xB7F2, 0xB7F3, 0xB7F5, 0xB7F6, 0xB7F7, 0xB7F8, 0xB7F9, 0xB7FA, 0xB7FB, 0xB7FE, 0xB802, 0xB803, 0xB804, 0xB805, 0xB806, 0xB80A, 0xB80B, 0xB80D, 0xB80E, 0xB80F, 0xB811, 0xB812, 0xB813, 0xB814, 0xB815, 0xB816, 0xB817, 0xB81A, 0xB81C, 0xB81E, 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, 0xB826, 0xB827, 0xB829, 0xB82A, 0xB82B, 0xB82D, 0xB82E, 0xB82F, 0xB830, 0xB831, 0xB832, 0xB833, 0xB836, 0xB83A, 0xB83B, 0xB83C, 0xB83D, 0xB83E, 0xB83F, 0xB841, 0xB842, 0xB843, 0xB845, 0xB846, 0xB847, 0xB848, 0xB849, 0xB84A, 0xB84B, 0xB84C, 0xB84D, 0xB84E, 0xB84F, 0xB850, 0xB852, 0xB854, 0xB855, 0xB856, 0xB857, 0xB858, 0xB859, 0xB85A, 0xB85B, 0xB85E, 0xB85F, 0xB861, 0xB862, 0xB863, 0xB865, 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xB86B, 0xB86E, 0xB870, 0xB872, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, 0xB879, 0xB87A, 0xB87B, 0xB87D, 0xB87E, 0xB87F, 0xB880, 0xB881, 0xB882, 0xB883, 0xB884, ERROR}, { ERROR, 0xB885, 0xB886, 0xB887, 0xB888, 0xB889, 0xB88A, 0xB88B, 0xB88C, 0xB88E, 0xB88F, 0xB890, 0xB891, 0xB892, 0xB893, 0xB894, 0xB895, 0xB896, 0xB897, 0xB898, 0xB899, 0xB89A, 0xB89B, 0xB89C, 0xB89D, 0xB89E, 0xB89F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB8A0, 0xB8A1, 0xB8A2, 0xB8A3, 0xB8A4, 0xB8A5, 0xB8A6, 0xB8A7, 0xB8A9, 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD, 0xB8AE, 0xB8AF, 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B5, 0xB8B6, 0xB8B7, 0xB8B9, 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB8BE, 0xB8BF, 0xB8C2, 0xB8C4, 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, 0xB8CD, 0xB8CE, 0xB8CF, 0xB8D1, 0xB8D2, 0xB8D3, 0xB8D5, 0xB8D6, 0xB8D7, 0xB8D8, 0xB8D9, 0xB8DA, 0xB8DB, 0xB8DC, 0xB8DE, 0xB8E0, 0xB8E2, 0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, 0xB8E7, 0xB8EA, 0xB8EB, 0xB8ED, 0xB8EE, 0xB8EF, 0xB8F1, 0xB8F2, 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6, 0xB8F7, 0xB8FA, 0xB8FC, 0xB8FE, 0xB8FF, 0xB900, 0xB901, 0xB902, 0xB903, 0xB905, 0xB906, 0xB907, 0xB908, 0xB909, 0xB90A, 0xB90B, 0xB90C, 0xB90D, 0xB90E, 0xB90F, 0xB910, 0xB911, 0xB912, 0xB913, 0xB914, 0xB915, 0xB916, 0xB917, 0xB919, 0xB91A, 0xB91B, 0xB91C, 0xB91D, 0xB91E, 0xB91F, 0xB921, 0xB922, 0xB923, 0xB924, 0xB925, 0xB926, 0xB927, 0xB928, 0xB929, 0xB92A, 0xB92B, 0xB92C, 0xB92D, 0xB92E, 0xB92F, 0xB930, 0xB931, 0xB932, 0xB933, 0xB934, 0xB935, 0xB936, 0xB937, 0xB938, 0xB939, 0xB93A, 0xB93B, 0xB93E, 0xB93F, 0xB941, 0xB942, 0xB943, 0xB945, 0xB946, 0xB947, 0xB948, 0xB949, 0xB94A, 0xB94B, 0xB94D, 0xB94E, 0xB950, 0xB952, 0xB953, 0xB954, 0xB955, 0xB956, 0xB957, ERROR}, { ERROR, 0xB95A, 0xB95B, 0xB95D, 0xB95E, 0xB95F, 0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xB96A, 0xB96C, 0xB96E, 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, 0xB976, 0xB977, 0xB979, 0xB97A, 0xB97B, 0xB97D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB97E, 0xB97F, 0xB980, 0xB981, 0xB982, 0xB983, 0xB986, 0xB988, 0xB98B, 0xB98C, 0xB98F, 0xB990, 0xB991, 0xB992, 0xB993, 0xB994, 0xB995, 0xB996, 0xB997, 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, 0xB99D, 0xB99E, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xB99F, 0xB9A0, 0xB9A1, 0xB9A2, 0xB9A3, 0xB9A4, 0xB9A5, 0xB9A6, 0xB9A7, 0xB9A8, 0xB9A9, 0xB9AA, 0xB9AB, 0xB9AE, 0xB9AF, 0xB9B1, 0xB9B2, 0xB9B3, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, 0xB9BA, 0xB9BB, 0xB9BE, 0xB9C0, 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, 0xB9C6, 0xB9C7, 0xB9CA, 0xB9CB, 0xB9CD, 0xB9D3, 0xB9D4, 0xB9D5, 0xB9D6, 0xB9D7, 0xB9DA, 0xB9DC, 0xB9DF, 0xB9E0, 0xB9E2, 0xB9E6, 0xB9E7, 0xB9E9, 0xB9EA, 0xB9EB, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, 0xB9F1, 0xB9F2, 0xB9F3, 0xB9F6, 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, 0xB9FF, 0xBA02, 0xBA03, 0xBA04, 0xBA05, 0xBA06, 0xBA07, 0xBA09, 0xBA0A, 0xBA0B, 0xBA0C, 0xBA0D, 0xBA0E, 0xBA0F, 0xBA10, 0xBA11, 0xBA12, 0xBA13, 0xBA14, 0xBA16, 0xBA17, 0xBA18, 0xBA19, 0xBA1A, 0xBA1B, 0xBA1C, 0xBA1D, 0xBA1E, 0xBA1F, 0xBA20, 0xBA21, 0xBA22, 0xBA23, 0xBA24, 0xBA25, 0xBA26, 0xBA27, 0xBA28, 0xBA29, 0xBA2A, 0xBA2B, 0xBA2C, 0xBA2D, 0xBA2E, 0xBA2F, 0xBA30, 0xBA31, 0xBA32, 0xBA33, 0xBA34, 0xBA35, 0xBA36, 0xBA37, 0xBA3A, 0xBA3B, 0xBA3D, 0xBA3E, 0xBA3F, 0xBA41, 0xBA43, 0xBA44, 0xBA45, 0xBA46, ERROR}, { ERROR, 0xBA47, 0xBA4A, 0xBA4C, 0xBA4F, 0xBA50, 0xBA51, 0xBA52, 0xBA56, 0xBA57, 0xBA59, 0xBA5A, 0xBA5B, 0xBA5D, 0xBA5E, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63, 0xBA66, 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBA72, 0xBA73, 0xBA75, 0xBA76, 0xBA77, 0xBA79, 0xBA7A, 0xBA7B, 0xBA7C, 0xBA7D, 0xBA7E, 0xBA7F, 0xBA80, 0xBA81, 0xBA82, 0xBA86, 0xBA88, 0xBA89, 0xBA8A, 0xBA8B, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91, 0xBA92, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99, 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xBAA0, 0xBAA1, 0xBAA2, 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, 0xBAAA, 0xBAAD, 0xBAAE, 0xBAAF, 0xBAB1, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, 0xBAB7, 0xBABA, 0xBABC, 0xBABE, 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3, 0xBAC5, 0xBAC6, 0xBAC7, 0xBAC9, 0xBACA, 0xBACB, 0xBACC, 0xBACD, 0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD2, 0xBAD3, 0xBAD4, 0xBAD5, 0xBAD6, 0xBAD7, 0xBADA, 0xBADB, 0xBADC, 0xBADD, 0xBADE, 0xBADF, 0xBAE0, 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6, 0xBAE7, 0xBAE8, 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE, 0xBAEF, 0xBAF0, 0xBAF1, 0xBAF2, 0xBAF3, 0xBAF4, 0xBAF5, 0xBAF6, 0xBAF7, 0xBAF8, 0xBAF9, 0xBAFA, 0xBAFB, 0xBAFD, 0xBAFE, 0xBAFF, 0xBB01, 0xBB02, 0xBB03, 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A, 0xBB0B, 0xBB0C, 0xBB0E, 0xBB10, 0xBB12, 0xBB13, 0xBB14, 0xBB15, 0xBB16, 0xBB17, 0xBB19, 0xBB1A, 0xBB1B, 0xBB1D, 0xBB1E, 0xBB1F, 0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, 0xBB26, 0xBB27, ERROR}, { ERROR, 0xBB28, 0xBB2A, 0xBB2C, 0xBB2D, 0xBB2E, 0xBB2F, 0xBB30, 0xBB31, 0xBB32, 0xBB33, 0xBB37, 0xBB39, 0xBB3A, 0xBB3F, 0xBB40, 0xBB41, 0xBB42, 0xBB43, 0xBB46, 0xBB48, 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4E, 0xBB51, 0xBB52, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBB53, 0xBB55, 0xBB56, 0xBB57, 0xBB59, 0xBB5A, 0xBB5B, 0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB62, 0xBB64, 0xBB65, 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, 0xBB6D, 0xBB6E, 0xBB6F, 0xBB70, 0xBB71, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBB72, 0xBB73, 0xBB74, 0xBB75, 0xBB76, 0xBB77, 0xBB78, 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E, 0xBB7F, 0xBB80, 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86, 0xBB87, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8D, 0xBB8E, 0xBB8F, 0xBB91, 0xBB92, 0xBB93, 0xBB94, 0xBB95, 0xBB96, 0xBB97, 0xBB98, 0xBB99, 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, 0xBB9E, 0xBB9F, 0xBBA0, 0xBBA1, 0xBBA2, 0xBBA3, 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA9, 0xBBAA, 0xBBAB, 0xBBAD, 0xBBAE, 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2, 0xBBB3, 0xBBB5, 0xBBB6, 0xBBB8, 0xBBB9, 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE, 0xBBBF, 0xBBC1, 0xBBC2, 0xBBC3, 0xBBC5, 0xBBC6, 0xBBC7, 0xBBC9, 0xBBCA, 0xBBCB, 0xBBCC, 0xBBCD, 0xBBCE, 0xBBCF, 0xBBD1, 0xBBD2, 0xBBD4, 0xBBD5, 0xBBD6, 0xBBD7, 0xBBD8, 0xBBD9, 0xBBDA, 0xBBDB, 0xBBDC, 0xBBDD, 0xBBDE, 0xBBDF, 0xBBE0, 0xBBE1, 0xBBE2, 0xBBE3, 0xBBE4, 0xBBE5, 0xBBE6, 0xBBE7, 0xBBE8, 0xBBE9, 0xBBEA, 0xBBEB, 0xBBEC, 0xBBED, 0xBBEE, 0xBBEF, 0xBBF0, 0xBBF1, 0xBBF2, 0xBBF3, 0xBBF4, 0xBBF5, 0xBBF6, 0xBBF7, 0xBBFA, 0xBBFB, 0xBBFD, 0xBBFE, 0xBC01, ERROR}, { ERROR, 0xBC03, 0xBC04, 0xBC05, 0xBC06, 0xBC07, 0xBC0A, 0xBC0E, 0xBC10, 0xBC12, 0xBC13, 0xBC19, 0xBC1A, 0xBC20, 0xBC21, 0xBC22, 0xBC23, 0xBC26, 0xBC28, 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2E, 0xBC2F, 0xBC32, 0xBC33, 0xBC35, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBC36, 0xBC37, 0xBC39, 0xBC3A, 0xBC3B, 0xBC3C, 0xBC3D, 0xBC3E, 0xBC3F, 0xBC42, 0xBC46, 0xBC47, 0xBC48, 0xBC4A, 0xBC4B, 0xBC4E, 0xBC4F, 0xBC51, 0xBC52, 0xBC53, 0xBC54, 0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBC5A, 0xBC5B, 0xBC5C, 0xBC5E, 0xBC5F, 0xBC60, 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xBC65, 0xBC66, 0xBC67, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, 0xBC6C, 0xBC6D, 0xBC6E, 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75, 0xBC76, 0xBC77, 0xBC78, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D, 0xBC7E, 0xBC7F, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0xBC86, 0xBC87, 0xBC89, 0xBC8A, 0xBC8D, 0xBC8F, 0xBC90, 0xBC91, 0xBC92, 0xBC93, 0xBC96, 0xBC98, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA2, 0xBCA3, 0xBCA5, 0xBCA6, 0xBCA9, 0xBCAA, 0xBCAB, 0xBCAC, 0xBCAD, 0xBCAE, 0xBCAF, 0xBCB2, 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA, 0xBCBB, 0xBCBE, 0xBCBF, 0xBCC1, 0xBCC2, 0xBCC3, 0xBCC5, 0xBCC6, 0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA, 0xBCCB, 0xBCCC, 0xBCCE, 0xBCD2, 0xBCD3, 0xBCD4, 0xBCD6, 0xBCD7, 0xBCD9, 0xBCDA, 0xBCDB, 0xBCDD, 0xBCDE, 0xBCDF, 0xBCE0, 0xBCE1, 0xBCE2, 0xBCE3, 0xBCE4, 0xBCE5, 0xBCE6, 0xBCE7, 0xBCE8, 0xBCE9, 0xBCEA, 0xBCEB, 0xBCEC, 0xBCED, 0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, 0xBCF2, 0xBCF3, 0xBCF7, 0xBCF9, 0xBCFA, 0xBCFB, 0xBCFD, ERROR}, { ERROR, 0xBCFE, 0xBCFF, 0xBD00, 0xBD01, 0xBD02, 0xBD03, 0xBD06, 0xBD08, 0xBD0A, 0xBD0B, 0xBD0C, 0xBD0D, 0xBD0E, 0xBD0F, 0xBD11, 0xBD12, 0xBD13, 0xBD15, 0xBD16, 0xBD17, 0xBD18, 0xBD19, 0xBD1A, 0xBD1B, 0xBD1C, 0xBD1D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBD1E, 0xBD1F, 0xBD20, 0xBD21, 0xBD22, 0xBD23, 0xBD25, 0xBD26, 0xBD27, 0xBD28, 0xBD29, 0xBD2A, 0xBD2B, 0xBD2D, 0xBD2E, 0xBD2F, 0xBD30, 0xBD31, 0xBD32, 0xBD33, 0xBD34, 0xBD35, 0xBD36, 0xBD37, 0xBD38, 0xBD39, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBD3A, 0xBD3B, 0xBD3C, 0xBD3D, 0xBD3E, 0xBD3F, 0xBD41, 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD4A, 0xBD4B, 0xBD4D, 0xBD4E, 0xBD4F, 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57, 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, 0xBD60, 0xBD61, 0xBD62, 0xBD63, 0xBD65, 0xBD66, 0xBD67, 0xBD69, 0xBD6A, 0xBD6B, 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72, 0xBD73, 0xBD74, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79, 0xBD7A, 0xBD7B, 0xBD7C, 0xBD7D, 0xBD7E, 0xBD7F, 0xBD82, 0xBD83, 0xBD85, 0xBD86, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, 0xBD92, 0xBD94, 0xBD96, 0xBD97, 0xBD98, 0xBD9B, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBDA1, 0xBDA2, 0xBDA3, 0xBDA5, 0xBDA6, 0xBDA7, 0xBDA8, 0xBDA9, 0xBDAA, 0xBDAB, 0xBDAC, 0xBDAD, 0xBDAE, 0xBDAF, 0xBDB1, 0xBDB2, 0xBDB3, 0xBDB4, 0xBDB5, 0xBDB6, 0xBDB7, 0xBDB9, 0xBDBA, 0xBDBB, 0xBDBC, 0xBDBD, 0xBDBE, 0xBDBF, 0xBDC0, 0xBDC1, 0xBDC2, 0xBDC3, 0xBDC4, 0xBDC5, 0xBDC6, 0xBDC7, 0xBDC8, 0xBDC9, 0xBDCA, 0xBDCB, 0xBDCC, 0xBDCD, 0xBDCE, 0xBDCF, 0xBDD0, 0xBDD1, ERROR}, { ERROR, 0xBDD2, 0xBDD3, 0xBDD6, 0xBDD7, 0xBDD9, 0xBDDA, 0xBDDB, 0xBDDD, 0xBDDE, 0xBDDF, 0xBDE0, 0xBDE1, 0xBDE2, 0xBDE3, 0xBDE4, 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8, 0xBDEA, 0xBDEB, 0xBDEC, 0xBDED, 0xBDEE, 0xBDEF, 0xBDF1, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBDF2, 0xBDF3, 0xBDF5, 0xBDF6, 0xBDF7, 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC, 0xBDFD, 0xBDFE, 0xBDFF, 0xBE01, 0xBE02, 0xBE04, 0xBE06, 0xBE07, 0xBE08, 0xBE09, 0xBE0A, 0xBE0B, 0xBE0E, 0xBE0F, 0xBE11, 0xBE12, 0xBE13, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A, 0xBE1B, 0xBE1E, 0xBE20, 0xBE21, 0xBE22, 0xBE23, 0xBE24, 0xBE25, 0xBE26, 0xBE27, 0xBE28, 0xBE29, 0xBE2A, 0xBE2B, 0xBE2C, 0xBE2D, 0xBE2E, 0xBE2F, 0xBE30, 0xBE31, 0xBE32, 0xBE33, 0xBE34, 0xBE35, 0xBE36, 0xBE37, 0xBE38, 0xBE39, 0xBE3A, 0xBE3B, 0xBE3C, 0xBE3D, 0xBE3E, 0xBE3F, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0xBE46, 0xBE47, 0xBE49, 0xBE4A, 0xBE4B, 0xBE4D, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53, 0xBE56, 0xBE58, 0xBE5C, 0xBE5D, 0xBE5E, 0xBE5F, 0xBE62, 0xBE63, 0xBE65, 0xBE66, 0xBE67, 0xBE69, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E, 0xBE6F, 0xBE72, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7E, 0xBE7F, 0xBE81, 0xBE82, 0xBE83, 0xBE85, 0xBE86, 0xBE87, 0xBE88, 0xBE89, 0xBE8A, 0xBE8B, 0xBE8E, 0xBE92, 0xBE93, 0xBE94, 0xBE95, 0xBE96, 0xBE97, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, 0xBE9F, 0xBEA0, 0xBEA1, 0xBEA2, 0xBEA3, 0xBEA4, 0xBEA5, 0xBEA6, 0xBEA7, 0xBEA9, 0xBEAA, 0xBEAB, 0xBEAC, 0xBEAD, 0xBEAE, 0xBEAF, 0xBEB0, 0xBEB1, 0xBEB2, 0xBEB3, 0xBEB4, 0xBEB5, 0xBEB6, 0xBEB7, ERROR}, { ERROR, 0xBEB8, 0xBEB9, 0xBEBA, 0xBEBB, 0xBEBC, 0xBEBD, 0xBEBE, 0xBEBF, 0xBEC0, 0xBEC1, 0xBEC2, 0xBEC3, 0xBEC4, 0xBEC5, 0xBEC6, 0xBEC7, 0xBEC8, 0xBEC9, 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, 0xBECF, 0xBED2, 0xBED3, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBED5, 0xBED6, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD, 0xBEDE, 0xBEDF, 0xBEE1, 0xBEE2, 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9, 0xBEEA, 0xBEEB, 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF2, 0xBEF3, 0xBEF4, 0xBEF5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA, 0xBEFB, 0xBEFC, 0xBEFD, 0xBEFE, 0xBEFF, 0xBF00, 0xBF02, 0xBF03, 0xBF04, 0xBF05, 0xBF06, 0xBF07, 0xBF0A, 0xBF0B, 0xBF0C, 0xBF0D, 0xBF0E, 0xBF0F, 0xBF10, 0xBF11, 0xBF12, 0xBF13, 0xBF14, 0xBF15, 0xBF16, 0xBF17, 0xBF1A, 0xBF1E, 0xBF1F, 0xBF20, 0xBF21, 0xBF22, 0xBF23, 0xBF24, 0xBF25, 0xBF26, 0xBF27, 0xBF28, 0xBF29, 0xBF2A, 0xBF2B, 0xBF2C, 0xBF2D, 0xBF2E, 0xBF2F, 0xBF30, 0xBF31, 0xBF32, 0xBF33, 0xBF34, 0xBF35, 0xBF36, 0xBF37, 0xBF38, 0xBF39, 0xBF3A, 0xBF3B, 0xBF3C, 0xBF3D, 0xBF3E, 0xBF3F, 0xBF42, 0xBF43, 0xBF45, 0xBF46, 0xBF47, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E, 0xBF4F, 0xBF52, 0xBF53, 0xBF54, 0xBF56, 0xBF57, 0xBF58, 0xBF59, 0xBF5A, 0xBF5B, 0xBF5C, 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61, 0xBF62, 0xBF63, 0xBF64, 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69, 0xBF6A, 0xBF6B, 0xBF6C, 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71, 0xBF72, 0xBF73, 0xBF74, 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79, 0xBF7A, 0xBF7B, 0xBF7C, 0xBF7D, 0xBF7E, 0xBF7F, 0xBF80, 0xBF81, 0xBF82, ERROR}, { ERROR, 0xBF83, 0xBF84, 0xBF85, 0xBF86, 0xBF87, 0xBF88, 0xBF89, 0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91, 0xBF92, 0xBF93, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A, 0xBF9B, 0xBF9C, 0xBF9D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBF9E, 0xBF9F, 0xBFA0, 0xBFA1, 0xBFA2, 0xBFA3, 0xBFA4, 0xBFA5, 0xBFA6, 0xBFA7, 0xBFA8, 0xBFA9, 0xBFAA, 0xBFAB, 0xBFAC, 0xBFAD, 0xBFAE, 0xBFAF, 0xBFB1, 0xBFB2, 0xBFB3, 0xBFB4, 0xBFB5, 0xBFB6, 0xBFB7, 0xBFB8, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xBFB9, 0xBFBA, 0xBFBB, 0xBFBC, 0xBFBD, 0xBFBE, 0xBFBF, 0xBFC0, 0xBFC1, 0xBFC2, 0xBFC3, 0xBFC4, 0xBFC6, 0xBFC7, 0xBFC8, 0xBFC9, 0xBFCA, 0xBFCB, 0xBFCE, 0xBFCF, 0xBFD1, 0xBFD2, 0xBFD3, 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8, 0xBFD9, 0xBFDA, 0xBFDB, 0xBFDD, 0xBFDE, 0xBFE0, 0xBFE2, 0xBFE3, 0xBFE4, 0xBFE5, 0xBFE6, 0xBFE7, 0xBFE8, 0xBFE9, 0xBFEA, 0xBFEB, 0xBFEC, 0xBFED, 0xBFEE, 0xBFEF, 0xBFF0, 0xBFF1, 0xBFF2, 0xBFF3, 0xBFF4, 0xBFF5, 0xBFF6, 0xBFF7, 0xBFF8, 0xBFF9, 0xBFFA, 0xBFFB, 0xBFFC, 0xBFFD, 0xBFFE, 0xBFFF, 0xC000, 0xC001, 0xC002, 0xC003, 0xC004, 0xC005, 0xC006, 0xC007, 0xC008, 0xC009, 0xC00A, 0xC00B, 0xC00C, 0xC00D, 0xC00E, 0xC00F, 0xC010, 0xC011, 0xC012, 0xC013, 0xC014, 0xC015, 0xC016, 0xC017, 0xC018, 0xC019, 0xC01A, 0xC01B, 0xC01C, 0xC01D, 0xC01E, 0xC01F, 0xC020, 0xC021, 0xC022, 0xC023, 0xC024, 0xC025, 0xC026, 0xC027, 0xC028, 0xC029, 0xC02A, 0xC02B, 0xC02C, 0xC02D, 0xC02E, 0xC02F, 0xC030, 0xC031, 0xC032, 0xC033, 0xC034, 0xC035, 0xC036, 0xC037, 0xC038, 0xC039, 0xC03A, 0xC03B, 0xC03D, 0xC03E, 0xC03F, ERROR}, { ERROR, 0xC040, 0xC041, 0xC042, 0xC043, 0xC044, 0xC045, 0xC046, 0xC047, 0xC048, 0xC049, 0xC04A, 0xC04B, 0xC04C, 0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC052, 0xC053, 0xC054, 0xC055, 0xC056, 0xC057, 0xC059, 0xC05A, 0xC05B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC05D, 0xC05E, 0xC05F, 0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066, 0xC067, 0xC06A, 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, 0xC071, 0xC072, 0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC07A, 0xC07B, 0xC07C, 0xC07D, 0xC07E, 0xC07F, 0xC080, 0xC081, 0xC082, 0xC083, 0xC084, 0xC085, 0xC086, 0xC087, 0xC088, 0xC089, 0xC08A, 0xC08B, 0xC08C, 0xC08D, 0xC08E, 0xC08F, 0xC092, 0xC093, 0xC095, 0xC096, 0xC097, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E, 0xC09F, 0xC0A2, 0xC0A4, 0xC0A6, 0xC0A7, 0xC0A8, 0xC0A9, 0xC0AA, 0xC0AB, 0xC0AE, 0xC0B1, 0xC0B2, 0xC0B7, 0xC0B8, 0xC0B9, 0xC0BA, 0xC0BB, 0xC0BE, 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C6, 0xC0C7, 0xC0CA, 0xC0CB, 0xC0CD, 0xC0CE, 0xC0CF, 0xC0D1, 0xC0D2, 0xC0D3, 0xC0D4, 0xC0D5, 0xC0D6, 0xC0D7, 0xC0DA, 0xC0DE, 0xC0DF, 0xC0E0, 0xC0E1, 0xC0E2, 0xC0E3, 0xC0E6, 0xC0E7, 0xC0E9, 0xC0EA, 0xC0EB, 0xC0ED, 0xC0EE, 0xC0EF, 0xC0F0, 0xC0F1, 0xC0F2, 0xC0F3, 0xC0F6, 0xC0F8, 0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC0FE, 0xC0FF, 0xC101, 0xC102, 0xC103, 0xC105, 0xC106, 0xC107, 0xC109, 0xC10A, 0xC10B, 0xC10C, 0xC10D, 0xC10E, 0xC10F, 0xC111, 0xC112, 0xC113, 0xC114, 0xC116, 0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, 0xC121, 0xC122, 0xC125, 0xC128, 0xC129, 0xC12A, 0xC12B, 0xC12E, ERROR}, { ERROR, 0xC132, 0xC133, 0xC134, 0xC135, 0xC137, 0xC13A, 0xC13B, 0xC13D, 0xC13E, 0xC13F, 0xC141, 0xC142, 0xC143, 0xC144, 0xC145, 0xC146, 0xC147, 0xC14A, 0xC14E, 0xC14F, 0xC150, 0xC151, 0xC152, 0xC153, 0xC156, 0xC157, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC159, 0xC15A, 0xC15B, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, 0xC162, 0xC163, 0xC166, 0xC16A, 0xC16B, 0xC16C, 0xC16D, 0xC16E, 0xC16F, 0xC171, 0xC172, 0xC173, 0xC175, 0xC176, 0xC177, 0xC179, 0xC17A, 0xC17B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC17C, 0xC17D, 0xC17E, 0xC17F, 0xC180, 0xC181, 0xC182, 0xC183, 0xC184, 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B, 0xC18F, 0xC191, 0xC192, 0xC193, 0xC195, 0xC197, 0xC198, 0xC199, 0xC19A, 0xC19B, 0xC19E, 0xC1A0, 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A6, 0xC1A7, 0xC1AA, 0xC1AB, 0xC1AD, 0xC1AE, 0xC1AF, 0xC1B1, 0xC1B2, 0xC1B3, 0xC1B4, 0xC1B5, 0xC1B6, 0xC1B7, 0xC1B8, 0xC1B9, 0xC1BA, 0xC1BB, 0xC1BC, 0xC1BE, 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3, 0xC1C5, 0xC1C6, 0xC1C7, 0xC1C9, 0xC1CA, 0xC1CB, 0xC1CD, 0xC1CE, 0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2, 0xC1D3, 0xC1D5, 0xC1D6, 0xC1D9, 0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF, 0xC1E1, 0xC1E2, 0xC1E3, 0xC1E5, 0xC1E6, 0xC1E7, 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC, 0xC1ED, 0xC1EE, 0xC1EF, 0xC1F2, 0xC1F4, 0xC1F5, 0xC1F6, 0xC1F7, 0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, 0xC1FE, 0xC1FF, 0xC201, 0xC202, 0xC203, 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A, 0xC20B, 0xC20E, 0xC210, 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217, 0xC21A, 0xC21B, 0xC21D, 0xC21E, 0xC221, 0xC222, 0xC223, ERROR}, { ERROR, 0xC224, 0xC225, 0xC226, 0xC227, 0xC22A, 0xC22C, 0xC22E, 0xC230, 0xC233, 0xC235, 0xC236, 0xC237, 0xC238, 0xC239, 0xC23A, 0xC23B, 0xC23C, 0xC23D, 0xC23E, 0xC23F, 0xC240, 0xC241, 0xC242, 0xC243, 0xC244, 0xC245, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC246, 0xC247, 0xC249, 0xC24A, 0xC24B, 0xC24C, 0xC24D, 0xC24E, 0xC24F, 0xC252, 0xC253, 0xC255, 0xC256, 0xC257, 0xC259, 0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E, 0xC25F, 0xC261, 0xC262, 0xC263, 0xC264, 0xC266, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B, 0xC26E, 0xC26F, 0xC271, 0xC272, 0xC273, 0xC275, 0xC276, 0xC277, 0xC278, 0xC279, 0xC27A, 0xC27B, 0xC27E, 0xC280, 0xC282, 0xC283, 0xC284, 0xC285, 0xC286, 0xC287, 0xC28A, 0xC28B, 0xC28C, 0xC28D, 0xC28E, 0xC28F, 0xC291, 0xC292, 0xC293, 0xC294, 0xC295, 0xC296, 0xC297, 0xC299, 0xC29A, 0xC29C, 0xC29E, 0xC29F, 0xC2A0, 0xC2A1, 0xC2A2, 0xC2A3, 0xC2A6, 0xC2A7, 0xC2A9, 0xC2AA, 0xC2AB, 0xC2AE, 0xC2AF, 0xC2B0, 0xC2B1, 0xC2B2, 0xC2B3, 0xC2B6, 0xC2B8, 0xC2BA, 0xC2BB, 0xC2BC, 0xC2BD, 0xC2BE, 0xC2BF, 0xC2C0, 0xC2C1, 0xC2C2, 0xC2C3, 0xC2C4, 0xC2C5, 0xC2C6, 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA, 0xC2CB, 0xC2CC, 0xC2CD, 0xC2CE, 0xC2CF, 0xC2D0, 0xC2D1, 0xC2D2, 0xC2D3, 0xC2D4, 0xC2D5, 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA, 0xC2DB, 0xC2DE, 0xC2DF, 0xC2E1, 0xC2E2, 0xC2E5, 0xC2E6, 0xC2E7, 0xC2E8, 0xC2E9, 0xC2EA, 0xC2EE, 0xC2F0, 0xC2F2, 0xC2F3, 0xC2F4, 0xC2F5, 0xC2F7, 0xC2FA, 0xC2FD, 0xC2FE, 0xC2FF, 0xC301, 0xC302, 0xC303, 0xC304, 0xC305, 0xC306, 0xC307, 0xC30A, 0xC30B, 0xC30E, 0xC30F, ERROR}, { ERROR, 0xC310, 0xC311, 0xC312, 0xC316, 0xC317, 0xC319, 0xC31A, 0xC31B, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322, 0xC323, 0xC326, 0xC327, 0xC32A, 0xC32B, 0xC32C, 0xC32D, 0xC32E, 0xC32F, 0xC330, 0xC331, 0xC332, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC333, 0xC334, 0xC335, 0xC336, 0xC337, 0xC338, 0xC339, 0xC33A, 0xC33B, 0xC33C, 0xC33D, 0xC33E, 0xC33F, 0xC340, 0xC341, 0xC342, 0xC343, 0xC344, 0xC346, 0xC347, 0xC348, 0xC349, 0xC34A, 0xC34B, 0xC34C, 0xC34D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC34E, 0xC34F, 0xC350, 0xC351, 0xC352, 0xC353, 0xC354, 0xC355, 0xC356, 0xC357, 0xC358, 0xC359, 0xC35A, 0xC35B, 0xC35C, 0xC35D, 0xC35E, 0xC35F, 0xC360, 0xC361, 0xC362, 0xC363, 0xC364, 0xC365, 0xC366, 0xC367, 0xC36A, 0xC36B, 0xC36D, 0xC36E, 0xC36F, 0xC371, 0xC373, 0xC374, 0xC375, 0xC376, 0xC377, 0xC37A, 0xC37B, 0xC37E, 0xC37F, 0xC380, 0xC381, 0xC382, 0xC383, 0xC385, 0xC386, 0xC387, 0xC389, 0xC38A, 0xC38B, 0xC38D, 0xC38E, 0xC38F, 0xC390, 0xC391, 0xC392, 0xC393, 0xC394, 0xC395, 0xC396, 0xC397, 0xC398, 0xC399, 0xC39A, 0xC39B, 0xC39C, 0xC39D, 0xC39E, 0xC39F, 0xC3A0, 0xC3A1, 0xC3A2, 0xC3A3, 0xC3A4, 0xC3A5, 0xC3A6, 0xC3A7, 0xC3A8, 0xC3A9, 0xC3AA, 0xC3AB, 0xC3AC, 0xC3AD, 0xC3AE, 0xC3AF, 0xC3B0, 0xC3B1, 0xC3B2, 0xC3B3, 0xC3B4, 0xC3B5, 0xC3B6, 0xC3B7, 0xC3B8, 0xC3B9, 0xC3BA, 0xC3BB, 0xC3BC, 0xC3BD, 0xC3BE, 0xC3BF, 0xC3C1, 0xC3C2, 0xC3C3, 0xC3C4, 0xC3C5, 0xC3C6, 0xC3C7, 0xC3C8, 0xC3C9, 0xC3CA, 0xC3CB, 0xC3CC, 0xC3CD, 0xC3CE, 0xC3CF, 0xC3D0, 0xC3D1, 0xC3D2, 0xC3D3, 0xC3D4, 0xC3D5, 0xC3D6, 0xC3D7, 0xC3DA, ERROR}, { ERROR, 0xC3DB, 0xC3DD, 0xC3DE, 0xC3E1, 0xC3E3, 0xC3E4, 0xC3E5, 0xC3E6, 0xC3E7, 0xC3EA, 0xC3EB, 0xC3EC, 0xC3EE, 0xC3EF, 0xC3F0, 0xC3F1, 0xC3F2, 0xC3F3, 0xC3F6, 0xC3F7, 0xC3F9, 0xC3FA, 0xC3FB, 0xC3FC, 0xC3FD, 0xC3FE, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC3FF, 0xC400, 0xC401, 0xC402, 0xC403, 0xC404, 0xC405, 0xC406, 0xC407, 0xC409, 0xC40A, 0xC40B, 0xC40C, 0xC40D, 0xC40E, 0xC40F, 0xC411, 0xC412, 0xC413, 0xC414, 0xC415, 0xC416, 0xC417, 0xC418, 0xC419, 0xC41A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC41B, 0xC41C, 0xC41D, 0xC41E, 0xC41F, 0xC420, 0xC421, 0xC422, 0xC423, 0xC425, 0xC426, 0xC427, 0xC428, 0xC429, 0xC42A, 0xC42B, 0xC42D, 0xC42E, 0xC42F, 0xC431, 0xC432, 0xC433, 0xC435, 0xC436, 0xC437, 0xC438, 0xC439, 0xC43A, 0xC43B, 0xC43E, 0xC43F, 0xC440, 0xC441, 0xC442, 0xC443, 0xC444, 0xC445, 0xC446, 0xC447, 0xC449, 0xC44A, 0xC44B, 0xC44C, 0xC44D, 0xC44E, 0xC44F, 0xC450, 0xC451, 0xC452, 0xC453, 0xC454, 0xC455, 0xC456, 0xC457, 0xC458, 0xC459, 0xC45A, 0xC45B, 0xC45C, 0xC45D, 0xC45E, 0xC45F, 0xC460, 0xC461, 0xC462, 0xC463, 0xC466, 0xC467, 0xC469, 0xC46A, 0xC46B, 0xC46D, 0xC46E, 0xC46F, 0xC470, 0xC471, 0xC472, 0xC473, 0xC476, 0xC477, 0xC478, 0xC47A, 0xC47B, 0xC47C, 0xC47D, 0xC47E, 0xC47F, 0xC481, 0xC482, 0xC483, 0xC484, 0xC485, 0xC486, 0xC487, 0xC488, 0xC489, 0xC48A, 0xC48B, 0xC48C, 0xC48D, 0xC48E, 0xC48F, 0xC490, 0xC491, 0xC492, 0xC493, 0xC495, 0xC496, 0xC497, 0xC498, 0xC499, 0xC49A, 0xC49B, 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1, 0xC4A2, 0xC4A3, 0xC4A4, 0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, ERROR}, { ERROR, 0xC4AA, 0xC4AB, 0xC4AC, 0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0xC4B1, 0xC4B2, 0xC4B3, 0xC4B4, 0xC4B5, 0xC4B6, 0xC4B7, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BD, 0xC4BE, 0xC4BF, 0xC4C0, 0xC4C1, 0xC4C2, 0xC4C3, 0xC4C4, 0xC4C5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC4C6, 0xC4C7, 0xC4C8, 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, 0xC4CD, 0xC4CE, 0xC4CF, 0xC4D0, 0xC4D1, 0xC4D2, 0xC4D3, 0xC4D4, 0xC4D5, 0xC4D6, 0xC4D7, 0xC4D8, 0xC4D9, 0xC4DA, 0xC4DB, 0xC4DC, 0xC4DD, 0xC4DE, 0xC4DF, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC4E0, 0xC4E1, 0xC4E2, 0xC4E3, 0xC4E4, 0xC4E5, 0xC4E6, 0xC4E7, 0xC4E8, 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, 0xC4EE, 0xC4EF, 0xC4F2, 0xC4F3, 0xC4F5, 0xC4F6, 0xC4F7, 0xC4F9, 0xC4FB, 0xC4FC, 0xC4FD, 0xC4FE, 0xC502, 0xC503, 0xC504, 0xC505, 0xC506, 0xC507, 0xC508, 0xC509, 0xC50A, 0xC50B, 0xC50D, 0xC50E, 0xC50F, 0xC511, 0xC512, 0xC513, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A, 0xC51B, 0xC51D, 0xC51E, 0xC51F, 0xC520, 0xC521, 0xC522, 0xC523, 0xC524, 0xC525, 0xC526, 0xC527, 0xC52A, 0xC52B, 0xC52D, 0xC52E, 0xC52F, 0xC531, 0xC532, 0xC533, 0xC534, 0xC535, 0xC536, 0xC537, 0xC53A, 0xC53C, 0xC53E, 0xC53F, 0xC540, 0xC541, 0xC542, 0xC543, 0xC546, 0xC547, 0xC54B, 0xC54F, 0xC550, 0xC551, 0xC552, 0xC556, 0xC55A, 0xC55B, 0xC55C, 0xC55F, 0xC562, 0xC563, 0xC565, 0xC566, 0xC567, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E, 0xC56F, 0xC572, 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0xC57E, 0xC57F, 0xC581, 0xC582, 0xC583, 0xC585, 0xC586, 0xC588, 0xC589, 0xC58A, 0xC58B, 0xC58E, 0xC590, 0xC592, 0xC593, 0xC594, ERROR}, { ERROR, 0xC596, 0xC599, 0xC59A, 0xC59B, 0xC59D, 0xC59E, 0xC59F, 0xC5A1, 0xC5A2, 0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6, 0xC5A7, 0xC5A8, 0xC5AA, 0xC5AB, 0xC5AC, 0xC5AD, 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, 0xC5B2, 0xC5B3, 0xC5B6, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC5B7, 0xC5BA, 0xC5BF, 0xC5C0, 0xC5C1, 0xC5C2, 0xC5C3, 0xC5CB, 0xC5CD, 0xC5CF, 0xC5D2, 0xC5D3, 0xC5D5, 0xC5D6, 0xC5D7, 0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE, 0xC5DF, 0xC5E2, 0xC5E4, 0xC5E6, 0xC5E7, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0xC5EF, 0xC5F1, 0xC5F2, 0xC5F3, 0xC5F5, 0xC5F8, 0xC5F9, 0xC5FA, 0xC5FB, 0xC602, 0xC603, 0xC604, 0xC609, 0xC60A, 0xC60B, 0xC60D, 0xC60E, 0xC60F, 0xC611, 0xC612, 0xC613, 0xC614, 0xC615, 0xC616, 0xC617, 0xC61A, 0xC61D, 0xC61E, 0xC61F, 0xC620, 0xC621, 0xC622, 0xC623, 0xC626, 0xC627, 0xC629, 0xC62A, 0xC62B, 0xC62F, 0xC631, 0xC632, 0xC636, 0xC638, 0xC63A, 0xC63C, 0xC63D, 0xC63E, 0xC63F, 0xC642, 0xC643, 0xC645, 0xC646, 0xC647, 0xC649, 0xC64A, 0xC64B, 0xC64C, 0xC64D, 0xC64E, 0xC64F, 0xC652, 0xC656, 0xC657, 0xC658, 0xC659, 0xC65A, 0xC65B, 0xC65E, 0xC65F, 0xC661, 0xC662, 0xC663, 0xC664, 0xC665, 0xC666, 0xC667, 0xC668, 0xC669, 0xC66A, 0xC66B, 0xC66D, 0xC66E, 0xC670, 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677, 0xC67A, 0xC67B, 0xC67D, 0xC67E, 0xC67F, 0xC681, 0xC682, 0xC683, 0xC684, 0xC685, 0xC686, 0xC687, 0xC68A, 0xC68C, 0xC68E, 0xC68F, 0xC690, 0xC691, 0xC692, 0xC693, 0xC696, 0xC697, 0xC699, 0xC69A, 0xC69B, 0xC69D, 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, 0xC6A2, 0xC6A3, 0xC6A6, ERROR}, { ERROR, 0xC6A8, 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF, 0xC6B2, 0xC6B3, 0xC6B5, 0xC6B6, 0xC6B7, 0xC6BB, 0xC6BC, 0xC6BD, 0xC6BE, 0xC6BF, 0xC6C2, 0xC6C4, 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9, 0xC6CA, 0xC6CB, 0xC6CE, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC6CF, 0xC6D1, 0xC6D2, 0xC6D3, 0xC6D5, 0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, 0xC6DA, 0xC6DB, 0xC6DE, 0xC6DF, 0xC6E2, 0xC6E3, 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, 0xC6EA, 0xC6EB, 0xC6ED, 0xC6EE, 0xC6EF, 0xC6F1, 0xC6F2, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC6F3, 0xC6F4, 0xC6F5, 0xC6F6, 0xC6F7, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FE, 0xC6FF, 0xC700, 0xC701, 0xC702, 0xC703, 0xC706, 0xC707, 0xC709, 0xC70A, 0xC70B, 0xC70D, 0xC70E, 0xC70F, 0xC710, 0xC711, 0xC712, 0xC713, 0xC716, 0xC718, 0xC71A, 0xC71B, 0xC71C, 0xC71D, 0xC71E, 0xC71F, 0xC722, 0xC723, 0xC725, 0xC726, 0xC727, 0xC729, 0xC72A, 0xC72B, 0xC72C, 0xC72D, 0xC72E, 0xC72F, 0xC732, 0xC734, 0xC736, 0xC738, 0xC739, 0xC73A, 0xC73B, 0xC73E, 0xC73F, 0xC741, 0xC742, 0xC743, 0xC745, 0xC746, 0xC747, 0xC748, 0xC749, 0xC74B, 0xC74E, 0xC750, 0xC759, 0xC75A, 0xC75B, 0xC75D, 0xC75E, 0xC75F, 0xC761, 0xC762, 0xC763, 0xC764, 0xC765, 0xC766, 0xC767, 0xC769, 0xC76A, 0xC76C, 0xC76D, 0xC76E, 0xC76F, 0xC770, 0xC771, 0xC772, 0xC773, 0xC776, 0xC777, 0xC779, 0xC77A, 0xC77B, 0xC77F, 0xC780, 0xC781, 0xC782, 0xC786, 0xC78B, 0xC78C, 0xC78D, 0xC78F, 0xC792, 0xC793, 0xC795, 0xC799, 0xC79B, 0xC79C, 0xC79D, 0xC79E, 0xC79F, 0xC7A2, 0xC7A7, 0xC7A8, 0xC7A9, 0xC7AA, 0xC7AB, 0xC7AE, 0xC7AF, 0xC7B1, 0xC7B2, 0xC7B3, 0xC7B5, 0xC7B6, 0xC7B7, ERROR}, { ERROR, 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BE, 0xC7C2, 0xC7C3, 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, 0xC7CA, 0xC7CB, 0xC7CD, 0xC7CF, 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6, 0xC7D7, 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC7DE, 0xC7DF, 0xC7E0, 0xC7E1, 0xC7E2, 0xC7E3, 0xC7E5, 0xC7E6, 0xC7E7, 0xC7E9, 0xC7EA, 0xC7EB, 0xC7ED, 0xC7EE, 0xC7EF, 0xC7F0, 0xC7F1, 0xC7F2, 0xC7F3, 0xC7F4, 0xC7F5, 0xC7F6, 0xC7F7, 0xC7F8, 0xC7F9, 0xC7FA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC7FB, 0xC7FC, 0xC7FD, 0xC7FE, 0xC7FF, 0xC802, 0xC803, 0xC805, 0xC806, 0xC807, 0xC809, 0xC80B, 0xC80C, 0xC80D, 0xC80E, 0xC80F, 0xC812, 0xC814, 0xC817, 0xC818, 0xC819, 0xC81A, 0xC81B, 0xC81E, 0xC81F, 0xC821, 0xC822, 0xC823, 0xC825, 0xC826, 0xC827, 0xC828, 0xC829, 0xC82A, 0xC82B, 0xC82E, 0xC830, 0xC832, 0xC833, 0xC834, 0xC835, 0xC836, 0xC837, 0xC839, 0xC83A, 0xC83B, 0xC83D, 0xC83E, 0xC83F, 0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, 0xC847, 0xC84A, 0xC84B, 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, 0xC853, 0xC855, 0xC856, 0xC857, 0xC858, 0xC859, 0xC85A, 0xC85B, 0xC85C, 0xC85D, 0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862, 0xC863, 0xC864, 0xC865, 0xC866, 0xC867, 0xC868, 0xC869, 0xC86A, 0xC86B, 0xC86C, 0xC86D, 0xC86E, 0xC86F, 0xC872, 0xC873, 0xC875, 0xC876, 0xC877, 0xC879, 0xC87B, 0xC87C, 0xC87D, 0xC87E, 0xC87F, 0xC882, 0xC884, 0xC888, 0xC889, 0xC88A, 0xC88E, 0xC88F, 0xC890, 0xC891, 0xC892, 0xC893, 0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, 0xC89B, 0xC89C, 0xC89E, 0xC8A0, 0xC8A2, 0xC8A3, 0xC8A4, ERROR}, { ERROR, 0xC8A5, 0xC8A6, 0xC8A7, 0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE, 0xC8AF, 0xC8B0, 0xC8B1, 0xC8B2, 0xC8B3, 0xC8B4, 0xC8B5, 0xC8B6, 0xC8B7, 0xC8B8, 0xC8B9, 0xC8BA, 0xC8BB, 0xC8BE, 0xC8BF, 0xC8C0, 0xC8C1, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC8C2, 0xC8C3, 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C9, 0xC8CA, 0xC8CB, 0xC8CD, 0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D2, 0xC8D3, 0xC8D6, 0xC8D8, 0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, 0xC8DE, 0xC8DF, 0xC8E2, 0xC8E3, 0xC8E5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC8E6, 0xC8E7, 0xC8E8, 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC, 0xC8ED, 0xC8EE, 0xC8EF, 0xC8F0, 0xC8F1, 0xC8F2, 0xC8F3, 0xC8F4, 0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, 0xC8FE, 0xC8FF, 0xC901, 0xC902, 0xC903, 0xC907, 0xC908, 0xC909, 0xC90A, 0xC90B, 0xC90E, 0x3000, 0x3001, 0x3002, 0x00B7, 0x2025, 0x2026, 0x00A8, 0x3003, 0x00AD, 0x2015, 0x2225, 0xFF3C, 0x223C, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2260, 0x2264, 0x2265, 0x221E, 0x2234, 0x00B0, 0x2032, 0x2033, 0x2103, 0x212B, 0xFFE0, 0xFFE1, 0xFFE5, 0x2642, 0x2640, 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00A7, 0x203B, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x2192, 0x2190, 0x2191, 0x2193, 0x2194, 0x3013, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C, 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, 0xFFE2, ERROR}, { ERROR, 0xC910, 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917, 0xC919, 0xC91A, 0xC91B, 0xC91C, 0xC91D, 0xC91E, 0xC91F, 0xC920, 0xC921, 0xC922, 0xC923, 0xC924, 0xC925, 0xC926, 0xC927, 0xC928, 0xC929, 0xC92A, 0xC92B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC92D, 0xC92E, 0xC92F, 0xC930, 0xC931, 0xC932, 0xC933, 0xC935, 0xC936, 0xC937, 0xC938, 0xC939, 0xC93A, 0xC93B, 0xC93C, 0xC93D, 0xC93E, 0xC93F, 0xC940, 0xC941, 0xC942, 0xC943, 0xC944, 0xC945, 0xC946, 0xC947, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC948, 0xC949, 0xC94A, 0xC94B, 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC952, 0xC953, 0xC955, 0xC956, 0xC957, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E, 0xC95F, 0xC962, 0xC964, 0xC965, 0xC966, 0xC967, 0xC968, 0xC969, 0xC96A, 0xC96B, 0xC96D, 0xC96E, 0xC96F, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4, 0xFF5E, 0x02C7, 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB, 0x00A1, 0x00BF, 0x02D0, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109, 0x2030, 0x25C1, 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1, 0x2592, 0x25A4, 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668, 0x260F, 0x260E, 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C, 0x327F, 0x321C, 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121, 0x20AC, 0x00AE, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xC971, 0xC972, 0xC973, 0xC975, 0xC976, 0xC977, 0xC978, 0xC979, 0xC97A, 0xC97B, 0xC97D, 0xC97E, 0xC97F, 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC985, 0xC986, 0xC987, 0xC98A, 0xC98B, 0xC98D, 0xC98E, 0xC98F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC991, 0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997, 0xC99A, 0xC99C, 0xC99E, 0xC99F, 0xC9A0, 0xC9A1, 0xC9A2, 0xC9A3, 0xC9A4, 0xC9A5, 0xC9A6, 0xC9A7, 0xC9A8, 0xC9A9, 0xC9AA, 0xC9AB, 0xC9AC, 0xC9AD, 0xC9AE, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xC9AF, 0xC9B0, 0xC9B1, 0xC9B2, 0xC9B3, 0xC9B4, 0xC9B5, 0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9, 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD, 0xC9BE, 0xC9BF, 0xC9C2, 0xC9C3, 0xC9C5, 0xC9C6, 0xC9C9, 0xC9CB, 0xC9CC, 0xC9CD, 0xC9CE, 0xC9CF, 0xC9D2, 0xC9D4, 0xC9D7, 0xC9D8, 0xC9DB, 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, ERROR}, { ERROR, 0xC9DE, 0xC9DF, 0xC9E1, 0xC9E3, 0xC9E5, 0xC9E6, 0xC9E8, 0xC9E9, 0xC9EA, 0xC9EB, 0xC9EE, 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5, 0xC9F6, 0xC9F7, 0xC9FA, 0xC9FB, 0xC9FD, 0xC9FE, 0xC9FF, 0xCA01, 0xCA02, 0xCA03, 0xCA04, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCA05, 0xCA06, 0xCA07, 0xCA0A, 0xCA0E, 0xCA0F, 0xCA10, 0xCA11, 0xCA12, 0xCA13, 0xCA15, 0xCA16, 0xCA17, 0xCA19, 0xCA1A, 0xCA1B, 0xCA1C, 0xCA1D, 0xCA1E, 0xCA1F, 0xCA20, 0xCA21, 0xCA22, 0xCA23, 0xCA24, 0xCA25, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCA26, 0xCA27, 0xCA28, 0xCA2A, 0xCA2B, 0xCA2C, 0xCA2D, 0xCA2E, 0xCA2F, 0xCA30, 0xCA31, 0xCA32, 0xCA33, 0xCA34, 0xCA35, 0xCA36, 0xCA37, 0xCA38, 0xCA39, 0xCA3A, 0xCA3B, 0xCA3C, 0xCA3D, 0xCA3E, 0xCA3F, 0xCA40, 0xCA41, 0xCA42, 0xCA43, 0xCA44, 0xCA45, 0xCA46, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A, 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316A, 0x316B, 0x316C, 0x316D, 0x316E, 0x316F, 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317A, 0x317B, 0x317C, 0x317D, 0x317E, 0x317F, 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x318A, 0x318B, 0x318C, 0x318D, 0x318E, ERROR}, { ERROR, 0xCA47, 0xCA48, 0xCA49, 0xCA4A, 0xCA4B, 0xCA4E, 0xCA4F, 0xCA51, 0xCA52, 0xCA53, 0xCA55, 0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5E, 0xCA62, 0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA69, 0xCA6A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCA6B, 0xCA6C, 0xCA6D, 0xCA6E, 0xCA6F, 0xCA70, 0xCA71, 0xCA72, 0xCA73, 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, 0xCA79, 0xCA7A, 0xCA7B, 0xCA7C, 0xCA7E, 0xCA7F, 0xCA80, 0xCA81, 0xCA82, 0xCA83, 0xCA85, 0xCA86, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xCA8B, 0xCA8C, 0xCA8D, 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94, 0xCA95, 0xCA96, 0xCA97, 0xCA99, 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, 0xCA9E, 0xCA9F, 0xCAA0, 0xCAA1, 0xCAA2, 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6, 0xCAA7, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, ERROR, ERROR, ERROR, ERROR, ERROR, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xCAA8, 0xCAA9, 0xCAAA, 0xCAAB, 0xCAAC, 0xCAAD, 0xCAAE, 0xCAAF, 0xCAB0, 0xCAB1, 0xCAB2, 0xCAB3, 0xCAB4, 0xCAB5, 0xCAB6, 0xCAB7, 0xCAB8, 0xCAB9, 0xCABA, 0xCABB, 0xCABE, 0xCABF, 0xCAC1, 0xCAC2, 0xCAC3, 0xCAC5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA, 0xCACB, 0xCACE, 0xCAD0, 0xCAD2, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7, 0xCADA, 0xCADB, 0xCADC, 0xCADD, 0xCADE, 0xCADF, 0xCAE1, 0xCAE2, 0xCAE3, 0xCAE4, 0xCAE5, 0xCAE6, 0xCAE7, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCAE8, 0xCAE9, 0xCAEA, 0xCAEB, 0xCAED, 0xCAEE, 0xCAEF, 0xCAF0, 0xCAF1, 0xCAF2, 0xCAF3, 0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, 0xCAF9, 0xCAFA, 0xCAFB, 0xCAFC, 0xCAFD, 0xCAFE, 0xCAFF, 0xCB00, 0xCB01, 0xCB02, 0xCB03, 0xCB04, 0xCB05, 0xCB06, 0xCB07, 0xCB09, 0xCB0A, 0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, 0x2512, 0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E, 0x250D, 0x251E, 0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252A, 0x252D, 0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253A, 0x253D, 0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xCB0B, 0xCB0C, 0xCB0D, 0xCB0E, 0xCB0F, 0xCB11, 0xCB12, 0xCB13, 0xCB15, 0xCB16, 0xCB17, 0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, 0xCB1D, 0xCB1E, 0xCB1F, 0xCB22, 0xCB23, 0xCB24, 0xCB25, 0xCB26, 0xCB27, 0xCB28, 0xCB29, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCB2A, 0xCB2B, 0xCB2C, 0xCB2D, 0xCB2E, 0xCB2F, 0xCB30, 0xCB31, 0xCB32, 0xCB33, 0xCB34, 0xCB35, 0xCB36, 0xCB37, 0xCB38, 0xCB39, 0xCB3A, 0xCB3B, 0xCB3C, 0xCB3D, 0xCB3E, 0xCB3F, 0xCB40, 0xCB42, 0xCB43, 0xCB44, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCB45, 0xCB46, 0xCB47, 0xCB4A, 0xCB4B, 0xCB4D, 0xCB4E, 0xCB4F, 0xCB51, 0xCB52, 0xCB53, 0xCB54, 0xCB55, 0xCB56, 0xCB57, 0xCB5A, 0xCB5B, 0xCB5C, 0xCB5E, 0xCB5F, 0xCB60, 0xCB61, 0xCB62, 0xCB63, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xCB69, 0xCB6A, 0xCB6B, 0xCB6C, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33C4, 0x33A3, 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B, 0x339C, 0x339D, 0x339E, 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA, 0x338D, 0x338E, 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7, 0x33A8, 0x33B0, 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, 0x33B6, 0x33B7, 0x33B8, 0x33B9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33BA, 0x33BB, 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391, 0x3392, 0x3393, 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B, 0x338C, 0x33D6, 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9, 0x33AA, 0x33AB, 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9, 0x33DC, 0x33C6, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xCB71, 0xCB72, 0xCB73, 0xCB74, 0xCB75, 0xCB76, 0xCB77, 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D, 0xCB7E, 0xCB7F, 0xCB80, 0xCB81, 0xCB82, 0xCB83, 0xCB84, 0xCB85, 0xCB86, 0xCB87, 0xCB88, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D, 0xCB8E, 0xCB8F, 0xCB90, 0xCB91, 0xCB92, 0xCB93, 0xCB94, 0xCB95, 0xCB96, 0xCB97, 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9D, 0xCB9E, 0xCB9F, 0xCBA0, 0xCBA1, 0xCBA2, 0xCBA3, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCBA4, 0xCBA5, 0xCBA6, 0xCBA7, 0xCBA8, 0xCBA9, 0xCBAA, 0xCBAB, 0xCBAC, 0xCBAD, 0xCBAE, 0xCBAF, 0xCBB0, 0xCBB1, 0xCBB2, 0xCBB3, 0xCBB4, 0xCBB5, 0xCBB6, 0xCBB7, 0xCBB9, 0xCBBA, 0xCBBB, 0xCBBC, 0xCBBD, 0xCBBE, 0xCBBF, 0xCBC0, 0xCBC1, 0xCBC2, 0xCBC3, 0xCBC4, 0x00C6, 0x00D0, 0x00AA, 0x0126, ERROR, 0x0132, ERROR, 0x013F, 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A, ERROR, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268, 0x3269, 0x326A, 0x326B, 0x326C, 0x326D, 0x326E, 0x326F, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278, 0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC, 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4, 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, 0x00BD, 0x2153, 0x2154, 0x00BC, 0x00BE, 0x215B, 0x215C, 0x215D, 0x215E, ERROR}, { ERROR, 0xCBC5, 0xCBC6, 0xCBC7, 0xCBC8, 0xCBC9, 0xCBCA, 0xCBCB, 0xCBCC, 0xCBCD, 0xCBCE, 0xCBCF, 0xCBD0, 0xCBD1, 0xCBD2, 0xCBD3, 0xCBD5, 0xCBD6, 0xCBD7, 0xCBD8, 0xCBD9, 0xCBDA, 0xCBDB, 0xCBDC, 0xCBDD, 0xCBDE, 0xCBDF, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCBE0, 0xCBE1, 0xCBE2, 0xCBE3, 0xCBE5, 0xCBE6, 0xCBE8, 0xCBEA, 0xCBEB, 0xCBEC, 0xCBED, 0xCBEE, 0xCBEF, 0xCBF0, 0xCBF1, 0xCBF2, 0xCBF3, 0xCBF4, 0xCBF5, 0xCBF6, 0xCBF7, 0xCBF8, 0xCBF9, 0xCBFA, 0xCBFB, 0xCBFC, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCBFD, 0xCBFE, 0xCBFF, 0xCC00, 0xCC01, 0xCC02, 0xCC03, 0xCC04, 0xCC05, 0xCC06, 0xCC07, 0xCC08, 0xCC09, 0xCC0A, 0xCC0B, 0xCC0E, 0xCC0F, 0xCC11, 0xCC12, 0xCC13, 0xCC15, 0xCC16, 0xCC17, 0xCC18, 0xCC19, 0xCC1A, 0xCC1B, 0xCC1E, 0xCC1F, 0xCC20, 0xCC23, 0xCC24, 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0140, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x00FE, 0x0167, 0x014B, 0x0149, 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x320A, 0x320B, 0x320C, 0x320D, 0x320E, 0x320F, 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321A, 0x321B, 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3, 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB, 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3, 0x24B4, 0x24B5, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x207F, 0x2081, 0x2082, 0x2083, 0x2084, ERROR}, { ERROR, 0xCC25, 0xCC26, 0xCC2A, 0xCC2B, 0xCC2D, 0xCC2F, 0xCC31, 0xCC32, 0xCC33, 0xCC34, 0xCC35, 0xCC36, 0xCC37, 0xCC3A, 0xCC3F, 0xCC40, 0xCC41, 0xCC42, 0xCC43, 0xCC46, 0xCC47, 0xCC49, 0xCC4A, 0xCC4B, 0xCC4D, 0xCC4E, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53, 0xCC56, 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC61, 0xCC62, 0xCC63, 0xCC65, 0xCC67, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C, 0xCC6D, 0xCC6E, 0xCC6F, 0xCC71, 0xCC72, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCC73, 0xCC74, 0xCC76, 0xCC77, 0xCC78, 0xCC79, 0xCC7A, 0xCC7B, 0xCC7C, 0xCC7D, 0xCC7E, 0xCC7F, 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86, 0xCC87, 0xCC88, 0xCC89, 0xCC8A, 0xCC8B, 0xCC8C, 0xCC8D, 0xCC8E, 0xCC8F, 0xCC90, 0xCC91, 0xCC92, 0xCC93, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xCC94, 0xCC95, 0xCC96, 0xCC97, 0xCC9A, 0xCC9B, 0xCC9D, 0xCC9E, 0xCC9F, 0xCCA1, 0xCCA2, 0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6, 0xCCA7, 0xCCAA, 0xCCAE, 0xCCAF, 0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3, 0xCCB6, 0xCCB7, 0xCCB9, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCCBA, 0xCCBB, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, 0xCCC2, 0xCCC3, 0xCCC6, 0xCCC8, 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF, 0xCCD1, 0xCCD2, 0xCCD3, 0xCCD5, 0xCCD6, 0xCCD7, 0xCCD8, 0xCCD9, 0xCCDA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCCDB, 0xCCDC, 0xCCDD, 0xCCDE, 0xCCDF, 0xCCE0, 0xCCE1, 0xCCE2, 0xCCE3, 0xCCE5, 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA, 0xCCEB, 0xCCED, 0xCCEE, 0xCCEF, 0xCCF1, 0xCCF2, 0xCCF3, 0xCCF4, 0xCCF5, 0xCCF6, 0xCCF7, 0xCCF8, 0xCCF9, 0xCCFA, 0xCCFB, 0xCCFC, 0xCCFD, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xCCFE, 0xCCFF, 0xCD00, 0xCD02, 0xCD03, 0xCD04, 0xCD05, 0xCD06, 0xCD07, 0xCD0A, 0xCD0B, 0xCD0D, 0xCD0E, 0xCD0F, 0xCD11, 0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16, 0xCD17, 0xCD1A, 0xCD1C, 0xCD1E, 0xCD1F, 0xCD20, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCD21, 0xCD22, 0xCD23, 0xCD25, 0xCD26, 0xCD27, 0xCD29, 0xCD2A, 0xCD2B, 0xCD2D, 0xCD2E, 0xCD2F, 0xCD30, 0xCD31, 0xCD32, 0xCD33, 0xCD34, 0xCD35, 0xCD36, 0xCD37, 0xCD38, 0xCD3A, 0xCD3B, 0xCD3C, 0xCD3D, 0xCD3E, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCD3F, 0xCD40, 0xCD41, 0xCD42, 0xCD43, 0xCD44, 0xCD45, 0xCD46, 0xCD47, 0xCD48, 0xCD49, 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E, 0xCD4F, 0xCD50, 0xCD51, 0xCD52, 0xCD53, 0xCD54, 0xCD55, 0xCD56, 0xCD57, 0xCD58, 0xCD59, 0xCD5A, 0xCD5B, 0xCD5D, 0xCD5E, 0xCD5F, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xCD61, 0xCD62, 0xCD63, 0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A, 0xCD6B, 0xCD6E, 0xCD70, 0xCD72, 0xCD73, 0xCD74, 0xCD75, 0xCD76, 0xCD77, 0xCD79, 0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, 0xCD7E, 0xCD7F, 0xCD80, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCD81, 0xCD82, 0xCD83, 0xCD84, 0xCD85, 0xCD86, 0xCD87, 0xCD89, 0xCD8A, 0xCD8B, 0xCD8C, 0xCD8D, 0xCD8E, 0xCD8F, 0xCD90, 0xCD91, 0xCD92, 0xCD93, 0xCD96, 0xCD97, 0xCD99, 0xCD9A, 0xCD9B, 0xCD9D, 0xCD9E, 0xCD9F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCDA0, 0xCDA1, 0xCDA2, 0xCDA3, 0xCDA6, 0xCDA8, 0xCDAA, 0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, 0xCDB1, 0xCDB2, 0xCDB3, 0xCDB4, 0xCDB5, 0xCDB6, 0xCDB7, 0xCDB8, 0xCDB9, 0xCDBA, 0xCDBB, 0xCDBC, 0xCDBD, 0xCDBE, 0xCDBF, 0xCDC0, 0xCDC1, 0xCDC2, 0xCDC3, 0xCDC5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, 0xCDCD, 0xCDCE, 0xCDCF, 0xCDD1, 0xCDD2, 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6, 0xCDD7, 0xCDD8, 0xCDD9, 0xCDDA, 0xCDDB, 0xCDDC, 0xCDDD, 0xCDDE, 0xCDDF, 0xCDE0, 0xCDE1, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCDE2, 0xCDE3, 0xCDE4, 0xCDE5, 0xCDE6, 0xCDE7, 0xCDE9, 0xCDEA, 0xCDEB, 0xCDED, 0xCDEE, 0xCDEF, 0xCDF1, 0xCDF2, 0xCDF3, 0xCDF4, 0xCDF5, 0xCDF6, 0xCDF7, 0xCDFA, 0xCDFC, 0xCDFE, 0xCDFF, 0xCE00, 0xCE01, 0xCE02, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCE03, 0xCE05, 0xCE06, 0xCE07, 0xCE09, 0xCE0A, 0xCE0B, 0xCE0D, 0xCE0E, 0xCE0F, 0xCE10, 0xCE11, 0xCE12, 0xCE13, 0xCE15, 0xCE16, 0xCE17, 0xCE18, 0xCE1A, 0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, 0xCE1F, 0xCE22, 0xCE23, 0xCE25, 0xCE26, 0xCE27, 0xCE29, 0xCE2A, 0xCE2B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xCE2C, 0xCE2D, 0xCE2E, 0xCE2F, 0xCE32, 0xCE34, 0xCE36, 0xCE37, 0xCE38, 0xCE39, 0xCE3A, 0xCE3B, 0xCE3C, 0xCE3D, 0xCE3E, 0xCE3F, 0xCE40, 0xCE41, 0xCE42, 0xCE43, 0xCE44, 0xCE45, 0xCE46, 0xCE47, 0xCE48, 0xCE49, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCE4A, 0xCE4B, 0xCE4C, 0xCE4D, 0xCE4E, 0xCE4F, 0xCE50, 0xCE51, 0xCE52, 0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, 0xCE5A, 0xCE5B, 0xCE5D, 0xCE5E, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66, 0xCE67, 0xCE6A, 0xCE6C, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73, 0xCE76, 0xCE77, 0xCE79, 0xCE7A, 0xCE7B, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80, 0xCE81, 0xCE82, 0xCE83, 0xCE86, 0xCE88, 0xCE8A, 0xCE8B, 0xCE8C, 0xCE8D, 0xCE8E, 0xCE8F, 0xCE92, 0xCE93, 0xCE95, 0xCE96, 0xCE97, 0xCE99, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA2, 0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, 0xCEAE, 0xCEAF, 0xCEB0, 0xCEB1, 0xCEB2, 0xCEB3, 0xCEB4, 0xCEB5, 0xCEB6, 0xCEB7, 0xCEB8, 0xCEB9, 0xCEBA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCEBB, 0xCEBC, 0xCEBD, 0xCEBE, 0xCEBF, 0xCEC0, 0xCEC2, 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, 0xCEC7, 0xCEC8, 0xCEC9, 0xCECA, 0xCECB, 0xCECC, 0xCECD, 0xCECE, 0xCECF, 0xCED0, 0xCED1, 0xCED2, 0xCED3, 0xCED4, 0xCED5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCED6, 0xCED7, 0xCED8, 0xCED9, 0xCEDA, 0xCEDB, 0xCEDC, 0xCEDD, 0xCEDE, 0xCEDF, 0xCEE0, 0xCEE1, 0xCEE2, 0xCEE3, 0xCEE6, 0xCEE7, 0xCEE9, 0xCEEA, 0xCEED, 0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, 0xCEF2, 0xCEF3, 0xCEF6, 0xCEFA, 0xCEFB, 0xCEFC, 0xCEFD, 0xCEFE, 0xCEFF, 0xAC00, 0xAC01, 0xAC04, 0xAC07, 0xAC08, 0xAC09, 0xAC0A, 0xAC10, 0xAC11, 0xAC12, 0xAC13, 0xAC14, 0xAC15, 0xAC16, 0xAC17, 0xAC19, 0xAC1A, 0xAC1B, 0xAC1C, 0xAC1D, 0xAC20, 0xAC24, 0xAC2C, 0xAC2D, 0xAC2F, 0xAC30, 0xAC31, 0xAC38, 0xAC39, 0xAC3C, 0xAC40, 0xAC4B, 0xAC4D, 0xAC54, 0xAC58, 0xAC5C, 0xAC70, 0xAC71, 0xAC74, 0xAC77, 0xAC78, 0xAC7A, 0xAC80, 0xAC81, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xAC89, 0xAC8A, 0xAC8B, 0xAC8C, 0xAC90, 0xAC94, 0xAC9C, 0xAC9D, 0xAC9F, 0xACA0, 0xACA1, 0xACA8, 0xACA9, 0xACAA, 0xACAC, 0xACAF, 0xACB0, 0xACB8, 0xACB9, 0xACBB, 0xACBC, 0xACBD, 0xACC1, 0xACC4, 0xACC8, 0xACCC, 0xACD5, 0xACD7, 0xACE0, 0xACE1, 0xACE4, 0xACE7, 0xACE8, 0xACEA, 0xACEC, 0xACEF, 0xACF0, 0xACF1, 0xACF3, 0xACF5, 0xACF6, 0xACFC, 0xACFD, 0xAD00, 0xAD04, 0xAD06, ERROR}, { ERROR, 0xCF02, 0xCF03, 0xCF05, 0xCF06, 0xCF07, 0xCF09, 0xCF0A, 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E, 0xCF0F, 0xCF12, 0xCF14, 0xCF16, 0xCF17, 0xCF18, 0xCF19, 0xCF1A, 0xCF1B, 0xCF1D, 0xCF1E, 0xCF1F, 0xCF21, 0xCF22, 0xCF23, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCF25, 0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A, 0xCF2B, 0xCF2E, 0xCF32, 0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, 0xCF39, 0xCF3A, 0xCF3B, 0xCF3C, 0xCF3D, 0xCF3E, 0xCF3F, 0xCF40, 0xCF41, 0xCF42, 0xCF43, 0xCF44, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCF45, 0xCF46, 0xCF47, 0xCF48, 0xCF49, 0xCF4A, 0xCF4B, 0xCF4C, 0xCF4D, 0xCF4E, 0xCF4F, 0xCF50, 0xCF51, 0xCF52, 0xCF53, 0xCF56, 0xCF57, 0xCF59, 0xCF5A, 0xCF5B, 0xCF5D, 0xCF5E, 0xCF5F, 0xCF60, 0xCF61, 0xCF62, 0xCF63, 0xCF66, 0xCF68, 0xCF6A, 0xCF6B, 0xCF6C, 0xAD0C, 0xAD0D, 0xAD0F, 0xAD11, 0xAD18, 0xAD1C, 0xAD20, 0xAD29, 0xAD2C, 0xAD2D, 0xAD34, 0xAD35, 0xAD38, 0xAD3C, 0xAD44, 0xAD45, 0xAD47, 0xAD49, 0xAD50, 0xAD54, 0xAD58, 0xAD61, 0xAD63, 0xAD6C, 0xAD6D, 0xAD70, 0xAD73, 0xAD74, 0xAD75, 0xAD76, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7F, 0xAD81, 0xAD82, 0xAD88, 0xAD89, 0xAD8C, 0xAD90, 0xAD9C, 0xAD9D, 0xADA4, 0xADB7, 0xADC0, 0xADC1, 0xADC4, 0xADC8, 0xADD0, 0xADD1, 0xADD3, 0xADDC, 0xADE0, 0xADE4, 0xADF8, 0xADF9, 0xADFC, 0xADFF, 0xAE00, 0xAE01, 0xAE08, 0xAE09, 0xAE0B, 0xAE0D, 0xAE14, 0xAE30, 0xAE31, 0xAE34, 0xAE37, 0xAE38, 0xAE3A, 0xAE40, 0xAE41, 0xAE43, 0xAE45, 0xAE46, 0xAE4A, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE50, 0xAE54, 0xAE56, 0xAE5C, 0xAE5D, 0xAE5F, 0xAE60, 0xAE61, 0xAE65, 0xAE68, 0xAE69, 0xAE6C, 0xAE70, 0xAE78, ERROR}, { ERROR, 0xCF6D, 0xCF6E, 0xCF6F, 0xCF72, 0xCF73, 0xCF75, 0xCF76, 0xCF77, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, 0xCF7E, 0xCF7F, 0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF86, 0xCF87, 0xCF88, 0xCF89, 0xCF8A, 0xCF8B, 0xCF8D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92, 0xCF93, 0xCF94, 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, 0xCF9A, 0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA2, 0xCFA3, 0xCFA4, 0xCFA5, 0xCFA6, 0xCFA7, 0xCFA9, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCFAA, 0xCFAB, 0xCFAC, 0xCFAD, 0xCFAE, 0xCFAF, 0xCFB1, 0xCFB2, 0xCFB3, 0xCFB4, 0xCFB5, 0xCFB6, 0xCFB7, 0xCFB8, 0xCFB9, 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD, 0xCFBE, 0xCFBF, 0xCFC0, 0xCFC1, 0xCFC2, 0xCFC3, 0xCFC5, 0xCFC6, 0xCFC7, 0xCFC8, 0xCFC9, 0xCFCA, 0xCFCB, 0xAE79, 0xAE7B, 0xAE7C, 0xAE7D, 0xAE84, 0xAE85, 0xAE8C, 0xAEBC, 0xAEBD, 0xAEBE, 0xAEC0, 0xAEC4, 0xAECC, 0xAECD, 0xAECF, 0xAED0, 0xAED1, 0xAED8, 0xAED9, 0xAEDC, 0xAEE8, 0xAEEB, 0xAEED, 0xAEF4, 0xAEF8, 0xAEFC, 0xAF07, 0xAF08, 0xAF0D, 0xAF10, 0xAF2C, 0xAF2D, 0xAF30, 0xAF32, 0xAF34, 0xAF3C, 0xAF3D, 0xAF3F, 0xAF41, 0xAF42, 0xAF43, 0xAF48, 0xAF49, 0xAF50, 0xAF5C, 0xAF5D, 0xAF64, 0xAF65, 0xAF79, 0xAF80, 0xAF84, 0xAF88, 0xAF90, 0xAF91, 0xAF95, 0xAF9C, 0xAFB8, 0xAFB9, 0xAFBC, 0xAFC0, 0xAFC7, 0xAFC8, 0xAFC9, 0xAFCB, 0xAFCD, 0xAFCE, 0xAFD4, 0xAFDC, 0xAFE8, 0xAFE9, 0xAFF0, 0xAFF1, 0xAFF4, 0xAFF8, 0xB000, 0xB001, 0xB004, 0xB00C, 0xB010, 0xB014, 0xB01C, 0xB01D, 0xB028, 0xB044, 0xB045, 0xB048, 0xB04A, 0xB04C, 0xB04E, 0xB053, 0xB054, 0xB055, 0xB057, 0xB059, ERROR}, { ERROR, 0xCFCC, 0xCFCD, 0xCFCE, 0xCFCF, 0xCFD0, 0xCFD1, 0xCFD2, 0xCFD3, 0xCFD4, 0xCFD5, 0xCFD6, 0xCFD7, 0xCFD8, 0xCFD9, 0xCFDA, 0xCFDB, 0xCFDC, 0xCFDD, 0xCFDE, 0xCFDF, 0xCFE2, 0xCFE3, 0xCFE5, 0xCFE6, 0xCFE7, 0xCFE9, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xCFEA, 0xCFEB, 0xCFEC, 0xCFED, 0xCFEE, 0xCFEF, 0xCFF2, 0xCFF4, 0xCFF6, 0xCFF7, 0xCFF8, 0xCFF9, 0xCFFA, 0xCFFB, 0xCFFD, 0xCFFE, 0xCFFF, 0xD001, 0xD002, 0xD003, 0xD005, 0xD006, 0xD007, 0xD008, 0xD009, 0xD00A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD00B, 0xD00C, 0xD00D, 0xD00E, 0xD00F, 0xD010, 0xD012, 0xD013, 0xD014, 0xD015, 0xD016, 0xD017, 0xD019, 0xD01A, 0xD01B, 0xD01C, 0xD01D, 0xD01E, 0xD01F, 0xD020, 0xD021, 0xD022, 0xD023, 0xD024, 0xD025, 0xD026, 0xD027, 0xD028, 0xD029, 0xD02A, 0xD02B, 0xD02C, 0xB05D, 0xB07C, 0xB07D, 0xB080, 0xB084, 0xB08C, 0xB08D, 0xB08F, 0xB091, 0xB098, 0xB099, 0xB09A, 0xB09C, 0xB09F, 0xB0A0, 0xB0A1, 0xB0A2, 0xB0A8, 0xB0A9, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, 0xB0AF, 0xB0B1, 0xB0B3, 0xB0B4, 0xB0B5, 0xB0B8, 0xB0BC, 0xB0C4, 0xB0C5, 0xB0C7, 0xB0C8, 0xB0C9, 0xB0D0, 0xB0D1, 0xB0D4, 0xB0D8, 0xB0E0, 0xB0E5, 0xB108, 0xB109, 0xB10B, 0xB10C, 0xB110, 0xB112, 0xB113, 0xB118, 0xB119, 0xB11B, 0xB11C, 0xB11D, 0xB123, 0xB124, 0xB125, 0xB128, 0xB12C, 0xB134, 0xB135, 0xB137, 0xB138, 0xB139, 0xB140, 0xB141, 0xB144, 0xB148, 0xB150, 0xB151, 0xB154, 0xB155, 0xB158, 0xB15C, 0xB160, 0xB178, 0xB179, 0xB17C, 0xB180, 0xB182, 0xB188, 0xB189, 0xB18B, 0xB18D, 0xB192, 0xB193, 0xB194, 0xB198, 0xB19C, 0xB1A8, 0xB1CC, 0xB1D0, 0xB1D4, 0xB1DC, 0xB1DD, ERROR}, { ERROR, 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, 0xD036, 0xD037, 0xD039, 0xD03A, 0xD03B, 0xD03D, 0xD03E, 0xD03F, 0xD040, 0xD041, 0xD042, 0xD043, 0xD046, 0xD048, 0xD04A, 0xD04B, 0xD04C, 0xD04D, 0xD04E, 0xD04F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD051, 0xD052, 0xD053, 0xD055, 0xD056, 0xD057, 0xD059, 0xD05A, 0xD05B, 0xD05C, 0xD05D, 0xD05E, 0xD05F, 0xD061, 0xD062, 0xD063, 0xD064, 0xD065, 0xD066, 0xD067, 0xD068, 0xD069, 0xD06A, 0xD06B, 0xD06E, 0xD06F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD071, 0xD072, 0xD073, 0xD075, 0xD076, 0xD077, 0xD078, 0xD079, 0xD07A, 0xD07B, 0xD07E, 0xD07F, 0xD080, 0xD082, 0xD083, 0xD084, 0xD085, 0xD086, 0xD087, 0xD088, 0xD089, 0xD08A, 0xD08B, 0xD08C, 0xD08D, 0xD08E, 0xD08F, 0xD090, 0xD091, 0xD092, 0xD093, 0xD094, 0xB1DF, 0xB1E8, 0xB1E9, 0xB1EC, 0xB1F0, 0xB1F9, 0xB1FB, 0xB1FD, 0xB204, 0xB205, 0xB208, 0xB20B, 0xB20C, 0xB214, 0xB215, 0xB217, 0xB219, 0xB220, 0xB234, 0xB23C, 0xB258, 0xB25C, 0xB260, 0xB268, 0xB269, 0xB274, 0xB275, 0xB27C, 0xB284, 0xB285, 0xB289, 0xB290, 0xB291, 0xB294, 0xB298, 0xB299, 0xB29A, 0xB2A0, 0xB2A1, 0xB2A3, 0xB2A5, 0xB2A6, 0xB2AA, 0xB2AC, 0xB2B0, 0xB2B4, 0xB2C8, 0xB2C9, 0xB2CC, 0xB2D0, 0xB2D2, 0xB2D8, 0xB2D9, 0xB2DB, 0xB2DD, 0xB2E2, 0xB2E4, 0xB2E5, 0xB2E6, 0xB2E8, 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F3, 0xB2F4, 0xB2F5, 0xB2F7, 0xB2F8, 0xB2F9, 0xB2FA, 0xB2FB, 0xB2FF, 0xB300, 0xB301, 0xB304, 0xB308, 0xB310, 0xB311, 0xB313, 0xB314, 0xB315, 0xB31C, 0xB354, 0xB355, 0xB356, 0xB358, 0xB35B, 0xB35C, 0xB35E, 0xB35F, 0xB364, 0xB365, ERROR}, { ERROR, 0xD095, 0xD096, 0xD097, 0xD098, 0xD099, 0xD09A, 0xD09B, 0xD09C, 0xD09D, 0xD09E, 0xD09F, 0xD0A0, 0xD0A1, 0xD0A2, 0xD0A3, 0xD0A6, 0xD0A7, 0xD0A9, 0xD0AA, 0xD0AB, 0xD0AD, 0xD0AE, 0xD0AF, 0xD0B0, 0xD0B1, 0xD0B2, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD0B3, 0xD0B6, 0xD0B8, 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, 0xD0BE, 0xD0BF, 0xD0C2, 0xD0C3, 0xD0C5, 0xD0C6, 0xD0C7, 0xD0CA, 0xD0CB, 0xD0CC, 0xD0CD, 0xD0CE, 0xD0CF, 0xD0D2, 0xD0D6, 0xD0D7, 0xD0D8, 0xD0D9, 0xD0DA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD0DB, 0xD0DE, 0xD0DF, 0xD0E1, 0xD0E2, 0xD0E3, 0xD0E5, 0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA, 0xD0EB, 0xD0EE, 0xD0F2, 0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, 0xD0F9, 0xD0FA, 0xD0FB, 0xD0FC, 0xD0FD, 0xD0FE, 0xD0FF, 0xD100, 0xD101, 0xD102, 0xD103, 0xD104, 0xB367, 0xB369, 0xB36B, 0xB36E, 0xB370, 0xB371, 0xB374, 0xB378, 0xB380, 0xB381, 0xB383, 0xB384, 0xB385, 0xB38C, 0xB390, 0xB394, 0xB3A0, 0xB3A1, 0xB3A8, 0xB3AC, 0xB3C4, 0xB3C5, 0xB3C8, 0xB3CB, 0xB3CC, 0xB3CE, 0xB3D0, 0xB3D4, 0xB3D5, 0xB3D7, 0xB3D9, 0xB3DB, 0xB3DD, 0xB3E0, 0xB3E4, 0xB3E8, 0xB3FC, 0xB410, 0xB418, 0xB41C, 0xB420, 0xB428, 0xB429, 0xB42B, 0xB434, 0xB450, 0xB451, 0xB454, 0xB458, 0xB460, 0xB461, 0xB463, 0xB465, 0xB46C, 0xB480, 0xB488, 0xB49D, 0xB4A4, 0xB4A8, 0xB4AC, 0xB4B5, 0xB4B7, 0xB4B9, 0xB4C0, 0xB4C4, 0xB4C8, 0xB4D0, 0xB4D5, 0xB4DC, 0xB4DD, 0xB4E0, 0xB4E3, 0xB4E4, 0xB4E6, 0xB4EC, 0xB4ED, 0xB4EF, 0xB4F1, 0xB4F8, 0xB514, 0xB515, 0xB518, 0xB51B, 0xB51C, 0xB524, 0xB525, 0xB527, 0xB528, 0xB529, 0xB52A, 0xB530, 0xB531, 0xB534, 0xB538, ERROR}, { ERROR, 0xD105, 0xD106, 0xD107, 0xD108, 0xD109, 0xD10A, 0xD10B, 0xD10C, 0xD10E, 0xD10F, 0xD110, 0xD111, 0xD112, 0xD113, 0xD114, 0xD115, 0xD116, 0xD117, 0xD118, 0xD119, 0xD11A, 0xD11B, 0xD11C, 0xD11D, 0xD11E, 0xD11F, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD120, 0xD121, 0xD122, 0xD123, 0xD124, 0xD125, 0xD126, 0xD127, 0xD128, 0xD129, 0xD12A, 0xD12B, 0xD12C, 0xD12D, 0xD12E, 0xD12F, 0xD132, 0xD133, 0xD135, 0xD136, 0xD137, 0xD139, 0xD13B, 0xD13C, 0xD13D, 0xD13E, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD13F, 0xD142, 0xD146, 0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B, 0xD14E, 0xD14F, 0xD151, 0xD152, 0xD153, 0xD155, 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A, 0xD15B, 0xD15E, 0xD160, 0xD162, 0xD163, 0xD164, 0xD165, 0xD166, 0xD167, 0xD169, 0xD16A, 0xD16B, 0xD16D, 0xB540, 0xB541, 0xB543, 0xB544, 0xB545, 0xB54B, 0xB54C, 0xB54D, 0xB550, 0xB554, 0xB55C, 0xB55D, 0xB55F, 0xB560, 0xB561, 0xB5A0, 0xB5A1, 0xB5A4, 0xB5A8, 0xB5AA, 0xB5AB, 0xB5B0, 0xB5B1, 0xB5B3, 0xB5B4, 0xB5B5, 0xB5BB, 0xB5BC, 0xB5BD, 0xB5C0, 0xB5C4, 0xB5CC, 0xB5CD, 0xB5CF, 0xB5D0, 0xB5D1, 0xB5D8, 0xB5EC, 0xB610, 0xB611, 0xB614, 0xB618, 0xB625, 0xB62C, 0xB634, 0xB648, 0xB664, 0xB668, 0xB69C, 0xB69D, 0xB6A0, 0xB6A4, 0xB6AB, 0xB6AC, 0xB6B1, 0xB6D4, 0xB6F0, 0xB6F4, 0xB6F8, 0xB700, 0xB701, 0xB705, 0xB728, 0xB729, 0xB72C, 0xB72F, 0xB730, 0xB738, 0xB739, 0xB73B, 0xB744, 0xB748, 0xB74C, 0xB754, 0xB755, 0xB760, 0xB764, 0xB768, 0xB770, 0xB771, 0xB773, 0xB775, 0xB77C, 0xB77D, 0xB780, 0xB784, 0xB78C, 0xB78D, 0xB78F, 0xB790, 0xB791, 0xB792, 0xB796, 0xB797, ERROR}, { ERROR, 0xD16E, 0xD16F, 0xD170, 0xD171, 0xD172, 0xD173, 0xD174, 0xD175, 0xD176, 0xD177, 0xD178, 0xD179, 0xD17A, 0xD17B, 0xD17D, 0xD17E, 0xD17F, 0xD180, 0xD181, 0xD182, 0xD183, 0xD185, 0xD186, 0xD187, 0xD189, 0xD18A, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD18B, 0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, 0xD192, 0xD193, 0xD194, 0xD195, 0xD196, 0xD197, 0xD198, 0xD199, 0xD19A, 0xD19B, 0xD19C, 0xD19D, 0xD19E, 0xD19F, 0xD1A2, 0xD1A3, 0xD1A5, 0xD1A6, 0xD1A7, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF, 0xD1B2, 0xD1B4, 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BB, 0xD1BD, 0xD1BE, 0xD1BF, 0xD1C1, 0xD1C2, 0xD1C3, 0xD1C4, 0xD1C5, 0xD1C6, 0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA, 0xD1CB, 0xD1CC, 0xD1CD, 0xD1CE, 0xD1CF, 0xB798, 0xB799, 0xB79C, 0xB7A0, 0xB7A8, 0xB7A9, 0xB7AB, 0xB7AC, 0xB7AD, 0xB7B4, 0xB7B5, 0xB7B8, 0xB7C7, 0xB7C9, 0xB7EC, 0xB7ED, 0xB7F0, 0xB7F4, 0xB7FC, 0xB7FD, 0xB7FF, 0xB800, 0xB801, 0xB807, 0xB808, 0xB809, 0xB80C, 0xB810, 0xB818, 0xB819, 0xB81B, 0xB81D, 0xB824, 0xB825, 0xB828, 0xB82C, 0xB834, 0xB835, 0xB837, 0xB838, 0xB839, 0xB840, 0xB844, 0xB851, 0xB853, 0xB85C, 0xB85D, 0xB860, 0xB864, 0xB86C, 0xB86D, 0xB86F, 0xB871, 0xB878, 0xB87C, 0xB88D, 0xB8A8, 0xB8B0, 0xB8B4, 0xB8B8, 0xB8C0, 0xB8C1, 0xB8C3, 0xB8C5, 0xB8CC, 0xB8D0, 0xB8D4, 0xB8DD, 0xB8DF, 0xB8E1, 0xB8E8, 0xB8E9, 0xB8EC, 0xB8F0, 0xB8F8, 0xB8F9, 0xB8FB, 0xB8FD, 0xB904, 0xB918, 0xB920, 0xB93C, 0xB93D, 0xB940, 0xB944, 0xB94C, 0xB94F, 0xB951, 0xB958, 0xB959, 0xB95C, 0xB960, 0xB968, 0xB969, ERROR}, { ERROR, 0xD1D0, 0xD1D1, 0xD1D2, 0xD1D3, 0xD1D4, 0xD1D5, 0xD1D6, 0xD1D7, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, 0xD1DE, 0xD1DF, 0xD1E0, 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6, 0xD1E7, 0xD1E8, 0xD1E9, 0xD1EA, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD1EB, 0xD1EC, 0xD1ED, 0xD1EE, 0xD1EF, 0xD1F0, 0xD1F1, 0xD1F2, 0xD1F3, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F9, 0xD1FA, 0xD1FB, 0xD1FC, 0xD1FD, 0xD1FE, 0xD1FF, 0xD200, 0xD201, 0xD202, 0xD203, 0xD204, 0xD205, 0xD206, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD208, 0xD20A, 0xD20B, 0xD20C, 0xD20D, 0xD20E, 0xD20F, 0xD211, 0xD212, 0xD213, 0xD214, 0xD215, 0xD216, 0xD217, 0xD218, 0xD219, 0xD21A, 0xD21B, 0xD21C, 0xD21D, 0xD21E, 0xD21F, 0xD220, 0xD221, 0xD222, 0xD223, 0xD224, 0xD225, 0xD226, 0xD227, 0xD228, 0xD229, 0xB96B, 0xB96D, 0xB974, 0xB975, 0xB978, 0xB97C, 0xB984, 0xB985, 0xB987, 0xB989, 0xB98A, 0xB98D, 0xB98E, 0xB9AC, 0xB9AD, 0xB9B0, 0xB9B4, 0xB9BC, 0xB9BD, 0xB9BF, 0xB9C1, 0xB9C8, 0xB9C9, 0xB9CC, 0xB9CE, 0xB9CF, 0xB9D0, 0xB9D1, 0xB9D2, 0xB9D8, 0xB9D9, 0xB9DB, 0xB9DD, 0xB9DE, 0xB9E1, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E8, 0xB9EC, 0xB9F4, 0xB9F5, 0xB9F7, 0xB9F8, 0xB9F9, 0xB9FA, 0xBA00, 0xBA01, 0xBA08, 0xBA15, 0xBA38, 0xBA39, 0xBA3C, 0xBA40, 0xBA42, 0xBA48, 0xBA49, 0xBA4B, 0xBA4D, 0xBA4E, 0xBA53, 0xBA54, 0xBA55, 0xBA58, 0xBA5C, 0xBA64, 0xBA65, 0xBA67, 0xBA68, 0xBA69, 0xBA70, 0xBA71, 0xBA74, 0xBA78, 0xBA83, 0xBA84, 0xBA85, 0xBA87, 0xBA8C, 0xBAA8, 0xBAA9, 0xBAAB, 0xBAAC, 0xBAB0, 0xBAB2, 0xBAB8, 0xBAB9, 0xBABB, 0xBABD, 0xBAC4, 0xBAC8, 0xBAD8, 0xBAD9, 0xBAFC, ERROR}, { ERROR, 0xD22A, 0xD22B, 0xD22E, 0xD22F, 0xD231, 0xD232, 0xD233, 0xD235, 0xD236, 0xD237, 0xD238, 0xD239, 0xD23A, 0xD23B, 0xD23E, 0xD240, 0xD242, 0xD243, 0xD244, 0xD245, 0xD246, 0xD247, 0xD249, 0xD24A, 0xD24B, 0xD24C, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD24D, 0xD24E, 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255, 0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25D, 0xD25E, 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0xD265, 0xD266, 0xD267, 0xD268, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD269, 0xD26A, 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F, 0xD270, 0xD271, 0xD272, 0xD273, 0xD274, 0xD275, 0xD276, 0xD277, 0xD278, 0xD279, 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xD27E, 0xD27F, 0xD282, 0xD283, 0xD285, 0xD286, 0xD287, 0xD289, 0xD28A, 0xD28B, 0xD28C, 0xBB00, 0xBB04, 0xBB0D, 0xBB0F, 0xBB11, 0xBB18, 0xBB1C, 0xBB20, 0xBB29, 0xBB2B, 0xBB34, 0xBB35, 0xBB36, 0xBB38, 0xBB3B, 0xBB3C, 0xBB3D, 0xBB3E, 0xBB44, 0xBB45, 0xBB47, 0xBB49, 0xBB4D, 0xBB4F, 0xBB50, 0xBB54, 0xBB58, 0xBB61, 0xBB63, 0xBB6C, 0xBB88, 0xBB8C, 0xBB90, 0xBBA4, 0xBBA8, 0xBBAC, 0xBBB4, 0xBBB7, 0xBBC0, 0xBBC4, 0xBBC8, 0xBBD0, 0xBBD3, 0xBBF8, 0xBBF9, 0xBBFC, 0xBBFF, 0xBC00, 0xBC02, 0xBC08, 0xBC09, 0xBC0B, 0xBC0C, 0xBC0D, 0xBC0F, 0xBC11, 0xBC14, 0xBC15, 0xBC16, 0xBC17, 0xBC18, 0xBC1B, 0xBC1C, 0xBC1D, 0xBC1E, 0xBC1F, 0xBC24, 0xBC25, 0xBC27, 0xBC29, 0xBC2D, 0xBC30, 0xBC31, 0xBC34, 0xBC38, 0xBC40, 0xBC41, 0xBC43, 0xBC44, 0xBC45, 0xBC49, 0xBC4C, 0xBC4D, 0xBC50, 0xBC5D, 0xBC84, 0xBC85, 0xBC88, 0xBC8B, 0xBC8C, 0xBC8E, 0xBC94, 0xBC95, 0xBC97, ERROR}, { ERROR, 0xD28D, 0xD28E, 0xD28F, 0xD292, 0xD293, 0xD294, 0xD296, 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29D, 0xD29E, 0xD29F, 0xD2A1, 0xD2A2, 0xD2A3, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9, 0xD2AA, 0xD2AB, 0xD2AD, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B2, 0xD2B3, 0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, 0xD2BA, 0xD2BB, 0xD2BD, 0xD2BE, 0xD2C1, 0xD2C3, 0xD2C4, 0xD2C5, 0xD2C6, 0xD2C7, 0xD2CA, 0xD2CC, 0xD2CD, 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD2D2, 0xD2D3, 0xD2D5, 0xD2D6, 0xD2D7, 0xD2D9, 0xD2DA, 0xD2DB, 0xD2DD, 0xD2DE, 0xD2DF, 0xD2E0, 0xD2E1, 0xD2E2, 0xD2E3, 0xD2E6, 0xD2E7, 0xD2E8, 0xD2E9, 0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, 0xD2EE, 0xD2EF, 0xD2F2, 0xD2F3, 0xD2F5, 0xD2F6, 0xD2F7, 0xD2F9, 0xD2FA, 0xBC99, 0xBC9A, 0xBCA0, 0xBCA1, 0xBCA4, 0xBCA7, 0xBCA8, 0xBCB0, 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, 0xBCBC, 0xBCBD, 0xBCC0, 0xBCC4, 0xBCCD, 0xBCCF, 0xBCD0, 0xBCD1, 0xBCD5, 0xBCD8, 0xBCDC, 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF8, 0xBCFC, 0xBD04, 0xBD05, 0xBD07, 0xBD09, 0xBD10, 0xBD14, 0xBD24, 0xBD2C, 0xBD40, 0xBD48, 0xBD49, 0xBD4C, 0xBD50, 0xBD58, 0xBD59, 0xBD64, 0xBD68, 0xBD80, 0xBD81, 0xBD84, 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD90, 0xBD91, 0xBD93, 0xBD95, 0xBD99, 0xBD9A, 0xBD9C, 0xBDA4, 0xBDB0, 0xBDB8, 0xBDD4, 0xBDD5, 0xBDD8, 0xBDDC, 0xBDE9, 0xBDF0, 0xBDF4, 0xBDF8, 0xBE00, 0xBE03, 0xBE05, 0xBE0C, 0xBE0D, 0xBE10, 0xBE14, 0xBE1C, 0xBE1D, 0xBE1F, 0xBE44, 0xBE45, 0xBE48, 0xBE4C, 0xBE4E, 0xBE54, 0xBE55, 0xBE57, 0xBE59, 0xBE5A, 0xBE5B, 0xBE60, 0xBE61, 0xBE64, ERROR}, { ERROR, 0xD2FB, 0xD2FC, 0xD2FD, 0xD2FE, 0xD2FF, 0xD302, 0xD304, 0xD306, 0xD307, 0xD308, 0xD309, 0xD30A, 0xD30B, 0xD30F, 0xD311, 0xD312, 0xD313, 0xD315, 0xD317, 0xD318, 0xD319, 0xD31A, 0xD31B, 0xD31E, 0xD322, 0xD323, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD324, 0xD326, 0xD327, 0xD32A, 0xD32B, 0xD32D, 0xD32E, 0xD32F, 0xD331, 0xD332, 0xD333, 0xD334, 0xD335, 0xD336, 0xD337, 0xD33A, 0xD33E, 0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, 0xD346, 0xD347, 0xD348, 0xD349, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD34A, 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F, 0xD350, 0xD351, 0xD352, 0xD353, 0xD354, 0xD355, 0xD356, 0xD357, 0xD358, 0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, 0xD35E, 0xD35F, 0xD360, 0xD361, 0xD362, 0xD363, 0xD364, 0xD365, 0xD366, 0xD367, 0xD368, 0xD369, 0xBE68, 0xBE6A, 0xBE70, 0xBE71, 0xBE73, 0xBE74, 0xBE75, 0xBE7B, 0xBE7C, 0xBE7D, 0xBE80, 0xBE84, 0xBE8C, 0xBE8D, 0xBE8F, 0xBE90, 0xBE91, 0xBE98, 0xBE99, 0xBEA8, 0xBED0, 0xBED1, 0xBED4, 0xBED7, 0xBED8, 0xBEE0, 0xBEE3, 0xBEE4, 0xBEE5, 0xBEEC, 0xBF01, 0xBF08, 0xBF09, 0xBF18, 0xBF19, 0xBF1B, 0xBF1C, 0xBF1D, 0xBF40, 0xBF41, 0xBF44, 0xBF48, 0xBF50, 0xBF51, 0xBF55, 0xBF94, 0xBFB0, 0xBFC5, 0xBFCC, 0xBFCD, 0xBFD0, 0xBFD4, 0xBFDC, 0xBFDF, 0xBFE1, 0xC03C, 0xC051, 0xC058, 0xC05C, 0xC060, 0xC068, 0xC069, 0xC090, 0xC091, 0xC094, 0xC098, 0xC0A0, 0xC0A1, 0xC0A3, 0xC0A5, 0xC0AC, 0xC0AD, 0xC0AF, 0xC0B0, 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0BC, 0xC0BD, 0xC0BF, 0xC0C0, 0xC0C1, 0xC0C5, 0xC0C8, 0xC0C9, 0xC0CC, 0xC0D0, 0xC0D8, 0xC0D9, 0xC0DB, 0xC0DC, 0xC0DD, 0xC0E4, ERROR}, { ERROR, 0xD36A, 0xD36B, 0xD36C, 0xD36D, 0xD36E, 0xD36F, 0xD370, 0xD371, 0xD372, 0xD373, 0xD374, 0xD375, 0xD376, 0xD377, 0xD378, 0xD379, 0xD37A, 0xD37B, 0xD37E, 0xD37F, 0xD381, 0xD382, 0xD383, 0xD385, 0xD386, 0xD387, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD388, 0xD389, 0xD38A, 0xD38B, 0xD38E, 0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD39A, 0xD39B, 0xD39D, 0xD39E, 0xD39F, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5, 0xD3A6, 0xD3A7, 0xD3AA, 0xD3AC, 0xD3AE, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD3AF, 0xD3B0, 0xD3B1, 0xD3B2, 0xD3B3, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B9, 0xD3BA, 0xD3BB, 0xD3BD, 0xD3BE, 0xD3BF, 0xD3C0, 0xD3C1, 0xD3C2, 0xD3C3, 0xD3C6, 0xD3C7, 0xD3CA, 0xD3CB, 0xD3CC, 0xD3CD, 0xD3CE, 0xD3CF, 0xD3D1, 0xD3D2, 0xD3D3, 0xD3D4, 0xD3D5, 0xD3D6, 0xC0E5, 0xC0E8, 0xC0EC, 0xC0F4, 0xC0F5, 0xC0F7, 0xC0F9, 0xC100, 0xC104, 0xC108, 0xC110, 0xC115, 0xC11C, 0xC11D, 0xC11E, 0xC11F, 0xC120, 0xC123, 0xC124, 0xC126, 0xC127, 0xC12C, 0xC12D, 0xC12F, 0xC130, 0xC131, 0xC136, 0xC138, 0xC139, 0xC13C, 0xC140, 0xC148, 0xC149, 0xC14B, 0xC14C, 0xC14D, 0xC154, 0xC155, 0xC158, 0xC15C, 0xC164, 0xC165, 0xC167, 0xC168, 0xC169, 0xC170, 0xC174, 0xC178, 0xC185, 0xC18C, 0xC18D, 0xC18E, 0xC190, 0xC194, 0xC196, 0xC19C, 0xC19D, 0xC19F, 0xC1A1, 0xC1A5, 0xC1A8, 0xC1A9, 0xC1AC, 0xC1B0, 0xC1BD, 0xC1C4, 0xC1C8, 0xC1CC, 0xC1D4, 0xC1D7, 0xC1D8, 0xC1E0, 0xC1E4, 0xC1E8, 0xC1F0, 0xC1F1, 0xC1F3, 0xC1FC, 0xC1FD, 0xC200, 0xC204, 0xC20C, 0xC20D, 0xC20F, 0xC211, 0xC218, 0xC219, 0xC21C, 0xC21F, 0xC220, 0xC228, 0xC229, 0xC22B, 0xC22D, ERROR}, { ERROR, 0xD3D7, 0xD3D9, 0xD3DA, 0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE, 0xD3DF, 0xD3E0, 0xD3E2, 0xD3E4, 0xD3E5, 0xD3E6, 0xD3E7, 0xD3E8, 0xD3E9, 0xD3EA, 0xD3EB, 0xD3EE, 0xD3EF, 0xD3F1, 0xD3F2, 0xD3F3, 0xD3F5, 0xD3F6, 0xD3F7, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD3F8, 0xD3F9, 0xD3FA, 0xD3FB, 0xD3FE, 0xD400, 0xD402, 0xD403, 0xD404, 0xD405, 0xD406, 0xD407, 0xD409, 0xD40A, 0xD40B, 0xD40C, 0xD40D, 0xD40E, 0xD40F, 0xD410, 0xD411, 0xD412, 0xD413, 0xD414, 0xD415, 0xD416, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD417, 0xD418, 0xD419, 0xD41A, 0xD41B, 0xD41C, 0xD41E, 0xD41F, 0xD420, 0xD421, 0xD422, 0xD423, 0xD424, 0xD425, 0xD426, 0xD427, 0xD428, 0xD429, 0xD42A, 0xD42B, 0xD42C, 0xD42D, 0xD42E, 0xD42F, 0xD430, 0xD431, 0xD432, 0xD433, 0xD434, 0xD435, 0xD436, 0xD437, 0xC22F, 0xC231, 0xC232, 0xC234, 0xC248, 0xC250, 0xC251, 0xC254, 0xC258, 0xC260, 0xC265, 0xC26C, 0xC26D, 0xC270, 0xC274, 0xC27C, 0xC27D, 0xC27F, 0xC281, 0xC288, 0xC289, 0xC290, 0xC298, 0xC29B, 0xC29D, 0xC2A4, 0xC2A5, 0xC2A8, 0xC2AC, 0xC2AD, 0xC2B4, 0xC2B5, 0xC2B7, 0xC2B9, 0xC2DC, 0xC2DD, 0xC2E0, 0xC2E3, 0xC2E4, 0xC2EB, 0xC2EC, 0xC2ED, 0xC2EF, 0xC2F1, 0xC2F6, 0xC2F8, 0xC2F9, 0xC2FB, 0xC2FC, 0xC300, 0xC308, 0xC309, 0xC30C, 0xC30D, 0xC313, 0xC314, 0xC315, 0xC318, 0xC31C, 0xC324, 0xC325, 0xC328, 0xC329, 0xC345, 0xC368, 0xC369, 0xC36C, 0xC370, 0xC372, 0xC378, 0xC379, 0xC37C, 0xC37D, 0xC384, 0xC388, 0xC38C, 0xC3C0, 0xC3D8, 0xC3D9, 0xC3DC, 0xC3DF, 0xC3E0, 0xC3E2, 0xC3E8, 0xC3E9, 0xC3ED, 0xC3F4, 0xC3F5, 0xC3F8, 0xC408, 0xC410, 0xC424, 0xC42C, 0xC430, ERROR}, { ERROR, 0xD438, 0xD439, 0xD43A, 0xD43B, 0xD43C, 0xD43D, 0xD43E, 0xD43F, 0xD441, 0xD442, 0xD443, 0xD445, 0xD446, 0xD447, 0xD448, 0xD449, 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450, 0xD451, 0xD452, 0xD453, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458, 0xD459, 0xD45A, 0xD45B, 0xD45D, 0xD45E, 0xD45F, 0xD461, 0xD462, 0xD463, 0xD465, 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A, 0xD46B, 0xD46C, 0xD46E, 0xD470, 0xD471, 0xD472, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD473, 0xD474, 0xD475, 0xD476, 0xD477, 0xD47A, 0xD47B, 0xD47D, 0xD47E, 0xD481, 0xD483, 0xD484, 0xD485, 0xD486, 0xD487, 0xD48A, 0xD48C, 0xD48E, 0xD48F, 0xD490, 0xD491, 0xD492, 0xD493, 0xD495, 0xD496, 0xD497, 0xD498, 0xD499, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xC434, 0xC43C, 0xC43D, 0xC448, 0xC464, 0xC465, 0xC468, 0xC46C, 0xC474, 0xC475, 0xC479, 0xC480, 0xC494, 0xC49C, 0xC4B8, 0xC4BC, 0xC4E9, 0xC4F0, 0xC4F1, 0xC4F4, 0xC4F8, 0xC4FA, 0xC4FF, 0xC500, 0xC501, 0xC50C, 0xC510, 0xC514, 0xC51C, 0xC528, 0xC529, 0xC52C, 0xC530, 0xC538, 0xC539, 0xC53B, 0xC53D, 0xC544, 0xC545, 0xC548, 0xC549, 0xC54A, 0xC54C, 0xC54D, 0xC54E, 0xC553, 0xC554, 0xC555, 0xC557, 0xC558, 0xC559, 0xC55D, 0xC55E, 0xC560, 0xC561, 0xC564, 0xC568, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575, 0xC57C, 0xC57D, 0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F, 0xC591, 0xC595, 0xC597, 0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4, 0xC5B5, 0xC5B8, 0xC5B9, 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4, 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, 0xC5CA, 0xC5CC, 0xC5CE, ERROR}, { ERROR, 0xD49E, 0xD49F, 0xD4A0, 0xD4A1, 0xD4A2, 0xD4A3, 0xD4A4, 0xD4A5, 0xD4A6, 0xD4A7, 0xD4A8, 0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, 0xD4AE, 0xD4AF, 0xD4B0, 0xD4B1, 0xD4B2, 0xD4B3, 0xD4B4, 0xD4B5, 0xD4B6, 0xD4B7, 0xD4B8, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD4B9, 0xD4BA, 0xD4BB, 0xD4BC, 0xD4BD, 0xD4BE, 0xD4BF, 0xD4C0, 0xD4C1, 0xD4C2, 0xD4C3, 0xD4C4, 0xD4C5, 0xD4C6, 0xD4C7, 0xD4C8, 0xD4C9, 0xD4CA, 0xD4CB, 0xD4CD, 0xD4CE, 0xD4CF, 0xD4D1, 0xD4D2, 0xD4D3, 0xD4D5, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD4D6, 0xD4D7, 0xD4D8, 0xD4D9, 0xD4DA, 0xD4DB, 0xD4DD, 0xD4DE, 0xD4E0, 0xD4E1, 0xD4E2, 0xD4E3, 0xD4E4, 0xD4E5, 0xD4E6, 0xD4E7, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4ED, 0xD4EE, 0xD4EF, 0xD4F1, 0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6, 0xD4F7, 0xD4F9, 0xD4FA, 0xD4FC, 0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1, 0xC5E3, 0xC5E5, 0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7, 0xC5FC, 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, 0xC607, 0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, 0xC624, 0xC625, 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, 0xC634, 0xC635, 0xC637, 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, 0xC648, 0xC650, 0xC651, 0xC653, 0xC654, 0xC655, 0xC65C, 0xC65D, 0xC660, 0xC66C, 0xC66F, 0xC671, 0xC678, 0xC679, 0xC67C, 0xC680, 0xC688, 0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695, 0xC698, 0xC69C, 0xC6A4, 0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4, 0xC6B8, 0xC6B9, 0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD, 0xC6D0, 0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, ERROR}, { ERROR, 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, 0xD505, 0xD506, 0xD507, 0xD509, 0xD50A, 0xD50B, 0xD50D, 0xD50E, 0xD50F, 0xD510, 0xD511, 0xD512, 0xD513, 0xD516, 0xD518, 0xD519, 0xD51A, 0xD51B, 0xD51C, 0xD51D, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD51E, 0xD51F, 0xD520, 0xD521, 0xD522, 0xD523, 0xD524, 0xD525, 0xD526, 0xD527, 0xD528, 0xD529, 0xD52A, 0xD52B, 0xD52C, 0xD52D, 0xD52E, 0xD52F, 0xD530, 0xD531, 0xD532, 0xD533, 0xD534, 0xD535, 0xD536, 0xD537, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD538, 0xD539, 0xD53A, 0xD53B, 0xD53E, 0xD53F, 0xD541, 0xD542, 0xD543, 0xD545, 0xD546, 0xD547, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54E, 0xD550, 0xD552, 0xD553, 0xD554, 0xD555, 0xD556, 0xD557, 0xD55A, 0xD55B, 0xD55D, 0xD55E, 0xD55F, 0xD561, 0xD562, 0xD563, 0xC6E9, 0xC6EC, 0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, 0xC705, 0xC708, 0xC70C, 0xC714, 0xC715, 0xC717, 0xC719, 0xC720, 0xC721, 0xC724, 0xC728, 0xC730, 0xC731, 0xC733, 0xC735, 0xC737, 0xC73C, 0xC73D, 0xC740, 0xC744, 0xC74A, 0xC74C, 0xC74D, 0xC74F, 0xC751, 0xC752, 0xC753, 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC75C, 0xC760, 0xC768, 0xC76B, 0xC774, 0xC775, 0xC778, 0xC77C, 0xC77D, 0xC77E, 0xC783, 0xC784, 0xC785, 0xC787, 0xC788, 0xC789, 0xC78A, 0xC78E, 0xC790, 0xC791, 0xC794, 0xC796, 0xC797, 0xC798, 0xC79A, 0xC7A0, 0xC7A1, 0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7AC, 0xC7AD, 0xC7B0, 0xC7B4, 0xC7BC, 0xC7BD, 0xC7BF, 0xC7C0, 0xC7C1, 0xC7C8, 0xC7C9, 0xC7CC, 0xC7CE, 0xC7D0, 0xC7D8, 0xC7DD, 0xC7E4, 0xC7E8, 0xC7EC, 0xC800, 0xC801, 0xC804, 0xC808, 0xC80A, ERROR}, { ERROR, 0xD564, 0xD566, 0xD567, 0xD56A, 0xD56C, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573, 0xD576, 0xD577, 0xD579, 0xD57A, 0xD57B, 0xD57D, 0xD57E, 0xD57F, 0xD580, 0xD581, 0xD582, 0xD583, 0xD586, 0xD58A, 0xD58B, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD58C, 0xD58D, 0xD58E, 0xD58F, 0xD591, 0xD592, 0xD593, 0xD594, 0xD595, 0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C, 0xD59D, 0xD59E, 0xD59F, 0xD5A0, 0xD5A1, 0xD5A2, 0xD5A3, 0xD5A4, 0xD5A6, 0xD5A7, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD5A8, 0xD5A9, 0xD5AA, 0xD5AB, 0xD5AC, 0xD5AD, 0xD5AE, 0xD5AF, 0xD5B0, 0xD5B1, 0xD5B2, 0xD5B3, 0xD5B4, 0xD5B5, 0xD5B6, 0xD5B7, 0xD5B8, 0xD5B9, 0xD5BA, 0xD5BB, 0xD5BC, 0xD5BD, 0xD5BE, 0xD5BF, 0xD5C0, 0xD5C1, 0xD5C2, 0xD5C3, 0xD5C4, 0xD5C5, 0xD5C6, 0xD5C7, 0xC810, 0xC811, 0xC813, 0xC815, 0xC816, 0xC81C, 0xC81D, 0xC820, 0xC824, 0xC82C, 0xC82D, 0xC82F, 0xC831, 0xC838, 0xC83C, 0xC840, 0xC848, 0xC849, 0xC84C, 0xC84D, 0xC854, 0xC870, 0xC871, 0xC874, 0xC878, 0xC87A, 0xC880, 0xC881, 0xC883, 0xC885, 0xC886, 0xC887, 0xC88B, 0xC88C, 0xC88D, 0xC894, 0xC89D, 0xC89F, 0xC8A1, 0xC8A8, 0xC8BC, 0xC8BD, 0xC8C4, 0xC8C8, 0xC8CC, 0xC8D4, 0xC8D5, 0xC8D7, 0xC8D9, 0xC8E0, 0xC8E1, 0xC8E4, 0xC8F5, 0xC8FC, 0xC8FD, 0xC900, 0xC904, 0xC905, 0xC906, 0xC90C, 0xC90D, 0xC90F, 0xC911, 0xC918, 0xC92C, 0xC934, 0xC950, 0xC951, 0xC954, 0xC958, 0xC960, 0xC961, 0xC963, 0xC96C, 0xC970, 0xC974, 0xC97C, 0xC988, 0xC989, 0xC98C, 0xC990, 0xC998, 0xC999, 0xC99B, 0xC99D, 0xC9C0, 0xC9C1, 0xC9C4, 0xC9C7, 0xC9C8, 0xC9CA, 0xC9D0, 0xC9D1, 0xC9D3, ERROR}, { ERROR, 0xD5CA, 0xD5CB, 0xD5CD, 0xD5CE, 0xD5CF, 0xD5D1, 0xD5D3, 0xD5D4, 0xD5D5, 0xD5D6, 0xD5D7, 0xD5DA, 0xD5DC, 0xD5DE, 0xD5DF, 0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3, 0xD5E6, 0xD5E7, 0xD5E9, 0xD5EA, 0xD5EB, 0xD5ED, 0xD5EE, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD5EF, 0xD5F0, 0xD5F1, 0xD5F2, 0xD5F3, 0xD5F6, 0xD5F8, 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, 0xD5FE, 0xD5FF, 0xD602, 0xD603, 0xD605, 0xD606, 0xD607, 0xD609, 0xD60A, 0xD60B, 0xD60C, 0xD60D, 0xD60E, 0xD60F, 0xD612, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD616, 0xD617, 0xD618, 0xD619, 0xD61A, 0xD61B, 0xD61D, 0xD61E, 0xD61F, 0xD621, 0xD622, 0xD623, 0xD625, 0xD626, 0xD627, 0xD628, 0xD629, 0xD62A, 0xD62B, 0xD62C, 0xD62E, 0xD62F, 0xD630, 0xD631, 0xD632, 0xD633, 0xD634, 0xD635, 0xD636, 0xD637, 0xD63A, 0xD63B, 0xC9D5, 0xC9D6, 0xC9D9, 0xC9DA, 0xC9DC, 0xC9DD, 0xC9E0, 0xC9E2, 0xC9E4, 0xC9E7, 0xC9EC, 0xC9ED, 0xC9EF, 0xC9F0, 0xC9F1, 0xC9F8, 0xC9F9, 0xC9FC, 0xCA00, 0xCA08, 0xCA09, 0xCA0B, 0xCA0C, 0xCA0D, 0xCA14, 0xCA18, 0xCA29, 0xCA4C, 0xCA4D, 0xCA50, 0xCA54, 0xCA5C, 0xCA5D, 0xCA5F, 0xCA60, 0xCA61, 0xCA68, 0xCA7D, 0xCA84, 0xCA98, 0xCABC, 0xCABD, 0xCAC0, 0xCAC4, 0xCACC, 0xCACD, 0xCACF, 0xCAD1, 0xCAD3, 0xCAD8, 0xCAD9, 0xCAE0, 0xCAEC, 0xCAF4, 0xCB08, 0xCB10, 0xCB14, 0xCB18, 0xCB20, 0xCB21, 0xCB41, 0xCB48, 0xCB49, 0xCB4C, 0xCB50, 0xCB58, 0xCB59, 0xCB5D, 0xCB64, 0xCB78, 0xCB79, 0xCB9C, 0xCBB8, 0xCBD4, 0xCBE4, 0xCBE7, 0xCBE9, 0xCC0C, 0xCC0D, 0xCC10, 0xCC14, 0xCC1C, 0xCC1D, 0xCC21, 0xCC22, 0xCC27, 0xCC28, 0xCC29, 0xCC2C, 0xCC2E, 0xCC30, 0xCC38, 0xCC39, 0xCC3B, ERROR}, { ERROR, 0xD63D, 0xD63E, 0xD63F, 0xD641, 0xD642, 0xD643, 0xD644, 0xD646, 0xD647, 0xD64A, 0xD64C, 0xD64E, 0xD64F, 0xD650, 0xD652, 0xD653, 0xD656, 0xD657, 0xD659, 0xD65A, 0xD65B, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD662, 0xD663, 0xD664, 0xD665, 0xD666, 0xD668, 0xD66A, 0xD66B, 0xD66C, 0xD66D, 0xD66E, 0xD66F, 0xD672, 0xD673, 0xD675, 0xD676, 0xD677, 0xD678, 0xD679, 0xD67A, 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD67F, 0xD680, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD681, 0xD682, 0xD684, 0xD686, 0xD687, 0xD688, 0xD689, 0xD68A, 0xD68B, 0xD68E, 0xD68F, 0xD691, 0xD692, 0xD693, 0xD695, 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, 0xD69B, 0xD69C, 0xD69E, 0xD6A0, 0xD6A2, 0xD6A3, 0xD6A4, 0xD6A5, 0xD6A6, 0xD6A7, 0xD6A9, 0xD6AA, 0xCC3C, 0xCC3D, 0xCC3E, 0xCC44, 0xCC45, 0xCC48, 0xCC4C, 0xCC54, 0xCC55, 0xCC57, 0xCC58, 0xCC59, 0xCC60, 0xCC64, 0xCC66, 0xCC68, 0xCC70, 0xCC75, 0xCC98, 0xCC99, 0xCC9C, 0xCCA0, 0xCCA8, 0xCCA9, 0xCCAB, 0xCCAC, 0xCCAD, 0xCCB4, 0xCCB5, 0xCCB8, 0xCCBC, 0xCCC4, 0xCCC5, 0xCCC7, 0xCCC9, 0xCCD0, 0xCCD4, 0xCCE4, 0xCCEC, 0xCCF0, 0xCD01, 0xCD08, 0xCD09, 0xCD0C, 0xCD10, 0xCD18, 0xCD19, 0xCD1B, 0xCD1D, 0xCD24, 0xCD28, 0xCD2C, 0xCD39, 0xCD5C, 0xCD60, 0xCD64, 0xCD6C, 0xCD6D, 0xCD6F, 0xCD71, 0xCD78, 0xCD88, 0xCD94, 0xCD95, 0xCD98, 0xCD9C, 0xCDA4, 0xCDA5, 0xCDA7, 0xCDA9, 0xCDB0, 0xCDC4, 0xCDCC, 0xCDD0, 0xCDE8, 0xCDEC, 0xCDF0, 0xCDF8, 0xCDF9, 0xCDFB, 0xCDFD, 0xCE04, 0xCE08, 0xCE0C, 0xCE14, 0xCE19, 0xCE20, 0xCE21, 0xCE24, 0xCE28, 0xCE30, 0xCE31, 0xCE33, 0xCE35, ERROR}, { ERROR, 0xD6AB, 0xD6AD, 0xD6AE, 0xD6AF, 0xD6B1, 0xD6B2, 0xD6B3, 0xD6B4, 0xD6B5, 0xD6B6, 0xD6B7, 0xD6B8, 0xD6BA, 0xD6BC, 0xD6BD, 0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, 0xD6C6, 0xD6C7, 0xD6C9, 0xD6CA, 0xD6CB, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D2, 0xD6D3, 0xD6D5, 0xD6D6, 0xD6D8, 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD, 0xD6DE, 0xD6DF, 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E5, 0xD6E6, 0xD6E7, 0xD6E9, 0xD6EA, 0xD6EB, 0xD6EC, 0xD6ED, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD6EE, 0xD6EF, 0xD6F1, 0xD6F2, 0xD6F3, 0xD6F4, 0xD6F6, 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA, 0xD6FB, 0xD6FE, 0xD6FF, 0xD701, 0xD702, 0xD703, 0xD705, 0xD706, 0xD707, 0xD708, 0xD709, 0xD70A, 0xD70B, 0xD70C, 0xD70D, 0xD70E, 0xD70F, 0xD710, 0xD712, 0xD713, 0xD714, 0xCE58, 0xCE59, 0xCE5C, 0xCE5F, 0xCE60, 0xCE61, 0xCE68, 0xCE69, 0xCE6B, 0xCE6D, 0xCE74, 0xCE75, 0xCE78, 0xCE7C, 0xCE84, 0xCE85, 0xCE87, 0xCE89, 0xCE90, 0xCE91, 0xCE94, 0xCE98, 0xCEA0, 0xCEA1, 0xCEA3, 0xCEA4, 0xCEA5, 0xCEAC, 0xCEAD, 0xCEC1, 0xCEE4, 0xCEE5, 0xCEE8, 0xCEEB, 0xCEEC, 0xCEF4, 0xCEF5, 0xCEF7, 0xCEF8, 0xCEF9, 0xCF00, 0xCF01, 0xCF04, 0xCF08, 0xCF10, 0xCF11, 0xCF13, 0xCF15, 0xCF1C, 0xCF20, 0xCF24, 0xCF2C, 0xCF2D, 0xCF2F, 0xCF30, 0xCF31, 0xCF38, 0xCF54, 0xCF55, 0xCF58, 0xCF5C, 0xCF64, 0xCF65, 0xCF67, 0xCF69, 0xCF70, 0xCF71, 0xCF74, 0xCF78, 0xCF80, 0xCF85, 0xCF8C, 0xCFA1, 0xCFA8, 0xCFB0, 0xCFC4, 0xCFE0, 0xCFE1, 0xCFE4, 0xCFE8, 0xCFF0, 0xCFF1, 0xCFF3, 0xCFF5, 0xCFFC, 0xD000, 0xD004, 0xD011, 0xD018, 0xD02D, 0xD034, 0xD035, 0xD038, 0xD03C, ERROR}, { ERROR, 0xD715, 0xD716, 0xD717, 0xD71A, 0xD71B, 0xD71D, 0xD71E, 0xD71F, 0xD721, 0xD722, 0xD723, 0xD724, 0xD725, 0xD726, 0xD727, 0xD72A, 0xD72C, 0xD72E, 0xD72F, 0xD730, 0xD731, 0xD732, 0xD733, 0xD736, 0xD737, 0xD739, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD73A, 0xD73B, 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, 0xD742, 0xD743, 0xD745, 0xD746, 0xD748, 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E, 0xD74F, 0xD752, 0xD753, 0xD755, 0xD75A, 0xD75B, 0xD75C, 0xD75D, 0xD75E, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD75F, 0xD762, 0xD764, 0xD766, 0xD767, 0xD768, 0xD76A, 0xD76B, 0xD76D, 0xD76E, 0xD76F, 0xD771, 0xD772, 0xD773, 0xD775, 0xD776, 0xD777, 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77E, 0xD77F, 0xD780, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD78A, 0xD78B, 0xD044, 0xD045, 0xD047, 0xD049, 0xD050, 0xD054, 0xD058, 0xD060, 0xD06C, 0xD06D, 0xD070, 0xD074, 0xD07C, 0xD07D, 0xD081, 0xD0A4, 0xD0A5, 0xD0A8, 0xD0AC, 0xD0B4, 0xD0B5, 0xD0B7, 0xD0B9, 0xD0C0, 0xD0C1, 0xD0C4, 0xD0C8, 0xD0C9, 0xD0D0, 0xD0D1, 0xD0D3, 0xD0D4, 0xD0D5, 0xD0DC, 0xD0DD, 0xD0E0, 0xD0E4, 0xD0EC, 0xD0ED, 0xD0EF, 0xD0F0, 0xD0F1, 0xD0F8, 0xD10D, 0xD130, 0xD131, 0xD134, 0xD138, 0xD13A, 0xD140, 0xD141, 0xD143, 0xD144, 0xD145, 0xD14C, 0xD14D, 0xD150, 0xD154, 0xD15C, 0xD15D, 0xD15F, 0xD161, 0xD168, 0xD16C, 0xD17C, 0xD184, 0xD188, 0xD1A0, 0xD1A1, 0xD1A4, 0xD1A8, 0xD1B0, 0xD1B1, 0xD1B3, 0xD1B5, 0xD1BA, 0xD1BC, 0xD1C0, 0xD1D8, 0xD1F4, 0xD1F8, 0xD207, 0xD209, 0xD210, 0xD22C, 0xD22D, 0xD230, 0xD234, 0xD23C, 0xD23D, 0xD23F, 0xD241, 0xD248, 0xD25C, ERROR}, { ERROR, 0xD78D, 0xD78E, 0xD78F, 0xD791, 0xD792, 0xD793, 0xD794, 0xD795, 0xD796, 0xD797, 0xD79A, 0xD79C, 0xD79E, 0xD79F, 0xD7A0, 0xD7A1, 0xD7A2, 0xD7A3, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD264, 0xD280, 0xD281, 0xD284, 0xD288, 0xD290, 0xD291, 0xD295, 0xD29C, 0xD2A0, 0xD2A4, 0xD2AC, 0xD2B1, 0xD2B8, 0xD2B9, 0xD2BC, 0xD2BF, 0xD2C0, 0xD2C2, 0xD2C8, 0xD2C9, 0xD2CB, 0xD2D4, 0xD2D8, 0xD2DC, 0xD2E4, 0xD2E5, 0xD2F0, 0xD2F1, 0xD2F4, 0xD2F8, 0xD300, 0xD301, 0xD303, 0xD305, 0xD30C, 0xD30D, 0xD30E, 0xD310, 0xD314, 0xD316, 0xD31C, 0xD31D, 0xD31F, 0xD320, 0xD321, 0xD325, 0xD328, 0xD329, 0xD32C, 0xD330, 0xD338, 0xD339, 0xD33B, 0xD33C, 0xD33D, 0xD344, 0xD345, 0xD37C, 0xD37D, 0xD380, 0xD384, 0xD38C, 0xD38D, 0xD38F, 0xD390, 0xD391, 0xD398, 0xD399, 0xD39C, 0xD3A0, 0xD3A8, 0xD3A9, 0xD3AB, 0xD3AD, 0xD3B4, 0xD3B8, 0xD3BC, 0xD3C4, 0xD3C5, 0xD3C8, 0xD3C9, 0xD3D0, 0xD3D8, 0xD3E1, 0xD3E3, 0xD3EC, 0xD3ED, 0xD3F0, 0xD3F4, 0xD3FC, 0xD3FD, 0xD3FF, 0xD401, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD408, 0xD41D, 0xD440, 0xD444, 0xD45C, 0xD460, 0xD464, 0xD46D, 0xD46F, 0xD478, 0xD479, 0xD47C, 0xD47F, 0xD480, 0xD482, 0xD488, 0xD489, 0xD48B, 0xD48D, 0xD494, 0xD4A9, 0xD4CC, 0xD4D0, 0xD4D4, 0xD4DC, 0xD4DF, 0xD4E8, 0xD4EC, 0xD4F0, 0xD4F8, 0xD4FB, 0xD4FD, 0xD504, 0xD508, 0xD50C, 0xD514, 0xD515, 0xD517, 0xD53C, 0xD53D, 0xD540, 0xD544, 0xD54C, 0xD54D, 0xD54F, 0xD551, 0xD558, 0xD559, 0xD55C, 0xD560, 0xD565, 0xD568, 0xD569, 0xD56B, 0xD56D, 0xD574, 0xD575, 0xD578, 0xD57C, 0xD584, 0xD585, 0xD587, 0xD588, 0xD589, 0xD590, 0xD5A5, 0xD5C8, 0xD5C9, 0xD5CC, 0xD5D0, 0xD5D2, 0xD5D8, 0xD5D9, 0xD5DB, 0xD5DD, 0xD5E4, 0xD5E5, 0xD5E8, 0xD5EC, 0xD5F4, 0xD5F5, 0xD5F7, 0xD5F9, 0xD600, 0xD601, 0xD604, 0xD608, 0xD610, 0xD611, 0xD613, 0xD614, 0xD615, 0xD61C, 0xD620, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xD624, 0xD62D, 0xD638, 0xD639, 0xD63C, 0xD640, 0xD645, 0xD648, 0xD649, 0xD64B, 0xD64D, 0xD651, 0xD654, 0xD655, 0xD658, 0xD65C, 0xD667, 0xD669, 0xD670, 0xD671, 0xD674, 0xD683, 0xD685, 0xD68C, 0xD68D, 0xD690, 0xD694, 0xD69D, 0xD69F, 0xD6A1, 0xD6A8, 0xD6AC, 0xD6B0, 0xD6B9, 0xD6BB, 0xD6C4, 0xD6C5, 0xD6C8, 0xD6CC, 0xD6D1, 0xD6D4, 0xD6D7, 0xD6D9, 0xD6E0, 0xD6E4, 0xD6E8, 0xD6F0, 0xD6F5, 0xD6FC, 0xD6FD, 0xD700, 0xD704, 0xD711, 0xD718, 0xD719, 0xD71C, 0xD720, 0xD728, 0xD729, 0xD72B, 0xD72D, 0xD734, 0xD735, 0xD738, 0xD73C, 0xD744, 0xD747, 0xD749, 0xD750, 0xD751, 0xD754, 0xD756, 0xD757, 0xD758, 0xD759, 0xD760, 0xD761, 0xD763, 0xD765, 0xD769, 0xD76C, 0xD770, 0xD774, 0xD77C, 0xD77D, 0xD781, 0xD788, 0xD789, 0xD78C, 0xD790, 0xD798, 0xD799, 0xD79B, 0xD79D, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x4F3D, 0x4F73, 0x5047, 0x50F9, 0x52A0, 0x53EF, 0x5475, 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687, 0x67B6, 0x67B7, 0x67EF, 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB, 0x8304, 0x8857, 0x8888, 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6, 0x99D5, 0x523B, 0x5374, 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF, 0x811A, 0x89BA, 0x89D2, 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978, 0x59E6, 0x5E72, 0x5E79, 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F, 0x6F97, 0x764E, 0x770B, 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D, 0x826E, 0x8271, 0x8AEB, 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34, 0x78A3, 0x7AED, 0x845B, 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E, 0x582A, 0x5D4C, 0x611F, 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44, 0x6E1B, 0x7518, 0x75B3, 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451, 0x9452, 0x9F95, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598, 0x525B, 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A, 0x6177, 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C, 0x8154, 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47, 0x4ECB, 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168, 0x6539, 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5, 0x84CB, 0xF900, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0xF901, 0x7CB3, 0x7FB9, 0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E, 0x64DA, 0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0xF902, 0x907D, 0x9245, 0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA, 0x6106, 0x6957, 0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E, 0x5091, 0x6770, 0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x77BC, 0x9210, 0x9ED4, 0x52AB, 0x602F, 0x8FF2, 0x5048, 0x61A9, 0x63ED, 0x64CA, 0x683C, 0x6A84, 0x6FC0, 0x8188, 0x89A1, 0x9694, 0x5805, 0x727D, 0x72AC, 0x7504, 0x7D79, 0x7E6D, 0x80A9, 0x898B, 0x8B74, 0x9063, 0x9D51, 0x6289, 0x6C7A, 0x6F54, 0x7D50, 0x7F3A, 0x8A23, 0x517C, 0x614A, 0x7B9D, 0x8B19, 0x9257, 0x938C, 0x4EAC, 0x4FD3, 0x501E, 0x50BE, 0x5106, 0x52C1, 0x52CD, 0x537F, 0x5770, 0x5883, 0x5E9A, 0x5F91, 0x6176, 0x61AC, 0x64CE, 0x656C, 0x666F, 0x66BB, 0x66F4, 0x6897, 0x6D87, 0x7085, 0x70F1, 0x749F, 0x74A5, 0x74CA, 0x75D9, 0x786C, 0x78EC, 0x7ADF, 0x7AF6, 0x7D45, 0x7D93, 0x8015, 0x803F, 0x811B, 0x8396, 0x8B66, 0x8F15, 0x9015, 0x93E1, 0x9803, 0x9838, 0x9A5A, 0x9BE8, 0x4FC2, 0x5553, 0x583A, 0x5951, 0x5B63, 0x5C46, 0x60B8, 0x6212, 0x6842, 0x68B0, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE, 0x7A3D, 0x7CFB, 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E, 0x9DC4, 0x53E4, 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64, 0x5C3B, 0x5EAB, 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF, 0x69C1, 0x6CBD, 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003, 0x80A1, 0x818F, 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4, 0x8AA5, 0xF903, 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED, 0x659B, 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764, 0x5D11, 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4, 0x6C68, 0xF904, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5, 0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3, 0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x79D1, 0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B, 0x9846, 0x5ED3, 0x69E8, 0x85FF, 0x90ED, 0xF905, 0x51A0, 0x5B98, 0x5BEC, 0x6163, 0x68FA, 0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1, 0x7F50, 0x83C5, 0x89C0, 0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D, 0x62EC, 0x9002, 0x4F8A, 0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0, 0x6D38, 0x709A, 0x72C2, 0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366, 0x639B, 0x7F6B, 0x4E56, 0x5080, 0x584A, 0x58DE, 0x602A, 0x6127, 0x62D0, 0x69D0, 0x9B41, 0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4, 0x50D1, 0x54AC, 0x55AC, 0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E, 0x6821, 0x6A4B, 0x72E1, 0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0x81A0, 0x854E, 0x86DF, 0x8F03, 0x8F4E, 0x90CA, 0x9903, 0x9A55, 0x9BAB, 0x4E18, 0x4E45, 0x4E5D, 0x4EC7, 0x4FF1, 0x5177, 0x52FE, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5340, 0x53E3, 0x53E5, 0x548E, 0x5614, 0x5775, 0x57A2, 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8, 0x6551, 0x67B8, 0x67E9, 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42, 0x6E9D, 0x7078, 0x72D7, 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76, 0x7D7F, 0x8009, 0x81FC, 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33, 0x8CFC, 0x8EC0, 0x9011, 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45, 0x9CE9, 0x9DD7, 0x9F9C, 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB, 0x9EB4, 0x541B, 0x7A98, 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800, 0x5C48, 0x6398, 0x7A9F, 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E, 0x8EAC, 0x5026, 0x5238, 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372, 0x6B0A, 0x6DC3, 0x7737, 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5, 0x673A, 0x6AC3, 0x6F70, 0x8A6D, 0x8ECC, 0x994B, 0xF906, 0x6677, 0x6B78, 0x8CB4, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9B3C, 0xF907, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB, 0x73EA, 0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73, 0x9035, 0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E, 0xF908, 0x6A58, 0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975, 0x9699, 0x50C5, 0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF, 0x747E, 0x7B4B, 0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949, 0xF909, 0x4ECA, 0x5997, 0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981, 0x79BD, 0x82A9, 0x887E, 0x887F, 0x895F, 0xF90A, 0x9326, 0x4F0B, 0x53CA, 0x6025, 0x6271, 0x6C72, 0x7D1A, 0x7D66, 0x4E98, 0x5162, 0x77DC, 0x80AF, 0x4F01, 0x4F0E, 0x5176, 0x5180, 0x55DC, 0x5668, 0x573B, 0x57FA, 0x57FC, 0x5914, 0x5947, 0x5993, 0x5BC4, 0x5C90, 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC, 0x6280, 0x65D7, 0x65E3, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4, 0x6A5F, 0x6B3A, 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426, 0x742A, 0x7482, 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941, 0x7947, 0x7948, 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006, 0x802D, 0x808C, 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324, 0x98E2, 0x9951, 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76, 0x5409, 0x62EE, 0x6854, 0x91D1, 0x55AB, 0x513A, 0xF90B, 0xF90C, 0x5A1C, 0x61E6, 0xF90D, 0x62CF, 0x62FF, 0xF90E, 0xF90F, 0xF910, 0xF911, 0xF912, 0xF913, 0x90A3, 0xF914, 0xF915, 0xF916, 0xF917, 0xF918, 0x8AFE, 0xF919, 0xF91A, 0xF91B, 0xF91C, 0x6696, 0xF91D, 0x7156, 0xF91E, 0xF91F, 0x96E3, 0xF920, 0x634F, 0x637A, 0x5357, 0xF921, 0x678F, 0x6960, 0x6E73, 0xF922, 0x7537, 0xF923, 0xF924, 0xF925, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7D0D, 0xF926, 0xF927, 0x8872, 0x56CA, 0x5A18, 0xF928, 0xF929, 0xF92A, 0xF92B, 0xF92C, 0x4E43, 0xF92D, 0x5167, 0x5948, 0x67F0, 0x8010, 0xF92E, 0x5973, 0x5E74, 0x649A, 0x79CA, 0x5FF5, 0x606C, 0x62C8, 0x637B, 0x5BE7, 0x5BD7, 0x52AA, 0xF92F, 0x5974, 0x5F29, 0x6012, 0xF930, 0xF931, 0xF932, 0x7459, 0xF933, 0xF934, 0xF935, 0xF936, 0xF937, 0xF938, 0x99D1, 0xF939, 0xF93A, 0xF93B, 0xF93C, 0xF93D, 0xF93E, 0xF93F, 0xF940, 0xF941, 0xF942, 0xF943, 0x6FC3, 0xF944, 0xF945, 0x81BF, 0x8FB2, 0x60F1, 0xF946, 0xF947, 0x8166, 0xF948, 0xF949, 0x5C3F, 0xF94A, 0xF94B, 0xF94C, 0xF94D, 0xF94E, 0xF94F, 0xF950, 0xF951, 0x5AE9, 0x8A25, 0x677B, 0x7D10, 0xF952, 0xF953, 0xF954, 0xF955, 0xF956, 0xF957, 0x80FD, 0xF958, 0xF959, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, 0x8336, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56, 0x65B7, 0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E, 0x7DDE, 0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A, 0x75B8, 0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1, 0x6E5B, 0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983, 0x8AC7, 0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D, 0x5510, 0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576, 0x7CD6, 0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D, 0x5CB1, 0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B, 0x8CB8, 0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200, 0x5230, 0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B, 0x5EA6, 0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x68F9, 0x6AC2, 0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE, 0x76DC, 0x7779, 0x79B1, 0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3, 0x8E48, 0x9003, 0x9014, 0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC, 0x6BD2, 0x7006, 0x7258, 0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4, 0x7E9B, 0x8B80, 0x58A9, 0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C, 0x711E, 0x71C9, 0x8C5A, 0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC, 0x51CD, 0x52D5, 0x540C, 0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E, 0x6F7C, 0x75BC, 0x77B3, 0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C, 0x6597, 0x675C, 0x6793, 0x75D8, 0x7AC7, 0x8373, 0xF95A, 0x8C46, 0x9017, 0x982D, 0x5C6F, 0x81C0, 0x829A, 0x9041, 0x906F, 0x920D, 0x5F97, 0x5D9D, 0x6A59, 0x71C8, 0x767B, 0x7B49, 0x85E4, 0x8B04, 0x9127, 0x9A30, 0x5587, 0x61F6, 0xF95B, 0x7669, 0x7F85, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x863F, 0x87BA, 0x88F8, 0x908F, 0xF95C, 0x6D1B, 0x70D9, 0x73DE, 0x7D61, 0x843D, 0xF95D, 0x916A, 0x99F1, 0xF95E, 0x4E82, 0x5375, 0x6B04, 0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C, 0x8FA3, 0x5D50, 0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C, 0x85CD, 0x8964, 0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, 0x6D6A, 0x72FC, 0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D, 0x5FA0, 0x840A, 0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169, 0x51C9, 0x6881, 0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2, 0x8F1B, 0x91CF, 0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E, 0x623E, 0x65C5, 0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD, 0x9A62, 0x9A6A, 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D, 0x792B, 0x8F62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6F23, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7149, 0x7489, 0x7DF4, 0x806F, 0x84EE, 0x8F26, 0x9023, 0x934A, 0x51BD, 0x5217, 0x52A3, 0x6D0C, 0x70C8, 0x88C2, 0x5EC9, 0x6582, 0x6BAE, 0x6FC2, 0x7C3E, 0x7375, 0x4EE4, 0x4F36, 0x56F9, 0xF95F, 0x5CBA, 0x5DBA, 0x601C, 0x73B2, 0x7B2D, 0x7F9A, 0x7FCE, 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748, 0x9818, 0x9F61, 0x4F8B, 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE, 0xF960, 0x6488, 0x64C4, 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6, 0x58DF, 0x5F04, 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121, 0x7028, 0x7262, 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86, 0x50DA, 0x5BEE, 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A, 0x84FC, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4, 0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F, 0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D, 0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A, 0x5F8B, 0x6144, 0x6817, 0xF961, 0x9686, 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229, 0x5398, 0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C, 0x7281, 0x72F8, 0x7406, 0x7483, 0xF962, 0x75E2, 0x7C6C, 0x7F79, 0x7FB8, 0x8389, 0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9, 0x541D, 0x6F7E, 0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7ACB, 0x7B20, 0x7C92, 0x6469, 0x746A, 0x75F2, 0x78BC, 0x78E8, 0x99AC, 0x9B54, 0x9EBB, 0x5BDE, 0x5E55, 0x6F20, 0x819C, 0x83AB, 0x9088, 0x4E07, 0x534D, 0x5A29, 0x5DD2, 0x5F4E, 0x6162, 0x633D, 0x6669, 0x66FC, 0x6EFF, 0x6F2B, 0x7063, 0x779E, 0x842C, 0x8513, 0x883B, 0x8F13, 0x9945, 0x9C3B, 0x551C, 0x62B9, 0x672B, 0x6CAB, 0x8309, 0x896A, 0x977A, 0x4EA1, 0x5984, 0x5FD8, 0x5FD9, 0x671B, 0x7DB2, 0x7F54, 0x8292, 0x832B, 0x83BD, 0x8F1E, 0x9099, 0x57CB, 0x59B9, 0x5A92, 0x5BD0, 0x6627, 0x679A, 0x6885, 0x6BCF, 0x7164, 0x7F75, 0x8CB7, 0x8CE3, 0x9081, 0x9B45, 0x8108, 0x8C8A, 0x964C, 0x9A40, 0x9EA5, 0x5B5F, 0x6C13, 0x731B, 0x76F2, 0x76DF, 0x840C, 0x51AA, 0x8993, 0x514D, 0x5195, 0x52C9, 0x68C9, 0x6C94, 0x7704, 0x7720, 0x7DBF, 0x7DEC, 0x9762, 0x9EB5, 0x6EC5, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E, 0x669D, 0x6927, 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F, 0x9169, 0x9298, 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6, 0x5E3D, 0x6155, 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD, 0x6BDB, 0x725F, 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC, 0x8305, 0x8B00, 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE, 0x7766, 0x7A46, 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499, 0x536F, 0x5893, 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A, 0x732B, 0x7AD7, 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB, 0x620A, 0x62C7, 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121, 0x73F7, 0x755D, 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF, 0x9727, 0x9D61, 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F, 0x6587, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF, 0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C, 0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73, 0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6, 0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F, 0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A, 0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E, 0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9, 0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500, 0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0x76E4, 0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C, 0x87E0, 0x8FD4, 0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24, 0x6F51, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x767C, 0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023, 0x508D, 0x574A, 0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E, 0x65B9, 0x65C1, 0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21, 0x80AA, 0x8180, 0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17, 0x90A6, 0x9632, 0x9F90, 0x500D, 0x4FF3, 0xF963, 0x57F9, 0x5F98, 0x62DC, 0x6392, 0x676F, 0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA, 0x88F4, 0x88F5, 0x8919, 0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F, 0x4F70, 0x5E1B, 0x67CF, 0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61, 0x6A0A, 0x7169, 0x71D4, 0x756A, 0xF964, 0x7E41, 0x8543, 0x85E9, 0x98DC, 0x4F10, 0x7B4F, 0x7F70, 0x95A5, 0x51E1, 0x5E06, 0x68B5, 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF, 0x7BC4, 0x8303, 0x6CD5, 0x743A, 0x50FB, 0x5288, 0x58C1, 0x64D8, 0x6A97, 0x74A7, 0x7656, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x78A7, 0x8617, 0x95E2, 0x9739, 0xF965, 0x535E, 0x5F01, 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49, 0x9F08, 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A, 0x67C4, 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27, 0x9920, 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65, 0x6D11, 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913, 0x8B5C, 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9, 0x670D, 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39, 0x8F3B, 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01, 0x5CEF, 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B, 0x84EC, 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, 0x4FEF, 0x5085, 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, 0x5A66, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0xF966, 0x6276, 0x6577, 0x65A7, 0x6D6E, 0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150, 0x8151, 0x819A, 0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6, 0x8CFB, 0x8D74, 0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9, 0x9CE7, 0x5317, 0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E, 0x5FFF, 0x61A4, 0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89, 0x7CDE, 0x7D1B, 0x82AC, 0x8CC1, 0x96F0, 0xF967, 0x4F5B, 0x5F17, 0x5F7F, 0x62C2, 0x5D29, 0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C, 0x4E15, 0x5099, 0x5315, 0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87, 0x60B2, 0x618A, 0x6249, 0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6CB8, 0xF968, 0x7435, 0x75FA, 0x7812, 0x7891, 0x79D5, 0x79D8, 0x7C83, 0x7DCB, 0x7FE1, 0x80A5, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8, 0x8AB9, 0x8B6C, 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC, 0x5B2A, 0x5F6C, 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015, 0x725D, 0x73AD, 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058, 0x9A01, 0x4E4D, 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F, 0x4FDF, 0x50FF, 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB, 0x5962, 0x5A11, 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99, 0x601D, 0x6368, 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B, 0x6C99, 0x6CD7, 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940, 0x7960, 0x79C1, 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E, 0x84D1, 0x86C7, 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66, 0x8FAD, 0x90AA, 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0xF969, 0x6714, 0xF96A, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5098, 0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523, 0x759D, 0x7B97, 0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA, 0x715E, 0x85A9, 0x4E09, 0xF96B, 0x6749, 0x68EE, 0x6E17, 0x829F, 0x8518, 0x886B, 0x63F7, 0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7, 0x50CF, 0x511F, 0x5546, 0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0, 0x5E38, 0x5E8A, 0x5EA0, 0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58, 0x723D, 0x7240, 0x72C0, 0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3, 0x89F4, 0x8A73, 0x8C61, 0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD, 0x55C7, 0xF96C, 0x7A61, 0x7D22, 0x8272, 0x7272, 0x751F, 0x7525, 0xF96D, 0x7B19, 0x5885, 0x58FB, 0x5DBC, 0x5E8F, 0x5EB6, 0x5F90, 0x6055, 0x6292, 0x637F, 0x654D, 0x6691, 0x66D9, 0x66F8, 0x6816, 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E, 0x7DD6, 0x7F72, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D, 0x92E4, 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614, 0x6673, 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6, 0x91CB, 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3, 0x6247, 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487, 0x74BF, 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3, 0x8239, 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425, 0x994D, 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B, 0x820C, 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261, 0x66B9, 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D, 0x6D89, 0x71EE, 0xF96E, 0x57CE, 0x59D3, 0x5BAC, 0x6027, 0x60FA, 0x6210, 0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, 0x7B6C, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8056, 0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2, 0x6B72, 0x6D17, 0x7A05, 0x7B39, 0x7D30, 0xF96F, 0x8CB0, 0x53EC, 0x562F, 0x5851, 0x5BB5, 0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383, 0x6414, 0x662D, 0x68B3, 0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4, 0x71D2, 0x7526, 0x758F, 0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B, 0x7D20, 0x7D39, 0x852C, 0x856D, 0x8607, 0x8A34, 0x900D, 0x9061, 0x90B5, 0x92B7, 0x97F6, 0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91, 0x7C9F, 0x7E8C, 0x8B16, 0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D, 0x84C0, 0x905C, 0x98E1, 0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE, 0x8A1F, 0x8AA6, 0x9001, 0x980C, 0x5237, 0xF970, 0x7051, 0x788E, 0x9396, 0x8870, 0x91D7, 0x4FEE, 0x53D7, 0x55FD, 0x56DA, 0x5782, 0x58FD, 0x5AC2, 0x5B88, 0x5CAB, 0x5CC0, 0x5E25, 0x6101, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x620D, 0x624B, 0x6388, 0x641C, 0x6536, 0x6578, 0x6A39, 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9, 0x7378, 0x7407, 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA, 0x7CB9, 0x7D8F, 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490, 0x84DA, 0x85EA, 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083, 0x916C, 0x9296, 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700, 0x9808, 0x9996, 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70, 0x5BBF, 0x6DD1, 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD, 0x5DE1, 0x5F87, 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53, 0x6B89, 0x6D35, 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14, 0x8123, 0x821C, 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187, 0x931E, 0x9806, 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07, 0x5D27, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2, 0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F, 0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB, 0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD, 0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5, 0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A, 0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C, 0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38, 0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668, 0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA, 0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0xF971, 0x8FC5, 0x5931, 0x5BA4, 0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xF972, 0x6DF1, 0x700B, 0x751A, 0x82AF, 0x8AF6, 0x4EC0, 0x5341, 0xF973, 0x96D9, 0x6C0F, 0x4E9E, 0x4FC4, 0x5152, 0x555E, 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD, 0x83AA, 0x86FE, 0x8859, 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09, 0x9D5D, 0x580A, 0x5CB3, 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1, 0x6A02, 0x6E25, 0x9102, 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89, 0x5CB8, 0x6309, 0x664F, 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854, 0x9B9F, 0x65A1, 0x8B01, 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6, 0x5EB5, 0x6697, 0x764C, 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE, 0x9D28, 0x4EF0, 0x592E, 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26, 0x5393, 0x54C0, 0x57C3, 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D, 0x827E, 0x9698, 0x9744, 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A, 0x814B, 0x984D, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B, 0x51B6, 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0xF974, 0x91CE, 0x5F31, 0xF975, 0xF976, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5, 0x8E8D, 0xF977, 0x4F6F, 0xF978, 0xF979, 0x58E4, 0x5B43, 0x6059, 0x63DA, 0x6518, 0x656D, 0x6698, 0xF97A, 0x694A, 0x6A23, 0x6D0B, 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70, 0xF97B, 0x7F8A, 0xF97C, 0x8944, 0xF97D, 0x8B93, 0x91C0, 0x967D, 0xF97E, 0x990A, 0x5704, 0x5FA1, 0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD, 0x9B5A, 0x9F6C, 0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043, 0x5830, 0x5F66, 0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA, 0x513C, 0x56B4, 0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186, 0x4E88, 0x4F59, 0xF97F, 0xF980, 0xF981, 0x5982, 0xF982, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xF983, 0x6B5F, 0x6C5D, 0xF984, 0x74B5, 0x7916, 0xF985, 0x8207, 0x8245, 0x8339, 0x8F3F, 0x8F5D, 0xF986, 0x9918, 0xF987, 0xF988, 0xF989, 0x4EA6, 0xF98A, 0x57DF, 0x5F79, 0x6613, 0xF98B, 0xF98C, 0x75AB, 0x7E79, 0x8B6F, 0xF98D, 0x9006, 0x9A5B, 0x56A5, 0x5827, 0x59F8, 0x5A1F, 0x5BB4, 0xF98E, 0x5EF6, 0xF98F, 0xF990, 0x6350, 0x633B, 0xF991, 0x693D, 0x6C87, 0x6CBF, 0x6D8E, 0x6D93, 0x6DF5, 0x6F14, 0xF992, 0x70DF, 0x7136, 0x7159, 0xF993, 0x71C3, 0x71D5, 0xF994, 0x784F, 0x786F, 0xF995, 0x7B75, 0x7DE3, 0xF996, 0x7E2F, 0xF997, 0x884D, 0x8EDF, 0xF998, 0xF999, 0xF99A, 0x925B, 0xF99B, 0x9CF6, 0xF99C, 0xF99D, 0xF99E, 0x6085, 0x6D85, 0xF99F, 0x71B1, 0xF9A0, 0xF9A1, 0x95B1, 0x53AD, 0xF9A2, 0xF9A3, 0xF9A4, 0x67D3, 0xF9A5, 0x708E, 0x7130, 0x7430, 0x8276, 0x82D2, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xF9A6, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4, 0xF9A7, 0x71C1, 0x8449, 0xF9A8, 0xF9A9, 0x584B, 0xF9AA, 0xF9AB, 0x5DB8, 0x5F71, 0xF9AC, 0x6620, 0x668E, 0x6979, 0x69AE, 0x6C38, 0x6CF3, 0x6E36, 0x6F41, 0x6FDA, 0x701B, 0x702F, 0x7150, 0x71DF, 0x7370, 0xF9AD, 0x745B, 0xF9AE, 0x74D4, 0x76C8, 0x7A4E, 0x7E93, 0xF9AF, 0xF9B0, 0x82F1, 0x8A60, 0x8FCE, 0xF9B1, 0x9348, 0xF9B2, 0x9719, 0xF9B3, 0xF9B4, 0x4E42, 0x502A, 0xF9B5, 0x5208, 0x53E1, 0x66F3, 0x6C6D, 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE, 0x85DD, 0x8602, 0xF9B6, 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0xF9B7, 0x92B3, 0xF9B8, 0x9713, 0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433, 0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0xF9B9, 0x61CA, 0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x70CF, 0x71AC, 0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32, 0x9F07, 0x5C4B, 0x6C83, 0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465, 0x761F, 0x7A69, 0x7E15, 0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE, 0x7515, 0x7670, 0x7FC1, 0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6, 0x7AA9, 0x7AAA, 0x81E5, 0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C, 0x5B9B, 0x68A1, 0x6900, 0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897, 0x7DE9, 0x7FEB, 0x8118, 0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811, 0x66F0, 0x5F80, 0x65FA, 0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03, 0x6B6A, 0x77EE, 0x5916, 0x5D6C, 0x5DCD, 0x7325, 0x754F, 0xF9BA, 0xF9BB, 0x50E5, 0x51F9, 0x582F, 0x592D, 0x5996, 0x59DA, 0x5BE5, 0xF9BC, 0xF9BD, 0x5DA2, 0x62D7, 0x6416, 0x6493, 0x64FE, 0xF9BE, 0x66DC, 0xF9BF, 0x6A48, 0xF9C0, 0x71FF, 0x7464, 0xF9C1, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x7A88, 0x7AAF, 0x7E47, 0x7E5E, 0x8000, 0x8170, 0xF9C2, 0x87EF, 0x8981, 0x8B20, 0x9059, 0xF9C3, 0x9080, 0x9952, 0x617E, 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD, 0x5197, 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995, 0x6D8C, 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073, 0x8338, 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0xF9C4, 0x4E8E, 0x4F51, 0x5076, 0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A, 0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991, 0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047, 0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED, 0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0xF9C5, 0x6A52, 0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x904B, 0x9695, 0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90, 0x718A, 0x96C4, 0x5143, 0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3, 0x5A9B, 0x5AC4, 0x5BC3, 0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39, 0x6E72, 0x6E90, 0x7230, 0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45, 0x9060, 0xF9C6, 0x9662, 0x9858, 0x9D1B, 0x6708, 0x8D8A, 0x925E, 0x4F4D, 0x5049, 0x50DE, 0x5371, 0x570D, 0x59D4, 0x5A01, 0x5C09, 0x6170, 0x6690, 0x6E2D, 0x7232, 0x744B, 0x7DEF, 0x80C3, 0x840E, 0x8466, 0x853F, 0x875F, 0x885B, 0x8918, 0x8B02, 0x9055, 0x97CB, 0x9B4F, 0x4E73, 0x4F91, 0x5112, 0x516A, 0xF9C7, 0x552F, 0x55A9, 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE, 0x60A0, 0x60DF, 0x6108, 0x6109, 0x63C4, 0x6538, 0x6709, 0xF9C8, 0x67D4, 0x67DA, 0xF9C9, 0x6961, 0x6962, 0x6CB9, 0x6D27, 0xF9CA, 0x6E38, 0xF9CB, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6FE1, 0x7336, 0x7337, 0xF9CC, 0x745C, 0x7531, 0xF9CD, 0x7652, 0xF9CE, 0xF9CF, 0x7DAD, 0x81FE, 0x8438, 0x88D5, 0x8A98, 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A, 0x9149, 0x91C9, 0x936E, 0xF9D0, 0xF9D1, 0x5809, 0xF9D2, 0x6BD3, 0x8089, 0x80B2, 0xF9D3, 0xF9D4, 0x5141, 0x596B, 0x5C39, 0xF9D5, 0xF9D6, 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0xF9D7, 0x9217, 0x958F, 0xF9D8, 0xF9D9, 0xF9DA, 0xF9DB, 0x807F, 0x620E, 0x701C, 0x7D68, 0x878D, 0xF9DC, 0x57A0, 0x6069, 0x6147, 0x6BB7, 0x8ABE, 0x9280, 0x96B1, 0x4E59, 0x541F, 0x6DEB, 0x852D, 0x9670, 0x97F3, 0x98EE, 0x63D6, 0x6CE3, 0x9091, 0x51DD, 0x61C9, 0x81BA, 0x9DF9, 0x4F9D, 0x501A, 0x5100, 0x5B9C, 0x610F, 0x61FF, 0x64EC, 0x6905, 0x6BC5, 0x7591, 0x77E3, 0x7FA9, 0x8264, 0x858F, 0x87FB, 0x8863, 0x8ABC, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A, 0xF9DD, 0xF9DE, 0x5937, 0x59E8, 0xF9DF, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0xF9E0, 0xF9E1, 0xF9E2, 0xF9E3, 0x723E, 0x73E5, 0xF9E4, 0x7570, 0x75CD, 0xF9E5, 0x79FB, 0xF9E6, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351, 0xF9E7, 0xF9E8, 0x8CBD, 0x8CB3, 0x9087, 0xF9E9, 0xF9EA, 0x98F4, 0x990C, 0xF9EB, 0xF9EC, 0x7037, 0x76CA, 0x7FCA, 0x7FCC, 0x7FFC, 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0xF9ED, 0x54BD, 0x56E0, 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0xF9EE, 0xF9EF, 0x7D6A, 0x8335, 0xF9F0, 0x8693, 0x8A8D, 0xF9F1, 0x976D, 0x9777, 0xF9F2, 0xF9F3, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9, 0x65E5, 0x6EA2, 0x9038, 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A, 0x59D9, 0x6041, 0xF9F4, 0xF9F5, 0x7A14, 0xF9F6, 0x834F, 0x8CC3, 0x5165, 0x5344, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xF9F7, 0xF9F8, 0xF9F9, 0x4ECD, 0x5269, 0x5B55, 0x82BF, 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF, 0x5B50, 0x5B57, 0x5B5C, 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E, 0x7386, 0x74F7, 0x75B5, 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328, 0x8517, 0x85C9, 0x8AEE, 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC, 0x65AB, 0x6628, 0x707C, 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C, 0x96C0, 0x9D72, 0x5B71, 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91, 0x66AB, 0x6F5B, 0x7BB4, 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7, 0x5320, 0x5834, 0x58BB, 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84, 0x5F35, 0x638C, 0x66B2, 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F, 0x7246, 0xF9FA, 0x7350, 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7, 0x838A, 0x846C, 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC, 0x9577, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750, 0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1, 0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47, 0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E, 0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35, 0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019, 0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458, 0x6575, 0x6EF4, 0x72C4, 0xF9FB, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D, 0x7E3E, 0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F, 0x8FEA, 0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0x5168, 0x5178, 0x524D, 0x526A, 0x5861, 0x587C, 0x5960, 0x5C08, 0x5C55, 0x5EDB, 0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08, 0x6FB1, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x714E, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C, 0x7B8B, 0x7BAD, 0x7BC6, 0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F, 0x9293, 0x9322, 0x942B, 0x96FB, 0x985A, 0x986B, 0x991E, 0x5207, 0x622A, 0x6298, 0x6D59, 0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360, 0x5CBE, 0x5E97, 0x6F38, 0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE, 0x63A5, 0x647A, 0x8776, 0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075, 0x5448, 0x59C3, 0x5B9A, 0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5, 0x633A, 0x653F, 0x6574, 0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968, 0x6A89, 0x6B63, 0x6C40, 0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E, 0x70A1, 0x738E, 0x73FD, 0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B, 0x7A7D, 0x7CBE, 0x7D8E, 0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D, 0x914A, 0x91D8, 0x9266, 0x92CC, 0x9320, 0x9706, 0x9756, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x975C, 0x9802, 0x9F0E, 0x5236, 0x5291, 0x557C, 0x5824, 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF, 0x6FDF, 0x796D, 0x7B2C, 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44, 0x918D, 0x9664, 0x969B, 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146, 0x51CB, 0x52A9, 0x5632, 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9, 0x6641, 0x66FA, 0x66F9, 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15, 0x6F6E, 0x7167, 0x71E5, 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A, 0x79DF, 0x7A20, 0x7A95, 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087, 0x85FB, 0x86A4, 0x8A54, 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D, 0x91E3, 0x963B, 0x96D5, 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3, 0x5B58, 0x5C0A, 0x5352, 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E, 0x60B0, 0x616B, 0x68D5, 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C, 0x7E31, 0x816B, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750, 0x5DE6, 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A, 0x59DD, 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE, 0x5EDA, 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A, 0x6F8D, 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2, 0x821F, 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031, 0x914E, 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101, 0x51C6, 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96, 0x6FEC, 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB, 0x99FF, 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB, 0x696B, 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD, 0x7511, 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F, 0x652F, 0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A, 0x6F2C, 0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102, 0x81F3, 0x829D, 0x82B7, 0x8718, 0x8A8C, 0xF9FC, 0x8D04, 0x8DBE, 0x9072, 0x76F4, 0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4, 0x5875, 0x632F, 0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84, 0x6D25, 0x6EB1, 0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1, 0x771E, 0x778B, 0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897, 0x8A3A, 0x8CD1, 0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673, 0x9707, 0x4F84, 0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, 0x74C6, 0x75BE, 0x79E9, 0x7A92, 0x81A3, 0x86ED, 0x8CEA, 0x8DCC, 0x8FED, 0x659F, 0x6715, 0xF9FD, 0x57F7, 0x6F57, 0x7DDD, 0x8F2F, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x93F6, 0x96C6, 0x5FB5, 0x61F2, 0x6F84, 0x4E14, 0x4F98, 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE, 0x6B21, 0x6B64, 0x78CB, 0x7B9A, 0xF9FE, 0x8E49, 0x8ECA, 0x906E, 0x6349, 0x643E, 0x7740, 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF, 0x71E6, 0x74A8, 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98, 0x8B9A, 0x8D0A, 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6, 0x672D, 0x7D2E, 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA, 0x65AC, 0x7AD9, 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5A3C, 0x5EE0, 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2, 0x69CD, 0x6EC4, 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259, 0x83D6, 0x84BC, 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1, 0x7826, 0x7DB5, 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5, 0x7B56, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0xF9FF, 0x5254, 0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC, 0x7620, 0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598, 0x5929, 0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B, 0x85A6, 0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6, 0x51F8, 0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F, 0x8F4D, 0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB, 0x7C3D, 0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377, 0x7252, 0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674, 0x6DF8, 0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0xFA00, 0x5243, 0x66FF, 0x6D95, 0x6EEF, 0x7DE0, 0x8AE6, 0x902E, 0x905E, 0x9AD4, 0x521D, 0x527F, 0x54E8, 0x6194, 0x6284, 0x62DB, 0x68A2, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x6912, 0x695A, 0x6A35, 0x7092, 0x7126, 0x785D, 0x7901, 0x790E, 0x79D2, 0x7A0D, 0x8096, 0x8278, 0x82D5, 0x8349, 0x8549, 0x8C82, 0x8D85, 0x9162, 0x918B, 0x91AE, 0x4FC3, 0x56D1, 0x71ED, 0x77D7, 0x8700, 0x89F8, 0x5BF8, 0x5FD6, 0x6751, 0x90A8, 0x53E2, 0x585A, 0x5BF5, 0x60A4, 0x6181, 0x6460, 0x7E3D, 0x8070, 0x8525, 0x9283, 0x64AE, 0x50AC, 0x5D14, 0x6700, 0x589C, 0x62BD, 0x63A8, 0x690E, 0x6978, 0x6A1E, 0x6E6B, 0x76BA, 0x79CB, 0x82BB, 0x8429, 0x8ACF, 0x8DA8, 0x8FFD, 0x9112, 0x914B, 0x919C, 0x9310, 0x9318, 0x939A, 0x96DB, 0x9A36, 0x9C0D, 0x4E11, 0x755C, 0x795D, 0x7AFA, 0x7B51, 0x7BC9, 0x7E2E, 0x84C4, 0x8E59, 0x8E74, 0x8EF8, 0x9010, 0x6625, 0x693F, 0x7443, 0x51FA, 0x672E, 0x9EDC, 0x5145, 0x5FE0, 0x6C96, 0x87F2, 0x885D, 0x8877, 0x60B4, 0x81B5, 0x8403, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36, 0x5C31, 0x708A, 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189, 0x9A5F, 0x9DF2, 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64, 0x4F88, 0x5024, 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB, 0x6DC4, 0x71BE, 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7, 0x7DFB, 0x7F6E, 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52, 0x5247, 0x52C5, 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5, 0x5BE2, 0x6795, 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C, 0x87C4, 0x79E4, 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE, 0x59A5, 0x60F0, 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99B1, 0x99DD, 0x502C, 0x5353, 0x5544, 0x577C, 0xFA01, 0x6258, 0xFA02, 0x64E2, 0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, 0x8A17, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x9438, 0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E, 0x7058, 0x70AD, 0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708, 0x803D, 0x8CAA, 0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F, 0xFA03, 0x8569, 0x514C, 0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86, 0x6C70, 0x6CF0, 0x7B1E, 0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1, 0xFA04, 0x64C7, 0x6FA4, 0x6491, 0x6504, 0x514E, 0x5410, 0x571F, 0x8A0E, 0x615F, 0x6876, 0xFA05, 0x75DB, 0x7B52, 0x7D71, 0x901A, 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000, 0x9839, 0x5078, 0x5957, 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D, 0x7279, 0x95D6, 0x5761, 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA, 0x6777, 0x6CE2, 0x6D3E, 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD, 0x8DDB, 0x9817, 0x5224, 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9, 0x8FA6, 0x9211, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504, 0x6096, 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987, 0x8C9D, 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F, 0x6241, 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19, 0x8CB6, 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16, 0x5E63, 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B, 0x4F48, 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03, 0x6016, 0x629B, 0x62B1, 0x6355, 0xFA06, 0x6CE1, 0x6D66, 0x75B1, 0x7832, 0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B, 0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0x7206, 0xFA07, 0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753, 0x6A19, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4, 0x9A43, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x54C1, 0x7A1F, 0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE, 0x5F7C, 0x62AB, 0x75B2, 0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339, 0x5F3C, 0x5FC5, 0x6CCC, 0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE, 0x999D, 0x4E4F, 0x903C, 0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8, 0x6630, 0x6CB3, 0x7455, 0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E, 0x9C15, 0x58D1, 0x5B78, 0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068, 0x608D, 0x65F1, 0x6C57, 0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0, 0x9591, 0x9592, 0x9650, 0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B, 0x54B8, 0x5563, 0x558A, 0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C, 0x9677, 0x9E79, 0x5408, 0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4, 0x965C, 0x4EA2, 0x4F09, 0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297, 0x676D, 0x6841, 0x6C86, 0x6E2F, 0x7F38, 0x809B, 0x822A, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0xFA08, 0xFA09, 0x9805, 0x4EA5, 0x5055, 0x54B3, 0x5793, 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023, 0x87F9, 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE, 0x6838, 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411, 0x56AE, 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653, 0x589F, 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47, 0x96AA, 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4, 0x5F26, 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE, 0x7729, 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0xFA0A, 0x8CE2, 0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, 0x4FE0, 0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, 0x8105, 0x8107, 0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, 0x578B, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x5F62, 0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192, 0x73E9, 0x7469, 0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3, 0x99A8, 0x516E, 0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A, 0x91AF, 0x978B, 0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D, 0x5CB5, 0x5F27, 0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69, 0x6DCF, 0x6E56, 0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0, 0x7425, 0x745A, 0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1, 0x82A6, 0x846B, 0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A, 0x93AC, 0x9800, 0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F, 0x6DF7, 0x6E3E, 0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4, 0x5F18, 0x6C5E, 0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C, 0x9D3B, 0x5316, 0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x798D, 0x79BE, 0x82B1, 0x83EF, 0x8A71, 0x8B41, 0x8CA8, 0x9774, 0xFA0B, 0x64F4, 0x652B, 0x78BA, 0x78BB, 0x7A6B, 0x4E38, 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3, 0x63DB, 0x6B61, 0x6665, 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08, 0x9084, 0x9A69, 0x9C25, 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA, 0x51F0, 0x5E4C, 0x5FA8, 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643, 0x6644, 0x69A5, 0x6CC1, 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C, 0x7687, 0x7BC1, 0x7C27, 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3, 0x532F, 0x56DE, 0x5EFB, 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666, 0x6703, 0x6A9C, 0x6DEE, 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE, 0x8334, 0x86D4, 0x8AA8, 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B, 0x9404, 0x54EE, 0x5686, 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F, 0x6D8D, 0x6DC6, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019, 0x539A, 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D, 0x7166, 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104, 0x718F, 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684, 0x714A, 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE, 0x6689, 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB, 0x7566, 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308, 0x6D36, 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403, 0x5C79, 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070, 0x6D3D, 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD, 0x59EC, 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6, 0x7199, 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR}, }; /* * Mapping from Unicode back to KS X 1001. * * This inverse is done the same way the SBCS ones are done: I * provide a list of KS X 1001 positions, sorted into ascending * order of their Unicode values. Then we can binary-search through * this list, referring to the above table for each comparison, to * find the coordinates for a given code point. * * Generated by running the following sh+Perl over KSX1001.TXT: cat CP949.TXT | \ perl -ne '$a{$3}=[hex$1,hex$2] if /^0x(\S\S)(\S\S)\s+(0x\S+)\s/;' \ -e 'END {$o=" ";for $k (sort keys %a) { ($r,$c) = @{$a{$k}}; ' \ -e '$o .= $C; $C = ", "; (print "$o\n"), $o=" " if length $o > 70;' \ -e '$o .= sprintf "{%d,%d}", $r-128,$c-64; } print "$o\n"; }' */ static const struct { unsigned char r, c; } cp949_backward[] = { {34,110}, {34,116}, {33,151}, {33,103}, {40,99}, {33,105}, {34,167}, {33,134}, {33,126}, {41,183}, {41,184}, {34,101}, {34,146}, {33,100}, {34,108}, {41,182}, {40,108}, {40,185}, {40,182}, {40,186}, {34,111}, {40,97}, {40,98}, {33,127}, {40,106}, {40,109}, {41,108}, {41,97}, {41,99}, {33,128}, {41,106}, {41,109}, {41,98}, {40,100}, {41,100}, {41,101}, {40,102}, {41,102}, {41,103}, {40,104}, {41,104}, {40,105}, {41,105}, {41,112}, {40,111}, {41,111}, {40,107}, {41,107}, {40,110}, {41,110}, {34,103}, {34,112}, {34,104}, {34,107}, {34,106}, {34,109}, {34,105}, {37,129}, {37,130}, {37,131}, {37,132}, {37,133}, {37,134}, {37,135}, {37,136}, {37,137}, {37,138}, {37,139}, {37,140}, {37,141}, {37,142}, {37,143}, {37,144}, {37,145}, {37,146}, {37,147}, {37,148}, {37,149}, {37,150}, {37,151}, {37,152}, {37,161}, {37,162}, {37,163}, {37,164}, {37,165}, {37,166}, {37,167}, {37,168}, {37,169}, {37,170}, {37,171}, {37,172}, {37,173}, {37,174}, {37,175}, {37,176}, {37,177}, {37,178}, {37,179}, {37,180}, {37,181}, {37,182}, {37,183}, {37,184}, {44,103}, {44,97}, {44,98}, {44,99}, {44,100}, {44,101}, {44,102}, {44,104}, {44,105}, {44,106}, {44,107}, {44,108}, {44,109}, {44,110}, {44,111}, {44,112}, {44,113}, {44,114}, {44,115}, {44,116}, {44,117}, {44,118}, {44,119}, {44,120}, {44,121}, {44,122}, {44,123}, {44,124}, {44,125}, {44,126}, {44,127}, {44,128}, {44,129}, {44,145}, {44,146}, {44,147}, {44,148}, {44,149}, {44,150}, {44,152}, {44,153}, {44,154}, {44,155}, {44,156}, {44,157}, {44,158}, {44,159}, {44,160}, {44,161}, {44,162}, {44,163}, {44,164}, {44,165}, {44,166}, {44,167}, {44,168}, {44,169}, {44,170}, {44,171}, {44,172}, {44,173}, {44,174}, {44,175}, {44,176}, {44,177}, {44,151}, {33,106}, {33,110}, {33,111}, {33,112}, {33,113}, {34,147}, {34,148}, {33,101}, {33,102}, {34,118}, {33,135}, {33,136}, {33,152}, {41,185}, {41,186}, {41,187}, {41,188}, {41,189}, {41,190}, {34,166}, {33,137}, {34,117}, {39,100}, {34,160}, {34,165}, {34,162}, {39,153}, {33,138}, {40,183}, {40,184}, {40,187}, {40,188}, {40,189}, {40,190}, {37,112}, {37,113}, {37,114}, {37,115}, {37,116}, {37,117}, {37,118}, {37,119}, {37,120}, {37,121}, {37,97}, {37,98}, {37,99}, {37,100}, {37,101}, {37,102}, {37,103}, {37,104}, {37,105}, {37,106}, {33,167}, {33,168}, {33,166}, {33,169}, {33,170}, {34,149}, {34,152}, {34,150}, {34,153}, {34,151}, {34,97}, {34,98}, {34,99}, {33,147}, {34,100}, {33,148}, {33,180}, {33,181}, {34,115}, {34,114}, {33,174}, {33,176}, {33,132}, {33,144}, {33,107}, {33,188}, {33,189}, {33,187}, {33,186}, {33,178}, {33,179}, {34,113}, {33,133}, {33,177}, {33,109}, {33,175}, {33,150}, {33,129}, {33,149}, {33,130}, {33,131}, {33,172}, {33,173}, {33,184}, {33,185}, {33,182}, {33,183}, {34,129}, {33,145}, {33,146}, {40,167}, {40,168}, {40,169}, {40,170}, {40,171}, {40,172}, {40,173}, {40,174}, {40,175}, {40,176}, {40,177}, {40,178}, {40,179}, {40,180}, {40,181}, {41,167}, {41,168}, {41,169}, {41,170}, {41,171}, {41,172}, {41,173}, {41,174}, {41,175}, {41,176}, {41,177}, {41,178}, {41,179}, {41,180}, {41,181}, {41,141}, {41,142}, {41,143}, {41,144}, {41,145}, {41,146}, {41,147}, {41,148}, {41,149}, {41,150}, {41,151}, {41,152}, {41,153}, {41,154}, {41,155}, {41,156}, {41,157}, {41,158}, {41,159}, {41,160}, {41,161}, {41,162}, {41,163}, {41,164}, {41,165}, {41,166}, {40,141}, {40,142}, {40,143}, {40,144}, {40,145}, {40,146}, {40,147}, {40,148}, {40,149}, {40,150}, {40,151}, {40,152}, {40,153}, {40,154}, {40,155}, {40,156}, {40,157}, {40,158}, {40,159}, {40,160}, {40,161}, {40,162}, {40,163}, {40,164}, {40,165}, {40,166}, {38,97}, {38,108}, {38,98}, {38,109}, {38,99}, {38,136}, {38,135}, {38,110}, {38,100}, {38,130}, {38,129}, {38,111}, {38,102}, {38,134}, {38,133}, {38,113}, {38,101}, {38,132}, {38,131}, {38,112}, {38,103}, {38,124}, {38,137}, {38,138}, {38,119}, {38,139}, {38,140}, {38,114}, {38,105}, {38,126}, {38,141}, {38,142}, {38,121}, {38,143}, {38,144}, {38,116}, {38,104}, {38,145}, {38,146}, {38,120}, {38,125}, {38,147}, {38,148}, {38,115}, {38,106}, {38,149}, {38,150}, {38,122}, {38,127}, {38,151}, {38,152}, {38,117}, {38,107}, {38,153}, {38,154}, {38,123}, {38,155}, {38,156}, {38,128}, {38,157}, {38,158}, {38,159}, {38,160}, {38,161}, {38,162}, {38,163}, {38,164}, {38,118}, {34,134}, {33,161}, {33,160}, {34,131}, {34,135}, {34,136}, {34,139}, {34,138}, {34,137}, {34,140}, {33,163}, {33,162}, {34,122}, {34,121}, {33,165}, {33,164}, {34,120}, {34,119}, {33,159}, {33,158}, {34,130}, {33,155}, {33,157}, {33,156}, {34,132}, {34,133}, {33,154}, {33,153}, {34,143}, {34,142}, {34,144}, {34,145}, {33,143}, {33,142}, {34,124}, {34,125}, {34,128}, {34,123}, {34,126}, {34,127}, {34,141}, {34,155}, {34,156}, {34,157}, {34,154}, {33,97}, {33,98}, {33,99}, {33,104}, {33,116}, {33,117}, {33,118}, {33,119}, {33,120}, {33,121}, {33,122}, {33,123}, {33,124}, {33,125}, {33,171}, {33,114}, {33,115}, {42,97}, {42,98}, {42,99}, {42,100}, {42,101}, {42,102}, {42,103}, {42,104}, {42,105}, {42,106}, {42,107}, {42,108}, {42,109}, {42,110}, {42,111}, {42,112}, {42,113}, {42,114}, {42,115}, {42,116}, {42,117}, {42,118}, {42,119}, {42,120}, {42,121}, {42,122}, {42,123}, {42,124}, {42,125}, {42,126}, {42,127}, {42,128}, {42,129}, {42,130}, {42,131}, {42,132}, {42,133}, {42,134}, {42,135}, {42,136}, {42,137}, {42,138}, {42,139}, {42,140}, {42,141}, {42,142}, {42,143}, {42,144}, {42,145}, {42,146}, {42,147}, {42,148}, {42,149}, {42,150}, {42,151}, {42,152}, {42,153}, {42,154}, {42,155}, {42,156}, {42,157}, {42,158}, {42,159}, {42,160}, {42,161}, {42,162}, {42,163}, {42,164}, {42,165}, {42,166}, {42,167}, {42,168}, {42,169}, {42,170}, {42,171}, {42,172}, {42,173}, {42,174}, {42,175}, {42,176}, {42,177}, {42,178}, {42,179}, {43,97}, {43,98}, {43,99}, {43,100}, {43,101}, {43,102}, {43,103}, {43,104}, {43,105}, {43,106}, {43,107}, {43,108}, {43,109}, {43,110}, {43,111}, {43,112}, {43,113}, {43,114}, {43,115}, {43,116}, {43,117}, {43,118}, {43,119}, {43,120}, {43,121}, {43,122}, {43,123}, {43,124}, {43,125}, {43,126}, {43,127}, {43,128}, {43,129}, {43,130}, {43,131}, {43,132}, {43,133}, {43,134}, {43,135}, {43,136}, {43,137}, {43,138}, {43,139}, {43,140}, {43,141}, {43,142}, {43,143}, {43,144}, {43,145}, {43,146}, {43,147}, {43,148}, {43,149}, {43,150}, {43,151}, {43,152}, {43,153}, {43,154}, {43,155}, {43,156}, {43,157}, {43,158}, {43,159}, {43,160}, {43,161}, {43,162}, {43,163}, {43,164}, {43,165}, {43,166}, {43,167}, {43,168}, {43,169}, {43,170}, {43,171}, {43,172}, {43,173}, {43,174}, {43,175}, {43,176}, {43,177}, {43,178}, {43,179}, {43,180}, {43,181}, {43,182}, {36,97}, {36,98}, {36,99}, {36,100}, {36,101}, {36,102}, {36,103}, {36,104}, {36,105}, {36,106}, {36,107}, {36,108}, {36,109}, {36,110}, {36,111}, {36,112}, {36,113}, {36,114}, {36,115}, {36,116}, {36,117}, {36,118}, {36,119}, {36,120}, {36,121}, {36,122}, {36,123}, {36,124}, {36,125}, {36,126}, {36,127}, {36,128}, {36,129}, {36,130}, {36,131}, {36,132}, {36,133}, {36,134}, {36,135}, {36,136}, {36,137}, {36,138}, {36,139}, {36,140}, {36,141}, {36,142}, {36,143}, {36,144}, {36,145}, {36,146}, {36,147}, {36,148}, {36,149}, {36,150}, {36,151}, {36,152}, {36,153}, {36,154}, {36,155}, {36,156}, {36,157}, {36,158}, {36,159}, {36,160}, {36,161}, {36,162}, {36,163}, {36,164}, {36,165}, {36,166}, {36,167}, {36,168}, {36,169}, {36,170}, {36,171}, {36,172}, {36,173}, {36,174}, {36,175}, {36,176}, {36,177}, {36,178}, {36,179}, {36,180}, {36,181}, {36,182}, {36,183}, {36,184}, {36,185}, {36,186}, {36,187}, {36,188}, {36,189}, {36,190}, {41,113}, {41,114}, {41,115}, {41,116}, {41,117}, {41,118}, {41,119}, {41,120}, {41,121}, {41,122}, {41,123}, {41,124}, {41,125}, {41,126}, {41,127}, {41,128}, {41,129}, {41,130}, {41,131}, {41,132}, {41,133}, {41,134}, {41,135}, {41,136}, {41,137}, {41,138}, {41,139}, {41,140}, {34,159}, {40,113}, {40,114}, {40,115}, {40,116}, {40,117}, {40,118}, {40,119}, {40,120}, {40,121}, {40,122}, {40,123}, {40,124}, {40,125}, {40,126}, {40,127}, {40,128}, {40,129}, {40,130}, {40,131}, {40,132}, {40,133}, {40,134}, {40,135}, {40,136}, {40,137}, {40,138}, {40,139}, {40,140}, {34,158}, {39,137}, {39,138}, {39,139}, {39,140}, {39,141}, {39,122}, {39,123}, {39,156}, {39,157}, {39,158}, {39,118}, {39,119}, {39,120}, {39,148}, {39,149}, {39,150}, {39,151}, {39,152}, {39,97}, {39,98}, {39,99}, {39,101}, {39,107}, {39,108}, {39,109}, {39,110}, {39,111}, {39,112}, {39,113}, {39,114}, {39,115}, {39,116}, {39,103}, {39,104}, {39,105}, {39,106}, {39,125}, {39,126}, {39,165}, {39,166}, {39,167}, {39,168}, {39,161}, {39,162}, {39,163}, {39,127}, {39,128}, {39,129}, {39,130}, {39,131}, {39,132}, {39,133}, {39,134}, {39,135}, {39,136}, {39,142}, {39,143}, {39,144}, {39,145}, {39,146}, {39,147}, {39,154}, {39,155}, {34,163}, {39,172}, {39,102}, {39,160}, {39,175}, {34,161}, {39,124}, {39,173}, {39,117}, {39,121}, {39,170}, {39,171}, {39,159}, {34,164}, {39,164}, {39,174}, {39,169}, {108,169}, {111,139}, {118,146}, {88,114}, {109,155}, {95,114}, {95,126}, {121,123}, {92,180}, {117,164}, {115,102}, {93,160}, {97,102}, {78,184}, {92,112}, {99,106}, {113,169}, {77,186}, {124,111}, {83,97}, {113,107}, {103,145}, {82,108}, {78,185}, {113,189}, {94,127}, {123,122}, {121,121}, {78,146}, {99,107}, {107,160}, {78,186}, {75,183}, {101,101}, {74,161}, {84,140}, {106,161}, {92,163}, {95,109}, {75,171}, {85,111}, {86,181}, {101,184}, {94,128}, {108,99}, {105,141}, {106,103}, {105,182}, {123,123}, {103,169}, {111,140}, {80,166}, {94,129}, {100,108}, {88,140}, {121,177}, {78,159}, {122,100}, {102,114}, {122,187}, {122,125}, {76,136}, {111,141}, {85,149}, {83,98}, {108,145}, {100,103}, {108,146}, {118,113}, {78,187}, {80,145}, {75,127}, {109,100}, {109,104}, {94,130}, {118,162}, {109,156}, {92,181}, {96,121}, {84,142}, {116,117}, {83,155}, {86,117}, {108,100}, {100,166}, {113,170}, {75,172}, {75,128}, {108,178}, {80,170}, {121,178}, {108,101}, {80,159}, {103,170}, {80,171}, {92,145}, {91,169}, {125,140}, {91,151}, {90,161}, {86,118}, {99,159}, {94,131}, {94,132}, {74,97}, {110,172}, {83,99}, {110,119}, {120,143}, {106,136}, {110,120}, {113,108}, {113,101}, {105,142}, {121,124}, {101,185}, {108,170}, {93,150}, {109,130}, {120,101}, {101,122}, {91,152}, {74,98}, {81,141}, {110,173}, {108,171}, {94,133}, {99,160}, {74,137}, {114,169}, {85,142}, {118,118}, {78,130}, {86,135}, {99,116}, {113,109}, {106,162}, {87,130}, {115,103}, {77,170}, {107,174}, {89,114}, {125,101}, {118,149}, {85,162}, {120,117}, {76,181}, {117,117}, {100,109}, {103,171}, {113,149}, {112,123}, {105,117}, {76,137}, {122,149}, {97,148}, {87,150}, {92,129}, {94,134}, {122,175}, {99,161}, {97,179}, {92,182}, {78,188}, {91,132}, {120,177}, {92,164}, {101,175}, {92,113}, {85,150}, {115,154}, {75,129}, {91,131}, {89,186}, {83,174}, {122,120}, {125,102}, {107,175}, {116,102}, {76,138}, {115,104}, {115,155}, {91,103}, {118,119}, {79,166}, {112,178}, {75,154}, {103,146}, {87,131}, {118,176}, {104,158}, {101,102}, {101,167}, {74,99}, {76,103}, {106,137}, {120,118}, {122,101}, {113,110}, {111,142}, {75,173}, {118,112}, {111,143}, {105,143}, {119,158}, {78,147}, {92,183}, {91,104}, {75,184}, {95,97}, {93,161}, {117,138}, {105,118}, {103,172}, {110,174}, {115,176}, {95,127}, {76,139}, {80,129}, {116,146}, {96,122}, {95,128}, {78,160}, {92,146}, {125,170}, {86,182}, {106,138}, {104,169}, {99,108}, {115,144}, {74,100}, {91,184}, {94,135}, {107,176}, {113,150}, {101,162}, {76,140}, {75,187}, {106,163}, {95,129}, {86,173}, {105,144}, {110,121}, {85,163}, {81,147}, {101,176}, {104,116}, {107,131}, {106,106}, {122,188}, {117,182}, {112,124}, {125,148}, {96,123}, {78,131}, {80,122}, {119,122}, {88,179}, {119,141}, {100,110}, {84,159}, {80,167}, {108,189}, {82,110}, {110,175}, {85,151}, {106,164}, {120,98}, {77,171}, {87,127}, {123,113}, {77,172}, {92,114}, {80,172}, {78,189}, {110,176}, {76,130}, {80,173}, {101,183}, {115,188}, {110,98}, {89,115}, {88,180}, {105,119}, {78,110}, {89,98}, {88,177}, {84,143}, {101,103}, {85,146}, {86,105}, {116,98}, {113,151}, {85,152}, {112,125}, {87,144}, {84,144}, {87,143}, {107,170}, {125,171}, {91,173}, {124,133}, {75,130}, {125,149}, {116,136}, {104,170}, {117,179}, {121,158}, {83,175}, {108,147}, {93,130}, {111,119}, {103,148}, {74,138}, {89,187}, {122,189}, {86,106}, {116,184}, {119,183}, {92,108}, {87,151}, {95,98}, {78,126}, {83,176}, {112,100}, {97,172}, {79,167}, {115,139}, {109,105}, {74,126}, {116,175}, {118,142}, {94,187}, {80,123}, {85,119}, {110,177}, {116,104}, {92,184}, {75,103}, {90,142}, {96,166}, {109,101}, {110,178}, {92,185}, {121,156}, {115,156}, {120,178}, {116,185}, {124,177}, {80,124}, {91,185}, {87,113}, {75,188}, {112,101}, {75,189}, {85,180}, {77,173}, {74,101}, {86,107}, {80,130}, {112,126}, {82,125}, {76,100}, {122,118}, {76,141}, {90,186}, {118,143}, {105,120}, {88,181}, {76,142}, {87,141}, {84,145}, {105,173}, {74,171}, {89,162}, {125,114}, {99,109}, {86,140}, {89,116}, {97,103}, {110,147}, {80,131}, {125,115}, {85,164}, {79,168}, {109,131}, {80,114}, {78,190}, {90,104}, {120,144}, {125,150}, {120,145}, {120,146}, {92,147}, {93,162}, {123,185}, {93,129}, {99,117}, {109,157}, {78,132}, {75,97}, {93,163}, {124,157}, {121,111}, {82,187}, {79,97}, {100,104}, {116,118}, {108,190}, {99,110}, {103,173}, {125,129}, {90,162}, {88,115}, {93,164}, {112,175}, {118,177}, {122,176}, {81,181}, {90,143}, {92,148}, {92,102}, {111,127}, {78,143}, {96,153}, {89,150}, {108,148}, {106,139}, {74,127}, {85,112}, {79,169}, {113,173}, {76,143}, {100,184}, {100,173}, {87,152}, {125,103}, {106,107}, {118,114}, {79,176}, {121,125}, {102,180}, {75,155}, {115,145}, {105,145}, {115,105}, {80,160}, {105,146}, {90,163}, {98,146}, {118,98}, {97,180}, {90,164}, {103,149}, {117,127}, {79,98}, {77,111}, {79,99}, {77,112}, {113,190}, {80,99}, {97,111}, {120,99}, {74,102}, {119,123}, {114,170}, {94,136}, {105,147}, {94,137}, {125,158}, {74,128}, {121,170}, {81,142}, {110,148}, {84,146}, {89,99}, {125,104}, {87,153}, {119,142}, {122,126}, {79,150}, {87,176}, {107,161}, {120,133}, {92,186}, {93,131}, {121,159}, {103,175}, {125,165}, {118,99}, {89,188}, {125,105}, {103,174}, {85,165}, {111,144}, {77,113}, {119,98}, {113,114}, {113,113}, {77,114}, {90,107}, {74,103}, {99,162}, {123,124}, {89,100}, {110,122}, {120,147}, {123,186}, {79,100}, {92,187}, {118,163}, {109,106}, {114,97}, {78,161}, {122,102}, {121,160}, {108,150}, {100,174}, {121,97}, {123,175}, {121,171}, {110,99}, {106,108}, {74,104}, {116,186}, {77,150}, {124,182}, {116,137}, {120,148}, {120,102}, {94,138}, {114,134}, {87,154}, {83,144}, {88,133}, {106,166}, {115,157}, {100,154}, {118,164}, {118,178}, {95,130}, {89,189}, {76,182}, {83,122}, {100,111}, {121,161}, {112,102}, {75,147}, {96,124}, {116,138}, {84,186}, {125,106}, {121,162}, {116,119}, {125,130}, {124,112}, {125,172}, {74,162}, {125,125}, {106,167}, {95,131}, {81,146}, {78,162}, {83,100}, {125,107}, {95,160}, {114,135}, {103,176}, {80,174}, {115,106}, {94,139}, {118,120}, {97,181}, {113,115}, {119,99}, {74,105}, {79,101}, {95,132}, {97,112}, {112,127}, {118,100}, {99,118}, {122,134}, {80,175}, {125,173}, {93,132}, {124,183}, {102,127}, {94,109}, {122,127}, {101,177}, {109,132}, {82,101}, {125,174}, {117,118}, {97,182}, {94,140}, {124,158}, {108,151}, {77,157}, {86,119}, {77,115}, {120,149}, {101,152}, {79,170}, {79,144}, {106,140}, {106,110}, {106,109}, {83,177}, {83,101}, {119,143}, {110,100}, {80,100}, {114,98}, {80,176}, {114,99}, {119,184}, {80,115}, {91,105}, {83,123}, {74,172}, {113,102}, {75,149}, {119,167}, {77,158}, {119,100}, {120,128}, {83,157}, {76,144}, {79,102}, {118,179}, {97,183}, {83,156}, {122,190}, {122,103}, {107,153}, {79,103}, {106,111}, {100,175}, {105,121}, {113,152}, {88,152}, {96,178}, {102,116}, {92,188}, {115,177}, {99,144}, {114,187}, {91,134}, {80,177}, {80,178}, {79,156}, {83,145}, {76,113}, {119,152}, {75,104}, {107,124}, {100,126}, {116,156}, {92,130}, {112,103}, {102,128}, {74,173}, {104,171}, {101,168}, {92,131}, {109,158}, {83,178}, {76,183}, {78,148}, {103,107}, {75,131}, {97,113}, {119,114}, {83,179}, {83,146}, {117,128}, {95,157}, {110,179}, {103,177}, {125,116}, {114,136}, {115,146}, {110,180}, {98,147}, {76,145}, {95,170}, {105,122}, {89,151}, {117,141}, {113,178}, {122,135}, {89,184}, {84,130}, {118,165}, {93,133}, {103,178}, {109,159}, {74,139}, {91,186}, {104,117}, {83,102}, {125,117}, {121,137}, {100,162}, {123,125}, {87,100}, {78,133}, {78,149}, {86,166}, {101,125}, {94,141}, {108,179}, {109,160}, {108,172}, {123,126}, {95,171}, {97,184}, {121,126}, {80,179}, {96,106}, {104,162}, {98,148}, {82,189}, {101,104}, {89,147}, {83,158}, {116,120}, {119,124}, {92,189}, {104,172}, {100,167}, {99,183}, {108,104}, {122,177}, {101,178}, {80,180}, {82,111}, {92,165}, {80,101}, {113,116}, {124,113}, {76,184}, {93,134}, {122,145}, {119,159}, {122,104}, {110,181}, {94,142}, {103,179}, {119,108}, {107,132}, {109,161}, {96,107}, {93,135}, {82,115}, {82,127}, {74,140}, {123,127}, {101,189}, {93,165}, {88,141}, {108,180}, {80,181}, {104,173}, {80,146}, {89,152}, {118,166}, {91,106}, {119,160}, {88,153}, {116,99}, {116,157}, {111,145}, {89,117}, {109,107}, {99,119}, {110,123}, {77,116}, {96,179}, {106,141}, {108,181}, {104,174}, {75,105}, {113,111}, {74,141}, {108,105}, {114,171}, {125,175}, {121,179}, {102,129}, {108,152}, {109,108}, {106,142}, {104,159}, {94,143}, {82,102}, {103,180}, {81,150}, {102,130}, {99,163}, {100,112}, {88,116}, {118,101}, {115,158}, {87,101}, {119,168}, {104,134}, {123,166}, {93,166}, {92,190}, {88,154}, {90,108}, {106,112}, {99,120}, {74,106}, {97,185}, {106,113}, {114,172}, {122,174}, {110,149}, {121,180}, {82,172}, {123,187}, {125,176}, {96,125}, {78,163}, {120,134}, {94,110}, {95,133}, {101,126}, {109,109}, {122,170}, {77,174}, {109,102}, {109,110}, {112,173}, {93,97}, {109,111}, {124,184}, {88,171}, {76,185}, {77,117}, {122,105}, {97,157}, {98,149}, {109,143}, {93,98}, {121,138}, {106,168}, {101,173}, {83,171}, {105,148}, {97,186}, {100,140}, {97,164}, {104,135}, {78,155}, {92,149}, {119,117}, {124,179}, {112,179}, {78,111}, {113,117}, {111,146}, {104,136}, {107,177}, {75,148}, {96,126}, {99,184}, {106,169}, {124,114}, {96,180}, {79,160}, {110,101}, {122,106}, {102,131}, {97,114}, {74,107}, {99,164}, {105,123}, {98,150}, {115,178}, {110,150}, {106,114}, {80,182}, {108,153}, {90,139}, {79,104}, {93,99}, {88,155}, {121,142}, {105,149}, {99,145}, {82,124}, {88,108}, {115,140}, {77,187}, {118,150}, {103,181}, {104,175}, {99,185}, {82,123}, {115,179}, {99,187}, {94,144}, {78,112}, {86,183}, {113,153}, {117,129}, {92,132}, {117,123}, {94,145}, {92,166}, {94,146}, {109,162}, {110,182}, {106,143}, {112,174}, {99,188}, {83,159}, {83,180}, {97,115}, {97,116}, {116,147}, {95,134}, {105,150}, {91,107}, {118,102}, {99,121}, {107,133}, {116,105}, {77,118}, {82,185}, {90,109}, {82,163}, {79,145}, {75,156}, {76,186}, {79,157}, {104,105}, {99,123}, {99,122}, {96,154}, {110,183}, {92,115}, {83,181}, {87,102}, {118,117}, {87,155}, {97,149}, {84,170}, {95,99}, {125,159}, {80,183}, {109,148}, {75,106}, {100,155}, {97,187}, {75,98}, {83,160}, {100,127}, {123,128}, {90,126}, {100,141}, {86,121}, {111,128}, {97,188}, {118,121}, {95,135}, {100,113}, {92,167}, {92,168}, {122,150}, {83,182}, {113,154}, {122,178}, {98,189}, {85,143}, {80,184}, {77,159}, {117,139}, {100,176}, {75,107}, {87,132}, {98,190}, {93,154}, {90,110}, {74,174}, {85,121}, {99,97}, {104,163}, {115,107}, {79,105}, {83,183}, {84,177}, {78,164}, {104,178}, {101,181}, {103,110}, {86,122}, {95,172}, {100,128}, {104,164}, {88,117}, {100,156}, {116,121}, {113,118}, {98,158}, {97,117}, {77,175}, {113,103}, {78,165}, {75,157}, {89,163}, {115,108}, {80,185}, {108,107}, {94,147}, {119,169}, {121,181}, {97,158}, {75,174}, {99,124}, {120,150}, {91,174}, {125,177}, {119,118}, {116,158}, {114,173}, {91,153}, {112,104}, {97,189}, {94,148}, {96,108}, {109,163}, {83,161}, {95,136}, {89,118}, {125,108}, {111,147}, {100,129}, {120,171}, {91,108}, {124,134}, {88,109}, {118,122}, {91,159}, {83,147}, {120,135}, {74,142}, {120,129}, {82,116}, {92,116}, {122,121}, {74,143}, {124,115}, {106,170}, {106,171}, {80,186}, {109,164}, {93,167}, {95,137}, {95,173}, {110,124}, {111,129}, {76,146}, {93,100}, {95,138}, {83,184}, {113,104}, {77,119}, {111,148}, {100,157}, {95,174}, {75,108}, {105,124}, {106,172}, {95,139}, {121,127}, {86,111}, {85,134}, {79,106}, {78,105}, {86,184}, {113,119}, {110,184}, {89,153}, {115,159}, {120,136}, {78,134}, {85,166}, {116,166}, {102,133}, {111,149}, {75,175}, {124,159}, {92,103}, {86,167}, {120,137}, {99,146}, {99,125}, {79,161}, {112,128}, {108,154}, {93,151}, {123,176}, {108,108}, {112,105}, {122,151}, {123,129}, {82,128}, {101,112}, {109,165}, {75,109}, {121,112}, {119,101}, {75,110}, {90,111}, {88,118}, {83,103}, {123,114}, {125,132}, {108,109}, {123,97}, {101,169}, {105,174}, {115,180}, {120,179}, {112,129}, {94,111}, {120,112}, {115,160}, {103,111}, {91,109}, {102,117}, {121,104}, {93,152}, {104,153}, {111,150}, {83,162}, {98,159}, {124,160}, {87,136}, {125,109}, {95,175}, {76,147}, {83,185}, {84,176}, {91,135}, {94,149}, {112,180}, {85,144}, {101,153}, {124,135}, {92,150}, {98,160}, {90,112}, {115,99}, {83,172}, {116,139}, {125,133}, {99,189}, {121,113}, {80,187}, {108,155}, {117,124}, {114,100}, {88,142}, {88,143}, {117,183}, {118,161}, {82,119}, {123,172}, {93,136}, {100,168}, {82,129}, {120,151}, {86,123}, {94,150}, {119,125}, {108,110}, {80,161}, {96,181}, {106,115}, {78,150}, {76,101}, {108,182}, {98,161}, {99,126}, {124,136}, {77,176}, {121,182}, {95,176}, {101,127}, {78,127}, {124,161}, {109,112}, {125,145}, {118,123}, {121,143}, {107,154}, {74,129}, {82,120}, {77,177}, {99,147}, {125,166}, {102,173}, {99,186}, {112,106}, {121,144}, {124,162}, {120,103}, {97,165}, {110,185}, {103,182}, {106,173}, {124,116}, {117,130}, {87,156}, {112,181}, {93,168}, {83,173}, {117,188}, {90,127}, {76,187}, {83,186}, {116,100}, {111,151}, {84,131}, {123,163}, {123,173}, {96,109}, {106,174}, {123,115}, {100,130}, {118,167}, {82,157}, {95,140}, {124,137}, {101,105}, {96,182}, {118,115}, {97,190}, {75,176}, {106,175}, {106,176}, {90,128}, {120,116}, {107,178}, {100,131}, {105,151}, {100,177}, {74,175}, {78,151}, {124,138}, {115,161}, {75,132}, {99,165}, {75,133}, {106,116}, {105,125}, {87,137}, {107,155}, {109,113}, {76,131}, {119,126}, {124,139}, {120,180}, {89,119}, {115,147}, {115,148}, {119,164}, {119,145}, {88,119}, {78,113}, {74,130}, {123,116}, {75,134}, {112,182}, {85,167}, {106,144}, {76,148}, {75,111}, {116,106}, {105,111}, {117,131}, {105,152}, {93,169}, {113,179}, {85,187}, {94,123}, {116,187}, {125,179}, {125,178}, {119,102}, {93,137}, {84,147}, {76,104}, {90,129}, {76,149}, {89,164}, {122,138}, {101,163}, {83,124}, {74,176}, {80,132}, {74,144}, {122,107}, {107,171}, {103,184}, {89,165}, {81,151}, {115,100}, {84,187}, {124,163}, {122,152}, {115,149}, {79,107}, {107,179}, {85,188}, {83,148}, {77,188}, {89,166}, {98,185}, {98,97}, {107,148}, {96,183}, {100,114}, {76,188}, {123,164}, {116,107}, {80,125}, {74,177}, {111,120}, {87,128}, {110,186}, {125,180}, {83,163}, {123,130}, {85,168}, {91,110}, {97,118}, {120,119}, {96,127}, {123,131}, {93,170}, {98,98}, {110,102}, {118,168}, {118,181}, {93,138}, {80,162}, {93,102}, {93,171}, {100,185}, {99,111}, {80,188}, {116,188}, {76,124}, {119,170}, {101,164}, {95,177}, {119,161}, {121,183}, {111,121}, {120,152}, {121,105}, {120,153}, {110,125}, {88,134}, {100,163}, {117,142}, {93,153}, {89,167}, {82,121}, {85,131}, {90,165}, {90,144}, {81,153}, {78,152}, {75,158}, {116,108}, {90,187}, {118,169}, {104,179}, {79,108}, {112,176}, {116,189}, {91,136}, {78,128}, {99,148}, {81,143}, {113,181}, {77,178}, {79,171}, {77,120}, {99,102}, {81,154}, {114,101}, {114,102}, {100,142}, {83,187}, {113,105}, {114,137}, {111,152}, {102,137}, {88,120}, {122,179}, {115,117}, {120,100}, {81,179}, {102,136}, {120,154}, {92,169}, {94,151}, {75,159}, {79,172}, {116,159}, {81,180}, {82,122}, {95,178}, {97,119}, {98,99}, {83,188}, {109,166}, {91,137}, {100,186}, {79,158}, {78,144}, {85,147}, {115,181}, {119,110}, {111,136}, {77,179}, {117,143}, {101,179}, {112,130}, {74,145}, {106,177}, {80,102}, {89,154}, {112,107}, {107,167}, {101,128}, {124,117}, {100,132}, {76,105}, {125,134}, {106,117}, {101,106}, {95,122}, {97,159}, {90,145}, {97,120}, {104,180}, {83,189}, {98,100}, {114,138}, {90,166}, {119,115}, {125,141}, {115,118}, {110,151}, {117,132}, {88,100}, {114,103}, {89,120}, {89,121}, {111,137}, {86,142}, {119,139}, {95,110}, {104,181}, {82,117}, {83,149}, {116,140}, {90,188}, {89,168}, {119,171}, {117,137}, {115,124}, {90,146}, {83,117}, {104,118}, {86,143}, {116,122}, {119,137}, {76,106}, {112,131}, {76,150}, {80,147}, {83,125}, {91,187}, {75,160}, {83,164}, {118,183}, {85,122}, {115,141}, {75,161}, {107,180}, {116,109}, {124,106}, {119,172}, {104,182}, {90,167}, {119,140}, {101,129}, {96,174}, {85,189}, {78,166}, {124,107}, {85,123}, {114,104}, {98,101}, {77,121}, {106,178}, {75,135}, {77,180}, {91,111}, {111,153}, {77,122}, {124,185}, {95,179}, {78,167}, {90,130}, {79,109}, {103,185}, {120,104}, {115,162}, {74,178}, {95,100}, {84,132}, {76,151}, {101,130}, {77,123}, {111,154}, {110,152}, {93,103}, {98,102}, {96,128}, {86,112}, {120,138}, {124,186}, {89,190}, {94,112}, {93,172}, {90,168}, {84,160}, {86,185}, {77,151}, {94,152}, {114,184}, {100,150}, {80,133}, {116,110}, {93,104}, {109,133}, {115,150}, {94,153}, {99,166}, {83,104}, {91,112}, {101,154}, {99,127}, {91,113}, {85,169}, {96,129}, {111,155}, {112,169}, {87,114}, {80,189}, {89,169}, {80,190}, {108,173}, {83,105}, {114,105}, {112,132}, {98,162}, {105,175}, {121,145}, {105,153}, {104,154}, {90,131}, {90,132}, {84,133}, {103,186}, {77,160}, {99,112}, {91,114}, {123,132}, {115,163}, {89,101}, {123,167}, {93,139}, {80,148}, {102,118}, {96,110}, {125,154}, {92,117}, {96,184}, {103,113}, {117,176}, {88,156}, {109,134}, {97,121}, {99,128}, {121,128}, {105,176}, {89,155}, {115,164}, {92,118}, {100,169}, {112,133}, {99,129}, {124,140}, {124,141}, {114,139}, {114,140}, {100,143}, {113,155}, {122,153}, {113,120}, {125,181}, {96,185}, {103,187}, {124,119}, {124,164}, {123,133}, {99,167}, {88,121}, {118,184}, {92,133}, {76,152}, {96,111}, {116,167}, {111,156}, {79,188}, {111,157}, {114,106}, {125,126}, {74,108}, {125,123}, {125,135}, {103,114}, {106,145}, {95,180}, {81,172}, {100,158}, {101,131}, {89,102}, {77,124}, {115,165}, {109,149}, {89,122}, {109,167}, {123,117}, {120,172}, {96,167}, {76,153}, {84,134}, {103,101}, {85,181}, {83,126}, {124,187}, {100,178}, {95,181}, {104,184}, {120,173}, {78,135}, {125,182}, {104,152}, {77,152}, {103,150}, {76,154}, {74,163}, {95,182}, {112,135}, {112,134}, {88,122}, {113,180}, {116,176}, {117,140}, {124,165}, {106,133}, {106,179}, {93,155}, {92,151}, {94,189}, {114,185}, {85,135}, {88,144}, {112,136}, {81,97}, {81,98}, {89,148}, {86,168}, {89,138}, {90,113}, {88,135}, {92,162}, {115,142}, {117,180}, {113,121}, {90,147}, {118,170}, {79,181}, {125,110}, {74,146}, {95,116}, {87,157}, {122,122}, {110,103}, {117,125}, {120,181}, {109,168}, {84,161}, {81,99}, {97,150}, {121,184}, {91,138}, {75,185}, {84,148}, {89,156}, {110,126}, {119,173}, {82,174}, {97,166}, {119,185}, {93,173}, {104,155}, {91,115}, {81,183}, {96,112}, {84,162}, {118,151}, {87,185}, {88,157}, {77,189}, {114,107}, {77,125}, {120,130}, {114,108}, {74,109}, {74,110}, {79,110}, {99,130}, {92,119}, {91,154}, {89,123}, {74,179}, {118,147}, {102,184}, {106,181}, {106,182}, {118,185}, {79,111}, {74,147}, {74,111}, {82,112}, {113,122}, {87,115}, {99,131}, {115,189}, {94,154}, {94,155}, {111,158}, {98,163}, {110,187}, {95,183}, {87,138}, {78,168}, {91,155}, {113,123}, {105,177}, {122,119}, {80,134}, {76,107}, {110,104}, {75,186}, {121,185}, {76,189}, {83,190}, {100,144}, {114,174}, {84,149}, {95,141}, {124,120}, {81,144}, {114,141}, {119,146}, {74,148}, {85,153}, {88,158}, {77,153}, {110,105}, {118,124}, {76,155}, {112,137}, {124,188}, {104,137}, {116,190}, {103,188}, {87,158}, {94,156}, {112,108}, {76,190}, {77,161}, {97,122}, {91,175}, {90,114}, {81,101}, {92,120}, {88,182}, {81,100}, {77,162}, {92,170}, {112,183}, {112,138}, {80,126}, {93,156}, {84,150}, {83,150}, {109,144}, {77,97}, {95,117}, {95,184}, {84,97}, {78,114}, {104,138}, {107,181}, {99,149}, {117,144}, {117,97}, {89,103}, {101,107}, {102,139}, {117,177}, {101,133}, {121,99}, {96,155}, {118,171}, {75,177}, {89,170}, {117,98}, {87,145}, {81,184}, {106,184}, {106,185}, {90,115}, {111,159}, {113,175}, {101,182}, {110,127}, {98,164}, {80,127}, {122,108}, {117,145}, {103,115}, {105,126}, {114,142}, {91,116}, {124,142}, {93,174}, {103,116}, {87,116}, {119,116}, {77,126}, {90,169}, {79,112}, {119,153}, {115,166}, {78,153}, {78,106}, {75,136}, {80,103}, {112,139}, {80,135}, {100,133}, {91,160}, {85,154}, {87,103}, {110,128}, {120,182}, {117,146}, {109,169}, {89,124}, {101,134}, {117,99}, {90,148}, {98,103}, {123,188}, {113,156}, {74,180}, {104,186}, {78,169}, {105,184}, {98,165}, {80,121}, {84,178}, {81,102}, {95,142}, {124,180}, {83,106}, {76,108}, {111,160}, {101,165}, {80,149}, {91,188}, {124,166}, {75,190}, {109,170}, {94,113}, {121,163}, {84,98}, {79,182}, {86,144}, {85,170}, {113,174}, {122,139}, {101,97}, {85,113}, {79,173}, {109,171}, {85,114}, {85,124}, {125,162}, {115,109}, {125,155}, {105,112}, {81,103}, {125,163}, {78,115}, {125,164}, {122,142}, {74,112}, {119,103}, {79,113}, {102,98}, {124,118}, {114,109}, {111,161}, {115,110}, {92,134}, {89,171}, {104,160}, {97,104}, {85,182}, {79,189}, {94,157}, {89,145}, {100,170}, {114,143}, {119,127}, {98,166}, {98,104}, {99,150}, {109,145}, {105,185}, {86,113}, {94,114}, {96,168}, {83,107}, {107,156}, {95,111}, {74,131}, {110,188}, {125,131}, {107,182}, {79,114}, {89,172}, {89,125}, {88,159}, {84,120}, {107,126}, {93,175}, {93,176}, {93,177}, {93,178}, {89,126}, {123,134}, {79,115}, {110,189}, {100,107}, {90,133}, {88,172}, {81,104}, {98,105}, {94,124}, {103,117}, {91,176}, {111,162}, {113,176}, {79,116}, {91,177}, {96,113}, {95,101}, {121,146}, {103,189}, {102,99}, {123,177}, {75,112}, {114,110}, {77,167}, {104,156}, {103,151}, {119,128}, {80,163}, {90,97}, {76,125}, {81,105}, {93,140}, {99,190}, {81,106}, {104,106}, {106,118}, {121,186}, {102,140}, {118,152}, {84,135}, {89,139}, {89,146}, {83,139}, {88,183}, {90,105}, {117,184}, {94,158}, {114,111}, {120,105}, {88,136}, {110,129}, {121,129}, {93,179}, {106,186}, {118,125}, {97,123}, {77,127}, {116,148}, {102,141}, {124,143}, {123,98}, {96,156}, {116,123}, {90,149}, {121,114}, {123,178}, {91,182}, {94,159}, {91,178}, {120,156}, {119,174}, {107,168}, {82,186}, {113,124}, {122,154}, {90,170}, {90,134}, {119,129}, {103,118}, {101,135}, {86,108}, {92,135}, {97,105}, {98,106}, {85,102}, {84,151}, {114,144}, {106,187}, {96,157}, {123,179}, {113,125}, {98,167}, {125,151}, {78,136}, {106,119}, {124,128}, {125,167}, {119,175}, {87,117}, {111,122}, {113,157}, {94,115}, {104,139}, {120,157}, {123,135}, {85,136}, {87,159}, {93,105}, {105,113}, {122,109}, {118,153}, {122,180}, {120,106}, {102,174}, {76,156}, {97,124}, {96,175}, {105,127}, {124,189}, {102,142}, {97,151}, {102,143}, {116,177}, {100,179}, {100,187}, {121,164}, {111,163}, {79,174}, {118,126}, {96,114}, {124,190}, {81,107}, {87,186}, {123,136}, {98,151}, {84,99}, {112,184}, {87,104}, {97,167}, {83,127}, {111,164}, {87,133}, {107,162}, {124,167}, {100,98}, {98,168}, {102,144}, {123,168}, {116,168}, {101,180}, {116,124}, {116,149}, {95,118}, {124,121}, {110,130}, {74,181}, {111,165}, {75,162}, {84,100}, {94,160}, {90,189}, {100,134}, {104,126}, {96,158}, {118,116}, {106,146}, {121,187}, {96,130}, {74,164}, {103,119}, {106,189}, {89,157}, {90,116}, {110,106}, {123,169}, {91,139}, {90,117}, {113,126}, {83,108}, {123,137}, {95,143}, {83,128}, {99,151}, {111,166}, {124,144}, {105,128}, {117,147}, {108,156}, {119,119}, {106,120}, {81,185}, {92,136}, {106,121}, {113,158}, {87,118}, {79,117}, {89,104}, {108,174}, {93,106}, {77,98}, {104,110}, {97,125}, {114,145}, {105,129}, {82,188}, {91,117}, {115,167}, {88,190}, {124,145}, {109,114}, {116,111}, {123,99}, {124,129}, {110,107}, {84,101}, {116,178}, {110,153}, {123,138}, {77,163}, {88,123}, {101,155}, {120,183}, {118,148}, {87,105}, {75,137}, {102,145}, {112,140}, {88,110}, {121,147}, {85,190}, {88,124}, {114,112}, {98,107}, {115,168}, {111,130}, {109,172}, {103,120}, {90,190}, {76,126}, {114,188}, {90,171}, {98,152}, {109,150}, {86,145}, {96,115}, {124,146}, {107,136}, {83,129}, {112,141}, {79,183}, {109,146}, {84,152}, {92,137}, {87,177}, {95,123}, {115,101}, {116,141}, {113,127}, {120,113}, {105,186}, {123,139}, {74,149}, {121,148}, {119,138}, {86,136}, {124,168}, {115,125}, {110,190}, {103,190}, {83,130}, {83,118}, {76,109}, {118,186}, {86,114}, {82,152}, {103,152}, {99,101}, {103,121}, {112,109}, {123,140}, {107,97}, {84,102}, {123,141}, {85,125}, {113,159}, {118,187}, {94,116}, {85,171}, {101,136}, {123,100}, {84,121}, {94,161}, {100,99}, {87,119}, {120,174}, {94,117}, {86,146}, {121,149}, {103,122}, {107,149}, {85,183}, {111,167}, {97,126}, {122,110}, {86,169}, {86,174}, {103,123}, {108,139}, {85,115}, {78,116}, {123,101}, {97,174}, {119,104}, {123,142}, {88,125}, {123,189}, {124,169}, {79,118}, {109,135}, {110,108}, {76,157}, {118,103}, {102,186}, {117,100}, {125,156}, {109,115}, {78,137}, {111,168}, {97,127}, {122,155}, {75,163}, {119,105}, {123,102}, {92,121}, {113,128}, {109,136}, {111,131}, {86,109}, {125,142}, {104,97}, {123,180}, {85,103}, {113,182}, {102,147}, {76,158}, {120,114}, {92,171}, {125,118}, {101,170}, {113,160}, {91,140}, {93,141}, {84,136}, {89,173}, {117,101}, {102,187}, {102,148}, {125,136}, {86,97}, {125,127}, {124,147}, {111,97}, {103,124}, {81,174}, {102,149}, {105,178}, {95,112}, {88,160}, {124,122}, {125,111}, {112,142}, {91,161}, {101,137}, {109,116}, {96,131}, {99,152}, {105,187}, {106,104}, {125,119}, {123,103}, {105,130}, {125,183}, {98,153}, {92,172}, {104,98}, {102,176}, {125,184}, {125,185}, {118,127}, {103,103}, {102,151}, {84,179}, {84,137}, {86,186}, {87,178}, {97,128}, {91,162}, {102,152}, {103,125}, {112,143}, {115,126}, {98,108}, {117,119}, {96,176}, {125,120}, {99,168}, {84,103}, {104,188}, {122,146}, {120,175}, {86,147}, {85,116}, {112,144}, {119,176}, {110,115}, {106,122}, {106,147}, {109,137}, {93,107}, {101,108}, {125,97}, {95,144}, {108,115}, {95,145}, {109,173}, {120,120}, {119,186}, {120,107}, {116,160}, {84,122}, {100,115}, {105,154}, {94,118}, {89,127}, {89,128}, {86,175}, {89,140}, {90,106}, {95,165}, {119,165}, {76,114}, {95,185}, {87,160}, {84,123}, {125,186}, {76,115}, {91,179}, {95,146}, {78,138}, {110,154}, {100,164}, {123,143}, {79,119}, {110,131}, {78,170}, {98,109}, {87,161}, {122,181}, {85,137}, {120,108}, {103,153}, {115,169}, {88,173}, {99,132}, {112,177}, {104,165}, {96,186}, {110,132}, {89,158}, {107,98}, {107,99}, {124,130}, {106,123}, {104,107}, {94,162}, {109,175}, {104,99}, {79,177}, {84,124}, {124,170}, {103,126}, {124,178}, {86,116}, {98,110}, {83,119}, {122,140}, {122,156}, {109,117}, {97,163}, {104,108}, {104,157}, {111,169}, {116,125}, {79,120}, {105,155}, {81,108}, {90,135}, {107,137}, {104,140}, {94,119}, {86,124}, {83,165}, {122,157}, {90,150}, {74,113}, {90,136}, {95,102}, {121,115}, {114,146}, {74,132}, {78,139}, {77,181}, {125,112}, {85,104}, {113,129}, {98,169}, {92,138}, {108,116}, {122,128}, {123,104}, {80,104}, {90,172}, {89,174}, {96,187}, {111,170}, {122,158}, {96,132}, {79,121}, {85,138}, {87,162}, {98,111}, {87,120}, {104,141}, {118,154}, {111,98}, {98,154}, {118,188}, {123,144}, {81,109}, {77,164}, {81,110}, {92,173}, {104,142}, {112,185}, {78,117}, {102,188}, {87,187}, {80,150}, {93,181}, {119,177}, {118,189}, {91,183}, {123,170}, {105,156}, {89,129}, {117,178}, {96,133}, {106,148}, {121,130}, {106,124}, {82,133}, {123,145}, {103,128}, {107,101}, {95,186}, {99,98}, {87,121}, {105,131}, {104,189}, {104,111}, {114,147}, {123,105}, {88,101}, {85,139}, {80,136}, {81,111}, {87,163}, {96,134}, {86,98}, {109,176}, {87,179}, {124,148}, {90,151}, {76,159}, {114,148}, {81,112}, {76,160}, {91,189}, {115,127}, {112,145}, {124,123}, {98,112}, {102,101}, {98,155}, {95,158}, {96,135}, {114,175}, {76,161}, {86,170}, {103,130}, {78,118}, {115,128}, {77,190}, {123,146}, {120,184}, {119,187}, {104,127}, {104,119}, {109,118}, {92,122}, {76,116}, {113,183}, {104,120}, {74,182}, {100,100}, {116,150}, {95,166}, {95,103}, {95,167}, {97,129}, {105,132}, {92,139}, {105,133}, {111,99}, {107,102}, {75,99}, {99,169}, {81,187}, {111,100}, {111,171}, {80,116}, {77,99}, {104,166}, {111,101}, {83,140}, {90,173}, {87,122}, {114,149}, {117,165}, {89,175}, {121,116}, {85,148}, {125,143}, {91,163}, {113,161}, {108,118}, {123,190}, {83,151}, {81,113}, {75,113}, {81,114}, {75,114}, {113,130}, {116,161}, {121,117}, {97,131}, {97,130}, {107,183}, {95,104}, {75,138}, {102,121}, {120,158}, {121,106}, {74,183}, {109,119}, {83,120}, {114,150}, {84,153}, {110,133}, {114,176}, {74,114}, {92,123}, {113,184}, {108,119}, {101,138}, {118,128}, {125,157}, {84,163}, {76,162}, {119,148}, {87,165}, {83,131}, {88,102}, {118,129}, {93,182}, {77,128}, {101,156}, {101,139}, {97,132}, {104,112}, {116,112}, {115,170}, {90,174}, {87,123}, {98,113}, {87,106}, {86,187}, {100,159}, {74,150}, {107,104}, {91,190}, {118,130}, {111,123}, {84,189}, {96,136}, {104,121}, {111,102}, {77,100}, {84,180}, {91,97}, {91,156}, {91,157}, {110,156}, {75,139}, {124,149}, {78,171}, {77,129}, {123,147}, {121,107}, {117,148}, {89,105}, {105,157}, {91,141}, {93,142}, {103,131}, {108,140}, {121,172}, {75,140}, {96,188}, {84,104}, {109,147}, {88,175}, {114,151}, {74,184}, {90,175}, {86,148}, {89,141}, {88,174}, {114,129}, {95,147}, {90,176}, {98,170}, {96,189}, {88,184}, {119,111}, {90,118}, {74,151}, {114,152}, {88,185}, {122,159}, {79,175}, {89,130}, {112,146}, {100,145}, {115,119}, {122,160}, {111,172}, {98,114}, {84,125}, {89,142}, {116,162}, {84,105}, {77,130}, {103,154}, {114,153}, {89,106}, {88,126}, {92,109}, {98,171}, {86,188}, {74,185}, {84,154}, {116,151}, {76,97}, {79,122}, {117,120}, {89,131}, {80,168}, {99,133}, {107,184}, {114,113}, {79,123}, {83,109}, {104,161}, {78,172}, {96,116}, {94,163}, {93,183}, {114,114}, {115,182}, {118,155}, {87,190}, {120,159}, {119,178}, {80,105}, {102,154}, {117,102}, {87,124}, {76,163}, {102,155}, {93,157}, {81,115}, {111,173}, {86,158}, {100,180}, {97,175}, {93,184}, {104,143}, {74,165}, {92,97}, {96,117}, {124,108}, {124,109}, {88,103}, {109,120}, {91,118}, {86,176}, {115,111}, {77,101}, {90,177}, {88,104}, {76,164}, {81,116}, {74,152}, {90,178}, {117,103}, {117,104}, {102,102}, {85,172}, {85,184}, {90,179}, {99,134}, {94,164}, {94,165}, {81,117}, {81,118}, {81,119}, {114,115}, {105,158}, {112,147}, {114,116}, {112,148}, {75,164}, {123,148}, {117,166}, {99,170}, {94,166}, {95,148}, {120,185}, {112,110}, {81,120}, {86,159}, {80,151}, {124,97}, {111,174}, {92,152}, {105,159}, {101,157}, {125,187}, {96,137}, {86,137}, {84,106}, {101,140}, {105,160}, {80,152}, {124,98}, {84,126}, {98,115}, {94,167}, {92,124}, {82,118}, {117,149}, {78,97}, {117,105}, {93,185}, {93,186}, {112,149}, {118,159}, {114,154}, {100,171}, {114,177}, {108,121}, {125,188}, {97,106}, {74,153}, {111,175}, {117,106}, {108,185}, {120,109}, {114,130}, {118,131}, {87,146}, {121,98}, {112,150}, {112,186}, {118,160}, {105,179}, {114,131}, {84,107}, {74,115}, {77,102}, {77,131}, {77,154}, {89,143}, {118,132}, {110,157}, {103,132}, {98,116}, {95,162}, {103,155}, {104,113}, {124,110}, {101,141}, {122,171}, {79,124}, {79,162}, {77,182}, {111,176}, {116,126}, {84,141}, {115,120}, {105,97}, {114,178}, {115,171}, {112,151}, {79,151}, {79,159}, {104,128}, {104,129}, {79,163}, {105,98}, {80,106}, {115,129}, {80,107}, {84,164}, {111,124}, {88,97}, {89,159}, {115,151}, {92,125}, {76,165}, {109,177}, {113,162}, {84,155}, {98,117}, {74,166}, {83,110}, {76,166}, {113,147}, {117,167}, {74,154}, {123,174}, {97,133}, {95,169}, {110,158}, {119,130}, {88,98}, {93,108}, {112,111}, {86,125}, {97,107}, {121,118}, {84,181}, {80,137}, {111,103}, {98,172}, {91,170}, {78,140}, {117,168}, {119,149}, {83,141}, {115,190}, {80,117}, {96,190}, {95,187}, {102,157}, {104,100}, {75,141}, {111,104}, {110,116}, {90,152}, {81,121}, {95,105}, {115,112}, {76,132}, {78,119}, {111,105}, {95,149}, {109,151}, {110,134}, {111,125}, {124,150}, {91,180}, {111,106}, {120,121}, {117,169}, {99,153}, {97,134}, {84,127}, {94,168}, {112,170}, {115,130}, {83,111}, {74,155}, {124,151}, {109,152}, {97,135}, {116,152}, {86,115}, {93,109}, {85,126}, {113,131}, {110,159}, {86,171}, {116,153}, {87,166}, {90,119}, {93,187}, {93,143}, {88,99}, {90,153}, {112,152}, {111,132}, {97,152}, {113,148}, {109,178}, {85,155}, {85,156}, {115,132}, {75,151}, {98,118}, {111,177}, {123,149}, {83,152}, {93,144}, {112,153}, {75,115}, {85,157}, {77,103}, {80,108}, {81,122}, {113,132}, {101,115}, {123,181}, {105,161}, {125,160}, {124,124}, {90,98}, {90,99}, {82,97}, {82,175}, {98,173}, {94,169}, {78,156}, {114,117}, {80,164}, {93,145}, {97,136}, {91,119}, {95,163}, {109,121}, {113,133}, {115,143}, {87,107}, {97,108}, {99,171}, {110,135}, {97,137}, {74,186}, {112,187}, {122,161}, {112,154}, {76,167}, {90,180}, {76,127}, {78,173}, {85,105}, {122,162}, {80,165}, {107,150}, {108,159}, {95,188}, {119,150}, {94,170}, {75,116}, {111,126}, {76,117}, {79,125}, {111,178}, {98,119}, {76,168}, {112,188}, {86,160}, {113,134}, {98,120}, {107,107}, {75,117}, {88,145}, {116,142}, {115,183}, {87,134}, {81,123}, {119,106}, {109,138}, {87,147}, {88,186}, {118,133}, {81,140}, {93,188}, {95,189}, {121,165}, {96,138}, {114,189}, {83,112}, {116,179}, {90,137}, {102,158}, {120,122}, {104,144}, {88,187}, {106,149}, {86,99}, {118,134}, {114,155}, {100,188}, {104,114}, {90,154}, {114,156}, {123,150}, {105,114}, {110,109}, {122,163}, {92,174}, {117,170}, {102,160}, {112,189}, {87,108}, {117,133}, {110,160}, {91,165}, {93,158}, {89,176}, {105,99}, {113,185}, {114,132}, {96,139}, {105,100}, {98,121}, {99,113}, {124,171}, {77,104}, {76,118}, {112,155}, {102,122}, {77,105}, {115,131}, {97,153}, {111,107}, {103,133}, {96,169}, {115,133}, {84,128}, {85,127}, {93,110}, {121,188}, {76,128}, {101,98}, {78,120}, {88,146}, {121,150}, {113,106}, {78,145}, {118,135}, {91,171}, {95,190}, {88,161}, {119,179}, {87,167}, {84,190}, {81,124}, {101,143}, {75,118}, {90,120}, {77,132}, {86,126}, {98,122}, {79,152}, {96,140}, {107,185}, {125,189}, {87,168}, {75,152}, {105,162}, {104,122}, {99,135}, {108,141}, {108,142}, {86,127}, {99,103}, {95,150}, {125,168}, {110,161}, {118,104}, {93,189}, {120,123}, {104,145}, {121,151}, {78,174}, {108,143}, {105,101}, {86,149}, {77,133}, {109,122}, {81,125}, {79,126}, {108,123}, {82,113}, {76,169}, {89,132}, {105,188}, {81,126}, {108,124}, {101,109}, {119,112}, {76,170}, {83,132}, {86,128}, {86,189}, {97,97}, {94,125}, {118,105}, {90,100}, {86,100}, {117,134}, {97,98}, {105,134}, {114,133}, {116,169}, {86,172}, {107,147}, {108,125}, {98,156}, {94,171}, {112,156}, {107,127}, {87,142}, {81,127}, {117,107}, {121,189}, {74,156}, {77,134}, {114,118}, {93,190}, {76,119}, {91,120}, {80,169}, {78,157}, {107,128}, {125,98}, {120,139}, {106,150}, {113,112}, {91,142}, {119,131}, {91,143}, {75,100}, {120,160}, {123,151}, {107,138}, {96,97}, {78,141}, {84,156}, {125,152}, {82,182}, {114,119}, {122,182}, {118,106}, {122,183}, {88,166}, {116,113}, {104,146}, {74,133}, {76,171}, {98,174}, {98,123}, {119,109}, {120,161}, {115,172}, {94,97}, {100,189}, {99,172}, {93,111}, {93,112}, {75,119}, {104,147}, {97,99}, {82,160}, {112,190}, {105,102}, {75,178}, {109,179}, {92,153}, {96,141}, {119,154}, {91,121}, {76,110}, {90,155}, {77,135}, {93,113}, {88,111}, {99,99}, {78,175}, {114,179}, {120,115}, {96,142}, {117,189}, {107,172}, {83,133}, {124,172}, {82,155}, {84,171}, {94,98}, {101,166}, {112,112}, {85,132}, {109,180}, {99,173}, {104,130}, {109,181}, {87,188}, {109,123}, {118,107}, {114,120}, {118,136}, {83,166}, {114,157}, {79,127}, {107,108}, {79,128}, {102,104}, {125,169}, {79,129}, {96,159}, {94,172}, {96,98}, {116,127}, {98,175}, {89,177}, {113,135}, {75,120}, {121,190}, {91,122}, {90,181}, {118,172}, {90,156}, {122,164}, {96,143}, {93,114}, {102,105}, {111,179}, {115,173}, {107,186}, {121,166}, {74,157}, {85,158}, {74,158}, {95,164}, {102,189}, {117,108}, {100,181}, {105,163}, {109,139}, {79,164}, {88,147}, {93,115}, {84,172}, {114,121}, {95,119}, {75,142}, {123,152}, {80,153}, {93,146}, {119,180}, {103,156}, {100,101}, {124,99}, {91,123}, {114,122}, {105,189}, {80,138}, {117,150}, {89,133}, {100,116}, {109,103}, {106,125}, {102,190}, {119,132}, {117,109}, {89,160}, {74,116}, {120,162}, {79,130}, {108,126}, {101,116}, {77,136}, {110,136}, {103,136}, {77,137}, {121,119}, {113,168}, {89,178}, {91,181}, {74,117}, {89,134}, {88,137}, {89,107}, {109,124}, {88,148}, {92,154}, {98,124}, {124,173}, {108,160}, {82,190}, {105,135}, {102,106}, {98,176}, {122,123}, {117,110}, {123,106}, {108,187}, {108,127}, {124,152}, {84,165}, {121,131}, {110,162}, {87,169}, {109,182}, {94,173}, {76,172}, {99,174}, {104,148}, {122,184}, {93,116}, {100,117}, {88,112}, {88,149}, {116,170}, {78,121}, {86,161}, {79,146}, {80,118}, {78,98}, {115,174}, {115,184}, {92,140}, {80,139}, {124,100}, {77,138}, {87,148}, {94,99}, {100,160}, {110,137}, {98,157}, {117,190}, {84,108}, {85,145}, {88,176}, {120,131}, {106,151}, {117,151}, {88,127}, {125,128}, {107,109}, {85,106}, {103,104}, {110,138}, {74,167}, {120,163}, {84,157}, {106,152}, {123,153}, {109,183}, {101,117}, {80,109}, {113,177}, {98,125}, {99,136}, {89,149}, {95,106}, {91,124}, {120,164}, {113,186}, {101,118}, {115,175}, {123,154}, {97,160}, {89,108}, {117,171}, {96,118}, {105,136}, {75,143}, {99,137}, {94,174}, {98,126}, {92,175}, {86,101}, {98,177}, {86,190}, {89,97}, {88,128}, {92,155}, {109,125}, {95,120}, {106,101}, {87,109}, {115,185}, {109,184}, {117,135}, {97,138}, {107,163}, {114,158}, {120,140}, {106,153}, {83,134}, {91,166}, {117,111}, {78,176}, {105,190}, {123,118}, {98,178}, {79,178}, {119,121}, {89,179}, {97,139}, {90,157}, {90,121}, {107,187}, {75,121}, {109,185}, {96,160}, {116,128}, {125,124}, {95,113}, {99,175}, {96,99}, {125,121}, {112,113}, {77,139}, {109,126}, {85,128}, {99,176}, {109,186}, {105,164}, {85,173}, {103,157}, {84,182}, {101,119}, {91,167}, {98,127}, {110,139}, {87,180}, {112,157}, {78,107}, {103,158}, {86,150}, {97,140}, {104,115}, {101,174}, {92,98}, {96,144}, {85,117}, {85,97}, {123,155}, {121,139}, {75,179}, {116,101}, {122,136}, {86,151}, {105,165}, {123,156}, {125,144}, {123,182}, {90,101}, {91,125}, {108,162}, {77,183}, {112,158}, {118,137}, {94,175}, {83,113}, {124,174}, {104,131}, {113,136}, {78,177}, {121,173}, {114,180}, {100,118}, {117,121}, {92,176}, {99,177}, {104,101}, {114,123}, {94,100}, {90,140}, {74,169}, {99,154}, {124,153}, {106,154}, {121,132}, {99,100}, {123,157}, {111,138}, {104,132}, {85,140}, {107,151}, {89,109}, {123,107}, {83,153}, {85,98}, {118,158}, {90,182}, {96,145}, {105,104}, {117,185}, {122,111}, {107,188}, {96,170}, {99,114}, {85,133}, {113,163}, {85,174}, {77,140}, {109,153}, {88,129}, {122,172}, {113,171}, {122,124}, {102,162}, {122,165}, {98,186}, {74,118}, {100,119}, {106,155}, {117,186}, {123,108}, {79,131}, {107,189}, {120,186}, {95,121}, {97,177}, {82,100}, {117,187}, {80,154}, {80,155}, {106,126}, {89,113}, {74,119}, {83,167}, {120,165}, {83,114}, {98,128}, {114,159}, {77,165}, {121,108}, {77,141}, {110,110}, {86,110}, {87,170}, {103,160}, {107,110}, {79,153}, {92,141}, {109,187}, {94,176}, {87,171}, {94,101}, {95,151}, {91,144}, {91,145}, {85,99}, {112,114}, {92,156}, {74,168}, {120,166}, {92,142}, {106,156}, {91,146}, {105,115}, {119,155}, {99,104}, {87,110}, {96,161}, {75,122}, {101,145}, {80,156}, {85,129}, {88,138}, {99,105}, {96,100}, {105,105}, {83,135}, {92,157}, {120,110}, {76,120}, {80,110}, {88,178}, {99,138}, {76,111}, {84,109}, {118,145}, {80,140}, {74,134}, {85,130}, {78,122}, {74,135}, {122,112}, {95,152}, {117,122}, {101,171}, {111,180}, {93,117}, {77,106}, {99,178}, {123,183}, {119,144}, {125,122}, {125,161}, {118,190}, {81,128}, {104,133}, {100,120}, {97,168}, {76,129}, {82,173}, {91,126}, {96,162}, {122,137}, {97,141}, {74,120}, {114,160}, {113,137}, {94,177}, {112,159}, {120,132}, {110,140}, {94,178}, {103,137}, {98,179}, {103,161}, {99,139}, {99,140}, {79,184}, {111,108}, {125,190}, {124,101}, {122,113}, {95,153}, {96,146}, {116,154}, {113,138}, {78,99}, {114,124}, {108,163}, {96,101}, {119,107}, {107,111}, {101,158}, {97,100}, {77,107}, {89,180}, {104,102}, {77,142}, {97,169}, {124,175}, {96,163}, {98,129}, {78,100}, {94,102}, {107,190}, {107,157}, {112,160}, {116,155}, {98,180}, {83,136}, {116,171}, {110,117}, {117,152}, {85,159}, {86,165}, {107,112}, {116,163}, {99,141}, {116,180}, {122,114}, {111,181}, {74,159}, {107,113}, {109,127}, {125,137}, {100,102}, {121,100}, {112,115}, {101,172}, {81,167}, {89,135}, {100,151}, {106,157}, {84,183}, {90,122}, {90,141}, {121,140}, {97,154}, {91,127}, {76,133}, {108,144}, {75,123}, {94,179}, {105,106}, {89,136}, {110,163}, {87,125}, {79,132}, {80,141}, {124,102}, {113,187}, {125,146}, {81,129}, {99,155}, {83,137}, {92,143}, {76,173}, {94,103}, {102,123}, {108,97}, {76,121}, {123,158}, {103,162}, {84,129}, {92,104}, {98,130}, {115,152}, {101,147}, {115,153}, {115,134}, {77,155}, {77,108}, {124,131}, {84,167}, {81,130}, {121,101}, {104,149}, {99,142}, {84,138}, {95,154}, {123,159}, {103,163}, {120,187}, {99,143}, {117,112}, {88,167}, {89,137}, {120,111}, {111,182}, {93,118}, {110,111}, {77,184}, {94,120}, {124,103}, {119,188}, {119,113}, {78,123}, {116,97}, {110,141}, {97,110}, {108,131}, {79,190}, {120,127}, {88,162}, {83,168}, {94,104}, {116,164}, {108,130}, {89,181}, {121,133}, {93,147}, {86,177}, {108,188}, {124,176}, {109,128}, {74,121}, {110,164}, {114,161}, {94,121}, {86,178}, {94,180}, {95,155}, {91,147}, {122,167}, {88,163}, {116,129}, {93,119}, {114,181}, {84,110}, {86,179}, {93,120}, {79,133}, {95,159}, {114,126}, {118,97}, {107,139}, {113,188}, {115,135}, {96,171}, {109,188}, {97,155}, {110,165}, {94,181}, {122,147}, {113,139}, {80,111}, {93,121}, {81,131}, {117,113}, {106,134}, {112,161}, {118,108}, {117,153}, {112,171}, {93,122}, {114,127}, {119,133}, {91,98}, {114,182}, {74,122}, {119,181}, {75,165}, {110,166}, {96,147}, {78,101}, {86,152}, {84,111}, {105,137}, {83,142}, {116,130}, {75,166}, {113,97}, {107,114}, {113,98}, {107,115}, {112,116}, {75,180}, {84,112}, {115,114}, {123,119}, {117,172}, {110,167}, {116,114}, {117,173}, {79,179}, {112,162}, {110,142}, {113,140}, {101,120}, {87,181}, {99,179}, {79,165}, {79,134}, {115,115}, {100,152}, {79,185}, {79,154}, {122,141}, {102,163}, {114,162}, {117,174}, {74,123}, {99,156}, {78,178}, {86,153}, {110,112}, {116,165}, {88,130}, {92,144}, {76,174}, {85,160}, {118,138}, {125,138}, {88,150}, {116,143}, {86,102}, {92,126}, {91,148}, {87,135}, {114,190}, {113,141}, {98,131}, {92,158}, {92,159}, {111,109}, {102,107}, {121,157}, {106,127}, {111,110}, {116,144}, {78,179}, {102,108}, {78,158}, {85,185}, {99,180}, {77,144}, {85,120}, {119,189}, {92,105}, {94,182}, {92,106}, {114,163}, {105,116}, {82,156}, {105,166}, {99,182}, {103,138}, {80,142}, {90,183}, {74,124}, {110,168}, {90,158}, {114,183}, {98,187}, {76,102}, {90,123}, {110,169}, {117,154}, {119,156}, {97,170}, {78,129}, {84,113}, {125,113}, {102,125}, {123,109}, {120,167}, {97,142}, {119,162}, {117,175}, {79,135}, {84,114}, {76,175}, {84,168}, {110,143}, {119,151}, {96,102}, {86,129}, {97,156}, {112,163}, {113,164}, {92,177}, {86,103}, {116,181}, {113,142}, {114,164}, {80,112}, {108,175}, {121,122}, {107,117}, {84,173}, {98,132}, {105,167}, {107,116}, {106,97}, {120,124}, {78,102}, {121,134}, {124,154}, {84,115}, {83,121}, {106,158}, {105,107}, {97,161}, {83,143}, {116,182}, {106,128}, {97,143}, {76,122}, {110,170}, {112,164}, {115,116}, {84,174}, {114,128}, {113,165}, {116,131}, {96,148}, {107,118}, {87,97}, {75,168}, {121,109}, {105,109}, {88,164}, {122,115}, {98,133}, {124,125}, {108,132}, {88,113}, {92,107}, {85,100}, {107,169}, {104,123}, {88,151}, {123,110}, {81,161}, {91,128}, {117,126}, {94,183}, {74,187}, {119,134}, {79,136}, {97,144}, {110,144}, {105,180}, {78,180}, {85,141}, {79,155}, {93,123}, {78,108}, {105,168}, {84,116}, {100,135}, {117,155}, {122,129}, {94,105}, {84,184}, {111,183}, {83,115}, {107,119}, {111,184}, {117,156}, {109,140}, {91,149}, {113,143}, {113,144}, {117,114}, {89,110}, {85,108}, {98,134}, {125,99}, {123,165}, {95,107}, {98,181}, {118,109}, {117,115}, {112,117}, {97,101}, {117,157}, {108,98}, {109,189}, {117,116}, {123,120}, {91,99}, {86,138}, {75,153}, {101,148}, {115,186}, {107,120}, {96,119}, {87,172}, {113,172}, {101,111}, {85,161}, {87,173}, {81,145}, {97,178}, {111,185}, {93,124}, {118,156}, {112,165}, {116,132}, {105,169}, {115,187}, {84,175}, {76,98}, {119,190}, {95,124}, {107,141}, {80,119}, {86,130}, {104,109}, {111,111}, {75,101}, {75,169}, {122,168}, {76,134}, {102,167}, {106,135}, {91,100}, {79,137}, {98,188}, {111,186}, {107,158}, {117,136}, {84,158}, {96,149}, {111,112}, {98,135}, {89,111}, {121,167}, {103,165}, {79,138}, {97,145}, {98,136}, {111,187}, {122,185}, {92,178}, {96,103}, {120,168}, {75,170}, {75,124}, {86,162}, {117,158}, {117,159}, {110,118}, {98,182}, {83,138}, {111,188}, {81,132}, {111,113}, {81,133}, {80,158}, {89,161}, {96,120}, {77,145}, {115,121}, {103,140}, {86,104}, {78,103}, {84,117}, {100,136}, {83,116}, {107,121}, {75,181}, {118,157}, {113,99}, {76,135}, {105,138}, {97,176}, {117,160}, {123,111}, {75,145}, {123,160}, {114,165}, {108,176}, {112,172}, {110,171}, {105,139}, {76,176}, {87,111}, {115,97}, {124,181}, {113,100}, {96,150}, {111,114}, {116,145}, {119,97}, {113,145}, {74,188}, {74,189}, {78,142}, {115,136}, {115,122}, {109,190}, {90,102}, {96,172}, {120,141}, {75,146}, {107,142}, {121,152}, {121,153}, {74,160}, {90,138}, {75,102}, {74,136}, {121,174}, {91,172}, {80,113}, {85,175}, {102,179}, {103,98}, {100,153}, {100,161}, {124,132}, {121,175}, {79,180}, {119,166}, {78,124}, {116,133}, {92,99}, {93,125}, {116,134}, {120,97}, {104,150}, {91,129}, {112,166}, {100,121}, {118,173}, {121,110}, {93,126}, {87,112}, {88,168}, {75,125}, {121,154}, {120,142}, {121,176}, {96,173}, {99,115}, {116,115}, {106,130}, {114,166}, {112,118}, {91,150}, {107,164}, {114,167}, {87,149}, {84,118}, {121,168}, {87,129}, {101,149}, {105,170}, {87,140}, {83,169}, {98,137}, {124,155}, {77,109}, {76,112}, {106,98}, {100,182}, {80,128}, {112,119}, {110,97}, {87,182}, {98,138}, {98,139}, {122,143}, {107,159}, {86,139}, {116,116}, {109,141}, {100,146}, {106,105}, {100,122}, {115,98}, {77,146}, {118,139}, {113,166}, {109,129}, {104,124}, {110,145}, {112,167}, {98,140}, {100,106}, {117,161}, {109,154}, {87,174}, {81,177}, {105,171}, {105,172}, {96,164}, {90,103}, {93,148}, {106,99}, {86,131}, {86,180}, {90,159}, {111,115}, {98,141}, {111,189}, {114,168}, {111,133}, {103,167}, {87,189}, {103,142}, {95,156}, {121,135}, {89,182}, {95,108}, {86,154}, {92,100}, {112,120}, {85,186}, {100,183}, {86,132}, {116,172}, {111,190}, {112,97}, {94,106}, {90,124}, {88,188}, {122,148}, {108,165}, {124,104}, {108,166}, {88,139}, {123,121}, {100,147}, {77,185}, {79,147}, {74,170}, {79,148}, {120,125}, {116,135}, {106,159}, {121,155}, {84,119}, {107,165}, {97,146}, {106,100}, {122,130}, {123,161}, {122,173}, {112,98}, {76,177}, {122,99}, {98,183}, {98,142}, {105,181}, {97,171}, {103,168}, {104,151}, {90,184}, {84,139}, {119,182}, {86,133}, {84,169}, {122,186}, {76,178}, {119,157}, {94,122}, {78,104}, {112,121}, {100,190}, {100,137}, {100,148}, {106,131}, {111,116}, {87,126}, {123,162}, {77,147}, {111,117}, {122,169}, {121,102}, {95,125}, {119,135}, {120,189}, {120,188}, {94,107}, {91,168}, {99,157}, {97,162}, {81,134}, {118,144}, {107,166}, {90,185}, {108,135}, {94,184}, {120,169}, {99,158}, {78,181}, {122,131}, {101,151}, {108,136}, {115,137}, {100,123}, {102,110}, {111,118}, {92,127}, {78,125}, {88,131}, {80,143}, {79,186}, {115,138}, {96,151}, {81,135}, {105,110}, {104,125}, {122,132}, {98,143}, {122,133}, {121,120}, {92,160}, {123,112}, {88,105}, {101,159}, {121,103}, {118,174}, {118,140}, {98,184}, {108,177}, {90,160}, {113,146}, {82,140}, {79,139}, {74,125}, {93,127}, {118,175}, {94,185}, {122,116}, {85,109}, {113,167}, {94,126}, {92,128}, {81,136}, {81,137}, {120,126}, {75,182}, {84,185}, {117,162}, {97,147}, {88,169}, {120,190}, {79,140}, {125,100}, {78,182}, {122,144}, {76,179}, {102,126}, {118,110}, {85,176}, {81,138}, {124,126}, {85,177}, {77,169}, {122,117}, {98,144}, {116,183}, {77,148}, {103,99}, {91,101}, {98,145}, {87,98}, {119,163}, {106,102}, {80,97}, {78,154}, {123,171}, {91,102}, {91,158}, {88,165}, {106,160}, {88,106}, {101,160}, {86,155}, {111,134}, {120,170}, {100,149}, {78,183}, {96,152}, {87,175}, {116,173}, {77,166}, {76,180}, {117,163}, {100,138}, {92,161}, {121,136}, {124,127}, {104,103}, {88,132}, {75,126}, {92,110}, {87,183}, {112,168}, {93,128}, {79,141}, {92,179}, {89,112}, {102,169}, {100,124}, {106,132}, {100,172}, {100,165}, {123,184}, {76,123}, {100,125}, {77,156}, {89,183}, {93,159}, {109,142}, {89,144}, {101,99}, {121,141}, {77,110}, {79,142}, {118,111}, {125,147}, {107,173}, {86,156}, {101,100}, {85,118}, {86,157}, {121,169}, {103,100}, {86,163}, {81,139}, {86,164}, {85,178}, {94,186}, {87,184}, {88,170}, {79,149}, {88,189}, {88,107}, {125,139}, {124,156}, {96,104}, {85,179}, {125,153}, {76,99}, {89,185}, {83,170}, {117,181}, {111,135}, {83,154}, {90,125}, {104,104}, {92,111}, {112,99}, {77,149}, {96,105}, {94,108}, {112,122}, {110,113}, {110,114}, {118,141}, {110,146}, {86,134}, {96,165}, {115,123}, {101,161}, {100,139}, {87,99}, {91,130}, {74,190}, {79,143}, {48,97}, {48,98}, {1,1}, {1,2}, {48,99}, {1,3}, {1,4}, {48,100}, {48,101}, {48,102}, {48,103}, {1,5}, {1,6}, {1,7}, {1,8}, {1,9}, {48,104}, {48,105}, {48,106}, {48,107}, {48,108}, {48,109}, {48,110}, {48,111}, {1,10}, {48,112}, {48,113}, {48,114}, {48,115}, {48,116}, {1,11}, {1,12}, {48,117}, {1,13}, {1,14}, {1,15}, {48,118}, {1,16}, {1,17}, {1,18}, {1,19}, {1,20}, {1,21}, {1,22}, {48,119}, {48,120}, {1,23}, {48,121}, {48,122}, {48,123}, {1,24}, {1,25}, {1,26}, {1,33}, {1,34}, {1,35}, {48,124}, {48,125}, {1,36}, {1,37}, {48,126}, {1,38}, {1,39}, {1,40}, {48,127}, {1,41}, {1,42}, {1,43}, {1,44}, {1,45}, {1,46}, {1,47}, {1,48}, {1,49}, {1,50}, {48,128}, {1,51}, {48,129}, {1,52}, {1,53}, {1,54}, {1,55}, {1,56}, {1,57}, {48,130}, {1,58}, {1,65}, {1,66}, {48,131}, {1,67}, {1,68}, {1,69}, {48,132}, {1,70}, {1,71}, {1,72}, {1,73}, {1,74}, {1,75}, {1,76}, {1,77}, {1,78}, {1,79}, {1,80}, {1,81}, {1,82}, {1,83}, {1,84}, {1,85}, {1,86}, {1,87}, {1,88}, {48,133}, {48,134}, {1,89}, {1,90}, {48,135}, {1,91}, {1,92}, {48,136}, {48,137}, {1,93}, {48,138}, {1,94}, {1,95}, {1,96}, {1,97}, {1,98}, {48,139}, {48,140}, {1,99}, {48,141}, {48,142}, {48,143}, {48,144}, {1,100}, {1,101}, {48,145}, {48,146}, {48,147}, {48,148}, {1,102}, {1,103}, {1,104}, {48,149}, {1,105}, {1,106}, {1,107}, {48,150}, {1,108}, {1,109}, {1,110}, {1,111}, {1,112}, {1,113}, {1,114}, {48,151}, {48,152}, {1,115}, {48,153}, {48,154}, {48,155}, {1,116}, {1,117}, {1,118}, {1,119}, {1,120}, {1,121}, {48,156}, {48,157}, {48,158}, {1,122}, {48,159}, {1,123}, {1,124}, {48,160}, {48,161}, {1,125}, {1,126}, {1,127}, {1,128}, {1,129}, {1,130}, {1,131}, {48,162}, {48,163}, {1,132}, {48,164}, {48,165}, {48,166}, {1,133}, {1,134}, {1,135}, {48,167}, {1,136}, {1,137}, {48,168}, {1,138}, {1,139}, {1,140}, {48,169}, {1,141}, {1,142}, {1,143}, {48,170}, {1,144}, {1,145}, {1,146}, {1,147}, {1,148}, {1,149}, {1,150}, {1,151}, {48,171}, {1,152}, {48,172}, {1,153}, {1,154}, {1,155}, {1,156}, {1,157}, {1,158}, {1,159}, {1,160}, {48,173}, {48,174}, {1,161}, {1,162}, {48,175}, {1,163}, {1,164}, {48,176}, {48,177}, {1,165}, {48,178}, {1,166}, {48,179}, {1,167}, {1,168}, {48,180}, {48,181}, {48,182}, {1,169}, {48,183}, {1,170}, {48,184}, {48,185}, {1,171}, {1,172}, {1,173}, {1,174}, {1,175}, {48,186}, {48,187}, {1,176}, {1,177}, {48,188}, {1,178}, {1,179}, {1,180}, {48,189}, {1,181}, {48,190}, {1,182}, {1,183}, {1,184}, {1,185}, {1,186}, {49,97}, {49,98}, {1,187}, {49,99}, {1,188}, {49,100}, {1,189}, {1,190}, {2,1}, {2,2}, {2,3}, {2,4}, {49,101}, {2,5}, {2,6}, {2,7}, {49,102}, {2,8}, {2,9}, {2,10}, {49,103}, {2,11}, {2,12}, {2,13}, {2,14}, {2,15}, {2,16}, {2,17}, {2,18}, {49,104}, {2,19}, {2,20}, {49,105}, {49,106}, {2,21}, {2,22}, {2,23}, {2,24}, {2,25}, {2,26}, {49,107}, {49,108}, {2,33}, {2,34}, {49,109}, {2,35}, {2,36}, {2,37}, {49,110}, {2,38}, {2,39}, {2,40}, {2,41}, {2,42}, {2,43}, {2,44}, {49,111}, {49,112}, {2,45}, {49,113}, {2,46}, {49,114}, {2,47}, {2,48}, {2,49}, {2,50}, {2,51}, {2,52}, {49,115}, {2,53}, {2,54}, {2,55}, {49,116}, {2,56}, {2,57}, {2,58}, {49,117}, {2,65}, {2,66}, {2,67}, {2,68}, {2,69}, {2,70}, {2,71}, {2,72}, {49,118}, {2,73}, {49,119}, {2,74}, {2,75}, {2,76}, {2,77}, {2,78}, {2,79}, {2,80}, {2,81}, {49,120}, {49,121}, {2,82}, {2,83}, {49,122}, {2,84}, {2,85}, {49,123}, {49,124}, {49,125}, {49,126}, {2,86}, {2,87}, {2,88}, {2,89}, {49,127}, {49,128}, {49,129}, {2,90}, {49,130}, {2,91}, {49,131}, {49,132}, {2,92}, {2,93}, {2,94}, {2,95}, {2,96}, {49,133}, {49,134}, {2,97}, {2,98}, {49,135}, {2,99}, {2,100}, {2,101}, {49,136}, {2,102}, {2,103}, {2,104}, {2,105}, {2,106}, {2,107}, {2,108}, {2,109}, {2,110}, {2,111}, {2,112}, {49,137}, {49,138}, {2,113}, {2,114}, {2,115}, {2,116}, {2,117}, {2,118}, {49,139}, {2,119}, {2,120}, {2,121}, {2,122}, {2,123}, {2,124}, {2,125}, {2,126}, {2,127}, {2,128}, {2,129}, {2,130}, {2,131}, {2,132}, {2,133}, {2,134}, {2,135}, {2,136}, {49,140}, {2,137}, {2,138}, {2,139}, {2,140}, {2,141}, {2,142}, {2,143}, {2,144}, {49,141}, {49,142}, {2,145}, {2,146}, {49,143}, {2,147}, {2,148}, {2,149}, {49,144}, {2,150}, {2,151}, {2,152}, {2,153}, {2,154}, {2,155}, {2,156}, {49,145}, {49,146}, {2,157}, {49,147}, {2,158}, {2,159}, {2,160}, {2,161}, {2,162}, {2,163}, {2,164}, {2,165}, {49,148}, {2,166}, {2,167}, {2,168}, {49,149}, {2,169}, {2,170}, {2,171}, {49,150}, {2,172}, {2,173}, {2,174}, {2,175}, {2,176}, {2,177}, {2,178}, {2,179}, {2,180}, {2,181}, {2,182}, {2,183}, {2,184}, {2,185}, {2,186}, {2,187}, {2,188}, {2,189}, {2,190}, {49,151}, {49,152}, {3,1}, {3,2}, {49,153}, {3,3}, {3,4}, {49,154}, {49,155}, {49,156}, {3,5}, {3,6}, {3,7}, {3,8}, {3,9}, {3,10}, {49,157}, {49,158}, {3,11}, {49,159}, {3,12}, {49,160}, {3,13}, {3,14}, {3,15}, {3,16}, {3,17}, {3,18}, {49,161}, {3,19}, {3,20}, {3,21}, {3,22}, {3,23}, {3,24}, {3,25}, {3,26}, {3,33}, {3,34}, {3,35}, {3,36}, {3,37}, {3,38}, {3,39}, {3,40}, {3,41}, {3,42}, {3,43}, {3,44}, {3,45}, {3,46}, {3,47}, {3,48}, {3,49}, {3,50}, {3,51}, {49,162}, {49,163}, {3,52}, {3,53}, {49,164}, {3,54}, {3,55}, {49,165}, {49,166}, {3,56}, {49,167}, {3,57}, {3,58}, {3,65}, {3,66}, {3,67}, {49,168}, {49,169}, {3,68}, {49,170}, {3,69}, {49,171}, {49,172}, {3,70}, {3,71}, {3,72}, {49,173}, {3,73}, {49,174}, {49,175}, {49,176}, {3,74}, {49,177}, {3,75}, {3,76}, {3,77}, {49,178}, {3,78}, {49,179}, {3,79}, {3,80}, {3,81}, {3,82}, {3,83}, {49,180}, {49,181}, {3,84}, {49,182}, {49,183}, {49,184}, {3,85}, {3,86}, {3,87}, {49,185}, {3,88}, {3,89}, {49,186}, {49,187}, {3,90}, {3,91}, {49,188}, {3,92}, {3,93}, {3,94}, {49,189}, {3,95}, {3,96}, {3,97}, {3,98}, {3,99}, {3,100}, {3,101}, {49,190}, {50,97}, {3,102}, {50,98}, {50,99}, {50,100}, {3,103}, {3,104}, {3,105}, {3,106}, {3,107}, {3,108}, {50,101}, {50,102}, {3,109}, {3,110}, {3,111}, {3,112}, {3,113}, {3,114}, {50,103}, {3,115}, {3,116}, {3,117}, {3,118}, {3,119}, {3,120}, {3,121}, {3,122}, {3,123}, {3,124}, {3,125}, {3,126}, {3,127}, {3,128}, {3,129}, {3,130}, {3,131}, {3,132}, {3,133}, {3,134}, {3,135}, {3,136}, {3,137}, {3,138}, {3,139}, {3,140}, {3,141}, {3,142}, {3,143}, {3,144}, {3,145}, {3,146}, {3,147}, {3,148}, {3,149}, {3,150}, {3,151}, {3,152}, {3,153}, {3,154}, {3,155}, {3,156}, {3,157}, {3,158}, {3,159}, {3,160}, {3,161}, {50,104}, {50,105}, {50,106}, {3,162}, {50,107}, {3,163}, {3,164}, {3,165}, {50,108}, {3,166}, {3,167}, {3,168}, {3,169}, {3,170}, {3,171}, {3,172}, {50,109}, {50,110}, {3,173}, {50,111}, {50,112}, {50,113}, {3,174}, {3,175}, {3,176}, {3,177}, {3,178}, {3,179}, {50,114}, {50,115}, {3,180}, {3,181}, {50,116}, {3,182}, {3,183}, {3,184}, {3,185}, {3,186}, {3,187}, {3,188}, {3,189}, {3,190}, {4,1}, {4,2}, {50,117}, {4,3}, {4,4}, {50,118}, {4,5}, {50,119}, {4,6}, {4,7}, {4,8}, {4,9}, {4,10}, {4,11}, {50,120}, {4,12}, {4,13}, {4,14}, {50,121}, {4,15}, {4,16}, {4,17}, {50,122}, {4,18}, {4,19}, {4,20}, {4,21}, {4,22}, {4,23}, {4,24}, {4,25}, {4,26}, {4,33}, {50,123}, {50,124}, {4,34}, {4,35}, {4,36}, {4,37}, {50,125}, {4,38}, {4,39}, {50,126}, {4,40}, {4,41}, {4,42}, {4,43}, {4,44}, {4,45}, {4,46}, {4,47}, {4,48}, {4,49}, {4,50}, {4,51}, {4,52}, {4,53}, {4,54}, {4,55}, {4,56}, {4,57}, {4,58}, {4,65}, {4,66}, {4,67}, {4,68}, {4,69}, {4,70}, {4,71}, {4,72}, {50,127}, {50,128}, {4,73}, {4,74}, {50,129}, {4,75}, {50,130}, {4,76}, {50,131}, {4,77}, {4,78}, {4,79}, {4,80}, {4,81}, {4,82}, {4,83}, {50,132}, {50,133}, {4,84}, {50,134}, {4,85}, {50,135}, {50,136}, {50,137}, {4,86}, {4,87}, {4,88}, {4,89}, {50,138}, {50,139}, {4,90}, {4,91}, {4,92}, {4,93}, {4,94}, {4,95}, {50,140}, {4,96}, {4,97}, {4,98}, {4,99}, {4,100}, {4,101}, {4,102}, {4,103}, {4,104}, {4,105}, {4,106}, {50,141}, {50,142}, {4,107}, {4,108}, {4,109}, {4,110}, {4,111}, {4,112}, {50,143}, {50,144}, {4,113}, {4,114}, {4,115}, {4,116}, {4,117}, {4,118}, {4,119}, {4,120}, {4,121}, {4,122}, {4,123}, {4,124}, {4,125}, {4,126}, {4,127}, {4,128}, {4,129}, {4,130}, {4,131}, {50,145}, {4,132}, {4,133}, {4,134}, {4,135}, {4,136}, {4,137}, {50,146}, {4,138}, {4,139}, {4,140}, {50,147}, {4,141}, {4,142}, {4,143}, {50,148}, {4,144}, {4,145}, {4,146}, {4,147}, {4,148}, {4,149}, {4,150}, {50,149}, {50,150}, {4,151}, {4,152}, {4,153}, {50,151}, {4,154}, {4,155}, {4,156}, {4,157}, {4,158}, {4,159}, {50,152}, {4,160}, {4,161}, {4,162}, {4,163}, {4,164}, {4,165}, {4,166}, {4,167}, {4,168}, {4,169}, {4,170}, {4,171}, {4,172}, {4,173}, {4,174}, {4,175}, {4,176}, {4,177}, {4,178}, {4,179}, {4,180}, {4,181}, {4,182}, {4,183}, {4,184}, {4,185}, {4,186}, {50,153}, {50,154}, {4,187}, {4,188}, {50,155}, {4,189}, {4,190}, {5,1}, {50,156}, {5,2}, {5,3}, {5,4}, {5,5}, {5,6}, {5,7}, {50,157}, {50,158}, {50,159}, {5,8}, {50,160}, {5,9}, {50,161}, {50,162}, {5,10}, {5,11}, {5,12}, {5,13}, {5,14}, {50,163}, {5,15}, {5,16}, {5,17}, {5,18}, {5,19}, {5,20}, {5,21}, {50,164}, {5,22}, {5,23}, {5,24}, {5,25}, {5,26}, {5,33}, {5,34}, {5,35}, {5,36}, {5,37}, {5,38}, {50,165}, {50,166}, {5,39}, {5,40}, {5,41}, {5,42}, {5,43}, {5,44}, {50,167}, {50,168}, {5,45}, {5,46}, {50,169}, {5,47}, {5,48}, {5,49}, {50,170}, {5,50}, {5,51}, {5,52}, {5,53}, {5,54}, {5,55}, {5,56}, {50,171}, {50,172}, {5,57}, {5,58}, {50,173}, {5,65}, {5,66}, {5,67}, {5,68}, {5,69}, {5,70}, {5,71}, {50,174}, {5,72}, {5,73}, {5,74}, {50,175}, {5,75}, {5,76}, {5,77}, {50,176}, {5,78}, {5,79}, {5,80}, {5,81}, {5,82}, {5,83}, {5,84}, {50,177}, {50,178}, {5,85}, {5,86}, {5,87}, {5,88}, {5,89}, {5,90}, {5,91}, {5,92}, {5,93}, {5,94}, {50,179}, {5,95}, {5,96}, {5,97}, {5,98}, {5,99}, {5,100}, {5,101}, {5,102}, {5,103}, {5,104}, {5,105}, {5,106}, {5,107}, {5,108}, {5,109}, {5,110}, {5,111}, {5,112}, {5,113}, {5,114}, {5,115}, {5,116}, {5,117}, {5,118}, {5,119}, {5,120}, {5,121}, {50,180}, {50,181}, {5,122}, {5,123}, {50,182}, {5,124}, {50,183}, {5,125}, {50,184}, {5,126}, {50,185}, {5,127}, {5,128}, {5,129}, {5,130}, {50,186}, {50,187}, {50,188}, {5,131}, {50,189}, {5,132}, {50,190}, {5,133}, {5,134}, {5,135}, {51,97}, {5,136}, {5,137}, {5,138}, {5,139}, {5,140}, {5,141}, {5,142}, {5,143}, {5,144}, {5,145}, {5,146}, {5,147}, {5,148}, {5,149}, {5,150}, {5,151}, {5,152}, {5,153}, {5,154}, {5,155}, {5,156}, {5,157}, {5,158}, {5,159}, {5,160}, {5,161}, {5,162}, {5,163}, {5,164}, {5,165}, {51,98}, {51,99}, {5,166}, {5,167}, {51,100}, {5,168}, {5,169}, {5,170}, {51,101}, {5,171}, {5,172}, {5,173}, {5,174}, {5,175}, {5,176}, {5,177}, {51,102}, {51,103}, {5,178}, {51,104}, {5,179}, {51,105}, {5,180}, {5,181}, {5,182}, {5,183}, {5,184}, {5,185}, {51,106}, {51,107}, {51,108}, {5,186}, {51,109}, {5,187}, {5,188}, {51,110}, {51,111}, {51,112}, {51,113}, {5,189}, {5,190}, {6,1}, {6,2}, {6,3}, {51,114}, {51,115}, {6,4}, {51,116}, {51,117}, {51,118}, {51,119}, {51,120}, {6,5}, {51,121}, {6,6}, {51,122}, {51,123}, {51,124}, {6,7}, {6,8}, {51,125}, {6,9}, {6,10}, {6,11}, {51,126}, {6,12}, {6,13}, {6,14}, {6,15}, {6,16}, {6,17}, {6,18}, {51,127}, {51,128}, {6,19}, {51,129}, {51,130}, {51,131}, {6,20}, {6,21}, {6,22}, {6,23}, {6,24}, {6,25}, {51,132}, {51,133}, {6,26}, {6,33}, {51,134}, {6,34}, {6,35}, {6,36}, {51,135}, {6,37}, {6,38}, {6,39}, {6,40}, {6,41}, {6,42}, {6,43}, {51,136}, {6,44}, {6,45}, {6,46}, {6,47}, {51,137}, {6,48}, {6,49}, {6,50}, {6,51}, {6,52}, {6,53}, {6,54}, {6,55}, {6,56}, {6,57}, {6,58}, {6,65}, {6,66}, {6,67}, {6,68}, {6,69}, {6,70}, {6,71}, {6,72}, {6,73}, {6,74}, {6,75}, {6,76}, {6,77}, {6,78}, {6,79}, {6,80}, {6,81}, {6,82}, {6,83}, {6,84}, {6,85}, {6,86}, {6,87}, {51,138}, {51,139}, {6,88}, {51,140}, {51,141}, {6,89}, {6,90}, {6,91}, {51,142}, {6,92}, {51,143}, {51,144}, {6,93}, {6,94}, {6,95}, {6,96}, {51,145}, {51,146}, {6,97}, {51,147}, {51,148}, {51,149}, {6,98}, {6,99}, {6,100}, {6,101}, {6,102}, {51,150}, {51,151}, {51,152}, {6,103}, {6,104}, {51,153}, {6,105}, {6,106}, {6,107}, {51,154}, {6,108}, {6,109}, {6,110}, {6,111}, {6,112}, {6,113}, {6,114}, {51,155}, {51,156}, {6,115}, {51,157}, {51,158}, {51,159}, {6,116}, {6,117}, {6,118}, {6,119}, {6,120}, {6,121}, {51,160}, {51,161}, {6,122}, {6,123}, {51,162}, {6,124}, {6,125}, {6,126}, {51,163}, {6,127}, {6,128}, {6,129}, {6,130}, {6,131}, {6,132}, {6,133}, {51,164}, {51,165}, {6,134}, {6,135}, {51,166}, {51,167}, {6,136}, {6,137}, {51,168}, {6,138}, {6,139}, {6,140}, {51,169}, {6,141}, {6,142}, {6,143}, {51,170}, {6,144}, {6,145}, {6,146}, {6,147}, {6,148}, {6,149}, {6,150}, {6,151}, {6,152}, {6,153}, {6,154}, {6,155}, {6,156}, {6,157}, {6,158}, {6,159}, {6,160}, {6,161}, {6,162}, {6,163}, {6,164}, {6,165}, {6,166}, {51,171}, {51,172}, {6,167}, {6,168}, {51,173}, {6,169}, {6,170}, {6,171}, {51,174}, {6,172}, {51,175}, {6,173}, {6,174}, {6,175}, {6,176}, {6,177}, {51,176}, {51,177}, {6,178}, {51,178}, {6,179}, {51,179}, {6,180}, {6,181}, {6,182}, {6,183}, {51,180}, {51,181}, {51,182}, {6,184}, {6,185}, {6,186}, {51,183}, {6,187}, {6,188}, {6,189}, {51,184}, {6,190}, {7,1}, {7,2}, {7,3}, {7,4}, {7,5}, {7,6}, {7,7}, {7,8}, {7,9}, {7,10}, {51,185}, {7,11}, {7,12}, {7,13}, {7,14}, {7,15}, {7,16}, {7,17}, {7,18}, {7,19}, {7,20}, {7,21}, {7,22}, {7,23}, {7,24}, {7,25}, {7,26}, {7,33}, {7,34}, {7,35}, {7,36}, {7,37}, {7,38}, {7,39}, {7,40}, {7,41}, {7,42}, {7,43}, {7,44}, {7,45}, {7,46}, {7,47}, {7,48}, {7,49}, {7,50}, {7,51}, {51,186}, {7,52}, {7,53}, {7,54}, {51,187}, {7,55}, {7,56}, {7,57}, {51,188}, {7,58}, {7,65}, {7,66}, {7,67}, {7,68}, {7,69}, {7,70}, {51,189}, {51,190}, {7,71}, {52,97}, {7,72}, {7,73}, {7,74}, {7,75}, {7,76}, {7,77}, {7,78}, {7,79}, {52,98}, {52,99}, {7,80}, {7,81}, {52,100}, {7,82}, {7,83}, {7,84}, {52,101}, {7,85}, {7,86}, {7,87}, {7,88}, {7,89}, {7,90}, {7,91}, {7,92}, {52,102}, {7,93}, {52,103}, {7,94}, {52,104}, {7,95}, {7,96}, {7,97}, {7,98}, {7,99}, {7,100}, {52,105}, {52,106}, {7,101}, {7,102}, {52,107}, {7,103}, {7,104}, {52,108}, {52,109}, {7,105}, {7,106}, {7,107}, {7,108}, {7,109}, {7,110}, {7,111}, {52,110}, {52,111}, {7,112}, {52,112}, {7,113}, {52,113}, {7,114}, {7,115}, {7,116}, {7,117}, {7,118}, {7,119}, {52,114}, {7,120}, {7,121}, {7,122}, {7,123}, {7,124}, {7,125}, {7,126}, {7,127}, {7,128}, {7,129}, {7,130}, {7,131}, {7,132}, {7,133}, {7,134}, {7,135}, {7,136}, {7,137}, {7,138}, {52,115}, {7,139}, {7,140}, {7,141}, {7,142}, {7,143}, {7,144}, {7,145}, {52,116}, {7,146}, {7,147}, {7,148}, {7,149}, {7,150}, {7,151}, {7,152}, {7,153}, {7,154}, {7,155}, {7,156}, {7,157}, {7,158}, {7,159}, {7,160}, {7,161}, {7,162}, {7,163}, {7,164}, {7,165}, {7,166}, {7,167}, {7,168}, {7,169}, {7,170}, {7,171}, {7,172}, {52,117}, {7,173}, {7,174}, {7,175}, {52,118}, {7,176}, {7,177}, {7,178}, {52,119}, {7,179}, {7,180}, {7,181}, {7,182}, {7,183}, {7,184}, {7,185}, {52,120}, {52,121}, {7,186}, {7,187}, {7,188}, {7,189}, {7,190}, {8,1}, {8,2}, {8,3}, {8,4}, {8,5}, {52,122}, {52,123}, {8,6}, {8,7}, {8,8}, {8,9}, {8,10}, {8,11}, {52,124}, {8,12}, {8,13}, {8,14}, {8,15}, {8,16}, {8,17}, {8,18}, {52,125}, {52,126}, {8,19}, {8,20}, {8,21}, {52,127}, {8,22}, {8,23}, {8,24}, {8,25}, {8,26}, {8,33}, {52,128}, {52,129}, {8,34}, {8,35}, {52,130}, {8,36}, {8,37}, {8,38}, {52,131}, {52,132}, {52,133}, {8,39}, {8,40}, {8,41}, {8,42}, {8,43}, {52,134}, {52,135}, {8,44}, {52,136}, {8,45}, {52,137}, {52,138}, {8,46}, {8,47}, {8,48}, {52,139}, {8,49}, {52,140}, {8,50}, {8,51}, {8,52}, {52,141}, {8,53}, {8,54}, {8,55}, {52,142}, {8,56}, {8,57}, {8,58}, {8,65}, {8,66}, {8,67}, {8,68}, {8,69}, {8,70}, {8,71}, {8,72}, {8,73}, {8,74}, {8,75}, {8,76}, {8,77}, {8,78}, {8,79}, {8,80}, {52,143}, {52,144}, {8,81}, {8,82}, {52,145}, {8,83}, {8,84}, {8,85}, {52,146}, {8,86}, {52,147}, {8,87}, {8,88}, {8,89}, {8,90}, {8,91}, {52,148}, {52,149}, {8,92}, {52,150}, {8,93}, {52,151}, {8,94}, {8,95}, {8,96}, {8,97}, {52,152}, {8,98}, {52,153}, {52,154}, {52,155}, {8,99}, {52,156}, {8,100}, {8,101}, {52,157}, {52,158}, {52,159}, {52,160}, {52,161}, {8,102}, {8,103}, {8,104}, {52,162}, {52,163}, {52,164}, {8,105}, {52,165}, {52,166}, {52,167}, {52,168}, {52,169}, {8,106}, {8,107}, {8,108}, {52,170}, {52,171}, {52,172}, {8,109}, {8,110}, {52,173}, {8,111}, {8,112}, {8,113}, {52,174}, {8,114}, {8,115}, {8,116}, {8,117}, {8,118}, {8,119}, {8,120}, {52,175}, {52,176}, {8,121}, {52,177}, {52,178}, {52,179}, {8,122}, {8,123}, {8,124}, {8,125}, {8,126}, {8,127}, {52,180}, {8,128}, {8,129}, {8,130}, {8,131}, {8,132}, {8,133}, {8,134}, {8,135}, {8,136}, {8,137}, {8,138}, {8,139}, {8,140}, {8,141}, {8,142}, {8,143}, {8,144}, {8,145}, {8,146}, {8,147}, {8,148}, {8,149}, {8,150}, {8,151}, {8,152}, {8,153}, {8,154}, {8,155}, {8,156}, {8,157}, {8,158}, {8,159}, {8,160}, {8,161}, {8,162}, {8,163}, {8,164}, {8,165}, {8,166}, {8,167}, {8,168}, {8,169}, {8,170}, {8,171}, {8,172}, {8,173}, {8,174}, {8,175}, {8,176}, {8,177}, {8,178}, {8,179}, {8,180}, {8,181}, {8,182}, {52,181}, {52,182}, {52,183}, {8,183}, {52,184}, {8,184}, {8,185}, {52,185}, {52,186}, {8,186}, {52,187}, {52,188}, {8,187}, {8,188}, {8,189}, {8,190}, {52,189}, {52,190}, {9,1}, {53,97}, {9,2}, {53,98}, {9,3}, {53,99}, {9,4}, {9,5}, {53,100}, {9,6}, {53,101}, {53,102}, {9,7}, {9,8}, {53,103}, {9,9}, {9,10}, {9,11}, {53,104}, {9,12}, {9,13}, {9,14}, {9,15}, {9,16}, {9,17}, {9,18}, {53,105}, {53,106}, {9,19}, {53,107}, {53,108}, {53,109}, {9,20}, {9,21}, {9,22}, {9,23}, {9,24}, {9,25}, {53,110}, {9,26}, {9,33}, {9,34}, {53,111}, {9,35}, {9,36}, {9,37}, {53,112}, {9,38}, {9,39}, {9,40}, {9,41}, {9,42}, {9,43}, {9,44}, {9,45}, {9,46}, {9,47}, {9,48}, {53,113}, {53,114}, {9,49}, {9,50}, {9,51}, {9,52}, {9,53}, {9,54}, {53,115}, {9,55}, {9,56}, {9,57}, {53,116}, {9,58}, {9,65}, {9,66}, {9,67}, {9,68}, {9,69}, {9,70}, {9,71}, {9,72}, {9,73}, {9,74}, {9,75}, {9,76}, {9,77}, {9,78}, {9,79}, {9,80}, {9,81}, {9,82}, {9,83}, {9,84}, {9,85}, {9,86}, {53,117}, {53,118}, {9,87}, {9,88}, {53,119}, {9,89}, {9,90}, {53,120}, {53,121}, {9,91}, {53,122}, {9,92}, {53,123}, {9,93}, {9,94}, {9,95}, {53,124}, {53,125}, {9,96}, {53,126}, {9,97}, {53,127}, {9,98}, {53,128}, {9,99}, {53,129}, {9,100}, {9,101}, {53,130}, {9,102}, {9,103}, {9,104}, {53,131}, {9,105}, {9,106}, {9,107}, {53,132}, {9,108}, {9,109}, {9,110}, {9,111}, {9,112}, {9,113}, {9,114}, {9,115}, {9,116}, {9,117}, {9,118}, {9,119}, {9,120}, {9,121}, {9,122}, {9,123}, {9,124}, {9,125}, {9,126}, {53,133}, {9,127}, {9,128}, {9,129}, {9,130}, {9,131}, {9,132}, {9,133}, {9,134}, {9,135}, {9,136}, {9,137}, {9,138}, {9,139}, {9,140}, {9,141}, {9,142}, {9,143}, {9,144}, {9,145}, {53,134}, {9,146}, {9,147}, {9,148}, {9,149}, {9,150}, {9,151}, {9,152}, {53,135}, {9,153}, {9,154}, {9,155}, {53,136}, {9,156}, {9,157}, {9,158}, {53,137}, {9,159}, {9,160}, {9,161}, {9,162}, {9,163}, {9,164}, {9,165}, {53,138}, {53,139}, {9,166}, {53,140}, {9,167}, {9,168}, {9,169}, {9,170}, {9,171}, {9,172}, {9,173}, {9,174}, {53,141}, {9,175}, {9,176}, {9,177}, {9,178}, {9,179}, {9,180}, {9,181}, {9,182}, {9,183}, {9,184}, {9,185}, {9,186}, {9,187}, {9,188}, {9,189}, {9,190}, {10,1}, {10,2}, {10,3}, {10,4}, {10,5}, {10,6}, {10,7}, {10,8}, {10,9}, {10,10}, {10,11}, {53,142}, {53,143}, {10,12}, {10,13}, {53,144}, {10,14}, {10,15}, {10,16}, {53,145}, {10,17}, {10,18}, {10,19}, {10,20}, {10,21}, {10,22}, {10,23}, {53,146}, {53,147}, {10,24}, {53,148}, {10,25}, {53,149}, {10,26}, {10,33}, {10,34}, {10,35}, {10,36}, {10,37}, {53,150}, {10,38}, {10,39}, {10,40}, {10,41}, {10,42}, {10,43}, {10,44}, {10,45}, {10,46}, {10,47}, {10,48}, {10,49}, {10,50}, {10,51}, {10,52}, {10,53}, {10,54}, {10,55}, {10,56}, {53,151}, {10,57}, {10,58}, {10,65}, {10,66}, {10,67}, {10,68}, {10,69}, {53,152}, {10,70}, {10,71}, {10,72}, {10,73}, {10,74}, {10,75}, {10,76}, {10,77}, {10,78}, {10,79}, {10,80}, {10,81}, {10,82}, {10,83}, {10,84}, {10,85}, {10,86}, {10,87}, {10,88}, {10,89}, {53,153}, {10,90}, {10,91}, {10,92}, {10,93}, {10,94}, {10,95}, {53,154}, {10,96}, {10,97}, {10,98}, {53,155}, {10,99}, {10,100}, {10,101}, {53,156}, {10,102}, {10,103}, {10,104}, {10,105}, {10,106}, {10,107}, {10,108}, {10,109}, {53,157}, {10,110}, {53,158}, {10,111}, {53,159}, {10,112}, {10,113}, {10,114}, {10,115}, {10,116}, {10,117}, {53,160}, {10,118}, {10,119}, {10,120}, {53,161}, {10,121}, {10,122}, {10,123}, {53,162}, {10,124}, {10,125}, {10,126}, {10,127}, {10,128}, {10,129}, {10,130}, {53,163}, {10,131}, {10,132}, {10,133}, {10,134}, {53,164}, {10,135}, {10,136}, {10,137}, {10,138}, {10,139}, {10,140}, {53,165}, {53,166}, {10,141}, {10,142}, {53,167}, {10,143}, {10,144}, {53,168}, {53,169}, {10,145}, {53,170}, {10,146}, {10,147}, {10,148}, {10,149}, {10,150}, {53,171}, {53,172}, {10,151}, {53,173}, {10,152}, {53,174}, {10,153}, {10,154}, {10,155}, {10,156}, {10,157}, {10,158}, {53,175}, {10,159}, {10,160}, {10,161}, {10,162}, {10,163}, {10,164}, {10,165}, {10,166}, {10,167}, {10,168}, {10,169}, {10,170}, {10,171}, {10,172}, {10,173}, {10,174}, {10,175}, {10,176}, {10,177}, {10,178}, {10,179}, {10,180}, {10,181}, {10,182}, {10,183}, {10,184}, {10,185}, {53,176}, {53,177}, {10,186}, {10,187}, {53,178}, {10,188}, {10,189}, {53,179}, {53,180}, {10,190}, {11,1}, {11,2}, {11,3}, {11,4}, {11,5}, {11,6}, {53,181}, {53,182}, {11,7}, {53,183}, {53,184}, {53,185}, {53,186}, {11,8}, {11,9}, {11,10}, {11,11}, {11,12}, {53,187}, {53,188}, {11,13}, {11,14}, {53,189}, {11,15}, {11,16}, {11,17}, {53,190}, {11,18}, {11,19}, {11,20}, {11,21}, {11,22}, {11,23}, {11,24}, {54,97}, {54,98}, {11,25}, {54,99}, {54,100}, {54,101}, {11,26}, {11,33}, {11,34}, {11,35}, {11,36}, {54,102}, {54,103}, {54,104}, {11,37}, {11,38}, {54,105}, {11,39}, {11,40}, {11,41}, {54,106}, {11,42}, {11,43}, {11,44}, {11,45}, {11,46}, {11,47}, {11,48}, {54,107}, {54,108}, {11,49}, {54,109}, {54,110}, {54,111}, {11,50}, {11,51}, {11,52}, {11,53}, {11,54}, {11,55}, {11,56}, {11,57}, {11,58}, {11,65}, {11,66}, {11,67}, {11,68}, {11,69}, {11,70}, {11,71}, {11,72}, {11,73}, {11,74}, {11,75}, {11,76}, {11,77}, {11,78}, {11,79}, {11,80}, {11,81}, {11,82}, {11,83}, {11,84}, {11,85}, {11,86}, {11,87}, {11,88}, {11,89}, {11,90}, {11,91}, {11,92}, {11,93}, {11,94}, {11,95}, {11,96}, {11,97}, {11,98}, {11,99}, {11,100}, {11,101}, {11,102}, {11,103}, {11,104}, {11,105}, {11,106}, {11,107}, {11,108}, {11,109}, {11,110}, {11,111}, {11,112}, {11,113}, {11,114}, {11,115}, {11,116}, {11,117}, {54,112}, {54,113}, {11,118}, {11,119}, {54,114}, {11,120}, {11,121}, {11,122}, {54,115}, {11,123}, {54,116}, {54,117}, {11,124}, {11,125}, {11,126}, {11,127}, {54,118}, {54,119}, {11,128}, {54,120}, {54,121}, {54,122}, {11,129}, {11,130}, {11,131}, {11,132}, {11,133}, {54,123}, {54,124}, {54,125}, {11,134}, {11,135}, {54,126}, {11,136}, {11,137}, {11,138}, {54,127}, {11,139}, {11,140}, {11,141}, {11,142}, {11,143}, {11,144}, {11,145}, {54,128}, {54,129}, {11,146}, {54,130}, {54,131}, {54,132}, {11,147}, {11,148}, {11,149}, {11,150}, {11,151}, {11,152}, {54,133}, {11,153}, {11,154}, {11,155}, {11,156}, {11,157}, {11,158}, {11,159}, {11,160}, {11,161}, {11,162}, {11,163}, {11,164}, {11,165}, {11,166}, {11,167}, {11,168}, {11,169}, {11,170}, {11,171}, {54,134}, {11,172}, {11,173}, {11,174}, {11,175}, {11,176}, {11,177}, {11,178}, {11,179}, {11,180}, {11,181}, {11,182}, {11,183}, {11,184}, {11,185}, {11,186}, {11,187}, {11,188}, {11,189}, {11,190}, {12,1}, {12,2}, {12,3}, {12,4}, {12,5}, {12,6}, {12,7}, {12,8}, {12,9}, {12,10}, {12,11}, {12,12}, {12,13}, {12,14}, {12,15}, {12,16}, {54,135}, {54,136}, {12,17}, {12,18}, {54,137}, {12,19}, {12,20}, {12,21}, {54,138}, {12,22}, {12,23}, {12,24}, {12,25}, {12,26}, {12,33}, {12,34}, {12,35}, {12,36}, {12,37}, {12,38}, {12,39}, {54,139}, {12,40}, {12,41}, {12,42}, {12,43}, {12,44}, {12,45}, {54,140}, {12,46}, {12,47}, {12,48}, {12,49}, {12,50}, {12,51}, {12,52}, {54,141}, {12,53}, {12,54}, {12,55}, {12,56}, {12,57}, {12,58}, {12,65}, {12,66}, {12,67}, {12,68}, {12,69}, {12,70}, {12,71}, {12,72}, {12,73}, {12,74}, {12,75}, {12,76}, {12,77}, {54,142}, {12,78}, {12,79}, {12,80}, {12,81}, {12,82}, {12,83}, {12,84}, {12,85}, {12,86}, {12,87}, {12,88}, {12,89}, {12,90}, {12,91}, {12,92}, {12,93}, {12,94}, {12,95}, {12,96}, {12,97}, {12,98}, {12,99}, {12,100}, {12,101}, {12,102}, {12,103}, {12,104}, {54,143}, {12,105}, {12,106}, {12,107}, {54,144}, {12,108}, {12,109}, {12,110}, {12,111}, {12,112}, {12,113}, {12,114}, {12,115}, {12,116}, {12,117}, {12,118}, {12,119}, {12,120}, {12,121}, {12,122}, {12,123}, {12,124}, {12,125}, {12,126}, {12,127}, {12,128}, {12,129}, {12,130}, {12,131}, {12,132}, {12,133}, {12,134}, {12,135}, {12,136}, {12,137}, {12,138}, {12,139}, {12,140}, {12,141}, {12,142}, {12,143}, {12,144}, {12,145}, {12,146}, {12,147}, {12,148}, {12,149}, {12,150}, {12,151}, {12,152}, {12,153}, {12,154}, {12,155}, {12,156}, {12,157}, {12,158}, {54,145}, {54,146}, {12,159}, {12,160}, {54,147}, {12,161}, {12,162}, {12,163}, {54,148}, {12,164}, {12,165}, {12,166}, {12,167}, {12,168}, {12,169}, {54,149}, {54,150}, {12,170}, {12,171}, {12,172}, {12,173}, {54,151}, {12,174}, {12,175}, {12,176}, {12,177}, {12,178}, {12,179}, {12,180}, {12,181}, {12,182}, {12,183}, {12,184}, {12,185}, {12,186}, {12,187}, {12,188}, {12,189}, {12,190}, {13,1}, {13,2}, {13,3}, {13,4}, {13,5}, {13,6}, {13,7}, {13,8}, {13,9}, {13,10}, {13,11}, {13,12}, {13,13}, {13,14}, {13,15}, {13,16}, {13,17}, {54,152}, {13,18}, {13,19}, {13,20}, {13,21}, {13,22}, {13,23}, {13,24}, {13,25}, {13,26}, {13,33}, {13,34}, {13,35}, {13,36}, {13,37}, {13,38}, {13,39}, {13,40}, {13,41}, {13,42}, {13,43}, {13,44}, {13,45}, {13,46}, {13,47}, {13,48}, {13,49}, {13,50}, {54,153}, {13,51}, {13,52}, {13,53}, {54,154}, {13,54}, {13,55}, {13,56}, {54,155}, {13,57}, {13,58}, {13,65}, {13,66}, {13,67}, {13,68}, {13,69}, {54,156}, {54,157}, {13,70}, {13,71}, {13,72}, {54,158}, {13,73}, {13,74}, {13,75}, {13,76}, {13,77}, {13,78}, {13,79}, {13,80}, {13,81}, {13,82}, {13,83}, {13,84}, {13,85}, {13,86}, {13,87}, {13,88}, {13,89}, {13,90}, {13,91}, {13,92}, {13,93}, {13,94}, {13,95}, {13,96}, {13,97}, {13,98}, {13,99}, {13,100}, {13,101}, {13,102}, {13,103}, {13,104}, {13,105}, {13,106}, {54,159}, {54,160}, {13,107}, {13,108}, {54,161}, {13,109}, {13,110}, {54,162}, {54,163}, {13,111}, {13,112}, {13,113}, {13,114}, {13,115}, {13,116}, {13,117}, {54,164}, {54,165}, {13,118}, {54,166}, {13,119}, {13,120}, {13,121}, {13,122}, {13,123}, {13,124}, {13,125}, {13,126}, {54,167}, {13,127}, {13,128}, {13,129}, {54,168}, {13,130}, {13,131}, {13,132}, {54,169}, {13,133}, {13,134}, {13,135}, {13,136}, {13,137}, {13,138}, {13,139}, {54,170}, {54,171}, {13,140}, {13,141}, {13,142}, {13,143}, {13,144}, {13,145}, {13,146}, {13,147}, {13,148}, {13,149}, {54,172}, {13,150}, {13,151}, {13,152}, {54,173}, {13,153}, {13,154}, {13,155}, {54,174}, {13,156}, {13,157}, {13,158}, {13,159}, {13,160}, {13,161}, {13,162}, {54,175}, {54,176}, {13,163}, {54,177}, {13,164}, {54,178}, {13,165}, {13,166}, {13,167}, {13,168}, {13,169}, {13,170}, {54,179}, {54,180}, {13,171}, {13,172}, {54,181}, {13,173}, {13,174}, {13,175}, {54,182}, {13,176}, {13,177}, {13,178}, {13,179}, {13,180}, {13,181}, {13,182}, {54,183}, {54,184}, {13,183}, {54,185}, {54,186}, {54,187}, {54,188}, {13,184}, {13,185}, {13,186}, {54,189}, {54,190}, {55,97}, {55,98}, {13,187}, {13,188}, {55,99}, {13,189}, {13,190}, {14,1}, {55,100}, {14,2}, {14,3}, {14,4}, {14,5}, {14,6}, {14,7}, {14,8}, {55,101}, {55,102}, {14,9}, {55,103}, {55,104}, {55,105}, {14,10}, {14,11}, {14,12}, {14,13}, {14,14}, {14,15}, {55,106}, {55,107}, {14,16}, {14,17}, {55,108}, {14,18}, {14,19}, {14,20}, {14,21}, {14,22}, {14,23}, {14,24}, {14,25}, {14,26}, {14,33}, {14,34}, {14,35}, {14,36}, {14,37}, {55,109}, {14,38}, {55,110}, {14,39}, {14,40}, {14,41}, {14,42}, {14,43}, {14,44}, {14,45}, {14,46}, {14,47}, {14,48}, {14,49}, {14,50}, {14,51}, {14,52}, {14,53}, {14,54}, {14,55}, {14,56}, {14,57}, {14,58}, {14,65}, {14,66}, {14,67}, {14,68}, {14,69}, {14,70}, {14,71}, {14,72}, {14,73}, {14,74}, {14,75}, {14,76}, {14,77}, {14,78}, {55,111}, {55,112}, {14,79}, {14,80}, {55,113}, {14,81}, {14,82}, {14,83}, {55,114}, {14,84}, {14,85}, {14,86}, {14,87}, {14,88}, {14,89}, {14,90}, {55,115}, {55,116}, {14,91}, {55,117}, {55,118}, {55,119}, {14,92}, {14,93}, {14,94}, {14,95}, {14,96}, {55,120}, {55,121}, {55,122}, {14,97}, {14,98}, {55,123}, {14,99}, {14,100}, {14,101}, {55,124}, {14,102}, {14,103}, {14,104}, {14,105}, {14,106}, {14,107}, {14,108}, {55,125}, {55,126}, {14,109}, {55,127}, {14,110}, {55,128}, {14,111}, {14,112}, {14,113}, {14,114}, {14,115}, {14,116}, {55,129}, {55,130}, {14,117}, {14,118}, {55,131}, {14,119}, {14,120}, {14,121}, {55,132}, {14,122}, {14,123}, {14,124}, {14,125}, {14,126}, {14,127}, {14,128}, {55,133}, {55,134}, {14,129}, {55,135}, {55,136}, {55,137}, {14,130}, {14,131}, {14,132}, {14,133}, {14,134}, {14,135}, {55,138}, {14,136}, {14,137}, {14,138}, {55,139}, {14,139}, {14,140}, {14,141}, {14,142}, {14,143}, {14,144}, {14,145}, {14,146}, {14,147}, {14,148}, {14,149}, {14,150}, {55,140}, {14,151}, {55,141}, {14,152}, {14,153}, {14,154}, {14,155}, {14,156}, {14,157}, {14,158}, {14,159}, {55,142}, {55,143}, {14,160}, {14,161}, {55,144}, {14,162}, {14,163}, {14,164}, {55,145}, {14,165}, {14,166}, {14,167}, {14,168}, {14,169}, {14,170}, {14,171}, {55,146}, {55,147}, {14,172}, {55,148}, {14,173}, {55,149}, {14,174}, {14,175}, {14,176}, {14,177}, {14,178}, {14,179}, {55,150}, {14,180}, {14,181}, {14,182}, {55,151}, {14,183}, {14,184}, {14,185}, {14,186}, {14,187}, {14,188}, {14,189}, {14,190}, {15,1}, {15,2}, {15,3}, {15,4}, {15,5}, {15,6}, {15,7}, {15,8}, {55,152}, {15,9}, {15,10}, {15,11}, {15,12}, {15,13}, {15,14}, {15,15}, {15,16}, {15,17}, {15,18}, {15,19}, {15,20}, {15,21}, {15,22}, {15,23}, {15,24}, {15,25}, {15,26}, {15,33}, {15,34}, {15,35}, {15,36}, {15,37}, {15,38}, {15,39}, {15,40}, {55,153}, {15,41}, {15,42}, {15,43}, {15,44}, {15,45}, {15,46}, {15,47}, {55,154}, {15,48}, {15,49}, {15,50}, {55,155}, {15,51}, {15,52}, {15,53}, {55,156}, {15,54}, {15,55}, {15,56}, {15,57}, {15,58}, {15,65}, {15,66}, {55,157}, {55,158}, {15,67}, {55,159}, {15,68}, {55,160}, {15,69}, {15,70}, {15,71}, {15,72}, {15,73}, {15,74}, {55,161}, {15,75}, {15,76}, {15,77}, {55,162}, {15,78}, {15,79}, {15,80}, {55,163}, {15,81}, {15,82}, {15,83}, {15,84}, {15,85}, {15,86}, {15,87}, {15,88}, {55,164}, {15,89}, {55,165}, {15,90}, {55,166}, {15,91}, {15,92}, {15,93}, {15,94}, {15,95}, {15,96}, {55,167}, {55,168}, {15,97}, {15,98}, {55,169}, {15,99}, {15,100}, {15,101}, {55,170}, {15,102}, {15,103}, {15,104}, {15,105}, {15,106}, {15,107}, {15,108}, {55,171}, {55,172}, {15,109}, {55,173}, {15,110}, {55,174}, {15,111}, {15,112}, {15,113}, {15,114}, {15,115}, {15,116}, {55,175}, {15,117}, {15,118}, {15,119}, {15,120}, {15,121}, {15,122}, {15,123}, {15,124}, {15,125}, {15,126}, {15,127}, {15,128}, {15,129}, {15,130}, {15,131}, {15,132}, {15,133}, {15,134}, {15,135}, {55,176}, {15,136}, {15,137}, {15,138}, {15,139}, {15,140}, {15,141}, {15,142}, {55,177}, {15,143}, {15,144}, {15,145}, {15,146}, {15,147}, {15,148}, {15,149}, {15,150}, {15,151}, {15,152}, {15,153}, {15,154}, {15,155}, {15,156}, {15,157}, {15,158}, {15,159}, {15,160}, {15,161}, {15,162}, {15,163}, {15,164}, {15,165}, {15,166}, {15,167}, {15,168}, {15,169}, {55,178}, {55,179}, {15,170}, {15,171}, {55,180}, {15,172}, {15,173}, {15,174}, {55,181}, {15,175}, {15,176}, {15,177}, {15,178}, {15,179}, {15,180}, {15,181}, {55,182}, {15,182}, {15,183}, {55,183}, {15,184}, {55,184}, {15,185}, {15,186}, {15,187}, {15,188}, {15,189}, {15,190}, {55,185}, {55,186}, {16,1}, {16,2}, {55,187}, {16,3}, {16,4}, {16,5}, {55,188}, {16,6}, {16,7}, {16,8}, {16,9}, {16,10}, {16,11}, {16,12}, {55,189}, {55,190}, {16,13}, {56,97}, {16,14}, {56,98}, {16,15}, {16,16}, {16,17}, {16,18}, {16,19}, {16,20}, {56,99}, {56,100}, {16,21}, {16,22}, {56,101}, {16,23}, {16,24}, {16,25}, {56,102}, {16,26}, {16,33}, {16,34}, {16,35}, {16,36}, {16,37}, {16,38}, {56,103}, {56,104}, {16,39}, {56,105}, {16,40}, {56,106}, {56,107}, {16,41}, {16,42}, {56,108}, {56,109}, {16,43}, {16,44}, {16,45}, {16,46}, {16,47}, {16,48}, {16,49}, {16,50}, {16,51}, {16,52}, {16,53}, {16,54}, {16,55}, {16,56}, {16,57}, {16,58}, {16,65}, {16,66}, {16,67}, {16,68}, {16,69}, {16,70}, {16,71}, {16,72}, {16,73}, {16,74}, {16,75}, {16,76}, {16,77}, {56,110}, {56,111}, {16,78}, {16,79}, {56,112}, {16,80}, {16,81}, {16,82}, {56,113}, {16,83}, {16,84}, {16,85}, {16,86}, {16,87}, {16,88}, {16,89}, {56,114}, {56,115}, {16,90}, {56,116}, {16,91}, {56,117}, {16,92}, {16,93}, {16,94}, {16,95}, {16,96}, {16,97}, {56,118}, {56,119}, {16,98}, {16,99}, {56,120}, {16,100}, {56,121}, {56,122}, {56,123}, {56,124}, {56,125}, {16,101}, {16,102}, {16,103}, {16,104}, {16,105}, {56,126}, {56,127}, {16,106}, {56,128}, {16,107}, {56,129}, {56,130}, {16,108}, {16,109}, {56,131}, {16,110}, {56,132}, {56,133}, {56,134}, {16,111}, {16,112}, {56,135}, {16,113}, {16,114}, {16,115}, {56,136}, {16,116}, {16,117}, {16,118}, {16,119}, {16,120}, {16,121}, {16,122}, {56,137}, {56,138}, {16,123}, {56,139}, {56,140}, {56,141}, {56,142}, {16,124}, {16,125}, {16,126}, {16,127}, {16,128}, {56,143}, {56,144}, {16,129}, {16,130}, {16,131}, {16,132}, {16,133}, {16,134}, {56,145}, {16,135}, {16,136}, {16,137}, {16,138}, {16,139}, {16,140}, {16,141}, {16,142}, {16,143}, {16,144}, {16,145}, {16,146}, {56,146}, {16,147}, {16,148}, {16,149}, {16,150}, {16,151}, {16,152}, {16,153}, {16,154}, {16,155}, {16,156}, {16,157}, {16,158}, {16,159}, {16,160}, {16,161}, {16,162}, {16,163}, {16,164}, {16,165}, {16,166}, {16,167}, {16,168}, {16,169}, {16,170}, {16,171}, {16,172}, {16,173}, {16,174}, {16,175}, {16,176}, {16,177}, {16,178}, {16,179}, {16,180}, {56,147}, {56,148}, {16,181}, {16,182}, {56,149}, {16,183}, {16,184}, {16,185}, {56,150}, {16,186}, {56,151}, {16,187}, {16,188}, {16,189}, {16,190}, {17,1}, {56,152}, {56,153}, {17,2}, {56,154}, {17,3}, {56,155}, {56,156}, {17,4}, {17,5}, {17,6}, {17,7}, {56,157}, {56,158}, {56,159}, {17,8}, {17,9}, {56,160}, {17,10}, {17,11}, {17,12}, {56,161}, {17,13}, {17,14}, {17,15}, {17,16}, {17,17}, {17,18}, {17,19}, {56,162}, {56,163}, {17,20}, {56,164}, {56,165}, {56,166}, {17,21}, {17,22}, {17,23}, {17,24}, {17,25}, {17,26}, {56,167}, {56,168}, {17,33}, {17,34}, {56,169}, {17,35}, {17,36}, {17,37}, {56,170}, {17,38}, {17,39}, {17,40}, {17,41}, {17,42}, {17,43}, {17,44}, {17,45}, {17,46}, {17,47}, {56,171}, {56,172}, {56,173}, {17,48}, {56,174}, {17,49}, {17,50}, {17,51}, {17,52}, {56,175}, {17,53}, {17,54}, {17,55}, {17,56}, {17,57}, {17,58}, {17,65}, {17,66}, {17,67}, {17,68}, {17,69}, {17,70}, {17,71}, {17,72}, {17,73}, {17,74}, {17,75}, {17,76}, {17,77}, {17,78}, {17,79}, {17,80}, {17,81}, {17,82}, {17,83}, {17,84}, {17,85}, {56,176}, {56,177}, {17,86}, {56,178}, {56,179}, {17,87}, {17,88}, {17,89}, {56,180}, {17,90}, {56,181}, {17,91}, {17,92}, {17,93}, {17,94}, {17,95}, {56,182}, {56,183}, {17,96}, {56,184}, {17,97}, {56,185}, {17,98}, {17,99}, {17,100}, {17,101}, {17,102}, {17,103}, {56,186}, {17,104}, {17,105}, {17,106}, {56,187}, {17,107}, {17,108}, {17,109}, {17,110}, {17,111}, {17,112}, {17,113}, {17,114}, {17,115}, {17,116}, {17,117}, {17,118}, {17,119}, {17,120}, {17,121}, {56,188}, {56,189}, {17,122}, {17,123}, {17,124}, {17,125}, {17,126}, {17,127}, {17,128}, {17,129}, {17,130}, {17,131}, {17,132}, {17,133}, {17,134}, {17,135}, {17,136}, {17,137}, {17,138}, {17,139}, {17,140}, {17,141}, {17,142}, {17,143}, {17,144}, {17,145}, {17,146}, {17,147}, {17,148}, {17,149}, {17,150}, {17,151}, {17,152}, {17,153}, {17,154}, {17,155}, {56,190}, {17,156}, {17,157}, {17,158}, {57,97}, {17,159}, {17,160}, {17,161}, {57,98}, {17,162}, {17,163}, {17,164}, {17,165}, {17,166}, {17,167}, {17,168}, {17,169}, {57,99}, {17,170}, {57,100}, {17,171}, {57,101}, {17,172}, {17,173}, {17,174}, {17,175}, {17,176}, {17,177}, {57,102}, {17,178}, {17,179}, {17,180}, {57,103}, {17,181}, {17,182}, {17,183}, {57,104}, {17,184}, {17,185}, {17,186}, {17,187}, {17,188}, {17,189}, {17,190}, {18,1}, {57,105}, {18,2}, {57,106}, {18,3}, {18,4}, {18,5}, {18,6}, {18,7}, {18,8}, {18,9}, {18,10}, {57,107}, {57,108}, {57,109}, {18,11}, {57,110}, {18,12}, {18,13}, {57,111}, {57,112}, {57,113}, {57,114}, {18,14}, {18,15}, {18,16}, {18,17}, {18,18}, {57,115}, {57,116}, {18,19}, {57,117}, {18,20}, {57,118}, {18,21}, {18,22}, {18,23}, {57,119}, {18,24}, {57,120}, {57,121}, {18,25}, {18,26}, {18,33}, {57,122}, {18,34}, {18,35}, {18,36}, {57,123}, {18,37}, {18,38}, {18,39}, {18,40}, {18,41}, {18,42}, {18,43}, {18,44}, {57,124}, {18,45}, {57,125}, {18,46}, {18,47}, {18,48}, {18,49}, {18,50}, {18,51}, {18,52}, {18,53}, {57,126}, {18,54}, {18,55}, {18,56}, {18,57}, {18,58}, {18,65}, {18,66}, {18,67}, {18,68}, {18,69}, {18,70}, {18,71}, {18,72}, {18,73}, {18,74}, {18,75}, {18,76}, {18,77}, {18,78}, {18,79}, {18,80}, {18,81}, {18,82}, {18,83}, {18,84}, {18,85}, {18,86}, {57,127}, {18,87}, {18,88}, {18,89}, {57,128}, {18,90}, {18,91}, {18,92}, {57,129}, {18,93}, {18,94}, {18,95}, {18,96}, {18,97}, {18,98}, {18,99}, {18,100}, {18,101}, {18,102}, {18,103}, {18,104}, {18,105}, {18,106}, {18,107}, {18,108}, {18,109}, {18,110}, {18,111}, {57,130}, {18,112}, {18,113}, {18,114}, {57,131}, {18,115}, {18,116}, {18,117}, {57,132}, {18,118}, {18,119}, {18,120}, {18,121}, {18,122}, {18,123}, {18,124}, {57,133}, {18,125}, {18,126}, {57,134}, {18,127}, {18,128}, {18,129}, {18,130}, {18,131}, {18,132}, {18,133}, {18,134}, {57,135}, {18,135}, {18,136}, {18,137}, {57,136}, {18,138}, {18,139}, {18,140}, {57,137}, {18,141}, {18,142}, {18,143}, {18,144}, {18,145}, {18,146}, {18,147}, {57,138}, {18,148}, {18,149}, {57,139}, {18,150}, {18,151}, {18,152}, {18,153}, {18,154}, {18,155}, {18,156}, {18,157}, {18,158}, {18,159}, {18,160}, {18,161}, {18,162}, {18,163}, {18,164}, {18,165}, {18,166}, {18,167}, {18,168}, {18,169}, {18,170}, {18,171}, {18,172}, {18,173}, {18,174}, {18,175}, {18,176}, {18,177}, {18,178}, {18,179}, {18,180}, {18,181}, {18,182}, {18,183}, {18,184}, {18,185}, {57,140}, {57,141}, {18,186}, {18,187}, {57,142}, {18,188}, {18,189}, {57,143}, {57,144}, {18,190}, {57,145}, {19,1}, {19,2}, {19,3}, {19,4}, {19,5}, {57,146}, {57,147}, {19,6}, {57,148}, {57,149}, {57,150}, {19,7}, {57,151}, {19,8}, {57,152}, {19,9}, {19,10}, {57,153}, {57,154}, {57,155}, {57,156}, {57,157}, {19,11}, {19,12}, {57,158}, {57,159}, {57,160}, {57,161}, {57,162}, {19,13}, {19,14}, {19,15}, {19,16}, {57,163}, {57,164}, {19,17}, {57,165}, {19,18}, {57,166}, {19,19}, {19,20}, {19,21}, {57,167}, {19,22}, {19,23}, {57,168}, {57,169}, {19,24}, {19,25}, {57,170}, {19,26}, {19,33}, {19,34}, {57,171}, {19,35}, {19,36}, {19,37}, {19,38}, {19,39}, {19,40}, {19,41}, {57,172}, {57,173}, {19,42}, {57,174}, {57,175}, {57,176}, {19,43}, {19,44}, {19,45}, {57,177}, {19,46}, {19,47}, {57,178}, {57,179}, {19,48}, {19,49}, {57,180}, {19,50}, {19,51}, {19,52}, {19,53}, {19,54}, {19,55}, {19,56}, {19,57}, {19,58}, {19,65}, {19,66}, {19,67}, {57,181}, {19,68}, {19,69}, {19,70}, {19,71}, {19,72}, {19,73}, {19,74}, {19,75}, {19,76}, {19,77}, {19,78}, {19,79}, {19,80}, {19,81}, {19,82}, {19,83}, {19,84}, {19,85}, {19,86}, {19,87}, {19,88}, {19,89}, {19,90}, {19,91}, {19,92}, {19,93}, {19,94}, {19,95}, {19,96}, {19,97}, {19,98}, {19,99}, {19,100}, {19,101}, {19,102}, {19,103}, {19,104}, {19,105}, {57,182}, {57,183}, {19,106}, {19,107}, {57,184}, {19,108}, {19,109}, {57,185}, {57,186}, {19,110}, {57,187}, {19,111}, {19,112}, {19,113}, {19,114}, {19,115}, {57,188}, {57,189}, {19,116}, {57,190}, {19,117}, {58,97}, {58,98}, {19,118}, {19,119}, {19,120}, {19,121}, {19,122}, {58,99}, {58,100}, {19,123}, {19,124}, {58,101}, {19,125}, {19,126}, {58,102}, {58,103}, {19,127}, {19,128}, {19,129}, {19,130}, {19,131}, {19,132}, {19,133}, {58,104}, {58,105}, {19,134}, {58,106}, {58,107}, {58,108}, {19,135}, {19,136}, {19,137}, {19,138}, {19,139}, {19,140}, {58,109}, {58,110}, {19,141}, {19,142}, {58,111}, {19,143}, {19,144}, {19,145}, {58,112}, {19,146}, {19,147}, {19,148}, {19,149}, {19,150}, {19,151}, {19,152}, {19,153}, {58,113}, {19,154}, {58,114}, {58,115}, {58,116}, {19,155}, {19,156}, {19,157}, {58,117}, {19,158}, {19,159}, {58,118}, {19,160}, {19,161}, {19,162}, {58,119}, {19,163}, {19,164}, {19,165}, {19,166}, {19,167}, {19,168}, {19,169}, {19,170}, {19,171}, {19,172}, {19,173}, {19,174}, {19,175}, {19,176}, {19,177}, {19,178}, {19,179}, {19,180}, {19,181}, {19,182}, {19,183}, {19,184}, {19,185}, {58,120}, {58,121}, {58,122}, {19,186}, {58,123}, {19,187}, {19,188}, {19,189}, {58,124}, {19,190}, {20,1}, {20,2}, {20,3}, {20,4}, {20,5}, {20,6}, {58,125}, {58,126}, {20,7}, {58,127}, {20,8}, {58,128}, {20,9}, {20,10}, {20,11}, {20,12}, {20,13}, {20,14}, {58,129}, {20,15}, {20,16}, {20,17}, {58,130}, {20,18}, {20,19}, {20,20}, {20,21}, {20,22}, {20,23}, {20,24}, {20,25}, {20,26}, {20,33}, {20,34}, {20,35}, {20,36}, {20,37}, {20,38}, {58,131}, {20,39}, {20,40}, {20,41}, {20,42}, {20,43}, {20,44}, {20,45}, {58,132}, {20,46}, {20,47}, {20,48}, {20,49}, {20,50}, {20,51}, {20,52}, {20,53}, {20,54}, {20,55}, {20,56}, {20,57}, {20,58}, {20,65}, {20,66}, {20,67}, {20,68}, {20,69}, {20,70}, {58,133}, {20,71}, {20,72}, {20,73}, {20,74}, {20,75}, {20,76}, {20,77}, {58,134}, {58,135}, {20,78}, {20,79}, {58,136}, {20,80}, {20,81}, {20,82}, {58,137}, {20,83}, {20,84}, {20,85}, {20,86}, {20,87}, {20,88}, {20,89}, {58,138}, {58,139}, {20,90}, {20,91}, {20,92}, {20,93}, {20,94}, {20,95}, {20,96}, {20,97}, {20,98}, {20,99}, {58,140}, {20,100}, {20,101}, {20,102}, {58,141}, {20,103}, {20,104}, {20,105}, {20,106}, {20,107}, {20,108}, {20,109}, {20,110}, {20,111}, {20,112}, {20,113}, {20,114}, {20,115}, {20,116}, {20,117}, {20,118}, {20,119}, {20,120}, {20,121}, {20,122}, {20,123}, {20,124}, {20,125}, {58,142}, {58,143}, {20,126}, {20,127}, {58,144}, {20,128}, {20,129}, {58,145}, {58,146}, {58,147}, {58,148}, {20,130}, {20,131}, {20,132}, {20,133}, {20,134}, {58,149}, {58,150}, {20,135}, {58,151}, {20,136}, {58,152}, {20,137}, {20,138}, {20,139}, {58,153}, {58,154}, {20,140}, {58,155}, {20,141}, {20,142}, {20,143}, {20,144}, {20,145}, {20,146}, {20,147}, {58,156}, {20,148}, {20,149}, {20,150}, {20,151}, {20,152}, {20,153}, {20,154}, {20,155}, {20,156}, {20,157}, {20,158}, {58,157}, {20,159}, {20,160}, {20,161}, {20,162}, {20,163}, {20,164}, {20,165}, {58,158}, {20,166}, {20,167}, {20,168}, {20,169}, {20,170}, {20,171}, {20,172}, {20,173}, {20,174}, {20,175}, {20,176}, {20,177}, {20,178}, {20,179}, {20,180}, {20,181}, {20,182}, {20,183}, {20,184}, {20,185}, {20,186}, {20,187}, {20,188}, {20,189}, {20,190}, {21,1}, {21,2}, {58,159}, {58,160}, {21,3}, {21,4}, {58,161}, {21,5}, {21,6}, {21,7}, {58,162}, {21,8}, {21,9}, {21,10}, {21,11}, {21,12}, {21,13}, {21,14}, {21,15}, {21,16}, {21,17}, {21,18}, {21,19}, {58,163}, {21,20}, {21,21}, {21,22}, {21,23}, {21,24}, {21,25}, {58,164}, {21,26}, {21,33}, {21,34}, {58,165}, {21,35}, {21,36}, {21,37}, {58,166}, {21,38}, {21,39}, {21,40}, {21,41}, {21,42}, {21,43}, {21,44}, {58,167}, {21,45}, {21,46}, {58,168}, {21,47}, {58,169}, {21,48}, {21,49}, {21,50}, {21,51}, {21,52}, {21,53}, {58,170}, {58,171}, {21,54}, {21,55}, {58,172}, {21,56}, {21,57}, {21,58}, {58,173}, {21,65}, {21,66}, {21,67}, {21,68}, {21,69}, {21,70}, {21,71}, {58,174}, {58,175}, {21,72}, {58,176}, {21,73}, {21,74}, {21,75}, {21,76}, {21,77}, {21,78}, {21,79}, {21,80}, {21,81}, {21,82}, {21,83}, {21,84}, {21,85}, {21,86}, {21,87}, {21,88}, {21,89}, {21,90}, {21,91}, {21,92}, {21,93}, {21,94}, {21,95}, {21,96}, {21,97}, {21,98}, {21,99}, {21,100}, {21,101}, {21,102}, {21,103}, {21,104}, {21,105}, {21,106}, {21,107}, {21,108}, {58,177}, {58,178}, {21,109}, {21,110}, {58,179}, {21,111}, {21,112}, {21,113}, {58,180}, {21,114}, {58,181}, {21,115}, {21,116}, {21,117}, {21,118}, {21,119}, {58,182}, {58,183}, {21,120}, {58,184}, {21,121}, {58,185}, {58,186}, {58,187}, {21,122}, {21,123}, {21,124}, {21,125}, {58,188}, {58,189}, {21,126}, {21,127}, {58,190}, {21,128}, {21,129}, {21,130}, {59,97}, {21,131}, {59,98}, {21,132}, {21,133}, {21,134}, {21,135}, {21,136}, {59,99}, {59,100}, {21,137}, {59,101}, {59,102}, {59,103}, {21,138}, {21,139}, {21,140}, {21,141}, {21,142}, {59,104}, {59,105}, {59,106}, {21,143}, {21,144}, {59,107}, {21,145}, {21,146}, {21,147}, {59,108}, {21,148}, {21,149}, {21,150}, {21,151}, {21,152}, {21,153}, {21,154}, {59,109}, {59,110}, {21,155}, {59,111}, {59,112}, {59,113}, {21,156}, {21,157}, {21,158}, {21,159}, {21,160}, {21,161}, {59,114}, {59,115}, {21,162}, {21,163}, {21,164}, {21,165}, {21,166}, {21,167}, {21,168}, {21,169}, {21,170}, {21,171}, {21,172}, {21,173}, {21,174}, {21,175}, {59,116}, {21,176}, {21,177}, {21,178}, {21,179}, {21,180}, {21,181}, {21,182}, {21,183}, {21,184}, {21,185}, {21,186}, {21,187}, {21,188}, {21,189}, {21,190}, {22,1}, {22,2}, {22,3}, {22,4}, {22,5}, {22,6}, {22,7}, {22,8}, {22,9}, {22,10}, {22,11}, {22,12}, {22,13}, {22,14}, {22,15}, {22,16}, {22,17}, {22,18}, {22,19}, {22,20}, {22,21}, {22,22}, {22,23}, {22,24}, {59,117}, {59,118}, {22,25}, {22,26}, {59,119}, {22,33}, {22,34}, {59,120}, {59,121}, {22,35}, {22,36}, {22,37}, {22,38}, {22,39}, {22,40}, {22,41}, {59,122}, {22,42}, {22,43}, {59,123}, {59,124}, {59,125}, {22,44}, {22,45}, {22,46}, {22,47}, {22,48}, {22,49}, {59,126}, {22,50}, {22,51}, {22,52}, {22,53}, {22,54}, {22,55}, {22,56}, {22,57}, {22,58}, {22,65}, {22,66}, {22,67}, {22,68}, {22,69}, {22,70}, {22,71}, {22,72}, {22,73}, {22,74}, {22,75}, {59,127}, {22,76}, {22,77}, {22,78}, {22,79}, {22,80}, {22,81}, {59,128}, {59,129}, {22,82}, {22,83}, {22,84}, {22,85}, {22,86}, {22,87}, {22,88}, {22,89}, {22,90}, {22,91}, {22,92}, {22,93}, {22,94}, {22,95}, {59,130}, {59,131}, {22,96}, {59,132}, {59,133}, {59,134}, {22,97}, {22,98}, {22,99}, {22,100}, {22,101}, {22,102}, {22,103}, {22,104}, {22,105}, {22,106}, {22,107}, {22,108}, {22,109}, {22,110}, {22,111}, {22,112}, {22,113}, {22,114}, {22,115}, {22,116}, {22,117}, {22,118}, {22,119}, {22,120}, {22,121}, {22,122}, {22,123}, {22,124}, {22,125}, {22,126}, {22,127}, {22,128}, {22,129}, {22,130}, {59,135}, {59,136}, {22,131}, {22,132}, {59,137}, {22,133}, {22,134}, {22,135}, {59,138}, {22,136}, {22,137}, {22,138}, {22,139}, {22,140}, {22,141}, {22,142}, {59,139}, {59,140}, {22,143}, {22,144}, {22,145}, {59,141}, {22,146}, {22,147}, {22,148}, {22,149}, {22,150}, {22,151}, {22,152}, {22,153}, {22,154}, {22,155}, {22,156}, {22,157}, {22,158}, {22,159}, {22,160}, {22,161}, {22,162}, {22,163}, {22,164}, {22,165}, {22,166}, {22,167}, {22,168}, {22,169}, {22,170}, {22,171}, {22,172}, {22,173}, {22,174}, {22,175}, {22,176}, {22,177}, {22,178}, {22,179}, {22,180}, {22,181}, {22,182}, {22,183}, {22,184}, {22,185}, {22,186}, {22,187}, {22,188}, {22,189}, {22,190}, {23,1}, {23,2}, {23,3}, {23,4}, {23,5}, {23,6}, {23,7}, {23,8}, {23,9}, {23,10}, {23,11}, {23,12}, {23,13}, {23,14}, {23,15}, {23,16}, {23,17}, {59,142}, {23,18}, {23,19}, {23,20}, {23,21}, {23,22}, {23,23}, {23,24}, {23,25}, {23,26}, {23,33}, {23,34}, {23,35}, {23,36}, {23,37}, {23,38}, {23,39}, {23,40}, {23,41}, {23,42}, {23,43}, {23,44}, {23,45}, {23,46}, {23,47}, {23,48}, {23,49}, {23,50}, {59,143}, {23,51}, {23,52}, {23,53}, {23,54}, {23,55}, {23,56}, {23,57}, {23,58}, {23,65}, {23,66}, {23,67}, {23,68}, {23,69}, {23,70}, {23,71}, {23,72}, {23,73}, {23,74}, {23,75}, {23,76}, {59,144}, {23,77}, {23,78}, {23,79}, {23,80}, {23,81}, {23,82}, {59,145}, {59,146}, {23,83}, {23,84}, {59,147}, {23,85}, {23,86}, {23,87}, {59,148}, {23,88}, {23,89}, {23,90}, {23,91}, {23,92}, {23,93}, {23,94}, {59,149}, {23,95}, {23,96}, {59,150}, {23,97}, {59,151}, {23,98}, {23,99}, {23,100}, {23,101}, {23,102}, {23,103}, {23,104}, {23,105}, {23,106}, {23,107}, {23,108}, {23,109}, {23,110}, {23,111}, {23,112}, {23,113}, {23,114}, {23,115}, {23,116}, {23,117}, {23,118}, {23,119}, {23,120}, {23,121}, {23,122}, {23,123}, {23,124}, {23,125}, {23,126}, {23,127}, {23,128}, {23,129}, {23,130}, {23,131}, {23,132}, {23,133}, {23,134}, {23,135}, {23,136}, {23,137}, {23,138}, {23,139}, {23,140}, {23,141}, {23,142}, {23,143}, {23,144}, {23,145}, {23,146}, {23,147}, {23,148}, {23,149}, {23,150}, {23,151}, {23,152}, {23,153}, {23,154}, {23,155}, {23,156}, {23,157}, {23,158}, {23,159}, {23,160}, {23,161}, {23,162}, {23,163}, {23,164}, {23,165}, {23,166}, {23,167}, {23,168}, {23,169}, {23,170}, {23,171}, {23,172}, {23,173}, {23,174}, {23,175}, {23,176}, {23,177}, {23,178}, {23,179}, {23,180}, {23,181}, {23,182}, {23,183}, {23,184}, {23,185}, {23,186}, {23,187}, {59,152}, {23,188}, {23,189}, {23,190}, {24,1}, {24,2}, {24,3}, {24,4}, {24,5}, {24,6}, {24,7}, {24,8}, {24,9}, {24,10}, {24,11}, {24,12}, {24,13}, {24,14}, {24,15}, {24,16}, {24,17}, {59,153}, {24,18}, {24,19}, {24,20}, {24,21}, {24,22}, {24,23}, {59,154}, {24,24}, {24,25}, {24,26}, {59,155}, {24,33}, {24,34}, {24,35}, {59,156}, {24,36}, {24,37}, {24,38}, {24,39}, {24,40}, {24,41}, {24,42}, {59,157}, {59,158}, {24,43}, {24,44}, {24,45}, {24,46}, {24,47}, {24,48}, {24,49}, {24,50}, {24,51}, {24,52}, {24,53}, {24,54}, {24,55}, {24,56}, {24,57}, {24,58}, {24,65}, {24,66}, {24,67}, {24,68}, {24,69}, {24,70}, {24,71}, {24,72}, {24,73}, {24,74}, {24,75}, {24,76}, {24,77}, {24,78}, {24,79}, {24,80}, {24,81}, {24,82}, {24,83}, {24,84}, {24,85}, {24,86}, {59,159}, {59,160}, {24,87}, {24,88}, {59,161}, {24,89}, {24,90}, {24,91}, {59,162}, {24,92}, {24,93}, {24,94}, {24,95}, {24,96}, {24,97}, {24,98}, {59,163}, {59,164}, {24,99}, {59,165}, {24,100}, {59,166}, {24,101}, {24,102}, {24,103}, {24,104}, {24,105}, {24,106}, {59,167}, {59,168}, {24,107}, {59,169}, {59,170}, {24,108}, {24,109}, {59,171}, {59,172}, {59,173}, {59,174}, {24,110}, {24,111}, {24,112}, {24,113}, {24,114}, {59,175}, {59,176}, {24,115}, {59,177}, {59,178}, {59,179}, {24,116}, {24,117}, {24,118}, {59,180}, {24,119}, {24,120}, {59,181}, {59,182}, {24,121}, {24,122}, {59,183}, {24,123}, {24,124}, {24,125}, {59,184}, {24,126}, {24,127}, {24,128}, {24,129}, {24,130}, {24,131}, {24,132}, {59,185}, {59,186}, {24,133}, {59,187}, {59,188}, {59,189}, {24,134}, {24,135}, {24,136}, {24,137}, {24,138}, {24,139}, {59,190}, {60,97}, {24,140}, {24,141}, {60,98}, {24,142}, {24,143}, {24,144}, {60,99}, {24,145}, {24,146}, {24,147}, {24,148}, {24,149}, {24,150}, {24,151}, {60,100}, {60,101}, {24,152}, {60,102}, {24,153}, {60,103}, {24,154}, {24,155}, {24,156}, {24,157}, {24,158}, {24,159}, {60,104}, {24,160}, {24,161}, {24,162}, {60,105}, {24,163}, {24,164}, {24,165}, {60,106}, {24,166}, {24,167}, {24,168}, {24,169}, {24,170}, {24,171}, {24,172}, {60,107}, {24,173}, {24,174}, {24,175}, {24,176}, {60,108}, {24,177}, {24,178}, {24,179}, {24,180}, {24,181}, {24,182}, {60,109}, {60,110}, {60,111}, {60,112}, {60,113}, {24,183}, {24,184}, {60,114}, {60,115}, {24,185}, {60,116}, {60,117}, {24,186}, {24,187}, {24,188}, {24,189}, {60,118}, {60,119}, {24,190}, {60,120}, {60,121}, {60,122}, {25,1}, {25,2}, {25,3}, {25,4}, {60,123}, {25,5}, {60,124}, {60,125}, {25,6}, {25,7}, {60,126}, {25,8}, {25,9}, {25,10}, {60,127}, {25,11}, {25,12}, {25,13}, {25,14}, {25,15}, {25,16}, {25,17}, {60,128}, {60,129}, {25,18}, {60,130}, {60,131}, {60,132}, {25,19}, {25,20}, {25,21}, {25,22}, {25,23}, {25,24}, {60,133}, {60,134}, {25,25}, {25,26}, {60,135}, {25,33}, {25,34}, {25,35}, {60,136}, {25,36}, {25,37}, {25,38}, {25,39}, {25,40}, {25,41}, {25,42}, {60,137}, {60,138}, {25,43}, {60,139}, {60,140}, {60,141}, {25,44}, {25,45}, {25,46}, {25,47}, {25,48}, {25,49}, {60,142}, {25,50}, {25,51}, {25,52}, {60,143}, {25,53}, {25,54}, {25,55}, {60,144}, {25,56}, {25,57}, {25,58}, {25,65}, {25,66}, {25,67}, {25,68}, {25,69}, {25,70}, {25,71}, {25,72}, {25,73}, {60,145}, {25,74}, {25,75}, {25,76}, {25,77}, {25,78}, {25,79}, {60,146}, {60,147}, {60,148}, {25,80}, {60,149}, {25,81}, {25,82}, {25,83}, {60,150}, {25,84}, {60,151}, {25,85}, {25,86}, {25,87}, {25,88}, {25,89}, {60,152}, {60,153}, {25,90}, {60,154}, {25,91}, {60,155}, {25,92}, {25,93}, {25,94}, {60,156}, {25,95}, {25,96}, {60,157}, {60,158}, {25,97}, {25,98}, {60,159}, {25,99}, {25,100}, {25,101}, {60,160}, {25,102}, {25,103}, {25,104}, {25,105}, {25,106}, {25,107}, {25,108}, {25,109}, {25,110}, {25,111}, {25,112}, {25,113}, {60,161}, {25,114}, {25,115}, {25,116}, {25,117}, {25,118}, {25,119}, {60,162}, {25,120}, {25,121}, {25,122}, {60,163}, {25,123}, {25,124}, {25,125}, {60,164}, {25,126}, {25,127}, {25,128}, {25,129}, {25,130}, {25,131}, {25,132}, {60,165}, {25,133}, {25,134}, {60,166}, {60,167}, {25,135}, {25,136}, {25,137}, {25,138}, {25,139}, {25,140}, {25,141}, {60,168}, {25,142}, {25,143}, {25,144}, {60,169}, {25,145}, {25,146}, {25,147}, {60,170}, {25,148}, {25,149}, {25,150}, {25,151}, {25,152}, {25,153}, {25,154}, {60,171}, {60,172}, {25,155}, {60,173}, {25,156}, {25,157}, {25,158}, {25,159}, {25,160}, {25,161}, {25,162}, {25,163}, {60,174}, {60,175}, {25,164}, {25,165}, {60,176}, {25,166}, {25,167}, {25,168}, {60,177}, {25,169}, {25,170}, {25,171}, {25,172}, {25,173}, {25,174}, {25,175}, {60,178}, {60,179}, {25,176}, {60,180}, {25,177}, {60,181}, {25,178}, {25,179}, {25,180}, {25,181}, {25,182}, {25,183}, {60,182}, {60,183}, {25,184}, {25,185}, {60,184}, {25,186}, {25,187}, {60,185}, {60,186}, {25,188}, {25,189}, {25,190}, {26,1}, {26,2}, {26,3}, {26,4}, {60,187}, {60,188}, {26,5}, {60,189}, {26,6}, {60,190}, {26,7}, {61,97}, {26,8}, {61,98}, {61,99}, {26,9}, {61,100}, {26,10}, {26,11}, {26,12}, {26,13}, {26,14}, {26,15}, {26,16}, {26,17}, {26,18}, {26,19}, {26,20}, {26,21}, {26,22}, {26,23}, {26,24}, {26,25}, {26,26}, {26,33}, {26,34}, {61,101}, {26,35}, {26,36}, {26,37}, {26,38}, {26,39}, {26,40}, {26,41}, {61,102}, {61,103}, {26,42}, {26,43}, {61,104}, {26,44}, {26,45}, {26,46}, {61,105}, {26,47}, {26,48}, {26,49}, {26,50}, {26,51}, {26,52}, {26,53}, {61,106}, {26,54}, {26,55}, {26,56}, {26,57}, {61,107}, {26,58}, {26,65}, {26,66}, {26,67}, {26,68}, {26,69}, {61,108}, {61,109}, {26,70}, {26,71}, {61,110}, {26,72}, {26,73}, {26,74}, {61,111}, {26,75}, {26,76}, {26,77}, {26,78}, {26,79}, {26,80}, {26,81}, {61,112}, {61,113}, {26,82}, {61,114}, {26,83}, {61,115}, {26,84}, {26,85}, {26,86}, {26,87}, {26,88}, {26,89}, {61,116}, {61,117}, {26,90}, {26,91}, {26,92}, {26,93}, {26,94}, {26,95}, {61,118}, {26,96}, {26,97}, {26,98}, {26,99}, {26,100}, {26,101}, {26,102}, {61,119}, {26,103}, {26,104}, {61,120}, {26,105}, {61,121}, {26,106}, {26,107}, {26,108}, {26,109}, {26,110}, {26,111}, {61,122}, {61,123}, {26,112}, {26,113}, {61,124}, {26,114}, {26,115}, {26,116}, {61,125}, {61,126}, {26,117}, {26,118}, {26,119}, {26,120}, {26,121}, {26,122}, {61,127}, {61,128}, {26,123}, {61,129}, {26,124}, {61,130}, {26,125}, {26,126}, {26,127}, {26,128}, {26,129}, {26,130}, {26,131}, {26,132}, {26,133}, {26,134}, {26,135}, {26,136}, {26,137}, {26,138}, {26,139}, {26,140}, {26,141}, {26,142}, {26,143}, {26,144}, {26,145}, {26,146}, {26,147}, {26,148}, {26,149}, {26,150}, {26,151}, {26,152}, {26,153}, {26,154}, {26,155}, {26,156}, {26,157}, {26,158}, {61,131}, {61,132}, {26,159}, {26,160}, {61,133}, {26,161}, {26,162}, {61,134}, {61,135}, {26,163}, {26,164}, {26,165}, {26,166}, {26,167}, {26,168}, {61,136}, {61,137}, {61,138}, {26,169}, {61,139}, {26,170}, {61,140}, {26,171}, {26,172}, {26,173}, {26,174}, {61,141}, {26,175}, {61,142}, {61,143}, {26,176}, {61,144}, {61,145}, {26,177}, {26,178}, {26,179}, {61,146}, {26,180}, {26,181}, {26,182}, {26,183}, {26,184}, {26,185}, {26,186}, {61,147}, {61,148}, {26,187}, {26,188}, {61,149}, {61,150}, {26,189}, {26,190}, {27,1}, {27,2}, {27,3}, {61,151}, {61,152}, {61,153}, {27,4}, {27,5}, {61,154}, {27,6}, {27,7}, {27,8}, {61,155}, {27,9}, {27,10}, {27,11}, {27,12}, {27,13}, {27,14}, {27,15}, {61,156}, {61,157}, {27,16}, {27,17}, {61,158}, {61,159}, {27,18}, {27,19}, {27,20}, {27,21}, {27,22}, {27,23}, {27,24}, {27,25}, {27,26}, {27,33}, {27,34}, {27,35}, {27,36}, {27,37}, {27,38}, {27,39}, {27,40}, {27,41}, {27,42}, {27,43}, {27,44}, {27,45}, {27,46}, {27,47}, {27,48}, {27,49}, {27,50}, {61,160}, {27,51}, {27,52}, {27,53}, {27,54}, {27,55}, {27,56}, {27,57}, {27,58}, {27,65}, {27,66}, {27,67}, {27,68}, {27,69}, {27,70}, {27,71}, {27,72}, {27,73}, {27,74}, {27,75}, {27,76}, {27,77}, {27,78}, {27,79}, {27,80}, {27,81}, {27,82}, {27,83}, {27,84}, {27,85}, {27,86}, {27,87}, {27,88}, {27,89}, {27,90}, {61,161}, {61,162}, {27,91}, {27,92}, {61,163}, {27,93}, {27,94}, {27,95}, {61,164}, {27,96}, {61,165}, {27,97}, {27,98}, {27,99}, {27,100}, {27,101}, {61,166}, {61,167}, {27,102}, {27,103}, {61,168}, {61,169}, {27,104}, {27,105}, {27,106}, {27,107}, {27,108}, {27,109}, {61,170}, {27,110}, {27,111}, {27,112}, {61,171}, {27,113}, {27,114}, {27,115}, {61,172}, {27,116}, {27,117}, {27,118}, {27,119}, {27,120}, {27,121}, {27,122}, {27,123}, {27,124}, {27,125}, {27,126}, {27,127}, {27,128}, {27,129}, {27,130}, {27,131}, {27,132}, {27,133}, {27,134}, {27,135}, {27,136}, {27,137}, {27,138}, {27,139}, {27,140}, {27,141}, {27,142}, {27,143}, {27,144}, {27,145}, {27,146}, {27,147}, {27,148}, {27,149}, {27,150}, {27,151}, {27,152}, {27,153}, {27,154}, {27,155}, {27,156}, {27,157}, {27,158}, {27,159}, {27,160}, {27,161}, {27,162}, {27,163}, {27,164}, {27,165}, {27,166}, {61,173}, {27,167}, {27,168}, {27,169}, {27,170}, {27,171}, {27,172}, {27,173}, {27,174}, {27,175}, {27,176}, {27,177}, {27,178}, {27,179}, {27,180}, {27,181}, {27,182}, {27,183}, {27,184}, {27,185}, {27,186}, {27,187}, {27,188}, {27,189}, {61,174}, {61,175}, {27,190}, {28,1}, {61,176}, {28,2}, {28,3}, {61,177}, {61,178}, {28,4}, {61,179}, {28,5}, {28,6}, {28,7}, {28,8}, {28,9}, {61,180}, {61,181}, {28,10}, {28,11}, {28,12}, {61,182}, {28,13}, {28,14}, {28,15}, {28,16}, {28,17}, {28,18}, {61,183}, {61,184}, {28,19}, {28,20}, {61,185}, {28,21}, {28,22}, {28,23}, {28,24}, {28,25}, {28,26}, {28,33}, {28,34}, {28,35}, {28,36}, {28,37}, {28,38}, {28,39}, {28,40}, {28,41}, {61,186}, {28,42}, {28,43}, {28,44}, {28,45}, {28,46}, {28,47}, {28,48}, {61,187}, {28,49}, {28,50}, {28,51}, {28,52}, {28,53}, {28,54}, {28,55}, {28,56}, {28,57}, {28,58}, {28,65}, {28,66}, {28,67}, {28,68}, {28,69}, {28,70}, {28,71}, {28,72}, {28,73}, {61,188}, {28,74}, {28,75}, {28,76}, {28,77}, {28,78}, {28,79}, {28,80}, {61,189}, {28,81}, {28,82}, {28,83}, {61,190}, {28,84}, {28,85}, {28,86}, {62,97}, {28,87}, {28,88}, {28,89}, {28,90}, {28,91}, {28,92}, {28,93}, {62,98}, {62,99}, {28,94}, {28,95}, {28,96}, {28,97}, {28,98}, {28,99}, {28,100}, {28,101}, {28,102}, {28,103}, {62,100}, {28,104}, {28,105}, {28,106}, {28,107}, {28,108}, {28,109}, {28,110}, {28,111}, {28,112}, {28,113}, {28,114}, {28,115}, {28,116}, {28,117}, {28,118}, {28,119}, {28,120}, {28,121}, {28,122}, {28,123}, {28,124}, {28,125}, {28,126}, {28,127}, {28,128}, {28,129}, {28,130}, {62,101}, {62,102}, {28,131}, {28,132}, {62,103}, {28,133}, {28,134}, {28,135}, {62,104}, {28,136}, {28,137}, {28,138}, {28,139}, {28,140}, {28,141}, {28,142}, {62,105}, {62,106}, {28,143}, {28,144}, {28,145}, {62,107}, {28,146}, {28,147}, {28,148}, {28,149}, {28,150}, {28,151}, {62,108}, {28,152}, {28,153}, {28,154}, {28,155}, {28,156}, {28,157}, {28,158}, {28,159}, {28,160}, {28,161}, {28,162}, {28,163}, {28,164}, {28,165}, {28,166}, {28,167}, {28,168}, {28,169}, {28,170}, {62,109}, {28,171}, {28,172}, {28,173}, {28,174}, {28,175}, {28,176}, {28,177}, {62,110}, {28,178}, {28,179}, {28,180}, {28,181}, {28,182}, {28,183}, {28,184}, {28,185}, {28,186}, {28,187}, {28,188}, {28,189}, {28,190}, {29,1}, {29,2}, {29,3}, {29,4}, {29,5}, {29,6}, {29,7}, {29,8}, {29,9}, {29,10}, {29,11}, {29,12}, {29,13}, {29,14}, {62,111}, {29,15}, {29,16}, {29,17}, {62,112}, {29,18}, {29,19}, {29,20}, {29,21}, {29,22}, {29,23}, {29,24}, {29,25}, {29,26}, {29,33}, {29,34}, {29,35}, {29,36}, {29,37}, {29,38}, {29,39}, {29,40}, {29,41}, {29,42}, {29,43}, {29,44}, {29,45}, {29,46}, {29,47}, {29,48}, {29,49}, {29,50}, {29,51}, {29,52}, {29,53}, {29,54}, {29,55}, {29,56}, {29,57}, {29,58}, {29,65}, {29,66}, {29,67}, {29,68}, {29,69}, {29,70}, {29,71}, {29,72}, {29,73}, {62,113}, {29,74}, {29,75}, {29,76}, {29,77}, {29,78}, {29,79}, {62,114}, {62,115}, {29,80}, {29,81}, {62,116}, {29,82}, {29,83}, {29,84}, {62,117}, {29,85}, {62,118}, {29,86}, {29,87}, {29,88}, {29,89}, {62,119}, {62,120}, {62,121}, {29,90}, {29,91}, {29,92}, {29,93}, {29,94}, {29,95}, {29,96}, {29,97}, {29,98}, {29,99}, {62,122}, {29,100}, {29,101}, {29,102}, {62,123}, {29,103}, {29,104}, {29,105}, {62,124}, {29,106}, {29,107}, {29,108}, {29,109}, {29,110}, {29,111}, {29,112}, {62,125}, {29,113}, {29,114}, {29,115}, {29,116}, {29,117}, {29,118}, {29,119}, {29,120}, {29,121}, {29,122}, {29,123}, {62,126}, {62,127}, {29,124}, {29,125}, {62,128}, {29,126}, {29,127}, {29,128}, {62,129}, {29,129}, {29,130}, {29,131}, {29,132}, {29,133}, {29,134}, {29,135}, {62,130}, {62,131}, {29,136}, {62,132}, {29,137}, {62,133}, {29,138}, {29,139}, {29,140}, {29,141}, {29,142}, {29,143}, {62,134}, {62,135}, {29,144}, {29,145}, {62,136}, {62,137}, {62,138}, {29,146}, {62,139}, {62,140}, {62,141}, {29,147}, {29,148}, {29,149}, {29,150}, {62,142}, {62,143}, {62,144}, {29,151}, {62,145}, {62,146}, {62,147}, {29,152}, {29,153}, {29,154}, {62,148}, {62,149}, {29,155}, {62,150}, {62,151}, {29,156}, {29,157}, {62,152}, {29,158}, {29,159}, {29,160}, {62,153}, {29,161}, {29,162}, {29,163}, {29,164}, {29,165}, {29,166}, {29,167}, {62,154}, {62,155}, {29,168}, {62,156}, {62,157}, {62,158}, {29,169}, {29,170}, {29,171}, {29,172}, {29,173}, {29,174}, {62,159}, {62,160}, {29,175}, {29,176}, {62,161}, {29,177}, {29,178}, {29,179}, {62,162}, {29,180}, {29,181}, {62,163}, {29,182}, {29,183}, {29,184}, {29,185}, {62,164}, {62,165}, {29,186}, {62,166}, {29,187}, {62,167}, {29,188}, {29,189}, {29,190}, {62,168}, {30,1}, {62,169}, {62,170}, {30,2}, {30,3}, {30,4}, {62,171}, {30,5}, {30,6}, {30,7}, {62,172}, {30,8}, {30,9}, {30,10}, {30,11}, {30,12}, {30,13}, {30,14}, {30,15}, {62,173}, {30,16}, {30,17}, {30,18}, {30,19}, {30,20}, {30,21}, {30,22}, {30,23}, {30,24}, {30,25}, {62,174}, {62,175}, {30,26}, {30,33}, {62,176}, {62,177}, {30,34}, {62,178}, {62,179}, {62,180}, {62,181}, {30,35}, {30,36}, {30,37}, {30,38}, {30,39}, {62,182}, {62,183}, {62,184}, {62,185}, {62,186}, {62,187}, {62,188}, {30,40}, {62,189}, {30,41}, {62,190}, {30,42}, {63,97}, {63,98}, {30,43}, {30,44}, {63,99}, {30,45}, {30,46}, {30,47}, {63,100}, {30,48}, {30,49}, {30,50}, {30,51}, {30,52}, {30,53}, {30,54}, {63,101}, {63,102}, {30,55}, {63,103}, {30,56}, {63,104}, {30,57}, {30,58}, {30,65}, {30,66}, {30,67}, {30,68}, {63,105}, {63,106}, {63,107}, {30,69}, {63,108}, {30,70}, {30,71}, {30,72}, {63,109}, {30,73}, {63,110}, {63,111}, {30,74}, {30,75}, {30,76}, {30,77}, {63,112}, {63,113}, {63,114}, {63,115}, {63,116}, {63,117}, {30,78}, {30,79}, {30,80}, {63,118}, {63,119}, {63,120}, {63,121}, {30,81}, {30,82}, {30,83}, {63,122}, {30,84}, {30,85}, {30,86}, {63,123}, {30,87}, {30,88}, {30,89}, {30,90}, {30,91}, {30,92}, {30,93}, {63,124}, {63,125}, {30,94}, {63,126}, {63,127}, {30,95}, {30,96}, {30,97}, {30,98}, {30,99}, {30,100}, {30,101}, {63,128}, {63,129}, {30,102}, {30,103}, {63,130}, {30,104}, {30,105}, {30,106}, {63,131}, {63,132}, {63,133}, {30,107}, {63,134}, {30,108}, {30,109}, {63,135}, {63,136}, {63,137}, {30,110}, {63,138}, {30,111}, {63,139}, {30,112}, {63,140}, {30,113}, {30,114}, {30,115}, {30,116}, {63,141}, {63,142}, {30,117}, {30,118}, {63,143}, {30,119}, {30,120}, {30,121}, {63,144}, {30,122}, {30,123}, {30,124}, {30,125}, {30,126}, {30,127}, {30,128}, {63,145}, {63,146}, {30,129}, {63,147}, {63,148}, {63,149}, {30,130}, {30,131}, {30,132}, {30,133}, {30,134}, {30,135}, {63,150}, {63,151}, {30,136}, {30,137}, {63,152}, {30,138}, {30,139}, {30,140}, {30,141}, {30,142}, {30,143}, {30,144}, {30,145}, {30,146}, {30,147}, {30,148}, {63,153}, {30,149}, {30,150}, {63,154}, {30,151}, {63,155}, {30,152}, {30,153}, {30,154}, {30,155}, {30,156}, {30,157}, {63,156}, {63,157}, {30,158}, {30,159}, {63,158}, {30,160}, {30,161}, {30,162}, {63,159}, {30,163}, {30,164}, {30,165}, {30,166}, {30,167}, {30,168}, {30,169}, {63,160}, {63,161}, {30,170}, {63,162}, {30,171}, {63,163}, {30,172}, {30,173}, {30,174}, {30,175}, {30,176}, {30,177}, {63,164}, {63,165}, {30,178}, {30,179}, {63,166}, {30,180}, {30,181}, {30,182}, {63,167}, {30,183}, {30,184}, {30,185}, {30,186}, {30,187}, {30,188}, {30,189}, {63,168}, {63,169}, {30,190}, {63,170}, {31,1}, {63,171}, {31,2}, {31,3}, {31,4}, {31,5}, {31,6}, {31,7}, {63,172}, {63,173}, {31,8}, {31,9}, {63,174}, {31,10}, {31,11}, {31,12}, {63,175}, {63,176}, {63,177}, {31,13}, {31,14}, {31,15}, {31,16}, {31,17}, {63,178}, {63,179}, {31,18}, {63,180}, {31,19}, {63,181}, {31,20}, {31,21}, {31,22}, {31,23}, {31,24}, {31,25}, {63,182}, {63,183}, {31,26}, {31,33}, {63,184}, {31,34}, {31,35}, {31,36}, {63,185}, {31,37}, {31,38}, {31,39}, {31,40}, {31,41}, {31,42}, {31,43}, {63,186}, {63,187}, {31,44}, {31,45}, {63,188}, {63,189}, {31,46}, {31,47}, {31,48}, {31,49}, {31,50}, {31,51}, {63,190}, {64,97}, {31,52}, {31,53}, {64,98}, {31,54}, {31,55}, {31,56}, {64,99}, {31,57}, {31,58}, {31,65}, {31,66}, {31,67}, {31,68}, {31,69}, {64,100}, {64,101}, {31,70}, {31,71}, {31,72}, {64,102}, {31,73}, {31,74}, {31,75}, {31,76}, {31,77}, {31,78}, {64,103}, {64,104}, {31,79}, {31,80}, {64,105}, {31,81}, {31,82}, {31,83}, {64,106}, {31,84}, {31,85}, {31,86}, {31,87}, {31,88}, {31,89}, {31,90}, {64,107}, {64,108}, {31,91}, {64,109}, {31,92}, {64,110}, {31,93}, {31,94}, {31,95}, {31,96}, {31,97}, {31,98}, {64,111}, {64,112}, {31,99}, {31,100}, {64,113}, {31,101}, {31,102}, {31,103}, {64,114}, {31,104}, {31,105}, {31,106}, {31,107}, {31,108}, {31,109}, {31,110}, {64,115}, {64,116}, {31,111}, {64,117}, {31,112}, {64,118}, {31,113}, {64,119}, {31,114}, {31,115}, {31,116}, {31,117}, {64,120}, {64,121}, {31,118}, {31,119}, {64,122}, {31,120}, {31,121}, {31,122}, {64,123}, {31,123}, {31,124}, {31,125}, {31,126}, {31,127}, {64,124}, {31,128}, {64,125}, {64,126}, {31,129}, {64,127}, {31,130}, {64,128}, {64,129}, {64,130}, {64,131}, {64,132}, {64,133}, {64,134}, {64,135}, {31,131}, {31,132}, {31,133}, {64,136}, {31,134}, {31,135}, {31,136}, {64,137}, {31,137}, {31,138}, {31,139}, {31,140}, {31,141}, {31,142}, {31,143}, {64,138}, {31,144}, {31,145}, {64,139}, {31,146}, {31,147}, {31,148}, {31,149}, {31,150}, {31,151}, {31,152}, {31,153}, {64,140}, {64,141}, {31,154}, {31,155}, {64,142}, {31,156}, {31,157}, {31,158}, {64,143}, {64,144}, {64,145}, {31,159}, {31,160}, {31,161}, {31,162}, {64,146}, {64,147}, {64,148}, {31,163}, {64,149}, {64,150}, {64,151}, {64,152}, {31,164}, {31,165}, {31,166}, {64,153}, {31,167}, {64,154}, {64,155}, {31,168}, {31,169}, {64,156}, {31,170}, {64,157}, {64,158}, {64,159}, {31,171}, {64,160}, {31,172}, {31,173}, {31,174}, {31,175}, {31,176}, {64,161}, {64,162}, {31,177}, {64,163}, {64,164}, {64,165}, {64,166}, {31,178}, {31,179}, {31,180}, {31,181}, {31,182}, {64,167}, {64,168}, {31,183}, {31,184}, {64,169}, {31,185}, {31,186}, {31,187}, {64,170}, {31,188}, {31,189}, {31,190}, {32,1}, {32,2}, {32,3}, {32,4}, {64,171}, {64,172}, {32,5}, {64,173}, {64,174}, {64,175}, {32,6}, {32,7}, {32,8}, {32,9}, {32,10}, {32,11}, {64,176}, {64,177}, {32,12}, {32,13}, {64,178}, {32,14}, {64,179}, {32,15}, {64,180}, {32,16}, {32,17}, {32,18}, {32,19}, {32,20}, {32,21}, {32,22}, {64,181}, {32,23}, {32,24}, {32,25}, {32,26}, {64,182}, {32,33}, {32,34}, {32,35}, {32,36}, {32,37}, {32,38}, {64,183}, {32,39}, {32,40}, {32,41}, {64,184}, {32,42}, {32,43}, {32,44}, {64,185}, {32,45}, {32,46}, {32,47}, {32,48}, {32,49}, {32,50}, {32,51}, {32,52}, {32,53}, {32,54}, {32,55}, {32,56}, {32,57}, {32,58}, {32,65}, {32,66}, {32,67}, {32,68}, {32,69}, {64,186}, {64,187}, {32,70}, {32,71}, {64,188}, {32,72}, {32,73}, {32,74}, {64,189}, {32,75}, {64,190}, {32,76}, {32,77}, {32,78}, {32,79}, {32,80}, {65,97}, {65,98}, {32,81}, {65,99}, {32,82}, {65,100}, {65,101}, {32,83}, {32,84}, {32,85}, {32,86}, {32,87}, {65,102}, {65,103}, {32,88}, {32,89}, {65,104}, {32,90}, {32,91}, {32,92}, {65,105}, {32,93}, {32,94}, {32,95}, {32,96}, {32,97}, {32,98}, {32,99}, {65,106}, {65,107}, {32,100}, {65,108}, {32,101}, {65,109}, {32,102}, {32,103}, {32,104}, {32,105}, {32,106}, {32,107}, {65,110}, {32,108}, {32,109}, {32,110}, {65,111}, {32,111}, {32,112}, {32,113}, {65,112}, {32,114}, {32,115}, {32,116}, {32,117}, {32,118}, {32,119}, {32,120}, {65,113}, {65,114}, {32,121}, {32,122}, {65,115}, {65,116}, {32,123}, {32,124}, {32,125}, {32,126}, {32,127}, {32,128}, {65,117}, {32,129}, {32,130}, {32,131}, {32,132}, {32,133}, {32,134}, {32,135}, {32,136}, {32,137}, {32,138}, {32,139}, {32,140}, {32,141}, {32,142}, {32,143}, {32,144}, {32,145}, {32,146}, {32,147}, {32,148}, {32,149}, {32,150}, {32,151}, {32,152}, {32,153}, {32,154}, {32,155}, {65,118}, {65,119}, {32,156}, {32,157}, {65,120}, {32,158}, {32,159}, {32,160}, {65,121}, {32,161}, {65,122}, {32,162}, {32,163}, {32,164}, {32,165}, {32,166}, {65,123}, {65,124}, {32,167}, {65,125}, {32,168}, {65,126}, {65,127}, {65,128}, {32,169}, {32,170}, {32,171}, {65,129}, {65,130}, {65,131}, {32,172}, {32,173}, {32,174}, {32,175}, {32,176}, {32,177}, {65,132}, {32,178}, {32,179}, {32,180}, {32,181}, {32,182}, {32,183}, {32,184}, {32,185}, {65,133}, {32,186}, {65,134}, {32,187}, {65,135}, {32,188}, {32,189}, {32,190}, {33,1}, {33,2}, {33,3}, {65,136}, {33,4}, {33,5}, {33,6}, {33,7}, {33,8}, {33,9}, {33,10}, {33,11}, {33,12}, {33,13}, {33,14}, {33,15}, {33,16}, {33,17}, {33,18}, {33,19}, {33,20}, {33,21}, {33,22}, {65,137}, {65,138}, {33,23}, {33,24}, {33,25}, {33,26}, {33,33}, {33,34}, {65,139}, {33,35}, {33,36}, {33,37}, {65,140}, {33,38}, {33,39}, {33,40}, {65,141}, {33,41}, {33,42}, {33,43}, {33,44}, {33,45}, {33,46}, {33,47}, {65,142}, {65,143}, {33,48}, {65,144}, {33,49}, {65,145}, {33,50}, {33,51}, {33,52}, {33,53}, {33,54}, {33,55}, {65,146}, {65,147}, {33,56}, {33,57}, {65,148}, {33,58}, {33,65}, {33,66}, {33,67}, {33,68}, {33,69}, {33,70}, {33,71}, {33,72}, {33,73}, {33,74}, {33,75}, {33,76}, {33,77}, {33,78}, {33,79}, {65,149}, {33,80}, {33,81}, {33,82}, {33,83}, {33,84}, {33,85}, {65,150}, {65,151}, {33,86}, {33,87}, {65,152}, {33,88}, {33,89}, {33,90}, {65,153}, {65,154}, {65,155}, {33,91}, {33,92}, {33,93}, {33,94}, {33,95}, {65,156}, {65,157}, {33,96}, {65,158}, {34,1}, {65,159}, {34,2}, {34,3}, {34,4}, {34,5}, {34,6}, {34,7}, {65,160}, {34,8}, {34,9}, {34,10}, {34,11}, {34,12}, {34,13}, {34,14}, {34,15}, {34,16}, {34,17}, {34,18}, {34,19}, {34,20}, {34,21}, {34,22}, {34,23}, {34,24}, {34,25}, {34,26}, {65,161}, {34,33}, {34,34}, {34,35}, {34,36}, {34,37}, {34,38}, {34,39}, {65,162}, {34,40}, {34,41}, {34,42}, {34,43}, {34,44}, {34,45}, {34,46}, {34,47}, {34,48}, {34,49}, {34,50}, {34,51}, {34,52}, {34,53}, {34,54}, {34,55}, {34,56}, {34,57}, {34,58}, {34,65}, {34,66}, {34,67}, {34,68}, {34,69}, {34,70}, {34,71}, {34,72}, {65,163}, {65,164}, {34,73}, {34,74}, {65,165}, {34,75}, {34,76}, {34,77}, {65,166}, {34,78}, {34,79}, {34,80}, {34,81}, {34,82}, {34,83}, {34,84}, {65,167}, {65,168}, {34,85}, {65,169}, {34,86}, {34,87}, {34,88}, {34,89}, {34,90}, {34,91}, {34,92}, {34,93}, {65,170}, {34,94}, {34,95}, {34,96}, {65,171}, {35,1}, {35,2}, {35,3}, {65,172}, {35,4}, {35,5}, {35,6}, {35,7}, {35,8}, {35,9}, {35,10}, {65,173}, {35,11}, {35,12}, {35,13}, {35,14}, {35,15}, {35,16}, {35,17}, {35,18}, {35,19}, {35,20}, {35,21}, {65,174}, {65,175}, {35,22}, {35,23}, {65,176}, {35,24}, {35,25}, {35,26}, {65,177}, {35,33}, {35,34}, {35,35}, {35,36}, {35,37}, {35,38}, {35,39}, {65,178}, {65,179}, {35,40}, {65,180}, {35,41}, {65,181}, {35,42}, {35,43}, {35,44}, {35,45}, {35,46}, {35,47}, {35,48}, {35,49}, {35,50}, {35,51}, {35,52}, {35,53}, {35,54}, {35,55}, {35,56}, {35,57}, {35,58}, {35,65}, {35,66}, {35,67}, {35,68}, {35,69}, {35,70}, {35,71}, {35,72}, {35,73}, {35,74}, {35,75}, {35,76}, {35,77}, {35,78}, {35,79}, {35,80}, {35,81}, {65,182}, {65,183}, {35,82}, {35,83}, {65,184}, {35,84}, {35,85}, {65,185}, {65,186}, {35,86}, {65,187}, {35,87}, {35,88}, {35,89}, {35,90}, {35,91}, {65,188}, {65,189}, {35,92}, {65,190}, {35,93}, {66,97}, {66,98}, {35,94}, {35,95}, {66,99}, {66,100}, {35,96}, {66,101}, {66,102}, {36,1}, {36,2}, {66,103}, {36,3}, {66,104}, {36,4}, {66,105}, {36,5}, {36,6}, {66,106}, {36,7}, {36,8}, {36,9}, {36,10}, {66,107}, {66,108}, {36,11}, {66,109}, {66,110}, {66,111}, {36,12}, {36,13}, {36,14}, {36,15}, {36,16}, {36,17}, {66,112}, {66,113}, {36,18}, {36,19}, {66,114}, {36,20}, {36,21}, {36,22}, {66,115}, {36,23}, {36,24}, {36,25}, {36,26}, {36,33}, {36,34}, {36,35}, {66,116}, {66,117}, {36,36}, {66,118}, {66,119}, {66,120}, {36,37}, {36,38}, {36,39}, {36,40}, {36,41}, {36,42}, {66,121}, {36,43}, {36,44}, {36,45}, {66,122}, {36,46}, {36,47}, {36,48}, {36,49}, {36,50}, {36,51}, {36,52}, {36,53}, {36,54}, {36,55}, {36,56}, {36,57}, {36,58}, {36,65}, {36,66}, {36,67}, {66,123}, {36,68}, {36,69}, {36,70}, {36,71}, {36,72}, {36,73}, {36,74}, {36,75}, {36,76}, {36,77}, {36,78}, {36,79}, {36,80}, {36,81}, {36,82}, {36,83}, {36,84}, {36,85}, {36,86}, {36,87}, {36,88}, {36,89}, {36,90}, {36,91}, {36,92}, {36,93}, {36,94}, {36,95}, {36,96}, {37,1}, {37,2}, {37,3}, {37,4}, {37,5}, {66,124}, {66,125}, {37,6}, {37,7}, {66,126}, {37,8}, {37,9}, {37,10}, {66,127}, {37,11}, {37,12}, {37,13}, {37,14}, {37,15}, {37,16}, {37,17}, {66,128}, {66,129}, {37,18}, {66,130}, {66,131}, {66,132}, {37,19}, {37,20}, {37,21}, {37,22}, {37,23}, {37,24}, {66,133}, {37,25}, {37,26}, {37,33}, {37,34}, {37,35}, {37,36}, {37,37}, {37,38}, {37,39}, {37,40}, {37,41}, {37,42}, {37,43}, {37,44}, {37,45}, {37,46}, {37,47}, {37,48}, {37,49}, {37,50}, {66,134}, {37,51}, {37,52}, {37,53}, {37,54}, {37,55}, {37,56}, {66,135}, {37,57}, {37,58}, {37,65}, {37,66}, {37,67}, {37,68}, {37,69}, {37,70}, {37,71}, {37,72}, {37,73}, {37,74}, {37,75}, {37,76}, {37,77}, {37,78}, {37,79}, {37,80}, {37,81}, {66,136}, {37,82}, {37,83}, {37,84}, {37,85}, {37,86}, {37,87}, {37,88}, {37,89}, {37,90}, {37,91}, {37,92}, {37,93}, {37,94}, {37,95}, {37,96}, {38,1}, {38,2}, {38,3}, {38,4}, {38,5}, {38,6}, {38,7}, {38,8}, {38,9}, {38,10}, {38,11}, {38,12}, {38,13}, {38,14}, {38,15}, {38,16}, {38,17}, {38,18}, {38,19}, {38,20}, {66,137}, {66,138}, {38,21}, {38,22}, {66,139}, {38,23}, {38,24}, {38,25}, {66,140}, {38,26}, {38,33}, {38,34}, {38,35}, {38,36}, {38,37}, {38,38}, {66,141}, {66,142}, {38,39}, {66,143}, {38,40}, {66,144}, {38,41}, {66,145}, {38,42}, {38,43}, {38,44}, {38,45}, {66,146}, {66,147}, {38,46}, {38,47}, {38,48}, {38,49}, {38,50}, {38,51}, {66,148}, {38,52}, {38,53}, {38,54}, {38,55}, {38,56}, {38,57}, {38,58}, {38,65}, {38,66}, {38,67}, {38,68}, {66,149}, {38,69}, {38,70}, {38,71}, {38,72}, {38,73}, {38,74}, {38,75}, {66,150}, {38,76}, {38,77}, {38,78}, {38,79}, {38,80}, {38,81}, {38,82}, {38,83}, {38,84}, {38,85}, {38,86}, {38,87}, {38,88}, {38,89}, {38,90}, {38,91}, {38,92}, {38,93}, {38,94}, {66,151}, {38,95}, {38,96}, {39,1}, {39,2}, {39,3}, {39,4}, {39,5}, {66,152}, {39,6}, {39,7}, {39,8}, {66,153}, {39,9}, {39,10}, {39,11}, {66,154}, {39,12}, {39,13}, {39,14}, {39,15}, {39,16}, {39,17}, {39,18}, {66,155}, {66,156}, {39,19}, {39,20}, {39,21}, {39,22}, {39,23}, {39,24}, {39,25}, {39,26}, {39,33}, {39,34}, {39,35}, {39,36}, {39,37}, {39,38}, {39,39}, {39,40}, {39,41}, {39,42}, {39,43}, {39,44}, {39,45}, {39,46}, {39,47}, {39,48}, {39,49}, {39,50}, {39,51}, {39,52}, {39,53}, {39,54}, {39,55}, {66,157}, {39,56}, {39,57}, {39,58}, {39,65}, {39,66}, {39,67}, {66,158}, {66,159}, {39,68}, {39,69}, {66,160}, {39,70}, {39,71}, {39,72}, {66,161}, {39,73}, {39,74}, {39,75}, {39,76}, {39,77}, {39,78}, {39,79}, {66,162}, {66,163}, {39,80}, {39,81}, {39,82}, {66,164}, {39,83}, {39,84}, {39,85}, {39,86}, {39,87}, {39,88}, {66,165}, {39,89}, {39,90}, {39,91}, {39,92}, {39,93}, {39,94}, {39,95}, {39,96}, {40,1}, {40,2}, {40,3}, {40,4}, {40,5}, {40,6}, {40,7}, {40,8}, {40,9}, {40,10}, {40,11}, {66,166}, {66,167}, {40,12}, {40,13}, {40,14}, {40,15}, {40,16}, {40,17}, {40,18}, {40,19}, {40,20}, {40,21}, {40,22}, {40,23}, {40,24}, {40,25}, {40,26}, {40,33}, {40,34}, {40,35}, {40,36}, {40,37}, {40,38}, {40,39}, {40,40}, {40,41}, {40,42}, {40,43}, {40,44}, {40,45}, {40,46}, {40,47}, {40,48}, {40,49}, {40,50}, {40,51}, {66,168}, {40,52}, {40,53}, {40,54}, {40,55}, {40,56}, {40,57}, {40,58}, {40,65}, {40,66}, {40,67}, {40,68}, {40,69}, {40,70}, {40,71}, {40,72}, {40,73}, {40,74}, {40,75}, {40,76}, {40,77}, {40,78}, {40,79}, {40,80}, {40,81}, {40,82}, {40,83}, {40,84}, {66,169}, {40,85}, {40,86}, {40,87}, {40,88}, {40,89}, {40,90}, {40,91}, {40,92}, {40,93}, {40,94}, {40,95}, {40,96}, {41,1}, {41,2}, {41,3}, {41,4}, {41,5}, {41,6}, {41,7}, {41,8}, {41,9}, {41,10}, {41,11}, {41,12}, {41,13}, {41,14}, {41,15}, {66,170}, {41,16}, {41,17}, {41,18}, {41,19}, {41,20}, {41,21}, {41,22}, {41,23}, {41,24}, {41,25}, {41,26}, {41,33}, {41,34}, {41,35}, {41,36}, {66,171}, {41,37}, {41,38}, {66,172}, {41,39}, {66,173}, {41,40}, {41,41}, {41,42}, {41,43}, {41,44}, {41,45}, {41,46}, {41,47}, {41,48}, {41,49}, {41,50}, {41,51}, {41,52}, {41,53}, {41,54}, {41,55}, {41,56}, {41,57}, {41,58}, {41,65}, {41,66}, {41,67}, {41,68}, {41,69}, {41,70}, {41,71}, {41,72}, {41,73}, {41,74}, {41,75}, {41,76}, {41,77}, {41,78}, {41,79}, {66,174}, {66,175}, {41,80}, {41,81}, {66,176}, {41,82}, {41,83}, {41,84}, {66,177}, {41,85}, {41,86}, {41,87}, {41,88}, {41,89}, {41,90}, {41,91}, {66,178}, {66,179}, {41,92}, {41,93}, {41,94}, {66,180}, {66,181}, {41,95}, {41,96}, {42,1}, {42,2}, {66,182}, {66,183}, {66,184}, {42,3}, {42,4}, {66,185}, {42,5}, {66,186}, {42,6}, {66,187}, {42,7}, {42,8}, {42,9}, {42,10}, {42,11}, {42,12}, {42,13}, {66,188}, {66,189}, {42,14}, {66,190}, {67,97}, {67,98}, {67,99}, {42,15}, {42,16}, {42,17}, {42,18}, {42,19}, {67,100}, {67,101}, {42,20}, {42,21}, {67,102}, {42,22}, {42,23}, {42,24}, {67,103}, {42,25}, {42,26}, {42,33}, {42,34}, {42,35}, {42,36}, {42,37}, {67,104}, {67,105}, {42,38}, {67,106}, {67,107}, {67,108}, {42,39}, {42,40}, {42,41}, {42,42}, {42,43}, {42,44}, {67,109}, {42,45}, {42,46}, {42,47}, {67,110}, {42,48}, {67,111}, {42,49}, {67,112}, {42,50}, {42,51}, {42,52}, {42,53}, {42,54}, {42,55}, {42,56}, {67,113}, {42,57}, {42,58}, {42,65}, {42,66}, {67,114}, {42,67}, {42,68}, {42,69}, {42,70}, {42,71}, {42,72}, {42,73}, {42,74}, {42,75}, {42,76}, {42,77}, {42,78}, {42,79}, {42,80}, {42,81}, {42,82}, {42,83}, {42,84}, {42,85}, {42,86}, {42,87}, {42,88}, {42,89}, {42,90}, {42,91}, {42,92}, {42,93}, {42,94}, {42,95}, {42,96}, {43,1}, {43,2}, {43,3}, {43,4}, {67,115}, {67,116}, {43,5}, {43,6}, {67,117}, {43,7}, {43,8}, {43,9}, {67,118}, {43,10}, {43,11}, {43,12}, {43,13}, {43,14}, {43,15}, {43,16}, {67,119}, {67,120}, {43,17}, {67,121}, {67,122}, {67,123}, {43,18}, {43,19}, {43,20}, {43,21}, {43,22}, {43,23}, {67,124}, {67,125}, {43,24}, {43,25}, {67,126}, {43,26}, {43,33}, {43,34}, {67,127}, {43,35}, {43,36}, {43,37}, {43,38}, {43,39}, {43,40}, {43,41}, {67,128}, {67,129}, {43,42}, {67,130}, {43,43}, {67,131}, {43,44}, {43,45}, {43,46}, {43,47}, {43,48}, {43,49}, {67,132}, {43,50}, {43,51}, {43,52}, {67,133}, {43,53}, {43,54}, {43,55}, {43,56}, {43,57}, {43,58}, {43,65}, {43,66}, {43,67}, {43,68}, {43,69}, {43,70}, {43,71}, {43,72}, {43,73}, {67,134}, {43,74}, {43,75}, {43,76}, {43,77}, {43,78}, {43,79}, {43,80}, {67,135}, {43,81}, {43,82}, {43,83}, {67,136}, {43,84}, {43,85}, {43,86}, {43,87}, {43,88}, {43,89}, {43,90}, {43,91}, {43,92}, {43,93}, {43,94}, {43,95}, {43,96}, {44,1}, {44,2}, {44,3}, {67,137}, {44,4}, {44,5}, {44,6}, {44,7}, {44,8}, {44,9}, {67,138}, {67,139}, {44,10}, {44,11}, {67,140}, {44,12}, {44,13}, {44,14}, {67,141}, {44,15}, {44,16}, {44,17}, {44,18}, {44,19}, {44,20}, {44,21}, {67,142}, {67,143}, {44,22}, {67,144}, {44,23}, {67,145}, {44,24}, {44,25}, {44,26}, {44,33}, {44,34}, {44,35}, {67,146}, {44,36}, {44,37}, {44,38}, {67,147}, {44,39}, {44,40}, {44,41}, {67,148}, {44,42}, {44,43}, {44,44}, {44,45}, {44,46}, {44,47}, {44,48}, {44,49}, {44,50}, {44,51}, {44,52}, {44,53}, {67,149}, {44,54}, {44,55}, {44,56}, {44,57}, {44,58}, {44,65}, {44,66}, {44,67}, {44,68}, {44,69}, {44,70}, {44,71}, {44,72}, {44,73}, {44,74}, {44,75}, {44,76}, {44,77}, {44,78}, {44,79}, {44,80}, {44,81}, {44,82}, {44,83}, {44,84}, {44,85}, {44,86}, {44,87}, {44,88}, {44,89}, {44,90}, {44,91}, {44,92}, {44,93}, {67,150}, {44,94}, {44,95}, {44,96}, {67,151}, {45,1}, {45,2}, {45,3}, {67,152}, {45,4}, {45,5}, {45,6}, {45,7}, {45,8}, {45,9}, {45,10}, {67,153}, {67,154}, {45,11}, {67,155}, {45,12}, {67,156}, {45,13}, {45,14}, {45,15}, {45,16}, {45,17}, {45,18}, {67,157}, {45,19}, {45,20}, {45,21}, {45,22}, {45,23}, {45,24}, {45,25}, {45,26}, {45,33}, {45,34}, {45,35}, {45,36}, {45,37}, {45,38}, {45,39}, {67,158}, {45,40}, {45,41}, {45,42}, {45,43}, {45,44}, {45,45}, {45,46}, {45,47}, {45,48}, {45,49}, {45,50}, {67,159}, {67,160}, {45,51}, {45,52}, {67,161}, {45,53}, {45,54}, {45,55}, {67,162}, {45,56}, {45,57}, {45,58}, {45,65}, {45,66}, {45,67}, {45,68}, {67,163}, {67,164}, {45,69}, {67,165}, {45,70}, {67,166}, {45,71}, {45,72}, {45,73}, {45,74}, {45,75}, {45,76}, {67,167}, {45,77}, {45,78}, {45,79}, {45,80}, {45,81}, {45,82}, {45,83}, {45,84}, {45,85}, {45,86}, {45,87}, {45,88}, {45,89}, {45,90}, {45,91}, {45,92}, {45,93}, {45,94}, {45,95}, {67,168}, {45,96}, {46,1}, {46,2}, {46,3}, {46,4}, {46,5}, {46,6}, {67,169}, {46,7}, {46,8}, {46,9}, {67,170}, {46,10}, {46,11}, {46,12}, {46,13}, {46,14}, {46,15}, {46,16}, {46,17}, {46,18}, {46,19}, {46,20}, {46,21}, {46,22}, {46,23}, {46,24}, {46,25}, {46,26}, {46,33}, {46,34}, {46,35}, {46,36}, {46,37}, {46,38}, {67,171}, {46,39}, {46,40}, {46,41}, {67,172}, {46,42}, {46,43}, {46,44}, {67,173}, {46,45}, {46,46}, {46,47}, {46,48}, {46,49}, {46,50}, {46,51}, {67,174}, {67,175}, {46,52}, {67,176}, {46,53}, {67,177}, {46,54}, {46,55}, {46,56}, {46,57}, {46,58}, {46,65}, {67,178}, {46,66}, {46,67}, {46,68}, {67,179}, {46,69}, {46,70}, {46,71}, {67,180}, {46,72}, {46,73}, {46,74}, {46,75}, {46,76}, {46,77}, {46,78}, {67,181}, {46,79}, {46,80}, {46,81}, {46,82}, {67,182}, {46,83}, {46,84}, {46,85}, {46,86}, {46,87}, {46,88}, {67,183}, {67,184}, {46,89}, {46,90}, {67,185}, {46,91}, {46,92}, {46,93}, {67,186}, {46,94}, {46,95}, {46,96}, {47,1}, {47,2}, {47,3}, {47,4}, {67,187}, {67,188}, {47,5}, {67,189}, {47,6}, {67,190}, {47,7}, {47,8}, {47,9}, {47,10}, {47,11}, {47,12}, {47,13}, {47,14}, {47,15}, {47,16}, {47,17}, {47,18}, {47,19}, {47,20}, {47,21}, {47,22}, {47,23}, {47,24}, {47,25}, {47,26}, {47,33}, {47,34}, {47,35}, {47,36}, {47,37}, {47,38}, {47,39}, {47,40}, {47,41}, {47,42}, {47,43}, {47,44}, {47,45}, {47,46}, {68,97}, {68,98}, {47,47}, {47,48}, {68,99}, {47,49}, {47,50}, {68,100}, {68,101}, {68,102}, {47,51}, {47,52}, {47,53}, {47,54}, {47,55}, {47,56}, {68,103}, {68,104}, {47,57}, {68,105}, {47,58}, {68,106}, {47,65}, {47,66}, {47,67}, {47,68}, {47,69}, {47,70}, {68,107}, {68,108}, {47,71}, {47,72}, {68,109}, {47,73}, {47,74}, {47,75}, {68,110}, {47,76}, {47,77}, {47,78}, {47,79}, {47,80}, {47,81}, {47,82}, {68,111}, {68,112}, {47,83}, {68,113}, {47,84}, {68,114}, {47,85}, {47,86}, {47,87}, {47,88}, {47,89}, {47,90}, {68,115}, {68,116}, {47,91}, {47,92}, {68,117}, {47,93}, {47,94}, {47,95}, {68,118}, {47,96}, {48,1}, {48,2}, {48,3}, {48,4}, {48,5}, {48,6}, {68,119}, {68,120}, {48,7}, {68,121}, {68,122}, {68,123}, {48,8}, {48,9}, {48,10}, {48,11}, {48,12}, {48,13}, {68,124}, {68,125}, {48,14}, {48,15}, {48,16}, {48,17}, {48,18}, {48,19}, {48,20}, {48,21}, {48,22}, {48,23}, {48,24}, {48,25}, {48,26}, {48,33}, {48,34}, {48,35}, {48,36}, {48,37}, {48,38}, {68,126}, {48,39}, {48,40}, {48,41}, {48,42}, {48,43}, {48,44}, {48,45}, {48,46}, {48,47}, {48,48}, {48,49}, {48,50}, {48,51}, {48,52}, {48,53}, {48,54}, {48,55}, {48,56}, {48,57}, {48,58}, {48,65}, {48,66}, {48,67}, {48,68}, {48,69}, {48,70}, {48,71}, {48,72}, {48,73}, {48,74}, {48,75}, {48,76}, {48,77}, {48,78}, {68,127}, {68,128}, {48,79}, {48,80}, {68,129}, {48,81}, {48,82}, {68,130}, {68,131}, {48,83}, {48,84}, {48,85}, {48,86}, {48,87}, {48,88}, {48,89}, {68,132}, {68,133}, {48,90}, {68,134}, {68,135}, {68,136}, {48,91}, {48,92}, {48,93}, {48,94}, {48,95}, {48,96}, {68,137}, {68,138}, {49,1}, {49,2}, {68,139}, {49,3}, {49,4}, {49,5}, {68,140}, {49,6}, {49,7}, {49,8}, {49,9}, {49,10}, {49,11}, {49,12}, {68,141}, {68,142}, {49,13}, {68,143}, {49,14}, {68,144}, {49,15}, {49,16}, {49,17}, {49,18}, {49,19}, {49,20}, {68,145}, {49,21}, {49,22}, {49,23}, {68,146}, {49,24}, {49,25}, {49,26}, {68,147}, {49,33}, {49,34}, {49,35}, {49,36}, {49,37}, {49,38}, {49,39}, {68,148}, {68,149}, {49,40}, {68,150}, {68,151}, {68,152}, {49,41}, {49,42}, {49,43}, {49,44}, {49,45}, {49,46}, {68,153}, {49,47}, {49,48}, {49,49}, {49,50}, {49,51}, {49,52}, {49,53}, {49,54}, {49,55}, {49,56}, {49,57}, {49,58}, {49,65}, {49,66}, {49,67}, {49,68}, {49,69}, {49,70}, {49,71}, {49,72}, {49,73}, {49,74}, {49,75}, {49,76}, {49,77}, {49,78}, {49,79}, {68,154}, {68,155}, {49,80}, {49,81}, {68,156}, {49,82}, {49,83}, {49,84}, {68,157}, {49,85}, {49,86}, {49,87}, {49,88}, {49,89}, {49,90}, {49,91}, {68,158}, {68,159}, {49,92}, {68,160}, {49,93}, {68,161}, {49,94}, {49,95}, {49,96}, {50,1}, {50,2}, {50,3}, {68,162}, {68,163}, {50,4}, {50,5}, {68,164}, {50,6}, {50,7}, {50,8}, {68,165}, {50,9}, {50,10}, {50,11}, {50,12}, {50,13}, {50,14}, {50,15}, {68,166}, {50,16}, {50,17}, {50,18}, {50,19}, {68,167}, {50,20}, {50,21}, {50,22}, {50,23}, {50,24}, {50,25}, {68,168}, {50,26}, {50,33}, {50,34}, {50,35}, {50,36}, {50,37}, {50,38}, {50,39}, {50,40}, {50,41}, {50,42}, {50,43}, {50,44}, {50,45}, {50,46}, {50,47}, {50,48}, {50,49}, {50,50}, {50,51}, {68,169}, {50,52}, {50,53}, {50,54}, {50,55}, {50,56}, {50,57}, {68,170}, {50,58}, {50,65}, {50,66}, {50,67}, {50,68}, {50,69}, {50,70}, {68,171}, {50,71}, {50,72}, {50,73}, {50,74}, {50,75}, {50,76}, {50,77}, {50,78}, {50,79}, {50,80}, {50,81}, {50,82}, {50,83}, {50,84}, {50,85}, {50,86}, {50,87}, {50,88}, {50,89}, {68,172}, {50,90}, {50,91}, {50,92}, {50,93}, {50,94}, {50,95}, {50,96}, {51,1}, {51,2}, {51,3}, {51,4}, {51,5}, {51,6}, {51,7}, {51,8}, {51,9}, {51,10}, {51,11}, {51,12}, {51,13}, {51,14}, {51,15}, {51,16}, {51,17}, {51,18}, {51,19}, {51,20}, {68,173}, {68,174}, {51,21}, {51,22}, {68,175}, {51,23}, {51,24}, {51,25}, {68,176}, {51,26}, {51,33}, {51,34}, {51,35}, {51,36}, {51,37}, {51,38}, {68,177}, {68,178}, {51,39}, {68,179}, {51,40}, {68,180}, {51,41}, {51,42}, {51,43}, {51,44}, {51,45}, {51,46}, {68,181}, {51,47}, {51,48}, {51,49}, {68,182}, {51,50}, {51,51}, {51,52}, {68,183}, {51,53}, {51,54}, {51,55}, {51,56}, {51,57}, {51,58}, {51,65}, {51,66}, {51,67}, {51,68}, {51,69}, {51,70}, {68,184}, {51,71}, {51,72}, {51,73}, {51,74}, {51,75}, {51,76}, {68,185}, {51,77}, {51,78}, {51,79}, {51,80}, {51,81}, {51,82}, {51,83}, {51,84}, {51,85}, {51,86}, {51,87}, {51,88}, {51,89}, {51,90}, {51,91}, {51,92}, {51,93}, {51,94}, {51,95}, {51,96}, {68,186}, {52,1}, {52,2}, {52,3}, {52,4}, {52,5}, {52,6}, {68,187}, {68,188}, {52,7}, {52,8}, {68,189}, {52,9}, {52,10}, {52,11}, {68,190}, {52,12}, {52,13}, {52,14}, {52,15}, {52,16}, {52,17}, {52,18}, {69,97}, {69,98}, {52,19}, {69,99}, {52,20}, {69,100}, {52,21}, {52,22}, {52,23}, {52,24}, {52,25}, {52,26}, {69,101}, {52,33}, {52,34}, {52,35}, {69,102}, {52,36}, {52,37}, {52,38}, {69,103}, {52,39}, {52,40}, {52,41}, {52,42}, {52,43}, {52,44}, {52,45}, {69,104}, {52,46}, {52,47}, {52,48}, {52,49}, {52,50}, {52,51}, {52,52}, {52,53}, {52,54}, {52,55}, {52,56}, {69,105}, {69,106}, {52,57}, {52,58}, {69,107}, {52,65}, {52,66}, {52,67}, {69,108}, {52,68}, {52,69}, {52,70}, {52,71}, {52,72}, {52,73}, {52,74}, {69,109}, {69,110}, {52,75}, {52,76}, {52,77}, {69,111}, {52,78}, {52,79}, {52,80}, {52,81}, {52,82}, {52,83}, {52,84}, {52,85}, {52,86}, {52,87}, {52,88}, {52,89}, {52,90}, {52,91}, {52,92}, {52,93}, {52,94}, {52,95}, {52,96}, {53,1}, {53,2}, {53,3}, {53,4}, {53,5}, {53,6}, {53,7}, {53,8}, {53,9}, {53,10}, {53,11}, {53,12}, {53,13}, {53,14}, {53,15}, {69,112}, {69,113}, {53,16}, {53,17}, {69,114}, {53,18}, {53,19}, {53,20}, {69,115}, {53,21}, {53,22}, {53,23}, {53,24}, {53,25}, {53,26}, {53,33}, {69,116}, {69,117}, {53,34}, {69,118}, {53,35}, {69,119}, {53,36}, {53,37}, {53,38}, {53,39}, {53,40}, {53,41}, {69,120}, {69,121}, {53,42}, {53,43}, {69,122}, {53,44}, {53,45}, {53,46}, {69,123}, {69,124}, {53,47}, {53,48}, {53,49}, {53,50}, {53,51}, {53,52}, {69,125}, {69,126}, {53,53}, {69,127}, {69,128}, {69,129}, {53,54}, {53,55}, {53,56}, {53,57}, {53,58}, {53,65}, {69,130}, {69,131}, {53,66}, {53,67}, {69,132}, {53,68}, {53,69}, {53,70}, {69,133}, {53,71}, {53,72}, {53,73}, {53,74}, {53,75}, {53,76}, {53,77}, {69,134}, {69,135}, {53,78}, {69,136}, {69,137}, {69,138}, {53,79}, {53,80}, {53,81}, {53,82}, {53,83}, {53,84}, {69,139}, {53,85}, {53,86}, {53,87}, {53,88}, {53,89}, {53,90}, {53,91}, {53,92}, {53,93}, {53,94}, {53,95}, {53,96}, {54,1}, {54,2}, {54,3}, {54,4}, {54,5}, {54,6}, {54,7}, {54,8}, {69,140}, {54,9}, {54,10}, {54,11}, {54,12}, {54,13}, {54,14}, {54,15}, {54,16}, {54,17}, {54,18}, {54,19}, {54,20}, {54,21}, {54,22}, {54,23}, {54,24}, {54,25}, {54,26}, {54,33}, {54,34}, {54,35}, {54,36}, {54,37}, {54,38}, {54,39}, {54,40}, {54,41}, {54,42}, {54,43}, {54,44}, {54,45}, {54,46}, {54,47}, {54,48}, {69,141}, {69,142}, {54,49}, {54,50}, {69,143}, {54,51}, {54,52}, {54,53}, {69,144}, {54,54}, {69,145}, {54,55}, {54,56}, {54,57}, {54,58}, {54,65}, {69,146}, {69,147}, {54,66}, {69,148}, {69,149}, {69,150}, {54,67}, {54,68}, {54,69}, {54,70}, {54,71}, {54,72}, {69,151}, {69,152}, {54,73}, {54,74}, {69,153}, {54,75}, {54,76}, {54,77}, {69,154}, {54,78}, {54,79}, {54,80}, {54,81}, {54,82}, {54,83}, {54,84}, {69,155}, {69,156}, {54,85}, {69,157}, {54,86}, {69,158}, {54,87}, {54,88}, {54,89}, {54,90}, {54,91}, {54,92}, {69,159}, {54,93}, {54,94}, {54,95}, {69,160}, {54,96}, {55,1}, {55,2}, {55,3}, {55,4}, {55,5}, {55,6}, {55,7}, {55,8}, {55,9}, {55,10}, {55,11}, {55,12}, {55,13}, {55,14}, {69,161}, {55,15}, {55,16}, {55,17}, {55,18}, {55,19}, {55,20}, {55,21}, {69,162}, {55,22}, {55,23}, {55,24}, {69,163}, {55,25}, {55,26}, {55,33}, {55,34}, {55,35}, {55,36}, {55,37}, {55,38}, {55,39}, {55,40}, {55,41}, {55,42}, {55,43}, {55,44}, {55,45}, {55,46}, {55,47}, {55,48}, {55,49}, {55,50}, {55,51}, {55,52}, {55,53}, {69,164}, {69,165}, {55,54}, {55,55}, {69,166}, {55,56}, {55,57}, {55,58}, {69,167}, {55,65}, {55,66}, {55,67}, {55,68}, {55,69}, {55,70}, {55,71}, {69,168}, {69,169}, {55,72}, {69,170}, {55,73}, {69,171}, {55,74}, {55,75}, {55,76}, {55,77}, {69,172}, {55,78}, {69,173}, {55,79}, {55,80}, {55,81}, {69,174}, {55,82}, {55,83}, {55,84}, {55,85}, {55,86}, {55,87}, {55,88}, {55,89}, {55,90}, {55,91}, {55,92}, {55,93}, {55,94}, {55,95}, {55,96}, {56,1}, {56,2}, {56,3}, {56,4}, {56,5}, {56,6}, {56,7}, {56,8}, {69,175}, {56,9}, {56,10}, {56,11}, {56,12}, {56,13}, {56,14}, {56,15}, {56,16}, {56,17}, {56,18}, {56,19}, {56,20}, {56,21}, {56,22}, {56,23}, {56,24}, {56,25}, {56,26}, {56,33}, {56,34}, {56,35}, {56,36}, {56,37}, {56,38}, {56,39}, {56,40}, {56,41}, {69,176}, {56,42}, {56,43}, {56,44}, {69,177}, {56,45}, {56,46}, {56,47}, {56,48}, {56,49}, {56,50}, {56,51}, {56,52}, {56,53}, {56,54}, {56,55}, {56,56}, {56,57}, {56,58}, {69,178}, {56,65}, {69,179}, {56,66}, {56,67}, {56,68}, {56,69}, {56,70}, {56,71}, {69,180}, {56,72}, {56,73}, {56,74}, {56,75}, {56,76}, {56,77}, {56,78}, {56,79}, {56,80}, {56,81}, {56,82}, {56,83}, {56,84}, {56,85}, {56,86}, {56,87}, {56,88}, {56,89}, {56,90}, {56,91}, {56,92}, {56,93}, {56,94}, {56,95}, {56,96}, {57,1}, {57,2}, {69,181}, {69,182}, {57,3}, {57,4}, {69,183}, {57,5}, {57,6}, {57,7}, {69,184}, {57,8}, {57,9}, {57,10}, {57,11}, {57,12}, {57,13}, {57,14}, {69,185}, {69,186}, {57,15}, {69,187}, {57,16}, {69,188}, {57,17}, {57,18}, {57,19}, {57,20}, {57,21}, {57,22}, {69,189}, {57,23}, {57,24}, {57,25}, {57,26}, {57,33}, {57,34}, {57,35}, {57,36}, {57,37}, {57,38}, {57,39}, {57,40}, {57,41}, {57,42}, {57,43}, {57,44}, {57,45}, {57,46}, {57,47}, {69,190}, {57,48}, {57,49}, {57,50}, {57,51}, {57,52}, {57,53}, {57,54}, {70,97}, {57,55}, {57,56}, {57,57}, {57,58}, {57,65}, {57,66}, {57,67}, {57,68}, {57,69}, {57,70}, {57,71}, {57,72}, {57,73}, {57,74}, {57,75}, {57,76}, {57,77}, {57,78}, {57,79}, {57,80}, {57,81}, {57,82}, {57,83}, {57,84}, {57,85}, {57,86}, {57,87}, {70,98}, {70,99}, {57,88}, {57,89}, {70,100}, {57,90}, {57,91}, {57,92}, {70,101}, {57,93}, {57,94}, {57,95}, {57,96}, {58,1}, {58,2}, {58,3}, {70,102}, {70,103}, {58,4}, {58,5}, {58,6}, {70,104}, {58,7}, {58,8}, {58,9}, {58,10}, {58,11}, {58,12}, {70,105}, {58,13}, {58,14}, {58,15}, {70,106}, {58,16}, {58,17}, {58,18}, {70,107}, {58,19}, {58,20}, {58,21}, {58,22}, {58,23}, {58,24}, {58,25}, {70,108}, {58,26}, {58,33}, {58,34}, {58,35}, {70,109}, {58,36}, {58,37}, {58,38}, {58,39}, {58,40}, {58,41}, {70,110}, {70,111}, {58,42}, {58,43}, {70,112}, {58,44}, {58,45}, {70,113}, {70,114}, {58,46}, {70,115}, {58,47}, {58,48}, {58,49}, {58,50}, {58,51}, {70,116}, {70,117}, {58,52}, {70,118}, {58,53}, {58,54}, {58,55}, {58,56}, {58,57}, {58,58}, {58,65}, {58,66}, {70,119}, {58,67}, {58,68}, {58,69}, {70,120}, {58,70}, {58,71}, {58,72}, {70,121}, {58,73}, {58,74}, {58,75}, {58,76}, {58,77}, {58,78}, {58,79}, {70,122}, {70,123}, {58,80}, {58,81}, {58,82}, {58,83}, {58,84}, {58,85}, {58,86}, {58,87}, {58,88}, {58,89}, {70,124}, {70,125}, {58,90}, {58,91}, {70,126}, {58,92}, {58,93}, {58,94}, {70,127}, {58,95}, {58,96}, {59,1}, {59,2}, {59,3}, {59,4}, {59,5}, {70,128}, {70,129}, {59,6}, {70,130}, {59,7}, {70,131}, {59,8}, {59,9}, {59,10}, {59,11}, {59,12}, {59,13}, {70,132}, {70,133}, {70,134}, {59,14}, {70,135}, {59,15}, {59,16}, {59,17}, {70,136}, {59,18}, {70,137}, {59,19}, {59,20}, {59,21}, {59,22}, {59,23}, {70,138}, {70,139}, {59,24}, {70,140}, {70,141}, {70,142}, {59,25}, {59,26}, {59,33}, {70,143}, {59,34}, {59,35}, {70,144}, {70,145}, {59,36}, {59,37}, {70,146}, {59,38}, {59,39}, {59,40}, {70,147}, {59,41}, {59,42}, {59,43}, {59,44}, {59,45}, {59,46}, {59,47}, {70,148}, {70,149}, {59,48}, {70,150}, {70,151}, {70,152}, {59,49}, {59,50}, {59,51}, {59,52}, {59,53}, {59,54}, {70,153}, {70,154}, {59,55}, {59,56}, {59,57}, {59,58}, {59,65}, {59,66}, {59,67}, {59,68}, {59,69}, {59,70}, {59,71}, {59,72}, {59,73}, {59,74}, {59,75}, {59,76}, {59,77}, {59,78}, {59,79}, {59,80}, {59,81}, {59,82}, {59,83}, {59,84}, {59,85}, {59,86}, {59,87}, {59,88}, {59,89}, {59,90}, {59,91}, {59,92}, {59,93}, {59,94}, {59,95}, {59,96}, {60,1}, {60,2}, {60,3}, {60,4}, {60,5}, {60,6}, {60,7}, {60,8}, {60,9}, {60,10}, {60,11}, {60,12}, {60,13}, {60,14}, {60,15}, {60,16}, {60,17}, {60,18}, {70,155}, {70,156}, {60,19}, {60,20}, {70,157}, {60,21}, {60,22}, {60,23}, {70,158}, {60,24}, {60,25}, {60,26}, {60,33}, {60,34}, {60,35}, {60,36}, {70,159}, {70,160}, {60,37}, {70,161}, {70,162}, {70,163}, {60,38}, {60,39}, {60,40}, {60,41}, {60,42}, {60,43}, {70,164}, {70,165}, {60,44}, {60,45}, {70,166}, {60,46}, {60,47}, {60,48}, {70,167}, {60,49}, {60,50}, {60,51}, {60,52}, {60,53}, {60,54}, {60,55}, {70,168}, {70,169}, {60,56}, {70,170}, {60,57}, {70,171}, {60,58}, {60,65}, {60,66}, {60,67}, {60,68}, {60,69}, {70,172}, {60,70}, {60,71}, {60,72}, {70,173}, {60,73}, {60,74}, {60,75}, {70,174}, {60,76}, {60,77}, {60,78}, {60,79}, {60,80}, {60,81}, {60,82}, {70,175}, {70,176}, {60,83}, {60,84}, {70,177}, {70,178}, {60,85}, {60,86}, {60,87}, {60,88}, {60,89}, {60,90}, {70,179}, {60,91}, {60,92}, {60,93}, {60,94}, {60,95}, {60,96}, {61,1}, {70,180}, {61,2}, {61,3}, {61,4}, {61,5}, {61,6}, {61,7}, {61,8}, {61,9}, {70,181}, {61,10}, {70,182}, {61,11}, {61,12}, {61,13}, {61,14}, {61,15}, {61,16}, {61,17}, {61,18}, {70,183}, {70,184}, {61,19}, {61,20}, {70,185}, {61,21}, {61,22}, {61,23}, {70,186}, {61,24}, {61,25}, {61,26}, {61,33}, {61,34}, {61,35}, {61,36}, {70,187}, {70,188}, {61,37}, {70,189}, {61,38}, {70,190}, {61,39}, {61,40}, {61,41}, {61,42}, {61,43}, {61,44}, {71,97}, {61,45}, {61,46}, {61,47}, {61,48}, {61,49}, {61,50}, {61,51}, {61,52}, {61,53}, {61,54}, {61,55}, {61,56}, {61,57}, {61,58}, {61,65}, {61,66}, {61,67}, {61,68}, {61,69}, {61,70}, {71,98}, {61,71}, {61,72}, {61,73}, {61,74}, {61,75}, {61,76}, {61,77}, {61,78}, {61,79}, {61,80}, {61,81}, {61,82}, {61,83}, {61,84}, {61,85}, {61,86}, {61,87}, {61,88}, {61,89}, {61,90}, {61,91}, {61,92}, {61,93}, {61,94}, {61,95}, {61,96}, {62,1}, {62,2}, {62,3}, {62,4}, {62,5}, {62,6}, {62,7}, {62,8}, {71,99}, {62,9}, {62,10}, {62,11}, {71,100}, {62,12}, {62,13}, {62,14}, {62,15}, {62,16}, {62,17}, {62,18}, {62,19}, {62,20}, {62,21}, {62,22}, {62,23}, {62,24}, {62,25}, {62,26}, {62,33}, {62,34}, {62,35}, {62,36}, {62,37}, {62,38}, {62,39}, {62,40}, {71,101}, {62,41}, {62,42}, {62,43}, {71,102}, {62,44}, {62,45}, {62,46}, {71,103}, {62,47}, {62,48}, {62,49}, {62,50}, {62,51}, {62,52}, {62,53}, {62,54}, {71,104}, {62,55}, {71,105}, {62,56}, {62,57}, {62,58}, {62,65}, {62,66}, {62,67}, {62,68}, {62,69}, {71,106}, {71,107}, {62,70}, {62,71}, {71,108}, {62,72}, {62,73}, {71,109}, {71,110}, {62,74}, {71,111}, {62,75}, {62,76}, {62,77}, {62,78}, {62,79}, {71,112}, {71,113}, {62,80}, {71,114}, {62,81}, {71,115}, {62,82}, {62,83}, {62,84}, {62,85}, {62,86}, {62,87}, {71,116}, {62,88}, {62,89}, {62,90}, {62,91}, {62,92}, {62,93}, {62,94}, {62,95}, {62,96}, {63,1}, {63,2}, {63,3}, {63,4}, {63,5}, {63,6}, {63,7}, {63,8}, {63,9}, {63,10}, {63,11}, {71,117}, {63,12}, {63,13}, {63,14}, {63,15}, {63,16}, {63,17}, {63,18}, {63,19}, {63,20}, {63,21}, {63,22}, {63,23}, {63,24}, {63,25}, {63,26}, {63,33}, {63,34}, {63,35}, {63,36}, {63,37}, {63,38}, {63,39}, {63,40}, {63,41}, {63,42}, {63,43}, {63,44}, {63,45}, {63,46}, {63,47}, {63,48}, {63,49}, {63,50}, {63,51}, {71,118}, {63,52}, {63,53}, {63,54}, {71,119}, {63,55}, {63,56}, {63,57}, {71,120}, {63,58}, {63,65}, {63,66}, {63,67}, {63,68}, {63,69}, {63,70}, {71,121}, {63,71}, {63,72}, {71,122}, {63,73}, {63,74}, {63,75}, {63,76}, {63,77}, {63,78}, {63,79}, {63,80}, {71,123}, {63,81}, {63,82}, {63,83}, {71,124}, {63,84}, {63,85}, {63,86}, {71,125}, {63,87}, {63,88}, {63,89}, {63,90}, {63,91}, {63,92}, {63,93}, {71,126}, {63,94}, {63,95}, {71,127}, {63,96}, {71,128}, {64,1}, {64,2}, {64,3}, {64,4}, {64,5}, {64,6}, {71,129}, {64,7}, {64,8}, {64,9}, {71,130}, {64,10}, {64,11}, {64,12}, {71,131}, {64,13}, {64,14}, {64,15}, {64,16}, {64,17}, {64,18}, {64,19}, {71,132}, {71,133}, {64,20}, {71,134}, {64,21}, {64,22}, {64,23}, {64,24}, {64,25}, {64,26}, {64,33}, {64,34}, {64,35}, {64,36}, {64,37}, {64,38}, {64,39}, {64,40}, {64,41}, {64,42}, {64,43}, {64,44}, {64,45}, {64,46}, {64,47}, {64,48}, {64,49}, {64,50}, {64,51}, {64,52}, {64,53}, {64,54}, {64,55}, {64,56}, {64,57}, {64,58}, {64,65}, {64,66}, {64,67}, {64,68}, {71,135}, {71,136}, {64,69}, {64,70}, {71,137}, {64,71}, {64,72}, {64,73}, {71,138}, {64,74}, {64,75}, {64,76}, {64,77}, {64,78}, {64,79}, {64,80}, {71,139}, {71,140}, {64,81}, {71,141}, {64,82}, {71,142}, {64,83}, {64,84}, {64,85}, {64,86}, {64,87}, {64,88}, {71,143}, {71,144}, {64,89}, {64,90}, {71,145}, {64,91}, {64,92}, {64,93}, {71,146}, {64,94}, {64,95}, {64,96}, {65,1}, {71,147}, {65,2}, {65,3}, {71,148}, {71,149}, {65,4}, {71,150}, {65,5}, {71,151}, {65,6}, {65,7}, {65,8}, {65,9}, {65,10}, {65,11}, {71,152}, {71,153}, {65,12}, {65,13}, {71,154}, {65,14}, {65,15}, {65,16}, {71,155}, {65,17}, {65,18}, {65,19}, {65,20}, {65,21}, {65,22}, {65,23}, {71,156}, {71,157}, {65,24}, {71,158}, {71,159}, {71,160}, {65,25}, {65,26}, {65,33}, {65,34}, {65,35}, {65,36}, {71,161}, {65,37}, {65,38}, {65,39}, {65,40}, {65,41}, {65,42}, {65,43}, {65,44}, {65,45}, {65,46}, {65,47}, {65,48}, {65,49}, {65,50}, {65,51}, {65,52}, {65,53}, {65,54}, {65,55}, {65,56}, {71,162}, {65,57}, {65,58}, {65,65}, {65,66}, {65,67}, {65,68}, {65,69}, {65,70}, {65,71}, {65,72}, {65,73}, {65,74}, {65,75}, {65,76}, {65,77}, {65,78}, {65,79}, {65,80}, {65,81}, {65,82}, {65,83}, {65,84}, {65,85}, {65,86}, {65,87}, {65,88}, {65,89}, {65,90}, {65,91}, {65,92}, {65,93}, {65,94}, {65,95}, {65,96}, {71,163}, {71,164}, {66,1}, {66,2}, {71,165}, {66,3}, {66,4}, {66,5}, {71,166}, {66,6}, {71,167}, {66,7}, {66,8}, {66,9}, {66,10}, {66,11}, {71,168}, {71,169}, {66,12}, {71,170}, {66,13}, {71,171}, {66,14}, {66,15}, {66,16}, {66,17}, {66,18}, {66,19}, {71,172}, {71,173}, {66,20}, {66,21}, {71,174}, {66,22}, {66,23}, {66,24}, {71,175}, {66,25}, {66,26}, {66,33}, {66,34}, {66,35}, {66,36}, {66,37}, {71,176}, {71,177}, {66,38}, {71,178}, {66,39}, {71,179}, {66,40}, {66,41}, {66,42}, {66,43}, {66,44}, {66,45}, {71,180}, {71,181}, {66,46}, {66,47}, {71,182}, {66,48}, {66,49}, {66,50}, {71,183}, {66,51}, {66,52}, {66,53}, {66,54}, {66,55}, {66,56}, {66,57}, {71,184}, {71,185}, {66,58}, {71,186}, {71,187}, {71,188}, {66,65}, {66,66}, {66,67}, {66,68}, {66,69}, {66,70}, {71,189}, {66,71}, {66,72}, {66,73}, {71,190}, {66,74}, {66,75}, {66,76}, {72,97}, {66,77}, {66,78}, {66,79}, {66,80}, {66,81}, {66,82}, {66,83}, {66,84}, {72,98}, {66,85}, {66,86}, {66,87}, {66,88}, {66,89}, {66,90}, {66,91}, {66,92}, {66,93}, {66,94}, {72,99}, {72,100}, {66,95}, {66,96}, {72,101}, {67,1}, {67,2}, {67,3}, {72,102}, {67,4}, {67,5}, {67,6}, {67,7}, {72,103}, {67,8}, {67,9}, {72,104}, {72,105}, {67,10}, {72,106}, {67,11}, {72,107}, {67,12}, {67,13}, {67,14}, {72,108}, {67,15}, {67,16}, {72,109}, {72,110}, {67,17}, {67,18}, {72,111}, {67,19}, {67,20}, {67,21}, {72,112}, {67,22}, {67,23}, {67,24}, {67,25}, {67,26}, {67,33}, {67,34}, {67,35}, {67,36}, {67,37}, {72,113}, {67,38}, {72,114}, {67,39}, {67,40}, {67,41}, {67,42}, {67,43}, {67,44}, {72,115}, {72,116}, {67,45}, {67,46}, {72,117}, {67,47}, {67,48}, {67,49}, {67,50}, {67,51}, {67,52}, {67,53}, {67,54}, {67,55}, {67,56}, {67,57}, {67,58}, {67,65}, {67,66}, {72,118}, {67,67}, {72,119}, {67,68}, {67,69}, {67,70}, {67,71}, {67,72}, {67,73}, {72,120}, {72,121}, {67,74}, {67,75}, {72,122}, {67,76}, {67,77}, {67,78}, {72,123}, {67,79}, {67,80}, {67,81}, {67,82}, {67,83}, {67,84}, {67,85}, {67,86}, {72,124}, {67,87}, {72,125}, {67,88}, {72,126}, {67,89}, {67,90}, {67,91}, {67,92}, {67,93}, {67,94}, {72,127}, {67,95}, {67,96}, {68,1}, {72,128}, {68,2}, {68,3}, {68,4}, {72,129}, {68,5}, {68,6}, {68,7}, {68,8}, {68,9}, {68,10}, {68,11}, {68,12}, {72,130}, {68,13}, {72,131}, {68,14}, {68,15}, {68,16}, {68,17}, {68,18}, {68,19}, {68,20}, {68,21}, {72,132}, {72,133}, {68,22}, {68,23}, {72,134}, {68,24}, {68,25}, {68,26}, {72,135}, {68,33}, {68,34}, {68,35}, {68,36}, {72,136}, {68,37}, {68,38}, {72,137}, {68,39}, {68,40}, {72,138}, {68,41}, {72,139}, {68,42}, {68,43}, {68,44}, {68,45}, {68,46}, {68,47}, {72,140}, {68,48}, {68,49}, {68,50}, {72,141}, {68,51}, {68,52}, {68,53}, {72,142}, {68,54}, {68,55}, {68,56}, {68,57}, {68,58}, {68,65}, {68,66}, {72,143}, {68,67}, {68,68}, {68,69}, {68,70}, {72,144}, {68,71}, {68,72}, {68,73}, {68,74}, {68,75}, {68,76}, {72,145}, {72,146}, {68,77}, {68,78}, {72,147}, {68,79}, {68,80}, {68,81}, {72,148}, {68,82}, {68,83}, {68,84}, {68,85}, {68,86}, {68,87}, {68,88}, {68,89}, {68,90}, {68,91}, {68,92}, {68,93}, {72,149}, {68,94}, {68,95}, {68,96}, {69,1}, {69,2}, {69,3}, {72,150}, {72,151}, {69,4}, {69,5}, {72,152}, {69,6}, {69,7}, {69,8}, {72,153}, {69,9}, {69,10}, {69,11}, {69,12}, {69,13}, {69,14}, {69,15}, {72,154}, {72,155}, {69,16}, {72,156}, {69,17}, {72,157}, {69,18}, {69,19}, {69,20}, {69,21}, {69,22}, {69,23}, {72,158}, {72,159}, {69,24}, {69,25}, {72,160}, {69,26}, {69,33}, {69,34}, {72,161}, {69,35}, {69,36}, {69,37}, {69,38}, {69,39}, {69,40}, {69,41}, {72,162}, {69,42}, {69,43}, {72,163}, {69,44}, {72,164}, {69,45}, {69,46}, {69,47}, {69,48}, {69,49}, {69,50}, {72,165}, {72,166}, {69,51}, {69,52}, {72,167}, {69,53}, {72,168}, {72,169}, {72,170}, {72,171}, {69,54}, {69,55}, {69,56}, {69,57}, {69,58}, {69,65}, {72,172}, {72,173}, {69,66}, {72,174}, {69,67}, {72,175}, {69,68}, {69,69}, {69,70}, {72,176}, {69,71}, {69,72}, {72,177}, {69,73}, {69,74}, {69,75}, {72,178}, {69,76}, {69,77}, {69,78}, {72,179}, {69,79}, {69,80}, {69,81}, {69,82}, {69,83}, {69,84}, {69,85}, {72,180}, {72,181}, {69,86}, {69,87}, {69,88}, {72,182}, {69,89}, {69,90}, {69,91}, {69,92}, {69,93}, {69,94}, {72,183}, {72,184}, {69,95}, {69,96}, {72,185}, {70,1}, {70,2}, {70,3}, {72,186}, {70,4}, {70,5}, {70,6}, {70,7}, {70,8}, {70,9}, {70,10}, {72,187}, {72,188}, {70,11}, {72,189}, {70,12}, {72,190}, {70,13}, {70,14}, {70,15}, {70,16}, {70,17}, {70,18}, {75,144}, {75,150}, {75,167}, {77,143}, {77,168}, {78,109}, {79,187}, {80,98}, {80,120}, {80,144}, {80,157}, {81,148}, {81,149}, {81,152}, {81,155}, {81,156}, {81,157}, {81,158}, {81,159}, {81,160}, {81,162}, {81,163}, {81,164}, {81,165}, {81,166}, {81,168}, {81,169}, {81,170}, {81,171}, {81,173}, {81,175}, {81,176}, {81,178}, {81,182}, {81,186}, {81,188}, {81,189}, {81,190}, {82,98}, {82,99}, {82,103}, {82,104}, {82,105}, {82,106}, {82,107}, {82,109}, {82,114}, {82,126}, {82,130}, {82,131}, {82,132}, {82,134}, {82,135}, {82,136}, {82,137}, {82,138}, {82,139}, {82,141}, {82,142}, {82,143}, {82,144}, {82,145}, {82,146}, {82,147}, {82,148}, {82,149}, {82,150}, {82,151}, {82,153}, {82,154}, {82,158}, {82,159}, {82,161}, {82,162}, {82,164}, {82,165}, {82,166}, {82,167}, {82,168}, {82,169}, {82,170}, {82,171}, {82,176}, {82,177}, {82,178}, {82,179}, {82,180}, {82,181}, {82,183}, {82,184}, {84,166}, {84,188}, {85,101}, {85,107}, {85,110}, {86,120}, {86,141}, {87,139}, {87,164}, {91,133}, {91,164}, {92,101}, {93,101}, {93,149}, {93,180}, {94,188}, {94,190}, {95,115}, {95,161}, {95,168}, {96,177}, {97,109}, {97,173}, {99,181}, {100,97}, {100,105}, {101,110}, {101,113}, {101,114}, {101,121}, {101,123}, {101,124}, {101,132}, {101,142}, {101,144}, {101,146}, {101,150}, {101,186}, {101,187}, {101,188}, {101,190}, {102,97}, {102,100}, {102,103}, {102,109}, {102,111}, {102,112}, {102,113}, {102,115}, {102,119}, {102,120}, {102,124}, {102,132}, {102,134}, {102,135}, {102,138}, {102,146}, {102,150}, {102,153}, {102,156}, {102,159}, {102,161}, {102,164}, {102,165}, {102,166}, {102,168}, {102,170}, {102,171}, {102,172}, {102,175}, {102,177}, {102,178}, {102,181}, {102,182}, {102,183}, {102,185}, {103,97}, {103,102}, {103,105}, {103,106}, {103,108}, {103,109}, {103,112}, {103,127}, {103,129}, {103,134}, {103,135}, {103,139}, {103,141}, {103,143}, {103,144}, {103,147}, {103,159}, {103,164}, {103,166}, {103,183}, {104,167}, {104,168}, {104,176}, {104,177}, {104,183}, {104,185}, {104,187}, {104,190}, {105,103}, {105,108}, {105,140}, {105,183}, {106,129}, {106,165}, {106,180}, {106,183}, {106,188}, {106,190}, {107,100}, {107,103}, {107,105}, {107,106}, {107,122}, {107,123}, {107,125}, {107,129}, {107,130}, {107,134}, {107,135}, {107,140}, {107,143}, {107,144}, {107,145}, {107,146}, {107,152}, {108,102}, {108,103}, {108,106}, {108,111}, {108,112}, {108,113}, {108,114}, {108,117}, {108,120}, {108,122}, {108,128}, {108,129}, {108,133}, {108,134}, {108,137}, {108,138}, {108,149}, {108,157}, {108,158}, {108,161}, {108,164}, {108,167}, {108,168}, {108,183}, {108,184}, {108,186}, {109,97}, {109,98}, {109,99}, {109,174}, {110,155}, {114,125}, {114,186}, {115,113}, {116,103}, {116,174}, {118,180}, {118,182}, {119,120}, {119,136}, {119,147}, {120,155}, {120,176}, {122,97}, {122,98}, {122,166}, {124,105}, {35,97}, {35,98}, {35,99}, {35,100}, {35,101}, {35,102}, {35,103}, {35,104}, {35,105}, {35,106}, {35,107}, {35,108}, {35,109}, {35,110}, {35,111}, {35,112}, {35,113}, {35,114}, {35,115}, {35,116}, {35,117}, {35,118}, {35,119}, {35,120}, {35,121}, {35,122}, {35,123}, {35,124}, {35,125}, {35,126}, {35,127}, {35,128}, {35,129}, {35,130}, {35,131}, {35,132}, {35,133}, {35,134}, {35,135}, {35,136}, {35,137}, {35,138}, {35,139}, {35,140}, {35,141}, {35,142}, {35,143}, {35,144}, {35,145}, {35,146}, {35,147}, {35,148}, {35,149}, {35,150}, {35,151}, {35,152}, {35,153}, {35,154}, {35,155}, {33,108}, {35,157}, {35,158}, {35,159}, {35,160}, {35,161}, {35,162}, {35,163}, {35,164}, {35,165}, {35,166}, {35,167}, {35,168}, {35,169}, {35,170}, {35,171}, {35,172}, {35,173}, {35,174}, {35,175}, {35,176}, {35,177}, {35,178}, {35,179}, {35,180}, {35,181}, {35,182}, {35,183}, {35,184}, {35,185}, {35,186}, {35,187}, {35,188}, {35,189}, {34,102}, {33,139}, {33,140}, {33,190}, {35,190}, {33,141}, {35,156} }; /* This returns ERROR if the code point doesn't exist. */ long int cp949_to_unicode(int r, int c) { assert(r >= 0 && r < 128); assert(c >= 0 && c < 192); return cp949_forward[r][c]; } /* This one returns 1 on success, 0 if the code point doesn't exist. */ int unicode_to_cp949(long int unicode, int *r, int *c) { int rr, cc; long int uu; int i, j, k; i = -1; j = lenof(cp949_backward); while (j - i > 1) { k = (i + j) / 2; rr = cp949_backward[k].r; cc = cp949_backward[k].c; uu = cp949_forward[rr][cc]; if (unicode > uu) i = k; else if (unicode < uu) j = k; else { *r = rr; *c = cc; return 1; } } return 0; } /* Functions dealing with the KS X 1001 square subset */ long int ksx1001_to_unicode(int r, int c) { assert(r >= 0 && r < 94); assert(c >= 0 && c < 94); return cp949_forward[r+0x21][c+0x61]; } /* This one returns 1 on success, 0 if the code point doesn't exist. */ int unicode_to_ksx1001(long int unicode, int *r, int *c) { int rr, cc; if (!unicode_to_cp949(unicode, &rr, &cc)) return 0; rr -= 0x21; cc -= 0x61; if (rr < 0 || rr >= 94 || cc < 0 || cc >= 94) return 0; *r = rr; *c = cc; return 1; } #ifdef TESTMODE #include <stdio.h> int main(void) { int r, c, rr, cc, ret; long int u, uu; for (r = 0; r < 128; r++) { for (c = 0; c < 192; c++) { u = cp949_to_unicode(r, c); if (u != ERROR) { ret = unicode_to_cp949(u, &rr, &cc); if (!ret) printf("(%d,%d) -> U-%08lx but didn't convert back\n", r, c, u); else if (rr != r || cc != c) printf("(%d,%d) -> U-%08lx -> (%d,%d)\n", r, c, u, rr, cc); } } } for (u = 0; u < 0x10000L; u++) { ret = unicode_to_cp949(u, &r, &c); if (ret) { uu = cp949_to_unicode(r, c); if (uu == ERROR) printf("U-%08lx -> (%d,%d) but didn't convert back\n", u, r, c); else if (uu != u) printf("U-%08lx -> (%d,%d) -> U-%08lx\n", u, r, c, uu); } } return 0; } #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/locale.c������������������������������������������������������������������������0000644�0001753�0001753�00000006005�12444773746�013011� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * locale.c: try very hard to figure out the libcharset charset * identifier corresponding to the current C library locale. * * This function works by calling nl_langinfo(CODESET) if * available; failing that, it will try to figure it out manually * by examining the locale environment variables. Code for the * latter is adapted from Markus Kuhn's public-domain * implementation of nl_langinfo(CODESET), available at * * http://www.cl.cam.ac.uk/~mgk25/ucs/langinfo.c */ #include <stdlib.h> #include <string.h> #include "charset.h" #ifdef HAS_LANGINFO_CODESET #include "langinfo.h" #endif int charset_from_locale(void) { char *l, *p; #ifdef HAS_LANGINFO_CODESET int charset; char const *csname; csname = nl_langinfo(CODESET); if (csname && (charset = charset_from_localenc(csname)) != CS_NONE) return charset; #endif if (((l = getenv("LC_ALL")) && *l) || ((l = getenv("LC_CTYPE")) && *l) || ((l = getenv("LANG")) && *l)) { /* check standardized locales */ if (!strcmp(l, "C") || !strcmp(l, "POSIX")) return CS_ASCII; /* check for encoding name fragment */ if (strstr(l, "UTF") || strstr(l, "utf")) return CS_UTF8; if ((p = strstr(l, "8859-"))) { char buf[16]; int charset; memcpy(buf, "ISO-8859-\0\0", 12); p += 5; if ((*p) >= '0' && (*p) <= '9') { buf[9] = *p++; if ((*p) >= '0' && (*p) <= '9') buf[10] = *p++; if ((charset = charset_from_localenc(buf)) != CS_NONE) return charset; } } if (strstr(l, "KOI8-RU")) return CS_KOI8_RU; if (strstr(l, "KOI8-R")) return CS_KOI8_R; if (strstr(l, "KOI8-U")) return CS_KOI8_U; /* if (strstr(l, "620")) return "TIS-620"; */ if (strstr(l, "2312")) return CS_EUC_CN; /* if (strstr(l, "HKSCS")) return "Big5HKSCS"; */ if (strstr(l, "Big5") || strstr(l, "BIG5")) return CS_BIG5; /* if (strstr(l, "GBK")) return "GBK"; */ /* if (strstr(l, "18030")) return "GB18030"; */ if (strstr(l, "Shift_JIS") || strstr(l, "SJIS")) return CS_SHIFT_JIS; /* check for conclusive modifier */ if (strstr(l, "euro")) return CS_ISO8859_15; /* check for language (and perhaps country) codes */ if (strstr(l, "zh_TW")) return CS_BIG5; /* if (strstr(l, "zh_HK")) return "Big5HKSCS"; */ if (strstr(l, "zh")) return CS_EUC_CN; if (strstr(l, "ja")) return CS_EUC_JP; if (strstr(l, "ko")) return CS_EUC_KR; if (strstr(l, "ru")) return CS_KOI8_R; if (strstr(l, "uk")) return CS_KOI8_U; if (strstr(l, "pl") || strstr(l, "hr") || strstr(l, "hu") || strstr(l, "cs") || strstr(l, "sk") || strstr(l, "sl")) return CS_ISO8859_2; if (strstr(l, "eo") || strstr(l, "mt")) return CS_ISO8859_3; if (strstr(l, "el")) return CS_ISO8859_7; if (strstr(l, "he")) return CS_ISO8859_8; if (strstr(l, "tr")) return CS_ISO8859_9; /* if (strstr(l, "th")) return "TIS-620"; */ if (strstr(l, "lt")) return CS_ISO8859_13; if (strstr(l, "cy")) return CS_ISO8859_14; if (strstr(l, "ro")) return CS_ISO8859_2; /* or ISO-8859-16 */ if (strstr(l, "am") || strstr(l, "vi")) return CS_UTF8; return CS_ISO8859_1; } return CS_ASCII; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/localenc.c����������������������������������������������������������������������0000644�0001753�0001753�00000013310�12444773746�013327� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * local.c - translate our internal character set codes to and from * our own set of plausibly legible character-set names. Also * provides a canonical name for each encoding (useful for software * announcing what character set it will be using), and a set of * enumeration functions which return a list of supported * encodings one by one. * * Also in this table are other ways people might plausibly refer * to a charset (for example, Win1252 as well as CP1252). Where * more than one string is given for a particular character set, * the first one is the canonical one returned by * charset_to_localenc. * * charset_from_localenc will attempt all other text translations * as well as this table, to maximise the number of different ways * you can select a supported charset. */ #include <ctype.h> #include "charset.h" #include "internal.h" static const struct { const char *name; int charset; int return_in_enum; /* enumeration misses some charsets */ } localencs[] = { { "<UNKNOWN>", CS_NONE, 0 }, { "ASCII", CS_ASCII, 1 }, { "BS 4730", CS_BS4730, 1 }, { "ISO-8859-1", CS_ISO8859_1, 1 }, { "ISO-8859-1 with X11 line drawing", CS_ISO8859_1_X11, 0 }, { "ISO-8859-2", CS_ISO8859_2, 1 }, { "ISO-8859-3", CS_ISO8859_3, 1 }, { "ISO-8859-4", CS_ISO8859_4, 1 }, { "ISO-8859-5", CS_ISO8859_5, 1 }, { "ISO-8859-6", CS_ISO8859_6, 1 }, { "ISO-8859-7", CS_ISO8859_7, 1 }, { "ISO-8859-8", CS_ISO8859_8, 1 }, { "ISO-8859-9", CS_ISO8859_9, 1 }, { "ISO-8859-10", CS_ISO8859_10, 1 }, { "ISO-8859-11", CS_ISO8859_11, 1 }, { "ISO-8859-13", CS_ISO8859_13, 1 }, { "ISO-8859-14", CS_ISO8859_14, 1 }, { "ISO-8859-15", CS_ISO8859_15, 1 }, { "ISO-8859-16", CS_ISO8859_16, 1 }, { "CP437", CS_CP437, 1 }, { "CP850", CS_CP850, 1 }, { "CP852", CS_CP852, 1 }, { "CP866", CS_CP866, 1 }, { "CP874", CS_CP874, 1 }, { "Win874", CS_CP874, 0 }, { "Win-874", CS_CP874, 0 }, { "CP1250", CS_CP1250, 1 }, { "Win1250", CS_CP1250, 0 }, { "CP1251", CS_CP1251, 1 }, { "Win1251", CS_CP1251, 0 }, { "CP1252", CS_CP1252, 1 }, { "Win1252", CS_CP1252, 0 }, { "CP1253", CS_CP1253, 1 }, { "Win1253", CS_CP1253, 0 }, { "CP1254", CS_CP1254, 1 }, { "Win1254", CS_CP1254, 0 }, { "CP1255", CS_CP1255, 1 }, { "Win1255", CS_CP1255, 0 }, { "CP1256", CS_CP1256, 1 }, { "Win1256", CS_CP1256, 0 }, { "CP1257", CS_CP1257, 1 }, { "Win1257", CS_CP1257, 0 }, { "CP1258", CS_CP1258, 1 }, { "Win1258", CS_CP1258, 0 }, { "KOI8-R", CS_KOI8_R, 1 }, { "KOI8-U", CS_KOI8_U, 1 }, { "KOI8-RU", CS_KOI8_RU, 1 }, { "JIS X 0201", CS_JISX0201, 1 }, { "JIS-X-0201", CS_JISX0201, 0 }, { "JIS_X_0201", CS_JISX0201, 0 }, { "JISX0201", CS_JISX0201, 0 }, { "Mac Roman", CS_MAC_ROMAN, 1 }, { "Mac Turkish", CS_MAC_TURKISH, 1 }, { "Mac Croatian", CS_MAC_CROATIAN, 1 }, { "Mac Iceland", CS_MAC_ICELAND, 1 }, { "Mac Romanian", CS_MAC_ROMANIAN, 1 }, { "Mac Greek", CS_MAC_GREEK, 1 }, { "Mac Cyrillic", CS_MAC_CYRILLIC, 1 }, { "Mac Thai", CS_MAC_THAI, 1 }, { "Mac Centeuro", CS_MAC_CENTEURO, 1 }, { "Mac Symbol", CS_MAC_SYMBOL, 1 }, { "Mac Dingbats", CS_MAC_DINGBATS, 1 }, { "Mac Roman (old)", CS_MAC_ROMAN_OLD, 0 }, { "Mac Croatian (old)", CS_MAC_CROATIAN_OLD, 0 }, { "Mac Iceland (old)", CS_MAC_ICELAND_OLD, 0 }, { "Mac Romanian (old)", CS_MAC_ROMANIAN_OLD, 0 }, { "Mac Greek (old)", CS_MAC_GREEK_OLD, 0 }, { "Mac Cyrillic (old)", CS_MAC_CYRILLIC_OLD, 0 }, { "Mac Ukraine", CS_MAC_UKRAINE, 1 }, { "Mac VT100", CS_MAC_VT100, 1 }, { "Mac VT100 (old)", CS_MAC_VT100_OLD, 0 }, { "VISCII", CS_VISCII, 1 }, { "HP ROMAN8", CS_HP_ROMAN8, 1 }, { "DEC MCS", CS_DEC_MCS, 1 }, { "DEC graphics", CS_DEC_GRAPHICS, 1 }, { "DEC-graphics", CS_DEC_GRAPHICS, 0 }, { "DECgraphics", CS_DEC_GRAPHICS, 0 }, { "UTF-8", CS_UTF8, 1 }, { "UTF-7", CS_UTF7, 1 }, { "UTF-7-conservative", CS_UTF7_CONSERVATIVE, 0 }, { "EUC-CN", CS_EUC_CN, 1 }, { "EUC-KR", CS_EUC_KR, 1 }, { "EUC-JP", CS_EUC_JP, 1 }, { "EUC-TW", CS_EUC_TW, 1 }, { "ISO-2022-JP", CS_ISO2022_JP, 1 }, { "ISO-2022-KR", CS_ISO2022_KR, 1 }, { "Big5", CS_BIG5, 1 }, { "Shift-JIS", CS_SHIFT_JIS, 1 }, { "HZ", CS_HZ, 1 }, { "UTF-16BE", CS_UTF16BE, 1 }, { "UTF-16LE", CS_UTF16LE, 1 }, { "UTF-16", CS_UTF16, 1 }, { "CP949", CS_CP949, 1 }, { "PDFDocEncoding", CS_PDF, 1 }, { "StandardEncoding", CS_PSSTD, 1 }, { "COMPOUND_TEXT", CS_CTEXT, 1 }, { "COMPOUND-TEXT", CS_CTEXT, 0 }, { "COMPOUND TEXT", CS_CTEXT, 0 }, { "COMPOUNDTEXT", CS_CTEXT, 0 }, { "CTEXT", CS_CTEXT, 0 }, { "ISO-2022", CS_ISO2022, 1 }, { "ISO2022", CS_ISO2022, 0 }, }; const char *charset_to_localenc(int charset) { int i; for (i = 0; i < (int)lenof(localencs); i++) if (charset == localencs[i].charset) return localencs[i].name; return NULL; /* not found */ } int charset_from_localenc(const char *name) { int i; if ( (i = charset_from_mimeenc(name)) != CS_NONE) return i; if ( (i = charset_from_xenc(name)) != CS_NONE) return i; if ( (i = charset_from_emacsenc(name)) != CS_NONE) return i; for (i = 0; i < (int)lenof(localencs); i++) { const char *p, *q; p = name; q = localencs[i].name; while (*p || *q) { if (tolower((unsigned char)*p) != tolower((unsigned char)*q)) break; p++; q++; } if (!*p && !*q) return localencs[i].charset; } return CS_NONE; /* not found */ } int charset_localenc_nth(int n) { int i; for (i = 0; i < (int)lenof(localencs); i++) if (localencs[i].return_in_enum && !n--) return localencs[i].charset; return CS_NONE; /* end of list */ } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/macenc.c������������������������������������������������������������������������0000644�0001753�0001753�00000015735�12444773746�013012� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Id: macenc.c,v 1.1 2003/12/03 20:48:32 simon Exp $ */ /* * Copyright (c) 2003 Ben Harris * All rights reserved. * * 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 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. */ /* * macenc.c -- Convert a Mac OS script/region/font combination to our * internal charset code. */ #include <string.h> #include "charset.h" #include "internal.h" /* * These are defined by Mac OS's <Script.h>, but we'd like to be * independent of that. */ #define smRoman 0 #define smJapanese 1 #define smTradChinese 2 #define smKorean 3 #define smArabic 4 #define smHebrew 5 #define smCyrillic 7 #define smDevenagari 9 #define smGurmukhi 10 #define smGujurati 11 #define smThai 21 #define smSimpChinese 25 #define smTibetan 26 #define smEthiopic 28 #define smCentralEuroRoman 29 #define verGreece 20 #define verIceland 21 #define verTurkey 24 #define verYugoCroatian 25 #define verRomania 39 #define verFaroeIsl 47 #define verIran 48 #define verRussia 49 #define verSlovenian 66 #define verCroatia 68 #define verBulgaria 72 #define verScottishGaelic 75 #define verManxGaelic 76 #define verBreton 77 #define verNunavut 78 #define verWelsh 79 #define verIrishGaelicScript 81 static const struct { int script; int region; int sysvermin; char const *fontname; int charset; } macencs[] = { { smRoman, -1, 0x850, "VT100", CS_MAC_VT100 }, { smRoman, -1, 0, "VT100", CS_MAC_VT100_OLD }, /* * From here on, this table is largely derived from * <http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT>, * with _OLD version added based on the comments in individual * mapping files. */ { smRoman, -1, 0, "Symbol", CS_MAC_SYMBOL }, { smRoman, -1, 0, "Zapf Dingbats", CS_MAC_DINGBATS }, { smRoman, verTurkey, 0, NULL, CS_MAC_TURKISH }, { smRoman, verYugoCroatian, 0x850, NULL, CS_MAC_CROATIAN }, { smRoman, verYugoCroatian, 0, NULL, CS_MAC_CROATIAN_OLD }, { smRoman, verSlovenian, 0x850, NULL, CS_MAC_CROATIAN }, { smRoman, verSlovenian, 0, NULL, CS_MAC_CROATIAN_OLD }, { smRoman, verCroatia, 0x850, NULL, CS_MAC_CROATIAN }, { smRoman, verCroatia, 0, NULL, CS_MAC_CROATIAN_OLD }, { smRoman, verIceland, 0x850, NULL, CS_MAC_ICELAND }, { smRoman, verIceland, 0, NULL, CS_MAC_ICELAND_OLD }, { smRoman, verFaroeIsl, 0x850, NULL, CS_MAC_ICELAND }, { smRoman, verFaroeIsl, 0, NULL, CS_MAC_ICELAND_OLD }, { smRoman, verRomania, 0x850, NULL, CS_MAC_ROMANIAN }, { smRoman, verRomania, 0, NULL, CS_MAC_ROMANIAN_OLD }, #if 0 /* No mapping table on ftp.unicode.org */ { smRoman, verIreland, 0x850, NULL, CS_MAC_CELTIC }, { smRoman, verIreland, 0, NULL, CS_MAC_CELTIC_OLD }, { smRoman, verScottishGaelic, 0x850, NULL, CS_MAC_CELTIC }, { smRoman, verScottishGaelic, 0, NULL, CS_MAC_CELTIC_OLD }, { smRoman, verManxGaelic, 0x850, NULL, CS_MAC_CELTIC }, { smRoman, verManxGaelic, 0, NULL, CS_MAC_CELTIC_OLD }, { smRoman, verBreton, 0x850, NULL, CS_MAC_CELTIC }, { smRoman, verBreton, 0, NULL, CS_MAC_CELTIC_OLD }, { smRoman, verWelsh, 0x850, NULL, CS_MAC_CELTIC }, { smRoman, verWelsh, 0, NULL, CS_MAC_CELTIC_OLD }, { smRoman, verIrishGaelicScript, 0x850, NULL, CS_MAC_GAELIC }, { smRoman, verIrishGaelicScript, 0, NULL, CS_MAC_GAELIC_OLD }, #endif { smRoman, verGreece, 0x922, NULL, CS_MAC_GREEK }, { smRoman, verGreece, 0, NULL, CS_MAC_GREEK_OLD }, { smRoman, -1, 0x850, NULL, CS_MAC_ROMAN }, { smRoman, -1, 0, NULL, CS_MAC_ROMAN_OLD }, #if 0 /* Multi-byte encodings, not yet supported */ { smJapanese, -1, 0, NULL, CS_MAC_JAPANESE }, { smTradChinese, -1, 0, NULL, CS_MAC_CHINTRAD }, { smKorean, -1, 0, NULL, CS_MAC_KOREAN }, #endif #if 0 /* Bidirectional encodings, not yet supported */ { smArabic, verIran, 0, NULL, CS_MAC_FARSI }, { smArabic, -1, 0, NULL, CS_MAC_ARABIC }, { smHebrew, -1, 0, NULL, CS_MAC_HEBREW }, #endif { smCyrillic, -1, 0x900, NULL, CS_MAC_CYRILLIC }, { smCyrillic, verRussia, 0, NULL, CS_MAC_CYRILLIC_OLD }, { smCyrillic, verBulgaria, 0, NULL, CS_MAC_CYRILLIC_OLD }, { smCyrillic, -1, 0, NULL, CS_MAC_UKRAINE }, #if 0 /* Complex Indic scripts, not yet supported */ { smDevanagari, -1, 0, NULL, CS_MAC_DEVENAGA }, { smGurmukhi, -1, 0, NULL, CS_MAC_GURMUKHI }, { smGujurati, -1, 0, NULL, CS_MAC_GUJURATI }, #endif { smThai, -1, 0, NULL, CS_MAC_THAI }, #if 0 /* Multi-byte encoding, not yet supported */ { smSimpChinese, -1, 0, NULL, CS_MAC_CHINSIMP }, #endif #if 0 /* No mapping table on ftp.unicode.org */ { smTibetan, -1, 0, NULL, CS_MAC_TIBETAN }, { smEthiopic, -1, 0, NULL, CS_MAC_ETHIOPIC }, { smEthiopic, verNanavut, 0, NULL, CS_MAC_INUIT }, #endif { smCentralEuroRoman, -1, 0, NULL, CS_MAC_CENTEURO }, }; int charset_from_macenc(int script, int region, int sysvers, char const *fontname) { int i; for (i = 0; i < (int)lenof(macencs); i++) if ((macencs[i].script == script) && (macencs[i].region < 0 || macencs[i].region == region) && (macencs[i].sysvermin <= sysvers) && (macencs[i].fontname == NULL || (fontname != NULL && strcmp(macencs[i].fontname, fontname) == 0))) return macencs[i].charset; return CS_NONE; } �����������������������������������halibut-1.1/charset/mimeenc.c�����������������������������������������������������������������������0000644�0001753�0001753�00000022753�12444773746�013177� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mimeenc.c - translate our internal character set codes to and * from MIME standard character-set names. * */ #include <ctype.h> #include "charset.h" #include "internal.h" static const struct { const char *name; int charset; } mimeencs[] = { /* * Most of these names are taken from * * http://www.iana.org/assignments/character-sets * * Where multiple encoding names map to the same encoding id * (such as the variety of aliases for ISO-8859-1), the first * is considered canonical and will be returned when * translating the id to a string. * * I also list here a few names which aren't in the above web * page, but which I've seen in the wild in real mail. These * are marked with a comment saying WILD. */ { "US-ASCII", CS_ASCII }, { "ANSI_X3.4-1968", CS_ASCII }, { "iso-ir-6", CS_ASCII }, { "ANSI_X3.4-1986", CS_ASCII }, { "ISO_646.irv:1991", CS_ASCII }, { "ASCII", CS_ASCII }, { "ISO646-US", CS_ASCII }, { "us", CS_ASCII }, { "IBM367", CS_ASCII }, { "cp367", CS_ASCII }, { "csASCII", CS_ASCII }, { "646", CS_ASCII }, /* WILD */ { "BS_4730", CS_BS4730 }, { "iso-ir-4", CS_BS4730 }, { "ISO646-GB", CS_BS4730 }, { "gb", CS_BS4730 }, { "uk", CS_BS4730 }, { "csISO4UnitedKingdom", CS_BS4730 }, { "ISO-8859-1", CS_ISO8859_1 }, { "ISO8859-1", CS_ISO8859_1 }, /* WILD */ { "iso-ir-100", CS_ISO8859_1 }, { "ISO_8859-1", CS_ISO8859_1 }, { "ISO_8859-1:1987", CS_ISO8859_1 }, { "latin1", CS_ISO8859_1 }, { "l1", CS_ISO8859_1 }, { "IBM819", CS_ISO8859_1 }, { "CP819", CS_ISO8859_1 }, { "csISOLatin1", CS_ISO8859_1 }, { "ISO-8859-2", CS_ISO8859_2 }, { "ISO8859-2", CS_ISO8859_2 }, /* WILD */ { "ISO_8859-2:1987", CS_ISO8859_2 }, { "iso-ir-101", CS_ISO8859_2 }, { "ISO_8859-2", CS_ISO8859_2 }, { "latin2", CS_ISO8859_2 }, { "l2", CS_ISO8859_2 }, { "csISOLatin2", CS_ISO8859_2 }, { "ISO-8859-3", CS_ISO8859_3 }, { "ISO8859-3", CS_ISO8859_3 }, /* WILD */ { "ISO_8859-3:1988", CS_ISO8859_3 }, { "iso-ir-109", CS_ISO8859_3 }, { "ISO_8859-3", CS_ISO8859_3 }, { "latin3", CS_ISO8859_3 }, { "l3", CS_ISO8859_3 }, { "csISOLatin3", CS_ISO8859_3 }, { "ISO-8859-4", CS_ISO8859_4 }, { "ISO8859-4", CS_ISO8859_4 }, /* WILD */ { "ISO_8859-4:1988", CS_ISO8859_4 }, { "iso-ir-110", CS_ISO8859_4 }, { "ISO_8859-4", CS_ISO8859_4 }, { "latin4", CS_ISO8859_4 }, { "l4", CS_ISO8859_4 }, { "csISOLatin4", CS_ISO8859_4 }, { "ISO-8859-5", CS_ISO8859_5 }, { "ISO8859-5", CS_ISO8859_5 }, /* WILD */ { "ISO_8859-5:1988", CS_ISO8859_5 }, { "iso-ir-144", CS_ISO8859_5 }, { "ISO_8859-5", CS_ISO8859_5 }, { "cyrillic", CS_ISO8859_5 }, { "csISOLatinCyrillic", CS_ISO8859_5 }, { "ISO-8859-6", CS_ISO8859_6 }, { "ISO8859-6", CS_ISO8859_6 }, /* WILD */ { "ISO_8859-6:1987", CS_ISO8859_6 }, { "iso-ir-127", CS_ISO8859_6 }, { "ISO_8859-6", CS_ISO8859_6 }, { "ECMA-114", CS_ISO8859_6 }, { "ASMO-708", CS_ISO8859_6 }, { "arabic", CS_ISO8859_6 }, { "csISOLatinArabic", CS_ISO8859_6 }, { "ISO-8859-7", CS_ISO8859_7 }, { "ISO8859-7", CS_ISO8859_7 }, /* WILD */ { "ISO_8859-7:1987", CS_ISO8859_7 }, { "iso-ir-126", CS_ISO8859_7 }, { "ISO_8859-7", CS_ISO8859_7 }, { "ELOT_928", CS_ISO8859_7 }, { "ECMA-118", CS_ISO8859_7 }, { "greek", CS_ISO8859_7 }, { "greek8", CS_ISO8859_7 }, { "csISOLatinGreek", CS_ISO8859_7 }, { "ISO-8859-8", CS_ISO8859_8 }, { "ISO8859-8", CS_ISO8859_8 }, /* WILD */ { "ISO_8859-8:1988", CS_ISO8859_8 }, { "iso-ir-138", CS_ISO8859_8 }, { "ISO_8859-8", CS_ISO8859_8 }, { "hebrew", CS_ISO8859_8 }, { "csISOLatinHebrew", CS_ISO8859_8 }, { "ISO-8859-9", CS_ISO8859_9 }, { "ISO8859-9", CS_ISO8859_9 }, /* WILD */ { "ISO_8859-9:1989", CS_ISO8859_9 }, { "iso-ir-148", CS_ISO8859_9 }, { "ISO_8859-9", CS_ISO8859_9 }, { "latin5", CS_ISO8859_9 }, { "l5", CS_ISO8859_9 }, { "csISOLatin5", CS_ISO8859_9 }, { "ISO-8859-10", CS_ISO8859_10 }, { "ISO8859-10", CS_ISO8859_10 }, /* WILD */ { "iso-ir-157", CS_ISO8859_10 }, { "l6", CS_ISO8859_10 }, { "ISO_8859-10:1992", CS_ISO8859_10 }, { "csISOLatin6", CS_ISO8859_10 }, { "latin6", CS_ISO8859_10 }, { "TIS-620", CS_ISO8859_11 }, { "ISO-8859-13", CS_ISO8859_13 }, { "ISO8859-13", CS_ISO8859_13 }, /* WILD */ { "ISO-8859-14", CS_ISO8859_14 }, { "ISO8859-14", CS_ISO8859_14 }, /* WILD */ { "iso-ir-199", CS_ISO8859_14 }, { "ISO_8859-14:1998", CS_ISO8859_14 }, { "ISO_8859-14", CS_ISO8859_14 }, { "latin8", CS_ISO8859_14 }, { "iso-celtic", CS_ISO8859_14 }, { "l8", CS_ISO8859_14 }, { "ISO-8859-15", CS_ISO8859_15 }, { "ISO8859-15", CS_ISO8859_15 }, /* WILD */ { "ISO_8859-15", CS_ISO8859_15 }, { "Latin-9", CS_ISO8859_15 }, { "ISO-8859-16", CS_ISO8859_16 }, { "ISO8859-16", CS_ISO8859_16 }, /* WILD */ { "iso-ir-226", CS_ISO8859_16 }, { "ISO_8859-16", CS_ISO8859_16 }, { "ISO_8859-16:2001", CS_ISO8859_16 }, { "latin10", CS_ISO8859_16 }, { "l10", CS_ISO8859_16 }, { "IBM437", CS_CP437 }, { "cp437", CS_CP437 }, { "437", CS_CP437 }, { "csPC8CodePage437", CS_CP437 }, { "IBM850", CS_CP850 }, { "cp850", CS_CP850 }, { "850", CS_CP850 }, { "csPC850Multilingual", CS_CP850 }, { "IBM852", CS_CP852 }, { "cp852", CS_CP852 }, { "852", CS_CP852 }, { "csIBM852", CS_CP852 }, { "IBM866", CS_CP866 }, { "cp866", CS_CP866 }, { "866", CS_CP866 }, { "csIBM866", CS_CP866 }, { "windows-874", CS_CP874 }, /* WILD */ { "windows-1250", CS_CP1250 }, { "win-1250", CS_CP1250 }, /* WILD */ { "windows-1251", CS_CP1251 }, { "win-1251", CS_CP1251 }, /* WILD */ { "windows-1252", CS_CP1252 }, { "win-1252", CS_CP1252 }, /* WILD */ { "windows-1253", CS_CP1253 }, { "win-1253", CS_CP1253 }, /* WILD */ { "windows-1254", CS_CP1254 }, { "win-1254", CS_CP1254 }, /* WILD */ { "windows-1255", CS_CP1255 }, { "win-1255", CS_CP1255 }, /* WILD */ { "windows-1256", CS_CP1256 }, { "win-1256", CS_CP1256 }, /* WILD */ { "windows-1257", CS_CP1257 }, { "win-1257", CS_CP1257 }, /* WILD */ { "windows-1258", CS_CP1258 }, { "win-1258", CS_CP1258 }, /* WILD */ { "KOI8-R", CS_KOI8_R }, { "csKOI8R", CS_KOI8_R }, { "KOI8-U", CS_KOI8_U }, { "KOI8-RU", CS_KOI8_RU }, /* WILD */ { "JIS_X0201", CS_JISX0201 }, { "X0201", CS_JISX0201 }, { "csHalfWidthKatakana", CS_JISX0201 }, { "macintosh", CS_MAC_ROMAN_OLD }, { "mac", CS_MAC_ROMAN_OLD }, { "csMacintosh", CS_MAC_ROMAN_OLD }, { "VISCII", CS_VISCII }, { "csVISCII", CS_VISCII }, { "hp-roman8", CS_HP_ROMAN8 }, { "roman8", CS_HP_ROMAN8 }, { "r8", CS_HP_ROMAN8 }, { "csHPRoman8", CS_HP_ROMAN8 }, { "DEC-MCS", CS_DEC_MCS }, { "dec", CS_DEC_MCS }, { "csDECMCS", CS_DEC_MCS }, { "UTF-8", CS_UTF8 }, { "UTF-7", CS_UTF7 }, { "UNICODE-1-1-UTF-7", CS_UTF7 }, { "csUnicode11UTF7", CS_UTF7 }, /* * Quite why the EUC-CN encoding is known to MIME by the name * of its underlying character set, I'm not entirely sure, but * it is. Shrug. */ { "GB2312", CS_EUC_CN }, { "csGB2312", CS_EUC_CN }, { "EUC-KR", CS_EUC_KR }, { "csEUCKR", CS_EUC_KR }, { "EUC-JP", CS_EUC_JP }, { "csEUCPkdFmtJapanese", CS_EUC_JP }, { "Extended_UNIX_Code_Packed_Format_for_Japanese", CS_EUC_JP }, { "ISO-2022-JP", CS_ISO2022_JP }, { "csISO2022JP", CS_ISO2022_JP }, { "ISO-2022-KR", CS_ISO2022_KR }, { "csISO2022KR", CS_ISO2022_KR }, { "Big5", CS_BIG5 }, { "csBig5", CS_BIG5 }, { "Big-5", CS_BIG5 }, /* WILD */ { "ChineseBig5", CS_BIG5 }, /* WILD */ { "Shift_JIS", CS_SHIFT_JIS }, { "MS_Kanji", CS_SHIFT_JIS }, { "csShiftJIS", CS_SHIFT_JIS }, { "x-sjis", CS_SHIFT_JIS }, /* WILD */ { "HZ-GB-2312", CS_HZ }, { "UTF-16BE", CS_UTF16BE }, { "UTF-16LE", CS_UTF16LE }, { "UTF-16", CS_UTF16 }, /* * This bit is fiddly and possibly technically incorrect; but * rumour has it that the KSC 5601 encoding is a subset of * Microsoft CP949, and that MS products tend to announce CP949 * as KSC 5601 in much the same way they seem willing to * announce CP1252 as its subset ISO 8859-1. So I cheat * shamelessly here by letting KSC 5601 map to CP949. */ { "KS_C_5601-1987", CS_CP949 }, { "iso-ir-149", CS_CP949 }, { "KS_C_5601-1989", CS_CP949 }, { "KSC_5601", CS_CP949 }, { "korean", CS_CP949 }, { "csKSC56011987", CS_CP949 }, { "KSC5601", CS_CP949 }, /* WILD */ #if 0 { "ISO-2022-JP-2", CS_ISO2022_JP_2 }, { "csISO2022JP2", CS_ISO2022_JP_2 }, #endif }; const char *charset_to_mimeenc(int charset) { int i; for (i = 0; i < (int)lenof(mimeencs); i++) if (charset == mimeencs[i].charset) return mimeencs[i].name; return NULL; /* not found */ } int charset_from_mimeenc(const char *name) { int i; for (i = 0; i < (int)lenof(mimeencs); i++) { const char *p, *q; p = name; q = mimeencs[i].name; while (*p || *q) { if (tolower((unsigned char)*p) != tolower((unsigned char)*q)) break; p++; q++; } if (!*p && !*q) return mimeencs[i].charset; } return CS_NONE; /* not found */ } ���������������������halibut-1.1/charset/sbcs.c��������������������������������������������������������������������������0000644�0001753�0001753�00000003124�12444773746�012503� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * sbcs.c - routines to handle single-byte character sets. */ #include "charset.h" #include "internal.h" /* * The charset_spec for any single-byte character set should * provide read_sbcs() as its read function, and its `data' field * should be a wchar_t string constant containing the 256 entries * of the translation table. */ long int sbcs_to_unicode(const struct sbcs_data *sd, long int input_chr) { return sd->sbcs2ucs[input_chr]; } void read_sbcs(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { const struct sbcs_data *sd = charset->data; UNUSEDARG(state); emit(emitctx, sbcs_to_unicode(sd, input_chr)); } long int sbcs_from_unicode(const struct sbcs_data *sd, long int input_chr) { int i, j, k, c; /* * Binary-search in the ucs2sbcs table. */ i = -1; j = sd->nvalid; while (i+1 < j) { k = (i+j)/2; c = sd->ucs2sbcs[k]; if (input_chr < (long int)sd->sbcs2ucs[c]) j = k; else if (input_chr > (long int)sd->sbcs2ucs[c]) i = k; else { return c; } } return ERROR; } int write_sbcs(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { const struct sbcs_data *sd = charset->data; long int ret; UNUSEDARG(state); if (input_chr == -1) return TRUE; /* stateless; no cleanup required */ ret = sbcs_from_unicode(sd, input_chr); if (ret == ERROR) return FALSE; emit(emitctx, ret); return TRUE; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/sbcs.dat������������������������������������������������������������������������0000644�0001753�0001753�00000272556�12444773746�013052� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ Data file defining single-byte character sets. All lines which begin with whitespace are considered comments. Firstly, good old US-ASCII. Positions 00-7F map to the first 128 code points of Unicode; anything above that is an error. charset CS_ASCII 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX BS 4730, sometimes known as UK-ASCII. This is ASCII with U+0023 NUMBER SIGN replaced by U+00A3 POUND SIGN, and U+007E TILDE replaced by U+203E OVERLINE. For some reason, DEC terminals don't implement the latter. charset CS_BS4730 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 00A3 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 203e 007f XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX VT100 line drawing character set. There seems to be no definitive mapping of this onto Unicode, but the only uncertain mapping is for code point 60, which might be U+2666 BLACK DIAMOND SUIT, U+25C6 BLACK DIAMOND, or in Apple's case, U+2022 BULLET. charset CS_DEC_GRAPHICS 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 0020 2666 2592 2409 240c 240d 240a 00b0 00b1 2424 240b 2518 2510 250c 2514 253c 23ba 23bb 2500 23bc 23bd 251c 2524 2534 252c 2502 2264 2265 03c0 2260 00a3 00b7 007f XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX To generate an SBCS table from a unicode.org mapping table: gensbcs() { wget -q -O - "$1" | tr '\r' '\n' | \ perl -ne '/^(0x.*)\s+(0x.*)\s+/ and $a[hex $1]=sprintf "%04x", hex $2;' \ -e 'BEGIN{for($i=0;$i<256;$i++){$a[$i]="XXXX";' \ -e ' if ($i < 32 or $i == 127) {$a[$i]=sprintf "%04x", $i}}}' \ -e 'END{for($i=0;$i<256;$i++){printf"%s%s",$a[$i],$i%16==15?"\n":" "}}' } (A couple of noteworthy ickinesses here. For a start, any undefined characters in the control-code regions (00-1F and 7F) are assumed to be the Unicode code point corresponding to their index, since the Mac Roman mapping table declines to define them but realistically you don't want to be messing with that sort of thing. Secondly, the Mac mapping tables are shipped with Mac line endings, so note the `tr' to turn them into something legible to Perl...) Here are the ISO-8859-x tables, generated by this piece of Bourne shell: for i in 1 2 3 4 5 6 7 8 9 10 11 13 14 15 16; do echo charset CS_ISO8859_$i gensbcs http://www.unicode.org/Public/MAPPINGS/ISO8859/8859-$i.TXT echo done charset CS_ISO8859_1 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 00d0 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 00dd 00de 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 00f0 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 00fd 00fe 00ff charset CS_ISO8859_2 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0104 02d8 0141 00a4 013d 015a 00a7 00a8 0160 015e 0164 0179 00ad 017d 017b 00b0 0105 02db 0142 00b4 013e 015b 02c7 00b8 0161 015f 0165 017a 02dd 017e 017c 0154 00c1 00c2 0102 00c4 0139 0106 00c7 010c 00c9 0118 00cb 011a 00cd 00ce 010e 0110 0143 0147 00d3 00d4 0150 00d6 00d7 0158 016e 00da 0170 00dc 00dd 0162 00df 0155 00e1 00e2 0103 00e4 013a 0107 00e7 010d 00e9 0119 00eb 011b 00ed 00ee 010f 0111 0144 0148 00f3 00f4 0151 00f6 00f7 0159 016f 00fa 0171 00fc 00fd 0163 02d9 charset CS_ISO8859_3 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0126 02d8 00a3 00a4 XXXX 0124 00a7 00a8 0130 015e 011e 0134 00ad XXXX 017b 00b0 0127 00b2 00b3 00b4 00b5 0125 00b7 00b8 0131 015f 011f 0135 00bd XXXX 017c 00c0 00c1 00c2 XXXX 00c4 010a 0108 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf XXXX 00d1 00d2 00d3 00d4 0120 00d6 00d7 011c 00d9 00da 00db 00dc 016c 015c 00df 00e0 00e1 00e2 XXXX 00e4 010b 0109 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef XXXX 00f1 00f2 00f3 00f4 0121 00f6 00f7 011d 00f9 00fa 00fb 00fc 016d 015d 02d9 charset CS_ISO8859_4 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0104 0138 0156 00a4 0128 013b 00a7 00a8 0160 0112 0122 0166 00ad 017d 00af 00b0 0105 02db 0157 00b4 0129 013c 02c7 00b8 0161 0113 0123 0167 014a 017e 014b 0100 00c1 00c2 00c3 00c4 00c5 00c6 012e 010c 00c9 0118 00cb 0116 00cd 00ce 012a 0110 0145 014c 0136 00d4 00d5 00d6 00d7 00d8 0172 00da 00db 00dc 0168 016a 00df 0101 00e1 00e2 00e3 00e4 00e5 00e6 012f 010d 00e9 0119 00eb 0117 00ed 00ee 012b 0111 0146 014d 0137 00f4 00f5 00f6 00f7 00f8 0173 00fa 00fb 00fc 0169 016b 02d9 charset CS_ISO8859_5 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0401 0402 0403 0404 0405 0406 0407 0408 0409 040a 040b 040c 00ad 040e 040f 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041a 041b 041c 041d 041e 041f 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042a 042b 042c 042d 042e 042f 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043a 043b 043c 043d 043e 043f 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044a 044b 044c 044d 044e 044f 2116 0451 0452 0453 0454 0455 0456 0457 0458 0459 045a 045b 045c 00a7 045e 045f charset CS_ISO8859_6 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 XXXX XXXX XXXX 00a4 XXXX XXXX XXXX XXXX XXXX XXXX XXXX 060c 00ad XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 061b XXXX XXXX XXXX 061f XXXX 0621 0622 0623 0624 0625 0626 0627 0628 0629 062a 062b 062c 062d 062e 062f 0630 0631 0632 0633 0634 0635 0636 0637 0638 0639 063a XXXX XXXX XXXX XXXX XXXX 0640 0641 0642 0643 0644 0645 0646 0647 0648 0649 064a 064b 064c 064d 064e 064f 0650 0651 0652 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX charset CS_ISO8859_7 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 2018 2019 00a3 XXXX XXXX 00a6 00a7 00a8 00a9 XXXX 00ab 00ac 00ad XXXX 2015 00b0 00b1 00b2 00b3 0384 0385 0386 00b7 0388 0389 038a 00bb 038c 00bd 038e 038f 0390 0391 0392 0393 0394 0395 0396 0397 0398 0399 039a 039b 039c 039d 039e 039f 03a0 03a1 XXXX 03a3 03a4 03a5 03a6 03a7 03a8 03a9 03aa 03ab 03ac 03ad 03ae 03af 03b0 03b1 03b2 03b3 03b4 03b5 03b6 03b7 03b8 03b9 03ba 03bb 03bc 03bd 03be 03bf 03c0 03c1 03c2 03c3 03c4 03c5 03c6 03c7 03c8 03c9 03ca 03cb 03cc 03cd 03ce XXXX charset CS_ISO8859_8 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 XXXX 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00d7 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00f7 00bb 00bc 00bd 00be XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 2017 05d0 05d1 05d2 05d3 05d4 05d5 05d6 05d7 05d8 05d9 05da 05db 05dc 05dd 05de 05df 05e0 05e1 05e2 05e3 05e4 05e5 05e6 05e7 05e8 05e9 05ea XXXX XXXX 200e 200f XXXX charset CS_ISO8859_9 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 011e 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 0130 015e 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 011f 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 0131 015f 00ff charset CS_ISO8859_10 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0104 0112 0122 012a 0128 0136 00a7 013b 0110 0160 0166 017d 00ad 016a 014a 00b0 0105 0113 0123 012b 0129 0137 00b7 013c 0111 0161 0167 017e 2015 016b 014b 0100 00c1 00c2 00c3 00c4 00c5 00c6 012e 010c 00c9 0118 00cb 0116 00cd 00ce 00cf 00d0 0145 014c 00d3 00d4 00d5 00d6 0168 00d8 0172 00da 00db 00dc 00dd 00de 00df 0101 00e1 00e2 00e3 00e4 00e5 00e6 012f 010d 00e9 0119 00eb 0117 00ed 00ee 00ef 00f0 0146 014d 00f3 00f4 00f5 00f6 0169 00f8 0173 00fa 00fb 00fc 00fd 00fe 0138 charset CS_ISO8859_11 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0e01 0e02 0e03 0e04 0e05 0e06 0e07 0e08 0e09 0e0a 0e0b 0e0c 0e0d 0e0e 0e0f 0e10 0e11 0e12 0e13 0e14 0e15 0e16 0e17 0e18 0e19 0e1a 0e1b 0e1c 0e1d 0e1e 0e1f 0e20 0e21 0e22 0e23 0e24 0e25 0e26 0e27 0e28 0e29 0e2a 0e2b 0e2c 0e2d 0e2e 0e2f 0e30 0e31 0e32 0e33 0e34 0e35 0e36 0e37 0e38 0e39 0e3a XXXX XXXX XXXX XXXX 0e3f 0e40 0e41 0e42 0e43 0e44 0e45 0e46 0e47 0e48 0e49 0e4a 0e4b 0e4c 0e4d 0e4e 0e4f 0e50 0e51 0e52 0e53 0e54 0e55 0e56 0e57 0e58 0e59 0e5a 0e5b XXXX XXXX XXXX XXXX charset CS_ISO8859_13 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 201d 00a2 00a3 00a4 201e 00a6 00a7 00d8 00a9 0156 00ab 00ac 00ad 00ae 00c6 00b0 00b1 00b2 00b3 201c 00b5 00b6 00b7 00f8 00b9 0157 00bb 00bc 00bd 00be 00e6 0104 012e 0100 0106 00c4 00c5 0118 0112 010c 00c9 0179 0116 0122 0136 012a 013b 0160 0143 0145 00d3 014c 00d5 00d6 00d7 0172 0141 015a 016a 00dc 017b 017d 00df 0105 012f 0101 0107 00e4 00e5 0119 0113 010d 00e9 017a 0117 0123 0137 012b 013c 0161 0144 0146 00f3 014d 00f5 00f6 00f7 0173 0142 015b 016b 00fc 017c 017e 2019 charset CS_ISO8859_14 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 1e02 1e03 00a3 010a 010b 1e0a 00a7 1e80 00a9 1e82 1e0b 1ef2 00ad 00ae 0178 1e1e 1e1f 0120 0121 1e40 1e41 00b6 1e56 1e81 1e57 1e83 1e60 1ef3 1e84 1e85 1e61 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 0174 00d1 00d2 00d3 00d4 00d5 00d6 1e6a 00d8 00d9 00da 00db 00dc 00dd 0176 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 0175 00f1 00f2 00f3 00f4 00f5 00f6 1e6b 00f8 00f9 00fa 00fb 00fc 00fd 0177 00ff charset CS_ISO8859_15 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 00a1 00a2 00a3 20ac 00a5 0160 00a7 0161 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 017d 00b5 00b6 00b7 017e 00b9 00ba 00bb 0152 0153 0178 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 00d0 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 00dd 00de 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 00f0 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 00fd 00fe 00ff charset CS_ISO8859_16 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0104 0105 0141 20ac 201e 0160 00a7 0161 00a9 0218 00ab 0179 00ad 017a 017b 00b0 00b1 010c 0142 017d 201d 00b6 00b7 017e 010d 0219 00bb 0152 0153 0178 017c 00c0 00c1 00c2 0102 00c4 0106 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 0110 0143 00d2 00d3 00d4 0150 00d6 015a 0170 00d9 00da 00db 00dc 0118 021a 00df 00e0 00e1 00e2 0103 00e4 0107 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 0111 0144 00f2 00f3 00f4 0151 00f6 015b 0171 00f9 00fa 00fb 00fc 0119 021b 00ff Some X fonts are encoded in a variant form of ISO8859-1: everything above 0x20 (space) is as normal, but the first 32 characters contain the VT100 line drawing glyphs as they would appear from positions 0x5F to 0x7E inclusive. Here is the modified ISO8859-1 code table. Since this table contains a few duplicated positions, we use the `sortpriority' hint to indicate that things in the main part of the code table (0x20-0xFF) should be generated preferentially when converting _from_ Unicode. Hence, U+00b0 (for example) will yield 0xb0 rather than 0x07. charset CS_ISO8859_1_X11 sortpriority 00-1F -1 0020 2666 2592 2409 240c 240d 240a 00b0 00b1 2424 240b 2518 2510 250c 2514 253c 23ba 23bb 2500 23bc 23bd 251c 2524 2534 252c 2502 2264 2265 03c0 2260 00a3 00b7 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 00d0 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 00dd 00de 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 00f0 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 00fd 00fe 00ff Here are some PC (old DOS) code pages, generated by this piece of Bourne shell: for i in 437 850 866; do echo charset CS_CP$i gensbcs http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP$i.TXT echo done charset CS_CP437 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c7 00fc 00e9 00e2 00e4 00e0 00e5 00e7 00ea 00eb 00e8 00ef 00ee 00ec 00c4 00c5 00c9 00e6 00c6 00f4 00f6 00f2 00fb 00f9 00ff 00d6 00dc 00a2 00a3 00a5 20a7 0192 00e1 00ed 00f3 00fa 00f1 00d1 00aa 00ba 00bf 2310 00ac 00bd 00bc 00a1 00ab 00bb 2591 2592 2593 2502 2524 2561 2562 2556 2555 2563 2551 2557 255d 255c 255b 2510 2514 2534 252c 251c 2500 253c 255e 255f 255a 2554 2569 2566 2560 2550 256c 2567 2568 2564 2565 2559 2558 2552 2553 256b 256a 2518 250c 2588 2584 258c 2590 2580 03b1 00df 0393 03c0 03a3 03c3 00b5 03c4 03a6 0398 03a9 03b4 221e 03c6 03b5 2229 2261 00b1 2265 2264 2320 2321 00f7 2248 00b0 2219 00b7 221a 207f 00b2 25a0 00a0 charset CS_CP850 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c7 00fc 00e9 00e2 00e4 00e0 00e5 00e7 00ea 00eb 00e8 00ef 00ee 00ec 00c4 00c5 00c9 00e6 00c6 00f4 00f6 00f2 00fb 00f9 00ff 00d6 00dc 00f8 00a3 00d8 00d7 0192 00e1 00ed 00f3 00fa 00f1 00d1 00aa 00ba 00bf 00ae 00ac 00bd 00bc 00a1 00ab 00bb 2591 2592 2593 2502 2524 00c1 00c2 00c0 00a9 2563 2551 2557 255d 00a2 00a5 2510 2514 2534 252c 251c 2500 253c 00e3 00c3 255a 2554 2569 2566 2560 2550 256c 00a4 00f0 00d0 00ca 00cb 00c8 0131 00cd 00ce 00cf 2518 250c 2588 2584 00a6 00cc 2580 00d3 00df 00d4 00d2 00f5 00d5 00b5 00fe 00de 00da 00db 00d9 00fd 00dd 00af 00b4 00ad 00b1 2017 00be 00b6 00a7 00f7 00b8 00b0 00a8 00b7 00b9 00b3 00b2 25a0 00a0 charset CS_CP866 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041a 041b 041c 041d 041e 041f 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042a 042b 042c 042d 042e 042f 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043a 043b 043c 043d 043e 043f 2591 2592 2593 2502 2524 2561 2562 2556 2555 2563 2551 2557 255d 255c 255b 2510 2514 2534 252c 251c 2500 253c 255e 255f 255a 2554 2569 2566 2560 2550 256c 2567 2568 2564 2565 2559 2558 2552 2553 256b 256a 2518 250c 2588 2584 258c 2590 2580 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044a 044b 044c 044d 044e 044f 0401 0451 0404 0454 0407 0457 040e 045e 00b0 2219 00b7 221a 2116 00a4 25a0 00a0 Windows-874, a Thai code page hacked up by hand from the listing at http://www.microsoft.com/globaldev/reference/sbcs/874.mspx charset CS_CP874 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX XXXX XXXX XXXX 2026 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 00a0 0e01 0e02 0e03 0e04 0e05 0e06 0e07 0e08 0e09 0e0a 0e0b 0e0c 0e0d 0e0e 0e0f 0e10 0e11 0e12 0e13 0e14 0e15 0e16 0e17 0e18 0e19 0e1a 0e1b 0e1c 0e1d 0e1e 0e1f 0e20 0e21 0e22 0e23 0e24 0e25 0e26 0e27 0e28 0e29 0e2a 0e2b 0e2c 0e2d 0e2e 0e2f 0e30 0e31 0e32 0e33 0e34 0e35 0e36 0e37 0e38 0e39 0e3a XXXX XXXX XXXX XXXX 0e3f 0e40 0e41 0e42 0e43 0e44 0e45 0e46 0e47 0e48 0e49 0e4a 0e4b 0e4c 0e4d 0e4e 0e4f 0e50 0e51 0e52 0e53 0e54 0e55 0e56 0e57 0e58 0e59 0e5a 0e5b XXXX XXXX XXXX XXXX Another old DOS code page, submitted by a user and checked against the translation table at http://msdn.microsoft.com/en-us/goglobal/cc305161.aspx . charset CS_CP852 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c7 00fc 00e9 00e2 00e4 016f 0107 00e7 0142 00eb 0150 0151 00ee 0179 00c4 0106 00c9 0139 013a 00f4 00f6 013d 013e 015a 015b 00d6 00dc 0164 0165 0141 00d7 010d 00e1 00ed 00f3 00fa 0104 0105 017d 017e 0118 0119 00ac 017a 010c 015f 00ab 00bb 2591 2592 2593 2502 2524 00c1 00c2 011a 015e 2563 2551 2557 255d 017b 017c 2510 2514 2534 252c 251c 2500 253c 0102 0103 255a 2554 2569 2566 2560 2550 256c 00a4 0111 0110 010e 00cb 010f 0147 00cd 00ce 011b 2518 250c 2588 2584 0162 016e 2580 00d3 00df 00d4 0143 0144 0148 0160 0161 0154 00da 0155 0170 00fd 00dd 0163 00b4 00ad 02dd 02db 02c7 02d8 00a7 00f7 00b8 00b0 00a8 02d9 0171 0158 0159 25a0 00a0 Here are some Windows code pages, generated by this piece of Bourne shell: for i in 1250 1251 1252 1253 1254 1255 1256 1257 1258; do echo charset CS_CP$i gensbcs http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP$i.TXT echo done charset CS_CP1250 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a XXXX 201e 2026 2020 2021 XXXX 2030 0160 2039 015a 0164 017d 0179 XXXX 2018 2019 201c 201d 2022 2013 2014 XXXX 2122 0161 203a 015b 0165 017e 017a 00a0 02c7 02d8 0141 00a4 0104 00a6 00a7 00a8 00a9 015e 00ab 00ac 00ad 00ae 017b 00b0 00b1 02db 0142 00b4 00b5 00b6 00b7 00b8 0105 015f 00bb 013d 02dd 013e 017c 0154 00c1 00c2 0102 00c4 0139 0106 00c7 010c 00c9 0118 00cb 011a 00cd 00ce 010e 0110 0143 0147 00d3 00d4 0150 00d6 00d7 0158 016e 00da 0170 00dc 00dd 0162 00df 0155 00e1 00e2 0103 00e4 013a 0107 00e7 010d 00e9 0119 00eb 011b 00ed 00ee 010f 0111 0144 0148 00f3 00f4 0151 00f6 00f7 0159 016f 00fa 0171 00fc 00fd 0163 02d9 charset CS_CP1251 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0402 0403 201a 0453 201e 2026 2020 2021 20ac 2030 0409 2039 040a 040c 040b 040f 0452 2018 2019 201c 201d 2022 2013 2014 XXXX 2122 0459 203a 045a 045c 045b 045f 00a0 040e 045e 0408 00a4 0490 00a6 00a7 0401 00a9 0404 00ab 00ac 00ad 00ae 0407 00b0 00b1 0406 0456 0491 00b5 00b6 00b7 0451 2116 0454 00bb 0458 0405 0455 0457 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041a 041b 041c 041d 041e 041f 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042a 042b 042c 042d 042e 042f 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043a 043b 043c 043d 043e 043f 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044a 044b 044c 044d 044e 044f charset CS_CP1252 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a 0192 201e 2026 2020 2021 02c6 2030 0160 2039 0152 XXXX 017d XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 02dc 2122 0161 203a 0153 XXXX 017e 0178 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 00d0 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 00dd 00de 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 00f0 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 00fd 00fe 00ff charset CS_CP1253 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a 0192 201e 2026 2020 2021 XXXX 2030 XXXX 2039 XXXX XXXX XXXX XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 XXXX 2122 XXXX 203a XXXX XXXX XXXX XXXX 00a0 0385 0386 00a3 00a4 00a5 00a6 00a7 00a8 00a9 XXXX 00ab 00ac 00ad 00ae 2015 00b0 00b1 00b2 00b3 0384 00b5 00b6 00b7 0388 0389 038a 00bb 038c 00bd 038e 038f 0390 0391 0392 0393 0394 0395 0396 0397 0398 0399 039a 039b 039c 039d 039e 039f 03a0 03a1 XXXX 03a3 03a4 03a5 03a6 03a7 03a8 03a9 03aa 03ab 03ac 03ad 03ae 03af 03b0 03b1 03b2 03b3 03b4 03b5 03b6 03b7 03b8 03b9 03ba 03bb 03bc 03bd 03be 03bf 03c0 03c1 03c2 03c3 03c4 03c5 03c6 03c7 03c8 03c9 03ca 03cb 03cc 03cd 03ce XXXX charset CS_CP1254 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a 0192 201e 2026 2020 2021 02c6 2030 0160 2039 0152 XXXX XXXX XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 02dc 2122 0161 203a 0153 XXXX XXXX 0178 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 011e 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 0130 015e 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 011f 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 0131 015f 00ff charset CS_CP1255 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a 0192 201e 2026 2020 2021 02c6 2030 XXXX 2039 XXXX XXXX XXXX XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 02dc 2122 XXXX 203a XXXX XXXX XXXX XXXX 00a0 00a1 00a2 00a3 20aa 00a5 00a6 00a7 00a8 00a9 00d7 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00f7 00bb 00bc 00bd 00be 00bf 05b0 05b1 05b2 05b3 05b4 05b5 05b6 05b7 05b8 05b9 XXXX 05bb 05bc 05bd 05be 05bf 05c0 05c1 05c2 05c3 05f0 05f1 05f2 05f3 05f4 XXXX XXXX XXXX XXXX XXXX XXXX XXXX 05d0 05d1 05d2 05d3 05d4 05d5 05d6 05d7 05d8 05d9 05da 05db 05dc 05dd 05de 05df 05e0 05e1 05e2 05e3 05e4 05e5 05e6 05e7 05e8 05e9 05ea XXXX XXXX 200e 200f XXXX charset CS_CP1256 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac 067e 201a 0192 201e 2026 2020 2021 02c6 2030 0679 2039 0152 0686 0698 0688 06af 2018 2019 201c 201d 2022 2013 2014 06a9 2122 0691 203a 0153 200c 200d 06ba 00a0 060c 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 06be 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 061b 00bb 00bc 00bd 00be 061f 06c1 0621 0622 0623 0624 0625 0626 0627 0628 0629 062a 062b 062c 062d 062e 062f 0630 0631 0632 0633 0634 0635 0636 00d7 0637 0638 0639 063a 0640 0641 0642 0643 00e0 0644 00e2 0645 0646 0647 0648 00e7 00e8 00e9 00ea 00eb 0649 064a 00ee 00ef 064b 064c 064d 064e 00f4 064f 0650 00f7 0651 00f9 0652 00fb 00fc 200e 200f 06d2 charset CS_CP1257 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a XXXX 201e 2026 2020 2021 XXXX 2030 XXXX 2039 XXXX 00a8 02c7 00b8 XXXX 2018 2019 201c 201d 2022 2013 2014 XXXX 2122 XXXX 203a XXXX 00af 02db XXXX 00a0 XXXX 00a2 00a3 00a4 XXXX 00a6 00a7 00d8 00a9 0156 00ab 00ac 00ad 00ae 00c6 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00f8 00b9 0157 00bb 00bc 00bd 00be 00e6 0104 012e 0100 0106 00c4 00c5 0118 0112 010c 00c9 0179 0116 0122 0136 012a 013b 0160 0143 0145 00d3 014c 00d5 00d6 00d7 0172 0141 015a 016a 00dc 017b 017d 00df 0105 012f 0101 0107 00e4 00e5 0119 0113 010d 00e9 017a 0117 0123 0137 012b 013c 0161 0144 0146 00f3 014d 00f5 00f6 00f7 0173 0142 015b 016b 00fc 017c 017e 02d9 charset CS_CP1258 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a 0192 201e 2026 2020 2021 02c6 2030 XXXX 2039 0152 XXXX XXXX XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 02dc 2122 XXXX 203a 0153 XXXX XXXX 0178 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 0102 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 0300 00cd 00ce 00cf 0110 00d1 0309 00d3 00d4 01a0 00d6 00d7 00d8 00d9 00da 00db 00dc 01af 0303 00df 00e0 00e1 00e2 0103 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 0301 00ed 00ee 00ef 0111 00f1 0323 00f3 00f4 01a1 00f6 00f7 00f8 00f9 00fa 00fb 00fc 01b0 20ab 00ff KOI8-R, generated by this code: { echo charset CS_KOI8_R; gensbcs http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT; } charset CS_KOI8_R 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 2500 2502 250c 2510 2514 2518 251c 2524 252c 2534 253c 2580 2584 2588 258c 2590 2591 2592 2593 2320 25a0 2219 221a 2248 2264 2265 00a0 2321 00b0 00b2 00b7 00f7 2550 2551 2552 0451 2553 2554 2555 2556 2557 2558 2559 255a 255b 255c 255d 255e 255f 2560 2561 0401 2562 2563 2564 2565 2566 2567 2568 2569 256a 256b 256c 00a9 044e 0430 0431 0446 0434 0435 0444 0433 0445 0438 0439 043a 043b 043c 043d 043e 043f 044f 0440 0441 0442 0443 0436 0432 044c 044b 0437 0448 044d 0449 0447 044a 042e 0410 0411 0426 0414 0415 0424 0413 0425 0418 0419 041a 041b 041c 041d 041e 041f 042f 0420 0421 0422 0423 0416 0412 042c 042b 0417 0428 042d 0429 0427 042a KOI8-U: I can't find an easily machine-processable mapping table for this one, so I've created it by hand-editing the KOI8-R mapping table in accordance with the list of differences specified in RFC2319. Note that RFC2319 has an apparent error: position B4 is listed as U+0404 in the main character set list, but as U+0403 in Appendix A (differences from KOI8-R). Both agree that it should be CYRILLIC CAPITAL LETTER UKRAINIAN IE, however, and the Unicode character database says that therefore U+0404 is the correct value. charset CS_KOI8_U 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 2500 2502 250c 2510 2514 2518 251c 2524 252c 2534 253c 2580 2584 2588 258c 2590 2591 2592 2593 2320 25a0 2219 221a 2248 2264 2265 00a0 2321 00b0 00b2 00b7 00f7 2550 2551 2552 0451 0454 2554 0456 0457 2557 2558 2559 255a 255b 0491 255d 255e 255f 2560 2561 0401 0404 2563 0406 0407 2566 2567 2568 2569 256a 0490 256c 00a9 044e 0430 0431 0446 0434 0435 0444 0433 0445 0438 0439 043a 043b 043c 043d 043e 043f 044f 0440 0441 0442 0443 0436 0432 044c 044b 0437 0448 044d 0449 0447 044a 042e 0410 0411 0426 0414 0415 0424 0413 0425 0418 0419 041a 041b 041c 041d 041e 041f 042f 0420 0421 0422 0423 0416 0412 042c 042b 0417 0428 042d 0429 0427 042a KOI8-RU is apparently a Belarussian character set, with no obvious RFC definition. I'm somewhat confused by exactly what this character set is; the top few Google hits appear to agree with the IETF-style draft I found at http://cad.ntu-kpi.kiev.ua/multiling/koi8-ru/rfc-draft-koi8-ru.txt which defines lots of interesting characters in the 0x90-9f range (nice quote marks etc), but GNU iconv and the Linux kernel patch agree that none of this actually happened and that in fact KOI8-RU only differs from KOI8-U in positions 0xAE (U+045E) and 0xBE (U+040E). I've gone with existing software, so that -U and -RU are almost identical. The table below was constructed by hand-editing the above KOI8-U table at those two code positions. charset CS_KOI8_RU 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 2500 2502 250c 2510 2514 2518 251c 2524 252c 2534 253c 2580 2584 2588 258c 2590 2591 2592 2593 2320 25a0 2219 221a 2248 2264 2265 00a0 2321 00b0 00b2 00b7 00f7 2550 2551 2552 0451 0454 2554 0456 0457 2557 2558 2559 255a 255b 0491 045e 255e 255f 2560 2561 0401 0404 2563 0406 0407 2566 2567 2568 2569 256a 0490 040e 00a9 044e 0430 0431 0446 0434 0435 0444 0433 0445 0438 0439 043a 043b 043c 043d 043e 043f 044f 0440 0441 0442 0443 0436 0432 044c 044b 0437 0448 044d 0449 0447 044a 042e 0410 0411 0426 0414 0415 0424 0413 0425 0418 0419 041a 041b 041c 041d 041e 041f 042f 0420 0421 0422 0423 0416 0412 042c 042b 0417 0428 042d 0429 0427 042a JIS X 0201, also known as JIS-Roman. Bottom half is basically ASCII, but with yen in place of backslash and overline in place of tilde. Top half contains half-width katakana. Generated by the following bourne shell: echo charset CS_JISX0201 gensbcs http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0201.TXT charset CS_JISX0201 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 00a5 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 203e 007f XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX ff61 ff62 ff63 ff64 ff65 ff66 ff67 ff68 ff69 ff6a ff6b ff6c ff6d ff6e ff6f ff70 ff71 ff72 ff73 ff74 ff75 ff76 ff77 ff78 ff79 ff7a ff7b ff7c ff7d ff7e ff7f ff80 ff81 ff82 ff83 ff84 ff85 ff86 ff87 ff88 ff89 ff8a ff8b ff8c ff8d ff8e ff8f ff90 ff91 ff92 ff93 ff94 ff95 ff96 ff97 ff98 ff99 ff9a ff9b ff9c ff9d ff9e ff9f XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX Various Mac character sets, generated by: for i in ROMAN TURKISH CROATIAN ICELAND ROMANIAN GREEK CYRILLIC THAI \ CENTEURO SYMBOL DINGBATS; do echo charset CS_MAC_$i gensbcs http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/$i.TXT | \ sed s/f8a0/XXXX/ echo done The code point F8FF at position F0 in Mac OS Roman an interesting one. In Unicode, it's the last of the Private Use section. The mapping table states that it should be an Apple logo. I suppose we should just leave it as it is; there's bound to be some software out there that understands U+F8FF to be an Apple logo! Code point F8A0 at position F5 in Mac OS Turkish is actually just an undefined character, so we make it properly undefined. Many of the positions 80-9F in Mac OS Thai are for presentation forms of other characters. When converting from Unicode, we use `sortpriority' to avoid them. Positions E2-E4 in Mac OS Symbol are for sans-serif variants of other characters. Similarly, we avoid them. charset CS_MAC_ROMAN 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 2020 00b0 00a2 00a3 00a7 2022 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 00c6 00d8 221e 00b1 2264 2265 00a5 00b5 2202 2211 220f 03c0 222b 00aa 00ba 03a9 00e6 00f8 00bf 00a1 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 00c0 00c3 00d5 0152 0153 2013 2014 201c 201d 2018 2019 00f7 25ca 00ff 0178 2044 20ac 2039 203a fb01 fb02 2021 00b7 201a 201e 2030 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 f8ff 00d2 00da 00db 00d9 0131 02c6 02dc 00af 02d8 02d9 02da 00b8 02dd 02db 02c7 charset CS_MAC_TURKISH 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 2020 00b0 00a2 00a3 00a7 2022 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 00c6 00d8 221e 00b1 2264 2265 00a5 00b5 2202 2211 220f 03c0 222b 00aa 00ba 03a9 00e6 00f8 00bf 00a1 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 00c0 00c3 00d5 0152 0153 2013 2014 201c 201d 2018 2019 00f7 25ca 00ff 0178 011e 011f 0130 0131 015e 015f 2021 00b7 201a 201e 2030 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 f8ff 00d2 00da 00db 00d9 XXXX 02c6 02dc 00af 02d8 02d9 02da 00b8 02dd 02db 02c7 charset CS_MAC_CROATIAN 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 2020 00b0 00a2 00a3 00a7 2022 00b6 00df 00ae 0160 2122 00b4 00a8 2260 017d 00d8 221e 00b1 2264 2265 2206 00b5 2202 2211 220f 0161 222b 00aa 00ba 03a9 017e 00f8 00bf 00a1 00ac 221a 0192 2248 0106 00ab 010c 2026 00a0 00c0 00c3 00d5 0152 0153 0110 2014 201c 201d 2018 2019 00f7 25ca f8ff 00a9 2044 20ac 2039 203a 00c6 00bb 2013 00b7 201a 201e 2030 00c2 0107 00c1 010d 00c8 00cd 00ce 00cf 00cc 00d3 00d4 0111 00d2 00da 00db 00d9 0131 02c6 02dc 00af 03c0 00cb 02da 00b8 00ca 00e6 02c7 charset CS_MAC_ICELAND 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 00dd 00b0 00a2 00a3 00a7 2022 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 00c6 00d8 221e 00b1 2264 2265 00a5 00b5 2202 2211 220f 03c0 222b 00aa 00ba 03a9 00e6 00f8 00bf 00a1 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 00c0 00c3 00d5 0152 0153 2013 2014 201c 201d 2018 2019 00f7 25ca 00ff 0178 2044 20ac 00d0 00f0 00de 00fe 00fd 00b7 201a 201e 2030 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 f8ff 00d2 00da 00db 00d9 0131 02c6 02dc 00af 02d8 02d9 02da 00b8 02dd 02db 02c7 charset CS_MAC_ROMANIAN 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 2020 00b0 00a2 00a3 00a7 2022 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 0102 0218 221e 00b1 2264 2265 00a5 00b5 2202 2211 220f 03c0 222b 00aa 00ba 03a9 0103 0219 00bf 00a1 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 00c0 00c3 00d5 0152 0153 2013 2014 201c 201d 2018 2019 00f7 25ca 00ff 0178 2044 20ac 2039 203a 021a 021b 2021 00b7 201a 201e 2030 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 f8ff 00d2 00da 00db 00d9 0131 02c6 02dc 00af 02d8 02d9 02da 00b8 02dd 02db 02c7 charset CS_MAC_GREEK 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00b9 00b2 00c9 00b3 00d6 00dc 0385 00e0 00e2 00e4 0384 00a8 00e7 00e9 00e8 00ea 00eb 00a3 2122 00ee 00ef 2022 00bd 2030 00f4 00f6 00a6 20ac 00f9 00fb 00fc 2020 0393 0394 0398 039b 039e 03a0 00df 00ae 00a9 03a3 03aa 00a7 2260 00b0 00b7 0391 00b1 2264 2265 00a5 0392 0395 0396 0397 0399 039a 039c 03a6 03ab 03a8 03a9 03ac 039d 00ac 039f 03a1 2248 03a4 00ab 00bb 2026 00a0 03a5 03a7 0386 0388 0153 2013 2015 201c 201d 2018 2019 00f7 0389 038a 038c 038e 03ad 03ae 03af 03cc 038f 03cd 03b1 03b2 03c8 03b4 03b5 03c6 03b3 03b7 03b9 03be 03ba 03bb 03bc 03bd 03bf 03c0 03ce 03c1 03c3 03c4 03b8 03c9 03c2 03c7 03c5 03b6 03ca 03cb 0390 03b0 00ad charset CS_MAC_CYRILLIC 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041a 041b 041c 041d 041e 041f 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042a 042b 042c 042d 042e 042f 2020 00b0 0490 00a3 00a7 2022 00b6 0406 00ae 00a9 2122 0402 0452 2260 0403 0453 221e 00b1 2264 2265 0456 00b5 0491 0408 0404 0454 0407 0457 0409 0459 040a 045a 0458 0405 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 040b 045b 040c 045c 0455 2013 2014 201c 201d 2018 2019 00f7 201e 040e 045e 040f 045f 2116 0401 0451 044f 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043a 043b 043c 043d 043e 043f 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044a 044b 044c 044d 044e 20ac charset CS_MAC_THAI sortpriority 83-8C -1 sortpriority 8F-8F -1 sortpriority 92-9C -1 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00ab 00bb 2026 0e48 0e49 0e4a 0e4b 0e4c 0e48 0e49 0e4a 0e4b 0e4c 201c 201d 0e4d XXXX 2022 0e31 0e47 0e34 0e35 0e36 0e37 0e48 0e49 0e4a 0e4b 0e4c 2018 2019 XXXX 00a0 0e01 0e02 0e03 0e04 0e05 0e06 0e07 0e08 0e09 0e0a 0e0b 0e0c 0e0d 0e0e 0e0f 0e10 0e11 0e12 0e13 0e14 0e15 0e16 0e17 0e18 0e19 0e1a 0e1b 0e1c 0e1d 0e1e 0e1f 0e20 0e21 0e22 0e23 0e24 0e25 0e26 0e27 0e28 0e29 0e2a 0e2b 0e2c 0e2d 0e2e 0e2f 0e30 0e31 0e32 0e33 0e34 0e35 0e36 0e37 0e38 0e39 0e3a 2060 200b 2013 2014 0e3f 0e40 0e41 0e42 0e43 0e44 0e45 0e46 0e47 0e48 0e49 0e4a 0e4b 0e4c 0e4d 2122 0e4f 0e50 0e51 0e52 0e53 0e54 0e55 0e56 0e57 0e58 0e59 00ae 00a9 XXXX XXXX XXXX XXXX charset CS_MAC_CENTEURO 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 0100 0101 00c9 0104 00d6 00dc 00e1 0105 010c 00e4 010d 0106 0107 00e9 0179 017a 010e 00ed 010f 0112 0113 0116 00f3 0117 00f4 00f6 00f5 00fa 011a 011b 00fc 2020 00b0 0118 00a3 00a7 2022 00b6 00df 00ae 00a9 2122 0119 00a8 2260 0123 012e 012f 012a 2264 2265 012b 0136 2202 2211 0142 013b 013c 013d 013e 0139 013a 0145 0146 0143 00ac 221a 0144 0147 2206 00ab 00bb 2026 00a0 0148 0150 00d5 0151 014c 2013 2014 201c 201d 2018 2019 00f7 25ca 014d 0154 0155 0158 2039 203a 0159 0156 0157 0160 201a 201e 0161 015a 015b 00c1 0164 0165 00cd 017d 017e 016a 00d3 00d4 016b 016e 00da 016f 0170 0171 0172 0173 00dd 00fd 0137 017b 0141 017c 0122 02c7 charset CS_MAC_SYMBOL sortpriority E2-E4 -1 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 2200 0023 2203 0025 0026 220d 0028 0029 2217 002b 002c 2212 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 2245 0391 0392 03a7 0394 0395 03a6 0393 0397 0399 03d1 039a 039b 039c 039d 039f 03a0 0398 03a1 03a3 03a4 03a5 03c2 03a9 039e 03a8 0396 005b 2234 005d 22a5 005f f8e5 03b1 03b2 03c7 03b4 03b5 03c6 03b3 03b7 03b9 03d5 03ba 03bb 03bc 03bd 03bf 03c0 03b8 03c1 03c3 03c4 03c5 03d6 03c9 03be 03c8 03b6 007b 007c 007d 223c 007f XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 20ac 03d2 2032 2264 2044 221e 0192 2663 2666 2665 2660 2194 2190 2191 2192 2193 00b0 00b1 2033 2265 00d7 221d 2202 2022 00f7 2260 2261 2248 2026 f8e6 23af 21b5 2135 2111 211c 2118 2297 2295 2205 2229 222a 2283 2287 2284 2282 2286 2208 2209 2220 2207 00ae 00a9 2122 220f 221a 22c5 00ac 2227 2228 21d4 21d0 21d1 21d2 21d3 22c4 3008 00ae 00a9 2122 2211 239b 239c 239d 23a1 23a2 23a3 23a7 23a8 23a9 23aa f8ff 3009 222b 2320 23ae 2321 239e 239f 23a0 23a4 23a5 23a6 23ab 23ac 23ad XXXX charset CS_MAC_DINGBATS 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 2701 2702 2703 2704 260e 2706 2707 2708 2709 261b 261e 270c 270d 270e 270f 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 271a 271b 271c 271d 271e 271f 2720 2721 2722 2723 2724 2725 2726 2727 2605 2729 272a 272b 272c 272d 272e 272f 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 273a 273b 273c 273d 273e 273f 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 274a 274b 25cf 274d 25a0 274f 2750 2751 2752 25b2 25bc 25c6 2756 25d7 2758 2759 275a 275b 275c 275d 275e 007f 2768 2769 276a 276b 276c 276d 276e 276f 2770 2771 2772 2773 2774 2775 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 2761 2762 2763 2764 2765 2766 2767 2663 2666 2665 2660 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2776 2777 2778 2779 277a 277b 277c 277d 277e 277f 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 278a 278b 278c 278d 278e 278f 2790 2791 2792 2793 2794 2192 2194 2195 2798 2799 279a 279b 279c 279d 279e 279f 27a0 27a1 27a2 27a3 27a4 27a5 27a6 27a7 27a8 27a9 27aa 27ab 27ac 27ad 27ae 27af XXXX 27b1 27b2 27b3 27b4 27b5 27b6 27b7 27b8 27b9 27ba 27bb 27bc 27bd 27be XXXX Various Mac character sets have older (usually pre-Euro) variants which are documented in the comments in their mapping tables. I've manually applied these changes below. Mac OS Roman variants before Mac OS 8.5 (CURRENCY SIGN rather than EURO SIGN): charset CS_MAC_ROMAN_OLD 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 2020 00b0 00a2 00a3 00a7 2022 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 00c6 00d8 221e 00b1 2264 2265 00a5 00b5 2202 2211 220f 03c0 222b 00aa 00ba 03a9 00e6 00f8 00bf 00a1 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 00c0 00c3 00d5 0152 0153 2013 2014 201c 201d 2018 2019 00f7 25ca 00ff 0178 2044 00a4 2039 203a fb01 fb02 2021 00b7 201a 201e 2030 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 f8ff 00d2 00da 00db 00d9 0131 02c6 02dc 00af 02d8 02d9 02da 00b8 02dd 02db 02c7 charset CS_MAC_CROATIAN_OLD 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 2020 00b0 00a2 00a3 00a7 2022 00b6 00df 00ae 0160 2122 00b4 00a8 2260 017d 00d8 221e 00b1 2264 2265 2206 00b5 2202 2211 220f 0161 222b 00aa 00ba 03a9 017e 00f8 00bf 00a1 00ac 221a 0192 2248 0106 00ab 010c 2026 00a0 00c0 00c3 00d5 0152 0153 0110 2014 201c 201d 2018 2019 00f7 25ca f8ff 00a9 2044 00a4 2039 203a 00c6 00bb 2013 00b7 201a 201e 2030 00c2 0107 00c1 010d 00c8 00cd 00ce 00cf 00cc 00d3 00d4 0111 00d2 00da 00db 00d9 0131 02c6 02dc 00af 03c0 00cb 02da 00b8 00ca 00e6 02c7 charset CS_MAC_ICELAND_OLD 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 00dd 00b0 00a2 00a3 00a7 2022 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 00c6 00d8 221e 00b1 2264 2265 00a5 00b5 2202 2211 220f 03c0 222b 00aa 00ba 03a9 00e6 00f8 00bf 00a1 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 00c0 00c3 00d5 0152 0153 2013 2014 201c 201d 2018 2019 00f7 25ca 00ff 0178 2044 00a4 00d0 00f0 00de 00fe 00fd 00b7 201a 201e 2030 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 f8ff 00d2 00da 00db 00d9 0131 02c6 02dc 00af 02d8 02d9 02da 00b8 02dd 02db 02c7 charset CS_MAC_ROMANIAN_OLD 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 2020 00b0 00a2 00a3 00a7 2022 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 0102 0218 221e 00b1 2264 2265 00a5 00b5 2202 2211 220f 03c0 222b 00aa 00ba 03a9 0103 0219 00bf 00a1 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 00c0 00c3 00d5 0152 0153 2013 2014 201c 201d 2018 2019 00f7 25ca 00ff 0178 2044 00a4 2039 203a 021a 021b 2021 00b7 201a 201e 2030 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 f8ff 00d2 00da 00db 00d9 0131 02c6 02dc 00af 02d8 02d9 02da 00b8 02dd 02db 02c7 Mac OS Greek before Mac OS 9.2.2 (SOFT HYPHEN instead of EURO SIGN, and undefined instead of SOFT HYPHEN). charset CS_MAC_GREEK_OLD 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00b9 00b2 00c9 00b3 00d6 00dc 0385 00e0 00e2 00e4 0384 00a8 00e7 00e9 00e8 00ea 00eb 00a3 2122 00ee 00ef 2022 00bd 2030 00f4 00f6 00a6 00ad 00f9 00fb 00fc 2020 0393 0394 0398 039b 039e 03a0 00df 00ae 00a9 03a3 03aa 00a7 2260 00b0 00b7 0391 00b1 2264 2265 00a5 0392 0395 0396 0397 0399 039a 039c 03a6 03ab 03a8 03a9 03ac 039d 00ac 039f 03a1 2248 03a4 00ab 00bb 2026 00a0 03a5 03a7 0386 0388 0153 2013 2015 201c 201d 2018 2019 00f7 0389 038a 038c 038e 03ad 03ae 03af 03cc 038f 03cd 03b1 03b2 03c8 03b4 03b5 03c6 03b3 03b7 03b9 03be 03ba 03bb 03bc 03bd 03bf 03c0 03ce 03c1 03c3 03c4 03b8 03c9 03c2 03c7 03c5 03b6 03ca 03cb 0390 03b0 XXXX Mac OS Cyrillic before Mac OS 9.0 (CENT SIGN instead of CYRILLIC CAPITAL LETTER GHE WITH UPTURN, PARTIAL DIFFERENTIAL instead of CYRILLIC SMALL LETTER GHE WITH UPTURN, CURRENCY SIGN instead of EURO SIGN): charset CS_MAC_CYRILLIC_OLD 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041a 041b 041c 041d 041e 041f 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042a 042b 042c 042d 042e 042f 2020 00b0 00a2 00a3 00a7 2022 00b6 0406 00ae 00a9 2122 0402 0452 2260 0403 0453 221e 00b1 2264 2265 0456 00b5 2022 0408 0404 0454 0407 0457 0409 0459 040a 045a 0458 0405 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 040b 045b 040c 045c 0455 2013 2014 201c 201d 2018 2019 00f7 201e 040e 045e 040f 045f 2116 0401 0451 044f 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043a 043b 043c 043d 043e 043f 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044a 044b 044c 044d 044e 00a4 Mac OS Ukrainian (now Cyrillic) before Mac OS 9.0 (CURRENCY SIGN instead of EURO SIGN): charset CS_MAC_UKRAINE 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041a 041b 041c 041d 041e 041f 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042a 042b 042c 042d 042e 042f 2020 00b0 0490 00a3 00a7 2022 00b6 0406 00ae 00a9 2122 0402 0452 2260 0403 0453 221e 00b1 2264 2265 0456 00b5 0491 0408 0404 0454 0407 0457 0409 0459 040a 045a 0458 0405 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 040b 045b 040c 045c 0455 2013 2014 201c 201d 2018 2019 00f7 201e 040e 045e 040f 045f 2116 0401 0451 044f 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043a 043b 043c 043d 043e 043f 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044a 044b 044c 044d 044e 00a4 Mac OS VT100 character set, as used by the "VT100" font. Basically Mac OS Roman hacked about to give it an almost-Latin1 repertoire and most of the VT100 line-drawing set too. Point CA is the backward question-mark used for silo overflows. This table was derived by pasting the relevant part of 'utom' 140 from the "Western Language Encodings" file shipped with TEC 1.5 and then manually fixing up the scan line characters to use the Unicode 3.2 HORIZONTAL SCAN LINE characters rather than UPPER ONE EIGHTH BLOCK and LOWER ONE EIGHTH BLOCK with transcoding hints. charset CS_MAC_VT100 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 240a 240b 240c 240d 240e 240f 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 241a 241b 241c 241d 241e 241f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 2421 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 00dd 00b0 00a2 00a3 00a7 00b8 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 00c6 00d8 00d7 00b1 2264 2265 00a5 00b5 00b9 00b2 00b3 03c0 00a6 00aa 00ba 2592 00e6 00f8 00bf 00a1 00ac 00bd 0192 00bc 00be 00ab 00bb 2026 XXXX 00c0 00c3 00d5 0152 0153 2013 2014 2518 2510 250c 2514 00f7 2022 00ff 0178 253c 20ac 00d0 00f0 00fe 00de 00fd 00b7 23ba 23bb 2500 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 XXXX 00d2 00da 00db 00d9 23bc 23bd 251c 2524 2534 252c 2502 XXXX XXXX XXXX XXXX As with so many others, before Mac OS 8.5 this font had CURRENCY SIGN rather than EURO SIGN. charset CS_MAC_VT100_OLD 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 240a 240b 240c 240d 240e 240f 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 241a 241b 241c 241d 241e 241f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 2421 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 00dd 00b0 00a2 00a3 00a7 00b8 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 00c6 00d8 00d7 00b1 2264 2265 00a5 00b5 00b9 00b2 00b3 03c0 00a6 00aa 00ba 2592 00e6 00f8 00bf 00a1 00ac 00bd 0192 00bc 00be 00ab 00bb 2026 XXXX 00c0 00c3 00d5 0152 0153 2013 2014 2518 2510 250c 2514 00f7 2022 00ff 0178 253c 00a4 00d0 00f0 00fe 00de 00fd 00b7 23ba 23bb 2500 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 XXXX 00d2 00da 00db 00d9 23bc 23bd 251c 2524 2534 252c 2502 XXXX XXXX XXXX XXXX Roman Czyborra's web site (http://czyborra.com/) has a variety of other useful mapping tables, in a slightly different format (and gzipped). Here's a shell/Perl function to generate an SBCS table from a Czyborra mapping table: gensbcs_c() { wget -q -O - "$1" | gzip -d | \ perl -ne '/^=(.*)\s+U\+(.*)\s+/ and $a[hex $1]=sprintf "%04x", hex $2;' \ -e 'BEGIN{for($i=0;$i<256;$i++){$a[$i]="XXXX";' \ -e 'if ($i < 32 or ($i >=127 and $i < 160)) {$a[$i]=sprintf "%04x", $i}}}' \ -e 'END{for($i=0;$i<256;$i++){printf"%s%s",$a[$i],$i%16==15?"\n":" "}}' } So here we have some character sets generated from Czyborra mapping tables: VISCII, HP-Roman8, and the DEC Multinational Character Set. { echo charset CS_VISCII; gensbcs_c http://czyborra.com/charsets/viscii.txt.gz; echo; echo charset CS_HP_ROMAN8; gensbcs_c http://czyborra.com/charsets/hp-roman8.txt.gz; echo; echo charset CS_DEC_MCS; gensbcs_c http://czyborra.com/charsets/dec-mcs.txt.gz; echo; } charset CS_VISCII 0000 0001 1eb2 0003 0004 1eb4 1eaa 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 1ef6 0015 0016 0017 0018 1ef8 001a 001b 001c 001d 1ef4 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 1ea0 1eae 1eb0 1eb6 1ea4 1ea6 1ea8 1eac 1ebc 1eb8 1ebe 1ec0 1ec2 1ec4 1ec6 1ed0 1ed2 1ed4 1ed6 1ed8 1ee2 1eda 1edc 1ede 1eca 1ece 1ecc 1ec8 1ee6 0168 1ee4 1ef2 00d5 1eaf 1eb1 1eb7 1ea5 1ea7 1ea8 1ead 1ebd 1eb9 1ebf 1ec1 1ec3 1ec5 1ec7 1ed1 1ed3 1ed5 1ed7 1ee0 01a0 1ed9 1edd 1edf 1ecb 1ef0 1ee8 1eea 1eec 01a1 1edb 01af 00c0 00c1 00c2 00c3 1ea2 0102 1eb3 1eb5 00c8 00c9 00ca 1eba 00cc 00cd 0128 1ef3 0110 1ee9 00d2 00d3 00d4 1ea1 1ef7 1eeb 1eed 00d9 00da 1ef9 1ef5 00dd 1ee1 01b0 00e0 00e1 00e2 00e3 1ea3 0103 1eef 1eab 00e8 00e9 00ea 1ebb 00ec 00ed 0129 1ec9 0111 1ef1 00f2 00f3 00f4 00f5 1ecf 1ecd 1ee5 00f9 00fa 0169 1ee7 00fd 1ee3 1eee charset CS_HP_ROMAN8 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 00c0 00c2 00c8 00ca 00cb 00ce 00cf 00b4 02cb 02c6 00a8 02dc 00d9 00db 20a4 00af 00dd 00fd 00b0 00c7 00e7 00d1 00f1 00a1 00bf 00a4 00a3 00a5 00a7 0192 00a2 00e2 00ea 00f4 00fb 00e1 00e9 00f3 00fa 00e0 00e8 00f2 00f9 00e4 00eb 00f6 00fc 00c5 00ee 00d8 00c6 00e5 00ed 00f8 00e6 00c4 00ec 00d6 00dc 00c9 00ef 00df 00d4 00c1 00c3 00e3 00d0 00f0 00cd 00cc 00d3 00d2 00d5 00f5 0160 0161 00da 0178 00ff 00de 00fe 00b7 00b5 00b6 00be 2014 00bc 00bd 00aa 00ba 00ab 25a0 00bb 00b1 XXXX charset CS_DEC_MCS 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f XXXX 00a1 00a2 00a3 XXXX 00a5 XXXX 00a7 00a4 00a9 00aa 00ab XXXX XXXX XXXX XXXX 00b0 00b1 00b2 00b3 XXXX 00b5 00b6 00b7 XXXX 00b9 00ba 00bb 00bc 00bd XXXX 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf XXXX 00d1 00d2 00d3 00d4 00d5 00d6 0152 00d8 00d9 00da 00db 00dc 0178 XXXX 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef XXXX 00f1 00f2 00f3 00f4 00f5 00f6 0153 00f8 00f9 00fa 00fb 00fc 00ff XXXX XXXX PDFDocEncoding is a custom superset of ISO-8859-1, used for non-printed text strings in PDF documents (things like document outline entries and metadata). Obtaining its conversion table is fiddly; I had to cut and paste PS character names and octal encoding positions from Appendix D of the PDF specification, then look up each PostScript character name in the Adobe Glyph List to convert it to Unicode. The Adobe Glyph List is at http://partners.adobe.com/asn/tech/type/aglfn13.txt (but redirects to something with the filename `glyphlist.txt', which is therefore how it will be retrieved by wget and how I'll refer to it below) and the somewhat unwieldy shell script I used looked like this: # Preserve control characters for c1 in 0 1 2 3 4 5 6 7 8 9 A B C D E F; do for c2 in 0 1; do eval "chr$[16*$c2 + 0x$c1]=00$c2$c1" done done # The code below misses out the code point at 0xAD for some # reason. Since PDFDocEncoding is supposed to be a superset of # 8859-1, I reinstate it as the 8859-1 character. chr173=00AD char() { if grep -q "^$1;" glyphlist.txt; then oifs="$IFS" IFS=\; set -- $[0$2] `grep "^$1;" glyphlist.txt` IFS="$oifs" eval "chr$1=$3"; else echo "/$1 not found!" fi } char A 101; char AE 306; char Aacute 301; char Acircumflex 302; char Adieresis 304; char Agrave 300; char Aring 305; char Atilde 303; char B 102; char C 103; char Ccedilla 307; char D 104; char E 105; char Eacute 311; char Ecircumflex 312; char Edieresis 313; char Egrave 310; char Eth 320; char Euro 240; char F 106; char G 107; char H 110; char I 111; char Iacute 315; char Icircumflex 316; char Idieresis 317; char Igrave 314; char J 112; char K 113; char L 114; char Lslash 225; char M 115; char N 116; char Ntilde 321; char O 117; char OE 226; char Oacute 323; char Ocircumflex 324; char Odieresis 326; char Ograve 322; char Oslash 330; char Otilde 325; char P 120; char Q 121; char R 122; char S 123; char Scaron 227; char T 124; char Thorn 336; char U 125; char Uacute 332; char Ucircumflex 333; char Udieresis 334; char Ugrave 331; char V 126; char W 127; char X 130; char Y 131; char Yacute 335; char Ydieresis 230; char Z 132; char Zcaron 231; char a 141; char aacute 341; char acircumflex 342; char acute 264; char adieresis 344; char ae 346; char agrave 340; char ampersand 046; char aring 345; char asciicircum 136; char asciitilde 176; char asterisk 052; char at 100; char atilde 343; char b 142; char backslash 134; char bar 174; char braceleft 173; char braceright 175; char bracketleft 133; char bracketright 135; char breve 030; char brokenbar 246; char bullet 200; char c 143; char caron 031; char ccedilla 347; char cedilla 270; char cent 242; char circumflex 032; char colon 072; char comma 054; char copyright 251; char currency 244; char d 144; char dagger 201; char daggerdbl 202; char degree 260; char dieresis 250; char divide 367; char dollar 044; char dotaccent 033; char dotlessi 232; char e 145; char eacute 351; char ecircumflex 352; char edieresis 353; char egrave 350; char eight 070; char ellipsis 203; char emdash 204; char endash 205; char equal 075; char eth 360; char exclam 041; char exclamdown 241; char f 146; char fi 223; char five 065; char fl 224; char florin 206; char four 064; char fraction 207; char g 147; char germandbls 337; char grave 140; char greater 076; char guillemotleft 253; char guillemotright 273; char guilsinglleft 210; char guilsinglright 211; char h 150; char hungarumlaut 034; char hyphen 055; char i 151; char iacute 355; char icircumflex 356; char idieresis 357; char igrave 354; char j 152; char k 153; char l 154; char less 074; char logicalnot 254; char lslash 233; char m 155; char macron 257; char minus 212; char mu 265; char multiply 327; char n 156; char nine 071; char ntilde 361; char numbersign 043; char o 157; char oacute 363; char ocircumflex 364; char odieresis 366; char oe 234; char ogonek 035; char ograve 362; char one 061; char onehalf 275; char onequarter 274; char onesuperior 271; char ordfeminine 252; char ordmasculine 272; char oslash 370; char otilde 365; char p 160; char paragraph 266; char parenleft 050; char parenright 051; char percent 045; char period 056; char periodcentered 267; char perthousand 213; char plus 053; char plusminus 261; char q 161; char question 077; char questiondown 277; char quotedbl 042; char quotedblbase 214; char quotedblleft 215; char quotedblright 216; char quoteleft 217; char quoteright 220; char quotesinglbase 221; char quotesingle 047; char r 162; char registered 256; char ring 036; char s 163; char scaron 235; char section 247; char semicolon 073; char seven 067; char six 066; char slash 057; char space 040; char sterling 243; char t 164; char thorn 376; char three 063; char threequarters 276; char threesuperior 263; char tilde 037; char trademark 222; char two 062; char twosuperior 262; char u 165; char uacute 372; char ucircumflex 373; char udieresis 374; char ugrave 371; char underscore 137; char v 166; char w 167; char x 170; char y 171; char yacute 375; char ydieresis 377; char yen 245; char z 172; char zcaron 236; char zero 060; for row in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do for col in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do val=$[16*$row + $col] eval "code=\${chr$val-XXXX}" if [ $col == 15 ]; then echo "$code" else echo -n "$code " fi done done charset CS_PDF 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F 0010 0011 0012 0013 0014 0015 0016 0017 02D8 02C7 02C6 02D9 02DD 02DB 02DA 02DC 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E XXXX 2022 2020 2021 2026 2014 2013 0192 2044 2039 203A 2212 2030 201E 201C 201D 2018 2019 201A 2122 FB01 FB02 0141 0152 0160 0178 017D 0131 0142 0153 0161 017E XXXX 20AC 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0 00B1 00B2 00B3 00B4 00B5 00B6 00B7 00B8 00B9 00BA 00BB 00BC 00BD 00BE 00BF 00C0 00C1 00C2 00C3 00C4 00C5 00C6 00C7 00C8 00C9 00CA 00CB 00CC 00CD 00CE 00CF 00D0 00D1 00D2 00D3 00D4 00D5 00D6 00D7 00D8 00D9 00DA 00DB 00DC 00DD 00DE 00DF 00E0 00E1 00E2 00E3 00E4 00E5 00E6 00E7 00E8 00E9 00EA 00EB 00EC 00ED 00EE 00EF 00F0 00F1 00F2 00F3 00F4 00F5 00F6 00F7 00F8 00F9 00FA 00FB 00FC 00FD 00FE 00FF PostScript's StandardEncoding is most easily acquired by reading it out of GhostScript as a list of Adobe glyph names, which can then be looked up in glyphlist.txt as above. echo 'StandardEncoding {==} forall' | gs -sDEVICE=nullpage -q - | \ for row in 0 1 2 3 4 5 6 7 8 9 A B C D E F; do for col in 0 1 2 3 4 5 6 7 8 9 A B C D E F; do read glyph glyph=${glyph#/} if grep -q "^$glyph;" glyphlist.txt; then set -- `grep "^$glyph;" glyphlist.txt | tr -d '\r' | cut -f2 -d\;` code=$1 else code="XXXX" fi if [ $row == 0 -o $row == 1 ]; then code="00$row$col" fi if [ $col == F ]; then echo $code else echo -n $code echo -n " " fi done done charset CS_PSSTD 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F 0020 0021 0022 0023 0024 0025 0026 2019 0028 0029 002A 002B 002C 002D 002E 002F 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F 2018 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 00A1 00A2 00A3 2044 00A5 0192 00A7 00A4 0027 201C 00AB 2039 203A FB01 FB02 XXXX 2013 2020 2021 00B7 XXXX 00B6 2022 201A 201E 201D 00BB 2026 2030 XXXX 00BF XXXX 0060 00B4 02C6 02DC 00AF 02D8 02D9 00A8 XXXX 02DA 00B8 XXXX 02DD 02DB 02C7 2014 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 00C6 XXXX 00AA XXXX XXXX XXXX XXXX 0141 00D8 0152 00BA XXXX XXXX XXXX XXXX XXXX 00E6 XXXX XXXX XXXX 0131 XXXX XXXX 0142 00F8 0153 00DF XXXX XXXX XXXX XXXX ��������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/sbcsgen.pl����������������������������������������������������������������������0000644�0001753�0001753�00000007053�12444773746�013373� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env perl -w # This script generates sbcsdat.c (the data for all the SBCSes) from its # source form sbcs.dat. $infile = "sbcs.dat"; $infile = shift @ARGV if defined $ARGV[0]; $outfile = "sbcsdat.c"; $outfile = shift @ARGV if defined $ARGV[0]; $outheader = "sbcsdat.h"; $outheader = shift @ARGV if defined $ARGV[0]; open FOO, $infile; open BAR, ">$outfile"; select BAR; print "/*\n"; print " * sbcsdat.c - data definitions for single-byte character sets.\n"; print " *\n"; print " * Generated by sbcsgen.pl from sbcs.dat.\n"; print " * You should edit those files rather than editing this one.\n"; print " */\n"; print "\n"; print "#ifndef ENUM_CHARSETS\n"; print "\n"; print "#include \"charset.h\"\n"; print "#include \"internal.h\"\n"; print "\n"; my $charsetname = undef; my @vals = (); my @charsetnames = (); my @sortpriority = (); while (<FOO>) { chomp; y/\r\n//; # robustness in the face of strange line endings if (/^charset (.*)$/) { $charsetname = $1; @vals = (); @sortpriority = map { 0 } 0..255; } elsif (/^sortpriority ([^-]*)-([^-]*) (.*)$/) { for ($i = hex $1; $i <= hex $2; $i++) { $sortpriority[$i] += $3; } } elsif (/^[0-9a-fA-FX]/) { push @vals, map { $_ eq "XXXX" ? -1 : hex $_ } split / +/, $_; if (scalar @vals > 256) { die "$infile:$.: charset $charsetname has more than 256 values\n"; } elsif (scalar @vals == 256) { &outcharset($charsetname, \@vals, \@sortpriority); push @charsetnames, $charsetname; $charsetname = undef; @vals = (); @sortpriority = map { 0 } 0..255; } } } print "#else /* ENUM_CHARSETS */\n"; print "\n"; foreach $i (@charsetnames) { print "ENUM_CHARSET($i)\n"; } print "\n"; print "#endif /* ENUM_CHARSETS */\n"; close BAR; open BAR, ">$outheader"; select BAR; print "/*\n"; print " * sbcsdat.h - header file for SBCS data structures.\n"; print " *\n"; print " * Generated by sbcsgen.pl from sbcs.dat.\n"; print " * You should edit those files rather than editing this one.\n"; print " */\n"; print "\n"; print "#ifndef charset_sbcsdat_h\n"; print "#define charset_sbcsdat_h\n"; print "\n"; print "#include \"charset.h\"\n"; print "#include \"internal.h\"\n"; print "\n"; foreach $i (@charsetnames) { print "extern const sbcs_data sbcsdata_$i;\n"; } print "\n"; print "#endif /* charset_sbcsdat_h */\n"; close BAR; sub outcharset($$$) { my ($name, $vals, $sortpriority) = @_; my ($prefix, $i, @sorted); print "const sbcs_data sbcsdata_$name = {\n"; print " {\n"; $prefix = " "; @sorted = (); for ($i = 0; $i < 256; $i++) { if ($vals->[$i] < 0) { printf "%sERROR ", $prefix; } else { printf "%s0x%04x", $prefix, $vals->[$i]; die "ooh? $i\n" unless defined $sortpriority->[$i]; push @sorted, [$i, $vals->[$i], 0+$sortpriority->[$i]]; } if ($i % 8 == 7) { $prefix = ",\n "; } else { $prefix = ", "; } } print "\n },\n {\n"; @sorted = sort { ($a->[1] == $b->[1] ? $b->[2] <=> $a->[2] : $a->[1] <=> $b->[1]) || $a->[0] <=> $b->[0] } @sorted; $prefix = " "; $uval = -1; for ($i = $j = 0; $i < scalar @sorted; $i++) { next if ($uval == $sorted[$i]->[1]); # low-priority alternative $uval = $sorted[$i]->[1]; printf "%s0x%02x", $prefix, $sorted[$i]->[0]; if ($j % 8 == 7) { $prefix = ",\n "; } else { $prefix = ", "; } $j++; } printf "\n },\n %d\n", $j; print "};\n"; print "const charset_spec charset_$name = {\n" . " $name, read_sbcs, write_sbcs, &sbcsdata_$name\n};\n\n"; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/shiftjis.c����������������������������������������������������������������������0000644�0001753�0001753�00000005716�12444773746�013405� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * shiftjis.c - multibyte encoding of Shift-JIS */ #ifndef ENUM_CHARSETS #include "charset.h" #include "internal.h" /* * Shift-JIS has no associated data, so `charset' may be ignored. */ static void read_sjis(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { UNUSEDARG(charset); /* * For reading Shift-JIS, state->s0 simply contains the single * stored lead byte when we are half way through a double-byte * character, or 0 if we aren't. */ if (state->s0 == 0) { if ((input_chr >= 0x81 && input_chr <= 0x9F) || (input_chr >= 0xE0 && input_chr <= 0xEF)) { /* * Lead byte. Just store it. */ state->s0 = input_chr; } else { /* * Anything else we translate through JIS X 0201. */ if (input_chr == 0x5C) input_chr = 0xA5; else if (input_chr == 0x7E) input_chr = 0x203E; else if (input_chr >= 0xA1 && input_chr <= 0xDF) input_chr += 0xFF61 - 0xA1; else if (input_chr < 0x80) /* do nothing */; else input_chr = ERROR; emit(emitctx, input_chr); } } else { /* * We have a stored lead byte. We expect a valid followup * byte. */ if (input_chr >= 0x40 && input_chr <= 0xFC && input_chr != 0x7F) { int r, c; r = state->s0; if (r >= 0xE0) r -= (0xE0 - 0xA0); r -= 0x81; c = input_chr; if (c > 0x7F) c--; c -= 0x40; r *= 2; if (c >= 94) r++, c -= 94; emit(emitctx, jisx0208_to_unicode(r, c)); } else { emit(emitctx, ERROR); } state->s0 = 0; } } /* * Shift-JIS is a stateless multi-byte encoding (in the sense that * just after any character has been completed, the state is always * the same); hence when writing it, there is no need to use the * charset_state. */ static int write_sjis(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { UNUSEDARG(charset); UNUSEDARG(state); if (input_chr == -1) return TRUE; /* stateless; no cleanup required */ if (input_chr < 0x80 && input_chr != 0x5C && input_chr != 0x7E) { emit(emitctx, input_chr); return TRUE; } else if (input_chr == 0xA5) { emit(emitctx, 0x5C); return TRUE; } else if (input_chr == 0x203E) { emit(emitctx, 0x7E); return TRUE; } else if (input_chr >= 0xFF61 && input_chr <= 0xFF9F) { emit(emitctx, input_chr - (0xFF61 - 0xA1)); return TRUE; } else { int r, c; if (unicode_to_jisx0208(input_chr, &r, &c)) { c += 94 * (r % 2); r /= 2; r += 0x81; if (r >= 0xA0) r += 0xE0 - 0xA0; c += 0x40; if (c >= 0x7F) c++; emit(emitctx, r); emit(emitctx, c); return TRUE; } else { return FALSE; } } } const charset_spec charset_CS_SHIFT_JIS = { CS_SHIFT_JIS, read_sjis, write_sjis, NULL }; #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_SHIFT_JIS) #endif /* ENUM_CHARSETS */ ��������������������������������������������������halibut-1.1/charset/slookup.c�����������������������������������������������������������������������0000644�0001753�0001753�00000001143�12444773746�013244� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * slookup.c - static lookup of character sets. */ #include "charset.h" #include "internal.h" #define ENUM_CHARSET(x) extern charset_spec const charset_##x; #include "enum.c" #undef ENUM_CHARSET static charset_spec const *const cs_table[] = { #define ENUM_CHARSET(x) &charset_##x, #include "enum.c" #undef ENUM_CHARSET }; charset_spec const *charset_find_spec(int charset) { int i; for (i = 0; i < (int)lenof(cs_table); i++) if (cs_table[i]->charset == charset) return cs_table[i]; return NULL; } int charset_exists(int charset) { return charset_find_spec(charset) != NULL; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/superset.c����������������������������������������������������������������������0000644�0001753�0001753�00000004573�12444773746�013434� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * superset.c: deal with character sets which are supersets of * others. */ #include "charset.h" /* * Just in case it's ever useful again, this rather simplistic * piece of Perl/sh analyses sbcs.dat and determines which pairs of * character sets are identical in the A0-FF region. This doesn't * prove supersethood, but it spots obvious cases. perl -ne '/^[^ ]{4} / and defined ($line) and $line < 16 and do {' \ -e ' chomp; print " $_" if $line>=10; print "\n" if ++$line==16; };' \ -e '/^charset (.*)$/ and do { $line = 0; printf "%30s:", $1; };' \ sbcs.dat | sort +1 | uniq -f1 -D * When run on sbcs.dat rev 1.3, it reports only two sets of matches: * * - ISO8859_1, ISO8859_1_X11 and CP1252 all match. * - ISO8859_4 and CP1254 match. * * FIXME: There is more to it than this, and in particular there's * even more to it than simple subsethood. Look at CP1255 and * ISO8859_8: they match at every code point defined in both, but * they each define at least one code point the other doesn't. It * isn't clear how I should handle this. The right thing might be * to define yet another SBCS which is the union of both, and * upgrade both to that. Or it might be that the unicode.org * mapping table for CP1255 is simply out of date, and the mapping * ISO8859_8 has which it doesn't (DF -> U+2017 DOUBLE LOW LINE) * should be present in it too, which would make it a proper * superset of ISO8859_8 and solve the problem. * * However, for the moment I'm satisfied with enhancing this table * as and when necessary; the idea is not to include _all_ superset * relations here, the idea is to spot charset IDs which are used * _in practice_ to mean other charset IDs. So unless and until I * find out that there really is confusion between ISO8859_8 and * CP1255, I don't need to do anything about it here. */ int charset_upgrade(int charset) { if (charset == CS_ASCII || charset == CS_ISO8859_1) charset = CS_CP1252; if (charset == CS_ISO8859_4) charset = CS_CP1254; if (charset == CS_EUC_KR) charset = CS_CP949; return charset; } /* * This function returns TRUE if the input charset is a vaguely * sensible superset of ASCII. That is, it returns FALSE for 7-bit * encoding formats such as HZ and UTF-7. */ int charset_contains_ascii(int charset) { return (charset != CS_HZ && charset != CS_UTF7 && charset != CS_UTF7_CONSERVATIVE); } �������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/test.c��������������������������������������������������������������������������0000644�0001753�0001753�00000003206�12444773746�012531� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * test.c - general libcharset test/demo program which converts * between two arbitrary charsets. */ #include <stdio.h> #include <string.h> #include "charset.h" #define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) int main(int argc, char **argv) { int srcset, dstset; charset_state instate = CHARSET_INIT_STATE; charset_state outstate = CHARSET_INIT_STATE; char inbuf[256], outbuf[256]; wchar_t midbuf[256]; const char *inptr; const wchar_t *midptr; int rdret, inlen, midlen, inret, midret; if (argc != 3) { fprintf(stderr, "usage: convcs <charset> <charset>\n"); return 1; } srcset = charset_from_localenc(argv[1]); if (srcset == CS_NONE) { fprintf(stderr, "unknown source charset '%s'\n", argv[1]); return 1; } dstset = charset_from_localenc(argv[2]); if (dstset == CS_NONE) { fprintf(stderr, "unknown destination charset '%s'\n", argv[2]); return 1; } while (1) { rdret = fread(inbuf, 1, sizeof(inbuf), stdin); if (rdret <= 0) break; /* EOF */ inlen = rdret; inptr = inbuf; while ( (inret = charset_to_unicode(&inptr, &inlen, midbuf, lenof(midbuf), srcset, &instate, NULL, 0)) > 0) { midlen = inret; midptr = midbuf; while ( (midret = charset_from_unicode(&midptr, &midlen, outbuf, lenof(outbuf), dstset, &outstate, NULL)) > 0) { fwrite(outbuf, 1, midret, stdout); } } } /* * Reset encoding state. */ while ( (midret = charset_from_unicode(NULL, NULL, outbuf, lenof(outbuf), dstset, &outstate, NULL)) > 0) { fwrite(outbuf, 1, midret, stdout); } return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/toucs.c�������������������������������������������������������������������������0000644�0001753�0001753�00000004042�12444773746�012706� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * toucs.c - convert charsets to Unicode. */ #include "charset.h" #include "internal.h" struct unicode_emit_param { wchar_t *output; int outlen; int writtenlen; const wchar_t *errstr; int errlen; int stopped; }; static void unicode_emit(void *ctx, long int output) { struct unicode_emit_param *param = (struct unicode_emit_param *)ctx; wchar_t outval; wchar_t const *p; int outlen; if (output == ERROR) { if (param->errstr) { p = param->errstr; outlen = param->errlen; } else { outval = 0xFFFD; /* U+FFFD REPLACEMENT CHARACTER */ p = &outval; outlen = 1; } } else { outval = output; p = &outval; outlen = 1; } if (param->outlen < 0 || param->outlen >= outlen) { while (outlen > 0) { if (param->output) *param->output++ = *p++; if (param->outlen > 0) param->outlen--; outlen--; param->writtenlen++; } } else { param->stopped = 1; } } int charset_to_unicode(const char **input, int *inlen, wchar_t *output, int outlen, int charset, charset_state *state, const wchar_t *errstr, int errlen) { charset_spec const *spec = charset_find_spec(charset); charset_state localstate = CHARSET_INIT_STATE; struct unicode_emit_param param; param.output = output; param.outlen = outlen; param.errstr = errstr; param.errlen = errlen; param.writtenlen = 0; param.stopped = 0; if (state) localstate = *state; /* structure copy */ while (*inlen > 0) { int lenbefore = param.writtenlen; spec->read(spec, (unsigned char)**input, &localstate, unicode_emit, ¶m); if (param.stopped) { /* * The emit function has _tried_ to output some * characters, but ran up against the end of the * buffer. Leave immediately, and return what happened * _before_ attempting to process this character. */ return lenbefore; } if (state) *state = localstate; /* structure copy */ (*input)++; (*inlen)--; } return param.writtenlen; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/utf16.c�������������������������������������������������������������������������0000644�0001753�0001753�00000013535�12444773746�012525� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * utf16.c - routines to handle UTF-16 (RFC 2781). */ #ifndef ENUM_CHARSETS #include "charset.h" #include "internal.h" struct utf16 { int s0; /* initial value of state->s0 */ }; static void read_utf16(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { struct utf16 const *utf = (struct utf16 *)charset->data; long int hw; /* * State variable s1 handles the combining of bytes into * transport-endianness halfwords. It contains: * * - 0 if we're between halfwords * - 0x100 plus the first byte if we're in mid-halfword * * State variable s0 handles everything from there upwards. It * contains: * * - Bottom 16 bits are set to a surrogate value if we've just * seen one. * - Next two bits (17:16) indicate possible endiannesses. Bit * 17 is set if we might be BE; bit 16 if we might be LE. If * they're both zero, it has to be because this is right at * the start, so the first thing we do is set them to the * correct initial state. * - The bit after that (18) is 1 iff we have already seen at * least one halfword (meaning we should pass any further * BOMs straight through). */ /* Set up s0 if this is the start. */ if (state->s0 == 0) state->s0 = utf->s0; /* Accumulate a transport-endianness halfword. */ if (state->s1 == 0) { state->s1 = 0x100 | input_chr; return; } hw = ((state->s1 & 0xFF) << 8) + input_chr; state->s1 = 0; /* Process BOM and determine byte order. */ if (!(state->s0 & 0x40000)) { state->s0 |= 0x40000; if (hw == 0xFEFF && (state->s0 & 0x20000)) { /* * Text starts with a big-endian BOM, and big- * endianness is a possibility. So clear the * little-endian bit (the BOM confirms our endianness), * and return without emitting the BOM in Unicode. */ state->s0 &= ~0x10000; return; } else if (hw == 0xFFFE && (state->s0 & 0x10000)) { /* * Text starts with a little-endian BOM, and little- * endianness is a possibility. So clear the big-endian * bit (the BOM confirms our endianness), and return * without emitting the BOM in Unicode. */ state->s0 &= ~0x20000; return; } else { /* * Text does not begin with a BOM. RFC 2781 states that * in this case we must assume big-endianness if we * haven't been told otherwise by the content type. */ if ((state->s0 & 0x30000) == 0x30000) state->s0 &= ~0x10000; /* clear LE bit */ } } /* * Byte-swap transport-endianness halfword if necessary. We may * now test individual endianness bits, since we can be sure * exactly one is set. */ if (state->s0 & 0x10000) hw = ((hw >> 8) | (hw << 8)) & 0xFFFF; /* * Now that the endianness issue has been dealt with, what * reaches this point should be a stream of halfwords in * sensible numeric form. So now we process surrogates. */ if (state->s0 & 0xFFFF) { /* * We have already seen a high surrogate, so we expect a * low surrogate. Whinge if we didn't get it. */ if (hw < 0xDC00 || hw >= 0xE000) { emit(emitctx, ERROR); } else { hw &= 0x3FF; hw |= (state->s0 & 0x3FF) << 10; emit(emitctx, hw + 0x10000); } state->s0 &= 0xFFFF0000; } else { /* * Any low surrogate is an error. */ if (hw >= 0xDC00 && hw < 0xE000) { emit(emitctx, ERROR); return; } /* * Any high surrogate is simply stored until we see the * next halfword. */ if (hw >= 0xD800 && hw < 0xDC00) { state->s0 |= hw; return; } /* * Anything else we simply output. */ emit(emitctx, hw); } } /* * Repeated code in write_utf16 abstracted out for sanity. */ static void emithl(void (*emit)(void *ctx, long int output), void *emitctx, unsigned long s0, long int hw) { int h = (hw >> 8) & 0xFF, l = hw & 0xFF; if (s0 & 0x20000) { /* Big-endian takes priority over little, if both are allowed. */ emit(emitctx, h); emit(emitctx, l); } else { emit(emitctx, l); emit(emitctx, h); } } static int write_utf16(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { struct utf16 const *utf = (struct utf16 *)charset->data; /* * state->s0 == 0 means we have not output anything yet (and so * must output a BOM before we do anything else). state->s0 == * 1 means we are off and running. */ if (input_chr < 0) return TRUE; /* no cleanup required */ if ((input_chr >= 0xD800 && input_chr < 0xE000) || input_chr >= 0x110000) { /* * We can't output surrogates, or anything above 0x10FFFF. */ return FALSE; } if (!state->s0) { state->s0 = 1; emithl(emit, emitctx, utf->s0, 0xFEFF); } if (input_chr < 0x10000) { emithl(emit, emitctx, utf->s0, input_chr); } else { input_chr -= 0x10000; /* now input_chr is between 0 and 0xFFFFF inclusive */ emithl(emit, emitctx, utf->s0, 0xD800 | ((input_chr >> 10) & 0x3FF)); emithl(emit, emitctx, utf->s0, 0xDC00 | (input_chr & 0x3FF)); } return TRUE; } static const struct utf16 utf16_bigendian = { 0x20000 }; static const struct utf16 utf16_littleendian = { 0x10000 }; static const struct utf16 utf16_variable_endianness = { 0x30000 }; const charset_spec charset_CS_UTF16BE = { CS_UTF16BE, read_utf16, write_utf16, &utf16_bigendian }; const charset_spec charset_CS_UTF16LE = { CS_UTF16LE, read_utf16, write_utf16, &utf16_littleendian }; const charset_spec charset_CS_UTF16 = { CS_UTF16, read_utf16, write_utf16, &utf16_variable_endianness }; #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_UTF16) ENUM_CHARSET(CS_UTF16BE) ENUM_CHARSET(CS_UTF16LE) #endif /* ENUM_CHARSETS */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/utf7.c��������������������������������������������������������������������������0000644�0001753�0001753�00000020017�12444773746�012436� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * utf7.c - routines to handle UTF-7 (RFC 1642 / RFC 2152). */ #ifndef ENUM_CHARSETS #include "charset.h" #include "internal.h" /* * This array is generated by a piece of Perl: perl -e 'for $i (0..32) { $a[$i] |= 2; } $a[32] |= 1;' \ -e 'for $i ("a".."z","A".."Z","0".."9","'\''","(",' \ -e ' ")",",","-",".","/",":","?") { $a[ord $i] |= 1; }' \ -e 'for $i ("!","\"","#","\$","%","&","*",";","<","=",">","\@",' \ -e ' "[","]","^","_","`","{","|","}") { $a[ord $i] |= 2; }' \ -e 'for $i ("a".."z","A".."Z","0".."9","+","/") { $a[ord $i] |= 4; }' \ -e 'for $i (0..127) { printf "%s%d,%s", $i%32?"":" ", $a[$i],' \ -e ' ($i+1)%32?"":"\n"; }' */ static const unsigned char utf7_ascii_properties[128] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,2,2,2,2,2,2,1,1,1,2,4,1,1,1,5,5,5,5,5,5,5,5,5,5,5,1,2,2,2,2,1, 2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,2,0,2,2,2, 2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,2,2,2,0,0, }; #define SET_D(c) ((c) >= 0 && (c) < 0x80 && (utf7_ascii_properties[(c)] & 1)) #define SET_O(c) ((c) >= 0 && (c) < 0x80 && (utf7_ascii_properties[(c)] & 2)) #define SET_B(c) ((c) >= 0 && (c) < 0x80 && (utf7_ascii_properties[(c)] & 4)) #define base64_value(c) ( (c) >= 'A' && (c) <= 'Z' ? (c) - 'A' : \ (c) >= 'a' && (c) <= 'z' ? (c) - 'a' + 26 : \ (c) >= '0' && (c) <= '9' ? (c) - '0' + 52 : \ (c) == '+' ? 62 : 63 ) static const char *const base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static void read_utf7(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { long int hw; UNUSEDARG(charset); /* * state->s0 is used to handle the conversion of the UTF-7 * transport format into a stream of halfwords. Its layout is: * * - In normal ASCII mode, it is zero. * * - Otherwise, it holds a leading 1 followed by all the bits * so far accumulated in base64 digits. * * - Special case: when we have only just seen the initial `+' * which enters base64 mode, it is set to 2 rather than 1 * (this is an otherwise unused value since base64 always * accumulates an even number of bits at a time), so that * the special sequence `+-' can be made to encode `+' * easily. * * state->s1 is used to handle the conversion of those * halfwords into Unicode values. It contains a high surrogate * value if we've just seen one, and 0 otherwise. */ if (!state->s0) { if (input_chr == '+') state->s0 = 2; else emit(emitctx, input_chr); return; } else { if (!SET_B(input_chr)) { /* * base64 mode ends here. Emit the character we have, * unless it's a minus in which case we should swallow * it. */ if (input_chr != '-') emit(emitctx, input_chr); else if (state->s0 == 2) emit(emitctx, '+'); /* special case */ state->s0 = 0; return; } /* * Now we have a base64 character, so add it to our state, * first correcting the special case value of s0. */ if (state->s0 == 2) state->s0 = 1; state->s0 = (state->s0 << 6) | base64_value(input_chr); } /* * If we don't have a whole halfword at this point, bale out. */ if (!(state->s0 & 0xFFFF0000)) return; /* * Otherwise, extract the halfword. There are three * possibilities for where the top set bit might be. */ if (state->s0 & 0x00100000) { hw = (state->s0 >> 4) & 0xFFFF; state->s0 = (state->s0 & 0xF) | 0x10; } else if (state->s0 & 0x00040000) { hw = (state->s0 >> 2) & 0xFFFF; state->s0 = (state->s0 & 3) | 4; } else { hw = state->s0 & 0xFFFF; state->s0 = 1; } /* * Now what reaches this point should be a stream of halfwords * in sensible numeric form. So now we process surrogates. */ if (state->s1) { /* * We have already seen a high surrogate, so we expect a * low surrogate. Whinge if we didn't get it. */ if (hw < 0xDC00 || hw >= 0xE000) { emit(emitctx, ERROR); } else { hw &= 0x3FF; hw |= (state->s1 & 0x3FF) << 10; emit(emitctx, hw + 0x10000); } state->s1 = 0; } else { /* * Any low surrogate is an error. */ if (hw >= 0xDC00 && hw < 0xE000) { emit(emitctx, ERROR); return; } /* * Any high surrogate is simply stored until we see the * next halfword. */ if (hw >= 0xD800 && hw < 0xDC00) { state->s1 = hw; return; } /* * Anything else we simply output. */ emit(emitctx, hw); } } /* * For writing UTF-7, we supply two charset definitions, one of * which will directly encode Set O characters and the other of * which will cautiously base64 them. */ static int write_utf7(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { unsigned long hws[2]; int nhws; int i; /* * For writing: state->s0 contains accumulated base64 data with * a 1 in front, and state->s1 indicates how many bits of it we * have. */ if ((input_chr >= 0xD800 && input_chr < 0xE000) || input_chr >= 0x110000) { /* * We can't output surrogates, or anything above 0x10FFFF. */ return FALSE; } /* * Look for characters which we output in ASCII mode. A special * case here is +, which can be encoded as the empty base64 * escape sequence `+-': if we're _already_ in ASCII mode we do * that, but if we're in base64 mode at the point we see the + * then we simply stay in base64 mode and output it as a * halfword. (Switching back would cost three bytes, whereas * staying in base64 costs only 2 2/3.) */ if (input_chr == -1 || SET_D(input_chr) || (charset->charset == CS_UTF7 && SET_O(input_chr)) || (!state->s0 && input_chr == '+')) { if (state->s0) { /* * These characters are output in ASCII mode, so flush any * lingering base64 data. */ state->s0 <<= 6 - state->s1; emit(emitctx, base64_chars[state->s0 & 0x3F]); /* * I'm going to arbitrarily decide to always use the * terminating minus sign. It's easier than figuring out * whether to do so or not, and looks prettier besides. */ emit(emitctx, '-'); state->s0 = state->s1 = 0; } /* * Now output the character. */ if (input_chr != -1) /* special case: just reset state */ emit(emitctx, input_chr); if (input_chr == '+') emit(emitctx, '-'); /* +- encodes + */ return TRUE; } /* * Now we know we have a character that needs to be output as * either one base64-encoded halfword or two. So first figure * out how many... */ if (input_chr < 0x10000) { nhws = 1; hws[0] = input_chr; } else { input_chr -= 0x10000; if (input_chr >= 0x100000) { /* Anything above 0x10FFFF is outside UTF-7 range. */ return FALSE; } nhws = 2; hws[0] = 0xD800 | ((input_chr >> 10) & 0x3FF); hws[1] = 0xDC00 | (input_chr & 0x3FF); } /* * ... switch into base64 mode if required ... */ if (!state->s0) { emit(emitctx, '+'); state->s0 = 1; state->s1 = 0; } /* * ... and do the base64 output. */ for (i = 0; i < nhws; i++) { state->s0 = (state->s0 << 16) | hws[i]; state->s1 += 16; while (state->s1 >= 6) { /* * The top set bit must be in position 16, 18 or 20. */ unsigned long out, topbit; out = (state->s0 >> (state->s1 - 6)) & 0x3F; state->s1 -= 6; topbit = 1 << state->s1; state->s0 = (state->s0 & (topbit-1)) | topbit; emit(emitctx, base64_chars[out]); } } return TRUE; } const charset_spec charset_CS_UTF7 = { CS_UTF7, read_utf7, write_utf7, NULL }; const charset_spec charset_CS_UTF7_CONSERVATIVE = { CS_UTF7_CONSERVATIVE, read_utf7, write_utf7, NULL }; #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_UTF7) ENUM_CHARSET(CS_UTF7_CONSERVATIVE) #endif /* ENUM_CHARSETS */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/utf8.c��������������������������������������������������������������������������0000644�0001753�0001753�00000074345�12444773746�012454� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * utf8.c - routines to handle UTF-8. */ #ifndef ENUM_CHARSETS #include "charset.h" #include "internal.h" /* * The internal read_utf8 and write_utf8 functions in this module * are not static, because they're also called internally from * iso2022.c. */ /* * UTF-8 has no associated data, so `charset' may be ignored. */ void read_utf8(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { UNUSEDARG(charset); /* * For reading UTF-8, the `state' word contains the character * being accumulated. This is shifted left by six bits each * time a character is added, and there's a single '1' bit * in what would be bit 31 of the final character, which we * use to detect when it's complete. * * As required, the state is zero when we are not in the middle * of a multibyte character at all. * * For example, when reading E9 8D 8B, starting at state=0: * * - after E9, the state is 0x00080009 * - after 8D, the state is 0x0200024d * - after 8B, the state conceptually becomes 0x8000934b, at * which point we notice we've got as many characters as we * were expecting, output U+934B, and reset the state to * zero. * * If we detect an overlong sequence, we shift the marker bit * right one bit. This is safe because an overlong sequence * can't encode a top-bit-set character. Not that we worry * about what overlong sequences are trying to encode, but * it's nice to know that we could if we wanted to. * * Note that the maximum number of bits we might need to store * in the character value field is 25 (U+7FFFFFFF contains 31 * bits, but we will never actually store its full value * because when we receive the last 6 bits in the final * continuation byte we will output it and revert the state to * zero). Hence we need 26 bits in total. */ if (input_chr < 0x80) { /* * Single-byte character. If the state is nonzero before * coming here, output an error for an incomplete sequence. * Then output the character. */ if (state->s0 != 0) { emit(emitctx, ERROR); state->s0 = 0; } emit(emitctx, input_chr); } else if (input_chr == 0xFE || input_chr == 0xFF) { /* * FE and FF bytes should _never_ occur in UTF-8. They are * automatic errors; if the state was nonzero to start * with, output a further error for an incomplete sequence. */ if (state->s0 != 0) { emit(emitctx, ERROR); state->s0 = 0; } emit(emitctx, ERROR); } else if (input_chr >= 0x80 && input_chr < 0xC0) { /* * Continuation byte. Output an error for an unexpected * continuation byte, if the state is zero. */ if (state->s0 == 0) { emit(emitctx, ERROR); } else { unsigned long charval; /* * Otherwise, accumulate more of the character value. */ charval = state->s0; charval = (charval << 6) | (input_chr & 0x3F); /* * Detect overlong encodings. We're looking for too many * leading zeroes given our position in the character. If * we find an overlong encoding, clear the current marker * bit and set the bit below it. Overlong two-byte * encodings are a special case, and are detected when we * read their inital byte. */ if ((charval & 0xffffffe0L) == 0x02000000L) charval ^= 0x03000000L; else if ((charval & 0xfffffff0L) == 0x00080000L) charval ^= 0x000c0000L; else if ((charval & 0xfffffff8L) == 0x00002000L) charval ^= 0x00003000L; else if ((charval & 0xfffffffcL) == 0x00000080L) charval ^= 0x000000c0L; /* * Check the byte counts; if we have not reached the * end of the character, update the state and return. */ if (!(charval & 0xc0000000L)) { state->s0 = charval; return; } /* * Clear the marker bit, or set it if it's clear, * indicating an overlong sequence. */ charval ^= 0x80000000L; /* * Now we know we've reached the end of the character. * `charval' is the Unicode value. We should check for * various invalid things, and then either output * charval or an error. In all cases we reset the state * to zero. */ state->s0 = 0; if (charval & 0x80000000L) { /* We got an overlong sequence. */ emit(emitctx, ERROR); } else if (charval >= 0xD800 && charval < 0xE000) { /* * Surrogates (0xD800-0xDFFF) may never be encoded * in UTF-8. A surrogate pair in Unicode should * have been encoded as a single UTF-8 character * occupying more than three bytes. */ emit(emitctx, ERROR); } else if (charval == 0xFFFE || charval == 0xFFFF) { /* * U+FFFE and U+FFFF are invalid Unicode characters * and may never be encoded in UTF-8. (This is one * reason why U+FFFF is our way of signalling an * error to our `emit' function :-) */ emit(emitctx, ERROR); } else { /* * Oh, all right. We'll let this one off. */ emit(emitctx, charval); } } } else { /* * Lead byte. First output an error for an incomplete * sequence, if the state is nonzero. */ if (state->s0 != 0) emit(emitctx, ERROR); /* * Now deal with the lead byte: work out the number of * bytes we expect to see in this character, and extract * the initial bits of it too. */ if (input_chr >= 0xC0 && input_chr < 0xC2) { /* beginning of an overlong two-byte sequence */ state->s0 = 0x01000000L | (input_chr & 0x1F); } else if (input_chr >= 0xC2 && input_chr < 0xE0) { state->s0 = 0x02000000L | (input_chr & 0x1F); } else if (input_chr >= 0xE0 && input_chr < 0xF0) { state->s0 = 0x00080000L | (input_chr & 0x0F); } else if (input_chr >= 0xF0 && input_chr < 0xF8) { state->s0 = 0x00002000L | (input_chr & 0x07); } else if (input_chr >= 0xF8 && input_chr < 0xFC) { state->s0 = 0x00000080L | (input_chr & 0x03); } else if (input_chr >= 0xFC && input_chr < 0xFE) { state->s0 = 0x00000002L | (input_chr & 0x01); } } } /* * UTF-8 is a stateless multi-byte encoding (in the sense that just * after any character has been completed, the state is always the * same); hence when writing it, there is no need to use the * charset_state. */ int write_utf8(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { UNUSEDARG(charset); UNUSEDARG(state); if (input_chr == -1) return TRUE; /* stateless; no cleanup required */ /* * Refuse to output any illegal code points. */ if (input_chr == 0xFFFE || input_chr == 0xFFFF || (input_chr >= 0xD800 && input_chr < 0xE000)) { return FALSE; } else if (input_chr < 0x80) { /* one-byte character */ emit(emitctx, input_chr); return TRUE; } else if (input_chr < 0x800) { /* two-byte character */ emit(emitctx, 0xC0 | (0x1F & (input_chr >> 6))); emit(emitctx, 0x80 | (0x3F & (input_chr ))); return TRUE; } else if (input_chr < 0x10000) { /* three-byte character */ emit(emitctx, 0xE0 | (0x0F & (input_chr >> 12))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 6))); emit(emitctx, 0x80 | (0x3F & (input_chr ))); return TRUE; } else if (input_chr < 0x200000) { /* four-byte character */ emit(emitctx, 0xF0 | (0x07 & (input_chr >> 18))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 12))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 6))); emit(emitctx, 0x80 | (0x3F & (input_chr ))); return TRUE; } else if (input_chr < 0x4000000) {/* five-byte character */ emit(emitctx, 0xF8 | (0x03 & (input_chr >> 24))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 18))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 12))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 6))); emit(emitctx, 0x80 | (0x3F & (input_chr ))); return TRUE; } else { /* six-byte character */ emit(emitctx, 0xFC | (0x01 & (input_chr >> 30))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 24))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 18))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 12))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 6))); emit(emitctx, 0x80 | (0x3F & (input_chr ))); return TRUE; } } #ifdef TESTMODE #include <stdio.h> #include <stdarg.h> int total_errs = 0; void utf8_emit(void *ctx, long output) { wchar_t **p = (wchar_t **)ctx; *(*p)++ = output; } void utf8_read_test(int line, char *input, int inlen, ...) { va_list ap; wchar_t *p, str[512]; int i; charset_state state; unsigned long l; state.s0 = 0; p = str; for (i = 0; i < inlen; i++) read_utf8(NULL, input[i] & 0xFF, &state, utf8_emit, &p); va_start(ap, inlen); l = 0; for (i = 0; i < p - str; i++) { l = va_arg(ap, long int); if (l == -1) { printf("%d: correct string shorter than output\n", line); total_errs++; break; } if (l != str[i]) { printf("%d: char %d came out as %08x, should be %08x\n", line, i, str[i], l); total_errs++; } } if (l != -1) { l = va_arg(ap, long int); if (l != -1) { printf("%d: correct string longer than output\n", line); total_errs++; } } va_end(ap); } void utf8_write_test(int line, const long *input, int inlen, ...) { va_list ap; wchar_t *p, str[512]; int i; charset_state state; unsigned long l; state.s0 = 0; p = str; for (i = 0; i < inlen; i++) { if (!write_utf8(NULL, input[i], &state, utf8_emit, &p)) utf8_emit(&p, ERROR); } va_start(ap, inlen); l = 0; for (i = 0; i < p - str; i++) { l = va_arg(ap, long int); if (l == -1) { printf("%d: correct string shorter than output\n", line); total_errs++; break; } if (l != str[i]) { printf("%d: char %d came out as %08x, should be %08x\n", line, i, str[i], l); total_errs++; } } if (l != -1) { l = va_arg(ap, long int); if (l != -1) { printf("%d: correct string longer than output\n", line); total_errs++; } } va_end(ap); } /* Macro to concoct the first three parameters of utf8_read_test. */ #define TESTSTR(x) __LINE__, x, lenof(x) int main(void) { printf("read tests beginning\n"); utf8_read_test(TESTSTR("\xCE\xBA\xE1\xBD\xB9\xCF\x83\xCE\xBC\xCE\xB5"), 0x000003BA, /* GREEK SMALL LETTER KAPPA */ 0x00001F79, /* GREEK SMALL LETTER OMICRON WITH OXIA */ 0x000003C3, /* GREEK SMALL LETTER SIGMA */ 0x000003BC, /* GREEK SMALL LETTER MU */ 0x000003B5, /* GREEK SMALL LETTER EPSILON */ 0, -1); utf8_read_test(TESTSTR("\x00"), 0x00000000, /* <control> */ 0, -1); utf8_read_test(TESTSTR("\xC2\x80"), 0x00000080, /* <control> */ 0, -1); utf8_read_test(TESTSTR("\xE0\xA0\x80"), 0x00000800, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\xF0\x90\x80\x80"), 0x00010000, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\xF8\x88\x80\x80\x80"), 0x00200000, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\xFC\x84\x80\x80\x80\x80"), 0x04000000, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\x7F"), 0x0000007F, /* <control> */ 0, -1); utf8_read_test(TESTSTR("\xDF\xBF"), 0x000007FF, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF\xBD"), 0x0000FFFD, /* REPLACEMENT CHARACTER */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF\xBF"), ERROR, /* <no name available> (invalid char) */ 0, -1); utf8_read_test(TESTSTR("\xF7\xBF\xBF\xBF"), 0x001FFFFF, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\xFB\xBF\xBF\xBF\xBF"), 0x03FFFFFF, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\xFD\xBF\xBF\xBF\xBF\xBF"), 0x7FFFFFFF, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\xED\x9F\xBF"), 0x0000D7FF, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\xEE\x80\x80"), 0x0000E000, /* <Private Use, First> */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF\xBD"), 0x0000FFFD, /* REPLACEMENT CHARACTER */ 0, -1); utf8_read_test(TESTSTR("\xF4\x8F\xBF\xBF"), 0x0010FFFF, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\xF4\x90\x80\x80"), 0x00110000, /* <no name available> */ 0, -1); utf8_read_test(TESTSTR("\x80"), ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\xBF"), ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF\x80"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF\x80\xBF"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF\x80\xBF\x80"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF\x80\xBF\x80\xBF"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF\x80\xBF\x80\xBF\x80"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\xC0\x20\xC1\x20\xC2\x20\xC3\x20\xC4\x20\xC5\x20\xC6\x20\xC7\x20"), ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ 0, -1); utf8_read_test(TESTSTR("\xE0\x20\xE1\x20\xE2\x20\xE3\x20\xE4\x20\xE5\x20\xE6\x20\xE7\x20\xE8\x20\xE9\x20\xEA\x20\xEB\x20\xEC\x20\xED\x20\xEE\x20\xEF\x20"), ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ 0, -1); utf8_read_test(TESTSTR("\xF0\x20\xF1\x20\xF2\x20\xF3\x20\xF4\x20\xF5\x20\xF6\x20\xF7\x20"), ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ 0, -1); utf8_read_test(TESTSTR("\xF8\x20\xF9\x20\xFA\x20\xFB\x20"), ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ 0, -1); utf8_read_test(TESTSTR("\xFC\x20\xFD\x20"), ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ 0, -1); utf8_read_test(TESTSTR("\xC0"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xE0\x80"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xF0\x80\x80"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xF8\x80\x80\x80"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xFC\x80\x80\x80\x80"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xDF"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xF7\xBF\xBF"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xFB\xBF\xBF\xBF"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xFD\xBF\xBF\xBF\xBF"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xC0\xE0\x80\xF0\x80\x80\xF8\x80\x80\x80\xFC\x80\x80\x80\x80\xDF\xEF\xBF\xF7\xBF\xBF\xFB\xBF\xBF\xBF\xFD\xBF\xBF\xBF\xBF"), ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xFE"), ERROR, /* (invalid UTF-8 byte) */ 0, -1); utf8_read_test(TESTSTR("\xFF"), ERROR, /* (invalid UTF-8 byte) */ 0, -1); utf8_read_test(TESTSTR("\xFE\xFE\xFF\xFF"), ERROR, /* (invalid UTF-8 byte) */ ERROR, /* (invalid UTF-8 byte) */ ERROR, /* (invalid UTF-8 byte) */ ERROR, /* (invalid UTF-8 byte) */ 0, -1); utf8_read_test(TESTSTR("\xC0\xAF"), ERROR, /* SOLIDUS (overlong form of 2F) */ 0, -1); utf8_read_test(TESTSTR("\xE0\x80\xAF"), ERROR, /* SOLIDUS (overlong form of 2F) */ 0, -1); utf8_read_test(TESTSTR("\xF0\x80\x80\xAF"), ERROR, /* SOLIDUS (overlong form of 2F) */ 0, -1); utf8_read_test(TESTSTR("\xF8\x80\x80\x80\xAF"), ERROR, /* SOLIDUS (overlong form of 2F) */ 0, -1); utf8_read_test(TESTSTR("\xFC\x80\x80\x80\x80\xAF"), ERROR, /* SOLIDUS (overlong form of 2F) */ 0, -1); utf8_read_test(TESTSTR("\xC1\xBF"), ERROR, /* <control> (overlong form of 7F) */ 0, -1); utf8_read_test(TESTSTR("\xE0\x9F\xBF"), ERROR, /* <no name available> (overlong form of DF BF) */ 0, -1); utf8_read_test(TESTSTR("\xF0\x8F\xBF\xBF"), ERROR, /* <no name available> (overlong form of EF BF BF) (invalid char) */ 0, -1); utf8_read_test(TESTSTR("\xF8\x87\xBF\xBF\xBF"), ERROR, /* <no name available> (overlong form of F7 BF BF BF) */ 0, -1); utf8_read_test(TESTSTR("\xFC\x83\xBF\xBF\xBF\xBF"), ERROR, /* <no name available> (overlong form of FB BF BF BF BF) */ 0, -1); utf8_read_test(TESTSTR("\xC0\x80"), ERROR, /* <control> (overlong form of 00) */ 0, -1); utf8_read_test(TESTSTR("\xE0\x80\x80"), ERROR, /* <control> (overlong form of 00) */ 0, -1); utf8_read_test(TESTSTR("\xF0\x80\x80\x80"), ERROR, /* <control> (overlong form of 00) */ 0, -1); utf8_read_test(TESTSTR("\xF8\x80\x80\x80\x80"), ERROR, /* <control> (overlong form of 00) */ 0, -1); utf8_read_test(TESTSTR("\xFC\x80\x80\x80\x80\x80"), ERROR, /* <control> (overlong form of 00) */ 0, -1); utf8_read_test(TESTSTR("\xED\xA0\x80"), ERROR, /* <Non Private Use High Surrogate, First> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAD\xBF"), ERROR, /* <Non Private Use High Surrogate, Last> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAE\x80"), ERROR, /* <Private Use High Surrogate, First> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAF\xBF"), ERROR, /* <Private Use High Surrogate, Last> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xB0\x80"), ERROR, /* <Low Surrogate, First> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xBE\x80"), ERROR, /* <no name available> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xBF\xBF"), ERROR, /* <Low Surrogate, Last> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xA0\x80\xED\xB0\x80"), ERROR, /* <Non Private Use High Surrogate, First> (surrogate) */ ERROR, /* <Low Surrogate, First> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xA0\x80\xED\xBF\xBF"), ERROR, /* <Non Private Use High Surrogate, First> (surrogate) */ ERROR, /* <Low Surrogate, Last> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAD\xBF\xED\xB0\x80"), ERROR, /* <Non Private Use High Surrogate, Last> (surrogate) */ ERROR, /* <Low Surrogate, First> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAD\xBF\xED\xBF\xBF"), ERROR, /* <Non Private Use High Surrogate, Last> (surrogate) */ ERROR, /* <Low Surrogate, Last> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAE\x80\xED\xB0\x80"), ERROR, /* <Private Use High Surrogate, First> (surrogate) */ ERROR, /* <Low Surrogate, First> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAE\x80\xED\xBF\xBF"), ERROR, /* <Private Use High Surrogate, First> (surrogate) */ ERROR, /* <Low Surrogate, Last> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAF\xBF\xED\xB0\x80"), ERROR, /* <Private Use High Surrogate, Last> (surrogate) */ ERROR, /* <Low Surrogate, First> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAF\xBF\xED\xBF\xBF"), ERROR, /* <Private Use High Surrogate, Last> (surrogate) */ ERROR, /* <Low Surrogate, Last> (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF\xBE"), ERROR, /* <no name available> (invalid char) */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF\xBF"), ERROR, /* <no name available> (invalid char) */ 0, -1); printf("read tests completed\n"); printf("write tests beginning\n"); { const static long str[] = {0x03BAL, 0x1F79L, 0x03C3L, 0x03BCL, 0x03B5L, 0}; utf8_write_test(TESTSTR(str), 0xCE, 0xBA, 0xE1, 0xBD, 0xB9, 0xCF, 0x83, 0xCE, 0xBC, 0xCE, 0xB5, 0, -1); } { const static long str[] = {0x0000L, 0}; utf8_write_test(TESTSTR(str), 0x00, 0, -1); } { const static long str[] = {0x0080L, 0}; utf8_write_test(TESTSTR(str), 0xC2, 0x80, 0, -1); } { const static long str[] = {0x0800L, 0}; utf8_write_test(TESTSTR(str), 0xE0, 0xA0, 0x80, 0, -1); } { const static long str[] = {0x00010000L, 0}; utf8_write_test(TESTSTR(str), 0xF0, 0x90, 0x80, 0x80, 0, -1); } { const static long str[] = {0x00200000L, 0}; utf8_write_test(TESTSTR(str), 0xF8, 0x88, 0x80, 0x80, 0x80, 0, -1); } { const static long str[] = {0x04000000L, 0}; utf8_write_test(TESTSTR(str), 0xFC, 0x84, 0x80, 0x80, 0x80, 0x80, 0, -1); } { const static long str[] = {0x007FL, 0}; utf8_write_test(TESTSTR(str), 0x7F, 0, -1); } { const static long str[] = {0x07FFL, 0}; utf8_write_test(TESTSTR(str), 0xDF, 0xBF, 0, -1); } { const static long str[] = {0xFFFDL, 0}; utf8_write_test(TESTSTR(str), 0xEF, 0xBF, 0xBD, 0, -1); } { const static long str[] = {0xFFFFL, 0}; utf8_write_test(TESTSTR(str), ERROR, 0, -1); } { const static long str[] = {0x001FFFFFL, 0}; utf8_write_test(TESTSTR(str), 0xF7, 0xBF, 0xBF, 0xBF, 0, -1); } { const static long str[] = {0x03FFFFFFL, 0}; utf8_write_test(TESTSTR(str), 0xFB, 0xBF, 0xBF, 0xBF, 0xBF, 0, -1); } { const static long str[] = {0x7FFFFFFFL, 0}; utf8_write_test(TESTSTR(str), 0xFD, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0, -1); } { const static long str[] = {0xD7FFL, 0}; utf8_write_test(TESTSTR(str), 0xED, 0x9F, 0xBF, 0, -1); } { const static long str[] = {0xD800L, 0}; utf8_write_test(TESTSTR(str), ERROR, 0, -1); } { const static long str[] = {0xD800L, 0xDC00L, 0}; utf8_write_test(TESTSTR(str), ERROR, ERROR, 0, -1); } { const static long str[] = {0xDFFFL, 0}; utf8_write_test(TESTSTR(str), ERROR, 0, -1); } { const static long str[] = {0xE000L, 0}; utf8_write_test(TESTSTR(str), 0xEE, 0x80, 0x80, 0, -1); } printf("write tests completed\n"); printf("total: %d errors\n", total_errs); return (total_errs != 0); } #endif /* TESTMODE */ const charset_spec charset_CS_UTF8 = { CS_UTF8, read_utf8, write_utf8, NULL }; #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_UTF8) #endif /* ENUM_CHARSETS */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/charset/xenc.c��������������������������������������������������������������������������0000644�0001753�0001753�00000005011�12444773746�012503� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * xenc.c - translate our internal character set codes to and from * X11 character encoding names. * */ #include <ctype.h> #include "charset.h" #include "internal.h" static const struct { const char *name; int charset; } xencs[] = { /* * Officially registered encoding names. This list is derived * from the font encodings section of * * http://ftp.x.org/pub/DOCS/registry * * Where multiple encoding names map to the same encoding id * (such as iso8859-15 and fcd8859-15), the first is considered * canonical and will be returned when translating the id to a * string. */ { "iso646.1991-irv", CS_ASCII }, { "iso8859-1", CS_ISO8859_1 }, { "iso8859-2", CS_ISO8859_2 }, { "iso8859-3", CS_ISO8859_3 }, { "iso8859-4", CS_ISO8859_4 }, { "iso8859-5", CS_ISO8859_5 }, { "iso8859-6", CS_ISO8859_6 }, { "iso8859-7", CS_ISO8859_7 }, { "iso8859-8", CS_ISO8859_8 }, { "iso8859-9", CS_ISO8859_9 }, { "iso8859-10", CS_ISO8859_10 }, { "iso8859-13", CS_ISO8859_13 }, { "iso8859-14", CS_ISO8859_14 }, { "iso8859-15", CS_ISO8859_15 }, { "fcd8859-15", CS_ISO8859_15 }, { "hp-roman8", CS_HP_ROMAN8 }, { "koi8-r", CS_KOI8_R }, { "jisx0201.1976-0", CS_JISX0201 }, /* * Unofficial encoding names found in the wild. */ { "iso8859-16", CS_ISO8859_16 }, { "koi8-u", CS_KOI8_U }, { "ibm-cp437", CS_CP437 }, { "ibm-cp850", CS_CP850 }, { "ibm-cp852", CS_CP852 }, { "ibm-cp866", CS_CP866 }, { "microsoft-cp1250", CS_CP1250 }, { "microsoft-cp1251", CS_CP1251 }, { "microsoft-cp1252", CS_CP1252 }, { "microsoft-cp1253", CS_CP1253 }, { "microsoft-cp1254", CS_CP1254 }, { "microsoft-cp1255", CS_CP1255 }, { "microsoft-cp1256", CS_CP1256 }, { "microsoft-cp1257", CS_CP1257 }, { "microsoft-cp1258", CS_CP1258 }, { "mac-roman", CS_MAC_ROMAN }, { "viscii1.1-1", CS_VISCII }, { "viscii1-1", CS_VISCII }, }; const char *charset_to_xenc(int charset) { int i; for (i = 0; i < (int)lenof(xencs); i++) if (charset == xencs[i].charset) return xencs[i].name; return NULL; /* not found */ } int charset_from_xenc(const char *name) { int i; for (i = 0; i < (int)lenof(xencs); i++) { const char *p, *q; p = name; q = xencs[i].name; while (*p || *q) { if (tolower((unsigned char)*p) != tolower((unsigned char)*q)) break; p++; q++; } if (!*p && !*q) return xencs[i].charset; } return CS_NONE; /* not found */ } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/Buildscr��������������������������������������������������������������������������������0000644�0001753�0001753�00000002510�12444773746�011444� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- sh -*- # Build script to build Halibut releases. module halibut ifnexist halibut/charset checkout charset halibut/charset set Version $(!builddate).$(vcsid) ifneq "$(RELEASE)" "" set Version $(RELEASE) # use perl to avoid inconsistent behaviour of echo '\v' in halibut do perl -e 'print "\n\\versionid Halibut version $$ARGV[0]\n"' $(Version) >> doc/manpage.but # Write out a version.h that contains the real version number. in halibut do echo '/* Generated by automated build script */' > version.h in halibut do echo '$#define VERSION "version $(Version)"' >> version.h set Rel ifneq "$(RELEASE)" "" set Rel RELEASE=$(RELEASE) set Basename halibut-$(Version) # Make the source archive. in halibut do ./release.sh $(Basename) $(Version) # Build a local binary of Halibut in order to build the docs. Make # sure to tag it with the supplied version number, so that the # release docs announce themselves as having been built with the # release Halibut (e.g. PDF's Producer property). in halibut do make $(Rel) # And now build the docs. in halibut/doc do make deliver halibut/*.tar.gz $@ deliver halibut/doc/halibut.pdf $@ deliver halibut/doc/halibut.txt $@ deliver halibut/doc/*.html $@ # FIXME: it'd be nice to add a Windows delegation here so we can # ship a prebuilt Halibut executable. However, that requires a # Windows makefile. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/INSTALL���������������������������������������������������������������������������������0000644�0001753�0001753�00000006344�12444773746�011014� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Installation guide for Halibut ============================== This file is a guide to building and installing the documentation utility `Halibut' from its source archive. If you are reading this, then you have probably already unpacked the source archive somewhere. Building Halibut ---------------- If you have GNU make and gcc, you should simply be able to type `make'. The Makefile will generate a `build' subdirectory, and will put all the object files and binaries in there. In a release archive, the Makefile will also check the source files against a list of MD5 checksums, and if they match it will automatically add the correct version number to the build. This is _not_ a secure measure intended to enforce that only approved Halibut sources are ever built into a binary with a given version number; it is merely a sanity check against heavily modified copies _accidentally_ confusing users expecting standard versions of Halibut. Distribution maintainers are entirely at liberty, if they choose, to modify Halibut source files as appropriate for their distribution and then have the resulting binary call itself by the original version number. If you run `make VERSION=x.y', the resulting Halibut binary will call itself version x.y irrespective of the md5sum manifest. (You may also need to do this if your build system does not have the md5sum program.) Halibut unfortunately does not yet come with an autoconf-generated makefile, so if you do not have these utilities then you will have to do the build manually. Look in the master `Makefile' to find the list of source modules (they will be listed on the line starting `MODULES :=', and continued on lines starting `MODULES +='), compile those files with the C compiler of your choice, and link them together into a binary. In addition to the modules on that list, you will also need to compile `version.c', and if you wish your Halibut binary to identify itself with a version number then you will have to define the preprocessor symbol `VERSION' to the required version number string. On Unix this can be done with a command such as cc -c -DVERSION=\"0.9\" version.c Halibut's source files are intended to be almost entirely portable ANSI C. If they fail to compile and run correctly on your compiler, this might very well be considered a bug. Building the Halibut manual --------------------------- Once you have built Halibut itself, you might well want to build its manual. If you're using GNU make, you can do this just by changing into the `doc' subdirectory and typing `make'. (This relies on the Halibut binary you built in the previous step being present in the `build' subdirectory.) Failing that, you will need to read the Makefile and run a manual Halibut command, of the form halibut --text=halibut.txt --html blurb.but intro.but [...] index.but (The precise list of .but files is given at the top of doc/Makefile.) This will build plain text documentation in `halibut.txt', and a set of HTML files (*.html). It will also build a short man page `halibut.1', although this is by no means a replacement for the full manual. Installing Halibut ------------------ Halibut requires no additional data files. Simply install the binary, man page and full documentation in appropriate places for your system. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/LICENCE���������������������������������������������������������������������������������0000644�0001753�0001753�00000003476�12444773746�010753� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Halibut is copyright (c) 1999-2007 Simon Tatham. 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. Halibut contains font metrics derived from the "Font Metrics for PDF Core 14 Fonts", which carry the following copyright notice and licence: Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/Makefile��������������������������������������������������������������������������������0000644�0001753�0001753�00000005357�12444773746�011426� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Halibut master makefile # Currently depends on gcc, because: # - the dependency tracking uses -MD in order to avoid needing an # explicit `make depend' step # - the definition of CFLAGS includes the gcc-specific flag # `-Wall' # # Currently depends on GNU make, because: # - the Makefile uses GNU ifdef / ifndef commands and GNU make `%' # pattern rules # - we use .PHONY prefix=/usr/local exec_prefix=$(prefix) bindir=$(exec_prefix)/bin INSTALL=install -c .PHONY: all install clean spotless topclean release ifdef RELEASE ifndef VERSION VERSION := $(RELEASE) endif else CFLAGS += -g endif ifeq (x$(VERSION)y,xy) RELDIR := halibut else RELDIR := halibut-$(VERSION) endif # `make' from top level will build in directory `build' # `make BUILDDIR=foo' from top level will build in directory foo ifndef REALBUILD ifndef BUILDDIR ifdef TEST BUILDDIR := test else BUILDDIR := build endif endif all install: @test -d $(BUILDDIR) || mkdir $(BUILDDIR) @$(MAKE) -C $(BUILDDIR) -f ../Makefile $@ REALBUILD=yes spotless: topclean @test -d $(BUILDDIR) || mkdir $(BUILDDIR) @$(MAKE) -C $(BUILDDIR) -f ../Makefile spotless REALBUILD=yes clean: topclean @test -d $(BUILDDIR) || mkdir $(BUILDDIR) @$(MAKE) -C $(BUILDDIR) -f ../Makefile clean REALBUILD=yes # Remove Halibut output files in the source directory (may # have been created by running, for example, `build/halibut # inputs/test.but'). topclean: rm -f *.html output.* *.tar.gz # Makef a release archive. release: release.sh ./release.sh $(RELDIR) $(VERSION) else # The `real' makefile part. CFLAGS += -Wall -W -ansi -pedantic ifdef TEST CFLAGS += -DLOGALLOC LIBS += -lefence endif all: halibut SRC := ../ ifeq ($(shell test -d $(SRC)charset && echo yes),yes) LIBCHARSET_SRCDIR = $(SRC)charset/ else LIBCHARSET_SRCDIR = $(SRC)../charset/ endif LIBCHARSET_OBJDIR = ./# LIBCHARSET_OBJPFX = cs-# LIBCHARSET_GENPFX = charset-# MD = -MD CFLAGS += -I$(LIBCHARSET_SRCDIR) -I$(LIBCHARSET_OBJDIR) include $(LIBCHARSET_SRCDIR)Makefile MODULES := main malloc ustring error help licence version misc tree234 MODULES += input in_afm in_pf in_sfnt keywords contents index biblio MODULES += bk_text bk_html bk_whlp bk_man bk_info bk_paper bk_ps bk_pdf MODULES += winhelp deflate psdata wcwidth OBJECTS := $(addsuffix .o,$(MODULES)) $(LIBCHARSET_OBJS) DEPS := $(addsuffix .d,$(MODULES)) halibut: $(OBJECTS) $(CC) $(LFLAGS) -o halibut $(OBJECTS) $(LIBS) %.o: $(SRC)%.c $(CC) $(CFLAGS) -MD -c $< version.o: FORCE $(CC) $(VDEF) -MD -c $(SRC)version.c spotless:: clean rm -f *.d clean:: rm -f *.o halibut core install: $(INSTALL) -m 755 halibut $(bindir)/halibut $(MAKE) -C ../doc install prefix="$(prefix)" INSTALL="$(INSTALL)" FORCE: # phony target to force version.o to be rebuilt every time -include $(DEPS) endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/biblio.c��������������������������������������������������������������������������������0000644�0001753�0001753�00000004613�12444773746�011364� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * biblio.c: process the bibliography */ #include <assert.h> #include "halibut.h" static wchar_t *gentext(int num) { wchar_t text[22]; wchar_t *p = text + lenof(text); *--p = L'\0'; *--p = L']'; while (num != 0) { assert(p > text); *--p = L"0123456789"[num % 10]; num /= 10; } assert(p > text); *--p = L'['; return ustrdup(p); } static void cite_biblio(keywordlist *kl, wchar_t *key, filepos fpos) { keyword *kw = kw_lookup(kl, key); if (!kw) err_nosuchkw(&fpos, key); else { /* * We've found a \k reference. If it's a * bibliography entry ... */ if (kw->para->type == para_Biblio) { /* * ... then mark the paragraph as cited. */ kw->para->type = para_BiblioCited; } } } /* * Make a pass through the source form, generating citation formats * for bibliography entries and also marking which bibliography * entries are actually cited (or \nocite-ed). */ void gen_citations(paragraph *source, keywordlist *kl) { paragraph *para; int bibnum = 0; for (para = source; para; para = para->next) { word *ptr; /* * \BR and \nocite paragraphs get special processing here. */ if (para->type == para_BR) { keyword *kw = kw_lookup(kl, para->keyword); if (!kw) { err_nosuchkw(¶->fpos, para->keyword); } else if (kw->text) { err_multiBR(¶->fpos, para->keyword); } else { kw->text = dup_word_list(para->words); } } else if (para->type == para_NoCite) { wchar_t *wp = para->keyword; while (*wp) { cite_biblio(kl, wp, para->fpos); wp = uadv(wp); } } /* * Scan for keyword references. */ for (ptr = para->words; ptr; ptr = ptr->next) { if (ptr->type == word_UpperXref || ptr->type == word_LowerXref) cite_biblio(kl, ptr->text, ptr->fpos); } } /* * We're now almost done; all that remains is to scan through * the cited bibliography entries and invent default citation * texts for the ones that don't already have explicitly * provided \BR text. */ for (para = source; para; para = para->next) { if (para->type == para_BiblioCited) { keyword *kw = kw_lookup(kl, para->keyword); assert(kw != NULL); if (!kw->text) { word *wd = smalloc(sizeof(word)); wd->text = gentext(++bibnum); wd->type = word_Normal; wd->alt = NULL; wd->next = NULL; kw->text = wd; } para->kwtext = kw->text; } } } ���������������������������������������������������������������������������������������������������������������������halibut-1.1/bk_html.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000231160�12444773746�011543� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * HTML backend for Halibut */ /* * TODO: * * - I'm never entirely convinced that having a fragment link to * come in at the start of the real text in the file is * sensible. Perhaps for the topmost section in the file, no * fragment should be used? (Though it should probably still be * _there_ even if unused.) * * - In HHK index mode: subsidiary hhk entries (as in replacing * `foo, bar' with `foo\n\tbar') can be done by embedding * sub-<UL>s in the hhk file. This requires me getting round to * supporting that idiom in the rest of Halibut, but I thought * I'd record how it's done here in case I turn out to have * forgotten when I get there. */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <limits.h> #include "halibut.h" #define is_heading_type(type) ( (type) == para_Title || \ (type) == para_Chapter || \ (type) == para_Appendix || \ (type) == para_UnnumberedChapter || \ (type) == para_Heading || \ (type) == para_Subsect) #define heading_depth(p) ( (p)->type == para_Subsect ? (p)->aux + 1 : \ (p)->type == para_Heading ? 1 : \ (p)->type == para_Title ? -1 : 0 ) typedef struct { int number_at_all, just_numbers; wchar_t *number_suffix; } sectlevel; typedef struct { int nasect; sectlevel achapter, *asect; int *contents_depths; /* 0=main, 1=chapter, 2=sect etc */ int ncdepths; int address_section, visible_version_id; int leaf_contains_contents, leaf_smallest_contents; int navlinks; int rellinks; char *contents_filename; char *index_filename; char *template_filename; char *single_filename; char *chm_filename, *hhp_filename, *hhc_filename, *hhk_filename; char **template_fragments; int ntfragments; char *head_end, *body_start, *body_end, *addr_start, *addr_end; char *body_tag, *nav_attr; wchar_t *author, *description; wchar_t *index_text, *contents_text, *preamble_text, *title_separator; wchar_t *nav_prev_text, *nav_next_text, *nav_up_text, *nav_separator; wchar_t *index_main_sep, *index_multi_sep; wchar_t *pre_versionid, *post_versionid; int restrict_charset, output_charset; enum { HTML_3_2, HTML_4, ISO_HTML, XHTML_1_0_TRANSITIONAL, XHTML_1_0_STRICT } htmlver; wchar_t *lquote, *rquote; int leaf_level; } htmlconfig; #define contents_depth(conf, level) \ ( (conf).ncdepths > (level) ? (conf).contents_depths[level] : (level)+2 ) #define is_xhtml(ver) ((ver) >= XHTML_1_0_TRANSITIONAL) typedef struct htmlfile htmlfile; typedef struct htmlsect htmlsect; struct htmlfile { htmlfile *next; char *filename; int last_fragment_number; int min_heading_depth; htmlsect *first, *last; /* first/last highest-level sections */ /* * The `temp' field is available for use in individual passes * over the file list. For example, the HHK index generation * uses it to ensure no index term references the same file * more than once. */ int temp; }; struct htmlsect { htmlsect *next, *parent; htmlfile *file; paragraph *title, *text; enum { NORMAL, TOP, INDEX } type; int contents_depth; char **fragments; }; typedef struct { htmlfile *head, *tail; htmlfile *single, *index; tree234 *frags; tree234 *files; } htmlfilelist; typedef struct { htmlsect *head, *tail; } htmlsectlist; typedef struct { htmlfile *file; char *fragment; } htmlfragment; typedef struct { int nrefs, refsize; word **refs; } htmlindex; typedef struct { htmlsect *section; char *fragment; int generated, referenced; } htmlindexref; typedef struct { /* * This level deals with charset conversion, starting and * ending tags, and writing to the file. It's the lexical * level. */ FILE *fp; int charset, restrict_charset; charset_state cstate; int ver; enum { HO_NEUTRAL, HO_IN_TAG, HO_IN_EMPTY_TAG, HO_IN_TEXT } state; int hackflags; /* used for icky .HH* stuff */ int hacklimit; /* text size limit, again for .HH* */ /* * Stuff beyond here deals with the higher syntactic level: it * tracks how many levels of <ul> are currently open when * producing a contents list, for example. */ int contents_level; } htmloutput; /* * Nasty hacks that modify the behaviour of htmloutput files. All * of these are flag bits set in ho.hackflags. HO_HACK_QUOTEQUOTES * has the same effect as the `quote_quotes' parameter to * html_text_limit_internal, except that it's set globally on an * entire htmloutput structure; HO_HACK_QUOTENOTHING suppresses * quoting of any HTML special characters (for .HHP files); * HO_HACK_OMITQUOTES completely suppresses the generation of * double quotes at all (turning them into single quotes, for want * of a better idea). */ #define HO_HACK_QUOTEQUOTES 1 #define HO_HACK_QUOTENOTHING 2 #define HO_HACK_OMITQUOTES 4 static int html_fragment_compare(void *av, void *bv) { htmlfragment *a = (htmlfragment *)av; htmlfragment *b = (htmlfragment *)bv; int cmp; if ((cmp = strcmp(a->file->filename, b->file->filename)) != 0) return cmp; else return strcmp(a->fragment, b->fragment); } static int html_filename_compare(void *av, void *bv) { char *a = (char *)av; char *b = (char *)bv; return strcmp(a, b); } static void html_file_section(htmlconfig *cfg, htmlfilelist *files, htmlsect *sect, int depth); static htmlfile *html_new_file(htmlfilelist *list, char *filename); static htmlsect *html_new_sect(htmlsectlist *list, paragraph *title, htmlconfig *cfg); /* Flags for html_words() flags parameter */ #define NOTHING 0x00 #define MARKUP 0x01 #define LINKS 0x02 #define INDEXENTS 0x04 #define ALL 0x07 static void html_words(htmloutput *ho, word *words, int flags, htmlfile *file, keywordlist *keywords, htmlconfig *cfg); static void html_codepara(htmloutput *ho, word *words); static void element_open(htmloutput *ho, char const *name); static void element_close(htmloutput *ho, char const *name); static void element_empty(htmloutput *ho, char const *name); static void element_attr(htmloutput *ho, char const *name, char const *value); static void element_attr_w(htmloutput *ho, char const *name, wchar_t const *value); static void html_text(htmloutput *ho, wchar_t const *str); static void html_text_nbsp(htmloutput *ho, wchar_t const *str); static void html_text_limit(htmloutput *ho, wchar_t const *str, int maxlen); static void html_text_limit_internal(htmloutput *ho, wchar_t const *text, int maxlen, int quote_quotes, int nbsp); static void html_nl(htmloutput *ho); static void html_raw(htmloutput *ho, char *text); static void html_raw_as_attr(htmloutput *ho, char *text); static void cleanup(htmloutput *ho); static void html_href(htmloutput *ho, htmlfile *thisfile, htmlfile *targetfile, char *targetfrag); static void html_fragment(htmloutput *ho, char const *fragment); static char *html_format(paragraph *p, char *template_string); static char *html_sanitise_fragment(htmlfilelist *files, htmlfile *file, char *text); static char *html_sanitise_filename(htmlfilelist *files, char *text); static void html_contents_entry(htmloutput *ho, int depth, htmlsect *s, htmlfile *thisfile, keywordlist *keywords, htmlconfig *cfg); static void html_section_title(htmloutput *ho, htmlsect *s, htmlfile *thisfile, keywordlist *keywords, htmlconfig *cfg, int real); static htmlconfig html_configure(paragraph *source) { htmlconfig ret; paragraph *p; /* * Defaults. */ ret.leaf_level = 2; ret.achapter.just_numbers = FALSE; ret.achapter.number_at_all = TRUE; ret.achapter.number_suffix = L": "; ret.nasect = 1; ret.asect = snewn(ret.nasect, sectlevel); ret.asect[0].just_numbers = TRUE; ret.asect[0].number_at_all = TRUE; ret.asect[0].number_suffix = L" "; ret.ncdepths = 0; ret.contents_depths = 0; ret.visible_version_id = TRUE; ret.address_section = TRUE; ret.leaf_contains_contents = FALSE; ret.leaf_smallest_contents = 4; ret.navlinks = TRUE; ret.rellinks = TRUE; ret.single_filename = dupstr("Manual.html"); ret.contents_filename = dupstr("Contents.html"); ret.index_filename = dupstr("IndexPage.html"); ret.template_filename = dupstr("%n.html"); ret.chm_filename = ret.hhp_filename = NULL; ret.hhc_filename = ret.hhk_filename = NULL; ret.ntfragments = 1; ret.template_fragments = snewn(ret.ntfragments, char *); ret.template_fragments[0] = dupstr("%b"); ret.head_end = ret.body_tag = ret.body_start = ret.body_end = ret.addr_start = ret.addr_end = ret.nav_attr = NULL; ret.author = ret.description = NULL; ret.restrict_charset = CS_UTF8; ret.output_charset = CS_ASCII; ret.htmlver = HTML_4; ret.index_text = L"Index"; ret.contents_text = L"Contents"; ret.preamble_text = L"Preamble"; ret.title_separator = L" - "; ret.nav_prev_text = L"Previous"; ret.nav_next_text = L"Next"; ret.nav_up_text = L"Up"; ret.nav_separator = L" | "; ret.index_main_sep = L": "; ret.index_multi_sep = L", "; ret.pre_versionid = L"["; ret.post_versionid = L"]"; /* * Default quote characters are Unicode matched single quotes, * falling back to ordinary ASCII ". */ ret.lquote = L"\x2018\0\x2019\0\"\0\"\0\0"; ret.rquote = uadv(ret.lquote); /* * Two-pass configuration so that we can pick up global config * (e.g. `quotes') before having it overridden by specific * config (`html-quotes'), irrespective of the order in which * they occur. */ for (p = source; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } else if (!ustricmp(p->keyword, L"index")) { ret.index_text = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"contents")) { ret.contents_text = uadv(p->keyword); } } } for (p = source; p; p = p->next) { if (p->type == para_Config) { wchar_t *k = p->keyword; if (!ustrnicmp(k, L"xhtml-", 6)) k++; /* treat `xhtml-' and `html-' the same */ if (!ustricmp(k, L"html-restrict-charset")) { ret.restrict_charset = charset_from_ustr(&p->fpos, uadv(k)); } else if (!ustricmp(k, L"html-output-charset")) { ret.output_charset = charset_from_ustr(&p->fpos, uadv(k)); } else if (!ustricmp(k, L"html-version")) { wchar_t *vername = uadv(k); static const struct { const wchar_t *name; int ver; } versions[] = { {L"html3.2", HTML_3_2}, {L"html4", HTML_4}, {L"iso-html", ISO_HTML}, {L"xhtml1.0transitional", XHTML_1_0_TRANSITIONAL}, {L"xhtml1.0strict", XHTML_1_0_STRICT} }; int i; for (i = 0; i < (int)lenof(versions); i++) if (!ustricmp(versions[i].name, vername)) break; if (i == lenof(versions)) err_htmlver(&p->fpos, vername); else ret.htmlver = versions[i].ver; } else if (!ustricmp(k, L"html-single-filename")) { sfree(ret.single_filename); ret.single_filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(k, L"html-contents-filename")) { sfree(ret.contents_filename); ret.contents_filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(k, L"html-index-filename")) { sfree(ret.index_filename); ret.index_filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(k, L"html-template-filename")) { sfree(ret.template_filename); ret.template_filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(k, L"html-template-fragment")) { char *frag = adv(p->origkeyword); if (*frag) { while (ret.ntfragments--) sfree(ret.template_fragments[ret.ntfragments]); sfree(ret.template_fragments); ret.template_fragments = NULL; ret.ntfragments = 0; while (*frag) { ret.ntfragments++; ret.template_fragments = sresize(ret.template_fragments, ret.ntfragments, char *); ret.template_fragments[ret.ntfragments-1] = dupstr(frag); frag = adv(frag); } } else err_cfginsufarg(&p->fpos, p->origkeyword, 1); } else if (!ustricmp(k, L"html-chapter-numeric")) { ret.achapter.just_numbers = utob(uadv(k)); } else if (!ustricmp(k, L"html-chapter-shownumber")) { ret.achapter.number_at_all = utob(uadv(k)); } else if (!ustricmp(k, L"html-suppress-navlinks")) { ret.navlinks = !utob(uadv(k)); } else if (!ustricmp(k, L"html-rellinks")) { ret.rellinks = utob(uadv(k)); } else if (!ustricmp(k, L"html-chapter-suffix")) { ret.achapter.number_suffix = uadv(k); } else if (!ustricmp(k, L"html-leaf-level")) { wchar_t *u = uadv(k); if (!ustricmp(u, L"infinite") || !ustricmp(u, L"infinity") || !ustricmp(u, L"inf")) ret.leaf_level = -1; /* represents infinity */ else ret.leaf_level = utoi(u); } else if (!ustricmp(k, L"html-section-numeric")) { wchar_t *q = uadv(k); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nasect) { int i; ret.asect = sresize(ret.asect, n+1, sectlevel); for (i = ret.nasect; i <= n; i++) ret.asect[i] = ret.asect[ret.nasect-1]; ret.nasect = n+1; } ret.asect[n].just_numbers = utob(q); } else if (!ustricmp(k, L"html-section-shownumber")) { wchar_t *q = uadv(k); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nasect) { int i; ret.asect = sresize(ret.asect, n+1, sectlevel); for (i = ret.nasect; i <= n; i++) ret.asect[i] = ret.asect[ret.nasect-1]; ret.nasect = n+1; } ret.asect[n].number_at_all = utob(q); } else if (!ustricmp(k, L"html-section-suffix")) { wchar_t *q = uadv(k); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nasect) { int i; ret.asect = sresize(ret.asect, n+1, sectlevel); for (i = ret.nasect; i <= n; i++) { ret.asect[i] = ret.asect[ret.nasect-1]; } ret.nasect = n+1; } ret.asect[n].number_suffix = q; } else if (!ustricmp(k, L"html-contents-depth") || !ustrnicmp(k, L"html-contents-depth-", 20)) { /* * Relic of old implementation: this directive used * to be written as \cfg{html-contents-depth-3}{2} * rather than the usual Halibut convention of * \cfg{html-contents-depth}{3}{2}. We therefore * support both. */ wchar_t *q = k[19] ? k+20 : uadv(k); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.ncdepths) { int i; ret.contents_depths = sresize(ret.contents_depths, n+1, int); for (i = ret.ncdepths; i <= n; i++) { ret.contents_depths[i] = i+2; } ret.ncdepths = n+1; } ret.contents_depths[n] = utoi(q); } else if (!ustricmp(k, L"html-head-end")) { ret.head_end = adv(p->origkeyword); } else if (!ustricmp(k, L"html-body-tag")) { ret.body_tag = adv(p->origkeyword); } else if (!ustricmp(k, L"html-body-start")) { ret.body_start = adv(p->origkeyword); } else if (!ustricmp(k, L"html-body-end")) { ret.body_end = adv(p->origkeyword); } else if (!ustricmp(k, L"html-address-start")) { ret.addr_start = adv(p->origkeyword); } else if (!ustricmp(k, L"html-address-end")) { ret.addr_end = adv(p->origkeyword); } else if (!ustricmp(k, L"html-navigation-attributes")) { ret.nav_attr = adv(p->origkeyword); } else if (!ustricmp(k, L"html-author")) { ret.author = uadv(k); } else if (!ustricmp(k, L"html-description")) { ret.description = uadv(k); } else if (!ustricmp(k, L"html-suppress-address")) { ret.address_section = !utob(uadv(k)); } else if (!ustricmp(k, L"html-versionid")) { ret.visible_version_id = utob(uadv(k)); } else if (!ustricmp(k, L"html-quotes")) { if (*uadv(k) && *uadv(uadv(k))) { ret.lquote = uadv(k); ret.rquote = uadv(ret.lquote); } } else if (!ustricmp(k, L"html-leaf-contains-contents")) { ret.leaf_contains_contents = utob(uadv(k)); } else if (!ustricmp(k, L"html-leaf-smallest-contents")) { ret.leaf_smallest_contents = utoi(uadv(k)); } else if (!ustricmp(k, L"html-index-text")) { ret.index_text = uadv(k); } else if (!ustricmp(k, L"html-contents-text")) { ret.contents_text = uadv(k); } else if (!ustricmp(k, L"html-preamble-text")) { ret.preamble_text = uadv(k); } else if (!ustricmp(k, L"html-title-separator")) { ret.title_separator = uadv(k); } else if (!ustricmp(k, L"html-nav-prev-text")) { ret.nav_prev_text = uadv(k); } else if (!ustricmp(k, L"html-nav-next-text")) { ret.nav_next_text = uadv(k); } else if (!ustricmp(k, L"html-nav-up-text")) { ret.nav_up_text = uadv(k); } else if (!ustricmp(k, L"html-nav-separator")) { ret.nav_separator = uadv(k); } else if (!ustricmp(k, L"html-index-main-separator")) { ret.index_main_sep = uadv(k); } else if (!ustricmp(k, L"html-index-multiple-separator")) { ret.index_multi_sep = uadv(k); } else if (!ustricmp(k, L"html-pre-versionid")) { ret.pre_versionid = uadv(k); } else if (!ustricmp(k, L"html-post-versionid")) { ret.post_versionid = uadv(k); } else if (!ustricmp(k, L"html-mshtmlhelp-chm")) { sfree(ret.chm_filename); ret.chm_filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(k, L"html-mshtmlhelp-project")) { sfree(ret.hhp_filename); ret.hhp_filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(k, L"html-mshtmlhelp-contents")) { sfree(ret.hhc_filename); ret.hhc_filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(k, L"html-mshtmlhelp-index")) { sfree(ret.hhk_filename); ret.hhk_filename = dupstr(adv(p->origkeyword)); } } } /* * Enforce that the CHM and HHP filenames must either be both * present or both absent. If one is present but not the other, * turn both off. */ if (!ret.chm_filename ^ !ret.hhp_filename) { err_chmnames(); sfree(ret.chm_filename); ret.chm_filename = NULL; sfree(ret.hhp_filename); ret.hhp_filename = NULL; } /* * And if we're not generating an HHP, there's no need for HHC * or HHK. */ if (!ret.hhp_filename) { sfree(ret.hhc_filename); ret.hhc_filename = NULL; sfree(ret.hhk_filename); ret.hhk_filename = NULL; } /* * Now process fallbacks on quote characters. */ while (*uadv(ret.rquote) && *uadv(uadv(ret.rquote)) && (!cvt_ok(ret.restrict_charset, ret.lquote) || !cvt_ok(ret.restrict_charset, ret.rquote))) { ret.lquote = uadv(ret.rquote); ret.rquote = uadv(ret.lquote); } return ret; } paragraph *html_config_filename(char *filename) { /* * If the user passes in a single filename as a parameter to * the `--html' command-line option, then we should assume it * to imply _two_ config directives: * \cfg{html-single-filename}{whatever} and * \cfg{html-leaf-level}{0}; the rationale being that the user * wants their output _in that file_. */ paragraph *p, *q; p = cmdline_cfg_simple("html-single-filename", filename, NULL); q = cmdline_cfg_simple("html-leaf-level", "0", NULL); p->next = q; return p; } void html_backend(paragraph *sourceform, keywordlist *keywords, indexdata *idx, void *unused) { paragraph *p; htmlsect *topsect; htmlconfig conf; htmlfilelist files = { NULL, NULL, NULL, NULL, NULL, NULL }; htmlsectlist sects = { NULL, NULL }, nonsects = { NULL, NULL }; char *hhk_filename; int has_index; IGNORE(unused); conf = html_configure(sourceform); /* * We're going to make heavy use of paragraphs' private data * fields in the forthcoming code. Clear them first, so we can * reliably tell whether we have auxiliary data for a * particular paragraph. */ for (p = sourceform; p; p = p->next) p->private_data = NULL; files.frags = newtree234(html_fragment_compare); files.files = newtree234(html_filename_compare); /* * Start by figuring out into which file each piece of the * document should be put. We'll do this by inventing an * `htmlsect' structure and stashing it in the private_data * field of each section paragraph; we also need one additional * htmlsect for the document index, which won't show up in the * source form but needs to be consistently mentioned in * contents links. * * While we're here, we'll also invent the HTML fragment name(s) * for each section. */ { htmlsect *sect; int d; topsect = html_new_sect(§s, NULL, &conf); topsect->type = TOP; topsect->title = NULL; topsect->text = sourceform; topsect->contents_depth = contents_depth(conf, 0); html_file_section(&conf, &files, topsect, -1); for (p = sourceform; p; p = p->next) if (is_heading_type(p->type)) { d = heading_depth(p); if (p->type == para_Title) { topsect->title = p; continue; } sect = html_new_sect(§s, p, &conf); sect->text = p->next; sect->contents_depth = contents_depth(conf, d+1) - (d+1); if (p->parent) { sect->parent = (htmlsect *)p->parent->private_data; assert(sect->parent != NULL); } else sect->parent = topsect; p->private_data = sect; html_file_section(&conf, &files, sect, d); { int i; for (i=0; i < conf.ntfragments; i++) { sect->fragments[i] = html_format(p, conf.template_fragments[i]); sect->fragments[i] = html_sanitise_fragment(&files, sect->file, sect->fragments[i]); } } } /* * And the index, if we have one. Note that we don't output * an index as an HTML file if we're outputting one as a * .HHK. */ has_index = (count234(idx->entries) > 0); if (has_index && !conf.hhk_filename) { sect = html_new_sect(§s, NULL, &conf); sect->text = NULL; sect->type = INDEX; sect->parent = topsect; sect->contents_depth = 0; html_file_section(&conf, &files, sect, 0); /* peer of chapters */ sect->fragments[0] = utoa_dup(conf.index_text, CS_ASCII); sect->fragments[0] = html_sanitise_fragment(&files, sect->file, sect->fragments[0]); files.index = sect->file; } } /* * Go through the keyword list and sort out fragment IDs for * all the potentially referenced paragraphs which _aren't_ * headings. */ { int i; keyword *kw; htmlsect *sect; for (i = 0; (kw = index234(keywords->keys, i)) != NULL; i++) { paragraph *q, *p = kw->para; if (!is_heading_type(p->type)) { htmlsect *parent; /* * Find the paragraph's parent htmlsect, to * determine which file it will end up in. */ q = p->parent; if (!q) { /* * Preamble paragraphs have no parent. So if we * have a non-heading with no parent, it must * be preamble, and therefore its parent * htmlsect must be the preamble one. */ assert(sects.head && sects.head->type == TOP); parent = sects.head; } else parent = (htmlsect *)q->private_data; /* * Now we can construct an htmlsect for this * paragraph itself, taking care to put it in the * list of non-sections rather than the list of * sections (so that traverses of the `sects' list * won't attempt to add it to the contents or * anything weird like that). */ sect = html_new_sect(&nonsects, p, &conf); sect->file = parent->file; sect->parent = parent; p->private_data = sect; /* * Fragment IDs for these paragraphs will simply be * `p' followed by an integer. */ sect->fragments[0] = snewn(40, char); sprintf(sect->fragments[0], "p%d", sect->file->last_fragment_number++); sect->fragments[0] = html_sanitise_fragment(&files, sect->file, sect->fragments[0]); } } } /* * Reset the fragment numbers in each file. I've just used them * to generate `p' fragment IDs for non-section paragraphs * (numbered list elements, bibliocited), and now I want to use * them for `i' fragment IDs for index entries. */ { htmlfile *file; for (file = files.head; file; file = file->next) file->last_fragment_number = 0; } /* * Now sort out the index. This involves: * * - For each index term, we set up an htmlindex structure to * store all the references to that term. * * - Then we make a pass over the actual document, finding * every word_IndexRef; for each one, we actually figure out * the HTML filename/fragment pair we will use to reference * it, store that information in the private data field of * the word_IndexRef itself (so we can recreate it when the * time comes to output our HTML), and add a reference to it * to the index term in question. */ { int i; indexentry *entry; htmlsect *lastsect; word *w; /* * Set up the htmlindex structures. */ for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++) { htmlindex *hi = snew(htmlindex); hi->nrefs = hi->refsize = 0; hi->refs = NULL; entry->backend_data = hi; } /* * Run over the document inventing fragments. Each fragment * is of the form `i' followed by an integer. */ lastsect = sects.head; /* this is always the top section */ for (p = sourceform; p; p = p->next) { if (is_heading_type(p->type) && p->type != para_Title) lastsect = (htmlsect *)p->private_data; for (w = p->words; w; w = w->next) if (w->type == word_IndexRef) { htmlindexref *hr = snew(htmlindexref); indextag *tag; int i; hr->referenced = hr->generated = FALSE; hr->section = lastsect; { char buf[40]; sprintf(buf, "i%d", lastsect->file->last_fragment_number++); hr->fragment = dupstr(buf); hr->fragment = html_sanitise_fragment(&files, hr->section->file, hr->fragment); } w->private_data = hr; tag = index_findtag(idx, w->text); if (!tag) break; for (i = 0; i < tag->nrefs; i++) { indexentry *entry = tag->refs[i]; htmlindex *hi = (htmlindex *)entry->backend_data; if (hi->nrefs >= hi->refsize) { hi->refsize += 32; hi->refs = sresize(hi->refs, hi->refsize, word *); } hi->refs[hi->nrefs++] = w; } } } } /* * Now we're ready to write out the actual HTML files. * * For each file: * * - we open that file and write its header * - we run down the list of sections * - for each section directly contained within that file, we * output the section text * - for each section which is not in the file but which has a * parent that is, we output a contents entry for the * section if appropriate * - finally, we output the file trailer and close the file. */ { htmlfile *f, *prevf; htmlsect *s; paragraph *p; prevf = NULL; for (f = files.head; f; f = f->next) { htmloutput ho; int displaying; enum LISTTYPE { NOLIST, UL, OL, DL }; enum ITEMTYPE { NOITEM, LI, DT, DD }; struct stackelement { struct stackelement *next; enum LISTTYPE listtype; enum ITEMTYPE itemtype; } *stackhead; #define listname(lt) ( (lt)==UL ? "ul" : (lt)==OL ? "ol" : "dl" ) #define itemname(lt) ( (lt)==LI ? "li" : (lt)==DT ? "dt" : "dd" ) if (!strcmp(f->filename, "-")) ho.fp = stdout; else ho.fp = fopen(f->filename, "w"); if (!ho.fp) err_cantopenw(f->filename); ho.charset = conf.output_charset; ho.restrict_charset = conf.restrict_charset; ho.cstate = charset_init_state; ho.ver = conf.htmlver; ho.state = HO_NEUTRAL; ho.contents_level = 0; ho.hackflags = 0; /* none of these thankyouverymuch */ ho.hacklimit = -1; /* <!DOCTYPE>. */ switch (conf.htmlver) { case HTML_3_2: if (ho.fp) fprintf(ho.fp, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD " "HTML 3.2 Final//EN\">\n"); break; case HTML_4: if (ho.fp) fprintf(ho.fp, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML" " 4.01//EN\"\n\"http://www.w3.org/TR/html4/" "strict.dtd\">\n"); break; case ISO_HTML: if (ho.fp) fprintf(ho.fp, "<!DOCTYPE HTML PUBLIC \"ISO/IEC " "15445:2000//DTD HTML//EN\">\n"); break; case XHTML_1_0_TRANSITIONAL: if (ho.fp) { fprintf(ho.fp, "<?xml version=\"1.0\" encoding=\"%s\"?>\n", charset_to_mimeenc(conf.output_charset)); fprintf(ho.fp, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML" " 1.0 Transitional//EN\"\n\"http://www.w3.org/TR/" "xhtml1/DTD/xhtml1-transitional.dtd\">\n"); } break; case XHTML_1_0_STRICT: if (ho.fp) { fprintf(ho.fp, "<?xml version=\"1.0\" encoding=\"%s\"?>\n", charset_to_mimeenc(conf.output_charset)); fprintf(ho.fp, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML" " 1.0 Strict//EN\"\n\"http://www.w3.org/TR/xhtml1/" "DTD/xhtml1-strict.dtd\">\n"); } break; } element_open(&ho, "html"); if (is_xhtml(conf.htmlver)) { element_attr(&ho, "xmlns", "http://www.w3.org/1999/xhtml"); } html_nl(&ho); element_open(&ho, "head"); html_nl(&ho); element_empty(&ho, "meta"); element_attr(&ho, "http-equiv", "content-type"); { char buf[200]; sprintf(buf, "text/html; charset=%.150s", charset_to_mimeenc(conf.output_charset)); element_attr(&ho, "content", buf); } html_nl(&ho); if (conf.author) { element_empty(&ho, "meta"); element_attr(&ho, "name", "author"); element_attr_w(&ho, "content", conf.author); html_nl(&ho); } if (conf.description) { element_empty(&ho, "meta"); element_attr(&ho, "name", "description"); element_attr_w(&ho, "content", conf.description); html_nl(&ho); } element_open(&ho, "title"); if (f->first && f->first->title) { html_words(&ho, f->first->title->words, NOTHING, f, keywords, &conf); assert(f->last); if (f->last != f->first && f->last->title) { html_text(&ho, conf.title_separator); html_words(&ho, f->last->title->words, NOTHING, f, keywords, &conf); } } element_close(&ho, "title"); html_nl(&ho); if (conf.rellinks) { if (prevf) { element_empty(&ho, "link"); element_attr(&ho, "rel", "previous"); element_attr(&ho, "href", prevf->filename); html_nl(&ho); } if (f != files.head) { element_empty(&ho, "link"); element_attr(&ho, "rel", "ToC"); element_attr(&ho, "href", files.head->filename); html_nl(&ho); } if (conf.leaf_level > 0) { htmlsect *p = f->first->parent; assert(p == f->last->parent); if (p) { element_empty(&ho, "link"); element_attr(&ho, "rel", "up"); element_attr(&ho, "href", p->file->filename); html_nl(&ho); } } if (has_index && files.index && f != files.index) { element_empty(&ho, "link"); element_attr(&ho, "rel", "index"); element_attr(&ho, "href", files.index->filename); html_nl(&ho); } if (f->next) { element_empty(&ho, "link"); element_attr(&ho, "rel", "next"); element_attr(&ho, "href", f->next->filename); html_nl(&ho); } } if (conf.head_end) html_raw(&ho, conf.head_end); /* * Add any <head> data defined in specific sections * that go in this file. (This is mostly to allow <meta * name="AppleTitle"> tags for Mac online help.) */ for (s = sects.head; s; s = s->next) { if (s->file == f && s->text) { for (p = s->text; p && (p == s->text || p->type == para_Title || !is_heading_type(p->type)); p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"html-local-head")) { html_raw(&ho, adv(p->origkeyword)); } } } } } element_close(&ho, "head"); html_nl(&ho); if (conf.body_tag) html_raw(&ho, conf.body_tag); else element_open(&ho, "body"); html_nl(&ho); if (conf.body_start) html_raw(&ho, conf.body_start); /* * Write out a nav bar. Special case: we don't do this * if there is only one file. */ if (conf.navlinks && files.head != files.tail) { element_open(&ho, "p"); if (conf.nav_attr) html_raw_as_attr(&ho, conf.nav_attr); if (prevf) { element_open(&ho, "a"); element_attr(&ho, "href", prevf->filename); } html_text(&ho, conf.nav_prev_text); if (prevf) element_close(&ho, "a"); html_text(&ho, conf.nav_separator); if (f != files.head) { element_open(&ho, "a"); element_attr(&ho, "href", files.head->filename); } html_text(&ho, conf.contents_text); if (f != files.head) element_close(&ho, "a"); /* We don't bother with "Up" links for leaf-level 1, * as they would be identical to the "Contents" links. */ if (conf.leaf_level >= 2) { htmlsect *p = f->first->parent; assert(p == f->last->parent); html_text(&ho, conf.nav_separator); if (p) { element_open(&ho, "a"); element_attr(&ho, "href", p->file->filename); } html_text(&ho, conf.nav_up_text); if (p) { element_close(&ho, "a"); } } if (has_index && files.index) { html_text(&ho, conf.nav_separator); if (f != files.index) { element_open(&ho, "a"); element_attr(&ho, "href", files.index->filename); } html_text(&ho, conf.index_text); if (f != files.index) element_close(&ho, "a"); } html_text(&ho, conf.nav_separator); if (f->next) { element_open(&ho, "a"); element_attr(&ho, "href", f->next->filename); } html_text(&ho, conf.nav_next_text); if (f->next) element_close(&ho, "a"); element_close(&ho, "p"); html_nl(&ho); } prevf = f; /* * Special case: for single-file mode, we output the top * section title before the TOC. */ if (files.head == files.tail && sects.head->type == TOP) { element_open(&ho, "h1"); /* * Provide anchor(s) for cross-links to target. */ { int i; for (i=0; i < conf.ntfragments; i++) if (sects.head->fragments[i]) html_fragment(&ho, sects.head->fragments[i]); } html_section_title(&ho, sects.head, f, keywords, &conf, TRUE); element_close(&ho, "h1"); } /* * Write out a prefix TOC for the file (if a leaf file). * * We start by going through the section list and * collecting the sections which need to be added to * the contents. On the way, we also test to see if * this file is a leaf file (defined as one which * contains all descendants of any section it * contains), because this will play a part in our * decision on whether or not to _output_ the TOC. */ { int ntoc = 0, tocsize = 0, tocstartidx = 0; htmlsect **toc = NULL; int leaf = TRUE; for (s = sects.head; s; s = s->next) { htmlsect *a, *ac; int depth, adepth; /* * Search up from this section until we find * the highest-level one which belongs in this * file. */ depth = adepth = 0; a = NULL; for (ac = s; ac; ac = ac->parent) { if (ac->file == f) { a = ac; adepth = depth; } depth++; } if (s->file != f && a != NULL) leaf = FALSE; if (a) { if (adepth <= a->contents_depth) { if (ntoc >= tocsize) { tocsize += 64; toc = sresize(toc, tocsize, htmlsect *); } toc[ntoc++] = s; } } } /* * Special case: for single-file mode, we don't output * the first section TOC entry if it's the top since we * have already output a section title for it above the * TOC, and since we don't output the top TOC entry, we * reduce the level of the remaining TOC entries by one * so that they are output correctly one level up from * where they would have been. */ tocstartidx = (files.head == files.tail && ntoc > 0 && toc[0]->type == TOP) ? 1 : 0; if (leaf && conf.leaf_contains_contents && ntoc >= conf.leaf_smallest_contents && tocstartidx < ntoc) { int i; for (i = tocstartidx; i < ntoc; i++) { htmlsect *s = toc[i]; int hlevel = (s->type == TOP ? -1 : s->type == INDEX ? 0 : heading_depth(s->title)) - tocstartidx - f->min_heading_depth + 1; assert(hlevel >= 1); html_contents_entry(&ho, hlevel, s, f, keywords, &conf); } html_contents_entry(&ho, 0, NULL, f, keywords, &conf); } } /* * Now go through the document and output some real * text. */ displaying = FALSE; for (s = sects.head; s; s = s->next) { if (s->file == f) { /* * This section belongs in this file. * Display it. */ displaying = TRUE; } else { /* * Doesn't belong in this file, but it may be * a descendant of a section which does, in * which case we should consider it for the * main TOC of this file (for non-leaf files). */ htmlsect *a, *ac; int depth, adepth; displaying = FALSE; /* * Search up from this section until we find * the highest-level one which belongs in this * file. */ depth = adepth = 0; a = NULL; for (ac = s; ac; ac = ac->parent) { if (ac->file == f) { a = ac; adepth = depth; } depth++; } if (a != NULL) { /* * This section does not belong in this * file, but an ancestor of it does. Write * out a contents table entry, if the depth * doesn't exceed the maximum contents * depth for the ancestor section. */ if (adepth <= a->contents_depth) { html_contents_entry(&ho, adepth, s, f, keywords, &conf); } } } if (displaying) { int hlevel; char htag[3]; html_contents_entry(&ho, 0, NULL, f, keywords, &conf); /* * Display the section heading. * * Special case: for single-file mode, we don't * output the top section title since we have * already output it before the TOC. */ if (files.head != files.tail || s->type != TOP) { hlevel = (s->type == TOP ? -1 : s->type == INDEX ? 0 : heading_depth(s->title)) - f->min_heading_depth + 1; assert(hlevel >= 1); /* HTML headings only go up to <h6> */ if (hlevel > 6) hlevel = 6; htag[0] = 'h'; htag[1] = '0' + hlevel; htag[2] = '\0'; element_open(&ho, htag); /* * Provide anchor(s) for cross-links to target. * * (Also we'll have to do this separately in * other paragraph types - NumberedList and * BiblioCited.) */ { int i; for (i=0; i < conf.ntfragments; i++) if (s->fragments[i]) html_fragment(&ho, s->fragments[i]); } html_section_title(&ho, s, f, keywords, &conf, TRUE); element_close(&ho, htag); } /* * Now display the section text. */ if (s->text) { stackhead = snew(struct stackelement); stackhead->next = NULL; stackhead->listtype = NOLIST; stackhead->itemtype = NOITEM; for (p = s->text;; p = p->next) { enum LISTTYPE listtype; struct stackelement *se; /* * Preliminary switch to figure out what * sort of list we expect to be inside at * this stage. * * Since p may still be NULL at this point, * I invent a harmless paragraph type for * it if it is. */ switch (p ? p->type : para_Normal) { case para_Rule: case para_Normal: case para_Copyright: case para_BiblioCited: case para_Code: case para_QuotePush: case para_QuotePop: case para_Chapter: case para_Appendix: case para_UnnumberedChapter: case para_Heading: case para_Subsect: case para_LcontPop: listtype = NOLIST; break; case para_Bullet: listtype = UL; break; case para_NumberedList: listtype = OL; break; case para_DescribedThing: case para_Description: listtype = DL; break; case para_LcontPush: se = snew(struct stackelement); se->next = stackhead; se->listtype = NOLIST; se->itemtype = NOITEM; stackhead = se; continue; default: /* some totally non-printing para */ continue; } html_nl(&ho); /* * Terminate the most recent list item, if * any. (We left this until after * processing LcontPush, since in that case * the list item won't want to be * terminated until after the corresponding * LcontPop.) */ if (stackhead->itemtype != NOITEM) { element_close(&ho, itemname(stackhead->itemtype)); html_nl(&ho); } stackhead->itemtype = NOITEM; /* * Terminate the current list, if it's not * the one we want to be in. */ if (listtype != stackhead->listtype && stackhead->listtype != NOLIST) { element_close(&ho, listname(stackhead->listtype)); html_nl(&ho); } /* * Leave the loop if our time has come. */ if (!p || (is_heading_type(p->type) && p->type != para_Title)) break; /* end of section text */ /* * Start a fresh list if necessary. */ if (listtype != stackhead->listtype && listtype != NOLIST) element_open(&ho, listname(listtype)); stackhead->listtype = listtype; switch (p->type) { case para_Rule: element_empty(&ho, "hr"); break; case para_Code: html_codepara(&ho, p->words); break; case para_Normal: case para_Copyright: element_open(&ho, "p"); html_nl(&ho); html_words(&ho, p->words, ALL, f, keywords, &conf); html_nl(&ho); element_close(&ho, "p"); break; case para_BiblioCited: element_open(&ho, "p"); if (p->private_data) { htmlsect *s = (htmlsect *)p->private_data; int i; for (i=0; i < conf.ntfragments; i++) if (s->fragments[i]) html_fragment(&ho, s->fragments[i]); } html_nl(&ho); html_words(&ho, p->kwtext, ALL, f, keywords, &conf); html_text(&ho, L" "); html_words(&ho, p->words, ALL, f, keywords, &conf); html_nl(&ho); element_close(&ho, "p"); break; case para_Bullet: case para_NumberedList: element_open(&ho, "li"); if (p->private_data) { htmlsect *s = (htmlsect *)p->private_data; int i; for (i=0; i < conf.ntfragments; i++) if (s->fragments[i]) html_fragment(&ho, s->fragments[i]); } html_nl(&ho); stackhead->itemtype = LI; html_words(&ho, p->words, ALL, f, keywords, &conf); break; case para_DescribedThing: element_open(&ho, "dt"); html_nl(&ho); stackhead->itemtype = DT; html_words(&ho, p->words, ALL, f, keywords, &conf); break; case para_Description: element_open(&ho, "dd"); html_nl(&ho); stackhead->itemtype = DD; html_words(&ho, p->words, ALL, f, keywords, &conf); break; case para_QuotePush: element_open(&ho, "blockquote"); break; case para_QuotePop: element_close(&ho, "blockquote"); break; case para_LcontPop: se = stackhead; stackhead = stackhead->next; assert(stackhead); sfree(se); break; } } assert(stackhead && !stackhead->next); sfree(stackhead); } if (s->type == INDEX) { indexentry *entry; int i; /* * This section is the index. I'll just * render it as a single paragraph, with a * colon between the index term and the * references, and <br> in between each * entry. */ element_open(&ho, "p"); for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++) { htmlindex *hi = (htmlindex *)entry->backend_data; int j; if (i > 0) element_empty(&ho, "br"); html_nl(&ho); html_words(&ho, entry->text, MARKUP|LINKS, f, keywords, &conf); html_text(&ho, conf.index_main_sep); for (j = 0; j < hi->nrefs; j++) { htmlindexref *hr = (htmlindexref *)hi->refs[j]->private_data; paragraph *p = hr->section->title; if (j > 0) html_text(&ho, conf.index_multi_sep); html_href(&ho, f, hr->section->file, hr->fragment); hr->referenced = TRUE; if (p && p->kwtext) html_words(&ho, p->kwtext, MARKUP|LINKS, f, keywords, &conf); else if (p && p->words) html_words(&ho, p->words, MARKUP|LINKS, f, keywords, &conf); else { /* * If there is no title at all, * this must be because our * target section is the * preamble section and there * is no title. So we use the * preamble_text. */ html_text(&ho, conf.preamble_text); } element_close(&ho, "a"); } } element_close(&ho, "p"); } } } html_contents_entry(&ho, 0, NULL, f, keywords, &conf); html_nl(&ho); { /* * Footer. */ int done_version_ids = FALSE; if (conf.address_section) element_empty(&ho, "hr"); if (conf.body_end) html_raw(&ho, conf.body_end); if (conf.address_section) { int started = FALSE; if (conf.htmlver == ISO_HTML) { /* * The ISO-HTML validator complains if * there isn't a <div> tag surrounding the * <address> tag. I'm uncertain of why this * should be - there appears to be no * mention of this in the ISO-HTML spec, * suggesting that it doesn't represent a * change from HTML 4, but nonetheless the * HTML 4 validator doesn't seem to mind. */ element_open(&ho, "div"); } element_open(&ho, "address"); if (conf.addr_start) { html_raw(&ho, conf.addr_start); html_nl(&ho); started = TRUE; } if (conf.visible_version_id) { for (p = sourceform; p; p = p->next) if (p->type == para_VersionID) { if (started) element_empty(&ho, "br"); html_nl(&ho); html_text(&ho, conf.pre_versionid); html_words(&ho, p->words, NOTHING, f, keywords, &conf); html_text(&ho, conf.post_versionid); started = TRUE; } done_version_ids = TRUE; } if (conf.addr_end) { if (started) element_empty(&ho, "br"); html_raw(&ho, conf.addr_end); } element_close(&ho, "address"); if (conf.htmlver == ISO_HTML) element_close(&ho, "div"); } if (!done_version_ids) { /* * If the user didn't want the version IDs * visible, I think we still have a duty to put * them in an HTML comment. */ int started = FALSE; for (p = sourceform; p; p = p->next) if (p->type == para_VersionID) { if (!started) { html_raw(&ho, "<!-- version IDs:\n"); started = TRUE; } html_words(&ho, p->words, NOTHING, f, keywords, &conf); html_nl(&ho); } if (started) html_raw(&ho, "-->\n"); } } element_close(&ho, "body"); html_nl(&ho); element_close(&ho, "html"); html_nl(&ho); cleanup(&ho); } } /* * Before we start outputting the HTML Help files, check * whether there's even going to _be_ an index file: we omit it * if the index contains nothing. */ hhk_filename = conf.hhk_filename; if (hhk_filename) { int ok = FALSE; int i; indexentry *entry; for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++) { htmlindex *hi = (htmlindex *)entry->backend_data; if (hi->nrefs > 0) { ok = TRUE; /* found an index entry */ break; } } if (!ok) hhk_filename = NULL; } /* * Output the MS HTML Help supporting files, if requested. * * A good unofficial reference for these is <http://chmspec.nongnu.org/>. */ if (conf.hhp_filename) { htmlfile *f; htmloutput ho; ho.charset = CS_CP1252; /* as far as I know, HHP files are */ ho.restrict_charset = CS_CP1252; /* hardwired to this charset */ ho.cstate = charset_init_state; ho.ver = HTML_4; /* *shrug* */ ho.state = HO_NEUTRAL; ho.contents_level = 0; ho.hackflags = HO_HACK_QUOTENOTHING; ho.fp = fopen(conf.hhp_filename, "w"); if (!ho.fp) err_cantopenw(conf.hhp_filename); fprintf(ho.fp, "[OPTIONS]\n" /* Binary TOC required for Next/Previous nav to work */ "Binary TOC=Yes\n" "Compatibility=1.1 or later\n" "Compiled file=%s\n" "Default Window=main\n" "Default topic=%s\n" "Display compile progress=Yes\n" "Full-text search=Yes\n" "Title=", conf.chm_filename, files.head->filename); ho.hacklimit = 255; html_words(&ho, topsect->title->words, NOTHING, NULL, keywords, &conf); fprintf(ho.fp, "\n"); /* * These two entries don't seem to be remotely necessary * for a successful run of the help _compiler_, but * omitting them causes the GUI Help Workshop to behave * rather strangely if you try to load the help project * into that and edit it. */ if (conf.hhc_filename) fprintf(ho.fp, "Contents file=%s\n", conf.hhc_filename); if (hhk_filename) fprintf(ho.fp, "Index file=%s\n", hhk_filename); fprintf(ho.fp, "\n[WINDOWS]\nmain=\""); ho.hackflags |= HO_HACK_OMITQUOTES; ho.hacklimit = 255; html_words(&ho, topsect->title->words, NOTHING, NULL, keywords, &conf); fprintf(ho.fp, "\",\"%s\",\"%s\",\"%s\",,,,,," /* This first magic number is fsWinProperties, controlling * Navigation Pane options and the like. * Constants HHWIN_PROP_* in htmlhelp.h. */ "0x62520,," /* This second number is fsToolBarFlags, mainly controlling * toolbar buttons. Constants HHWIN_BUTTON_*. * NOTE: there are two pairs of bits for Next/Previous * buttons: 7/8 (which do nothing useful), and 21/22 * (which work). (Neither of these are exposed in the HHW * UI, but they work fine in HH.) We use the latter. */ "0x60304e,,,,,,,,0\n", conf.hhc_filename ? conf.hhc_filename : "", hhk_filename ? hhk_filename : "", files.head->filename); /* * The [FILES] section is also not necessary for * compilation (hhc appears to build up a list of needed * files just by following links from the given starting * points), but useful for loading the project into HHW. */ fprintf(ho.fp, "\n[FILES]\n"); for (f = files.head; f; f = f->next) fprintf(ho.fp, "%s\n", f->filename); fclose(ho.fp); } if (conf.hhc_filename) { htmlfile *f; htmlsect *s, *a; htmloutput ho; int currdepth = 0; ho.fp = fopen(conf.hhc_filename, "w"); if (!ho.fp) err_cantopenw(conf.hhc_filename); ho.charset = CS_CP1252; /* as far as I know, HHC files are */ ho.restrict_charset = CS_CP1252; /* hardwired to this charset */ ho.cstate = charset_init_state; ho.ver = HTML_4; /* *shrug* */ ho.state = HO_NEUTRAL; ho.contents_level = 0; ho.hackflags = HO_HACK_QUOTEQUOTES; /* * Magic DOCTYPE which seems to work for .HHC files. I'm * wary of trying to change it! */ fprintf(ho.fp, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n" "<HTML><HEAD>\n" "<META HTTP-EQUIV=\"Content-Type\" " "CONTENT=\"text/html; charset=%s\">\n" "</HEAD><BODY><UL>\n", charset_to_mimeenc(conf.output_charset)); for (f = files.head; f; f = f->next) { /* * For each HTML file, write out a contents entry. */ int depth, leaf = TRUE; /* * Determine the depth of this file in the contents * tree. * * If the file contains no sections, it is assumed to * have depth zero. */ depth = 0; if (f->first) for (a = f->first->parent; a && a->type != TOP; a = a->parent) depth++; /* * Determine if this file is a leaf file, by * trawling the section list to see if there's any * section with an ancestor in this file but which * is not itself in this file. * * Special case: for contents purposes, the TOP * file is not considered to be the parent of the * chapter files, so it's always a leaf. * * A file with no sections in it is also a leaf. */ if (f->first && f->first->type != TOP) { for (s = f->first; s; s = s->next) { htmlsect *a; if (leaf && s->file != f) { for (a = s; a; a = a->parent) if (a->file == f) { leaf = FALSE; break; } } } } /* * Now write out our contents entry. */ while (currdepth < depth) { fprintf(ho.fp, "<UL>\n"); currdepth++; } while (currdepth > depth) { fprintf(ho.fp, "</UL>\n"); currdepth--; } /* fprintf(ho.fp, "<!-- depth=%d -->", depth); */ fprintf(ho.fp, "<LI><OBJECT TYPE=\"text/sitemap\">" "<PARAM NAME=\"Name\" VALUE=\""); ho.hacklimit = 255; if (f->first->title) html_words(&ho, f->first->title->words, NOTHING, NULL, keywords, &conf); else if (f->first->type == INDEX) html_text(&ho, conf.index_text); fprintf(ho.fp, "\"><PARAM NAME=\"Local\" VALUE=\"%s\">" "<PARAM NAME=\"ImageNumber\" VALUE=\"%d\"></OBJECT>\n", f->filename, leaf ? 11 : 1); } while (currdepth > 0) { fprintf(ho.fp, "</UL>\n"); currdepth--; } fprintf(ho.fp, "</UL></BODY></HTML>\n"); cleanup(&ho); } if (hhk_filename) { htmlfile *f; htmloutput ho; indexentry *entry; int i; /* * First make a pass over all HTML files and set their * `temp' fields to zero, because we're about to use them. */ for (f = files.head; f; f = f->next) f->temp = 0; ho.fp = fopen(hhk_filename, "w"); if (!ho.fp) err_cantopenw(hhk_filename); ho.charset = CS_CP1252; /* as far as I know, HHK files are */ ho.restrict_charset = CS_CP1252; /* hardwired to this charset */ ho.cstate = charset_init_state; ho.ver = HTML_4; /* *shrug* */ ho.state = HO_NEUTRAL; ho.contents_level = 0; ho.hackflags = HO_HACK_QUOTEQUOTES; /* * Magic DOCTYPE which seems to work for .HHK files. I'm * wary of trying to change it! */ fprintf(ho.fp, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n" "<HTML><HEAD>\n" "<META HTTP-EQUIV=\"Content-Type\" " "CONTENT=\"text/html; charset=%s\">\n" "</HEAD><BODY><UL>\n", charset_to_mimeenc(conf.output_charset)); /* * Go through the index terms and output each one. */ for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++) { htmlindex *hi = (htmlindex *)entry->backend_data; int j; if (hi->nrefs > 0) { fprintf(ho.fp, "<LI><OBJECT TYPE=\"text/sitemap\">\n" "<PARAM NAME=\"Name\" VALUE=\""); ho.hacklimit = 255; html_words(&ho, entry->text, NOTHING, NULL, keywords, &conf); fprintf(ho.fp, "\">\n"); for (j = 0; j < hi->nrefs; j++) { htmlindexref *hr = (htmlindexref *)hi->refs[j]->private_data; /* * Use the temp field to ensure we don't * reference the same file more than once. */ if (!hr->section->file->temp) { fprintf(ho.fp, "<PARAM NAME=\"Local\" VALUE=\"%s\">\n", hr->section->file->filename); hr->section->file->temp = 1; } hr->referenced = TRUE; } fprintf(ho.fp, "</OBJECT>\n"); /* * Now go through those files and re-clear the temp * fields ready for the _next_ index term. */ for (j = 0; j < hi->nrefs; j++) { htmlindexref *hr = (htmlindexref *)hi->refs[j]->private_data; hr->section->file->temp = 0; } } } fprintf(ho.fp, "</UL></BODY></HTML>\n"); cleanup(&ho); } /* * Go through and check that no index fragments were referenced * without being generated, or indeed vice versa. * * (When I actually get round to freeing everything, this can * probably be the freeing loop as well.) */ for (p = sourceform; p; p = p->next) { word *w; for (w = p->words; w; w = w->next) if (w->type == word_IndexRef) { htmlindexref *hr = (htmlindexref *)w->private_data; assert(!hr->referenced == !hr->generated); } } /* * Free all the working data. */ { htmlfragment *frag; while ( (frag = (htmlfragment *)delpos234(files.frags, 0)) != NULL ) { /* * frag->fragment is dynamically allocated, but will be * freed when we process the htmlsect structure which * it is attached to. */ sfree(frag); } freetree234(files.frags); } /* * The strings in files.files are all owned by their containing * htmlfile structures, so there's no need to free them here. */ freetree234(files.files); { htmlsect *sect, *tmp; sect = sects.head; while (sect) { int i; tmp = sect->next; for (i=0; i < conf.ntfragments; i++) sfree(sect->fragments[i]); sfree(sect->fragments); sfree(sect); sect = tmp; } sect = nonsects.head; while (sect) { int i; tmp = sect->next; for (i=0; i < conf.ntfragments; i++) sfree(sect->fragments[i]); sfree(sect->fragments); sfree(sect); sect = tmp; } } { htmlfile *file, *tmp; file = files.head; while (file) { tmp = file->next; sfree(file->filename); sfree(file); file = tmp; } } { int i; indexentry *entry; for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++) { htmlindex *hi = (htmlindex *)entry->backend_data; sfree(hi); } } { paragraph *p; word *w; for (p = sourceform; p; p = p->next) for (w = p->words; w; w = w->next) if (w->type == word_IndexRef) { htmlindexref *hr = (htmlindexref *)w->private_data; assert(hr != NULL); sfree(hr->fragment); sfree(hr); } } sfree(conf.asect); sfree(conf.single_filename); sfree(conf.contents_filename); sfree(conf.index_filename); sfree(conf.template_filename); while (conf.ntfragments--) sfree(conf.template_fragments[conf.ntfragments]); sfree(conf.template_fragments); } static void html_file_section(htmlconfig *cfg, htmlfilelist *files, htmlsect *sect, int depth) { htmlfile *file; int ldepth; /* * `depth' is derived from the heading_depth() macro at the top * of this file, which counts title as -1, chapter as 0, * heading as 1 and subsection as 2. However, the semantics of * cfg->leaf_level are defined to count chapter as 1, heading * as 2 etc. So first I increment depth :-( */ ldepth = depth + 1; if (cfg->leaf_level == 0) { /* * leaf_level==0 is a special case, in which everything is * put into a single file. */ if (!files->single) files->single = html_new_file(files, cfg->single_filename); file = files->single; } else { /* * If the depth of this section is at or above leaf_level, * we invent a fresh file and put this section at its head. * Otherwise, we put it in the same file as its parent * section. * * Another special value of cfg->leaf_level is -1, which * means infinity (i.e. it's considered to always be * greater than depth). */ if (cfg->leaf_level > 0 && ldepth > cfg->leaf_level) { /* * We know that sect->parent cannot be NULL. The only * circumstance in which it can be is if sect is at * chapter or appendix level, i.e. ldepth==1; and if * that's the case, then we cannot have entered this * branch unless cfg->leaf_level==0, in which case we * would be in the single-file case above and not here * at all. */ assert(sect->parent); file = sect->parent->file; } else { if (sect->type == TOP) { file = html_new_file(files, cfg->contents_filename); } else if (sect->type == INDEX) { file = html_new_file(files, cfg->index_filename); } else { char *title; assert(ldepth > 0 && sect->title); title = html_format(sect->title, cfg->template_filename); file = html_new_file(files, title); sfree(title); } } } sect->file = file; if (file->min_heading_depth > depth) { /* * This heading is at a higher level than any heading we * have so far placed in this file; so we set the `first' * pointer. */ file->min_heading_depth = depth; file->first = sect; } if (file->min_heading_depth == depth) file->last = sect; } static htmlfile *html_new_file(htmlfilelist *list, char *filename) { htmlfile *ret = snew(htmlfile); ret->next = NULL; if (list->tail) list->tail->next = ret; else list->head = ret; list->tail = ret; ret->filename = html_sanitise_filename(list, dupstr(filename)); add234(list->files, ret->filename); ret->last_fragment_number = 0; ret->min_heading_depth = INT_MAX; ret->first = ret->last = NULL; return ret; } static htmlsect *html_new_sect(htmlsectlist *list, paragraph *title, htmlconfig *cfg) { htmlsect *ret = snew(htmlsect); ret->next = NULL; if (list->tail) list->tail->next = ret; else list->head = ret; list->tail = ret; ret->title = title; ret->file = NULL; ret->parent = NULL; ret->type = NORMAL; ret->fragments = snewn(cfg->ntfragments, char *); { int i; for (i=0; i < cfg->ntfragments; i++) ret->fragments[i] = NULL; } return ret; } static void html_words(htmloutput *ho, word *words, int flags, htmlfile *file, keywordlist *keywords, htmlconfig *cfg) { word *w; char *c, *c2, *p, *q; int style, type; for (w = words; w; w = w->next) switch (w->type) { case word_HyperLink: if (flags & LINKS) { element_open(ho, "a"); c = utoa_dup(w->text, CS_ASCII); c2 = snewn(1 + 10*strlen(c), char); for (p = c, q = c2; *p; p++) { if (*p == '&') q += sprintf(q, "&"); else if (*p == '<') q += sprintf(q, "<"); else if (*p == '>') q += sprintf(q, ">"); else *q++ = *p; } *q = '\0'; element_attr(ho, "href", c2); sfree(c2); sfree(c); } break; case word_UpperXref: case word_LowerXref: if (flags & LINKS) { keyword *kwl = kw_lookup(keywords, w->text); paragraph *p; htmlsect *s; /* kwl should be non-NULL in any sensible case, but if the * input contained an unresolvable xref then it might be * NULL as an after-effect of that */ if (kwl) { p = kwl->para; s = (htmlsect *)p->private_data; assert(s); html_href(ho, file, s->file, s->fragments[0]); } else { /* If kwl is NULL, we must still open an href to * _somewhere_, because it's easier than remembering * which one not to close when we come to the * XrefEnd */ html_href(ho, file, file, NULL); } } break; case word_HyperEnd: case word_XrefEnd: if (flags & LINKS) element_close(ho, "a"); break; case word_IndexRef: if (flags & INDEXENTS) { htmlindexref *hr = (htmlindexref *)w->private_data; html_fragment(ho, hr->fragment); hr->generated = TRUE; } break; case word_Normal: case word_Emph: case word_Strong: case word_Code: case word_WeakCode: case word_WhiteSpace: case word_EmphSpace: case word_StrongSpace: case word_CodeSpace: case word_WkCodeSpace: case word_Quote: case word_EmphQuote: case word_StrongQuote: case word_CodeQuote: case word_WkCodeQuote: style = towordstyle(w->type); type = removeattr(w->type); if (style == word_Emph && (attraux(w->aux) == attr_First || attraux(w->aux) == attr_Only) && (flags & MARKUP)) element_open(ho, "em"); else if (style == word_Strong && (attraux(w->aux) == attr_First || attraux(w->aux) == attr_Only) && (flags & MARKUP)) element_open(ho, "strong"); else if ((style == word_Code || style == word_WeakCode) && (attraux(w->aux) == attr_First || attraux(w->aux) == attr_Only) && (flags & MARKUP)) element_open(ho, "code"); if (type == word_WhiteSpace) html_text(ho, L" "); else if (type == word_Quote) { if (quoteaux(w->aux) == quote_Open) html_text(ho, cfg->lquote); else html_text(ho, cfg->rquote); } else { if (!w->alt || cvt_ok(ho->restrict_charset, w->text)) html_text_nbsp(ho, w->text); else html_words(ho, w->alt, flags, file, keywords, cfg); } if (style == word_Emph && (attraux(w->aux) == attr_Last || attraux(w->aux) == attr_Only) && (flags & MARKUP)) element_close(ho, "em"); else if (style == word_Strong && (attraux(w->aux) == attr_Last || attraux(w->aux) == attr_Only) && (flags & MARKUP)) element_close(ho, "strong"); else if ((style == word_Code || style == word_WeakCode) && (attraux(w->aux) == attr_Last || attraux(w->aux) == attr_Only) && (flags & MARKUP)) element_close(ho, "code"); break; } } static void html_codepara(htmloutput *ho, word *words) { element_open(ho, "pre"); element_open(ho, "code"); for (; words; words = words->next) if (words->type == word_WeakCode) { char *open_tag; wchar_t *t, *e; t = words->text; if (words->next && words->next->type == word_Emph) { e = words->next->text; words = words->next; } else e = NULL; while (e && *e && *t) { int n; int ec = *e; for (n = 0; t[n] && e[n] && e[n] == ec; n++); open_tag = NULL; if (ec == 'i') open_tag = "em"; else if (ec == 'b') open_tag = "b"; if (open_tag) element_open(ho, open_tag); html_text_limit(ho, t, n); if (open_tag) element_close(ho, open_tag); t += n; e += n; } html_text(ho, t); html_nl(ho); } element_close(ho, "code"); element_close(ho, "pre"); } static void html_charset_cleanup(htmloutput *ho) { char outbuf[256]; int bytes; bytes = charset_from_unicode(NULL, NULL, outbuf, lenof(outbuf), ho->charset, &ho->cstate, NULL); if (ho->fp && bytes > 0) fwrite(outbuf, 1, bytes, ho->fp); } static void return_mostly_to_neutral(htmloutput *ho) { if (ho->fp) { if (ho->state == HO_IN_EMPTY_TAG && is_xhtml(ho->ver)) { fprintf(ho->fp, " />"); } else if (ho->state == HO_IN_EMPTY_TAG || ho->state == HO_IN_TAG) { fprintf(ho->fp, ">"); } } ho->state = HO_NEUTRAL; } static void return_to_neutral(htmloutput *ho) { if (ho->state == HO_IN_TEXT) { html_charset_cleanup(ho); } return_mostly_to_neutral(ho); } static void element_open(htmloutput *ho, char const *name) { return_to_neutral(ho); if (ho->fp) fprintf(ho->fp, "<%s", name); ho->state = HO_IN_TAG; } static void element_close(htmloutput *ho, char const *name) { return_to_neutral(ho); if (ho->fp) fprintf(ho->fp, "</%s>", name); ho->state = HO_NEUTRAL; } static void element_empty(htmloutput *ho, char const *name) { return_to_neutral(ho); if (ho->fp) fprintf(ho->fp, "<%s", name); ho->state = HO_IN_EMPTY_TAG; } static void html_nl(htmloutput *ho) { return_to_neutral(ho); if (ho->fp) fputc('\n', ho->fp); } static void html_raw(htmloutput *ho, char *text) { return_to_neutral(ho); if (ho->fp) fputs(text, ho->fp); } static void html_raw_as_attr(htmloutput *ho, char *text) { assert(ho->state == HO_IN_TAG || ho->state == HO_IN_EMPTY_TAG); if (ho->fp) { fputc(' ', ho->fp); fputs(text, ho->fp); } } static void element_attr(htmloutput *ho, char const *name, char const *value) { html_charset_cleanup(ho); assert(ho->state == HO_IN_TAG || ho->state == HO_IN_EMPTY_TAG); if (ho->fp) fprintf(ho->fp, " %s=\"%s\"", name, value); } static void element_attr_w(htmloutput *ho, char const *name, wchar_t const *value) { html_charset_cleanup(ho); if (ho->fp) fprintf(ho->fp, " %s=\"", name); html_text_limit_internal(ho, value, 0, TRUE, FALSE); html_charset_cleanup(ho); if (ho->fp) fputc('"', ho->fp); } static void html_text(htmloutput *ho, wchar_t const *text) { return_mostly_to_neutral(ho); html_text_limit_internal(ho, text, 0, FALSE, FALSE); } static void html_text_nbsp(htmloutput *ho, wchar_t const *text) { return_mostly_to_neutral(ho); html_text_limit_internal(ho, text, 0, FALSE, TRUE); } static void html_text_limit(htmloutput *ho, wchar_t const *text, int maxlen) { return_mostly_to_neutral(ho); html_text_limit_internal(ho, text, maxlen, FALSE, FALSE); } static void html_text_limit_internal(htmloutput *ho, wchar_t const *text, int maxlen, int quote_quotes, int nbsp) { int textlen = ustrlen(text); char outbuf[256]; int bytes, err; if (ho->hackflags & (HO_HACK_QUOTEQUOTES | HO_HACK_OMITQUOTES)) quote_quotes = TRUE; /* override the input value */ if (maxlen > 0 && textlen > maxlen) textlen = maxlen; if (ho->hacklimit >= 0) { if (textlen > ho->hacklimit) textlen = ho->hacklimit; ho->hacklimit -= textlen; } while (textlen > 0) { /* Scan ahead for characters we really can't display in HTML. */ int lenbefore, lenafter; for (lenbefore = 0; lenbefore < textlen; lenbefore++) if (text[lenbefore] == L'<' || text[lenbefore] == L'>' || text[lenbefore] == L'&' || (text[lenbefore] == L'"' && quote_quotes) || (text[lenbefore] == L' ' && nbsp)) break; lenafter = lenbefore; bytes = charset_from_unicode(&text, &lenafter, outbuf, lenof(outbuf), ho->charset, &ho->cstate, &err); textlen -= (lenbefore - lenafter); if (bytes > 0 && ho->fp) fwrite(outbuf, 1, bytes, ho->fp); if (err) { /* * We have encountered a character that cannot be * displayed in the selected output charset. Therefore, * we use an HTML numeric entity reference. */ assert(textlen > 0); if (ho->fp) fprintf(ho->fp, "&#%ld;", (long int)*text); text++, textlen--; } else if (lenafter == 0 && textlen > 0) { /* * We have encountered a character which is special to * HTML. */ if (ho->fp) { if (*text == L'"' && (ho->hackflags & HO_HACK_OMITQUOTES)) { fputc('\'', ho->fp); } else if (ho->hackflags & HO_HACK_QUOTENOTHING) { fputc(*text, ho->fp); } else { if (*text == L'<') fprintf(ho->fp, "<"); else if (*text == L'>') fprintf(ho->fp, ">"); else if (*text == L'&') fprintf(ho->fp, "&"); else if (*text == L'"') fprintf(ho->fp, """); else if (*text == L' ') { assert(nbsp); fprintf(ho->fp, " "); } else assert(!"Can't happen"); } } text++, textlen--; } } } static void cleanup(htmloutput *ho) { return_to_neutral(ho); if (ho->fp && ho->fp != stdout) fclose(ho->fp); } static void html_href(htmloutput *ho, htmlfile *thisfile, htmlfile *targetfile, char *targetfrag) { rdstringc rs = { 0, 0, NULL }; char *url; if (targetfile != thisfile) rdaddsc(&rs, targetfile->filename); if (targetfrag) { rdaddc(&rs, '#'); rdaddsc(&rs, targetfrag); } url = rs.text; element_open(ho, "a"); element_attr(ho, "href", url); sfree(url); } static void html_fragment(htmloutput *ho, char const *fragment) { element_open(ho, "a"); element_attr(ho, "name", fragment); if (is_xhtml(ho->ver)) element_attr(ho, "id", fragment); element_close(ho, "a"); } static char *html_format(paragraph *p, char *template_string) { char *c, *t; word *w; wchar_t *ws, wsbuf[2]; rdstringc rs = { 0, 0, NULL }; t = template_string; while (*t) { if (*t == '%' && t[1]) { int fmt; t++; fmt = *t++; if (fmt == '%') { rdaddc(&rs, fmt); continue; } w = NULL; ws = NULL; if (p->kwtext && fmt == 'n') w = p->kwtext; else if (p->kwtext2 && fmt == 'b') { /* * HTML fragment names must start with a letter, so * simply `1.2.3' is not adequate. In this case I'm * going to cheat slightly by prepending the first * character of the first word of kwtext, so that * we get `C1' for chapter 1, `S2.3' for section * 2.3 etc. */ if (p->kwtext && p->kwtext->text[0]) { ws = wsbuf; wsbuf[1] = '\0'; wsbuf[0] = p->kwtext->text[0]; } w = p->kwtext2; } else if (p->keyword && *p->keyword && fmt == 'k') ws = p->keyword; else /* %N comes here; also failure cases of other fmts */ w = p->words; if (ws) { c = utoa_dup(ws, CS_ASCII); rdaddsc(&rs,c); sfree(c); } while (w) { if (removeattr(w->type) == word_Normal) { c = utoa_dup(w->text, CS_ASCII); rdaddsc(&rs,c); sfree(c); } w = w->next; } } else { rdaddc(&rs, *t++); } } return rdtrimc(&rs); } static char *html_sanitise_fragment(htmlfilelist *files, htmlfile *file, char *text) { /* * The HTML 4 spec's strictest definition of fragment names (<a * name> and "id" attributes) says that they `must begin with a * letter and may be followed by any number of letters, digits, * hyphens, underscores, colons, and periods'. * * So here we unceremoniously rip out any characters not * conforming to this limitation. */ char *p = text, *q = text; while (*p && !((*p>='A' && *p<='Z') || (*p>='a' && *p<='z'))) p++; if ((*q++ = *p++) != '\0') { while (*p) { if ((*p>='A' && *p<='Z') || (*p>='a' && *p<='z') || (*p>='0' && *p<='9') || *p=='-' || *p=='_' || *p==':' || *p=='.') *q++ = *p; p++; } *q = '\0'; } /* If there's nothing left, make something valid up */ if (!*text) { static const char anonfrag[] = "anon"; text = sresize(text, lenof(anonfrag), char); strcpy(text, anonfrag); } /* * Now we check for clashes with other fragment names, and * adjust this one if necessary by appending a hyphen followed * by a number. */ { htmlfragment *frag = snew(htmlfragment); int len = 0; /* >0 indicates we have resized */ int suffix = 1; frag->file = file; frag->fragment = text; while (add234(files->frags, frag) != frag) { if (!len) { len = strlen(text); frag->fragment = text = sresize(text, len+20, char); } sprintf(text + len, "-%d", ++suffix); } } return text; } static char *html_sanitise_filename(htmlfilelist *files, char *text) { /* * Unceremoniously rip out any character that might cause * difficulty in some filesystem or another, or be otherwise * inconvenient. * * That doesn't leave much punctuation. I permit alphanumerics * and +-.=_ only. */ char *p = text, *q = text; while (*p) { if ((*p>='A' && *p<='Z') || (*p>='a' && *p<='z') || (*p>='0' && *p<='9') || *p=='-' || *p=='_' || *p=='+' || *p=='.' || *p=='=') *q++ = *p; p++; } *q = '\0'; /* If there's nothing left, make something valid up */ if (!*text) { static const char anonfrag[] = "anon.html"; text = sresize(text, lenof(anonfrag), char); strcpy(text, anonfrag); } /* * Now we check for clashes with other filenames, and adjust * this one if necessary by appending a hyphen followed by a * number just before the file extension (if any). */ { int len, extpos; int suffix = 1; p = NULL; while (find234(files->files, text, NULL)) { if (!p) { len = strlen(text); p = text; text = snewn(len+20, char); for (extpos = len; extpos > 0 && p[extpos-1] != '.'; extpos--); if (extpos > 0) extpos--; else extpos = len; } sprintf(text, "%.*s-%d%s", extpos, p, ++suffix, p+extpos); } if (p) sfree(p); } return text; } static void html_contents_entry(htmloutput *ho, int depth, htmlsect *s, htmlfile *thisfile, keywordlist *keywords, htmlconfig *cfg) { if (ho->contents_level >= depth && ho->contents_level > 0) { element_close(ho, "li"); html_nl(ho); } while (ho->contents_level > depth) { element_close(ho, "ul"); ho->contents_level--; if (ho->contents_level > 0) { element_close(ho, "li"); } html_nl(ho); } while (ho->contents_level < depth) { html_nl(ho); element_open(ho, "ul"); html_nl(ho); ho->contents_level++; } if (!s) return; element_open(ho, "li"); html_href(ho, thisfile, s->file, s->fragments[0]); html_section_title(ho, s, thisfile, keywords, cfg, FALSE); element_close(ho, "a"); /* <li> will be closed by a later invocation */ } static void html_section_title(htmloutput *ho, htmlsect *s, htmlfile *thisfile, keywordlist *keywords, htmlconfig *cfg, int real) { if (s->title) { sectlevel *sl; word *number; int depth = heading_depth(s->title); if (depth < 0) sl = NULL; else if (depth == 0) sl = &cfg->achapter; else if (depth <= cfg->nasect) sl = &cfg->asect[depth-1]; else sl = &cfg->asect[cfg->nasect-1]; if (!sl || !sl->number_at_all) number = NULL; else if (sl->just_numbers) number = s->title->kwtext2; else number = s->title->kwtext; if (number) { html_words(ho, number, MARKUP, thisfile, keywords, cfg); html_text(ho, sl->number_suffix); } html_words(ho, s->title->words, real ? ALL : MARKUP, thisfile, keywords, cfg); } else { assert(s->type != NORMAL); /* * If we're printing the full document title for _real_ and * there isn't one, we don't want to print `Preamble' at * the top of what ought to just be some text. If we need * it in any other context such as TOCs, we need to print * `Preamble'. */ if (s->type == TOP && !real) html_text(ho, cfg->preamble_text); else if (s->type == INDEX) html_text(ho, cfg->index_text); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/bk_info.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000111216�12444773746�011531� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Info backend for Halibut * * The Info file format isn't well-specified, and what specification * there is is scattered all over the place. Sources include: * (info), from GNU Texinfo. * (texinfo), also from GNU Texinfo. * (Emacs)Misc Help, and (emacs)Info Lookup, from GNU Emacs. * info.el, from GNU Emacs. * * Possible future work: * * - configurable choice of how to allocate node names? * + possibly a template-like approach, choosing node names to * be the full section title or perhaps the internal keyword? * + neither of those seems quite right. Perhaps instead a * Windows Help-like mechanism, where a magic config * directive allows user choice of name for every node. * + Only trouble with that is, now what happens to the section * numbers? Do they become completely vestigial and just sit * in the title text of each node? Or do we keep them in the * menus somehow? I think people might occasionally want to * go to a section by number, if only because all the _other_ * formats of the same document will reference the numbers * all the time. So our menu lines could look like one of * these: * * Nodename: Section 1.2. Title of section. * * Section 1.2: Nodename. Title of section. * * - might be helpful to diagnose duplicate node names! * * - Indices generated by makeinfo use a menu rather than a bunch of * cross-references, which reduces visual clutter rather. For * singly-referenced items, it looks like: * * toner cartridge, replacing: Toner. * It does a horrid job on multiply-referenced entries, though, * perhaps because the name before the colon is meant to be unique. * Info's 'i' command requires the use of a menu -- it fails to * find any index entries at all with Halibut's current index format. * * - The string "*note" is matched case-insensitively, so we could * make things slightly less ugly by using the lower-case version * when the user asks for \k. Unfortunately, standalone Info seems * to match node names case-sensitively, so we can't downcase that. * * - The character encoding used in an Info file can be configured using * an Emacs local variables block at the end, like this: * Local Variables: * coding: iso-8859-1 * End: */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "halibut.h" typedef struct { wchar_t *underline; } alignstruct; typedef struct { char *filename; int maxfilesize; int charset; int listindentbefore, listindentafter; int indent_code, width, index_width; alignstruct atitle, achapter, *asect; int nasect; wchar_t *bullet, *listsuffix; wchar_t *startemph, *endemph; wchar_t *startstrong, *endstrong; wchar_t *lquote, *rquote; wchar_t *sectsuffix; wchar_t *rule; wchar_t *index_text; } infoconfig; typedef struct { rdstringc output; int charset; charset_state state; int wcmode; } info_data; #define EMPTY_INFO_DATA { { 0, 0, NULL }, 0, CHARSET_INIT_STATE, FALSE } static const info_data empty_info_data = EMPTY_INFO_DATA; typedef struct node_tag node; struct node_tag { node *listnext; node *up, *prev, *next, *lastchild; int pos, started_menu, filenum; char *name; info_data text; }; typedef struct { char *text; int length; int nnodes, nodesize; node **nodes; } info_idx; static int info_rdadd(info_data *, wchar_t); static int info_rdadds(info_data *, wchar_t const *); static int info_rdaddc(info_data *, char); static int info_rdaddsc(info_data *, char const *); static void info_heading(info_data *, word *, word *, alignstruct, int, infoconfig *); static void info_rule(info_data *, int, int, infoconfig *); static void info_para(info_data *, word *, wchar_t *, word *, keywordlist *, int, int, int, infoconfig *); static void info_codepara(info_data *, word *, int, int); static void info_versionid(info_data *, word *, infoconfig *); static void info_menu_item(info_data *, node *, paragraph *, infoconfig *); static word *info_transform_wordlist(word *, keywordlist *); static int info_check_index(word *, node *, indexdata *); static int info_rdaddwc(info_data *, word *, word *, int, infoconfig *); static node *info_node_new(char *name, int charset); static char *info_node_name_for_para(paragraph *p, infoconfig *); static char *info_node_name_for_text(wchar_t *text, infoconfig *); static infoconfig info_configure(paragraph *source) { infoconfig ret; paragraph *p; int n; /* * Defaults. */ ret.filename = dupstr("output.info"); ret.maxfilesize = 64 << 10; ret.charset = CS_ASCII; ret.width = 70; ret.listindentbefore = 1; ret.listindentafter = 3; ret.indent_code = 2; ret.index_width = 40; ret.listsuffix = L"."; ret.bullet = L"\x2022\0-\0\0"; ret.rule = L"\x2500\0-\0\0"; ret.startemph = L"_\0_\0\0"; ret.endemph = uadv(ret.startemph); ret.startstrong = L"*\0*\0\0"; ret.endstrong = uadv(ret.startstrong); ret.lquote = L"\x2018\0\x2019\0`\0'\0\0"; ret.rquote = uadv(ret.lquote); ret.sectsuffix = L": "; /* * Default underline characters are chosen to match those recognised by * Info-fontify-node. */ ret.atitle.underline = L"*\0\0"; ret.achapter.underline = L"=\0\0"; ret.nasect = 2; ret.asect = snewn(ret.nasect, alignstruct); ret.asect[0].underline = L"-\0\0"; ret.asect[1].underline = L".\0\0"; ret.index_text = L"Index"; /* * Two-pass configuration so that we can pick up global config * (e.g. `quotes') before having it overridden by specific * config (`info-quotes'), irrespective of the order in which * they occur. */ for (p = source; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } else if (!ustricmp(p->keyword, L"index")) { ret.index_text = uadv(p->keyword); } } } for (p = source; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"info-filename")) { sfree(ret.filename); ret.filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(p->keyword, L"info-charset")) { ret.charset = charset_from_ustr(&p->fpos, uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"info-max-file-size")) { ret.maxfilesize = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"info-width")) { ret.width = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"info-indent-code")) { ret.indent_code = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"info-index-width")) { ret.index_width = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"info-list-indent")) { ret.listindentbefore = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"info-listitem-indent")) { ret.listindentafter = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"info-section-suffix")) { ret.sectsuffix = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"info-underline")) { ret.atitle.underline = ret.achapter.underline = uadv(p->keyword); for (n = 0; n < ret.nasect; n++) ret.asect[n].underline = ret.atitle.underline; } else if (!ustricmp(p->keyword, L"info-chapter-underline")) { ret.achapter.underline = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"info-section-underline")) { wchar_t *q = uadv(p->keyword); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nasect) { int i; ret.asect = sresize(ret.asect, n+1, alignstruct); for (i = ret.nasect; i <= n; i++) ret.asect[i] = ret.asect[ret.nasect-1]; ret.nasect = n+1; } ret.asect[n].underline = q; } else if (!ustricmp(p->keyword, L"text-title-underline")) { ret.atitle.underline = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"info-bullet")) { ret.bullet = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"info-rule")) { ret.rule = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"info-list-suffix")) { ret.listsuffix = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"info-emphasis")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.startemph = uadv(p->keyword); ret.endemph = uadv(ret.startemph); } } else if (!ustricmp(p->keyword, L"info-strong")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.startstrong = uadv(p->keyword); ret.endstrong = uadv(ret.startstrong); } } else if (!ustricmp(p->keyword, L"info-quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } } } /* * Now process fallbacks on quote characters, underlines, the * rule character, the emphasis characters, and bullets. */ while (*uadv(ret.rquote) && *uadv(uadv(ret.rquote)) && (!cvt_ok(ret.charset, ret.lquote) || !cvt_ok(ret.charset, ret.rquote))) { ret.lquote = uadv(ret.rquote); ret.rquote = uadv(ret.lquote); } while (*uadv(ret.endemph) && *uadv(uadv(ret.endemph)) && (!cvt_ok(ret.charset, ret.startemph) || !cvt_ok(ret.charset, ret.endemph))) { ret.startemph = uadv(ret.endemph); ret.endemph = uadv(ret.startemph); } while (*uadv(ret.endstrong) && *uadv(uadv(ret.endstrong)) && (!cvt_ok(ret.charset, ret.startstrong) || !cvt_ok(ret.charset, ret.endstrong))) { ret.startstrong = uadv(ret.endstrong); ret.endstrong = uadv(ret.startstrong); } while (*ret.atitle.underline && *uadv(ret.atitle.underline) && !cvt_ok(ret.charset, ret.atitle.underline)) ret.atitle.underline = uadv(ret.atitle.underline); while (*ret.achapter.underline && *uadv(ret.achapter.underline) && !cvt_ok(ret.charset, ret.achapter.underline)) ret.achapter.underline = uadv(ret.achapter.underline); for (n = 0; n < ret.nasect; n++) { while (*ret.asect[n].underline && *uadv(ret.asect[n].underline) && !cvt_ok(ret.charset, ret.asect[n].underline)) ret.asect[n].underline = uadv(ret.asect[n].underline); } while (*ret.bullet && *uadv(ret.bullet) && !cvt_ok(ret.charset, ret.bullet)) ret.bullet = uadv(ret.bullet); while (*ret.rule && *uadv(ret.rule) && !cvt_ok(ret.charset, ret.rule)) ret.rule = uadv(ret.rule); return ret; } paragraph *info_config_filename(char *filename) { return cmdline_cfg_simple("info-filename", filename, NULL); } void info_backend(paragraph *sourceform, keywordlist *keywords, indexdata *idx, void *unused) { paragraph *p; infoconfig conf; word *prefix, *body, *wp; word spaceword; wchar_t *prefixextra; int nesting, nestindent; int indentb, indenta; int filepos; int has_index = FALSE; info_data intro_text = EMPTY_INFO_DATA; node *topnode, *currnode; word bullet; FILE *fp; IGNORE(unused); conf = info_configure(sourceform); /* * Go through and create a node for each section. */ topnode = info_node_new("Top", conf.charset); currnode = topnode; for (p = sourceform; p; p = p->next) switch (p->type) { /* * Chapter titles. */ case para_Chapter: case para_Appendix: case para_UnnumberedChapter: case para_Heading: case para_Subsect: { node *newnode, *upnode; char *nodename; nodename = info_node_name_for_para(p, &conf); newnode = info_node_new(nodename, conf.charset); sfree(nodename); p->private_data = newnode; if (p->parent) upnode = (node *)p->parent->private_data; else upnode = topnode; assert(upnode); newnode->up = upnode; currnode->next = newnode; newnode->prev = currnode; currnode->listnext = newnode; currnode = newnode; } break; default: p->private_data = NULL; break; } /* * Set up the display form of each index entry. */ { int i; indexentry *entry; for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++) { info_idx *ii = snew(info_idx); info_data id = EMPTY_INFO_DATA; id.charset = conf.charset; ii->nnodes = ii->nodesize = 0; ii->nodes = NULL; ii->length = info_rdaddwc(&id, entry->text, NULL, FALSE, &conf); ii->text = id.output.text; entry->backend_data = ii; } } /* * An Info file begins with a piece of introductory text which * is apparently never shown anywhere. This seems to me to be a * good place to put the copyright notice and the version IDs. * Also, Info directory entries are expected to go here. */ intro_text.charset = conf.charset; info_rdaddsc(&intro_text, "This Info file generated by Halibut, "); info_rdaddsc(&intro_text, version); info_rdaddsc(&intro_text, "\n\n"); for (p = sourceform; p; p = p->next) if (p->type == para_Config && !ustricmp(p->keyword, L"info-dir-entry")) { wchar_t *section, *shortname, *longname, *kw; char *s; section = uadv(p->keyword); shortname = *section ? uadv(section) : L""; longname = *shortname ? uadv(shortname) : L""; kw = *longname ? uadv(longname) : L""; if (!*longname) { err_cfginsufarg(&p->fpos, p->origkeyword, 3); continue; } info_rdaddsc(&intro_text, "INFO-DIR-SECTION "); info_rdadds(&intro_text, section); info_rdaddsc(&intro_text, "\nSTART-INFO-DIR-ENTRY\n* "); info_rdadds(&intro_text, shortname); info_rdaddsc(&intro_text, ": ("); s = dupstr(conf.filename); if (strlen(s) > 5 && !strcmp(s+strlen(s)-5, ".info")) s[strlen(s)-5] = '\0'; info_rdaddsc(&intro_text, s); sfree(s); info_rdaddsc(&intro_text, ")"); if (*kw) { keyword *kwl = kw_lookup(keywords, kw); if (kwl && kwl->para->private_data) { node *n = (node *)kwl->para->private_data; info_rdaddsc(&intro_text, n->name); } } info_rdaddsc(&intro_text, ". "); info_rdadds(&intro_text, longname); info_rdaddsc(&intro_text, "\nEND-INFO-DIR-ENTRY\n\n"); } for (p = sourceform; p; p = p->next) if (p->type == para_Copyright) info_para(&intro_text, NULL, NULL, p->words, keywords, 0, 0, conf.width, &conf); for (p = sourceform; p; p = p->next) if (p->type == para_VersionID) info_versionid(&intro_text, p->words, &conf); if (intro_text.output.text[intro_text.output.pos-1] != '\n') info_rdaddc(&intro_text, '\n'); /* Do the title */ for (p = sourceform; p; p = p->next) if (p->type == para_Title) info_heading(&topnode->text, NULL, p->words, conf.atitle, conf.width, &conf); nestindent = conf.listindentbefore + conf.listindentafter; nesting = 0; currnode = topnode; /* Do the main document */ for (p = sourceform; p; p = p->next) switch (p->type) { case para_QuotePush: nesting += 2; break; case para_QuotePop: nesting -= 2; assert(nesting >= 0); break; case para_LcontPush: nesting += nestindent; break; case para_LcontPop: nesting -= nestindent; assert(nesting >= 0); break; /* * Things we ignore because we've already processed them or * aren't going to touch them in this pass. */ case para_IM: case para_BR: case para_Biblio: /* only touch BiblioCited */ case para_VersionID: case para_NoCite: case para_Title: break; /* * Chapter titles. */ case para_Chapter: case para_Appendix: case para_UnnumberedChapter: case para_Heading: case para_Subsect: currnode = p->private_data; assert(currnode); assert(currnode->up); if (!currnode->up->started_menu) { info_rdaddsc(&currnode->up->text, "* Menu:\n\n"); currnode->up->started_menu = TRUE; } info_menu_item(&currnode->up->text, currnode, p, &conf); has_index |= info_check_index(p->words, currnode, idx); if (p->type == para_Chapter || p->type == para_Appendix || p->type == para_UnnumberedChapter) info_heading(&currnode->text, p->kwtext, p->words, conf.achapter, conf.width, &conf); else info_heading(&currnode->text, p->kwtext, p->words, conf.asect[p->aux>=conf.nasect?conf.nasect-1:p->aux], conf.width, &conf); nesting = 0; break; case para_Rule: info_rule(&currnode->text, nesting, conf.width - nesting, &conf); break; case para_Normal: case para_Copyright: case para_DescribedThing: case para_Description: case para_BiblioCited: case para_Bullet: case para_NumberedList: has_index |= info_check_index(p->words, currnode, idx); if (p->type == para_Bullet) { bullet.next = NULL; bullet.alt = NULL; bullet.type = word_Normal; bullet.text = conf.bullet; prefix = • prefixextra = NULL; indentb = conf.listindentbefore; indenta = conf.listindentafter; } else if (p->type == para_NumberedList) { prefix = p->kwtext; prefixextra = conf.listsuffix; indentb = conf.listindentbefore; indenta = conf.listindentafter; } else if (p->type == para_Description) { prefix = NULL; prefixextra = NULL; indentb = conf.listindentbefore; indenta = conf.listindentafter; } else { prefix = NULL; prefixextra = NULL; indentb = indenta = 0; } if (p->type == para_BiblioCited) { body = dup_word_list(p->kwtext); for (wp = body; wp->next; wp = wp->next); wp->next = &spaceword; spaceword.next = p->words; spaceword.alt = NULL; spaceword.type = word_WhiteSpace; spaceword.text = NULL; } else { wp = NULL; body = p->words; } info_para(&currnode->text, prefix, prefixextra, body, keywords, nesting + indentb, indenta, conf.width - nesting - indentb - indenta, &conf); if (wp) { wp->next = NULL; free_word_list(body); } break; case para_Code: info_codepara(&currnode->text, p->words, nesting + conf.indent_code, conf.width - nesting - 2 * conf.indent_code); break; } /* * Create an index node if required. */ if (has_index) { node *newnode; int i, j, k; indexentry *entry; char *nodename; nodename = info_node_name_for_text(conf.index_text, &conf); newnode = info_node_new(nodename, conf.charset); sfree(nodename); newnode->up = topnode; currnode->next = newnode; newnode->prev = currnode; currnode->listnext = newnode; k = info_rdadds(&newnode->text, conf.index_text); info_rdaddsc(&newnode->text, "\n"); while (k > 0) { info_rdadds(&newnode->text, conf.achapter.underline); k -= ustrwid(conf.achapter.underline, conf.charset); } info_rdaddsc(&newnode->text, "\n\n"); info_menu_item(&topnode->text, newnode, NULL, &conf); for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++) { info_idx *ii = (info_idx *)entry->backend_data; for (j = 0; j < ii->nnodes; j++) { /* * When we have multiple references for a single * index term, we only display the actual term on * the first line, to make it clear that the terms * really are the same. */ if (j == 0) info_rdaddsc(&newnode->text, ii->text); for (k = (j ? 0 : ii->length); k < conf.index_width-2; k++) info_rdaddc(&newnode->text, ' '); info_rdaddsc(&newnode->text, " *Note "); info_rdaddsc(&newnode->text, ii->nodes[j]->name); info_rdaddsc(&newnode->text, "::\n"); } } } /* * Finalise the text of each node, by adding the ^_ delimiter * and the node line at the top. */ for (currnode = topnode; currnode; currnode = currnode->listnext) { char *origtext = currnode->text.output.text; currnode->text = empty_info_data; currnode->text.charset = conf.charset; info_rdaddsc(&currnode->text, "\037\nFile: "); info_rdaddsc(&currnode->text, conf.filename); info_rdaddsc(&currnode->text, ", Node: "); info_rdaddsc(&currnode->text, currnode->name); if (currnode->prev) { info_rdaddsc(&currnode->text, ", Prev: "); info_rdaddsc(&currnode->text, currnode->prev->name); } info_rdaddsc(&currnode->text, ", Up: "); info_rdaddsc(&currnode->text, (currnode->up ? currnode->up->name : "(dir)")); if (currnode->next) { info_rdaddsc(&currnode->text, ", Next: "); info_rdaddsc(&currnode->text, currnode->next->name); } info_rdaddsc(&currnode->text, "\n\n"); info_rdaddsc(&currnode->text, origtext); /* * Just make _absolutely_ sure we end with a newline. */ if (currnode->text.output.text[currnode->text.output.pos-1] != '\n') info_rdaddc(&currnode->text, '\n'); sfree(origtext); } /* * Compute the offsets for the tag table. */ filepos = intro_text.output.pos; for (currnode = topnode; currnode; currnode = currnode->listnext) { currnode->pos = filepos; filepos += currnode->text.output.pos; } /* * Split into sub-files. */ if (conf.maxfilesize > 0) { int currfilesize = intro_text.output.pos, currfilenum = 1; for (currnode = topnode; currnode; currnode = currnode->listnext) { if (currfilesize > intro_text.output.pos && currfilesize + currnode->text.output.pos > conf.maxfilesize) { currfilenum++; currfilesize = intro_text.output.pos; } currnode->filenum = currfilenum; currfilesize += currnode->text.output.pos; } } /* * Write the primary output file. */ fp = fopen(conf.filename, "w"); if (!fp) { err_cantopenw(conf.filename); return; } fputs(intro_text.output.text, fp); if (conf.maxfilesize == 0) { for (currnode = topnode; currnode; currnode = currnode->listnext) fputs(currnode->text.output.text, fp); } else { int filenum = 0; fprintf(fp, "\037\nIndirect:\n"); for (currnode = topnode; currnode; currnode = currnode->listnext) if (filenum != currnode->filenum) { filenum = currnode->filenum; fprintf(fp, "%s-%d: %d\n", conf.filename, filenum, currnode->pos); } } fprintf(fp, "\037\nTag Table:\n"); if (conf.maxfilesize > 0) fprintf(fp, "(Indirect)\n"); for (currnode = topnode; currnode; currnode = currnode->listnext) fprintf(fp, "Node: %s\177%d\n", currnode->name, currnode->pos); fprintf(fp, "\037\nEnd Tag Table\n"); fclose(fp); /* * Write the subfiles. */ if (conf.maxfilesize > 0) { int filenum = 0; fp = NULL; for (currnode = topnode; currnode; currnode = currnode->listnext) { if (filenum != currnode->filenum) { char *fname; filenum = currnode->filenum; if (fp) fclose(fp); fname = snewn(strlen(conf.filename) + 40, char); sprintf(fname, "%s-%d", conf.filename, filenum); fp = fopen(fname, "w"); if (!fp) { err_cantopenw(fname); return; } sfree(fname); fputs(intro_text.output.text, fp); } fputs(currnode->text.output.text, fp); } if (fp) fclose(fp); } } static int info_check_index(word *w, node *n, indexdata *idx) { int ret = 0; for (; w; w = w->next) { if (w->type == word_IndexRef) { indextag *tag; int i; tag = index_findtag(idx, w->text); if (!tag) break; for (i = 0; i < tag->nrefs; i++) { indexentry *entry = tag->refs[i]; info_idx *ii = (info_idx *)entry->backend_data; if (ii->nnodes > 0 && ii->nodes[ii->nnodes-1] == n) { /* * If the same index term is indexed twice * within the same section, we only want to * mention it once in the index. So do nothing * here. */ continue; } if (ii->nnodes >= ii->nodesize) { ii->nodesize += 32; ii->nodes = sresize(ii->nodes, ii->nodesize, node *); } ii->nodes[ii->nnodes++] = n; ret = 1; } } } return ret; } static word *info_transform_wordlist(word *words, keywordlist *keywords) { word *ret = dup_word_list(words); word *w; keyword *kwl; for (w = ret; w; w = w->next) { w->private_data = NULL; if (w->type == word_UpperXref || w->type == word_LowerXref) { kwl = kw_lookup(keywords, w->text); if (kwl) { if (kwl->para->type == para_NumberedList || kwl->para->type == para_BiblioCited) { /* * In Info, we do nothing special for xrefs to * numbered list items or bibliography entries. */ continue; } else { /* * An xref to a different section has its text * completely replaced. */ word *w2, *w3, *w4; w2 = w3 = w->next; w4 = NULL; while (w2) { if (w2->type == word_XrefEnd) { w4 = w2->next; w2->next = NULL; break; } w2 = w2->next; } free_word_list(w3); /* * Now w is the UpperXref / LowerXref we * started with, and w4 is the next word after * the corresponding XrefEnd (if any). The * simplest thing is just to stick a pointer to * the target node structure in the private * data field of the xref word, and let * info_rdaddwc and friends read the node name * out from there. */ w->next = w4; w->private_data = kwl->para->private_data; assert(w->private_data); } } } } return ret; } static int info_rdaddwc(info_data *id, word *words, word *end, int xrefs, infoconfig *cfg) { int ret = 0; for (; words && words != end; words = words->next) switch (words->type) { case word_HyperLink: case word_HyperEnd: case word_XrefEnd: case word_IndexRef: break; case word_Normal: case word_Emph: case word_Strong: case word_Code: case word_WeakCode: case word_WhiteSpace: case word_EmphSpace: case word_StrongSpace: case word_CodeSpace: case word_WkCodeSpace: case word_Quote: case word_EmphQuote: case word_StrongQuote: case word_CodeQuote: case word_WkCodeQuote: assert(words->type != word_CodeQuote && words->type != word_WkCodeQuote); if (towordstyle(words->type) == word_Emph && (attraux(words->aux) == attr_First || attraux(words->aux) == attr_Only)) ret += info_rdadds(id, cfg->startemph); else if (towordstyle(words->type) == word_Strong && (attraux(words->aux) == attr_First || attraux(words->aux) == attr_Only)) ret += info_rdadds(id, cfg->startstrong); else if (towordstyle(words->type) == word_Code && (attraux(words->aux) == attr_First || attraux(words->aux) == attr_Only)) ret += info_rdadds(id, cfg->lquote); if (removeattr(words->type) == word_Normal) { if (cvt_ok(id->charset, words->text) || !words->alt) ret += info_rdadds(id, words->text); else ret += info_rdaddwc(id, words->alt, NULL, FALSE, cfg); } else if (removeattr(words->type) == word_WhiteSpace) { ret += info_rdadd(id, L' '); } else if (removeattr(words->type) == word_Quote) { ret += info_rdadds(id, quoteaux(words->aux) == quote_Open ? cfg->lquote : cfg->rquote); } if (towordstyle(words->type) == word_Emph && (attraux(words->aux) == attr_Last || attraux(words->aux) == attr_Only)) ret += info_rdadds(id, cfg->endemph); else if (towordstyle(words->type) == word_Strong && (attraux(words->aux) == attr_Last || attraux(words->aux) == attr_Only)) ret += info_rdadds(id, cfg->endstrong); else if (towordstyle(words->type) == word_Code && (attraux(words->aux) == attr_Last || attraux(words->aux) == attr_Only)) ret += info_rdadds(id, cfg->rquote); break; case word_UpperXref: case word_LowerXref: if (xrefs && words->private_data) { /* * This bit is structural and so must be done in char * rather than wchar_t. */ ret += info_rdaddsc(id, "*Note "); ret += info_rdaddsc(id, ((node *)words->private_data)->name); ret += info_rdaddsc(id, "::"); } break; } return ret; } static int info_width_internal(word *words, int xrefs, infoconfig *cfg); static int info_width_internal_list(word *words, int xrefs, infoconfig *cfg) { int w = 0; while (words) { w += info_width_internal(words, xrefs, cfg); words = words->next; } return w; } static int info_width_internal(word *words, int xrefs, infoconfig *cfg) { int wid; int attr; switch (words->type) { case word_HyperLink: case word_HyperEnd: case word_XrefEnd: case word_IndexRef: return 0; case word_UpperXref: case word_LowerXref: if (xrefs && words->private_data) { /* "*Note " plus "::" comes to 8 characters */ return 8 + strwid(((node *)words->private_data)->name, cfg->charset); } else return 0; } assert(words->type < word_internal_endattrs); wid = 0; attr = towordstyle(words->type); if (attr == word_Emph || attr == word_Strong || attr == word_Code) { if (attraux(words->aux) == attr_Only || attraux(words->aux) == attr_First) wid += ustrwid(attr == word_Emph ? cfg->startemph : attr == word_Strong ? cfg->startstrong : cfg->lquote, cfg->charset); } if (attr == word_Emph || attr == word_Strong || attr == word_Code) { if (attraux(words->aux) == attr_Only || attraux(words->aux) == attr_Last) wid += ustrwid(attr == word_Emph ? cfg->startemph : attr == word_Strong ? cfg->startstrong : cfg->lquote, cfg->charset); } switch (words->type) { case word_Normal: case word_Emph: case word_Strong: case word_Code: case word_WeakCode: if (cvt_ok(cfg->charset, words->text) || !words->alt) wid += ustrwid(words->text, cfg->charset); else wid += info_width_internal_list(words->alt, xrefs, cfg); return wid; case word_WhiteSpace: case word_EmphSpace: case word_StrongSpace: case word_CodeSpace: case word_WkCodeSpace: case word_Quote: case word_EmphQuote: case word_StrongQuote: case word_CodeQuote: case word_WkCodeQuote: assert(words->type != word_CodeQuote && words->type != word_WkCodeQuote); if (removeattr(words->type) == word_Quote) { if (quoteaux(words->aux) == quote_Open) wid += ustrwid(cfg->lquote, cfg->charset); else wid += ustrwid(cfg->rquote, cfg->charset); } else wid++; /* space */ } return wid; } static int info_width_noxrefs(void *ctx, word *words) { return info_width_internal(words, FALSE, (infoconfig *)ctx); } static int info_width_xrefs(void *ctx, word *words) { return info_width_internal(words, TRUE, (infoconfig *)ctx); } static void info_heading(info_data *text, word *tprefix, word *words, alignstruct align, int width, infoconfig *cfg) { int length; int firstlinewidth, wrapwidth; wrappedline *wrapping, *p; length = 0; if (tprefix) { length += info_rdaddwc(text, tprefix, NULL, FALSE, cfg); length += info_rdadds(text, cfg->sectsuffix); } wrapwidth = width; firstlinewidth = width - length; wrapping = wrap_para(words, firstlinewidth, wrapwidth, info_width_noxrefs, cfg, 0); for (p = wrapping; p; p = p->next) { length += info_rdaddwc(text, p->begin, p->end, FALSE, cfg); info_rdadd(text, L'\n'); if (*align.underline) { while (length > 0) { info_rdadds(text, align.underline); length -= ustrwid(align.underline, cfg->charset); } info_rdadd(text, L'\n'); } length = 0; } wrap_free(wrapping); info_rdadd(text, L'\n'); } static void info_rule(info_data *text, int indent, int width, infoconfig *cfg) { while (indent--) info_rdadd(text, L' '); while (width > 0) { info_rdadds(text, cfg->rule); width -= ustrwid(cfg->rule, cfg->charset); } info_rdadd(text, L'\n'); info_rdadd(text, L'\n'); } static void info_para(info_data *text, word *prefix, wchar_t *prefixextra, word *input, keywordlist *keywords, int indent, int extraindent, int width, infoconfig *cfg) { wrappedline *wrapping, *p; word *words; int e; int i; int firstlinewidth = width; words = info_transform_wordlist(input, keywords); if (prefix) { for (i = 0; i < indent; i++) info_rdadd(text, L' '); e = info_rdaddwc(text, prefix, NULL, FALSE, cfg); if (prefixextra) e += info_rdadds(text, prefixextra); /* If the prefix is too long, shorten the first line to fit. */ e = extraindent - e; if (e < 0) { firstlinewidth += e; /* this decreases it, since e < 0 */ if (firstlinewidth < 0) { e = indent + extraindent; firstlinewidth = width; info_rdadd(text, L'\n'); } else e = 0; } } else e = indent + extraindent; wrapping = wrap_para(words, firstlinewidth, width, info_width_xrefs, cfg, 0); for (p = wrapping; p; p = p->next) { for (i = 0; i < e; i++) info_rdadd(text, L' '); info_rdaddwc(text, p->begin, p->end, TRUE, cfg); info_rdadd(text, L'\n'); e = indent + extraindent; } wrap_free(wrapping); info_rdadd(text, L'\n'); free_word_list(words); } static void info_codepara(info_data *text, word *words, int indent, int width) { int i; for (; words; words = words->next) if (words->type == word_WeakCode) { for (i = 0; i < indent; i++) info_rdadd(text, L' '); if (info_rdadds(text, words->text) > width) { /* FIXME: warn */ } info_rdadd(text, L'\n'); } info_rdadd(text, L'\n'); } static void info_versionid(info_data *text, word *words, infoconfig *cfg) { info_rdadd(text, L'['); info_rdaddwc(text, words, NULL, FALSE, cfg); info_rdadds(text, L"]\n"); } static node *info_node_new(char *name, int charset) { node *n; n = snew(node); n->text = empty_info_data; n->text.charset = charset; n->up = n->next = n->prev = n->lastchild = n->listnext = NULL; n->name = dupstr(name); n->started_menu = FALSE; return n; } static char *info_node_name_core(info_data *id, filepos *fpos) { char *p, *q; /* * We cannot have commas, colons or parentheses in a node name. * Remove any that we find, with a warning. */ p = q = id->output.text; while (*p) { if (*p == ':' || *p == ',' || *p == '(' || *p == ')') { err_infonodechar(fpos, *p); } else { *q++ = *p; } p++; } *q = '\0'; return id->output.text; } static char *info_node_name_for_para(paragraph *par, infoconfig *cfg) { info_data id = EMPTY_INFO_DATA; id.charset = cfg->charset; info_rdaddwc(&id, par->kwtext ? par->kwtext : par->words, NULL, FALSE, cfg); info_rdaddsc(&id, NULL); return info_node_name_core(&id, &par->fpos); } static char *info_node_name_for_text(wchar_t *text, infoconfig *cfg) { info_data id = EMPTY_INFO_DATA; id.charset = cfg->charset; info_rdadds(&id, text); info_rdaddsc(&id, NULL); return info_node_name_core(&id, NULL); } static void info_menu_item(info_data *text, node *n, paragraph *p, infoconfig *cfg) { /* * FIXME: Depending on how we're doing node names in this info * file, we might want to do * * * Node name:: Chapter title * * _or_ * * * Chapter number: Node name. * * This function mostly works in char rather than wchar_t, * because a menu item is a structural component. */ info_rdaddsc(text, "* "); info_rdaddsc(text, n->name); info_rdaddsc(text, "::"); if (p) { info_rdaddc(text, ' '); info_rdaddwc(text, p->words, NULL, FALSE, cfg); } info_rdaddc(text, '\n'); } /* * These functions implement my wrapper on the rdadd* calls which * allows me to switch arbitrarily between literal octet-string * text and charset-translated Unicode. (Because no matter what * character set I write the actual text in, I expect info readers * to treat node names and file names literally and to expect * keywords like `*Note' in their canonical form, so I have to take * steps to ensure that those structural elements of the file * aren't messed with.) */ static int info_rdadds(info_data *d, wchar_t const *wcs) { if (!d->wcmode) { d->state = charset_init_state; d->wcmode = TRUE; } if (wcs) { char buf[256]; int len, width, ret; width = ustrwid(wcs, d->charset); len = ustrlen(wcs); while (len > 0) { int prevlen = len; ret = charset_from_unicode(&wcs, &len, buf, lenof(buf), d->charset, &d->state, NULL); assert(len < prevlen); if (ret > 0) { buf[ret] = '\0'; rdaddsc(&d->output, buf); } } return width; } else return 0; } static int info_rdaddsc(info_data *d, char const *cs) { if (d->wcmode) { char buf[256]; int ret; ret = charset_from_unicode(NULL, 0, buf, lenof(buf), d->charset, &d->state, NULL); if (ret > 0) { buf[ret] = '\0'; rdaddsc(&d->output, buf); } d->wcmode = FALSE; } if (cs) { rdaddsc(&d->output, cs); return strwid(cs, d->charset); } else return 0; } static int info_rdadd(info_data *d, wchar_t wc) { wchar_t wcs[2]; wcs[0] = wc; wcs[1] = L'\0'; return info_rdadds(d, wcs); } static int info_rdaddc(info_data *d, char c) { char cs[2]; cs[0] = c; cs[1] = '\0'; return info_rdaddsc(d, cs); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/bk_man.c��������������������������������������������������������������������������������0000644�0001753�0001753�00000047160�12444773746�011357� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * man page backend for Halibut */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "halibut.h" typedef struct { wchar_t *th; int headnumbers; int mindepth; char *filename; int charset; wchar_t *bullet, *rule, *lquote, *rquote; } manconfig; static void man_text(FILE *, word *, int newline, int quote_props, manconfig *conf); static void man_codepara(FILE *, word *, int charset); static int man_convert(wchar_t const *s, int maxlen, char **result, int quote_props, int charset, charset_state *state); /* * My TROFF reference is "NROFF/TROFF User's Manual", Joseph * F. Ossana, October 11 1976. * * not yet used: * \(ru rule * \(pl math plus * \(mi math minus * \(eq math equals * \(ga grave accent * \(ul underrule * \(sl slash (matching bakslash) * \(br box vertical rule * \(br Bell System logo * \(or or * all characters for constructing large brackets */ static struct { unsigned short uni; char const *troff; } const man_charmap[] = { {0x00A2, "\\(ct"}, {0x00A7, "\\(sc"}, {0x00A9, "\\(co"}, {0x00AC, "\\(no"}, {0x00AE, "\\(rg"}, {0x00B0, "\\(de"}, {0x00B1, "\\(+-"}, {0x00B4, "\\(aa"}, {0x00BC, "\\(14"}, {0x00BD, "\\(12"}, {0x00BE, "\\(34"}, {0x00D7, "\\(mu"}, {0x00F7, "\\(di"}, {0x0391, "\\(*A"}, {0x0392, "\\(*B"}, {0x0393, "\\(*G"}, {0x0394, "\\(*D"}, {0x0395, "\\(*E"}, {0x0396, "\\(*Z"}, {0x0397, "\\(*Y"}, {0x0398, "\\(*H"}, {0x0399, "\\(*I"}, {0x039A, "\\(*K"}, {0x039B, "\\(*L"}, {0x039C, "\\(*M"}, {0x039D, "\\(*N"}, {0x039E, "\\(*C"}, {0x039F, "\\(*O"}, {0x03A0, "\\(*P"}, {0x03A1, "\\(*R"}, {0x03A3, "\\(*S"}, {0x03A4, "\\(*T"}, {0x03A5, "\\(*U"}, {0x03A6, "\\(*F"}, {0x03A7, "\\(*X"}, {0x03A8, "\\(*Q"}, {0x03A9, "\\(*W"}, {0x03B1, "\\(*a"}, {0x03B2, "\\(*b"}, {0x03B3, "\\(*g"}, {0x03B4, "\\(*d"}, {0x03B5, "\\(*e"}, {0x03B6, "\\(*z"}, {0x03B7, "\\(*y"}, {0x03B8, "\\(*h"}, {0x03B9, "\\(*i"}, {0x03BA, "\\(*k"}, {0x03BB, "\\(*l"}, {0x03BC, "\\(*m"}, {0x03BD, "\\(*n"}, {0x03BE, "\\(*c"}, {0x03BF, "\\(*o"}, {0x03C0, "\\(*p"}, {0x03C1, "\\(*r"}, {0x03C2, "\\(ts"}, {0x03C3, "\\(*s"}, {0x03C4, "\\(*t"}, {0x03C5, "\\(*u"}, {0x03C6, "\\(*f"}, {0x03C7, "\\(*x"}, {0x03C8, "\\(*q"}, {0x03C9, "\\(*w"}, {0x2014, "\\(em"}, {0x2018, "`"}, {0x2019, "'"}, {0x2020, "\\(dg"}, {0x2021, "\\(dd"}, {0x2022, "\\(bu"}, {0x2032, "\\(fm"}, {0x2190, "\\(<-"}, {0x2191, "\\(ua"}, {0x2192, "\\(->"}, {0x2193, "\\(da"}, {0x2202, "\\(pd"}, {0x2205, "\\(es"}, {0x2207, "\\(gr"}, {0x2208, "\\(mo"}, {0x2212, "\\-"}, {0x2217, "\\(**"}, {0x221A, "\\(sr"}, {0x221D, "\\(pt"}, {0x221E, "\\(if"}, {0x2229, "\\(ca"}, {0x222A, "\\(cu"}, {0x222B, "\\(is"}, {0x223C, "\\(ap"}, {0x2245, "\\(~="}, {0x2260, "\\(!="}, {0x2261, "\\(=="}, {0x2264, "\\(<="}, {0x2265, "\\(>="}, {0x2282, "\\(sb"}, {0x2283, "\\(sp"}, {0x2286, "\\(ib"}, {0x2287, "\\(ip"}, {0x25A1, "\\(sq"}, {0x25CB, "\\(ci"}, {0x261C, "\\(lh"}, {0x261E, "\\(rh"}, }; static char const *troffchar(int unichar) { int i, j, k; i = -1; j = lenof(man_charmap); while (j-i > 1) { k = (i + j) / 2; if (man_charmap[k].uni == unichar) return man_charmap[k].troff; else if (man_charmap[k].uni > unichar) j = k; else i = k; } return NULL; } /* * Return TRUE if we can represent the whole of the given string either * in the output charset or as named characters; FALSE otherwise. */ static int troff_ok(int charset, wchar_t *string) { wchar_t test[2]; while (*string) { test[0] = *string; test[1] = 0; if (!cvt_ok(charset, test) && !troffchar(*string)) return FALSE; string++; } return TRUE; } static manconfig man_configure(paragraph *source) { paragraph *p; manconfig ret; /* * Defaults. */ ret.th = NULL; ret.headnumbers = FALSE; ret.mindepth = 0; ret.filename = dupstr("output.1"); ret.charset = CS_ASCII; ret.bullet = L"\x2022\0o\0\0"; ret.rule = L"\x2500\0-\0\0"; ret.lquote = L"\x2018\0\x2019\0\"\0\"\0\0"; ret.rquote = uadv(ret.lquote); /* * Two-pass configuration so that we can pick up global config * (e.g. `quotes') before having it overridden by specific * config (`man-quotes'), irrespective of the order in which * they occur. */ for (p = source; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } } } for (p = source; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"man-identity")) { wchar_t *wp, *ep; wp = uadv(p->keyword); ep = wp; while (*ep) ep = uadv(ep); sfree(ret.th); ret.th = snewn(ep - wp + 1, wchar_t); memcpy(ret.th, wp, (ep - wp + 1) * sizeof(wchar_t)); } else if (!ustricmp(p->keyword, L"man-charset")) { ret.charset = charset_from_ustr(&p->fpos, uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"man-headnumbers")) { ret.headnumbers = utob(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"man-mindepth")) { ret.mindepth = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"man-filename")) { sfree(ret.filename); ret.filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(p->keyword, L"man-bullet")) { ret.bullet = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"man-rule")) { ret.rule = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"man-quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } } } /* * Now process fallbacks on quote characters, bullets, and the * rule character. */ while (*uadv(ret.rquote) && *uadv(uadv(ret.rquote)) && (!troff_ok(ret.charset, ret.lquote) || !troff_ok(ret.charset, ret.rquote))) { ret.lquote = uadv(ret.rquote); ret.rquote = uadv(ret.lquote); } while (*ret.bullet && *uadv(ret.bullet) && !troff_ok(ret.charset, ret.bullet)) ret.bullet = uadv(ret.bullet); while (*ret.rule && *uadv(ret.rule) && !troff_ok(ret.charset, ret.rule)) ret.rule = uadv(ret.rule); return ret; } static void man_conf_cleanup(manconfig cf) { sfree(cf.th); sfree(cf.filename); } paragraph *man_config_filename(char *filename) { return cmdline_cfg_simple("man-filename", filename, NULL); } #define QUOTE_INITCTRL 1 /* quote initial . and ' on a line */ #define QUOTE_QUOTES 2 /* quote double quotes by doubling them */ #define QUOTE_LITERAL 4 /* defeat special meaning of `, ', - in troff */ void man_backend(paragraph *sourceform, keywordlist *keywords, indexdata *idx, void *unused) { paragraph *p; FILE *fp; manconfig conf; int had_described_thing; IGNORE(unused); IGNORE(keywords); IGNORE(idx); conf = man_configure(sourceform); /* * Open the output file. */ if (!strcmp(conf.filename, "-")) fp = stdout; else fp = fopen(conf.filename, "w"); if (!fp) { err_cantopenw(conf.filename); return; } /* Do the version ID */ for (p = sourceform; p; p = p->next) if (p->type == para_VersionID) { fprintf(fp, ".\\\" "); man_text(fp, p->words, TRUE, 0, &conf); } /* Standard preamble */ /* Dodge to try to get literal U+0027 in output when required, * bypassing groff's Unicode transform; pinched from pod2man */ fprintf(fp, ".ie \\n(.g .ds Aq \\(aq\n" ".el .ds Aq '\n"); /* .TH name-of-program manual-section */ fprintf(fp, ".TH"); if (conf.th && *conf.th) { char *c; wchar_t *wp; for (wp = conf.th; *wp; wp = uadv(wp)) { fputs(" \"", fp); man_convert(wp, 0, &c, QUOTE_QUOTES, conf.charset, NULL); fputs(c, fp); sfree(c); fputc('"', fp); } } fputc('\n', fp); had_described_thing = FALSE; #define cleanup_described_thing do { \ if (had_described_thing) \ fprintf(fp, "\n"); \ had_described_thing = FALSE; \ } while (0) for (p = sourceform; p; p = p->next) switch (p->type) { /* * Things we ignore because we've already processed them or * aren't going to touch them in this pass. */ case para_IM: case para_BR: case para_Biblio: /* only touch BiblioCited */ case para_VersionID: case para_NoCite: case para_Title: break; /* * Headings. */ case para_Chapter: case para_Appendix: case para_UnnumberedChapter: case para_Heading: case para_Subsect: cleanup_described_thing; { int depth; if (p->type == para_Subsect) depth = p->aux + 1; else if (p->type == para_Heading) depth = 1; else depth = 0; if (depth >= conf.mindepth) { if (depth > conf.mindepth) fprintf(fp, ".SS \""); else fprintf(fp, ".SH \""); if (conf.headnumbers && p->kwtext) { man_text(fp, p->kwtext, FALSE, QUOTE_QUOTES, &conf); fprintf(fp, " "); } man_text(fp, p->words, FALSE, QUOTE_QUOTES, &conf); fprintf(fp, "\"\n"); } break; } /* * Code paragraphs. */ case para_Code: cleanup_described_thing; fprintf(fp, ".PP\n"); man_codepara(fp, p->words, conf.charset); break; /* * Normal paragraphs. */ case para_Normal: case para_Copyright: cleanup_described_thing; fprintf(fp, ".PP\n"); man_text(fp, p->words, TRUE, 0, &conf); break; /* * List paragraphs. */ case para_Description: case para_BiblioCited: case para_Bullet: case para_NumberedList: if (p->type != para_Description) cleanup_described_thing; if (p->type == para_Bullet) { char *bullettext; man_convert(conf.bullet, -1, &bullettext, QUOTE_QUOTES, conf.charset, NULL); fprintf(fp, ".IP \"\\fB%s\\fP\"\n", bullettext); sfree(bullettext); } else if (p->type == para_NumberedList) { fprintf(fp, ".IP \""); man_text(fp, p->kwtext, FALSE, QUOTE_QUOTES, &conf); fprintf(fp, "\"\n"); } else if (p->type == para_Description) { if (had_described_thing) { /* * Do nothing; the .xP for this paragraph is the * .IP which has come before it in the * DescribedThing. */ } else { /* * A \dd without a preceding \dt is given a blank * one. */ fprintf(fp, ".IP \"\"\n"); } } else if (p->type == para_BiblioCited) { fprintf(fp, ".IP \""); man_text(fp, p->kwtext, FALSE, QUOTE_QUOTES, &conf); fprintf(fp, "\"\n"); } man_text(fp, p->words, TRUE, 0, &conf); had_described_thing = FALSE; break; case para_DescribedThing: cleanup_described_thing; fprintf(fp, ".IP \""); man_text(fp, p->words, FALSE, QUOTE_QUOTES, &conf); fprintf(fp, "\"\n"); had_described_thing = TRUE; break; case para_Rule: { char *ruletext; /* * New paragraph containing a horizontal line 1/2em above * the baseline, or a line of rule characters, whose * length is the line length minus the current indent. */ cleanup_described_thing; man_convert(conf.rule, -1, &ruletext, 0, conf.charset, NULL); fprintf(fp, ".PP\n.ie t \\u\\l'\\n(.lu-\\n(.iu'\\d\n" ".el \\l'\\n(.lu-\\n(.iu\\&%s'\n", ruletext); sfree(ruletext); } break; case para_LcontPush: case para_QuotePush: cleanup_described_thing; fprintf(fp, ".RS\n"); break; case para_LcontPop: case para_QuotePop: cleanup_described_thing; fprintf(fp, ".RE\n"); break; } cleanup_described_thing; /* * Tidy up. */ if (fp != stdout) fclose(fp); man_conf_cleanup(conf); } /* * Convert a wide string into a string of chars; mallocs the * resulting string and stores a pointer to it in `*result'. * * If `state' is non-NULL, updates the charset state pointed to. If * `state' is NULL, this function uses its own state, initialises * it from scratch, and cleans it up when finished. If `state' is * non-NULL but _s_ is NULL, cleans up a provided state. * * Return is nonzero if all characters are OK. If not all * characters are OK but `result' is non-NULL, a result _will_ * still be generated! * * This function also does escaping of groff special characters. */ static int man_convert(wchar_t const *s, int maxlen, char **result, int quote_props, int charset, charset_state *state) { charset_state internal_state = CHARSET_INIT_STATE; int slen, err; char *p = NULL, *q; int plen = 0, psize = 0; rdstringc out = {0, 0, NULL}; int anyerr = 0; if (!state) state = &internal_state; slen = (s ? ustrlen(s) : 0); if (slen > maxlen && maxlen > 0) slen = maxlen; psize = 384; plen = 0; p = snewn(psize, char); err = 0; while (slen > 0) { int ret = charset_from_unicode(&s, &slen, p, psize, charset, state, &err); plen = ret; for (q = p; q < p+plen; q++) { if (q == p && (*q == '.' || *q == '\'') && (quote_props & QUOTE_INITCTRL)) { /* * Control character (. or ') at the start of a * line. Quote it by putting \& (troff zero-width * space) before it. */ rdaddc(&out, '\\'); rdaddc(&out, '&'); } if (*q == '`' || *q == ' ') { /* Quote backticks and nonbreakable spaces always. */ rdaddc(&out, '\\'); } else if (*q == '\\') { /* Turn backslashes into \e. */ rdaddsc(&out, "\\e"); continue; } else if (*q == '-') { if (quote_props & QUOTE_LITERAL) { /* * Try to preserve literal U+002D. * This is quite awkward. Debian hacks groff so that * \- and - both produce it; elsewhere it's not necessarily * possible to get it. * Apparently \- is the preferred compromise despite * having minus-sign semantics, as it is non-breaking. * (pod2man uses it, anyway.) */ rdaddc(&out, '\\'); } else { /* Turn nonbreakable hyphens into \(hy. */ rdaddsc(&out, "\\(hy"); continue; } } else if (*q == '\'' && (quote_props & QUOTE_LITERAL)) { /* Try to preserve literal U+0027 (using string defined * in preamble) */ rdaddsc(&out, "\\*(Aq"); /* "apostrophe quote" */ continue; } else if (*q == '"' && (quote_props & QUOTE_QUOTES)) { /* * Double quote within double quotes. Quote it by * doubling. */ rdaddc(&out, '"'); } rdaddc(&out, *q); } if (err) { char const *tr = troffchar(*s); if (tr == NULL) anyerr = TRUE; else rdaddsc(&out, tr); s++; slen--; } /* Past start of string -- no more quoting needed */ quote_props &= ~QUOTE_INITCTRL; } if (state == &internal_state || s == NULL) { int ret = charset_from_unicode(NULL, 0, p+plen, psize-plen, charset, state, NULL); if (ret > 0) plen += ret; } sfree(p); if (out.text) *result = rdtrimc(&out); else *result = dupstr(""); return !anyerr; } static int man_rdaddwc_reset(rdstringc *rs, int quote_props, manconfig *conf, charset_state *state) { char *c; man_convert(NULL, 0, &c, quote_props, conf->charset, state); rdaddsc(rs, c); if (*c) quote_props &= ~QUOTE_INITCTRL; /* not at start any more */ sfree(c); *state = charset_init_state; return quote_props; } static int man_rdaddctrl(rdstringc *rs, char *c, int quote_props, manconfig *conf, charset_state *state) { quote_props = man_rdaddwc_reset(rs, quote_props, conf, state); rdaddsc(rs, c); return quote_props; } static int man_rdaddwc(rdstringc *rs, word *text, word *end, int quote_props, manconfig *conf, charset_state *state) { char *c; for (; text && text != end; text = text->next) switch (text->type) { case word_HyperLink: case word_HyperEnd: case word_UpperXref: case word_LowerXref: case word_XrefEnd: case word_IndexRef: break; case word_Normal: case word_Emph: case word_Strong: case word_Code: case word_WeakCode: case word_WhiteSpace: case word_EmphSpace: case word_StrongSpace: case word_CodeSpace: case word_WkCodeSpace: case word_Quote: case word_EmphQuote: case word_StrongQuote: case word_CodeQuote: case word_WkCodeQuote: assert(text->type != word_CodeQuote && text->type != word_WkCodeQuote); if (towordstyle(text->type) == word_Emph && (attraux(text->aux) == attr_First || attraux(text->aux) == attr_Only)) { quote_props = man_rdaddctrl(rs, "\\fI", quote_props, conf, state); } else if (towordstyle(text->type) == word_Strong && (attraux(text->aux) == attr_First || attraux(text->aux) == attr_Only)) { quote_props = man_rdaddctrl(rs, "\\fB", quote_props, conf, state); } else if ((towordstyle(text->type) == word_Code || towordstyle(text->type) == word_WeakCode) && (attraux(text->aux) == attr_First || attraux(text->aux) == attr_Only)) { quote_props = man_rdaddctrl(rs, "\\fB", quote_props, conf, state); } if (towordstyle(text->type) == word_Code || towordstyle(text->type) == word_WeakCode) quote_props |= QUOTE_LITERAL; if (removeattr(text->type) == word_Normal) { charset_state s2 = *state; int len = ustrlen(text->text), hyphen = FALSE; if (text->breaks && text->text[len - 1] == '-') { len--; hyphen = TRUE; } if (len == 0 || man_convert(text->text, len, &c, quote_props, conf->charset, &s2) || !text->alt) { if (len != 0) { rdaddsc(rs, c); if (*c) quote_props &= ~QUOTE_INITCTRL; /* not at start any more */ *state = s2; } if (hyphen) { quote_props = man_rdaddctrl(rs, "-", quote_props, conf, state); quote_props &= ~QUOTE_INITCTRL; } } else { quote_props = man_rdaddwc(rs, text->alt, NULL, quote_props, conf, state); } if (len != 0) sfree(c); } else if (removeattr(text->type) == word_WhiteSpace) { quote_props = man_rdaddctrl(rs, " ", quote_props, conf, state); quote_props &= ~QUOTE_INITCTRL; } else if (removeattr(text->type) == word_Quote) { man_convert(quoteaux(text->aux) == quote_Open ? conf->lquote : conf->rquote, 0, &c, quote_props, conf->charset, state); rdaddsc(rs, c); if (*c) quote_props &= ~QUOTE_INITCTRL; /* not at start any more */ sfree(c); } if (towordstyle(text->type) != word_Normal && (attraux(text->aux) == attr_Last || attraux(text->aux) == attr_Only)) { quote_props = man_rdaddctrl(rs, "\\fP", quote_props, conf, state); } break; } quote_props = man_rdaddwc_reset(rs, quote_props, conf, state); return quote_props; } static void man_text(FILE *fp, word *text, int newline, int quote_props, manconfig *conf) { rdstringc t = { 0, 0, NULL }; charset_state state = CHARSET_INIT_STATE; man_rdaddwc(&t, text, NULL, quote_props | QUOTE_INITCTRL, conf, &state); fprintf(fp, "%s", t.text); sfree(t.text); if (newline) fputc('\n', fp); } static void man_codepara(FILE *fp, word *text, int charset) { fprintf(fp, ".nf\n"); for (; text; text = text->next) if (text->type == word_WeakCode) { char *c; wchar_t *t, *e; int quote_props = QUOTE_INITCTRL | QUOTE_LITERAL; t = text->text; if (text->next && text->next->type == word_Emph) { e = text->next->text; text = text->next; } else e = NULL; while (e && *e && *t) { int n; int ec = *e; for (n = 0; t[n] && e[n] && e[n] == ec; n++); if (ec == 'i') fprintf(fp, "\\fI"); else if (ec == 'b') fprintf(fp, "\\fB"); man_convert(t, n, &c, quote_props, charset, NULL); quote_props &= ~QUOTE_INITCTRL; fprintf(fp, "%s", c); sfree(c); if (ec == 'i' || ec == 'b') fprintf(fp, "\\fP"); t += n; e += n; } man_convert(t, 0, &c, quote_props, charset, NULL); fprintf(fp, "%s\n", c); sfree(c); } fprintf(fp, ".fi\n"); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/bk_paper.c������������������������������������������������������������������������������0000644�0001753�0001753�00000224574�12444773746�011721� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Paper printing pre-backend for Halibut. * * This module does all the processing common to both PostScript * and PDF output: selecting fonts, line wrapping and page breaking * in accordance with font metrics, laying out the contents and * index pages, generally doing all the page layout. After this, * bk_ps.c and bk_pdf.c should only need to do linear translations * into their literal output format. */ /* * TODO in future work: * * - linearised PDF, perhaps? * * - I'm uncertain of whether I need to include a ToUnicode CMap * in each of my font definitions in PDF. Currently things (by * which I mean cut and paste out of acroread) seem to be * working fairly happily without it, but I don't know. * * - rather than the ugly aux_text mechanism for rendering chapter * titles, we could actually build the correct word list and * wrap it as a whole. * * - get vertical font metrics and use them to position the PDF * xref boxes more pleasantly * * - configurability * * page header and footer should be configurable; we should * be able to shift the page number elsewhere, and add other * things such as the current chapter/section title and fixed * text * * remove the fixed mapping from heading levels to heading * styles; offer a menu of styles from which the user can * choose at every heading level * * first-line indent in paragraphs * * fixed text: `Contents', `Index', the colon-space and full * stop in chapter title constructions * * configurable location of contents? * * certainly configurably _remove_ the contents, and possibly * also the index * * double-sided document switch? * + means you have two header/footer formats which * alternate * + and means that mandatory page breaks before chapter * titles should include a blank page if necessary to * start the next section to a right-hand page * * - title pages * * - ability to use Type 1 fonts without AFM files * * we need to parse the font to extract its metrics * * - character substitution for better typography? * * use real ellipsis rather than ... * * a hyphen in a word by itself might prefer to be an en-dash * * (Americans might even want a convenient way to use an * em-dash) * * DON'T DO ANY OF THE ABOVE WITHIN \c OR \cw! * * substituting `minus' for `hyphen' in the standard encoding * is probably preferable in Courier, though certainly not in * the main text font * * if I do do this lot, I'm rather inclined to at least try * to think up a configurable way to do it so that Americans * can do em-dash tricks without my intervention and other * people can do other odd things too. */ #include <assert.h> #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include "halibut.h" #include "paper.h" typedef struct paper_conf_Tag paper_conf; typedef struct paper_idx_Tag paper_idx; typedef struct { font_data *fonts[NFONTS]; int font_size; } font_cfg; struct paper_conf_Tag { int paper_width; int paper_height; int left_margin; int top_margin; int right_margin; int bottom_margin; int indent_list_bullet; int indent_list_after; int indent_list; int indent_quote; int base_leading; int base_para_spacing; int chapter_top_space; int sect_num_left_space; int chapter_underline_depth; int chapter_underline_thickness; int rule_thickness; font_cfg fbase, fcode, ftitle, fchapter, *fsect; int nfsect; int contents_indent_step; int contents_margin; int leader_separation; int index_gutter; int index_cols; int index_minsep; int pagenum_fontsize; int footer_distance; wchar_t *lquote, *rquote, *bullet; wchar_t *contents_text, *index_text; /* These are derived from the above */ int base_width; int page_height; int index_colwidth; }; struct paper_idx_Tag { /* * Word list giving the page numbers on which this index entry * appears. Also the last word in the list, for ease of * construction. */ word *words; word *lastword; /* * The last page added to the list (so we can ensure we don't * add one twice). */ page_data *lastpage; }; enum { word_PageXref = word_NotWordType + 1 }; /* Flags for render_string() */ #define RS_NOLIG 1 static font_data *make_std_font(font_list *fontlist, char const *name); static void wrap_paragraph(para_data *pdata, word *words, int w, int i1, int i2, paper_conf *conf); static page_data *page_breaks(line_data *first, line_data *last, int page_height, int ncols, int headspace); static int render_string(page_data *page, font_data *font, int fontsize, int x, int y, wchar_t *str, unsigned flags); static int render_line(line_data *ldata, int left_x, int top_y, xref_dest *dest, keywordlist *keywords, indexdata *idx, paper_conf *conf); static void render_para(para_data *pdata, paper_conf *conf, keywordlist *keywords, indexdata *idx, paragraph *index_placeholder, page_data *index_page); static int string_width(font_data *font, wchar_t const *string, int *errs, unsigned flags); static int paper_width_simple(para_data *pdata, word *text, paper_conf *conf); static para_data *code_paragraph(int indent, word *words, paper_conf *conf); static para_data *rule_paragraph(int indent, paper_conf *conf); static void add_rect_to_page(page_data *page, int x, int y, int w, int h); static para_data *make_para_data(int ptype, int paux, int indent, int rmargin, word *pkwtext, word *pkwtext2, word *pwords, paper_conf *conf); static void standard_line_spacing(para_data *pdata, paper_conf *conf); static wchar_t *prepare_outline_title(word *first, wchar_t *separator, word *second); static word *fake_word(wchar_t *text); static word *fake_space_word(void); static word *fake_page_ref(page_data *page); static word *fake_end_ref(void); static word *prepare_contents_title(word *first, wchar_t *separator, word *second); static void fold_into_page(page_data *dest, page_data *src, int right_shift); static int fonts_ok(wchar_t *string, ...) { font_data *font; va_list ap; int ret = TRUE; va_start(ap, string); while ( (font = va_arg(ap, font_data *)) != NULL) { int errs; (void) string_width(font, string, &errs, 0); if (errs) { ret = FALSE; break; } } va_end(ap); return ret; } static void paper_cfg_fonts(font_data **fonts, font_list *fontlist, wchar_t *wp, filepos *fpos) { font_data *f; char *fn; int i; for (i = 0; i < NFONTS && *wp; i++, wp = uadv(wp)) { fn = utoa_dup(wp, CS_ASCII); f = make_std_font(fontlist, fn); if (f) fonts[i] = f; else /* FIXME: proper error */ err_nofont(fpos, wp); } } static paper_conf paper_configure(paragraph *source, font_list *fontlist) { paragraph *p; paper_conf ret; /* * Defaults. */ ret.paper_width = 595 * UNITS_PER_PT; ret.paper_height = 842 * UNITS_PER_PT; ret.left_margin = 72 * UNITS_PER_PT; ret.top_margin = 72 * UNITS_PER_PT; ret.right_margin = 72 * UNITS_PER_PT; ret.bottom_margin = 108 * UNITS_PER_PT; ret.indent_list_bullet = 6 * UNITS_PER_PT; ret.indent_list_after = 18 * UNITS_PER_PT; ret.indent_quote = 18 * UNITS_PER_PT; ret.base_leading = UNITS_PER_PT; ret.base_para_spacing = 10 * UNITS_PER_PT; ret.chapter_top_space = 72 * UNITS_PER_PT; ret.sect_num_left_space = 12 * UNITS_PER_PT; ret.chapter_underline_depth = 14 * UNITS_PER_PT; ret.chapter_underline_thickness = 3 * UNITS_PER_PT; ret.rule_thickness = 1 * UNITS_PER_PT; ret.fbase.font_size = 12; ret.fbase.fonts[FONT_NORMAL] = make_std_font(fontlist, "Times-Roman"); ret.fbase.fonts[FONT_EMPH] = make_std_font(fontlist, "Times-Italic"); ret.fbase.fonts[FONT_STRONG] = make_std_font(fontlist, "Times-Bold"); ret.fbase.fonts[FONT_CODE] = make_std_font(fontlist, "Courier"); ret.fcode.font_size = 12; ret.fcode.fonts[FONT_NORMAL] = make_std_font(fontlist, "Courier-Bold"); ret.fcode.fonts[FONT_EMPH] = make_std_font(fontlist, "Courier-Oblique"); ret.fcode.fonts[FONT_STRONG] = make_std_font(fontlist, "Courier-Bold"); ret.fcode.fonts[FONT_CODE] = make_std_font(fontlist, "Courier"); ret.ftitle.font_size = 24; ret.ftitle.fonts[FONT_NORMAL] = make_std_font(fontlist, "Helvetica-Bold"); ret.ftitle.fonts[FONT_EMPH] = make_std_font(fontlist, "Helvetica-BoldOblique"); ret.ftitle.fonts[FONT_STRONG] = make_std_font(fontlist, "Helvetica-Bold"); ret.ftitle.fonts[FONT_CODE] = make_std_font(fontlist, "Courier-Bold"); ret.fchapter.font_size = 20; ret.fchapter.fonts[FONT_NORMAL]= make_std_font(fontlist, "Helvetica-Bold"); ret.fchapter.fonts[FONT_EMPH] = make_std_font(fontlist, "Helvetica-BoldOblique"); ret.fchapter.fonts[FONT_STRONG] = make_std_font(fontlist, "Helvetica-Bold"); ret.fchapter.fonts[FONT_CODE] = make_std_font(fontlist, "Courier-Bold"); ret.nfsect = 3; ret.fsect = snewn(ret.nfsect, font_cfg); ret.fsect[0].font_size = 16; ret.fsect[0].fonts[FONT_NORMAL]= make_std_font(fontlist, "Helvetica-Bold"); ret.fsect[0].fonts[FONT_EMPH] = make_std_font(fontlist, "Helvetica-BoldOblique"); ret.fsect[0].fonts[FONT_STRONG] = make_std_font(fontlist, "Helvetica-Bold"); ret.fsect[0].fonts[FONT_CODE] = make_std_font(fontlist, "Courier-Bold"); ret.fsect[1].font_size = 14; ret.fsect[1].fonts[FONT_NORMAL]= make_std_font(fontlist, "Helvetica-Bold"); ret.fsect[1].fonts[FONT_EMPH] = make_std_font(fontlist, "Helvetica-BoldOblique"); ret.fsect[1].fonts[FONT_STRONG] = make_std_font(fontlist, "Helvetica-Bold"); ret.fsect[1].fonts[FONT_CODE] = make_std_font(fontlist, "Courier-Bold"); ret.fsect[2].font_size = 13; ret.fsect[2].fonts[FONT_NORMAL]= make_std_font(fontlist, "Helvetica-Bold"); ret.fsect[2].fonts[FONT_EMPH] = make_std_font(fontlist, "Helvetica-BoldOblique"); ret.fsect[2].fonts[FONT_STRONG] = make_std_font(fontlist, "Helvetica-Bold"); ret.fsect[2].fonts[FONT_CODE] = make_std_font(fontlist, "Courier-Bold"); ret.contents_indent_step = 24 * UNITS_PER_PT; ret.contents_margin = 84 * UNITS_PER_PT; ret.leader_separation = 12 * UNITS_PER_PT; ret.index_gutter = 36 * UNITS_PER_PT; ret.index_cols = 2; ret.index_minsep = 18 * UNITS_PER_PT; ret.pagenum_fontsize = 12; ret.footer_distance = 32 * UNITS_PER_PT; ret.lquote = L"\x2018\0\x2019\0'\0'\0\0"; ret.rquote = uadv(ret.lquote); ret.bullet = L"\x2022\0-\0\0"; ret.contents_text = L"Contents"; ret.index_text = L"Index"; /* * Two-pass configuration so that we can pick up global config * (e.g. `quotes') before having it overridden by specific * config (`paper-quotes'), irrespective of the order in which * they occur. */ for (p = source; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } } } for (p = source; p; p = p->next) { p->private_data = NULL; if (p->type == para_Config) { if (!ustricmp(p->keyword, L"paper-quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } else if (!ustricmp(p->keyword, L"contents")) { ret.contents_text = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"index")) { ret.index_text = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"paper-bullet")) { ret.bullet = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"paper-page-width")) { ret.paper_width = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-page-height")) { ret.paper_height = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-left-margin")) { ret.left_margin = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-top-margin")) { ret.top_margin = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-right-margin")) { ret.right_margin = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-bottom-margin")) { ret.bottom_margin = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-list-indent")) { ret.indent_list_bullet = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-listitem-indent")) { ret.indent_list = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-quote-indent")) { ret.indent_quote = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-base-leading")) { ret.base_leading = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-base-para-spacing")) { ret.base_para_spacing = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-chapter-top-space")) { ret.chapter_top_space = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-sect-num-left-space")) { ret.sect_num_left_space = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-chapter-underline-depth")) { ret.chapter_underline_depth = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-chapter-underline-thickness")) { ret.chapter_underline_thickness = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-rule-thickness")) { ret.rule_thickness = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-contents-indent-step")) { ret.contents_indent_step = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-contents-margin")) { ret.contents_margin = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-leader-separation")) { ret.leader_separation = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-index-gutter")) { ret.index_gutter = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-index-minsep")) { ret.index_minsep = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-footer-distance")) { ret.footer_distance = (int) 0.5 + FUNITS_PER_PT * utof(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-base-font-size")) { ret.fbase.font_size = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-index-columns")) { ret.index_cols = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-pagenum-font-size")) { ret.pagenum_fontsize = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-base-fonts")) { paper_cfg_fonts(ret.fbase.fonts, fontlist, uadv(p->keyword), &p->fpos); } else if (!ustricmp(p->keyword, L"paper-code-font-size")) { ret.fcode.font_size = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-code-fonts")) { paper_cfg_fonts(ret.fcode.fonts, fontlist, uadv(p->keyword), &p->fpos); } else if (!ustricmp(p->keyword, L"paper-title-font-size")) { ret.ftitle.font_size = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-title-fonts")) { paper_cfg_fonts(ret.ftitle.fonts, fontlist, uadv(p->keyword), &p->fpos); } else if (!ustricmp(p->keyword, L"paper-chapter-font-size")) { ret.fchapter.font_size = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"paper-chapter-fonts")) { paper_cfg_fonts(ret.fchapter.fonts, fontlist, uadv(p->keyword), &p->fpos); } else if (!ustricmp(p->keyword, L"paper-section-font-size")) { wchar_t *q = uadv(p->keyword); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nfsect) { int i; ret.fsect = sresize(ret.fsect, n+1, font_cfg); for (i = ret.nfsect; i <= n; i++) ret.fsect[i] = ret.fsect[ret.nfsect-1]; ret.nfsect = n+1; } ret.fsect[n].font_size = utoi(q); } else if (!ustricmp(p->keyword, L"paper-section-fonts")) { wchar_t *q = uadv(p->keyword); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nfsect) { int i; ret.fsect = sresize(ret.fsect, n+1, font_cfg); for (i = ret.nfsect; i <= n; i++) ret.fsect[i] = ret.fsect[ret.nfsect-1]; ret.nfsect = n+1; } paper_cfg_fonts(ret.fsect[n].fonts, fontlist, q, &p->fpos); } } } /* * Set up the derived fields in the conf structure. */ ret.base_width = ret.paper_width - ret.left_margin - ret.right_margin; ret.page_height = ret.paper_height - ret.top_margin - ret.bottom_margin; ret.indent_list = ret.indent_list_bullet + ret.indent_list_after; ret.index_colwidth = (ret.base_width - (ret.index_cols-1) * ret.index_gutter) / ret.index_cols; /* * Now process fallbacks on quote characters and bullets. We * use string_width() to determine whether all of the relevant * fonts contain the same character, and fall back whenever we * find a character which not all of them support. */ /* Quote characters need not be supported in the fixed code fonts, * but must be in the title and body fonts. */ while (*uadv(ret.rquote) && *uadv(uadv(ret.rquote))) { int n; if (fonts_ok(ret.lquote, ret.fbase.fonts[FONT_NORMAL], ret.fbase.fonts[FONT_EMPH], ret.fbase.fonts[FONT_STRONG], ret.ftitle.fonts[FONT_NORMAL], ret.ftitle.fonts[FONT_EMPH], ret.ftitle.fonts[FONT_STRONG], ret.fchapter.fonts[FONT_NORMAL], ret.fchapter.fonts[FONT_EMPH], ret.fchapter.fonts[FONT_STRONG], NULL) && fonts_ok(ret.rquote, ret.fbase.fonts[FONT_NORMAL], ret.fbase.fonts[FONT_EMPH], ret.fbase.fonts[FONT_STRONG], ret.ftitle.fonts[FONT_NORMAL], ret.ftitle.fonts[FONT_EMPH], ret.ftitle.fonts[FONT_STRONG], ret.fchapter.fonts[FONT_NORMAL], ret.fchapter.fonts[FONT_EMPH], ret.fchapter.fonts[FONT_STRONG], NULL)) { for (n = 0; n < ret.nfsect; n++) if (!fonts_ok(ret.lquote, ret.fsect[n].fonts[FONT_NORMAL], ret.fsect[n].fonts[FONT_EMPH], ret.fsect[n].fonts[FONT_STRONG], NULL) || !fonts_ok(ret.rquote, ret.fsect[n].fonts[FONT_NORMAL], ret.fsect[n].fonts[FONT_EMPH], ret.fsect[n].fonts[FONT_STRONG], NULL)) break; if (n == ret.nfsect) break; } ret.lquote = uadv(ret.rquote); ret.rquote = uadv(ret.lquote); } /* The bullet character only needs to be supported in the normal body * font (not even in italics). */ while (*ret.bullet && *uadv(ret.bullet) && !fonts_ok(ret.bullet, ret.fbase.fonts[FONT_NORMAL], NULL)) ret.bullet = uadv(ret.bullet); return ret; } void *paper_pre_backend(paragraph *sourceform, keywordlist *keywords, indexdata *idx) { paragraph *p; document *doc; int indent, used_contents; para_data *pdata, *firstpara = NULL, *lastpara = NULL; para_data *firstcont, *lastcont; line_data *firstline, *lastline, *firstcontline, *lastcontline; page_data *pages; font_list *fontlist; paper_conf *conf, ourconf; int has_index; int pagenum; paragraph index_placeholder_para; page_data *first_index_page; init_std_fonts(); fontlist = snew(font_list); fontlist->head = fontlist->tail = NULL; ourconf = paper_configure(sourceform, fontlist); conf = &ourconf; /* * Set up a data structure to collect page numbers for each * index entry. */ { int i; indexentry *entry; has_index = FALSE; for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++) { paper_idx *pi = snew(paper_idx); has_index = TRUE; pi->words = pi->lastword = NULL; pi->lastpage = NULL; entry->backend_data = pi; } } /* * Format the contents entry for each heading. */ { word *contents_title; contents_title = fake_word(conf->contents_text); firstcont = make_para_data(para_UnnumberedChapter, 0, 0, 0, NULL, NULL, contents_title, conf); lastcont = firstcont; lastcont->next = NULL; firstcontline = firstcont->first; lastcontline = lastcont->last; for (p = sourceform; p; p = p->next) { word *words; int indent; switch (p->type) { case para_Chapter: case para_Appendix: case para_UnnumberedChapter: case para_Heading: case para_Subsect: switch (p->type) { case para_Chapter: case para_Appendix: words = prepare_contents_title(p->kwtext, L": ", p->words); indent = 0; break; case para_UnnumberedChapter: words = prepare_contents_title(NULL, NULL, p->words); indent = 0; break; case para_Heading: case para_Subsect: words = prepare_contents_title(p->kwtext2, L" ", p->words); indent = (p->aux + 1) * conf->contents_indent_step; break; } pdata = make_para_data(para_Normal, p->aux, indent, conf->contents_margin, NULL, NULL, words, conf); pdata->next = NULL; pdata->contents_entry = p; lastcont->next = pdata; lastcont = pdata; /* * Link all contents line structures together into * a big list. */ if (pdata->first) { if (lastcontline) { lastcontline->next = pdata->first; pdata->first->prev = lastcontline; } else { firstcontline = pdata->first; pdata->first->prev = NULL; } lastcontline = pdata->last; lastcontline->next = NULL; } break; } } /* * And one extra one, for the index. */ if (has_index) { pdata = make_para_data(para_Normal, 0, 0, conf->contents_margin, NULL, NULL, fake_word(conf->index_text), conf); pdata->next = NULL; pdata->contents_entry = &index_placeholder_para; lastcont->next = pdata; lastcont = pdata; if (pdata->first) { if (lastcontline) { lastcontline->next = pdata->first; pdata->first->prev = lastcontline; } else { firstcontline = pdata->first; pdata->first->prev = NULL; } lastcontline = pdata->last; lastcontline->next = NULL; } } } /* * Do the main paragraph formatting. */ indent = 0; used_contents = FALSE; firstline = lastline = NULL; for (p = sourceform; p; p = p->next) { p->private_data = NULL; switch (p->type) { /* * These paragraph types are either invisible or don't * define text in the normal sense. Either way, they * don't require wrapping. */ case para_IM: case para_BR: case para_Biblio: case para_NotParaType: case para_Config: case para_VersionID: case para_NoCite: break; /* * These paragraph types don't require wrapping, but * they do affect the line width to which we wrap the * rest of the paragraphs, so we need to pay attention. */ case para_LcontPush: indent += conf->indent_list; break; case para_LcontPop: indent -= conf->indent_list; assert(indent >= 0); break; case para_QuotePush: indent += conf->indent_quote; break; case para_QuotePop: indent -= conf->indent_quote; assert(indent >= 0); break; /* * This paragraph type is special. Process it * specially. */ case para_Code: pdata = code_paragraph(indent, p->words, conf); p->private_data = pdata; if (pdata->first != pdata->last) { pdata->first->penalty_after += 100000; pdata->last->penalty_before += 100000; } break; /* * This paragraph is also special. */ case para_Rule: pdata = rule_paragraph(indent, conf); p->private_data = pdata; break; /* * All of these paragraph types require wrapping in the * ordinary way. So we must supply a set of fonts, a * line width and auxiliary information (e.g. bullet * text) for each one. */ case para_Chapter: case para_Appendix: case para_UnnumberedChapter: case para_Heading: case para_Subsect: case para_Normal: case para_BiblioCited: case para_Bullet: case para_NumberedList: case para_DescribedThing: case para_Description: case para_Copyright: case para_Title: pdata = make_para_data(p->type, p->aux, indent, 0, p->kwtext, p->kwtext2, p->words, conf); p->private_data = pdata; break; } if (p->private_data) { pdata = (para_data *)p->private_data; /* * If this is the first non-title heading, we link the * contents section in before it. */ if (!used_contents && pdata->outline_level > 0) { used_contents = TRUE; if (lastpara) lastpara->next = firstcont; else firstpara = firstcont; lastpara = lastcont; assert(lastpara->next == NULL); if (lastline) { lastline->next = firstcontline; firstcontline->prev = lastline; } else { firstline = firstcontline; firstcontline->prev = NULL; } assert(lastcontline != NULL); lastline = lastcontline; lastline->next = NULL; } /* * Link all line structures together into a big list. */ if (pdata->first) { if (lastline) { lastline->next = pdata->first; pdata->first->prev = lastline; } else { firstline = pdata->first; pdata->first->prev = NULL; } lastline = pdata->last; lastline->next = NULL; } /* * Link all paragraph structures together similarly. */ pdata->next = NULL; if (lastpara) lastpara->next = pdata; else firstpara = pdata; lastpara = pdata; } } /* * Now we have an enormous linked list of every line of text in * the document. Break it up into pages. */ pages = page_breaks(firstline, lastline, conf->page_height, 0, 0); /* * Number the pages. */ { char buf[40]; page_data *page; pagenum = 0; for (page = pages; page; page = page->next) { sprintf(buf, "%d", ++pagenum); page->number = ufroma_dup(buf, CS_ASCII); } if (has_index) { first_index_page = snew(page_data); first_index_page->next = first_index_page->prev = NULL; first_index_page->first_line = NULL; first_index_page->last_line = NULL; first_index_page->first_text = first_index_page->last_text = NULL; first_index_page->first_xref = first_index_page->last_xref = NULL; first_index_page->first_rect = first_index_page->last_rect = NULL; /* And don't forget the as-yet-uncreated index. */ sprintf(buf, "%d", ++pagenum); first_index_page->number = ufroma_dup(buf, CS_ASCII); } } /* * Now we're ready to actually lay out the pages. We do this by * looping over _paragraphs_, since we may need to track cross- * references between lines and even across pages. */ for (pdata = firstpara; pdata; pdata = pdata->next) render_para(pdata, conf, keywords, idx, &index_placeholder_para, first_index_page); /* * Now we've laid out the main body pages, we should have * acquired a full set of page numbers for the index. */ if (has_index) { int i; indexentry *entry; word *index_title; para_data *firstidx, *lastidx; line_data *firstidxline, *lastidxline, *ldata; page_data *ipages, *ipages2, *page; /* * Create a set of paragraphs for the index. */ index_title = fake_word(conf->index_text); firstidx = make_para_data(para_UnnumberedChapter, 0, 0, 0, NULL, NULL, index_title, conf); lastidx = firstidx; lastidx->next = NULL; firstidxline = firstidx->first; lastidxline = lastidx->last; for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++) { paper_idx *pi = (paper_idx *)entry->backend_data; para_data *text, *pages; if (!pi->words) continue; text = make_para_data(para_Normal, 0, 0, conf->base_width - conf->index_colwidth, NULL, NULL, entry->text, conf); pages = make_para_data(para_Normal, 0, 0, conf->base_width - conf->index_colwidth, NULL, NULL, pi->words, conf); text->justification = LEFT; pages->justification = RIGHT; text->last->space_after = pages->first->space_before = conf->base_leading / 2; pages->last->space_after = text->first->space_before = conf->base_leading; assert(text->first); assert(pages->first); assert(lastidxline); assert(lastidx); /* * If feasible, fold the two halves of the index entry * together. */ if (text->last->real_shortfall + pages->first->real_shortfall > conf->index_colwidth + conf->index_minsep) { text->last->space_after = -1; pages->first->space_before = -pages->first->line_height+1; } lastidx->next = text; text->next = pages; pages->next = NULL; lastidx = pages; /* * Link all index line structures together into * a big list. */ text->last->next = pages->first; pages->first->prev = text->last; lastidxline->next = text->first; text->first->prev = lastidxline; lastidxline = pages->last; /* * Breaking an index entry anywhere is so bad that I * think I'm going to forbid it totally. */ for (ldata = text->first; ldata && ldata->next; ldata = ldata->next) { ldata->next->space_before += ldata->space_after + 1; ldata->space_after = -1; } } /* * Now break the index into pages. */ ipages = page_breaks(firstidxline, firstidxline, conf->page_height, 0, 0); ipages2 = page_breaks(firstidxline->next, lastidxline, conf->page_height, conf->index_cols, firstidxline->space_before + firstidxline->line_height + firstidxline->space_after); /* * This will have put each _column_ of the index on a * separate page, which isn't what we want. Fold the pages * back together. */ page = ipages2; while (page) { int i; for (i = 1; i < conf->index_cols; i++) if (page->next) { page_data *tpage; fold_into_page(page, page->next, i * (conf->index_colwidth + conf->index_gutter)); tpage = page->next; page->next = page->next->next; if (page->next) page->next->prev = page; sfree(tpage); } page = page->next; } /* Also fold the heading on to the same page as the index items. */ fold_into_page(ipages, ipages2, 0); ipages->next = ipages2->next; if (ipages->next) ipages->next->prev = ipages; sfree(ipages2); fold_into_page(first_index_page, ipages, 0); first_index_page->next = ipages->next; if (first_index_page->next) first_index_page->next->prev = first_index_page; sfree(ipages); ipages = first_index_page; /* * Number the index pages, except the already-numbered * first one. */ for (page = ipages->next; page; page = page->next) { char buf[40]; sprintf(buf, "%d", ++pagenum); page->number = ufroma_dup(buf, CS_ASCII); } /* * Render the index pages. */ for (pdata = firstidx; pdata; pdata = pdata->next) render_para(pdata, conf, keywords, idx, &index_placeholder_para, first_index_page); /* * Link the index page list on to the end of the main page * list. */ if (!pages) pages = ipages; else { for (page = pages; page->next; page = page->next); page->next = ipages; } /* * Same with the paragraph list, which will cause the index * to be mentioned in the document outline. */ if (!firstpara) firstpara = firstidx; else lastpara->next = firstidx; lastpara = lastidx; } /* * Draw the headers and footers. * * FIXME: this should be fully configurable, but for the moment * I'm just going to put in page numbers in the centre of a * footer and leave it at that. */ { page_data *page; for (page = pages; page; page = page->next) { int width; width = conf->pagenum_fontsize * string_width(conf->fbase.fonts[FONT_NORMAL], page->number, NULL, 0); render_string(page, conf->fbase.fonts[FONT_NORMAL], conf->pagenum_fontsize, conf->left_margin + (conf->base_width - width)/2, conf->bottom_margin - conf->footer_distance, page->number, 0); } } /* * Start putting together the overall document structure we're * going to return. */ doc = snew(document); doc->fonts = fontlist; doc->pages = pages; doc->paper_width = conf->paper_width; doc->paper_height = conf->paper_height; /* * Collect the section heading paragraphs into a document * outline. This is slightly fiddly because the Title paragraph * isn't required to be at the start, although all the others * must be in order. */ { int osize = 20; doc->outline_elements = snewn(osize, outline_element); doc->n_outline_elements = 0; /* First find the title. */ for (pdata = firstpara; pdata; pdata = pdata->next) { if (pdata->outline_level == 0) { doc->outline_elements[0].level = 0; doc->outline_elements[0].pdata = pdata; doc->n_outline_elements++; break; } } /* Then collect the rest. */ for (pdata = firstpara; pdata; pdata = pdata->next) { if (pdata->outline_level > 0) { if (doc->n_outline_elements >= osize) { osize += 20; doc->outline_elements = sresize(doc->outline_elements, osize, outline_element); } doc->outline_elements[doc->n_outline_elements].level = pdata->outline_level; doc->outline_elements[doc->n_outline_elements].pdata = pdata; doc->n_outline_elements++; } } } return doc; } static void setfont(para_data *p, font_cfg *f) { int i; for (i = 0; i < NFONTS; i++) { p->fonts[i] = f->fonts[i]; p->sizes[i] = f->font_size; } } static para_data *make_para_data(int ptype, int paux, int indent, int rmargin, word *pkwtext, word *pkwtext2, word *pwords, paper_conf *conf) { para_data *pdata; line_data *ldata; int extra_indent, firstline_indent, aux_indent; word *aux, *aux2; pdata = snew(para_data); pdata->outline_level = -1; pdata->outline_title = NULL; pdata->rect_type = RECT_NONE; pdata->contents_entry = NULL; pdata->justification = JUST; pdata->extraflags = 0; /* * Choose fonts for this paragraph. */ switch (ptype) { case para_Title: setfont(pdata, &conf->ftitle); pdata->outline_level = 0; break; case para_Chapter: case para_Appendix: case para_UnnumberedChapter: setfont(pdata, &conf->fchapter); pdata->outline_level = 1; break; case para_Heading: case para_Subsect: setfont(pdata, &conf->fsect[paux >= conf->nfsect ? conf->nfsect - 1 : paux]); pdata->outline_level = 2 + paux; break; case para_Normal: case para_BiblioCited: case para_Bullet: case para_NumberedList: case para_DescribedThing: case para_Description: case para_Copyright: setfont(pdata, &conf->fbase); break; } /* * Also select an indentation level depending on the * paragraph type (list paragraphs other than * para_DescribedThing need extra indent). * * (FIXME: Perhaps at some point we might even arrange * for the user to be able to request indented first * lines in paragraphs.) */ if (ptype == para_Bullet || ptype == para_NumberedList || ptype == para_Description) { extra_indent = firstline_indent = conf->indent_list; } else { extra_indent = firstline_indent = 0; } /* * Find the auxiliary text for this paragraph. */ aux = aux2 = NULL; aux_indent = 0; switch (ptype) { case para_Chapter: case para_Appendix: case para_Heading: case para_Subsect: /* * For some heading styles (FIXME: be able to * configure which), the auxiliary text contains * the chapter number and is arranged to be * right-aligned a few points left of the primary * margin. For other styles, the auxiliary text is * the full chapter _name_ and takes up space * within the (wrapped) chapter title, meaning that * we must move the first line indent over to make * space for it. */ if (ptype == para_Heading || ptype == para_Subsect) { int len; aux = pkwtext2; len = paper_width_simple(pdata, pkwtext2, conf); aux_indent = -len - conf->sect_num_left_space; pdata->outline_title = prepare_outline_title(pkwtext2, L" ", pwords); } else { aux = pkwtext; aux2 = fake_word(L": "); aux_indent = 0; firstline_indent += paper_width_simple(pdata, aux, conf); firstline_indent += paper_width_simple(pdata, aux2, conf); pdata->outline_title = prepare_outline_title(pkwtext, L": ", pwords); } break; case para_Bullet: /* * Auxiliary text consisting of a bullet. */ aux = fake_word(conf->bullet); aux_indent = indent + conf->indent_list_bullet; break; case para_NumberedList: /* * Auxiliary text consisting of the number followed * by a (FIXME: configurable) full stop. */ aux = pkwtext; aux2 = fake_word(L"."); aux_indent = indent + conf->indent_list_bullet; break; case para_BiblioCited: /* * Auxiliary text consisting of the bibliography * reference text, and a trailing space. */ aux = pkwtext; aux2 = fake_word(L" "); aux_indent = indent; firstline_indent += paper_width_simple(pdata, aux, conf); firstline_indent += paper_width_simple(pdata, aux2, conf); break; } if (pdata->outline_level >= 0 && !pdata->outline_title) { pdata->outline_title = prepare_outline_title(NULL, NULL, pwords); } wrap_paragraph(pdata, pwords, conf->base_width - rmargin, indent + firstline_indent, indent + extra_indent, conf); pdata->first->aux_text = aux; pdata->first->aux_text_2 = aux2; pdata->first->aux_left_indent = aux_indent; /* * Line breaking penalties. */ switch (ptype) { case para_Chapter: case para_Appendix: case para_Heading: case para_Subsect: case para_UnnumberedChapter: /* * Fixed and large penalty for breaking straight * after a heading; corresponding bonus for * breaking straight before. */ pdata->first->penalty_before = -500000; pdata->last->penalty_after = 500000; for (ldata = pdata->first; ldata; ldata = ldata->next) ldata->penalty_after = 500000; break; case para_DescribedThing: /* * This is treated a bit like a small heading: * there's a penalty for breaking after it (i.e. * between it and its description), and a bonus for * breaking before it (actually _between_ list * items). */ pdata->first->penalty_before = -200000; pdata->last->penalty_after = 200000; break; default: /* * Most paragraph types: widow/orphan control by * discouraging breaking one line from the end of * any paragraph. */ if (pdata->first != pdata->last) { pdata->first->penalty_after = 100000; pdata->last->penalty_before = 100000; } break; } standard_line_spacing(pdata, conf); /* * Some kinds of section heading require a page break before * them and an underline after. */ if (ptype == para_Title || ptype == para_Chapter || ptype == para_Appendix || ptype == para_UnnumberedChapter) { pdata->first->page_break = TRUE; pdata->first->space_before = conf->chapter_top_space; pdata->last->space_after += (conf->chapter_underline_depth + conf->chapter_underline_thickness); pdata->rect_type = RECT_CHAPTER_UNDERLINE; } return pdata; } static void standard_line_spacing(para_data *pdata, paper_conf *conf) { line_data *ldata; /* * Set the line spacing for each line in this paragraph. */ for (ldata = pdata->first; ldata; ldata = ldata->next) { if (ldata == pdata->first) ldata->space_before = conf->base_para_spacing / 2; else ldata->space_before = conf->base_leading / 2; if (ldata == pdata->last) ldata->space_after = conf->base_para_spacing / 2; else ldata->space_after = conf->base_leading / 2; ldata->page_break = FALSE; } } static font_encoding *new_font_encoding(font_data *font) { font_encoding *fe; int i; fe = snew(font_encoding); fe->next = NULL; if (font->list->tail) font->list->tail->next = fe; else font->list->head = fe; font->list->tail = fe; fe->font = font; fe->free_pos = 0x21; for (i = 0; i < 256; i++) { fe->vector[i] = NOGLYPH; fe->to_unicode[i] = 0xFFFF; } return fe; } static subfont_map_entry *encode_glyph_at(glyph g, wchar_t u, font_encoding *fe, int pos) { subfont_map_entry *sme = snew(subfont_map_entry); sme->subfont = fe; sme->position = pos; fe->vector[pos] = g; fe->to_unicode[pos] = u; add234(fe->font->subfont_map, sme); return sme; } static int new_sfmap_cmp(void *a, void *b) { glyph ga = *(glyph *)a; subfont_map_entry *sb = b; glyph gb = sb->subfont->vector[sb->position]; if (ga < gb) return -1; if (ga > gb) return 1; return 0; } static subfont_map_entry *encode_glyph(glyph g, wchar_t u, font_data *font) { subfont_map_entry *sme; int c; sme = find234(font->subfont_map, &g, new_sfmap_cmp); if (sme) return sme; /* * This character is not yet in a subfont. Assign one. */ if (font->latest_subfont->free_pos >= 0x100) font->latest_subfont = new_font_encoding(font); c = font->latest_subfont->free_pos++; if (font->latest_subfont->free_pos == 0x7F) font->latest_subfont->free_pos = 0xA1; return encode_glyph_at(g, u, font->latest_subfont, c); } static int sfmap_cmp(void *a, void *b) { subfont_map_entry *sa = a, *sb = b; glyph ga = sa->subfont->vector[sa->position]; glyph gb = sb->subfont->vector[sb->position]; if (ga < gb) return -1; if (ga > gb) return 1; return 0; } int width_cmp(void *a, void *b) { glyph_width const *wa = a, *wb = b; if (wa->glyph < wb->glyph) return -1; if (wa->glyph > wb->glyph) return 1; return 0; } int kern_cmp(void *a, void *b) { kern_pair const *ka = a, *kb = b; if (ka->left < kb->left) return -1; if (ka->left > kb->left) return 1; if (ka->right < kb->right) return -1; if (ka->right > kb->right) return 1; return 0; } int lig_cmp(void *a, void *b) { ligature const *la = a, *lb = b; if (la->left < lb->left) return -1; if (la->left > lb->left) return 1; if (la->right < lb->right) return -1; if (la->right > lb->right) return 1; return 0; } static int utoglyph(font_info const *fi, wchar_t u) { return (u < 0 || u > 0xFFFF ? NOGLYPH : fi->bmp[u]); } void listfonts(void) { font_info const *fi; init_std_fonts(); for (fi = all_fonts; fi; fi = fi->next) printf("%s\n", fi->name); } static font_data *make_std_font(font_list *fontlist, char const *name) { font_info const *fi; font_data *f; font_encoding *fe; int i; for (fe = fontlist->head; fe; fe = fe->next) if (strcmp(fe->font->info->name, name) == 0) return fe->font; for (fi = all_fonts; fi; fi = fi->next) if (strcmp(fi->name, name) == 0) break; if (!fi) return NULL; f = snew(font_data); f->list = fontlist; f->info = fi; f->subfont_map = newtree234(sfmap_cmp); /* * Our first subfont will contain all of US-ASCII. This isn't * really necessary - we could just create custom subfonts * precisely as the whim of render_string dictated - but * instinct suggests that it might be nice to have the text in * the output files look _marginally_ recognisable. */ fe = new_font_encoding(f); fe->free_pos = 0xA1; /* only the top half is free */ f->latest_subfont = fe; for (i = 0x20; i <= 0x7E; i++) { glyph g = utoglyph(fi, i); if (g != NOGLYPH) encode_glyph_at(g, i, fe, i); } return f; } /* NB: arguments are glyph numbers from font->bmp. */ int find_width(font_data *font, glyph index) { glyph_width wantw; glyph_width const *w; wantw.glyph = index; w = find234(font->info->widths, &wantw, NULL); if (!w) return 0; return w->width; } static int find_kern(font_data *font, int lindex, int rindex) { kern_pair wantkp; kern_pair const *kp; if (lindex == NOGLYPH || rindex == NOGLYPH) return 0; wantkp.left = lindex; wantkp.right = rindex; kp = find234(font->info->kerns, &wantkp, NULL); if (kp == NULL) return 0; return kp->kern; } static int find_lig(font_data *font, int lindex, int rindex) { ligature wantlig; ligature const *lig; if (lindex == NOGLYPH || rindex == NOGLYPH) return NOGLYPH; wantlig.left = lindex; wantlig.right = rindex; lig = find234(font->info->ligs, &wantlig, NULL); if (lig == NULL) return NOGLYPH; return lig->lig; } static int string_width(font_data *font, wchar_t const *string, int *errs, unsigned flags) { int width = 0; int nindex, index, oindex, lindex; if (errs) *errs = 0; oindex = NOGLYPH; index = utoglyph(font->info, *string); for (; *string; string++) { nindex = utoglyph(font->info, string[1]); if (index == NOGLYPH) { if (errs) *errs = 1; } else { if (!(flags & RS_NOLIG) && (lindex = find_lig(font, index, nindex)) != NOGLYPH) { index = lindex; continue; } width += find_kern(font, oindex, index) + find_width(font, index); } oindex = index; index = nindex; } return width; } static int paper_width_internal(void *vctx, word *word, int *nspaces); struct paper_width_ctx { int minspacewidth; para_data *pdata; paper_conf *conf; }; static int paper_width_list(void *vctx, word *text, word *end, int *nspaces) { int w = 0; while (text && text != end) { w += paper_width_internal(vctx, text, nspaces); text = text->next; } return w; } static int paper_width_internal(void *vctx, word *word, int *nspaces) { struct paper_width_ctx *ctx = (struct paper_width_ctx *)vctx; int style, type, findex, width, errs; wchar_t *str; unsigned flags = 0; switch (word->type) { case word_HyperLink: case word_HyperEnd: case word_UpperXref: case word_LowerXref: case word_PageXref: case word_XrefEnd: case word_IndexRef: return 0; } style = towordstyle(word->type); type = removeattr(word->type); findex = (style == word_Normal ? FONT_NORMAL : style == word_Emph ? FONT_EMPH : style == word_Strong ? FONT_STRONG : FONT_CODE); if (style == word_Code || style == word_WeakCode) flags |= RS_NOLIG; if (type == word_Normal) { str = word->text; } else if (type == word_WhiteSpace) { if (findex != FONT_CODE) { if (nspaces) (*nspaces)++; return ctx->minspacewidth; } else str = L" "; } else /* if (type == word_Quote) */ { if (word->aux == quote_Open) str = ctx->conf->lquote; else str = ctx->conf->rquote; } width = string_width(ctx->pdata->fonts[findex], str, &errs, flags); if (errs && word->alt) return paper_width_list(vctx, word->alt, NULL, nspaces); else return ctx->pdata->sizes[findex] * width; } static int paper_width(void *vctx, word *word) { return paper_width_internal(vctx, word, NULL); } static int paper_width_simple(para_data *pdata, word *text, paper_conf *conf) { struct paper_width_ctx ctx; ctx.pdata = pdata; ctx.minspacewidth = (pdata->sizes[FONT_NORMAL] * string_width(pdata->fonts[FONT_NORMAL], L" ", NULL, 0)); ctx.conf = conf; return paper_width_list(&ctx, text, NULL, NULL); } static void wrap_paragraph(para_data *pdata, word *words, int w, int i1, int i2, paper_conf *conf) { wrappedline *wrapping, *p; int spacewidth; struct paper_width_ctx ctx; int line_height; /* * We're going to need to store the line height in every line * structure we generate. */ { int i; line_height = 0; for (i = 0; i < NFONTS; i++) if (line_height < pdata->sizes[i]) line_height = pdata->sizes[i]; line_height *= UNITS_PER_PT; } spacewidth = (pdata->sizes[FONT_NORMAL] * string_width(pdata->fonts[FONT_NORMAL], L" ", NULL, 0)); if (spacewidth == 0) { /* * A font without a space?! Disturbing. I hope this never * comes up, but I'll make a random guess anyway and set my * space width to half the point size. */ spacewidth = pdata->sizes[FONT_NORMAL] * UNITS_PER_PT / 2; } /* * I'm going to set the _minimum_ space width to 3/5 of the * standard one, and use the standard one as the optimum. */ ctx.minspacewidth = spacewidth * 3 / 5; ctx.pdata = pdata; ctx.conf = conf; wrapping = wrap_para(words, w - i1, w - i2, paper_width, &ctx, spacewidth); /* * Having done the wrapping, we now concoct a set of line_data * structures. */ pdata->first = pdata->last = NULL; for (p = wrapping; p; p = p->next) { line_data *ldata; int len, wid, spaces; ldata = snew(line_data); ldata->pdata = pdata; ldata->first = p->begin; ldata->end = p->end; ldata->line_height = line_height; ldata->xpos = (p == wrapping ? i1 : i2); if (pdata->last) { pdata->last->next = ldata; ldata->prev = pdata->last; } else { pdata->first = ldata; ldata->prev = NULL; } ldata->next = NULL; pdata->last = ldata; spaces = 0; len = paper_width_list(&ctx, ldata->first, ldata->end, &spaces); wid = (p == wrapping ? w - i1 : w - i2); ldata->hshortfall = wid - len; ldata->nspaces = spaces; /* * This tells us how much the space width needs to * change from _min_spacewidth. But we want to store * its difference from the _natural_ space width, to * make the text rendering easier. */ ldata->hshortfall += ctx.minspacewidth * spaces; ldata->hshortfall -= spacewidth * spaces; ldata->real_shortfall = ldata->hshortfall; /* * Special case: on the last line of a paragraph, we * never stretch spaces. */ if (ldata->hshortfall > 0 && !p->next) ldata->hshortfall = 0; ldata->aux_text = NULL; ldata->aux_text_2 = NULL; ldata->aux_left_indent = 0; ldata->penalty_before = ldata->penalty_after = 0; } } static page_data *page_breaks(line_data *first, line_data *last, int page_height, int ncols, int headspace) { line_data *l, *m; page_data *ph, *pt; int n, n1, this_height; /* * Page breaking is done by a close analogue of the optimal * paragraph wrapping algorithm used by wrap_para(). We work * backwards from the end of the document line by line; for * each line, we contemplate every possible number of lines we * could put on a page starting with that line, determine a * cost function for each one, add it to the pre-computed cost * function for optimally page-breaking everything after that * page, and pick the best option. * * This is made slightly more complex by the fact that we have * a multi-column index with a heading at the top of the * _first_ page, meaning that the first _ncols_ pages must have * a different length. Hence, we must do the wrapping ncols+1 * times over, hypothetically trying to put every subsequence * on every possible page. * * Since my line_data structures are only used for this * purpose, I might as well just store the algorithm data * directly in them. */ for (l = last; l; l = l->prev) { l->bestcost = snewn(ncols+1, int); l->vshortfall = snewn(ncols+1, int); l->text = snewn(ncols+1, int); l->space = snewn(ncols+1, int); l->page_last = snewn(ncols+1, line_data *); for (n = 0; n <= ncols; n++) { int minheight, text = 0, space = 0; int cost; n1 = (n < ncols ? n+1 : ncols); if (n < ncols) this_height = page_height - headspace; else this_height = page_height; l->bestcost[n] = -1; for (m = l; m; m = m->next) { if (m != l && m->page_break) break; /* we've gone as far as we can */ if (m != l) { if (m->prev->space_after > 0) space += m->prev->space_after; else text += m->prev->space_after; } if (m != l || m->page_break) { if (m->space_before > 0) space += m->space_before; else text += m->space_before; } text += m->line_height; minheight = text + space; if (m != l && minheight > this_height) break; /* * If the space after this paragraph is _negative_ * (which means the next line is folded on to this * one, which happens in the index), we absolutely * cannot break here. */ if (m->space_after >= 0) { /* * Compute the cost of this arrangement, as the * square of the amount of wasted space on the * page. Exception: if this is the last page * before a mandatory break or the document * end, we don't penalise a large blank area. */ if (m != last && m->next && !m->next->page_break) { int x = (this_height - minheight) / FUNITS_PER_PT * 4096.0; int xf; xf = x & 0xFF; x >>= 8; cost = x*x; cost += (x * xf) >> 8; } else cost = 0; if (m != last && m->next && !m->next->page_break) { cost += m->penalty_after; cost += m->next->penalty_before; } if (m != last && m->next && !m->next->page_break) cost += m->next->bestcost[n1]; if (l->bestcost[n] == -1 || l->bestcost[n] > cost) { /* * This is the best option yet for this * starting point. */ l->bestcost[n] = cost; if (m != last && m->next && !m->next->page_break) l->vshortfall[n] = this_height - minheight; else l->vshortfall[n] = 0; l->text[n] = text; l->space[n] = space; l->page_last[n] = m; } } if (m == last) break; } } } /* * Now go through the line list forwards and assemble the * actual pages. */ ph = pt = NULL; l = first; n = 0; while (l) { page_data *page; int text, space, head; page = snew(page_data); page->next = NULL; page->prev = pt; if (pt) pt->next = page; else ph = page; pt = page; page->first_line = l; page->last_line = l->page_last[n]; page->first_text = page->last_text = NULL; page->first_xref = page->last_xref = NULL; page->first_rect = page->last_rect = NULL; /* * Now assign a y-coordinate to each line on the page. */ text = space = 0; head = (n < ncols ? headspace : 0); for (l = page->first_line; l; l = l->next) { if (l != page->first_line) { if (l->prev->space_after > 0) space += l->prev->space_after; else text += l->prev->space_after; } if (l != page->first_line || l->page_break) { if (l->space_before > 0) space += l->space_before; else text += l->space_before; } text += l->line_height; l->page = page; l->ypos = text + space + head; if (page->first_line->space[n]) { l->ypos += space * (float)page->first_line->vshortfall[n] / page->first_line->space[n]; } if (l == page->last_line) break; } l = page->last_line; if (l == last) break; l = l->next; n = (n < ncols ? n+1 : ncols); } return ph; } static void add_rect_to_page(page_data *page, int x, int y, int w, int h) { rect *r = snew(rect); r->next = NULL; if (page->last_rect) page->last_rect->next = r; else page->first_rect = r; page->last_rect = r; r->x = x; r->y = y; r->w = w; r->h = h; } static void add_string_to_page(page_data *page, int x, int y, font_encoding *fe, int size, char *text, int width) { text_fragment *frag; frag = snew(text_fragment); frag->next = NULL; if (page->last_text) page->last_text->next = frag; else page->first_text = frag; page->last_text = frag; frag->x = x; frag->y = y; frag->fe = fe; frag->fontsize = size; frag->text = dupstr(text); frag->width = width; } /* * Returns the updated x coordinate. */ static int render_string(page_data *page, font_data *font, int fontsize, int x, int y, wchar_t *str, unsigned flags) { char *text; int textpos, textwid, kern, nglyph, glyph, oglyph, lig; font_encoding *subfont = NULL, *sf; subfont_map_entry *sme; text = snewn(1 + ustrlen(str), char); textpos = textwid = 0; glyph = NOGLYPH; nglyph = utoglyph(font->info, *str); while (*str) { oglyph = glyph; glyph = nglyph; nglyph = utoglyph(font->info, str[1]); if (glyph == NOGLYPH) { str++; continue; /* nothing more we can do here */ } if (!(flags & RS_NOLIG) && (lig = find_lig(font, glyph, nglyph)) != NOGLYPH) { nglyph = lig; str++; continue; } /* * Find which subfont this character is going in. */ sme = encode_glyph(glyph, *str, font); sf = sme->subfont; kern = find_kern(font, oglyph, glyph) * fontsize; if (!subfont || sf != subfont || kern) { if (subfont) { text[textpos] = '\0'; add_string_to_page(page, x, y, subfont, fontsize, text, textwid); x += textwid + kern; } else { assert(textpos == 0); } textpos = 0; textwid = 0; subfont = sf; } text[textpos++] = sme->position; textwid += find_width(font, glyph) * fontsize; str++; } if (textpos > 0) { text[textpos] = '\0'; add_string_to_page(page, x, y, subfont, fontsize, text, textwid); x += textwid; } return x; } /* * Returns the updated x coordinate. */ static int render_text(page_data *page, para_data *pdata, line_data *ldata, int x, int y, word *text, word *text_end, xref **xr, int shortfall, int nspaces, int *nspace, keywordlist *keywords, indexdata *idx, paper_conf *conf) { while (text && text != text_end) { int style, type, findex, errs; wchar_t *str; xref_dest dest; unsigned flags = 0; switch (text->type) { /* * Start a cross-reference. */ case word_HyperLink: case word_UpperXref: case word_LowerXref: case word_PageXref: if (text->type == word_HyperLink) { dest.type = URL; dest.url = utoa_dup(text->text, CS_ASCII); dest.page = NULL; } else if (text->type == word_PageXref) { dest.type = PAGE; dest.url = NULL; dest.page = (page_data *)text->private_data; } else { keyword *kwl = kw_lookup(keywords, text->text); para_data *pdata; if (kwl) { assert(kwl->para->private_data); pdata = (para_data *) kwl->para->private_data; dest.type = PAGE; dest.page = pdata->first->page; dest.url = NULL; } else { /* * Shouldn't happen, but *shrug* */ dest.type = NONE; dest.page = NULL; dest.url = NULL; } } if (dest.type != NONE) { *xr = snew(xref); (*xr)->dest = dest; /* structure copy */ if (page->last_xref) page->last_xref->next = *xr; else page->first_xref = *xr; page->last_xref = *xr; (*xr)->next = NULL; /* * FIXME: Ideally we should have, and use, some * vertical font metric information here so that * our cross-ref rectangle can take account of * descenders and the font's cap height. This will * do for the moment, but it isn't ideal. */ (*xr)->lx = (*xr)->rx = x; (*xr)->by = y; (*xr)->ty = y + ldata->line_height; } goto nextword; /* * Finish extending a cross-reference box. */ case word_HyperEnd: case word_XrefEnd: *xr = NULL; goto nextword; /* * Add the current page number to the list of pages * referenced by an index entry. */ case word_IndexRef: /* * We don't create index references in contents entries. */ if (!pdata->contents_entry) { indextag *tag; int i; tag = index_findtag(idx, text->text); if (!tag) goto nextword; for (i = 0; i < tag->nrefs; i++) { indexentry *entry = tag->refs[i]; paper_idx *pi = (paper_idx *)entry->backend_data; /* * If the same index term is indexed twice * within the same section, we only want to * mention it once in the index. */ if (pi->lastpage != page) { word **wp; if (pi->lastword) { pi->lastword = pi->lastword->next = fake_word(L","); pi->lastword = pi->lastword->next = fake_space_word(); wp = &pi->lastword->next; } else wp = &pi->words; pi->lastword = *wp = fake_page_ref(page); pi->lastword = pi->lastword->next = fake_word(page->number); pi->lastword = pi->lastword->next = fake_end_ref(); } pi->lastpage = page; } } goto nextword; } style = towordstyle(text->type); type = removeattr(text->type); findex = (style == word_Normal ? FONT_NORMAL : style == word_Emph ? FONT_EMPH : style == word_Strong ? FONT_STRONG : FONT_CODE); if (style == word_Code || style == word_WeakCode) flags |= RS_NOLIG; flags |= pdata->extraflags; if (type == word_Normal) { str = text->text; } else if (type == word_WhiteSpace) { x += pdata->sizes[findex] * string_width(pdata->fonts[findex], L" ", NULL, 0); if (nspaces && findex != FONT_CODE) { x += (*nspace+1) * shortfall / nspaces; x -= *nspace * shortfall / nspaces; (*nspace)++; } goto nextword; } else /* if (type == word_Quote) */ { if (text->aux == quote_Open) str = conf->lquote; else str = conf->rquote; } (void) string_width(pdata->fonts[findex], str, &errs, flags); if (errs && text->alt) x = render_text(page, pdata, ldata, x, y, text->alt, NULL, xr, shortfall, nspaces, nspace, keywords, idx, conf); else x = render_string(page, pdata->fonts[findex], pdata->sizes[findex], x, y, str, flags); if (*xr) (*xr)->rx = x; nextword: text = text->next; } return x; } /* * Returns the last x position used on the line. */ static int render_line(line_data *ldata, int left_x, int top_y, xref_dest *dest, keywordlist *keywords, indexdata *idx, paper_conf *conf) { int nspace; xref *xr; int ret = 0; if (ldata->aux_text) { int x; xr = NULL; nspace = 0; x = render_text(ldata->page, ldata->pdata, ldata, left_x + ldata->aux_left_indent, top_y - ldata->ypos, ldata->aux_text, NULL, &xr, 0, 0, &nspace, keywords, idx, conf); if (ldata->aux_text_2) render_text(ldata->page, ldata->pdata, ldata, x, top_y - ldata->ypos, ldata->aux_text_2, NULL, &xr, 0, 0, &nspace, keywords, idx, conf); } nspace = 0; if (ldata->first) { /* * There might be a cross-reference carried over from a * previous line. */ if (dest->type != NONE) { xr = snew(xref); xr->next = NULL; xr->dest = *dest; /* structure copy */ if (ldata->page->last_xref) ldata->page->last_xref->next = xr; else ldata->page->first_xref = xr; ldata->page->last_xref = xr; xr->lx = xr->rx = left_x + ldata->xpos; xr->by = top_y - ldata->ypos; xr->ty = top_y - ldata->ypos + ldata->line_height; } else xr = NULL; { int extra_indent, shortfall, spaces; int just = ldata->pdata->justification; /* * All forms of justification become JUST when we have * to squeeze the paragraph. */ if (ldata->hshortfall < 0) just = JUST; switch (just) { case JUST: shortfall = ldata->hshortfall; spaces = ldata->nspaces; extra_indent = 0; break; case LEFT: shortfall = spaces = extra_indent = 0; break; case RIGHT: shortfall = spaces = 0; extra_indent = ldata->real_shortfall; break; } ret = render_text(ldata->page, ldata->pdata, ldata, left_x + ldata->xpos + extra_indent, top_y - ldata->ypos, ldata->first, ldata->end, &xr, shortfall, spaces, &nspace, keywords, idx, conf); } if (xr) { /* * There's a cross-reference continued on to the next line. */ *dest = xr->dest; } else dest->type = NONE; } return ret; } static void render_para(para_data *pdata, paper_conf *conf, keywordlist *keywords, indexdata *idx, paragraph *index_placeholder, page_data *index_page) { int last_x; xref *cxref; page_data *cxref_page; xref_dest dest; para_data *target; line_data *ldata; dest.type = NONE; cxref = NULL; cxref_page = NULL; for (ldata = pdata->first; ldata; ldata = ldata->next) { /* * If this is a contents entry, we expect to have a single * enormous cross-reference rectangle covering the whole * thing. (Unless, of course, it spans multiple pages.) */ if (pdata->contents_entry && ldata->page != cxref_page) { cxref_page = ldata->page; cxref = snew(xref); cxref->next = NULL; cxref->dest.type = PAGE; if (pdata->contents_entry == index_placeholder) { cxref->dest.page = index_page; } else { assert(pdata->contents_entry->private_data); target = (para_data *)pdata->contents_entry->private_data; cxref->dest.page = target->first->page; } cxref->dest.url = NULL; if (ldata->page->last_xref) ldata->page->last_xref->next = cxref; else ldata->page->first_xref = cxref; ldata->page->last_xref = cxref; cxref->lx = conf->left_margin; cxref->rx = conf->paper_width - conf->right_margin; cxref->ty = conf->paper_height - conf->top_margin - ldata->ypos + ldata->line_height; } if (pdata->contents_entry) { assert(cxref != NULL); cxref->by = conf->paper_height - conf->top_margin - ldata->ypos; } last_x = render_line(ldata, conf->left_margin, conf->paper_height - conf->top_margin, &dest, keywords, idx, conf); if (ldata == pdata->last) break; } /* * If this is a contents entry, add leaders and a page * number. */ if (pdata->contents_entry) { word *w; wchar_t *num; int wid; int x; if (pdata->contents_entry == index_placeholder) { num = index_page->number; } else { assert(pdata->contents_entry->private_data); target = (para_data *)pdata->contents_entry->private_data; num = target->first->page->number; } w = fake_word(num); wid = paper_width_simple(pdata, w, conf); sfree(w); for (x = 0; x < conf->base_width; x += conf->leader_separation) if (x - conf->leader_separation > last_x - conf->left_margin && x + conf->leader_separation < conf->base_width - wid) render_string(pdata->last->page, pdata->fonts[FONT_NORMAL], pdata->sizes[FONT_NORMAL], conf->left_margin + x, (conf->paper_height - conf->top_margin - pdata->last->ypos), L".", 0); render_string(pdata->last->page, pdata->fonts[FONT_NORMAL], pdata->sizes[FONT_NORMAL], conf->paper_width - conf->right_margin - wid, (conf->paper_height - conf->top_margin - pdata->last->ypos), num, 0); } /* * Render any rectangle (chapter title underline or rule) * that goes with this paragraph. */ switch (pdata->rect_type) { case RECT_CHAPTER_UNDERLINE: add_rect_to_page(pdata->last->page, conf->left_margin, (conf->paper_height - conf->top_margin - pdata->last->ypos - conf->chapter_underline_depth), conf->base_width, conf->chapter_underline_thickness); break; case RECT_RULE: add_rect_to_page(pdata->first->page, conf->left_margin + pdata->first->xpos, (conf->paper_height - conf->top_margin - pdata->last->ypos - pdata->last->line_height), conf->base_width - pdata->first->xpos, pdata->last->line_height); break; default: /* placate gcc */ break; } } static para_data *code_paragraph(int indent, word *words, paper_conf *conf) { para_data *pdata = snew(para_data); /* * For code paragraphs, I'm going to hack grievously and * pretend the three normal fonts are the three code paragraph * fonts. */ setfont(pdata, &conf->fcode); pdata->first = pdata->last = NULL; pdata->outline_level = -1; pdata->rect_type = RECT_NONE; pdata->contents_entry = NULL; pdata->justification = LEFT; pdata->extraflags = RS_NOLIG; for (; words; words = words->next) { wchar_t *t, *e, *start; word *lhead = NULL, *ltail = NULL, *w; line_data *ldata; int prev = -1, curr; t = words->text; if (words->next && words->next->type == word_Emph) { e = words->next->text; words = words->next; } else e = NULL; start = t; while (*start) { while (*t) { if (!e || !*e) curr = 0; else if (*e == L'i') curr = 1; else if (*e == L'b') curr = 2; else curr = 0; if (prev < 0) prev = curr; if (curr != prev) break; t++; if (e && *e) e++; } /* * We've isolated a maximal subsequence of the line * which has the same emphasis. Form it into a word * structure. */ w = snew(word); w->next = NULL; w->alt = NULL; w->type = (prev == 0 ? word_WeakCode : prev == 1 ? word_Emph : word_Normal); w->text = snewn(t-start+1, wchar_t); memcpy(w->text, start, (t-start) * sizeof(wchar_t)); w->text[t-start] = '\0'; w->breaks = FALSE; if (ltail) ltail->next = w; else lhead = w; ltail = w; start = t; prev = -1; } ldata = snew(line_data); ldata->pdata = pdata; ldata->first = lhead; ldata->end = NULL; ldata->line_height = conf->fcode.font_size * UNITS_PER_PT; ldata->xpos = indent; if (pdata->last) { pdata->last->next = ldata; ldata->prev = pdata->last; } else { pdata->first = ldata; ldata->prev = NULL; } ldata->next = NULL; pdata->last = ldata; ldata->hshortfall = 0; ldata->nspaces = 0; ldata->aux_text = NULL; ldata->aux_text_2 = NULL; ldata->aux_left_indent = 0; /* General opprobrium for breaking in a code paragraph. */ ldata->penalty_before = ldata->penalty_after = 50000; } standard_line_spacing(pdata, conf); return pdata; } static para_data *rule_paragraph(int indent, paper_conf *conf) { para_data *pdata = snew(para_data); line_data *ldata; ldata = snew(line_data); ldata->pdata = pdata; ldata->first = NULL; ldata->end = NULL; ldata->line_height = conf->rule_thickness; ldata->xpos = indent; ldata->prev = NULL; ldata->next = NULL; ldata->hshortfall = 0; ldata->nspaces = 0; ldata->aux_text = NULL; ldata->aux_text_2 = NULL; ldata->aux_left_indent = 0; /* * Better to break after a rule than before it */ ldata->penalty_after += 100000; ldata->penalty_before += -100000; pdata->first = pdata->last = ldata; pdata->outline_level = -1; pdata->rect_type = RECT_RULE; pdata->contents_entry = NULL; pdata->justification = LEFT; pdata->extraflags = 0; standard_line_spacing(pdata, conf); return pdata; } /* * Plain-text-like formatting for outline titles. */ static void paper_rdaddw(rdstring *rs, word *text) { for (; text; text = text->next) switch (text->type) { case word_HyperLink: case word_HyperEnd: case word_UpperXref: case word_LowerXref: case word_XrefEnd: case word_IndexRef: break; case word_Normal: case word_Emph: case word_Strong: case word_Code: case word_WeakCode: case word_WhiteSpace: case word_EmphSpace: case word_StrongSpace: case word_CodeSpace: case word_WkCodeSpace: case word_Quote: case word_EmphQuote: case word_StrongQuote: case word_CodeQuote: case word_WkCodeQuote: assert(text->type != word_CodeQuote && text->type != word_WkCodeQuote); if (towordstyle(text->type) == word_Emph && (attraux(text->aux) == attr_First || attraux(text->aux) == attr_Only)) rdadd(rs, L'_'); /* FIXME: configurability */ else if (towordstyle(text->type) == word_Strong && (attraux(text->aux) == attr_First || attraux(text->aux) == attr_Only)) rdadd(rs, L'*'); /* FIXME: configurability */ else if (towordstyle(text->type) == word_Code && (attraux(text->aux) == attr_First || attraux(text->aux) == attr_Only)) rdadd(rs, L'\''); /* FIXME: configurability */ if (removeattr(text->type) == word_Normal) { rdadds(rs, text->text); } else if (removeattr(text->type) == word_WhiteSpace) { rdadd(rs, L' '); } else if (removeattr(text->type) == word_Quote) { rdadd(rs, L'\''); /* fixme: configurability */ } if (towordstyle(text->type) == word_Emph && (attraux(text->aux) == attr_Last || attraux(text->aux) == attr_Only)) rdadd(rs, L'_'); /* FIXME: configurability */ else if (towordstyle(text->type) == word_Strong && (attraux(text->aux) == attr_Last || attraux(text->aux) == attr_Only)) rdadd(rs, L'*'); /* FIXME: configurability */ else if (towordstyle(text->type) == word_Code && (attraux(text->aux) == attr_Last || attraux(text->aux) == attr_Only)) rdadd(rs, L'\''); /* FIXME: configurability */ break; } } static wchar_t *prepare_outline_title(word *first, wchar_t *separator, word *second) { rdstring rs = {0, 0, NULL}; if (first) paper_rdaddw(&rs, first); if (separator) rdadds(&rs, separator); if (second) paper_rdaddw(&rs, second); return rs.text; } static word *fake_word(wchar_t *text) { word *ret = snew(word); ret->next = NULL; ret->alt = NULL; ret->type = word_Normal; ret->text = ustrdup(text); ret->breaks = FALSE; ret->aux = 0; return ret; } static word *fake_space_word(void) { word *ret = snew(word); ret->next = NULL; ret->alt = NULL; ret->type = word_WhiteSpace; ret->text = NULL; ret->breaks = TRUE; ret->aux = 0; return ret; } static word *fake_page_ref(page_data *page) { word *ret = snew(word); ret->next = NULL; ret->alt = NULL; ret->type = word_PageXref; ret->text = NULL; ret->breaks = FALSE; ret->aux = 0; ret->private_data = page; return ret; } static word *fake_end_ref(void) { word *ret = snew(word); ret->next = NULL; ret->alt = NULL; ret->type = word_XrefEnd; ret->text = NULL; ret->breaks = FALSE; ret->aux = 0; return ret; } static word *prepare_contents_title(word *first, wchar_t *separator, word *second) { word *ret; word **wptr, *w; wptr = &ret; if (first) { w = dup_word_list(first); *wptr = w; while (w->next) w = w->next; wptr = &w->next; } if (separator) { w = fake_word(separator); *wptr = w; wptr = &w->next; } if (second) { *wptr = dup_word_list(second); } return ret; } static void fold_into_page(page_data *dest, page_data *src, int right_shift) { line_data *ldata; if (!src->first_line) return; if (dest->last_line) { dest->last_line->next = src->first_line; src->first_line->prev = dest->last_line; } dest->last_line = src->last_line; for (ldata = src->first_line; ldata; ldata = ldata->next) { ldata->page = dest; ldata->xpos += right_shift; if (ldata == src->last_line) break; } } ������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/bk_pdf.c��������������������������������������������������������������������������������0000644�0001753�0001753�00000063562�12444773746�011361� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * PDF backend for Halibut */ #include <assert.h> #include "halibut.h" #include "paper.h" #include "deflate.h" #define TREE_BRANCH 8 /* max branching factor in page tree */ paragraph *pdf_config_filename(char *filename) { return cmdline_cfg_simple("pdf-filename", filename, NULL); } struct object_Tag { objlist *list; object *next; int number; rdstringc main, stream; int size, fileoff; char *final; }; struct objlist_Tag { int number; object *head, *tail; }; static void pdf_string(void (*add)(object *, char const *), object *, char const *); static void pdf_string_len(void (*add)(object *, char const *), object *, char const *, int); static void objref(object *o, object *dest); static void objdest(object *o, page_data *p); static int is_std_font(char const *name); static void make_pages_node(object *node, object *parent, page_data *first, page_data *last, object *resources, object *mediabox); static int make_outline(object *parent, outline_element *start, int n, int open); static int pdf_versionid(FILE *fp, word *words); void pdf_backend(paragraph *sourceform, keywordlist *keywords, indexdata *idx, void *vdoc) { document *doc = (document *)vdoc; int font_index; font_encoding *fe; page_data *page; FILE *fp; char *filename; paragraph *p; objlist olist; object *o, *info, *cat, *outlines, *pages, *resources, *mediabox; int fileoff; IGNORE(keywords); IGNORE(idx); filename = dupstr("output.pdf"); for (p = sourceform; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"pdf-filename")) { sfree(filename); filename = dupstr(adv(p->origkeyword)); } } } olist.head = olist.tail = NULL; olist.number = 1; { char buf[256]; info = new_object(&olist); objtext(info, "<<\n"); if (doc->n_outline_elements > 0) { char *title; int titlelen; title = pdf_outline_convert(doc->outline_elements->pdata->outline_title, &titlelen); objtext(info, "/Title "); pdf_string_len(objtext, info, title, titlelen); sfree(title); objtext(info, "\n"); } objtext(info, "/Producer "); sprintf(buf, "Halibut, %s", version); pdf_string(objtext, info, buf); objtext(info, "\n>>\n"); } cat = new_object(&olist); if (doc->n_outline_elements > 0) outlines = new_object(&olist); else outlines = NULL; pages = new_object(&olist); resources = new_object(&olist); /* * The catalogue just contains references to the outlines and * pages objects, and the pagelabels dictionary. */ objtext(cat, "<<\n/Type /Catalog"); if (outlines) { objtext(cat, "\n/Outlines "); objref(cat, outlines); } objtext(cat, "\n/Pages "); objref(cat, pages); /* Halibut just numbers pages 1, 2, 3, ... */ objtext(cat, "\n/PageLabels<</Nums[0<</S/D>>]>>"); if (outlines) objtext(cat, "\n/PageMode /UseOutlines"); objtext(cat, "\n>>\n"); /* * Set up the resources dictionary, which mostly means * providing all the font objects and names to call them by. */ font_index = 0; objtext(resources, "<<\n/ProcSet [/PDF/Text]\n/Font <<\n"); for (fe = doc->fonts->head; fe; fe = fe->next) { char fname[40]; char buf[80]; int i, prev; object *font, *fontdesc; int flags; font_info const *fi = fe->font->info; sprintf(fname, "f%d", font_index++); fe->name = dupstr(fname); font = new_object(&olist); objtext(resources, "/"); objtext(resources, fe->name); objtext(resources, " "); objref(resources, font); objtext(resources, "\n"); /* * Construct those parts of the font descriptor that don't dependd * on the file format. */ if (!is_std_font(fe->font->info->name)) { fontdesc = new_object(&olist); #define FF_FIXEDPITCH 0x00000001 #define FF_SERIF 0x00000002 #define FF_SYMBOLIC 0x00000004 #define FF_SCRIPT 0x00000008 #define FF_NONSYMBOLIC 0x00000020 #define FF_ITALIC 0x00000040 #define FF_ALLCAP 0x00010000 #define FF_SMALLCAP 0x00020000 #define FF_FORCEBOLD 0x00040000 objtext(fontdesc, "<<\n/Type /FontDescriptor\n/Name /"); objtext(fontdesc, fi->name); flags = 0; if (fi->italicangle) flags |= FF_ITALIC; flags |= FF_NONSYMBOLIC; sprintf(buf, "\n/Flags %d\n", flags); objtext(fontdesc, buf); sprintf(buf, "/FontBBox [%g %g %g %g]\n", fi->fontbbox[0], fi->fontbbox[1], fi->fontbbox[2], fi->fontbbox[3]); objtext(fontdesc, buf); sprintf(buf, "/ItalicAngle %g\n", fi->italicangle); objtext(fontdesc, buf); sprintf(buf, "/Ascent %g\n", fi->ascent); objtext(fontdesc, buf); sprintf(buf, "/Descent %g\n", fi->descent); objtext(fontdesc, buf); sprintf(buf, "/CapHeight %g\n", fi->capheight); objtext(fontdesc, buf); sprintf(buf, "/XHeight %g\n", fi->xheight); objtext(fontdesc, buf); sprintf(buf, "/StemH %g\n", fi->stemh); objtext(fontdesc, buf); sprintf(buf, "/StemV %g\n", fi->stemv); objtext(fontdesc, buf); } objtext(font, "<<\n/Type /Font\n/BaseFont /"); objtext(font, fe->font->info->name); if (fe->font->info->filetype == TRUETYPE) { object *cidfont = new_object(&olist); object *cmap = new_object(&olist); unsigned short ranges[256]; unsigned startidx, nranges, nchars; int start; objtext(font, "/Subtype/Type0\n/Encoding "); objtext(cmap, "<</Type/CMap\n/CMapName/"); objtext(cmap, fe->name); objtext(cmap, "\n/CIDSystemInfo<</Registry(Adobe)" "/Ordering(Identity)/Supplement 0>>\n"); objstream(cmap, "%!PS-Adobe-3.0 Resource-CMap\n" "%%DocumentNeededResources: procset CIDInit\n" "%%IncludeResource: procset CIDInit\n" "%%BeginResource: CMap "); objstream(cmap, fe->name); objstream(cmap, "\n%%Title ("); objstream(cmap, fe->name); objstream(cmap, " Adobe Identity 0)\n%%Version: 1\n%%EndComments\n"); objstream(cmap, "/CIDInit/ProcSet findresource begin\n"); objstream(cmap, "12 dict begin begincmap\n"); objstream(cmap, "/CIDSystemInfo 3 dict dup begin\n" "/Registry(Adobe)def/Ordering(Identity)def" "/Supplement 0 def end def\n"); objstream(cmap, "/CMapName/"); objstream(cmap, fe->name); objstream(cmap, " def/CMapType 0 def/WMode 0 def\n"); objstream(cmap, "1 begincodespacerange<00><FF>" "endcodespacerange\n"); start = -1; nranges = nchars = 0; for (i = 0; i < 256; i++) { unsigned idx; ranges[i] = 0; if (fe->vector[i] == NOGLYPH) continue; idx = sfnt_glyphtoindex(fe->font->info->fontfile, fe->vector[i]); if (start >= 0 && idx - startidx == (unsigned)(i - start)) { if (ranges[start] == 1) { nranges++; nchars--; } ranges[start] = i - start + 1; } else { ranges[i] = 1; start = i; startidx = idx; nchars++; } } i = 0; while (nranges) { unsigned blk = nranges > 100 ? 100 : nranges; nranges -= blk; sprintf(buf, "%u ", blk); objstream(cmap, buf); objstream(cmap, "begincidrange\n"); while (blk) { if (ranges[i] > 1) { sprintf(buf, "<%02X>", i); objstream(cmap, buf); sprintf(buf, "<%02X>", i + ranges[i] - 1); objstream(cmap, buf); sprintf(buf, "%hu\n", (unsigned short) sfnt_glyphtoindex(fe->font->info->fontfile, fe->vector[i])); objstream(cmap, buf); blk--; } i++; } objstream(cmap, "endcidrange\n"); } i = 0; while (nchars) { unsigned blk = nchars > 100 ? 100 : nchars; nchars -= blk; sprintf(buf, "%u ", blk); objstream(cmap, buf); objstream(cmap, "begincidchar\n"); while (blk) { if (ranges[i] == 1) { sprintf(buf, "<%02X>", i); objstream(cmap, buf); sprintf(buf, "%hu\n", (unsigned short) sfnt_glyphtoindex(fe->font->info->fontfile, fe->vector[i])); objstream(cmap, buf); blk--; } i++; } objstream(cmap, "endcidchar\n"); } objstream(cmap, "endcmap CMapName currentdict /CMap " "defineresource pop end end\n%%EndResource\n%%EOF\n"); objref(font, cmap); objtext(font, "\n/DescendantFonts["); objref(font, cidfont); objtext(font, "]\n"); objtext(cidfont, "<<\n/Type/Font\n/Subtype/CIDFontType2\n" "/BaseFont/"); objtext(cidfont, fe->font->info->name); objtext(cidfont, "\n/CIDSystemInfo<</Registry(Adobe)" "/Ordering(Identity)/Supplement 0>>\n"); objtext(cidfont, "/FontDescriptor "); objref(cidfont, fontdesc); objtext(cidfont, "\n/W[0["); for (i = 0; i < (int)sfnt_nglyphs(fe->font->info->fontfile); i++) { char buf[20]; double width; width = find_width(fe->font, sfnt_indextoglyph(fe->font->info->fontfile, i)); sprintf(buf, "%g ", 1000.0 * width / FUNITS_PER_PT); objtext(cidfont, buf); } objtext(cidfont, "]]>>\n"); } else { objtext(font, "/Subtype /Type1\n"); objtext(font, "\n/Encoding <<\n/Type /Encoding\n/Differences ["); for (i = 0; i < 256; i++) { char buf[20]; if (fe->vector[i] == NOGLYPH) continue; if (i != prev + 1) { sprintf(buf, "\n%d", i); objtext(font, buf); } objtext(font, i % 8 ? "/" : "\n/"); objtext(font, glyph_extern(fe->vector[i])); prev = i; } objtext(font, "\n]\n>>\n"); if (!is_std_font(fe->font->info->name)){ object *widths = new_object(&olist); int firstchar = -1, lastchar = -1; for (i = 0; i < 256; i++) if (fe->vector[i] != NOGLYPH) { if (firstchar < 0) firstchar = i; lastchar = i; } sprintf(buf, "/FirstChar %d\n/LastChar %d\n/Widths ", firstchar, lastchar); objtext(font, buf); objref(font, widths); objtext(font, "\n"); objtext(widths, "[\n"); for (i = firstchar; i <= lastchar; i++) { double width; if (fe->vector[i] == NOGLYPH) width = 0.0; else width = find_width(fe->font, fe->vector[i]); sprintf(buf, "%g\n", 1000.0 * width / FUNITS_PER_PT); objtext(widths, buf); } objtext(widths, "]\n"); objtext(font, "/FontDescriptor "); objref(font, fontdesc); } } if (!is_std_font(fe->font->info->name)) { if (fi->fontfile && fi->filetype == TYPE1) { object *fontfile = new_object(&olist); size_t len; char *ffbuf; pf_part1((font_info *)fi, &ffbuf, &len); objstream_len(fontfile, ffbuf, len); sfree(ffbuf); sprintf(buf, "<<\n/Length1 %lu\n", (unsigned long)len); objtext(fontfile, buf); pf_part2((font_info *)fi, &ffbuf, &len); objstream_len(fontfile, ffbuf, len); sfree(ffbuf); sprintf(buf, "/Length2 %lu\n", (unsigned long)len); objtext(fontfile, buf); objtext(fontfile, "/Length3 0\n"); objtext(fontdesc, "/FontFile "); objref(fontdesc, fontfile); } else if (fi->fontfile && fi->filetype == TRUETYPE) { object *fontfile = new_object(&olist); size_t len; char *ffbuf; sfnt_data((font_info *)fi, &ffbuf, &len); objstream_len(fontfile, ffbuf, len); sprintf(buf, "<<\n/Length1 %lu\n", (unsigned long)len); objtext(fontfile, buf); objtext(fontdesc, "/FontFile2 "); objref(fontdesc, fontfile); } objtext(fontdesc, "\n>>\n"); } objtext(font, "\n>>\n"); } objtext(resources, ">>\n>>\n"); { char buf[255]; mediabox = new_object(&olist); sprintf(buf, "[0 0 %g %g]\n", doc->paper_width / FUNITS_PER_PT, doc->paper_height / FUNITS_PER_PT); objtext(mediabox, buf); } /* * Define the page objects for each page, and get each one * ready to have a `Parent' specification added to it. */ for (page = doc->pages; page; page = page->next) { object *opage; opage = new_object(&olist); page->spare = opage; objtext(opage, "<<\n/Type /Page\n"); } /* * Recursively build the page tree. */ make_pages_node(pages, NULL, doc->pages, NULL, resources, mediabox); /* * Create and render the individual pages. */ for (page = doc->pages; page; page = page->next) { object *opage, *cstr; rect *r; text_fragment *frag, *frag_end; char buf[256]; int x, y, lx, ly; opage = (object *)page->spare; /* * At this point the page dictionary is already * half-written, with /Type and /Parent already present. We * continue from there. */ /* * The PDF spec says /Resources is required, but also says * that it's inheritable and may be omitted if it's present * in a Pages node. In our case it is: it's present in the * topmost /Pages node because we carefully put it there. * So we don't need a /Resources entry here. The same applies * to /MediaBox. */ /* * Now we're ready to define a content stream containing * the actual text on the page. */ cstr = new_object(&olist); objtext(opage, "/Contents "); objref(opage, cstr); objtext(opage, "\n"); /* * Render any rectangles on the page. */ for (r = page->first_rect; r; r = r->next) { char buf[512]; sprintf(buf, "%g %g %g %g re f\n", r->x / FUNITS_PER_PT, r->y / FUNITS_PER_PT, r->w / FUNITS_PER_PT, r->h / FUNITS_PER_PT); objstream(cstr, buf); } objstream(cstr, "BT\n"); /* * PDF tracks two separate current positions: the position * given in the `line matrix' and the position given in the * `text matrix'. We must therefore track both as well. * They start off at -1 (unset). */ lx = ly = -1; x = y = -1; frag = page->first_text; while (frag) { /* * For compactness, I'm going to group text fragments * into subsequences that use the same font+size. So * first find the end of this subsequence. */ for (frag_end = frag; (frag_end && frag_end->fe == frag->fe && frag_end->fontsize == frag->fontsize); frag_end = frag_end->next); /* * Now select the text fragment, and prepare to display * the text. */ objstream(cstr, "/"); objstream(cstr, frag->fe->name); sprintf(buf, " %d Tf ", frag->fontsize); objstream(cstr, buf); while (frag && frag != frag_end) { /* * Place the text position for the first piece of * text. */ if (lx < 0) { sprintf(buf, "1 0 0 1 %g %g Tm ", frag->x/FUNITS_PER_PT, frag->y/FUNITS_PER_PT); } else { sprintf(buf, "%g %g Td ", (frag->x - lx)/FUNITS_PER_PT, (frag->y - ly)/FUNITS_PER_PT); } objstream(cstr, buf); lx = x = frag->x; ly = y = frag->y; /* * See if we're going to use Tj (show a single * string) or TJ (show an array of strings with * x-spacings between them). We determine this by * seeing if there's more than one text fragment in * sequence with the same y-coordinate. */ if (frag->next && frag->next != frag_end && frag->next->y == y) { /* * The TJ strategy. */ objstream(cstr, "["); while (frag && frag != frag_end && frag->y == y) { if (frag->x != x) { sprintf(buf, "%g", (x - frag->x) * 1000.0 / (FUNITS_PER_PT * frag->fontsize)); objstream(cstr, buf); } pdf_string(objstream, cstr, frag->text); x = frag->x + frag->width; frag = frag->next; } objstream(cstr, "]TJ\n"); } else { /* * The Tj strategy. */ pdf_string(objstream, cstr, frag->text); objstream(cstr, "Tj\n"); frag = frag->next; } } } objstream(cstr, "ET"); /* * Also, we want an annotation dictionary containing the * cross-references from this page. */ if (page->first_xref) { xref *xr; objtext(opage, "/Annots [\n"); for (xr = page->first_xref; xr; xr = xr->next) { char buf[256]; objtext(opage, "<</Subtype/Link\n/Rect["); sprintf(buf, "%g %g %g %g", xr->lx / FUNITS_PER_PT, xr->by / FUNITS_PER_PT, xr->rx / FUNITS_PER_PT, xr->ty / FUNITS_PER_PT); objtext(opage, buf); objtext(opage, "]/Border[0 0 0]\n"); if (xr->dest.type == PAGE) { objtext(opage, "/Dest"); objdest(opage, xr->dest.page); } else { objtext(opage, "/A<</S/URI/URI"); pdf_string(objtext, opage, xr->dest.url); objtext(opage, ">>"); } objtext(opage, ">>\n"); } objtext(opage, "]\n"); } objtext(opage, ">>\n"); } /* * Set up the outlines dictionary. */ if (outlines) { int topcount; char buf[80]; objtext(outlines, "<<\n/Type /Outlines\n"); topcount = make_outline(outlines, doc->outline_elements, doc->n_outline_elements, TRUE); sprintf(buf, "/Count %d\n>>\n", topcount); objtext(outlines, buf); } /* * Assemble the final linear form of every object. */ for (o = olist.head; o; o = o->next) { rdstringc rs = {0, 0, NULL}; char text[80]; deflate_compress_ctx *zcontext; void *zbuf; int zlen; sprintf(text, "%d 0 obj\n", o->number); rdaddsc(&rs, text); if (o->stream.text) { if (!o->main.text) rdaddsc(&o->main, "<<\n"); #ifdef PDF_NOCOMPRESS zlen = o->stream.pos; zbuf = snewn(zlen, char); memcpy(zbuf, o->stream.text, zlen); sprintf(text, "/Length %d\n>>\n", zlen); #else zcontext = deflate_compress_new(DEFLATE_TYPE_ZLIB); deflate_compress_data(zcontext, o->stream.text, o->stream.pos, DEFLATE_END_OF_DATA, &zbuf, &zlen); deflate_compress_free(zcontext); sprintf(text, "/Filter/FlateDecode\n/Length %d\n>>\n", zlen); #endif rdaddsc(&o->main, text); } assert(o->main.text); rdaddsc(&rs, o->main.text); sfree(o->main.text); if (rs.text[rs.pos-1] != '\n') rdaddc(&rs, '\n'); if (o->stream.text) { rdaddsc(&rs, "stream\n"); rdaddsn(&rs, zbuf, zlen); rdaddsc(&rs, "\nendstream\n"); sfree(o->stream.text); sfree(zbuf); } rdaddsc(&rs, "endobj\n"); o->final = rs.text; o->size = rs.pos; } /* * Write out the PDF file. */ if (!strcmp(filename, "-")) fp = stdout; else fp = fopen(filename, "wb"); if (!fp) { err_cantopenw(filename); return; } /* * Header. I'm going to put the version IDs in the header as * well, simply in PDF comments. The PDF Reference also suggests * that binary PDF files contain four top-bit-set characters in * the second line. */ fileoff = fprintf(fp, "%%PDF-1.3\n%% L\xc3\xba\xc3\xb0""a\n"); for (p = sourceform; p; p = p->next) if (p->type == para_VersionID) fileoff += pdf_versionid(fp, p->words); /* * Body */ for (o = olist.head; o; o = o->next) { o->fileoff = fileoff; fwrite(o->final, 1, o->size, fp); fileoff += o->size; } /* * Cross-reference table */ fprintf(fp, "xref\n"); assert(olist.head->number == 1); fprintf(fp, "0 %d\n", olist.tail->number + 1); fprintf(fp, "0000000000 65535 f \n"); for (o = olist.head; o; o = o->next) { char entry[40]; sprintf(entry, "%010d 00000 n \n", o->fileoff); assert(strlen(entry) == 20); fputs(entry, fp); } /* * Trailer */ fprintf(fp, "trailer\n<<\n/Size %d\n/Root %d 0 R\n/Info %d 0 R\n>>\n", olist.tail->number + 1, cat->number, info->number); fprintf(fp, "startxref\n%d\n%%%%EOF\n", fileoff); if (fp != stdout) fclose(fp); sfree(filename); } object *new_object(objlist *list) { object *obj = snew(object); obj->list = list; obj->main.text = NULL; obj->main.pos = obj->main.size = 0; obj->stream.text = NULL; obj->stream.pos = obj->stream.size = 0; obj->number = list->number++; obj->next = NULL; if (list->tail) list->tail->next = obj; else list->head = obj; list->tail = obj; obj->size = 0; obj->final = NULL; return obj; } void objtext(object *o, char const *text) { rdaddsc(&o->main, text); } void objstream_len(object *o, char const *text, size_t len) { rdaddsn(&o->stream, text, len); } void objstream(object *o, char const *text) { rdaddsc(&o->stream, text); } static void objref(object *o, object *dest) { char buf[40]; sprintf(buf, "%d 0 R", dest->number); rdaddsc(&o->main, buf); } static void objdest(object *o, page_data *p) { objtext(o, "["); objref(o, (object *)p->spare); objtext(o, "/XYZ null null null]"); } static char const * const stdfonts[] = { "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic", "Helvetica", "Helvetica-Bold", "Helvetica-Oblique","Helvetica-BoldOblique", "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique", "Symbol", "ZapfDingbats" }; static int is_std_font(char const *name) { unsigned i; for (i = 0; i < lenof(stdfonts); i++) if (strcmp(name, stdfonts[i]) == 0) return TRUE; return FALSE; } static void make_pages_node(object *node, object *parent, page_data *first, page_data *last, object *resources, object *mediabox) { int count; page_data *page; char buf[80]; objtext(node, "<<\n/Type /Pages\n"); if (parent) { objtext(node, "/Parent "); objref(node, parent); objtext(node, "\n"); } /* * Count the pages in this stretch, to see if there are few * enough to reference directly. */ count = 0; for (page = first; page; page = page->next) { count++; if (page == last) break; } sprintf(buf, "/Count %d\n/Kids [\n", count); objtext(node, buf); if (count > TREE_BRANCH) { int i; page_data *thisfirst, *thislast; page = first; for (i = 0; i < TREE_BRANCH; i++) { int number = (i+1) * count / TREE_BRANCH - i * count / TREE_BRANCH; thisfirst = page; while (number--) { thislast = page; page = page->next; } if (thisfirst == thislast) { objref(node, (object *)thisfirst->spare); objtext((object *)thisfirst->spare, "/Parent "); objref((object *)thisfirst->spare, node); objtext((object *)thisfirst->spare, "\n"); } else { object *newnode = new_object(node->list); make_pages_node(newnode, node, thisfirst, thislast, NULL, NULL); objref(node, newnode); } objtext(node, "\n"); } assert(thislast == last || page == NULL); } else { for (page = first; page; page = page->next) { objref(node, (object *)page->spare); objtext(node, "\n"); objtext((object *)page->spare, "/Parent "); objref((object *)page->spare, node); objtext((object *)page->spare, "\n"); if (page == last) break; } } objtext(node, "]\n"); if (resources) { objtext(node, "/Resources "); objref(node, resources); objtext(node, "\n"); } if (mediabox) { objtext(node, "/MediaBox "); objref(node, mediabox); objtext(node, "\n"); } objtext(node, ">>\n"); } /* * In text on the page, PDF uses the PostScript font model, which * means that glyphs are identified by PS strings and hence font * encoding can be managed independently of the supplied encoding * of the font. However, in the document outline, the PDF spec * encodes in either PDFDocEncoding (a custom superset of * ISO-8859-1) or UTF-16BE. */ char *pdf_outline_convert(wchar_t *s, int *len) { char *ret; ret = utoa_careful_dup(s, CS_PDF); /* * Very silly special case: if the returned string begins with * FE FF, then the PDF reader will mistake it for a UTF-16BE * string. So in this case we give up on PDFDocEncoding and * encode it in UTF-16 straight away. */ if (ret && ret[0] == '\xFE' && ret[1] == '\xFF') { sfree(ret); ret = NULL; } if (!ret) { ret = utoa_dup_len(s, CS_UTF16BE, len); } else { *len = strlen(ret); } return ret; } static int make_outline(object *parent, outline_element *items, int n, int open) { int level, totalcount = 0; outline_element *itemp; object *curr, *prev = NULL, *first = NULL, *last = NULL; assert(n > 0); level = items->level; while (n > 0) { char *title; int titlelen; /* * Here we expect to be sitting on an item at the given * level. So we start by constructing an outline entry for * that item. */ assert(items->level == level); title = pdf_outline_convert(items->pdata->outline_title, &titlelen); totalcount++; curr = new_object(parent->list); if (!first) first = curr; last = curr; objtext(curr, "<<\n/Title "); pdf_string_len(objtext, curr, title, titlelen); sfree(title); objtext(curr, "\n/Parent "); objref(curr, parent); objtext(curr, "\n/Dest"); objdest(curr, items->pdata->first->page); objtext(curr, "\n"); if (prev) { objtext(curr, "/Prev "); objref(curr, prev); objtext(curr, "\n"); objtext(prev, "/Next "); objref(prev, curr); objtext(prev, "\n>>\n"); } prev = curr; items++, n--; for (itemp = items; itemp < items+n && itemp->level > level; itemp++); if (itemp > items) { char buf[80]; int count = make_outline(curr, items, itemp - items, FALSE); if (!open) count = -count; else totalcount += count; sprintf(buf, "/Count %d\n", count); objtext(curr, buf); } n -= itemp - items; items = itemp; } objtext(prev, ">>\n"); assert(first && last); objtext(parent, "/First "); objref(parent, first); objtext(parent, "\n/Last "); objref(parent, last); objtext(parent, "\n"); return totalcount; } static int pdf_versionid(FILE *fp, word *words) { int ret; ret = fprintf(fp, "%% "); for (; words; words = words->next) { char *text; int type; switch (words->type) { case word_HyperLink: case word_HyperEnd: case word_UpperXref: case word_LowerXref: case word_XrefEnd: case word_IndexRef: continue; } type = removeattr(words->type); switch (type) { case word_Normal: text = utoa_dup(words->text, CS_ASCII); break; case word_WhiteSpace: text = dupstr(" "); break; case word_Quote: text = dupstr("'"); break; } fputs(text, fp); ret += strlen(text); sfree(text); } ret += fprintf(fp, "\n"); return ret; } static void pdf_string_len(void (*add)(object *, char const *), object *o, char const *str, int len) { char const *p; add(o, "("); for (p = str; len > 0; p++, len--) { char c[10]; if (*p < ' ' || *p > '~') { sprintf(c, "\\%03o", 0xFF & (int)*p); } else { int n = 0; if (*p == '\\' || *p == '(' || *p == ')') c[n++] = '\\'; c[n++] = *p; c[n] = '\0'; } add(o, c); } add(o, ")"); } static void pdf_string(void (*add)(object *, char const *), object *o, char const *str) { pdf_string_len(add, o, str, strlen(str)); } ����������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/bk_ps.c���������������������������������������������������������������������������������0000644�0001753�0001753�00000026026�12444773746�011224� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * PostScript backend for Halibut */ #include <assert.h> #include <stdarg.h> #include "halibut.h" #include "paper.h" /* Ideal number of characters per line, for use in PostScript code */ #define PS_WIDTH 79 /* Absolute maxiumum characters per line, for use in DSC comments */ #define PS_MAXWIDTH 255 static void ps_comment(FILE *fp, char const *leader, word *words); static void ps_string_len(FILE *fp, int *cc, char const *str, int len); static void ps_string(FILE *fp, int *cc, char const *str); paragraph *ps_config_filename(char *filename) { return cmdline_cfg_simple("ps-filename", filename, NULL); } void ps_backend(paragraph *sourceform, keywordlist *keywords, indexdata *idx, void *vdoc) { document *doc = (document *)vdoc; int font_index; font_encoding *fe; page_data *page; int pageno; FILE *fp; char *filename; paragraph *p; outline_element *oe; int noe; int cc; /* Character count on current line */ IGNORE(keywords); IGNORE(idx); filename = dupstr("output.ps"); for (p = sourceform; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"ps-filename")) { sfree(filename); filename = dupstr(adv(p->origkeyword)); } } } if (!strcmp(filename, "-")) fp = stdout; else fp = fopen(filename, "w"); if (!fp) { err_cantopenw(filename); return; } fprintf(fp, "%%!PS-Adobe-3.0\n"); fprintf(fp, "%%%%Creator: Halibut, %s\n", version); fprintf(fp, "%%%%DocumentData: Clean7Bit\n"); fprintf(fp, "%%%%LanguageLevel: 1\n"); for (pageno = 0, page = doc->pages; page; page = page->next) pageno++; fprintf(fp, "%%%%Pages: %d\n", pageno); for (p = sourceform; p; p = p->next) if (p->type == para_Title) ps_comment(fp, "%%Title: ", p->words); fprintf(fp, "%%%%DocumentNeededResources:\n"); for (fe = doc->fonts->head; fe; fe = fe->next) /* XXX This may request the same font multiple times. */ if (!fe->font->info->fontfile) fprintf(fp, "%%%%+ font %s\n", fe->font->info->name); fprintf(fp, "%%%%DocumentSuppliedResources: procset Halibut 0 3\n"); for (fe = doc->fonts->head; fe; fe = fe->next) /* XXX This may request the same font multiple times. */ if (fe->font->info->fontfile) fprintf(fp, "%%%%+ font %s\n", fe->font->info->name); fprintf(fp, "%%%%EndComments\n"); fprintf(fp, "%%%%BeginProlog\n"); fprintf(fp, "%%%%BeginResource: procset Halibut 0 3\n"); /* * Supply a prologue function which allows a reasonably * compressed representation of the text on the pages. * * "t" expects two arguments: a y-coordinate, and then an array. * Elements of the array are processed sequentially as follows: * * - a number is treated as an x-coordinate * - an array is treated as a (font, size) pair * - a string is shown * * "r" takes four arguments, and behaves like "rectfill". */ fprintf(fp, "/tdict 4 dict dup begin\n" " /arraytype {aload pop scalefont setfont} bind def\n" " /realtype {1 index moveto} bind def\n" " /integertype /realtype load def\n" " /stringtype {show} bind def\n" "end def\n" "/t { tdict begin {dup type exec} forall end pop } bind def\n" "/r { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" " neg 0 rlineto closepath fill } bind def\n"); /* * pdfmark wrappers * * "p" generates a named destination referencing this page. * "x" generates a link to a named destination. * "u" generates a link to a URI. * "o" generates an outline entry. * "m" generates a general pdfmark. * * They all do nothing if pdfmark is undefined. */ fprintf(fp, "/pdfmark where { pop\n" " /p { [ /Dest 3 -1 roll /View [ /XYZ null null null ]\n" " /DEST pdfmark } bind def\n" " /x { [ /Dest 3 -1 roll /Rect 5 -1 roll /Border [0 0 0]\n" " /Subtype /Link /ANN pdfmark } bind def\n" " /u { 2 dict dup /Subtype /URI put dup /URI 4 -1 roll put\n" " [ /Action 3 -1 roll /Rect 5 -1 roll /Border [0 0 0]\n" " /Subtype /Link /ANN pdfmark } bind def\n" " /o { [ /Count 3 -1 roll /Dest 5 -1 roll /Title 7 -1 roll\n" " /OUT pdfmark } bind def\n" " /m /pdfmark load def\n" "}\n"); fprintf(fp, "{\n" " /p { pop } bind def\n" " /x { pop pop } bind def\n" " /u /x load def\n" " /o { pop pop pop } bind def\n" " /m /cleartomark load def\n" "} ifelse\n"); fprintf(fp, "%%%%EndResource\n"); fprintf(fp, "%%%%EndProlog\n"); fprintf(fp, "%%%%BeginSetup\n"); /* * Assign a destination name to each page for pdfmark purposes. */ pageno = 0; for (page = doc->pages; page; page = page->next) { char *buf; pageno++; buf = snewn(12, char); sprintf(buf, "/p%d", pageno); page->spare = buf; } /* * This is as good a place as any to put version IDs. */ for (p = sourceform; p; p = p->next) if (p->type == para_VersionID) ps_comment(fp, "% ", p->words); cc = 0; /* * Request the correct page size. We might want to bracket this * with "%%BeginFeature: *PageSize A4" or similar, and "%%EndFeature", * but that would require us to have a way of getting the name of * the page size given its dimensions. */ ps_token(fp, &cc, "/setpagedevice where {\n"); ps_token(fp, &cc, " pop 2 dict dup /PageSize [%g %g] put setpagedevice\n", doc->paper_width / FUNITS_PER_PT, doc->paper_height / FUNITS_PER_PT); ps_token(fp, &cc, "} if\n"); ps_token(fp, &cc, "[/PageMode/UseOutlines/DOCVIEW m\n"); noe = doc->n_outline_elements; for (oe = doc->outline_elements; noe; oe++, noe--) { char *title; int titlelen, count, i; title = pdf_outline_convert(oe->pdata->outline_title, &titlelen); if (oe->level == 0) { ps_token(fp, &cc, "[/Title"); ps_string_len(fp, &cc, title, titlelen); ps_token(fp, &cc, "/DOCINFO m\n"); } count = 0; for (i = 1; i < noe && oe[i].level > oe->level; i++) if (oe[i].level == oe->level + 1) count++; if (oe->level > 0) count = -count; ps_string_len(fp, &cc, title, titlelen); sfree(title); ps_token(fp, &cc, "%s %d o\n", (char *)oe->pdata->first->page->spare, count); } for (fe = doc->fonts->head; fe; fe = fe->next) { /* XXX This may request the same font multiple times. */ if (fe->font->info->fontfile) { fprintf(fp, "%%%%BeginResource: font %s\n", fe->font->info->name); if (fe->font->info->filetype == TYPE1) pf_writeps(fe->font->info, fp); else sfnt_writeps(fe->font->info, fp); fprintf(fp, "%%%%EndResource\n"); } else { fprintf(fp, "%%%%IncludeResource: font %s\n", fe->font->info->name); } } /* * Re-encode the fonts. */ font_index = 0; for (fe = doc->fonts->head; fe; fe = fe->next) { char fname[40]; int i; sprintf(fname, "f%d", font_index++); fe->name = dupstr(fname); ps_token(fp, &cc, "/%s findfont dup length dict begin\n", fe->font->info->name); ps_token(fp, &cc, "{1 index /FID ne {def} {pop pop} ifelse} forall\n"); ps_token(fp, &cc, "/Encoding [\n"); for (i = 0; i < 256; i++) ps_token(fp, &cc, "/%s", glyph_extern(fe->vector[i])); ps_token(fp, &cc, "] def\n"); ps_token(fp, &cc, "currentdict end\n"); ps_token(fp, &cc, "/fontname-%s exch definefont /%s exch def\n", fe->name, fe->name); } fprintf(fp, "%%%%EndSetup\n"); /* * Output the text and graphics. */ pageno = 0; for (page = doc->pages; page; page = page->next) { text_fragment *frag, *frag_end; rect *r; xref *xr; font_encoding *fe; int fs; pageno++; fprintf(fp, "%%%%Page: %d %d\n", pageno, pageno); cc = 0; ps_token(fp, &cc, "save %s p\n", (char *)page->spare); for (xr = page->first_xref; xr; xr = xr->next) { ps_token(fp, &cc, "[%g %g %g %g]", xr->lx/FUNITS_PER_PT, xr->by/FUNITS_PER_PT, xr->rx/FUNITS_PER_PT, xr->ty/FUNITS_PER_PT); if (xr->dest.type == PAGE) { ps_token(fp, &cc, "%s x\n", (char *)xr->dest.page->spare); } else { ps_string(fp, &cc, xr->dest.url); ps_token(fp, &cc, "u\n"); } } for (r = page->first_rect; r; r = r->next) { ps_token(fp, &cc, "%g %g %g %g r\n", r->x / FUNITS_PER_PT, r->y / FUNITS_PER_PT, r->w / FUNITS_PER_PT, r->h / FUNITS_PER_PT); } frag = page->first_text; fe = NULL; fs = -1; while (frag) { /* * Collect all the adjacent text fragments with the * same y-coordinate. */ for (frag_end = frag; frag_end && frag_end->y == frag->y; frag_end = frag_end->next); ps_token(fp, &cc, "%g[", frag->y / FUNITS_PER_PT); while (frag && frag != frag_end) { if (frag->fe != fe || frag->fontsize != fs) ps_token(fp, &cc, "[%s %d]", frag->fe->name, frag->fontsize); fe = frag->fe; fs = frag->fontsize; ps_token(fp, &cc, "%g", frag->x/FUNITS_PER_PT); ps_string(fp, &cc, frag->text); frag = frag->next; } ps_token(fp, &cc, "]t\n"); } ps_token(fp, &cc, "restore showpage\n"); } fprintf(fp, "%%%%EOF\n"); if (fp != stdout) fclose(fp); sfree(filename); } static void ps_comment(FILE *fp, char const *leader, word *words) { int cc = 0; cc += fprintf(fp, "%s", leader); for (; words; words = words->next) { char *text; int type; switch (words->type) { case word_HyperLink: case word_HyperEnd: case word_UpperXref: case word_LowerXref: case word_XrefEnd: case word_IndexRef: continue; } type = removeattr(words->type); switch (type) { case word_Normal: text = utoa_dup(words->text, CS_ASCII); break; case word_WhiteSpace: text = dupstr(" "); break; case word_Quote: text = dupstr("'"); break; } if (cc + strlen(text) > PS_MAXWIDTH) text[PS_MAXWIDTH - cc] = 0; cc += fprintf(fp, "%s", text); sfree(text); } fprintf(fp, "\n"); } void ps_token(FILE *fp, int *cc, char const *fmt, ...) { va_list ap; va_start(ap, fmt); if (*cc >= PS_WIDTH - 10) { fprintf(fp, "\n"); *cc = 0; } *cc += vfprintf(fp, fmt, ap); /* Assume that \n only occurs at the end of a string */ if (fmt[strlen(fmt) - 1] == '\n') *cc = 0; } static void ps_string_len(FILE *fp, int *cc, char const *str, int len) { char const *c; int score = 0; for (c = str; c < str+len; c++) { if (*c < ' ' || *c > '~') score += 2; else if (*c == '(' || *c == ')' || *c == '\\') score += 0; else score -= 1; } if (score > 0) { ps_token(fp, cc, "<"); for (c = str; c < str+len; c++) { ps_token(fp, cc, "%02X", 0xFF & (int)*c); } ps_token(fp, cc, ">"); } else { *cc += fprintf(fp, "("); for (c = str; c < str+len; c++) { if (*cc >= PS_WIDTH - 4) { fprintf(fp, "\\\n"); *cc = 0; } if (*c < ' ' || *c > '~') { *cc += fprintf(fp, "\\%03o", 0xFF & (int)*c); } else { if (*c == '(' || *c == ')' || *c == '\\') { fputc('\\', fp); (*cc)++; } fputc(*c, fp); (*cc)++; } } *cc += fprintf(fp, ")"); } } static void ps_string(FILE *fp, int *cc, char const *str) { ps_string_len(fp, cc, str, strlen(str)); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/bk_text.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000055361�12444773746�011572� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * text backend for Halibut */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "halibut.h" typedef enum { LEFT, LEFTPLUS, CENTRE } alignment; typedef struct { alignment align; int number_at_all, just_numbers; wchar_t *underline; wchar_t *number_suffix; } alignstruct; typedef struct { int indent, indent_code; int listindentbefore, listindentafter; int width; alignstruct atitle, achapter, *asect; int nasect; int include_version_id; int indent_preambles; int charset; word bullet; wchar_t *lquote, *rquote, *rule; char *filename; wchar_t *listsuffix, *startemph, *endemph, *startstrong, *endstrong; } textconfig; typedef struct { FILE *fp; int charset; charset_state state; } textfile; static void text_heading(textfile *, word *, word *, word *, alignstruct, int, int, textconfig *); static void text_rule(textfile *, int, int, textconfig *); static void text_para(textfile *, word *, wchar_t *, word *, int, int, int, textconfig *); static void text_codepara(textfile *, word *, int, int); static void text_versionid(textfile *, word *, textconfig *); static void text_output(textfile *, const wchar_t *); static void text_output_many(textfile *, int, wchar_t); static alignment utoalign(wchar_t *p) { if (!ustricmp(p, L"centre") || !ustricmp(p, L"center")) return CENTRE; if (!ustricmp(p, L"leftplus")) return LEFTPLUS; return LEFT; } static textconfig text_configure(paragraph *source) { textconfig ret; paragraph *p; int n; /* * Non-negotiables. */ ret.bullet.next = NULL; ret.bullet.alt = NULL; ret.bullet.type = word_Normal; ret.atitle.just_numbers = FALSE; /* ignored */ ret.atitle.number_at_all = TRUE; /* ignored */ /* * Defaults. */ ret.indent = 7; ret.indent_code = 2; ret.listindentbefore = 1; ret.listindentafter = 3; ret.width = 68; ret.atitle.align = CENTRE; ret.atitle.underline = L"\x2550\0=\0\0"; ret.achapter.align = LEFT; ret.achapter.just_numbers = FALSE; ret.achapter.number_at_all = TRUE; ret.achapter.number_suffix = L": "; ret.achapter.underline = L"\x203E\0-\0\0"; ret.nasect = 1; ret.asect = snewn(ret.nasect, alignstruct); ret.asect[0].align = LEFTPLUS; ret.asect[0].just_numbers = TRUE; ret.asect[0].number_at_all = TRUE; ret.asect[0].number_suffix = L" "; ret.asect[0].underline = L"\0"; ret.include_version_id = TRUE; ret.indent_preambles = FALSE; ret.bullet.text = L"\x2022\0-\0\0"; ret.rule = L"\x2500\0-\0\0"; ret.filename = dupstr("output.txt"); ret.startemph = L"_\0_\0\0"; ret.endemph = uadv(ret.startemph); ret.startstrong = L"*\0*\0\0"; ret.endstrong = uadv(ret.startstrong); ret.listsuffix = L"."; ret.charset = CS_ASCII; /* * Default quote characters are Unicode matched single quotes, * falling back to the TeXlike `'. */ ret.lquote = L"\x2018\0\x2019\0`\0'\0\0"; ret.rquote = uadv(ret.lquote); /* * Two-pass configuration so that we can pick up global config * (e.g. `quotes') before having it overridden by specific * config (`text-quotes'), irrespective of the order in which * they occur. */ for (p = source; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } } } for (p = source; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"text-indent")) { ret.indent = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-charset")) { ret.charset = charset_from_ustr(&p->fpos, uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-filename")) { sfree(ret.filename); ret.filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(p->keyword, L"text-indent-code")) { ret.indent_code = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-width")) { ret.width = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-list-indent")) { ret.listindentbefore = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-listitem-indent")) { ret.listindentafter = utoi(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-chapter-align")) { ret.achapter.align = utoalign(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-chapter-underline")) { ret.achapter.underline = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"text-chapter-numeric")) { ret.achapter.just_numbers = utob(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-chapter-shownumber")) { ret.achapter.number_at_all = utob(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-chapter-suffix")) { ret.achapter.number_suffix = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"text-section-align")) { wchar_t *q = uadv(p->keyword); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nasect) { int i; ret.asect = sresize(ret.asect, n+1, alignstruct); for (i = ret.nasect; i <= n; i++) ret.asect[i] = ret.asect[ret.nasect-1]; ret.nasect = n+1; } ret.asect[n].align = utoalign(q); } else if (!ustricmp(p->keyword, L"text-section-underline")) { wchar_t *q = uadv(p->keyword); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nasect) { int i; ret.asect = sresize(ret.asect, n+1, alignstruct); for (i = ret.nasect; i <= n; i++) ret.asect[i] = ret.asect[ret.nasect-1]; ret.nasect = n+1; } ret.asect[n].underline = q; } else if (!ustricmp(p->keyword, L"text-section-numeric")) { wchar_t *q = uadv(p->keyword); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nasect) { int i; ret.asect = sresize(ret.asect, n+1, alignstruct); for (i = ret.nasect; i <= n; i++) ret.asect[i] = ret.asect[ret.nasect-1]; ret.nasect = n+1; } ret.asect[n].just_numbers = utob(q); } else if (!ustricmp(p->keyword, L"text-section-shownumber")) { wchar_t *q = uadv(p->keyword); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nasect) { int i; ret.asect = sresize(ret.asect, n+1, alignstruct); for (i = ret.nasect; i <= n; i++) ret.asect[i] = ret.asect[ret.nasect-1]; ret.nasect = n+1; } ret.asect[n].number_at_all = utob(q); } else if (!ustricmp(p->keyword, L"text-section-suffix")) { wchar_t *q = uadv(p->keyword); int n = 0; if (uisdigit(*q)) { n = utoi(q); q = uadv(q); } if (n >= ret.nasect) { int i; ret.asect = sresize(ret.asect, n+1, alignstruct); for (i = ret.nasect; i <= n; i++) { ret.asect[i] = ret.asect[ret.nasect-1]; } ret.nasect = n+1; } ret.asect[n].number_suffix = q; } else if (!ustricmp(p->keyword, L"text-title-align")) { ret.atitle.align = utoalign(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-title-underline")) { ret.atitle.underline = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"text-versionid")) { ret.include_version_id = utob(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-indent-preamble")) { ret.indent_preambles = utob(uadv(p->keyword)); } else if (!ustricmp(p->keyword, L"text-bullet")) { ret.bullet.text = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"text-rule")) { ret.rule = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"text-list-suffix")) { ret.listsuffix = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"text-emphasis")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.startemph = uadv(p->keyword); ret.endemph = uadv(ret.startemph); } } else if (!ustricmp(p->keyword, L"text-strong")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.startstrong = uadv(p->keyword); ret.endstrong = uadv(ret.startstrong); } } else if (!ustricmp(p->keyword, L"text-quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } } } /* * Now process fallbacks on quote characters, underlines, the * rule character, the emphasis characters, and bullets. */ while (*uadv(ret.rquote) && *uadv(uadv(ret.rquote)) && (!cvt_ok(ret.charset, ret.lquote) || !cvt_ok(ret.charset, ret.rquote))) { ret.lquote = uadv(ret.rquote); ret.rquote = uadv(ret.lquote); } while (*uadv(ret.endemph) && *uadv(uadv(ret.endemph)) && (!cvt_ok(ret.charset, ret.startemph) || !cvt_ok(ret.charset, ret.endemph))) { ret.startemph = uadv(ret.endemph); ret.endemph = uadv(ret.startemph); } while (*uadv(ret.endstrong) && *uadv(uadv(ret.endstrong)) && (!cvt_ok(ret.charset, ret.startstrong) || !cvt_ok(ret.charset, ret.endstrong))) { ret.startstrong = uadv(ret.endstrong); ret.endstrong = uadv(ret.startstrong); } while (*ret.atitle.underline && *uadv(ret.atitle.underline) && !cvt_ok(ret.charset, ret.atitle.underline)) ret.atitle.underline = uadv(ret.atitle.underline); while (*ret.achapter.underline && *uadv(ret.achapter.underline) && !cvt_ok(ret.charset, ret.achapter.underline)) ret.achapter.underline = uadv(ret.achapter.underline); for (n = 0; n < ret.nasect; n++) { while (*ret.asect[n].underline && *uadv(ret.asect[n].underline) && !cvt_ok(ret.charset, ret.asect[n].underline)) ret.asect[n].underline = uadv(ret.asect[n].underline); } while (*ret.bullet.text && *uadv(ret.bullet.text) && !cvt_ok(ret.charset, ret.bullet.text)) ret.bullet.text = uadv(ret.bullet.text); while (*ret.rule && *uadv(ret.rule) && !cvt_ok(ret.charset, ret.rule)) ret.rule = uadv(ret.rule); return ret; } paragraph *text_config_filename(char *filename) { return cmdline_cfg_simple("text-filename", filename, NULL); } void text_backend(paragraph *sourceform, keywordlist *keywords, indexdata *idx, void *unused) { paragraph *p; textconfig conf; word *prefix, *body, *wp; word spaceword; textfile tf; wchar_t *prefixextra; int nesting, nestbase, nestindent; int indentb, indenta; IGNORE(unused); IGNORE(keywords); /* we don't happen to need this */ IGNORE(idx); /* or this */ conf = text_configure(sourceform); /* * Open the output file. */ if (!strcmp(conf.filename, "-")) tf.fp = stdout; else tf.fp = fopen(conf.filename, "w"); if (!tf.fp) { err_cantopenw(conf.filename); return; } tf.charset = conf.charset; tf.state = charset_init_state; /* Do the title */ for (p = sourceform; p; p = p->next) if (p->type == para_Title) text_heading(&tf, NULL, NULL, p->words, conf.atitle, conf.indent, conf.width, &conf); nestindent = conf.listindentbefore + conf.listindentafter; nestbase = (conf.indent_preambles ? 0 : -conf.indent); nesting = nestbase; /* Do the main document */ for (p = sourceform; p; p = p->next) switch (p->type) { case para_QuotePush: nesting += 2; break; case para_QuotePop: nesting -= 2; assert(nesting >= 0); break; case para_LcontPush: nesting += nestindent; break; case para_LcontPop: nesting -= nestindent; assert(nesting >= nestbase); break; /* * Things we ignore because we've already processed them or * aren't going to touch them in this pass. */ case para_IM: case para_BR: case para_Biblio: /* only touch BiblioCited */ case para_VersionID: case para_NoCite: case para_Title: break; /* * Chapter titles. */ case para_Chapter: case para_Appendix: case para_UnnumberedChapter: text_heading(&tf, p->kwtext, p->kwtext2, p->words, conf.achapter, conf.indent, conf.width, &conf); nesting = 0; break; case para_Heading: case para_Subsect: text_heading(&tf, p->kwtext, p->kwtext2, p->words, conf.asect[p->aux>=conf.nasect ? conf.nasect-1 : p->aux], conf.indent, conf.width, &conf); break; case para_Rule: text_rule(&tf, conf.indent + nesting, conf.width - nesting, &conf); break; case para_Normal: case para_Copyright: case para_DescribedThing: case para_Description: case para_BiblioCited: case para_Bullet: case para_NumberedList: if (p->type == para_Bullet) { prefix = &conf.bullet; prefixextra = NULL; indentb = conf.listindentbefore; indenta = conf.listindentafter; } else if (p->type == para_NumberedList) { prefix = p->kwtext; prefixextra = conf.listsuffix; indentb = conf.listindentbefore; indenta = conf.listindentafter; } else if (p->type == para_Description) { prefix = NULL; prefixextra = NULL; indentb = conf.listindentbefore; indenta = conf.listindentafter; } else { prefix = NULL; prefixextra = NULL; indentb = indenta = 0; } if (p->type == para_BiblioCited) { body = dup_word_list(p->kwtext); for (wp = body; wp->next; wp = wp->next); wp->next = &spaceword; spaceword.next = p->words; spaceword.alt = NULL; spaceword.type = word_WhiteSpace; spaceword.text = NULL; } else { wp = NULL; body = p->words; } text_para(&tf, prefix, prefixextra, body, conf.indent + nesting + indentb, indenta, conf.width - nesting - indentb - indenta, &conf); if (wp) { wp->next = NULL; free_word_list(body); } break; case para_Code: text_codepara(&tf, p->words, conf.indent + nesting + conf.indent_code, conf.width - nesting - 2 * conf.indent_code); break; } /* Do the version ID */ if (conf.include_version_id) { for (p = sourceform; p; p = p->next) if (p->type == para_VersionID) text_versionid(&tf, p->words, &conf); } /* * Tidy up */ text_output(&tf, NULL); /* end charset conversion */ if (tf.fp != stdout) fclose(tf.fp); sfree(conf.asect); sfree(conf.filename); } static void text_output(textfile *tf, const wchar_t *s) { char buf[256]; int ret, len; const wchar_t **sp; if (!s) { sp = NULL; len = 1; } else { sp = &s; len = ustrlen(s); } while (len > 0) { ret = charset_from_unicode(sp, &len, buf, lenof(buf), tf->charset, &tf->state, NULL); if (!sp) len = 0; fwrite(buf, 1, ret, tf->fp); } } static void text_output_many(textfile *tf, int n, wchar_t c) { wchar_t s[2]; s[0] = c; s[1] = L'\0'; while (n-- > 0) text_output(tf, s); } static void text_rdaddw(rdstring *rs, word *text, word *end, textconfig *cfg) { for (; text && text != end; text = text->next) switch (text->type) { case word_HyperLink: case word_HyperEnd: case word_UpperXref: case word_LowerXref: case word_XrefEnd: case word_IndexRef: break; case word_Normal: case word_Emph: case word_Strong: case word_Code: case word_WeakCode: case word_WhiteSpace: case word_EmphSpace: case word_StrongSpace: case word_CodeSpace: case word_WkCodeSpace: case word_Quote: case word_EmphQuote: case word_StrongQuote: case word_CodeQuote: case word_WkCodeQuote: assert(text->type != word_CodeQuote && text->type != word_WkCodeQuote); if (towordstyle(text->type) == word_Emph && (attraux(text->aux) == attr_First || attraux(text->aux) == attr_Only)) rdadds(rs, cfg->startemph); else if (towordstyle(text->type) == word_Strong && (attraux(text->aux) == attr_First || attraux(text->aux) == attr_Only)) rdadds(rs, cfg->startstrong); else if (towordstyle(text->type) == word_Code && (attraux(text->aux) == attr_First || attraux(text->aux) == attr_Only)) rdadds(rs, cfg->lquote); if (removeattr(text->type) == word_Normal) { if (cvt_ok(cfg->charset, text->text) || !text->alt) rdadds(rs, text->text); else text_rdaddw(rs, text->alt, NULL, cfg); } else if (removeattr(text->type) == word_WhiteSpace) { rdadd(rs, L' '); } else if (removeattr(text->type) == word_Quote) { rdadds(rs, quoteaux(text->aux) == quote_Open ? cfg->lquote : cfg->rquote); } if (towordstyle(text->type) == word_Emph && (attraux(text->aux) == attr_Last || attraux(text->aux) == attr_Only)) rdadds(rs, cfg->endemph); else if (towordstyle(text->type) == word_Strong && (attraux(text->aux) == attr_Last || attraux(text->aux) == attr_Only)) rdadds(rs, cfg->endstrong); else if (towordstyle(text->type) == word_Code && (attraux(text->aux) == attr_Last || attraux(text->aux) == attr_Only)) rdadds(rs, cfg->rquote); break; } } static int text_width(void *, word *); static int text_width_list(void *ctx, word *text) { int w = 0; while (text) { w += text_width(ctx, text); text = text->next; } return w; } static int text_width(void *ctx, word *text) { textconfig *cfg = (textconfig *)ctx; int wid; int attr; switch (text->type) { case word_HyperLink: case word_HyperEnd: case word_UpperXref: case word_LowerXref: case word_XrefEnd: case word_IndexRef: return 0; } assert(text->type < word_internal_endattrs); wid = 0; attr = towordstyle(text->type); if (attr == word_Emph || attr == word_Strong || attr == word_Code) { if (attraux(text->aux) == attr_Only || attraux(text->aux) == attr_First) wid += ustrwid(attr == word_Emph ? cfg->startemph : attr == word_Strong ? cfg->startstrong : cfg->lquote, cfg->charset); } if (attr == word_Emph || attr == word_Strong || attr == word_Code) { if (attraux(text->aux) == attr_Only || attraux(text->aux) == attr_Last) wid += ustrwid(attr == word_Emph ? cfg->startemph : attr == word_Strong ? cfg->startstrong : cfg->lquote, cfg->charset); } switch (text->type) { case word_Normal: case word_Emph: case word_Strong: case word_Code: case word_WeakCode: if (cvt_ok(cfg->charset, text->text) || !text->alt) wid += ustrwid(text->text, cfg->charset); else wid += text_width_list(ctx, text->alt); return wid; case word_WhiteSpace: case word_EmphSpace: case word_StrongSpace: case word_CodeSpace: case word_WkCodeSpace: case word_Quote: case word_EmphQuote: case word_StrongQuote: case word_CodeQuote: case word_WkCodeQuote: assert(text->type != word_CodeQuote && text->type != word_WkCodeQuote); if (removeattr(text->type) == word_Quote) { if (quoteaux(text->aux) == quote_Open) wid += ustrwid(cfg->lquote, cfg->charset); else wid += ustrwid(cfg->rquote, cfg->charset); } else wid++; /* space */ } return wid; } static void text_heading(textfile *tf, word *tprefix, word *nprefix, word *text, alignstruct align, int indent, int width, textconfig *cfg) { rdstring t = { 0, 0, NULL }; int margin, length; int firstlinewidth, wrapwidth; wrappedline *wrapping, *p; if (align.number_at_all) { if (align.just_numbers && nprefix) { text_rdaddw(&t, nprefix, NULL, cfg); rdadds(&t, align.number_suffix); } else if (!align.just_numbers && tprefix) { text_rdaddw(&t, tprefix, NULL, cfg); rdadds(&t, align.number_suffix); } } margin = length = ustrwid(t.text ? t.text : L"", cfg->charset); if (align.align == LEFTPLUS) { margin = indent - margin; if (margin < 0) margin = 0; firstlinewidth = indent + width - margin - length; wrapwidth = width; } else /* if (align.align == LEFT || align.align == CENTRE) */ { margin = 0; firstlinewidth = indent + width - length; wrapwidth = indent + width; } wrapping = wrap_para(text, firstlinewidth, wrapwidth, text_width, cfg, 0); for (p = wrapping; p; p = p->next) { text_rdaddw(&t, p->begin, p->end, cfg); length = ustrwid(t.text ? t.text : L"", cfg->charset); if (align.align == CENTRE) { margin = (indent + width - length)/2; if (margin < 0) margin = 0; } text_output_many(tf, margin, L' '); text_output(tf, t.text); text_output(tf, L"\n"); if (*align.underline) { text_output_many(tf, margin, L' '); while (length > 0) { text_output(tf, align.underline); length -= ustrwid(align.underline, cfg->charset); } text_output(tf, L"\n"); } if (align.align == LEFTPLUS) margin = indent; else margin = 0; sfree(t.text); t = empty_rdstring; } wrap_free(wrapping); text_output(tf, L"\n"); sfree(t.text); } static void text_rule(textfile *tf, int indent, int width, textconfig *cfg) { text_output_many(tf, indent, L' '); while (width > 0) { text_output(tf, cfg->rule); width -= ustrwid(cfg->rule, cfg->charset); } text_output_many(tf, 2, L'\n'); } static void text_para(textfile *tf, word *prefix, wchar_t *prefixextra, word *text, int indent, int extraindent, int width, textconfig *cfg) { wrappedline *wrapping, *p; rdstring pfx = { 0, 0, NULL }; int e; int firstlinewidth = width; if (prefix) { text_rdaddw(&pfx, prefix, NULL, cfg); if (prefixextra) rdadds(&pfx, prefixextra); text_output_many(tf, indent, L' '); text_output(tf, pfx.text); /* If the prefix is too long, shorten the first line to fit. */ e = extraindent - ustrwid(pfx.text ? pfx.text : L"", cfg->charset); if (e < 0) { firstlinewidth += e; /* this decreases it, since e < 0 */ if (firstlinewidth < 0) { e = indent + extraindent; firstlinewidth = width; text_output(tf, L"\n"); } else e = 0; } sfree(pfx.text); } else e = indent + extraindent; wrapping = wrap_para(text, firstlinewidth, width, text_width, cfg, 0); for (p = wrapping; p; p = p->next) { rdstring t = { 0, 0, NULL }; text_rdaddw(&t, p->begin, p->end, cfg); text_output_many(tf, e, L' '); text_output(tf, t.text); text_output(tf, L"\n"); e = indent + extraindent; sfree(t.text); } wrap_free(wrapping); text_output(tf, L"\n"); } static void text_codepara(textfile *tf, word *text, int indent, int width) { for (; text; text = text->next) if (text->type == word_WeakCode) { int wid = ustrwid(text->text, tf->charset); if (wid > width) err_text_codeline(&text->fpos, wid, width); text_output_many(tf, indent, L' '); text_output(tf, text->text); text_output(tf, L"\n"); } text_output(tf, L"\n"); } static void text_versionid(textfile *tf, word *text, textconfig *cfg) { rdstring t = { 0, 0, NULL }; rdadd(&t, L'['); text_rdaddw(&t, text, NULL, cfg); rdadd(&t, L']'); rdadd(&t, L'\n'); text_output(tf, t.text); sfree(t.text); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/bk_whlp.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000061436�12444773746�011560� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Windows Help backend for Halibut */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <assert.h> #include "halibut.h" #include "winhelp.h" struct bk_whlp_state { WHLP h; indexdata *idx; keywordlist *keywords; WHLP_TOPIC curr_topic; int charset; charset_state cstate; FILE *cntfp; int cnt_last_level, cnt_workaround; }; typedef struct { int charset; wchar_t *bullet, *lquote, *rquote, *titlepage, *sectsuffix, *listsuffix; wchar_t *contents_text; char *filename; } whlpconf; /* * Indexes of fonts in our standard font descriptor set. */ enum { FONT_NORMAL, FONT_EMPH, FONT_STRONG, FONT_CODE, FONT_ITAL_CODE, FONT_BOLD_CODE, FONT_TITLE, FONT_TITLE_EMPH, FONT_TITLE_STRONG, FONT_TITLE_CODE, FONT_RULE }; static void whlp_rdaddwc(rdstringc *rs, word *text, whlpconf *conf, charset_state *state); static void whlp_rdadds(rdstringc *rs, const wchar_t *text, whlpconf *conf, charset_state *state); static void whlp_mkparagraph(struct bk_whlp_state *state, int font, word *text, int subsidiary, whlpconf *conf); static void whlp_navmenu(struct bk_whlp_state *state, paragraph *p, whlpconf *conf); static void whlp_contents_write(struct bk_whlp_state *state, int level, char *text, WHLP_TOPIC topic); static void whlp_wtext(struct bk_whlp_state *state, const wchar_t *text); paragraph *whlp_config_filename(char *filename) { return cmdline_cfg_simple("winhelp-filename", filename, NULL); } static whlpconf whlp_configure(paragraph *source) { paragraph *p; whlpconf ret; /* * Defaults. */ ret.charset = CS_CP1252; ret.bullet = L"\x2022\0-\0\0"; ret.lquote = L"\x2018\0\x2019\0\"\0\"\0\0"; ret.rquote = uadv(ret.lquote); ret.filename = dupstr("output.hlp"); ret.titlepage = L"Title page"; ret.contents_text = L"Contents"; ret.sectsuffix = L": "; ret.listsuffix = L"."; /* * Two-pass configuration so that we can pick up global config * (e.g. `quotes') before having it overridden by specific * config (`win-quotes'), irrespective of the order in which * they occur. */ for (p = source; p; p = p->next) { if (p->type == para_Config) { if (!ustricmp(p->keyword, L"quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } } } for (p = source; p; p = p->next) { p->private_data = NULL; if (p->type == para_Config) { /* * In principle we should support a `winhelp-charset' * here. We don't, because my WinHelp output code * doesn't know how to change character set. Once I * find out, I'll support it. */ if (p->parent && !ustricmp(p->keyword, L"winhelp-topic")) { /* Store the topic name in the private_data field of the * containing section. */ p->parent->private_data = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"winhelp-filename")) { sfree(ret.filename); ret.filename = dupstr(adv(p->origkeyword)); } else if (!ustricmp(p->keyword, L"winhelp-bullet")) { ret.bullet = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"winhelp-section-suffix")) { ret.sectsuffix = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"winhelp-list-suffix")) { ret.listsuffix = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"winhelp-contents-titlepage")) { ret.titlepage = uadv(p->keyword); } else if (!ustricmp(p->keyword, L"winhelp-quotes")) { if (*uadv(p->keyword) && *uadv(uadv(p->keyword))) { ret.lquote = uadv(p->keyword); ret.rquote = uadv(ret.lquote); } } else if (!ustricmp(p->keyword, L"contents")) { ret.contents_text = uadv(p->keyword); } } } /* * Now process fallbacks on quote characters and bullets. */ while (*uadv(ret.rquote) && *uadv(uadv(ret.rquote)) && (!cvt_ok(ret.charset, ret.lquote) || !cvt_ok(ret.charset, ret.rquote))) { ret.lquote = uadv(ret.rquote); ret.rquote = uadv(ret.lquote); } while (*ret.bullet && *uadv(ret.bullet) && !cvt_ok(ret.charset, ret.bullet)) ret.bullet = uadv(ret.bullet); return ret; } void whlp_backend(paragraph *sourceform, keywordlist *keywords, indexdata *idx, void *unused) { WHLP h; char *cntname; paragraph *p, *lastsect; struct bk_whlp_state state; WHLP_TOPIC contents_topic; int i; int nesting; indexentry *ie; int done_contents_topic = FALSE; whlpconf conf; IGNORE(unused); h = state.h = whlp_new(); state.keywords = keywords; state.idx = idx; whlp_start_macro(h, "CB(\"btn_about\",\"&About\",\"About()\")"); whlp_start_macro(h, "CB(\"btn_up\",\"&Up\",\"Contents()\")"); whlp_start_macro(h, "BrowseButtons()"); whlp_create_font(h, "Times New Roman", WHLP_FONTFAM_SERIF, 24, 0, 0, 0, 0); whlp_create_font(h, "Times New Roman", WHLP_FONTFAM_SERIF, 24, WHLP_FONT_ITALIC, 0, 0, 0); whlp_create_font(h, "Times New Roman", WHLP_FONTFAM_SERIF, 24, WHLP_FONT_BOLD, 0, 0, 0); whlp_create_font(h, "Courier New", WHLP_FONTFAM_FIXED, 24, 0, 0, 0, 0); whlp_create_font(h, "Courier New", WHLP_FONTFAM_FIXED, 24, WHLP_FONT_ITALIC, 0, 0, 0); whlp_create_font(h, "Courier New", WHLP_FONTFAM_FIXED, 24, WHLP_FONT_BOLD, 0, 0, 0); whlp_create_font(h, "Arial", WHLP_FONTFAM_SERIF, 30, WHLP_FONT_BOLD, 0, 0, 0); whlp_create_font(h, "Arial", WHLP_FONTFAM_SERIF, 30, WHLP_FONT_BOLD|WHLP_FONT_ITALIC, 0, 0, 0); whlp_create_font(h, "Arial", WHLP_FONTFAM_SERIF, 30, WHLP_FONT_BOLD, 0, 0, 0); whlp_create_font(h, "Courier New", WHLP_FONTFAM_FIXED, 30, WHLP_FONT_BOLD, 0, 0, 0); whlp_create_font(h, "Courier New", WHLP_FONTFAM_SANS, 18, WHLP_FONT_STRIKEOUT, 0, 0, 0); conf = whlp_configure(sourceform); state.charset = conf.charset; /* * Ensure the output file name has a .hlp extension. This is * required since we must create the .cnt file in parallel with * it. */ { int len = strlen(conf.filename); if (len < 4 || conf.filename[len-4] != '.' || tolower(conf.filename[len-3] != 'h') || tolower(conf.filename[len-2] != 'l') || tolower(conf.filename[len-1] != 'p')) { char *newf; newf = snewn(len + 5, char); sprintf(newf, "%s.hlp", conf.filename); sfree(conf.filename); conf.filename = newf; len = strlen(newf); } cntname = snewn(len+1, char); sprintf(cntname, "%.*s.cnt", len-4, conf.filename); } state.cntfp = fopen(cntname, "wb"); if (!state.cntfp) { err_cantopenw(cntname); return; } state.cnt_last_level = -1; state.cnt_workaround = 0; /* * Loop over the source form registering WHLP_TOPICs for * everything. */ contents_topic = whlp_register_topic(h, "Top", NULL); whlp_primary_topic(h, contents_topic); for (p = sourceform; p; p = p->next) { if (p->type == para_Chapter || p->type == para_Appendix || p->type == para_UnnumberedChapter || p->type == para_Heading || p->type == para_Subsect) { rdstringc rs = { 0, 0, NULL }; char *errstr; whlp_rdadds(&rs, (wchar_t *)p->private_data, &conf, NULL); p->private_data = whlp_register_topic(h, rs.text, &errstr); if (!p->private_data) { p->private_data = whlp_register_topic(h, NULL, NULL); err_winhelp_ctxclash(&p->fpos, rs.text, errstr); } sfree(rs.text); } } /* * Loop over the index entries, preparing final text forms for * each one. */ { indexentry *ie_prev = NULL; int nspaces = 1; for (i = 0; (ie = index234(idx->entries, i)) != NULL; i++) { rdstringc rs = {0, 0, NULL}; charset_state state = CHARSET_INIT_STATE; whlp_rdaddwc(&rs, ie->text, &conf, &state); if (ie_prev) { /* * It appears that Windows Help's index mechanism * is inherently case-insensitive. Therefore, if two * adjacent index terms compare equal apart from * case, I'm going to append nonbreaking spaces to * the end of the second one so that Windows will * treat them as distinct. * * This is nasty because we're depending on our * case-insensitive comparison having the same * semantics as the Windows one :-/ but I see no * alternative. */ wchar_t *a, *b; a = ufroma_dup((char *)ie_prev->backend_data, conf.charset); b = ufroma_dup(rs.text, conf.charset); if (!ustricmp(a, b)) { int j; for (j = 0; j < nspaces; j++) whlp_rdadds(&rs, L"\xA0", &conf, &state); /* * Add one to nspaces, so that if another term * appears which is equivalent to the previous * two it'll acquire one more space. */ nspaces++; } else nspaces = 1; sfree(a); sfree(b); } whlp_rdadds(&rs, NULL, &conf, &state); ie->backend_data = rs.text; /* * Only move ie_prev on if nspaces==1 (since when we * have three or more adjacent terms differing only in * case, we will want to compare with the _first_ of * them because that won't have had any extra spaces * added on which will foul up the comparison). */ if (nspaces == 1) ie_prev = ie; } } whlp_prepare(h); /* ------------------------------------------------------------------ * Begin the contents page. */ { rdstringc rs = {0, 0, NULL}; whlp_rdadds(&rs, conf.contents_text, &conf, NULL); whlp_begin_topic(h, contents_topic, rs.text, "DB(\"btn_up\")", NULL); state.curr_topic = contents_topic; sfree(rs.text); } /* * The manual title goes in the non-scroll region, and also * goes into the system title slot. */ { rdstringc rs = {0, 0, NULL}; for (p = sourceform; p; p = p->next) { if (p->type == para_Title) { whlp_begin_para(h, WHLP_PARA_NONSCROLL); state.cstate = charset_init_state; whlp_mkparagraph(&state, FONT_TITLE, p->words, FALSE, &conf); whlp_wtext(&state, NULL); whlp_end_para(h); whlp_rdaddwc(&rs, p->words, &conf, NULL); } } if (rs.text) { whlp_title(h, rs.text); fprintf(state.cntfp, ":Title %s\r\n", rs.text); sfree(rs.text); } { rdstringc rs2 = {0,0,NULL}; whlp_rdadds(&rs2, conf.titlepage, &conf, NULL); whlp_contents_write(&state, 1, rs2.text, contents_topic); sfree(rs2.text); } } /* * Put the copyright into the system section. */ { rdstringc rs = {0, 0, NULL}; for (p = sourceform; p; p = p->next) { if (p->type == para_Copyright) whlp_rdaddwc(&rs, p->words, &conf, NULL); } if (rs.text) { whlp_copyright(h, rs.text); sfree(rs.text); } } lastsect = NULL; /* ------------------------------------------------------------------ * Now we've done the contents page, we're ready to go through * and do the main manual text. Ooh. */ nesting = 0; for (p = sourceform; p; p = p->next) switch (p->type) { /* * Things we ignore because we've already processed them or * aren't going to touch them in this pass. */ case para_IM: case para_BR: case para_Biblio: /* only touch BiblioCited */ case para_VersionID: case para_NoCite: case para_Title: break; case para_LcontPush: case para_QuotePush: nesting++; break; case para_LcontPop: case para_QuotePop: assert(nesting > 0); nesting--; break; /* * Chapter and section titles: start a new Help topic. */ case para_Chapter: case para_Appendix: case para_UnnumberedChapter: case para_Heading: case para_Subsect: if (!done_contents_topic) { paragraph *p; /* * If this is the first section title we've seen, then * we're currently still in the contents topic. We * should therefore finish up the contents page by * writing a nav menu. */ for (p = sourceform; p; p = p->next) { if (p->type == para_Chapter || p->type == para_Appendix || p->type == para_UnnumberedChapter) whlp_navmenu(&state, p, &conf); } done_contents_topic = TRUE; } if (lastsect && lastsect->child) { paragraph *q; /* * Do a navigation menu for the previous section we * were in. */ for (q = lastsect->child; q; q = q->sibling) whlp_navmenu(&state, q, &conf); } { rdstringc rs = {0, 0, NULL}; WHLP_TOPIC new_topic, parent_topic; char *macro, *topicid; charset_state cstate = CHARSET_INIT_STATE; new_topic = p->private_data; whlp_browse_link(h, state.curr_topic, new_topic); state.curr_topic = new_topic; if (p->kwtext) { whlp_rdaddwc(&rs, p->kwtext, &conf, &cstate); whlp_rdadds(&rs, conf.sectsuffix, &conf, &cstate); } whlp_rdaddwc(&rs, p->words, &conf, &cstate); whlp_rdadds(&rs, NULL, &conf, &cstate); if (p->parent == NULL) parent_topic = contents_topic; else parent_topic = (WHLP_TOPIC)p->parent->private_data; topicid = whlp_topic_id(parent_topic); macro = smalloc(100+strlen(topicid)); sprintf(macro, "CBB(\"btn_up\",\"JI(`',`%s')\");EB(\"btn_up\")", topicid); whlp_begin_topic(h, new_topic, rs.text ? rs.text : "", macro, NULL); sfree(macro); { /* * Output the .cnt entry. * * WinHelp has a bug involving having an internal * node followed by a leaf at the same level: the * leaf is output at the wrong level. We can mostly * work around this by modifying the leaf level * itself (see whlp_contents_write), but this * doesn't work for top-level sections since we * can't turn a level-1 leaf into a level-0 one. So * for top-level leaf sections (Bibliography * springs to mind), we output an internal node * containing only the leaf for that section. */ int i; paragraph *q; /* Count up the level. */ i = 1; for (q = p; q->parent; q = q->parent) i++; if (p->child || !p->parent) { /* * If p has children then it needs to be a * folder; if it has no parent then it needs to * be a folder to work around the bug. */ whlp_contents_write(&state, i, rs.text, NULL); i++; } whlp_contents_write(&state, i, rs.text, new_topic); } sfree(rs.text); whlp_begin_para(h, WHLP_PARA_NONSCROLL); state.cstate = charset_init_state; if (p->kwtext) { whlp_mkparagraph(&state, FONT_TITLE, p->kwtext, FALSE, &conf); whlp_set_font(h, FONT_TITLE); whlp_wtext(&state, conf.sectsuffix); } whlp_mkparagraph(&state, FONT_TITLE, p->words, FALSE, &conf); whlp_wtext(&state, NULL); whlp_end_para(h); lastsect = p; } break; case para_Rule: whlp_para_attr(h, WHLP_PARA_SPACEBELOW, 12); whlp_para_attr(h, WHLP_PARA_ALIGNMENT, WHLP_ALIGN_CENTRE); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, FONT_RULE); state.cstate = charset_init_state; #define TEN L"\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0" #define TWENTY TEN TEN #define FORTY TWENTY TWENTY #define EIGHTY FORTY FORTY state.cstate = charset_init_state; whlp_wtext(&state, EIGHTY); whlp_wtext(&state, NULL); #undef TEN #undef TWENTY #undef FORTY #undef EIGHTY whlp_end_para(h); break; case para_Normal: case para_Copyright: case para_DescribedThing: case para_Description: case para_BiblioCited: case para_Bullet: case para_NumberedList: whlp_para_attr(h, WHLP_PARA_SPACEBELOW, 12); if (p->type == para_Bullet || p->type == para_NumberedList) { whlp_para_attr(h, WHLP_PARA_LEFTINDENT, 72*nesting + 72); whlp_para_attr(h, WHLP_PARA_FIRSTLINEINDENT, -36); whlp_set_tabstop(h, 72, WHLP_ALIGN_LEFT); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, FONT_NORMAL); state.cstate = charset_init_state; if (p->type == para_Bullet) { whlp_wtext(&state, conf.bullet); } else { whlp_mkparagraph(&state, FONT_NORMAL, p->kwtext, FALSE, &conf); whlp_wtext(&state, conf.listsuffix); } whlp_wtext(&state, NULL); whlp_tab(h); } else { whlp_para_attr(h, WHLP_PARA_LEFTINDENT, 72*nesting + (p->type==para_Description ? 72 : 0)); whlp_begin_para(h, WHLP_PARA_SCROLL); } state.cstate = charset_init_state; if (p->type == para_BiblioCited) { whlp_mkparagraph(&state, FONT_NORMAL, p->kwtext, FALSE, &conf); whlp_wtext(&state, L" "); } whlp_mkparagraph(&state, FONT_NORMAL, p->words, FALSE, &conf); whlp_wtext(&state, NULL); whlp_end_para(h); break; case para_Code: /* * In a code paragraph, each individual word is a line. For * Help files, we will have to output this as a set of * paragraphs, all but the last of which don't set * SPACEBELOW. */ { word *w; wchar_t *t, *e, *tmp; for (w = p->words; w; w = w->next) if (w->type == word_WeakCode) { t = w->text; if (w->next && w->next->type == word_Emph) { w = w->next; e = w->text; } else e = NULL; if (!w->next) whlp_para_attr(h, WHLP_PARA_SPACEBELOW, 12); whlp_para_attr(h, WHLP_PARA_LEFTINDENT, 72*nesting); whlp_begin_para(h, WHLP_PARA_SCROLL); state.cstate = charset_init_state; while (e && *e && *t) { int n; int ec = *e; for (n = 0; t[n] && e[n] && e[n] == ec; n++); if (ec == 'i') whlp_set_font(h, FONT_ITAL_CODE); else if (ec == 'b') whlp_set_font(h, FONT_BOLD_CODE); else whlp_set_font(h, FONT_CODE); tmp = snewn(n+1, wchar_t); ustrncpy(tmp, t, n); tmp[n] = L'\0'; whlp_wtext(&state, tmp); whlp_wtext(&state, NULL); state.cstate = charset_init_state; sfree(tmp); t += n; e += n; } whlp_set_font(h, FONT_CODE); whlp_wtext(&state, t); whlp_wtext(&state, NULL); whlp_end_para(h); } } break; } fclose(state.cntfp); whlp_close(h, conf.filename); /* * Loop over the index entries, cleaning up our final text * forms. */ for (i = 0; (ie = index234(idx->entries, i)) != NULL; i++) { sfree(ie->backend_data); } sfree(conf.filename); sfree(cntname); } static void whlp_contents_write(struct bk_whlp_state *state, int level, char *text, WHLP_TOPIC topic) { /* * Horrifying bug in WinHelp. When dropping a section level or * more without using a folder-type entry, WinHelp accidentally * adds one to the section level. So we correct for that here. */ if (state->cnt_last_level > level && topic) state->cnt_workaround = -1; else if (!topic) state->cnt_workaround = 0; state->cnt_last_level = level; fprintf(state->cntfp, "%d ", level + state->cnt_workaround); while (*text) { if (*text == '=') fputc('\\', state->cntfp); fputc(*text, state->cntfp); text++; } if (topic) fprintf(state->cntfp, "=%s", whlp_topic_id(topic)); fputc('\n', state->cntfp); } static void whlp_navmenu(struct bk_whlp_state *state, paragraph *p, whlpconf *conf) { whlp_begin_para(state->h, WHLP_PARA_SCROLL); whlp_start_hyperlink(state->h, (WHLP_TOPIC)p->private_data); state->cstate = charset_init_state; if (p->kwtext) { whlp_mkparagraph(state, FONT_NORMAL, p->kwtext, TRUE, conf); whlp_set_font(state->h, FONT_NORMAL); whlp_wtext(state, conf->sectsuffix); } whlp_mkparagraph(state, FONT_NORMAL, p->words, TRUE, conf); whlp_wtext(state, NULL); whlp_end_hyperlink(state->h); whlp_end_para(state->h); } static void whlp_mkparagraph(struct bk_whlp_state *state, int font, word *text, int subsidiary, whlpconf *conf) { keyword *kwl; int deffont = font; int currfont = -1; int newfont; paragraph *xref_target = NULL; for (; text; text = text->next) switch (text->type) { case word_HyperLink: case word_HyperEnd: break; case word_IndexRef: if (subsidiary) break; /* disabled in subsidiary bits */ { indextag *tag = index_findtag(state->idx, text->text); int i; if (!tag) break; for (i = 0; i < tag->nrefs; i++) whlp_index_term(state->h, tag->refs[i]->backend_data, state->curr_topic); } break; case word_UpperXref: case word_LowerXref: if (subsidiary) break; /* disabled in subsidiary bits */ kwl = kw_lookup(state->keywords, text->text); assert(xref_target == NULL); if (kwl) { if (kwl->para->type == para_NumberedList) { break; /* don't xref to numbered list items */ } else if (kwl->para->type == para_BiblioCited) { /* * An xref to a bibliography item jumps to the section * containing it. */ if (kwl->para->parent) xref_target = kwl->para->parent; else break; } else { xref_target = kwl->para; } whlp_start_hyperlink(state->h, (WHLP_TOPIC)xref_target->private_data); } break; case word_XrefEnd: if (subsidiary) break; /* disabled in subsidiary bits */ if (xref_target) whlp_end_hyperlink(state->h); xref_target = NULL; break; case word_Normal: case word_Emph: case word_Strong: case word_Code: case word_WeakCode: case word_WhiteSpace: case word_EmphSpace: case word_StrongSpace: case word_CodeSpace: case word_WkCodeSpace: case word_Quote: case word_EmphQuote: case word_StrongQuote: case word_CodeQuote: case word_WkCodeQuote: if (towordstyle(text->type) == word_Emph) newfont = deffont + FONT_EMPH; else if (towordstyle(text->type) == word_Strong) newfont = deffont + FONT_STRONG; else if (towordstyle(text->type) == word_Code || towordstyle(text->type) == word_WeakCode) newfont = deffont + FONT_CODE; else newfont = deffont; if (newfont != currfont) { currfont = newfont; whlp_set_font(state->h, newfont); } if (removeattr(text->type) == word_Normal) { if (cvt_ok(conf->charset, text->text) || !text->alt) whlp_wtext(state, text->text); else whlp_mkparagraph(state, deffont, text->alt, FALSE, conf); } else if (removeattr(text->type) == word_WhiteSpace) { whlp_wtext(state, L" "); } else if (removeattr(text->type) == word_Quote) { whlp_wtext(state, quoteaux(text->aux) == quote_Open ? conf->lquote : conf->rquote); } break; } } static void whlp_rdaddwc(rdstringc *rs, word *text, whlpconf *conf, charset_state *state) { charset_state ourstate = CHARSET_INIT_STATE; if (!state) state = &ourstate; for (; text; text = text->next) switch (text->type) { case word_HyperLink: case word_HyperEnd: case word_UpperXref: case word_LowerXref: case word_XrefEnd: case word_IndexRef: break; case word_Normal: case word_Emph: case word_Strong: case word_Code: case word_WeakCode: case word_WhiteSpace: case word_EmphSpace: case word_StrongSpace: case word_CodeSpace: case word_WkCodeSpace: case word_Quote: case word_EmphQuote: case word_StrongQuote: case word_CodeQuote: case word_WkCodeQuote: assert(text->type != word_CodeQuote && text->type != word_WkCodeQuote); if (removeattr(text->type) == word_Normal) { if (cvt_ok(conf->charset, text->text) || !text->alt) whlp_rdadds(rs, text->text, conf, state); else whlp_rdaddwc(rs, text->alt, conf, state); } else if (removeattr(text->type) == word_WhiteSpace) { whlp_rdadds(rs, L" ", conf, state); } else if (removeattr(text->type) == word_Quote) { whlp_rdadds(rs, quoteaux(text->aux) == quote_Open ? conf->lquote : conf->rquote, conf, state); } break; } if (state == &ourstate) whlp_rdadds(rs, NULL, conf, state); } static void whlp_rdadds(rdstringc *rs, const wchar_t *text, whlpconf *conf, charset_state *state) { charset_state ourstate = CHARSET_INIT_STATE; int textlen = text ? ustrlen(text) : 0; char outbuf[256]; int ret; if (!state) state = &ourstate; while (textlen > 0 && (ret = charset_from_unicode(&text, &textlen, outbuf, lenof(outbuf)-1, conf->charset, state, NULL)) > 0) { outbuf[ret] = '\0'; rdaddsc(rs, outbuf); } if (text == NULL || state == &ourstate) { if ((ret = charset_from_unicode(NULL, 0, outbuf, lenof(outbuf)-1, conf->charset, state, NULL)) > 0) { outbuf[ret] = '\0'; rdaddsc(rs, outbuf); } } } static void whlp_wtext(struct bk_whlp_state *state, const wchar_t *text) { int textlen = text ? ustrlen(text) : 0; char outbuf[256]; int ret; while (textlen > 0 && (ret = charset_from_unicode(&text, &textlen, outbuf, lenof(outbuf)-1, state->charset, &state->cstate, NULL)) > 0) { outbuf[ret] = '\0'; whlp_text(state->h, outbuf); } if (text == NULL) { if ((ret = charset_from_unicode(NULL, 0, outbuf, lenof(outbuf)-1, state->charset, &state->cstate, NULL)) > 0) { outbuf[ret] = '\0'; whlp_text(state->h, outbuf); } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/contents.c������������������������������������������������������������������������������0000644�0001753�0001753�00000014212�12444773746�011755� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * contents.c: build a table of contents */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <limits.h> #include "halibut.h" struct numberstate_Tag { int chapternum; int appendixnum; int ischapter; int *sectionlevels; paragraph **currentsects; paragraph *lastsect; int oklevel; int maxsectlevel; int listitem; stack listitem_stack; wchar_t *chaptertext; /* the word for a chapter */ wchar_t *sectiontext; /* the word for a section */ wchar_t *apptext; /* the word for an appendix */ }; numberstate *number_init(void) { numberstate *ret = snew(numberstate); ret->chapternum = 0; ret->appendixnum = -1; ret->ischapter = 1; ret->oklevel = -1; /* not even in a chapter yet */ ret->maxsectlevel = 32; ret->sectionlevels = snewn(ret->maxsectlevel, int); ret->currentsects = snewn(ret->maxsectlevel+1, paragraph *); memset(ret->currentsects, 0, (ret->maxsectlevel+1)*sizeof(paragraph *)); ret->lastsect = NULL; ret->listitem = -1; ret->listitem_stack = stk_new(); return ret; } void number_free(numberstate *state) { stk_free(state->listitem_stack); sfree(state->sectionlevels); sfree(state->currentsects); sfree(state); } static void dotext(word ***wret, wchar_t *text) { word *mnewword = snew(word); mnewword->text = ustrdup(text); mnewword->type = word_Normal; mnewword->alt = NULL; mnewword->next = NULL; **wret = mnewword; *wret = &mnewword->next; } static void dospace(word ***wret) { word *mnewword = snew(word); mnewword->text = NULL; mnewword->type = word_WhiteSpace; mnewword->alt = NULL; mnewword->next = NULL; **wret = mnewword; *wret = &mnewword->next; } static void donumber(word ***wret, int num) { wchar_t text[20]; wchar_t *p = text + lenof(text); *--p = L'\0'; while (num != 0) { assert(p > text); *--p = L"0123456789"[num % 10]; num /= 10; } dotext(wret, p); } static void doanumber(word ***wret, int num) { wchar_t text[20]; wchar_t *p; int nletters, aton; nletters = 1; aton = 25; while (num > aton) { nletters++; num -= aton+1; if (aton < INT_MAX/26) aton = (aton+1) * 26 - 1; else aton = INT_MAX; } p = text + lenof(text); *--p = L'\0'; while (nletters--) { assert(p > text); *--p = L"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[num % 26]; num /= 26; } dotext(wret, p); } void number_cfg(numberstate *state, paragraph *source) { /* * Defaults */ state->chaptertext = L"Chapter"; state->sectiontext = L"Section"; state->apptext = L"Appendix"; for (; source; source = source->next) { if (source->type == para_Config) { if (!ustricmp(source->keyword, L"chapter")) { state->chaptertext = uadv(source->keyword); } else if (!ustricmp(source->keyword, L"section")) { state->sectiontext = uadv(source->keyword); } else if (!ustricmp(source->keyword, L"appendix")) { state->apptext = uadv(source->keyword); } } } } word *number_mktext(numberstate *state, paragraph *p, wchar_t *category, int *prev, int *errflag) { word *ret = NULL; word **ret2 = &ret; word **pret = &ret; int i, level, thistype; struct listitem_stack_entry { int listitem; int prev; } *lse; level = -2; /* default for non-section-heading */ thistype = p->type; switch (p->type) { case para_Chapter: state->chapternum++; for (i = 0; i < state->maxsectlevel; i++) state->sectionlevels[i] = 0; dotext(&pret, category ? category : state->chaptertext); dospace(&pret); ret2 = pret; donumber(&pret, state->chapternum); state->ischapter = 1; state->oklevel = 0; level = -1; break; case para_Heading: case para_Subsect: level = (p->type == para_Heading ? 0 : p->aux); if (level > state->oklevel) { err_sectjump(&p->fpos); *errflag = TRUE; ret = NULL; break; } state->oklevel = level+1; if (state->maxsectlevel <= level) { state->maxsectlevel = level + 32; state->sectionlevels = sresize(state->sectionlevels, state->maxsectlevel, int); } state->sectionlevels[level]++; for (i = level+1; i < state->maxsectlevel; i++) state->sectionlevels[i] = 0; dotext(&pret, category ? category : state->sectiontext); dospace(&pret); ret2 = pret; if (state->ischapter) donumber(&pret, state->chapternum); else doanumber(&pret, state->appendixnum); for (i = 0; i <= level; i++) { dotext(&pret, L"."); if (state->sectionlevels[i] == 0) state->sectionlevels[i] = 1; donumber(&pret, state->sectionlevels[i]); } break; case para_Appendix: state->appendixnum++; for (i = 0; i < state->maxsectlevel; i++) state->sectionlevels[i] = 0; dotext(&pret, category ? category : state->apptext); dospace(&pret); ret2 = pret; doanumber(&pret, state->appendixnum); state->ischapter = 0; state->oklevel = 0; level = -1; break; case para_UnnumberedChapter: level = -1; break; case para_NumberedList: ret2 = pret; if (*prev != para_NumberedList) state->listitem = 0; state->listitem++; donumber(&pret, state->listitem); break; case para_LcontPush: lse = snew(struct listitem_stack_entry); lse->listitem = state->listitem; lse->prev = *prev; stk_push(state->listitem_stack, lse); state->listitem = 0; break; case para_LcontPop: lse = (struct listitem_stack_entry *)stk_pop(state->listitem_stack); state->listitem = lse->listitem; thistype = lse->prev; sfree(lse); break; } /* * Now set up parent, child and sibling links. */ p->parent = p->child = p->sibling = NULL; if (level != -2) { if (state->currentsects[level+1]) state->currentsects[level+1]->sibling = p; if (level >= 0 && state->currentsects[level]) { p->parent = state->currentsects[level]; if (!state->currentsects[level]->child) state->currentsects[level]->child = p; } state->currentsects[level+1] = state->lastsect = p; for (i = level+2; i < state->maxsectlevel+1; i++) state->currentsects[i] = NULL; } else { p->parent = state->lastsect; } p->kwtext2 = *ret2; *prev = thistype; return ret; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/deflate.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000233566�12444773746�011543� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Reimplementation of Deflate (RFC1951) compression. Adapted from * the version in PuTTY, and extended to write dynamic Huffman * trees and choose block boundaries usefully. */ /* * TODO: * * - Feature: could do with forms of flush other than SYNC_FLUSH. * I'm not sure exactly how those work when you don't know in * advance that your next block will be static (as we did in * PuTTY). And remember the 9-bit limitation of zlib. * + also, zlib has FULL_FLUSH which clears the LZ77 state as * well, for random access. * * - Compression quality: chooseblock() appears to be computing * wildly inaccurate block size estimates. Possible resolutions: * + find and fix some trivial bug I haven't spotted yet * + abandon the entropic approximation and go with trial * Huffman runs * * - Compression quality: see if increasing SYMLIMIT causes * dynamic blocks to start being consistently smaller than it. * + actually we seem to be there already, but check on a * larger corpus. * * - Compression quality: we ought to be able to fall right back * to actual uncompressed blocks if really necessary, though * it's not clear what the criterion for doing so would be. */ /* * This software is copyright 2000-2006 Simon Tatham. * * 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 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. */ #include <stdio.h> #include <stddef.h> #include <string.h> #include <stdlib.h> #include <assert.h> #include "deflate.h" #define snew(type) ( (type *) malloc(sizeof(type)) ) #define snewn(n, type) ( (type *) malloc((n) * sizeof(type)) ) #define sresize(x, n, type) ( (type *) realloc((x), (n) * sizeof(type)) ) #define sfree(x) ( free((x)) ) #define lenof(x) (sizeof((x)) / sizeof(*(x))) #ifndef FALSE #define FALSE 0 #define TRUE (!FALSE) #endif /* ---------------------------------------------------------------------- * This file can be compiled in a number of modes. * * With -DSTANDALONE, it builds a self-contained deflate tool which * can compress, decompress, and also analyse a deflated file to * print out the sequence of literals and copy commands it * contains. * * With -DTESTMODE, it builds a test application which is given a * file on standard input, both compresses and decompresses it, and * outputs the re-decompressed result so it can be conveniently * diffed against the original. Define -DTESTDBG as well for lots * of diagnostics. */ #if defined TESTDBG /* gcc-specific diagnostic macro */ #define debug_int(x...) ( fprintf(stderr, x) ) #define debug(x) ( debug_int x ) #else #define debug(x) ((void)0) #endif #ifdef STANDALONE #define ANALYSIS #endif #ifdef ANALYSIS int analyse_level = 0; #endif /* ---------------------------------------------------------------------- * Basic LZ77 code. This bit is designed modularly, so it could be * ripped out and used in a different LZ77 compressor. Go to it, * and good luck :-) */ struct LZ77InternalContext; struct LZ77Context { struct LZ77InternalContext *ictx; void *userdata; void (*literal) (struct LZ77Context * ctx, unsigned char c); void (*match) (struct LZ77Context * ctx, int distance, int len); }; /* * Initialise the private fields of an LZ77Context. It's up to the * user to initialise the public fields. */ static int lz77_init(struct LZ77Context *ctx); /* * Supply data to be compressed. Will update the private fields of * the LZ77Context, and will call literal() and match() to output. * If `compress' is FALSE, it will never emit a match, but will * instead call literal() for everything. */ static void lz77_compress(struct LZ77Context *ctx, const unsigned char *data, int len, int compress); /* * Modifiable parameters. */ #define WINSIZE 32768 /* window size. Must be power of 2! */ #define HASHMAX 2039 /* one more than max hash value */ #define MAXMATCH 32 /* how many matches we track */ #define HASHCHARS 3 /* how many chars make a hash */ /* * This compressor takes a less slapdash approach than the * gzip/zlib one. Rather than allowing our hash chains to fall into * disuse near the far end, we keep them doubly linked so we can * _find_ the far end, and then every time we add a new byte to the * window (thus rolling round by one and removing the previous * byte), we can carefully remove the hash chain entry. */ #define INVALID -1 /* invalid hash _and_ invalid offset */ struct WindowEntry { short next, prev; /* array indices within the window */ short hashval; }; struct HashEntry { short first; /* window index of first in chain */ }; struct Match { int distance, len; }; struct LZ77InternalContext { struct WindowEntry win[WINSIZE]; unsigned char data[WINSIZE]; int winpos; struct HashEntry hashtab[HASHMAX]; unsigned char pending[HASHCHARS]; int npending; }; static int lz77_hash(const unsigned char *data) { return (257 * data[0] + 263 * data[1] + 269 * data[2]) % HASHMAX; } static int lz77_init(struct LZ77Context *ctx) { struct LZ77InternalContext *st; int i; st = snew(struct LZ77InternalContext); if (!st) return 0; ctx->ictx = st; for (i = 0; i < WINSIZE; i++) st->win[i].next = st->win[i].prev = st->win[i].hashval = INVALID; for (i = 0; i < HASHMAX; i++) st->hashtab[i].first = INVALID; st->winpos = 0; st->npending = 0; return 1; } static void lz77_advance(struct LZ77InternalContext *st, unsigned char c, int hash) { int off; /* * Remove the hash entry at winpos from the tail of its chain, * or empty the chain if it's the only thing on the chain. */ if (st->win[st->winpos].prev != INVALID) { st->win[st->win[st->winpos].prev].next = INVALID; } else if (st->win[st->winpos].hashval != INVALID) { st->hashtab[st->win[st->winpos].hashval].first = INVALID; } /* * Create a new entry at winpos and add it to the head of its * hash chain. */ st->win[st->winpos].hashval = hash; st->win[st->winpos].prev = INVALID; off = st->win[st->winpos].next = st->hashtab[hash].first; st->hashtab[hash].first = st->winpos; if (off != INVALID) st->win[off].prev = st->winpos; st->data[st->winpos] = c; /* * Advance the window pointer. */ st->winpos = (st->winpos + 1) & (WINSIZE - 1); } #define CHARAT(k) ( (k)<0 ? st->data[(st->winpos+k)&(WINSIZE-1)] : data[k] ) static void lz77_compress(struct LZ77Context *ctx, const unsigned char *data, int len, int compress) { struct LZ77InternalContext *st = ctx->ictx; int i, hash, distance, off, nmatch, matchlen, advance; struct Match defermatch, matches[MAXMATCH]; int deferchr; /* * Add any pending characters from last time to the window. (We * might not be able to.) */ for (i = 0; i < st->npending; i++) { unsigned char foo[HASHCHARS]; int j; if (len + st->npending - i < HASHCHARS) { /* Update the pending array. */ for (j = i; j < st->npending; j++) st->pending[j - i] = st->pending[j]; break; } for (j = 0; j < HASHCHARS; j++) foo[j] = (i + j < st->npending ? st->pending[i + j] : data[i + j - st->npending]); lz77_advance(st, foo[0], lz77_hash(foo)); } st->npending -= i; defermatch.len = 0; deferchr = '\0'; while (len > 0) { /* Don't even look for a match, if we're not compressing. */ if (compress && len >= HASHCHARS) { /* * Hash the next few characters. */ hash = lz77_hash(data); /* * Look the hash up in the corresponding hash chain and see * what we can find. */ nmatch = 0; for (off = st->hashtab[hash].first; off != INVALID; off = st->win[off].next) { /* distance = 1 if off == st->winpos-1 */ /* distance = WINSIZE if off == st->winpos */ distance = WINSIZE - (off + WINSIZE - st->winpos) % WINSIZE; for (i = 0; i < HASHCHARS; i++) if (CHARAT(i) != CHARAT(i - distance)) break; if (i == HASHCHARS) { matches[nmatch].distance = distance; matches[nmatch].len = 3; if (++nmatch >= MAXMATCH) break; } } } else { nmatch = 0; hash = INVALID; } if (nmatch > 0) { /* * We've now filled up matches[] with nmatch potential * matches. Follow them down to find the longest. (We * assume here that it's always worth favouring a * longer match over a shorter one.) */ matchlen = HASHCHARS; while (matchlen < len) { int j; for (i = j = 0; i < nmatch; i++) { if (CHARAT(matchlen) == CHARAT(matchlen - matches[i].distance)) { matches[j++] = matches[i]; } } if (j == 0) break; matchlen++; nmatch = j; } /* * We've now got all the longest matches. We favour the * shorter distances, which means we go with matches[0]. * So see if we want to defer it or throw it away. */ matches[0].len = matchlen; if (defermatch.len > 0) { if (matches[0].len > defermatch.len + 1) { /* We have a better match. Emit the deferred char, * and defer this match. */ ctx->literal(ctx, (unsigned char) deferchr); defermatch = matches[0]; deferchr = data[0]; advance = 1; } else { /* We don't have a better match. Do the deferred one. */ ctx->match(ctx, defermatch.distance, defermatch.len); advance = defermatch.len - 1; defermatch.len = 0; } } else { /* There was no deferred match. Defer this one. */ defermatch = matches[0]; deferchr = data[0]; advance = 1; } } else { /* * We found no matches. Emit the deferred match, if * any; otherwise emit a literal. */ if (defermatch.len > 0) { ctx->match(ctx, defermatch.distance, defermatch.len); advance = defermatch.len - 1; defermatch.len = 0; } else { ctx->literal(ctx, data[0]); advance = 1; } } /* * Now advance the position by `advance' characters, * keeping the window and hash chains consistent. */ while (advance > 0) { if (len >= HASHCHARS) { lz77_advance(st, *data, lz77_hash(data)); } else { st->pending[st->npending++] = *data; } data++; len--; advance--; } } } /* ---------------------------------------------------------------------- * Deflate functionality common to both compression and decompression. */ static const unsigned char lenlenmap[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; #define MAXCODELEN 16 /* * Given a sequence of Huffman code lengths, compute the actual * codes, in the final form suitable for feeding to outbits (i.e. * already bit-mirrored). * * Returns the maximum code length found. Can also return -1 to * indicate the table was overcommitted (too many or too short * codes to exactly cover the possible space), or -2 to indicate it * was undercommitted (too few or too long codes). */ static int hufcodes(const unsigned char *lengths, int *codes, int nsyms) { int count[MAXCODELEN], startcode[MAXCODELEN]; int code, maxlen; int i, j; /* Count the codes of each length. */ maxlen = 0; for (i = 1; i < MAXCODELEN; i++) count[i] = 0; for (i = 0; i < nsyms; i++) { count[lengths[i]]++; if (maxlen < lengths[i]) maxlen = lengths[i]; } /* Determine the starting code for each length block. */ code = 0; for (i = 1; i < MAXCODELEN; i++) { startcode[i] = code; code += count[i]; if (code > (1 << i)) maxlen = -1; /* overcommitted */ code <<= 1; } if (code < (1 << MAXCODELEN)) maxlen = -2; /* undercommitted */ /* Determine the code for each symbol. Mirrored, of course. */ for (i = 0; i < nsyms; i++) { code = startcode[lengths[i]]++; codes[i] = 0; for (j = 0; j < lengths[i]; j++) { codes[i] = (codes[i] << 1) | (code & 1); code >>= 1; } } return maxlen; } /* * Adler32 checksum function. */ static unsigned long adler32_update(unsigned long s, const unsigned char *data, int len) { unsigned s1 = s & 0xFFFF, s2 = (s >> 16) & 0xFFFF; int i; for (i = 0; i < len; i++) { s1 += data[i]; s2 += s1; if (!(i & 0xFFF)) { s1 %= 65521; s2 %= 65521; } } return ((s2 % 65521) << 16) | (s1 % 65521); } /* * CRC32 checksum function. */ static unsigned long crc32_update(unsigned long crcword, const unsigned char *data, int len) { static const unsigned long crc32_table[256] = { 0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL, 0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L, 0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L, 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L, 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL, 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L, 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL, 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L, 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L, 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL, 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L, 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L, 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L, 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL, 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L, 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL, 0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL, 0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L, 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L, 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L, 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL, 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L, 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL, 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L, 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L, 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL, 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L, 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L, 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L, 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL, 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L, 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL, 0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL, 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L, 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L, 0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L, 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL, 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L, 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL, 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L, 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L, 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL, 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L, 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L, 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L, 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL, 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L, 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL, 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL, 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L, 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L, 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L, 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL, 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L, 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL, 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L, 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L, 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL, 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L, 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L, 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L, 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL, 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L, 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL }; crcword ^= 0xFFFFFFFFL; while (len--) { unsigned long newbyte = *data++; newbyte ^= crcword & 0xFFL; crcword = (crcword >> 8) ^ crc32_table[newbyte]; } return crcword ^ 0xFFFFFFFFL; } typedef struct { short code, extrabits; int min, max; } coderecord; static const coderecord lencodes[] = { {257, 0, 3, 3}, {258, 0, 4, 4}, {259, 0, 5, 5}, {260, 0, 6, 6}, {261, 0, 7, 7}, {262, 0, 8, 8}, {263, 0, 9, 9}, {264, 0, 10, 10}, {265, 1, 11, 12}, {266, 1, 13, 14}, {267, 1, 15, 16}, {268, 1, 17, 18}, {269, 2, 19, 22}, {270, 2, 23, 26}, {271, 2, 27, 30}, {272, 2, 31, 34}, {273, 3, 35, 42}, {274, 3, 43, 50}, {275, 3, 51, 58}, {276, 3, 59, 66}, {277, 4, 67, 82}, {278, 4, 83, 98}, {279, 4, 99, 114}, {280, 4, 115, 130}, {281, 5, 131, 162}, {282, 5, 163, 194}, {283, 5, 195, 226}, {284, 5, 227, 257}, {285, 0, 258, 258}, }; static const coderecord distcodes[] = { {0, 0, 1, 1}, {1, 0, 2, 2}, {2, 0, 3, 3}, {3, 0, 4, 4}, {4, 1, 5, 6}, {5, 1, 7, 8}, {6, 2, 9, 12}, {7, 2, 13, 16}, {8, 3, 17, 24}, {9, 3, 25, 32}, {10, 4, 33, 48}, {11, 4, 49, 64}, {12, 5, 65, 96}, {13, 5, 97, 128}, {14, 6, 129, 192}, {15, 6, 193, 256}, {16, 7, 257, 384}, {17, 7, 385, 512}, {18, 8, 513, 768}, {19, 8, 769, 1024}, {20, 9, 1025, 1536}, {21, 9, 1537, 2048}, {22, 10, 2049, 3072}, {23, 10, 3073, 4096}, {24, 11, 4097, 6144}, {25, 11, 6145, 8192}, {26, 12, 8193, 12288}, {27, 12, 12289, 16384}, {28, 13, 16385, 24576}, {29, 13, 24577, 32768}, }; /* ---------------------------------------------------------------------- * Deflate compression. */ #define SYMLIMIT 65536 #define SYMPFX_LITLEN 0x00000000U #define SYMPFX_DIST 0x40000000U #define SYMPFX_EXTRABITS 0x80000000U #define SYMPFX_CODELEN 0xC0000000U #define SYMPFX_MASK 0xC0000000U #define SYM_EXTRABITS_MASK 0x3C000000U #define SYM_EXTRABITS_SHIFT 26 struct huftrees { unsigned char *len_litlen; int *code_litlen; unsigned char *len_dist; int *code_dist; unsigned char *len_codelen; int *code_codelen; }; struct deflate_compress_ctx { struct LZ77Context *lzc; unsigned char *outbuf; int outlen, outsize; unsigned long outbits; int noutbits; int firstblock; unsigned long *syms; int symstart, nsyms; int type; unsigned long checksum; unsigned long datasize; int lastblock; int finished; unsigned char static_len1[288], static_len2[30]; int static_code1[288], static_code2[30]; struct huftrees sht; #ifdef STATISTICS unsigned long bitcount; #endif }; static void outbits(deflate_compress_ctx *out, unsigned long bits, int nbits) { assert(out->noutbits + nbits <= 32); out->outbits |= bits << out->noutbits; out->noutbits += nbits; while (out->noutbits >= 8) { if (out->outlen >= out->outsize) { out->outsize = out->outlen + 64; out->outbuf = sresize(out->outbuf, out->outsize, unsigned char); } out->outbuf[out->outlen++] = (unsigned char) (out->outbits & 0xFF); out->outbits >>= 8; out->noutbits -= 8; } #ifdef STATISTICS out->bitcount += nbits; #endif } /* * Binary heap functions used by buildhuf(). Each one assumes the * heap to be stored in an array of ints, with two ints per node * (user data and key). They take in the old heap length, and * return the new one. */ #define HEAPPARENT(x) (((x)-2)/4*2) #define HEAPLEFT(x) ((x)*2+2) #define HEAPRIGHT(x) ((x)*2+4) static int addheap(int *heap, int len, int userdata, int key) { int me, dad, tmp; me = len; heap[len++] = userdata; heap[len++] = key; while (me > 0) { dad = HEAPPARENT(me); if (heap[me+1] < heap[dad+1]) { tmp = heap[me]; heap[me] = heap[dad]; heap[dad] = tmp; tmp = heap[me+1]; heap[me+1] = heap[dad+1]; heap[dad+1] = tmp; me = dad; } else break; } return len; } static int rmheap(int *heap, int len, int *userdata, int *key) { int me, lc, rc, c, tmp; len -= 2; *userdata = heap[0]; *key = heap[1]; heap[0] = heap[len]; heap[1] = heap[len+1]; me = 0; while (1) { lc = HEAPLEFT(me); rc = HEAPRIGHT(me); if (lc >= len) break; else if (rc >= len || heap[lc+1] < heap[rc+1]) c = lc; else c = rc; if (heap[me+1] > heap[c+1]) { tmp = heap[me]; heap[me] = heap[c]; heap[c] = tmp; tmp = heap[me+1]; heap[me+1] = heap[c+1]; heap[c+1] = tmp; } else break; me = c; } return len; } /* * The core of the Huffman algorithm: takes an input array of * symbol frequencies, and produces an output array of code * lengths. * * This is basically a generic Huffman implementation, but it has * one zlib-related quirk which is that it caps the output code * lengths to fit in an unsigned char (which is safe since Deflate * will reject anything longer than 15 anyway). Anyone wanting to * rip it out and use it in another context should find that easy * to remove. */ #define HUFMAX 286 static void buildhuf(const int *freqs, unsigned char *lengths, int nsyms) { int parent[2*HUFMAX-1]; int length[2*HUFMAX-1]; int heap[2*HUFMAX]; int heapsize; int i, j, n; int si, sj; assert(nsyms <= HUFMAX); memset(parent, 0, sizeof(parent)); /* * Begin by building the heap. */ heapsize = 0; for (i = 0; i < nsyms; i++) if (freqs[i] > 0) /* leave unused symbols out totally */ heapsize = addheap(heap, heapsize, i, freqs[i]); /* * Now repeatedly take two elements off the heap and merge * them. */ n = HUFMAX; while (heapsize > 2) { heapsize = rmheap(heap, heapsize, &i, &si); heapsize = rmheap(heap, heapsize, &j, &sj); parent[i] = n; parent[j] = n; heapsize = addheap(heap, heapsize, n, si + sj); n++; } /* * Now we have our tree, in the form of a link from each node * to the index of its parent. Count back down the tree to * determine the code lengths. */ memset(length, 0, sizeof(length)); /* The tree root has length 0 after that, which is correct. */ for (i = n-1; i-- ;) if (parent[i] > 0) length[i] = 1 + length[parent[i]]; /* * And that's it. (Simple, wasn't it?) Copy the lengths into * the output array and leave. * * Here we cap lengths to fit in unsigned char. */ for (i = 0; i < nsyms; i++) lengths[i] = (length[i] > 255 ? 255 : length[i]); } /* * Wrapper around buildhuf() which enforces the Deflate restriction * that no code length may exceed 15 bits, or 7 for the auxiliary * code length alphabet. This function has the same calling * semantics as buildhuf(), except that it might modify the freqs * array. */ static void deflate_buildhuf(int *freqs, unsigned char *lengths, int nsyms, int limit) { int smallestfreq, totalfreq, nactivesyms; int num, denom, adjust; int i; int maxprob; /* * Nasty special case: if the frequency table has fewer than * two non-zero elements, we must invent some, because we can't * have fewer than one bit encoding a symbol. */ assert(nsyms >= 2); { int count = 0; for (i = 0; i < nsyms; i++) if (freqs[i] > 0) count++; if (count < 2) { for (i = 0; i < nsyms && count > 0; i++) if (freqs[i] == 0) { freqs[i] = 1; count--; } } } /* * First, try building the Huffman table the normal way. If * this works, it's optimal, so we don't want to mess with it. */ buildhuf(freqs, lengths, nsyms); for (i = 0; i < nsyms; i++) if (lengths[i] > limit) break; if (i == nsyms) return; /* OK */ /* * The Huffman algorithm can only ever generate a code length * of N bits or more if there is a symbol whose probability is * less than the reciprocal of the (N+2)th Fibonacci number * (counting from F_0=0 and F_1=1), i.e. 1/2584 for N=16, or * 1/55 for N=8. (This is a necessary though not sufficient * condition.) * * Why is this? Well, consider the input symbol with the * smallest probability. Let that probability be x. In order * for this symbol to have a code length of at least 1, the * Huffman algorithm will have to merge it with some other * node; and since x is the smallest probability, the node it * gets merged with must be at least x. Thus, the probability * of the resulting combined node will be at least 2x. Now in * order for our node to reach depth 2, this 2x-node must be * merged again. But what with? We can't assume the node it * merges with is at least 2x, because this one might only be * the _second_ smallest remaining node. But we do know the * node it merges with must be at least x, so our order-2 * internal node is at least 3x. * * How small a node can merge with _that_ to get an order-3 * internal node? Well, it must be at least 2x, because if it * was smaller than that then it would have been one of the two * smallest nodes in the previous step and been merged at that * point. So at least 3x, plus at least 2x, comes to at least * 5x for an order-3 node. * * And so it goes on: at every stage we must merge our current * node with a node at least as big as the bigger of this one's * two parents, and from this starting point that gives rise to * the Fibonacci sequence. So we find that in order to have a * node n levels deep (i.e. a maximum code length of n), the * overall probability of the root of the entire tree must be * at least F_{n+2} times the probability of the rarest symbol. * In other words, since the overall probability is 1, it is a * necessary condition for a code length of 16 or more that * there must be at least one symbol with probability <= * 1/F_18. * * (To demonstrate that a probability this big really can give * rise to a code length of 16, consider the set of input * frequencies { 1-epsilon, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, * 89, 144, 233, 377, 610, 987 }, for arbitrarily small * epsilon.) * * So here buildhuf() has returned us an overlong code. So to * ensure it doesn't do it again, we add a constant to all the * (non-zero) symbol frequencies, causing them to become more * balanced and removing the danger. We can then feed the * results back to the standard buildhuf() and be * assert()-level confident that the resulting code lengths * contain nothing outside the permitted range. */ assert(limit == 15 || limit == 7); maxprob = (limit == 15 ? 2584 : 55); /* no point in computing full F_n */ totalfreq = nactivesyms = 0; smallestfreq = -1; for (i = 0; i < nsyms; i++) { if (freqs[i] == 0) continue; if (smallestfreq < 0 || smallestfreq > freqs[i]) smallestfreq = freqs[i]; totalfreq += freqs[i]; nactivesyms++; } assert(smallestfreq <= totalfreq / maxprob); /* * We want to find the smallest integer `adjust' such that * (totalfreq + nactivesyms * adjust) / (smallestfreq + * adjust) is less than maxprob. A bit of algebra tells us * that the threshold value is equal to * * totalfreq - maxprob * smallestfreq * ---------------------------------- * maxprob - nactivesyms * * rounded up, of course. And we'll only even be trying * this if */ num = totalfreq - smallestfreq * maxprob; denom = maxprob - nactivesyms; adjust = (num + denom - 1) / denom; /* * Now add `adjust' to all the input symbol frequencies. */ for (i = 0; i < nsyms; i++) if (freqs[i] != 0) freqs[i] += adjust; /* * Rebuild the Huffman tree... */ buildhuf(freqs, lengths, nsyms); /* * ... and this time it ought to be OK. */ for (i = 0; i < nsyms; i++) assert(lengths[i] <= limit); } /* * Compute the bit length of a symbol, given the three Huffman * trees. */ static int symsize(unsigned sym, const struct huftrees *trees) { unsigned basesym = sym &~ SYMPFX_MASK; switch (sym & SYMPFX_MASK) { case SYMPFX_LITLEN: return trees->len_litlen[basesym]; case SYMPFX_DIST: return trees->len_dist[basesym]; case SYMPFX_CODELEN: return trees->len_codelen[basesym]; default /*case SYMPFX_EXTRABITS*/: return basesym >> SYM_EXTRABITS_SHIFT; } } /* * Write out a single symbol, given the three Huffman trees. */ static void writesym(deflate_compress_ctx *out, unsigned sym, const struct huftrees *trees) { unsigned basesym = sym &~ SYMPFX_MASK; int i; switch (sym & SYMPFX_MASK) { case SYMPFX_LITLEN: debug(("send: litlen %d\n", basesym)); outbits(out, trees->code_litlen[basesym], trees->len_litlen[basesym]); break; case SYMPFX_DIST: debug(("send: dist %d\n", basesym)); outbits(out, trees->code_dist[basesym], trees->len_dist[basesym]); break; case SYMPFX_CODELEN: debug(("send: codelen %d\n", basesym)); outbits(out, trees->code_codelen[basesym],trees->len_codelen[basesym]); break; case SYMPFX_EXTRABITS: i = basesym >> SYM_EXTRABITS_SHIFT; basesym &= ~SYM_EXTRABITS_MASK; debug(("send: extrabits %d/%d\n", basesym, i)); outbits(out, basesym, i); break; } } /* * outblock() must output _either_ a dynamic block of length * `dynamic_len', _or_ a static block of length `static_len', but * it gets to choose which. */ static void outblock(deflate_compress_ctx *out, int dynamic_len, int static_len) { int freqs1[286], freqs2[30], freqs3[19]; unsigned char len1[286], len2[30], len3[19]; int code1[286], code2[30], code3[19]; int hlit, hdist, hclen, bfinal, btype; int treesrc[286 + 30]; int treesyms[286 + 30]; int codelen[19]; int i, ntreesrc, ntreesyms; int dynamic, blklen; struct huftrees dht; const struct huftrees *ht; #ifdef STATISTICS unsigned long bitcount_before; #endif dht.len_litlen = len1; dht.len_dist = len2; dht.len_codelen = len3; dht.code_litlen = code1; dht.code_dist = code2; dht.code_codelen = code3; /* * We make our choice of block to output by doing all the * detailed work to determine the exact length of each possible * block. Then we choose the one which has fewest output bits * per symbol. */ /* * First build the two main Huffman trees for the dynamic * block. */ /* * Count up the frequency tables. */ memset(freqs1, 0, sizeof(freqs1)); memset(freqs2, 0, sizeof(freqs2)); freqs1[256] = 1; /* we're bound to need one EOB */ for (i = 0; i < dynamic_len; i++) { unsigned sym = out->syms[(out->symstart + i) % SYMLIMIT]; /* * Increment the occurrence counter for this symbol, if * it's in one of the Huffman alphabets and isn't extra * bits. */ if ((sym & SYMPFX_MASK) == SYMPFX_LITLEN) { sym &= ~SYMPFX_MASK; assert(sym < lenof(freqs1)); freqs1[sym]++; } else if ((sym & SYMPFX_MASK) == SYMPFX_DIST) { sym &= ~SYMPFX_MASK; assert(sym < lenof(freqs2)); freqs2[sym]++; } } deflate_buildhuf(freqs1, len1, lenof(freqs1), 15); deflate_buildhuf(freqs2, len2, lenof(freqs2), 15); hufcodes(len1, code1, lenof(freqs1)); hufcodes(len2, code2, lenof(freqs2)); /* * Determine HLIT and HDIST. */ for (hlit = 286; hlit > 257 && len1[hlit-1] == 0; hlit--); for (hdist = 30; hdist > 1 && len2[hdist-1] == 0; hdist--); /* * Write out the list of symbols used to transmit the * trees. */ ntreesrc = 0; for (i = 0; i < hlit; i++) treesrc[ntreesrc++] = len1[i]; for (i = 0; i < hdist; i++) treesrc[ntreesrc++] = len2[i]; ntreesyms = 0; for (i = 0; i < ntreesrc ;) { int j = 1; int k; /* Find length of run of the same length code. */ while (i+j < ntreesrc && treesrc[i+j] == treesrc[i]) j++; /* Encode that run as economically as we can. */ k = j; if (treesrc[i] == 0) { /* * Zero code length: we can output run codes for * 3-138 zeroes. So if we have fewer than 3 zeroes, * we just output literals. Otherwise, we output * nothing but run codes, and tweak their lengths * to make sure we aren't left with under 3 at the * end. */ if (k < 3) { while (k--) treesyms[ntreesyms++] = 0 | SYMPFX_CODELEN; } else { while (k > 0) { int rpt = (k < 138 ? k : 138); if (rpt > k-3 && rpt < k) rpt = k-3; assert(rpt >= 3 && rpt <= 138); if (rpt < 11) { treesyms[ntreesyms++] = 17 | SYMPFX_CODELEN; treesyms[ntreesyms++] = (SYMPFX_EXTRABITS | (rpt - 3) | (3 << SYM_EXTRABITS_SHIFT)); } else { treesyms[ntreesyms++] = 18 | SYMPFX_CODELEN; treesyms[ntreesyms++] = (SYMPFX_EXTRABITS | (rpt - 11) | (7 << SYM_EXTRABITS_SHIFT)); } k -= rpt; } } } else { /* * Non-zero code length: we must output the first * one explicitly, then we can output a copy code * for 3-6 repeats. So if we have fewer than 4 * repeats, we _just_ output literals. Otherwise, * we output one literal plus at least one copy * code, and tweak the copy codes to make sure we * aren't left with under 3 at the end. */ assert(treesrc[i] < 16); treesyms[ntreesyms++] = treesrc[i] | SYMPFX_CODELEN; k--; if (k < 3) { while (k--) treesyms[ntreesyms++] = treesrc[i] | SYMPFX_CODELEN; } else { while (k > 0) { int rpt = (k < 6 ? k : 6); if (rpt > k-3 && rpt < k) rpt = k-3; assert(rpt >= 3 && rpt <= 6); treesyms[ntreesyms++] = 16 | SYMPFX_CODELEN; treesyms[ntreesyms++] = (SYMPFX_EXTRABITS | (rpt - 3) | (2 << SYM_EXTRABITS_SHIFT)); k -= rpt; } } } i += j; } assert((unsigned)ntreesyms < lenof(treesyms)); /* * Count up the frequency table for the tree-transmission * symbols, and build the auxiliary Huffman tree for that. */ memset(freqs3, 0, sizeof(freqs3)); for (i = 0; i < ntreesyms; i++) { unsigned sym = treesyms[i]; /* * Increment the occurrence counter for this symbol, if * it's the Huffman alphabet and isn't extra bits. */ if ((sym & SYMPFX_MASK) == SYMPFX_CODELEN) { sym &= ~SYMPFX_MASK; assert(sym < lenof(freqs3)); freqs3[sym]++; } } deflate_buildhuf(freqs3, len3, lenof(freqs3), 7); hufcodes(len3, code3, lenof(freqs3)); /* * Reorder the code length codes into transmission order, and * determine HCLEN. */ for (i = 0; i < 19; i++) codelen[i] = len3[lenlenmap[i]]; for (hclen = 19; hclen > 4 && codelen[hclen-1] == 0; hclen--) /* empty loop body */; /* * Now work out the exact size of both the dynamic and the * static block, in bits. */ { int ssize, dsize; /* * First the dynamic block. */ dsize = 3 + 5 + 5 + 4; /* 3-bit header, HLIT, HDIST, HCLEN */ dsize += 3 * hclen; /* code-length-alphabet code lengths */ /* Code lengths */ for (i = 0; i < ntreesyms; i++) dsize += symsize(treesyms[i], &dht); /* The actual block data */ for (i = 0; i < dynamic_len; i++) { unsigned sym = out->syms[(out->symstart + i) % SYMLIMIT]; dsize += symsize(sym, &dht); } /* And the end-of-data symbol. */ dsize += symsize(SYMPFX_LITLEN | 256, &dht); /* * Now the static block. */ ssize = 3; /* 3-bit block header */ /* The actual block data */ for (i = 0; i < static_len; i++) { unsigned sym = out->syms[(out->symstart + i) % SYMLIMIT]; ssize += symsize(sym, &out->sht); } /* And the end-of-data symbol. */ ssize += symsize(SYMPFX_LITLEN | 256, &out->sht); /* * Compare the two and decide which to output. We break * exact ties in favour of the static block, because of the * special case in which that block has zero length. */ dynamic = ((double)ssize * dynamic_len > (double)dsize * static_len); ht = dynamic ? &dht : &out->sht; blklen = dynamic ? dynamic_len : static_len; } /* * Actually transmit the block. */ /* 3-bit block header */ bfinal = (out->lastblock ? 1 : 0); btype = dynamic ? 2 : 1; debug(("send: bfinal=%d btype=%d\n", bfinal, btype)); outbits(out, bfinal, 1); outbits(out, btype, 2); #ifdef STATISTICS bitcount_before = out->bitcount; #endif if (dynamic) { /* HLIT, HDIST and HCLEN */ debug(("send: hlit=%d hdist=%d hclen=%d\n", hlit, hdist, hclen)); outbits(out, hlit - 257, 5); outbits(out, hdist - 1, 5); outbits(out, hclen - 4, 4); /* Code lengths for the auxiliary tree */ for (i = 0; i < hclen; i++) { debug(("send: lenlen %d\n", codelen[i])); outbits(out, codelen[i], 3); } /* Code lengths for the literal/length and distance trees */ for (i = 0; i < ntreesyms; i++) writesym(out, treesyms[i], ht); #ifdef STATISTICS fprintf(stderr, "total tree size %lu bits\n", out->bitcount - bitcount_before); #endif } /* Output the actual symbols from the buffer */ for (i = 0; i < blklen; i++) { unsigned sym = out->syms[(out->symstart + i) % SYMLIMIT]; writesym(out, sym, ht); } /* Output the end-of-data symbol */ writesym(out, SYMPFX_LITLEN | 256, ht); /* * Remove all the just-output symbols from the symbol buffer by * adjusting symstart and nsyms. */ out->symstart = (out->symstart + blklen) % SYMLIMIT; out->nsyms -= blklen; } /* * Give the approximate log-base-2 of an input integer, measured in * 8ths of a bit. (I.e. this computes an integer approximation to * 8*logbase2(x).) */ static int approxlog2(unsigned x) { int ret = 31*8; /* * Binary-search to get the top bit of x up to bit 31. */ if (x < 0x00010000U) x <<= 16, ret -= 16*8; if (x < 0x01000000U) x <<= 8, ret -= 8*8; if (x < 0x10000000U) x <<= 4, ret -= 4*8; if (x < 0x40000000U) x <<= 2, ret -= 2*8; if (x < 0x80000000U) x <<= 1, ret -= 1*8; /* * Now we know the logarithm we want is in [ret,ret+1). * Determine the bottom three bits by checking against * threshold values. * * (Each of these threshold values is 0x80000000 times an odd * power of 2^(1/16). Therefore, this function rounds to * nearest.) */ if (x <= 0xAD583EEAU) { if (x <= 0x91C3D373U) ret += (x <= 0x85AAC367U ? 0 : 1); else ret += (x <= 0x9EF53260U ? 2 : 3); } else { if (x <= 0xCE248C15U) ret += (x <= 0xBD08A39FU ? 4 : 5); else ret += (x <= 0xE0CCDEECU ? 6 : x <= 0xF5257D15L ? 7 : 8); } return ret; } static void chooseblock(deflate_compress_ctx *out) { int freqs1[286], freqs2[30]; int i, len, bestlen, longestlen = 0; int total1, total2; int bestvfm; memset(freqs1, 0, sizeof(freqs1)); memset(freqs2, 0, sizeof(freqs2)); freqs1[256] = 1; /* we're bound to need one EOB */ total1 = 1; total2 = 0; /* * Iterate over all possible block lengths, computing the * entropic coding approximation to the final length at every * stage. We divide the result by the number of symbols * encoded, to determine the `value for money' (overall * bits-per-symbol count) of a block of that length. */ bestlen = -1; bestvfm = 0; len = 300 * 8; /* very approximate size of the Huffman trees */ for (i = 0; i < out->nsyms; i++) { unsigned sym = out->syms[(out->symstart + i) % SYMLIMIT]; if (i > 0 && (sym & SYMPFX_MASK) == SYMPFX_LITLEN) { /* * This is a viable point at which to end the block. * Compute the value for money. */ int vfm = i * 32768 / len; /* symbols encoded per bit */ if (bestlen < 0 || vfm > bestvfm) { bestlen = i; bestvfm = vfm; } longestlen = i; } /* * Increment the occurrence counter for this symbol, if * it's in one of the Huffman alphabets and isn't extra * bits. */ if ((sym & SYMPFX_MASK) == SYMPFX_LITLEN) { sym &= ~SYMPFX_MASK; assert(sym < lenof(freqs1)); len += freqs1[sym] * approxlog2(freqs1[sym]); len -= total1 * approxlog2(total1); freqs1[sym]++; total1++; len -= freqs1[sym] * approxlog2(freqs1[sym]); len += total1 * approxlog2(total1); } else if ((sym & SYMPFX_MASK) == SYMPFX_DIST) { sym &= ~SYMPFX_MASK; assert(sym < lenof(freqs2)); len += freqs2[sym] * approxlog2(freqs2[sym]); len -= total2 * approxlog2(total2); freqs2[sym]++; total2++; len -= freqs2[sym] * approxlog2(freqs2[sym]); len += total2 * approxlog2(total2); } else if ((sym & SYMPFX_MASK) == SYMPFX_EXTRABITS) { len += 8 * ((sym &~ SYMPFX_MASK) >> SYM_EXTRABITS_SHIFT); } } assert(bestlen > 0); outblock(out, bestlen, longestlen); } /* * Force the current symbol buffer to be flushed out as a single * block. */ static void flushblock(deflate_compress_ctx *out) { /* * No need to check that out->nsyms is a valid block length: we * know it has to be, because flushblock() is called in between * two matches/literals. */ outblock(out, out->nsyms, out->nsyms); assert(out->nsyms == 0); } /* * Place a symbol into the symbols buffer. */ static void outsym(deflate_compress_ctx *out, unsigned long sym) { assert(out->nsyms < SYMLIMIT); out->syms[(out->symstart + out->nsyms++) % SYMLIMIT] = sym; if (out->nsyms == SYMLIMIT) chooseblock(out); } static void literal(struct LZ77Context *ectx, unsigned char c) { deflate_compress_ctx *out = (deflate_compress_ctx *) ectx->userdata; outsym(out, SYMPFX_LITLEN | c); } static void match(struct LZ77Context *ectx, int distance, int len) { const coderecord *d, *l; int i, j, k; deflate_compress_ctx *out = (deflate_compress_ctx *) ectx->userdata; while (len > 0) { int thislen; /* * We can transmit matches of lengths 3 through 258 * inclusive. So if len exceeds 258, we must transmit in * several steps, with 258 or less in each step. * * Specifically: if len >= 261, we can transmit 258 and be * sure of having at least 3 left for the next step. And if * len <= 258, we can just transmit len. But if len == 259 * or 260, we must transmit len-3. */ thislen = (len > 260 ? 258 : len <= 258 ? len : len - 3); len -= thislen; /* * Binary-search to find which length code we're * transmitting. */ i = -1; j = sizeof(lencodes) / sizeof(*lencodes); while (1) { assert(j - i >= 2); k = (j + i) / 2; if (thislen < lencodes[k].min) j = k; else if (thislen > lencodes[k].max) i = k; else { l = &lencodes[k]; break; /* found it! */ } } /* * Transmit the length code. */ outsym(out, SYMPFX_LITLEN | l->code); /* * Transmit the extra bits. */ if (l->extrabits) { outsym(out, (SYMPFX_EXTRABITS | (thislen - l->min) | (l->extrabits << SYM_EXTRABITS_SHIFT))); } /* * Binary-search to find which distance code we're * transmitting. */ i = -1; j = sizeof(distcodes) / sizeof(*distcodes); while (1) { assert(j - i >= 2); k = (j + i) / 2; if (distance < distcodes[k].min) j = k; else if (distance > distcodes[k].max) i = k; else { d = &distcodes[k]; break; /* found it! */ } } /* * Write the distance code. */ outsym(out, SYMPFX_DIST | d->code); /* * Transmit the extra bits. */ if (d->extrabits) { outsym(out, (SYMPFX_EXTRABITS | (distance - d->min) | (d->extrabits << SYM_EXTRABITS_SHIFT))); } } } deflate_compress_ctx *deflate_compress_new(int type) { deflate_compress_ctx *out; struct LZ77Context *ectx = snew(struct LZ77Context); lz77_init(ectx); ectx->literal = literal; ectx->match = match; out = snew(deflate_compress_ctx); out->type = type; out->outbits = out->noutbits = 0; out->firstblock = TRUE; #ifdef STATISTICS out->bitcount = 0; #endif out->syms = snewn(SYMLIMIT, unsigned long); out->symstart = out->nsyms = 0; out->checksum = (type == DEFLATE_TYPE_ZLIB ? 1 : 0); out->datasize = 0; out->lastblock = FALSE; out->finished = FALSE; /* * Build the static Huffman tables now, so we'll have them * available every time outblock() is called. */ { int i; for (i = 0; i < (int)lenof(out->static_len1); i++) out->static_len1[i] = (i < 144 ? 8 : i < 256 ? 9 : i < 280 ? 7 : 8); for (i = 0; i < (int)lenof(out->static_len2); i++) out->static_len2[i] = 5; } hufcodes(out->static_len1, out->static_code1, lenof(out->static_code1)); hufcodes(out->static_len2, out->static_code2, lenof(out->static_code2)); out->sht.len_litlen = out->static_len1; out->sht.len_dist = out->static_len2; out->sht.len_codelen = NULL; out->sht.code_litlen = out->static_code1; out->sht.code_dist = out->static_code2; out->sht.code_codelen = NULL; ectx->userdata = out; out->lzc = ectx; return out; } void deflate_compress_free(deflate_compress_ctx *out) { struct LZ77Context *ectx = out->lzc; sfree(out->syms); sfree(ectx->ictx); sfree(ectx); sfree(out); } void deflate_compress_data(deflate_compress_ctx *out, const void *vblock, int len, int flushtype, void **outblock, int *outlen) { struct LZ77Context *ectx = out->lzc; const unsigned char *block = (const unsigned char *)vblock; assert(!out->finished); out->outbuf = NULL; out->outlen = out->outsize = 0; /* * If this is the first block, output the header. */ if (out->firstblock) { switch (out->type) { case DEFLATE_TYPE_BARE: break; /* no header */ case DEFLATE_TYPE_ZLIB: /* * zlib (RFC1950) header bytes: 78 9C. (Deflate * compression, 32K window size, default algorithm.) */ outbits(out, 0x9C78, 16); break; case DEFLATE_TYPE_GZIP: /* * Minimal gzip (RFC1952) header: * * - basic header of 1F 8B * - compression method byte (8 = deflate) * - flags byte (zero: we use no optional features) * - modification time (zero: no time stamp available) * - extra flags byte (2: we use maximum compression * always) * - operating system byte (255: we do not specify) */ outbits(out, 0x00088B1F, 32); /* header, CM, flags */ outbits(out, 0, 32); /* mtime */ outbits(out, 0xFF02, 16); /* xflags, OS */ break; } out->firstblock = FALSE; } /* * Feed our data to the LZ77 compression phase. */ lz77_compress(ectx, block, len, TRUE); /* * Update checksums and counters. */ switch (out->type) { case DEFLATE_TYPE_ZLIB: out->checksum = adler32_update(out->checksum, block, len); break; case DEFLATE_TYPE_GZIP: out->checksum = crc32_update(out->checksum, block, len); break; } out->datasize += len; switch (flushtype) { /* * FIXME: what other flush types are available and useful? * In PuTTY, it was clear that we generally wanted to be in * a static block so it was safe to open one. Here, we * probably prefer to be _outside_ a block if we can. Think * about this. */ case DEFLATE_NO_FLUSH: break; /* don't flush any data at all (duh) */ case DEFLATE_SYNC_FLUSH: /* * Close the current block. */ flushblock(out); /* * Then output an empty _uncompressed_ block: send 000, * then sync to byte boundary, then send bytes 00 00 FF * FF. */ outbits(out, 0, 3); if (out->noutbits) outbits(out, 0, 8 - out->noutbits); outbits(out, 0, 16); outbits(out, 0xFFFF, 16); break; case DEFLATE_END_OF_DATA: /* * Output a block with BFINAL set. */ out->lastblock = TRUE; flushblock(out); /* * Sync to byte boundary, flushing out the final byte. */ if (out->noutbits) outbits(out, 0, 8 - out->noutbits); /* * Format-specific trailer data. */ switch (out->type) { case DEFLATE_TYPE_ZLIB: /* * Just write out the Adler32 checksum. */ outbits(out, (out->checksum >> 24) & 0xFF, 8); outbits(out, (out->checksum >> 16) & 0xFF, 8); outbits(out, (out->checksum >> 8) & 0xFF, 8); outbits(out, (out->checksum >> 0) & 0xFF, 8); break; case DEFLATE_TYPE_GZIP: /* * Write out the CRC32 checksum and the data length. */ outbits(out, out->checksum, 32); outbits(out, out->datasize, 32); break; } out->finished = TRUE; break; } /* * Return any data that we've generated. */ *outblock = (void *)out->outbuf; *outlen = out->outlen; } /* ---------------------------------------------------------------------- * Deflate decompression. */ /* * The way we work the Huffman decode is to have a table lookup on * the first N bits of the input stream (in the order they arrive, * of course, i.e. the first bit of the Huffman code is in bit 0). * Each table entry lists the number of bits to consume, plus * either an output code or a pointer to a secondary table. */ struct table; struct tableentry; struct tableentry { unsigned char nbits; short code; struct table *nexttable; }; struct table { int mask; /* mask applied to input bit stream */ struct tableentry *table; }; #define MAXSYMS 288 #define DWINSIZE 32768 /* * Build a single-level decode table for elements * [minlength,maxlength) of the provided code/length tables, and * recurse to build subtables. */ static struct table *mkonetab(int *codes, unsigned char *lengths, int nsyms, int pfx, int pfxbits, int bits) { struct table *tab = snew(struct table); int pfxmask = (1 << pfxbits) - 1; int nbits, i, j, code; tab->table = snewn(1 << bits, struct tableentry); tab->mask = (1 << bits) - 1; for (code = 0; code <= tab->mask; code++) { tab->table[code].code = -1; tab->table[code].nbits = 0; tab->table[code].nexttable = NULL; } for (i = 0; i < nsyms; i++) { if (lengths[i] <= pfxbits || (codes[i] & pfxmask) != pfx) continue; code = (codes[i] >> pfxbits) & tab->mask; for (j = code; j <= tab->mask; j += 1 << (lengths[i] - pfxbits)) { tab->table[j].code = i; nbits = lengths[i] - pfxbits; if (tab->table[j].nbits < nbits) tab->table[j].nbits = nbits; } } for (code = 0; code <= tab->mask; code++) { if (tab->table[code].nbits <= bits) continue; /* Generate a subtable. */ tab->table[code].code = -1; nbits = tab->table[code].nbits - bits; if (nbits > 7) nbits = 7; tab->table[code].nbits = bits; tab->table[code].nexttable = mkonetab(codes, lengths, nsyms, pfx | (code << pfxbits), pfxbits + bits, nbits); } return tab; } /* * Build a decode table, given a set of Huffman tree lengths. */ static struct table *mktable(unsigned char *lengths, int nlengths, #ifdef ANALYSIS const char *alphabet, #endif int *error) { int codes[MAXSYMS]; int maxlen; #ifdef ANALYSIS if (alphabet && analyse_level > 1) { int i, col = 0; printf("code lengths for %s alphabet:\n", alphabet); for (i = 0; i < nlengths; i++) { col += printf("%3d", lengths[i]); if (col > 72) { putchar('\n'); col = 0; } } if (col > 0) putchar('\n'); } #endif maxlen = hufcodes(lengths, codes, nlengths); if (maxlen < 0) { *error = (maxlen == -1 ? DEFLATE_ERR_LARGE_HUFTABLE : DEFLATE_ERR_SMALL_HUFTABLE); return NULL; } /* * Now we have the complete list of Huffman codes. Build a * table. */ return mkonetab(codes, lengths, nlengths, 0, 0, maxlen < 9 ? maxlen : 9); } static int freetable(struct table **ztab) { struct table *tab; int code; if (ztab == NULL) return -1; if (*ztab == NULL) return 0; tab = *ztab; for (code = 0; code <= tab->mask; code++) if (tab->table[code].nexttable != NULL) freetable(&tab->table[code].nexttable); sfree(tab->table); tab->table = NULL; sfree(tab); *ztab = NULL; return (0); } struct deflate_decompress_ctx { struct table *staticlentable, *staticdisttable; struct table *currlentable, *currdisttable, *lenlentable; enum { ZLIBSTART, GZIPSTART, GZIPMETHFLAGS, GZIPIGNORE1, GZIPIGNORE2, GZIPIGNORE3, GZIPEXTRA, GZIPFNAME, GZIPCOMMENT, OUTSIDEBLK, TREES_HDR, TREES_LENLEN, TREES_LEN, TREES_LENREP, INBLK, GOTLENSYM, GOTLEN, GOTDISTSYM, UNCOMP_LEN, UNCOMP_NLEN, UNCOMP_DATA, END, ADLER1, ADLER2, CRC1, CRC2, ILEN1, ILEN2, FINALSPIN } state; int sym, hlit, hdist, hclen, lenptr, lenextrabits, lenaddon, len, lenrep, lastblock; int uncomplen; unsigned char lenlen[19]; unsigned char lengths[286 + 32]; unsigned long bits; int nbits; unsigned char window[DWINSIZE]; int winpos; unsigned char *outblk; int outlen, outsize; int type; unsigned long checksum; unsigned long bytesout; int gzflags, gzextralen; #ifdef ANALYSIS int bytesread; int bitcount_before; #define BITCOUNT(dctx) ( (dctx)->bytesread * 8 - (dctx)->nbits ) #endif }; deflate_decompress_ctx *deflate_decompress_new(int type) { deflate_decompress_ctx *dctx = snew(deflate_decompress_ctx); unsigned char lengths[288]; memset(lengths, 8, 144); memset(lengths + 144, 9, 256 - 144); memset(lengths + 256, 7, 280 - 256); memset(lengths + 280, 8, 288 - 280); dctx->staticlentable = mktable(lengths, 288, #ifdef ANALYSIS NULL, #endif NULL); assert(dctx->staticlentable); memset(lengths, 5, 32); dctx->staticdisttable = mktable(lengths, 32, #ifdef ANALYSIS NULL, #endif NULL); assert(dctx->staticdisttable); dctx->state = (type == DEFLATE_TYPE_ZLIB ? ZLIBSTART : type == DEFLATE_TYPE_GZIP ? GZIPSTART : OUTSIDEBLK); dctx->currlentable = dctx->currdisttable = dctx->lenlentable = NULL; dctx->bits = 0; dctx->nbits = 0; dctx->winpos = 0; dctx->type = type; dctx->lastblock = FALSE; dctx->checksum = (type == DEFLATE_TYPE_ZLIB ? 1 : 0); dctx->bytesout = 0; dctx->gzflags = dctx->gzextralen = 0; #ifdef ANALYSIS dctx->bytesread = dctx->bitcount_before = 0; #endif return dctx; } void deflate_decompress_free(deflate_decompress_ctx *dctx) { if (dctx->currlentable && dctx->currlentable != dctx->staticlentable) freetable(&dctx->currlentable); if (dctx->currdisttable && dctx->currdisttable != dctx->staticdisttable) freetable(&dctx->currdisttable); if (dctx->lenlentable) freetable(&dctx->lenlentable); freetable(&dctx->staticlentable); freetable(&dctx->staticdisttable); sfree(dctx); } static int huflookup(unsigned long *bitsp, int *nbitsp, struct table *tab) { unsigned long bits = *bitsp; int nbits = *nbitsp; while (1) { struct tableentry *ent; ent = &tab->table[bits & tab->mask]; if (ent->nbits > nbits) return -1; /* not enough data */ bits >>= ent->nbits; nbits -= ent->nbits; if (ent->code == -1) tab = ent->nexttable; else { *bitsp = bits; *nbitsp = nbits; return ent->code; } /* * If we reach here with `tab' null, it can only be because * there was a missing entry in the Huffman table. This * should never occur even with invalid input data, because * we enforce at mktable time that the Huffman codes should * precisely cover the code space; so we can enforce this * by assertion. */ assert(tab); } } static void emit_char(deflate_decompress_ctx *dctx, int c) { dctx->window[dctx->winpos] = c; dctx->winpos = (dctx->winpos + 1) & (DWINSIZE - 1); if (dctx->outlen >= dctx->outsize) { dctx->outsize = dctx->outlen * 3 / 2 + 512; dctx->outblk = sresize(dctx->outblk, dctx->outsize, unsigned char); } if (dctx->type == DEFLATE_TYPE_ZLIB) { unsigned char uc = c; dctx->checksum = adler32_update(dctx->checksum, &uc, 1); } else if (dctx->type == DEFLATE_TYPE_GZIP) { unsigned char uc = c; dctx->checksum = crc32_update(dctx->checksum, &uc, 1); } dctx->outblk[dctx->outlen++] = c; dctx->bytesout++; } #define EATBITS(n) ( dctx->nbits -= (n), dctx->bits >>= (n) ) int deflate_decompress_data(deflate_decompress_ctx *dctx, const void *vblock, int len, void **outblock, int *outlen) { const coderecord *rec; const unsigned char *block = (const unsigned char *)vblock; int code, bfinal, btype, rep, dist, nlen, header; unsigned long cksum; int error = 0; if (len == 0) { *outblock = NULL; *outlen = 0; if (dctx->state != FINALSPIN) return DEFLATE_ERR_UNEXPECTED_EOF; else return 0; } dctx->outblk = NULL; dctx->outsize = 0; dctx->outlen = 0; while (len > 0 || dctx->nbits > 0) { while (dctx->nbits < 24 && len > 0) { dctx->bits |= (*block++) << dctx->nbits; dctx->nbits += 8; len--; #ifdef ANALYSIS dctx->bytesread++; #endif } switch (dctx->state) { case ZLIBSTART: /* Expect 16-bit zlib header. */ if (dctx->nbits < 16) goto finished; /* done all we can */ /* * The header is stored as a big-endian 16-bit integer, * in contrast to the general little-endian policy in * the rest of the format :-( */ header = (((dctx->bits & 0xFF00) >> 8) | ((dctx->bits & 0x00FF) << 8)); EATBITS(16); /* * Check the header: * * - bits 8-11 should be 1000 (Deflate/RFC1951) * - bits 12-15 should be at most 0111 (window size) * - bit 5 should be zero (no dictionary present) * - we don't care about bits 6-7 (compression rate) * - bits 0-4 should be set up to make the whole thing * a multiple of 31 (checksum). */ if ((header & 0xF000) > 0x7000 || (header & 0x0020) != 0x0000 || (header % 31) != 0) { error = DEFLATE_ERR_ZLIB_HEADER; goto finished; } if ((header & 0x0F00) != 0x0800) { error = DEFLATE_ERR_ZLIB_WRONGCOMP; goto finished; } dctx->state = OUTSIDEBLK; break; case GZIPSTART: /* Expect 16-bit gzip header. */ if (dctx->nbits < 16) goto finished; header = dctx->bits & 0xFFFF; EATBITS(16); if (header != 0x8B1F) { error = DEFLATE_ERR_GZIP_HEADER; goto finished; } dctx->state = GZIPMETHFLAGS; break; case GZIPMETHFLAGS: /* Expect gzip compression method and flags bytes. */ if (dctx->nbits < 16) goto finished; header = dctx->bits & 0xFF; EATBITS(8); if (header != 8) { error = DEFLATE_ERR_GZIP_WRONGCOMP; goto finished; } dctx->gzflags = dctx->bits & 0xFF; if (dctx->gzflags & 2) { /* * The FHCRC flag is slightly confusing. RFC1952 * documents it as indicating the presence of a * two-byte CRC16 of the gzip header, occurring * just before the beginning of the Deflate stream. * However, gzip itself (as of 1.3.5) appears to * believe it indicates that the current gzip * `member' is not the final one, i.e. that the * stream is composed of multiple gzip members * concatenated together, and furthermore gzip will * refuse to decode any file that has it set. * * For this reason, I label it as `disputed' and * also refuse to decode anything that has it set. * I don't expect this to be a problem in practice. */ error = DEFLATE_ERR_GZIP_FHCRC; goto finished; } EATBITS(8); dctx->state = GZIPIGNORE1; break; case GZIPIGNORE1: case GZIPIGNORE2: case GZIPIGNORE3: /* Expect two bytes of gzip timestamp/XFL/OS, which we ignore. */ if (dctx->nbits < 16) goto finished; EATBITS(16); if (dctx->state == GZIPIGNORE3) { dctx->state = GZIPEXTRA; } else dctx->state++; /* maps IGNORE1 -> IGNORE2 -> IGNORE3 */ break; case GZIPEXTRA: if (dctx->gzflags & 4) { /* Expect two bytes of extra-length count, then that many * extra bytes of header data, all of which we ignore. */ if (!dctx->gzextralen) { if (dctx->nbits < 16) goto finished; dctx->gzextralen = dctx->bits & 0xFFFF; EATBITS(16); break; } else if (dctx->gzextralen > 0) { if (dctx->nbits < 8) goto finished; EATBITS(8); if (--dctx->gzextralen > 0) break; } } dctx->state = GZIPFNAME; break; case GZIPFNAME: if (dctx->gzflags & 8) { /* * Expect a NUL-terminated filename. */ if (dctx->nbits < 8) goto finished; code = dctx->bits & 0xFF; EATBITS(8); } else code = 0; if (code == 0) dctx->state = GZIPCOMMENT; break; case GZIPCOMMENT: if (dctx->gzflags & 16) { /* * Expect a NUL-terminated filename. */ if (dctx->nbits < 8) goto finished; code = dctx->bits & 0xFF; EATBITS(8); } else code = 0; if (code == 0) dctx->state = OUTSIDEBLK; break; case OUTSIDEBLK: /* Expect 3-bit block header. */ if (dctx->nbits < 3) goto finished; /* done all we can */ bfinal = dctx->bits & 1; if (bfinal) dctx->lastblock = TRUE; EATBITS(1); btype = dctx->bits & 3; EATBITS(2); if (btype == 0) { int to_eat = dctx->nbits & 7; dctx->state = UNCOMP_LEN; EATBITS(to_eat); /* align to byte boundary */ } else if (btype == 1) { dctx->currlentable = dctx->staticlentable; dctx->currdisttable = dctx->staticdisttable; dctx->state = INBLK; } else if (btype == 2) { dctx->state = TREES_HDR; } debug(("recv: bfinal=%d btype=%d\n", bfinal, btype)); #ifdef ANALYSIS if (analyse_level > 1) { static const char *const btypes[] = { "uncompressed", "static", "dynamic", "type 3 (unknown)" }; printf("new block, %sfinal, %s\n", bfinal ? "" : "not ", btypes[btype]); } #endif break; case TREES_HDR: /* * Dynamic block header. Five bits of HLIT, five of * HDIST, four of HCLEN. */ if (dctx->nbits < 5 + 5 + 4) goto finished; /* done all we can */ dctx->hlit = 257 + (dctx->bits & 31); EATBITS(5); dctx->hdist = 1 + (dctx->bits & 31); EATBITS(5); dctx->hclen = 4 + (dctx->bits & 15); EATBITS(4); debug(("recv: hlit=%d hdist=%d hclen=%d\n", dctx->hlit, dctx->hdist, dctx->hclen)); #ifdef ANALYSIS if (analyse_level > 1) printf("hlit=%d, hdist=%d, hclen=%d\n", dctx->hlit, dctx->hdist, dctx->hclen); #endif dctx->lenptr = 0; dctx->state = TREES_LENLEN; memset(dctx->lenlen, 0, sizeof(dctx->lenlen)); break; case TREES_LENLEN: if (dctx->nbits < 3) goto finished; while (dctx->lenptr < dctx->hclen && dctx->nbits >= 3) { dctx->lenlen[lenlenmap[dctx->lenptr++]] = (unsigned char) (dctx->bits & 7); debug(("recv: lenlen %d\n", (unsigned char) (dctx->bits & 7))); EATBITS(3); } if (dctx->lenptr == dctx->hclen) { dctx->lenlentable = mktable(dctx->lenlen, 19, #ifdef ANALYSIS "code length", #endif &error); if (!dctx->lenlentable) goto finished; /* error code set up by mktable */ dctx->state = TREES_LEN; dctx->lenptr = 0; } break; case TREES_LEN: if (dctx->lenptr >= dctx->hlit + dctx->hdist) { dctx->currlentable = mktable(dctx->lengths, dctx->hlit, #ifdef ANALYSIS "literal/length", #endif &error); if (!dctx->currlentable) goto finished; /* error code set up by mktable */ if (dctx->hdist == 1 && dctx->lengths[dctx->hlit] == 0) { /* * Special case: if the code length list for the * backward-distance table contains a single zero * entry, it means this block will never encode a * backward distance at all (i.e. it's all * literals). */ dctx->currdisttable = NULL; } else { dctx->currdisttable = mktable(dctx->lengths + dctx->hlit, dctx->hdist, #ifdef ANALYSIS "distance", #endif &error); if (!dctx->currdisttable) goto finished; /* error code set up by mktable */ } freetable(&dctx->lenlentable); dctx->lenlentable = NULL; dctx->state = INBLK; break; } code = huflookup(&dctx->bits, &dctx->nbits, dctx->lenlentable); debug(("recv: codelen %d\n", code)); if (code == -1) goto finished; if (code < 16) { #ifdef ANALYSIS if (analyse_level > 1) printf("code-length %d\n", code); #endif dctx->lengths[dctx->lenptr++] = code; } else { dctx->lenextrabits = (code == 16 ? 2 : code == 17 ? 3 : 7); dctx->lenaddon = (code == 18 ? 11 : 3); dctx->lenrep = (code == 16 && dctx->lenptr > 0 ? dctx->lengths[dctx->lenptr - 1] : 0); dctx->state = TREES_LENREP; } break; case TREES_LENREP: if (dctx->nbits < dctx->lenextrabits) goto finished; rep = dctx->lenaddon + (dctx->bits & ((1 << dctx->lenextrabits) - 1)); EATBITS(dctx->lenextrabits); if (dctx->lenextrabits) debug(("recv: codelen-extrabits %d/%d\n", rep - dctx->lenaddon, dctx->lenextrabits)); #ifdef ANALYSIS if (analyse_level > 1) printf("code-length-repeat: %d copies of %d\n", rep, dctx->lenrep); #endif while (rep > 0 && dctx->lenptr < dctx->hlit + dctx->hdist) { dctx->lengths[dctx->lenptr] = dctx->lenrep; dctx->lenptr++; rep--; } dctx->state = TREES_LEN; break; case INBLK: #ifdef ANALYSIS dctx->bitcount_before = BITCOUNT(dctx); #endif code = huflookup(&dctx->bits, &dctx->nbits, dctx->currlentable); debug(("recv: litlen %d\n", code)); if (code == -1) goto finished; if (code < 256) { #ifdef ANALYSIS if (analyse_level > 0) printf("%lu: literal %d [%d]\n", dctx->bytesout, code, BITCOUNT(dctx) - dctx->bitcount_before); #endif emit_char(dctx, code); } else if (code == 256) { if (dctx->lastblock) dctx->state = END; else dctx->state = OUTSIDEBLK; if (dctx->currlentable != dctx->staticlentable) { freetable(&dctx->currlentable); dctx->currlentable = NULL; } if (dctx->currdisttable && dctx->currdisttable != dctx->staticdisttable) { freetable(&dctx->currdisttable); dctx->currdisttable = NULL; } } else if (code < 286) { /* static tree can give >285; ignore */ dctx->state = GOTLENSYM; dctx->sym = code; } break; case GOTLENSYM: rec = &lencodes[dctx->sym - 257]; if (dctx->nbits < rec->extrabits) goto finished; dctx->len = rec->min + (dctx->bits & ((1 << rec->extrabits) - 1)); if (rec->extrabits) debug(("recv: litlen-extrabits %d/%d\n", dctx->len - rec->min, rec->extrabits)); EATBITS(rec->extrabits); dctx->state = GOTLEN; break; case GOTLEN: if (!dctx->currdisttable) { error = DEFLATE_ERR_NODISTTABLE; goto finished; } code = huflookup(&dctx->bits, &dctx->nbits, dctx->currdisttable); debug(("recv: dist %d\n", code)); if (code == -1) goto finished; if (code >= 30) { error = DEFLATE_ERR_BADDISTCODE; goto finished; } dctx->state = GOTDISTSYM; dctx->sym = code; break; case GOTDISTSYM: rec = &distcodes[dctx->sym]; if (dctx->nbits < rec->extrabits) goto finished; dist = rec->min + (dctx->bits & ((1 << rec->extrabits) - 1)); if (rec->extrabits) debug(("recv: dist-extrabits %d/%d\n", dist - rec->min, rec->extrabits)); EATBITS(rec->extrabits); dctx->state = INBLK; #ifdef ANALYSIS if (analyse_level > 0) printf("%lu: copy len=%d dist=%d [%d]\n", dctx->bytesout, dctx->len, dist, BITCOUNT(dctx) - dctx->bitcount_before); #endif while (dctx->len--) emit_char(dctx, dctx->window[(dctx->winpos - dist) & (DWINSIZE - 1)]); break; case UNCOMP_LEN: /* * Uncompressed block. We expect to see a 16-bit LEN. */ if (dctx->nbits < 16) goto finished; dctx->uncomplen = dctx->bits & 0xFFFF; EATBITS(16); dctx->state = UNCOMP_NLEN; break; case UNCOMP_NLEN: /* * Uncompressed block. We expect to see a 16-bit NLEN, * which should be the one's complement of the previous * LEN. */ if (dctx->nbits < 16) goto finished; nlen = dctx->bits & 0xFFFF; EATBITS(16); if (dctx->uncomplen != (nlen ^ 0xFFFF)) { error = DEFLATE_ERR_UNCOMP_HDR; goto finished; } if (dctx->uncomplen == 0) {/* block is empty */ if (dctx->lastblock) dctx->state = END; else dctx->state = OUTSIDEBLK; } else dctx->state = UNCOMP_DATA; break; case UNCOMP_DATA: if (dctx->nbits < 8) goto finished; #ifdef ANALYSIS if (analyse_level > 0) printf("%lu: uncompressed %d [8]\n", dctx->bytesout, (int)(dctx->bits & 0xFF)); #endif emit_char(dctx, dctx->bits & 0xFF); EATBITS(8); if (--dctx->uncomplen == 0) { /* end of uncompressed block */ if (dctx->lastblock) dctx->state = END; else dctx->state = OUTSIDEBLK; } break; case END: /* * End of compressed data. We align to a byte boundary, * and then look for format-specific trailer data. */ { int to_eat = dctx->nbits & 7; EATBITS(to_eat); } if (dctx->type == DEFLATE_TYPE_ZLIB) dctx->state = ADLER1; else if (dctx->type == DEFLATE_TYPE_GZIP) dctx->state = CRC1; else dctx->state = FINALSPIN; break; case ADLER1: if (dctx->nbits < 16) goto finished; cksum = (dctx->bits & 0xFF) << 8; EATBITS(8); cksum |= (dctx->bits & 0xFF); EATBITS(8); if (cksum != ((dctx->checksum >> 16) & 0xFFFF)) { error = DEFLATE_ERR_CHECKSUM; goto finished; } dctx->state = ADLER2; break; case ADLER2: if (dctx->nbits < 16) goto finished; cksum = (dctx->bits & 0xFF) << 8; EATBITS(8); cksum |= (dctx->bits & 0xFF); EATBITS(8); if (cksum != (dctx->checksum & 0xFFFF)) { error = DEFLATE_ERR_CHECKSUM; goto finished; } dctx->state = FINALSPIN; break; case CRC1: if (dctx->nbits < 16) goto finished; cksum = dctx->bits & 0xFFFF; EATBITS(16); if (cksum != (dctx->checksum & 0xFFFF)) { error = DEFLATE_ERR_CHECKSUM; goto finished; } dctx->state = CRC2; break; case CRC2: if (dctx->nbits < 16) goto finished; cksum = dctx->bits & 0xFFFF; EATBITS(16); if (cksum != ((dctx->checksum >> 16) & 0xFFFF)) { error = DEFLATE_ERR_CHECKSUM; goto finished; } dctx->state = ILEN1; break; case ILEN1: if (dctx->nbits < 16) goto finished; cksum = dctx->bits & 0xFFFF; EATBITS(16); if (cksum != (dctx->bytesout & 0xFFFF)) { error = DEFLATE_ERR_INLEN; goto finished; } dctx->state = ILEN2; break; case ILEN2: if (dctx->nbits < 16) goto finished; cksum = dctx->bits & 0xFFFF; EATBITS(16); if (cksum != ((dctx->bytesout >> 16) & 0xFFFF)) { error = DEFLATE_ERR_INLEN; goto finished; } dctx->state = FINALSPIN; break; case FINALSPIN: /* Just ignore any trailing garbage on the data stream. */ /* (We could alternatively throw an error here, if we wanted * to detect and complain about trailing garbage.) */ EATBITS(dctx->nbits); break; } } finished: *outblock = dctx->outblk; *outlen = dctx->outlen; return error; } #define A(code,str) str const char *const deflate_error_msg[DEFLATE_NUM_ERRORS] = { DEFLATE_ERRORLIST(A) }; #undef A #define A(code,str) #code const char *const deflate_error_sym[DEFLATE_NUM_ERRORS] = { DEFLATE_ERRORLIST(A) }; #undef A #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) #define WINDOWS_IO #endif #if defined(WINDOWS_IO) && (defined(STANDALONE) || defined(TESTMODE)) #include <fcntl.h> #include <io.h> #endif #ifdef STANDALONE int main(int argc, char **argv) { unsigned char buf[65536]; void *outbuf; int ret, err, outlen; deflate_decompress_ctx *dhandle; deflate_compress_ctx *chandle; int type = DEFLATE_TYPE_ZLIB, opts = TRUE; int compress = FALSE, decompress = FALSE; int got_arg = FALSE; char *filename = NULL; FILE *fp; while (--argc) { char *p = *++argv; got_arg = TRUE; if (p[0] == '-' && opts) { if (!strcmp(p, "-b")) type = DEFLATE_TYPE_BARE; else if (!strcmp(p, "-g")) type = DEFLATE_TYPE_GZIP; else if (!strcmp(p, "-c")) compress = TRUE; else if (!strcmp(p, "-d")) decompress = TRUE; else if (!strcmp(p, "-a")) analyse_level++, decompress = TRUE; else if (!strcmp(p, "--")) opts = FALSE; /* next thing is filename */ else { fprintf(stderr, "unknown command line option '%s'\n", p); return 1; } } else if (!filename) { filename = p; } else { fprintf(stderr, "can only handle one filename\n"); return 1; } } if (!compress && !decompress) { fprintf(stderr, "usage: deflate [ -c | -d | -a ] [ -b | -g ]" " [filename]\n"); return (got_arg ? 1 : 0); } if (compress && decompress) { fprintf(stderr, "please do not specify both compression and" " decompression\n"); return (got_arg ? 1 : 0); } if (compress) { chandle = deflate_compress_new(type); dhandle = NULL; } else { dhandle = deflate_decompress_new(type); chandle = NULL; } if (filename) fp = fopen(filename, "rb"); else fp = stdin; if (!fp) { assert(filename); fprintf(stderr, "unable to open '%s'\n", filename); return 1; } #ifdef WINDOWS_IO if(_setmode(_fileno(stdout), _O_BINARY ) == -1) { fprintf(stderr, "Can't set stdout to binary mode\n"); return 1; } #endif do { ret = fread(buf, 1, sizeof(buf), fp); outbuf = NULL; if (dhandle) { if (ret > 0) err = deflate_decompress_data(dhandle, buf, ret, (void **)&outbuf, &outlen); else err = deflate_decompress_data(dhandle, NULL, 0, (void **)&outbuf, &outlen); } else { if (ret > 0) deflate_compress_data(chandle, buf, ret, DEFLATE_NO_FLUSH, (void **)&outbuf, &outlen); else deflate_compress_data(chandle, buf, ret, DEFLATE_END_OF_DATA, (void **)&outbuf, &outlen); err = 0; } if (outbuf) { if (!analyse_level && outlen) fwrite(outbuf, 1, outlen, stdout); sfree(outbuf); } if (err > 0) { fprintf(stderr, "decoding error: %s\n", deflate_error_msg[err]); return 1; } } while (ret > 0); if (dhandle) deflate_decompress_free(dhandle); if (chandle) deflate_compress_free(chandle); if (filename) fclose(fp); return 0; } #endif #ifdef TESTMODE int main(int argc, char **argv) { char *filename = NULL; FILE *fp; deflate_compress_ctx *chandle; deflate_decompress_ctx *dhandle; unsigned char buf[65536], *outbuf, *outbuf2; int ret, err, outlen, outlen2; int dlen = 0, clen = 0; int opts = TRUE; while (--argc) { char *p = *++argv; if (p[0] == '-' && opts) { if (!strcmp(p, "--")) opts = FALSE; /* next thing is filename */ else { fprintf(stderr, "unknown command line option '%s'\n", p); return 1; } } else if (!filename) { filename = p; } else { fprintf(stderr, "can only handle one filename\n"); return 1; } } if (filename) fp = fopen(filename, "rb"); else fp = stdin; if (!fp) { assert(filename); fprintf(stderr, "unable to open '%s'\n", filename); return 1; } chandle = deflate_compress_new(DEFLATE_TYPE_ZLIB); dhandle = deflate_decompress_new(DEFLATE_TYPE_ZLIB); #ifdef WINDOWS_IO if(_setmode(_fileno(stdout), _O_BINARY ) == -1) { fprintf(stderr, "Can't set stdout to binary mode\n"); return 1; } #endif do { ret = fread(buf, 1, sizeof(buf), fp); if (ret <= 0) { deflate_compress_data(chandle, NULL, 0, DEFLATE_END_OF_DATA, (void **)&outbuf, &outlen); } else { dlen += ret; deflate_compress_data(chandle, buf, ret, DEFLATE_NO_FLUSH, (void **)&outbuf, &outlen); } if (outbuf) { clen += outlen; err = deflate_decompress_data(dhandle, outbuf, outlen, (void **)&outbuf2, &outlen2); sfree(outbuf); if (outbuf2) { if (outlen2) fwrite(outbuf2, 1, outlen2, stdout); sfree(outbuf2); } if (!err && ret <= 0) { /* * signal EOF */ err = deflate_decompress_data(dhandle, NULL, 0, (void **)&outbuf2, &outlen2); assert(outbuf2 == NULL); } if (err) { fprintf(stderr, "decoding error: %s\n", deflate_error_msg[err]); return 1; } } } while (ret > 0); fprintf(stderr, "%d plaintext -> %d compressed\n", dlen, clen); return 0; } #endif ������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/deflate.h�������������������������������������������������������������������������������0000644�0001753�0001753�00000014721�12444773746�011536� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Header file for my independent implementation of Deflate * (RFC1951) compression. */ #ifndef DEFLATE_DEFLATE_H #define DEFLATE_DEFLATE_H /* * Types of Deflate data stream. * * DEFLATE_TYPE_BARE represents the basic Deflate data format, as * defined in RFC 1951. It has no checksum to detect errors and no * magic-number header for ease of recognition, but it does have * internal EOF indication. * * DEFLATE_TYPE_ZLIB represents the zlib container format, as * defined in RFC 1950. It has a two-byte header, and a four-byte * Adler32 checksum at the end to verify correct decoding, but * apart from those six bytes it's exactly equivalent to * DEFLATE_TYPE_BARE. * * DEFLATE_TYPE_GZIP represents the gzip compressed file format, as * defined in RFC 1952. This is a more full-featured format, with a * magic number, a CRC checksum of the compressed data, and various * header features including storing the original filename. This * implementation accepts but ignores all of those features on * input except the checksum, and outputs them in the most trivial * fashion. Also, this implementation will not decode multiple * concatenated gzip members (permitted by the RFC). */ enum { DEFLATE_TYPE_BARE, DEFLATE_TYPE_ZLIB, DEFLATE_TYPE_GZIP }; /* ---------------------------------------------------------------------- * Compression functions. Create a compression context with * deflate_compress_new(); feed it data with repeated calls to * deflate_compress_data(); destroy it with * deflate_compress_free(). */ typedef struct deflate_compress_ctx deflate_compress_ctx; /* * Create a new compression context. `type' indicates whether it's * bare Deflate (as used in, say, zip files) or Zlib (as used in, * say, PDF). */ deflate_compress_ctx *deflate_compress_new(int type); /* * Free a compression context previously allocated by * deflate_compress_new(). */ void deflate_compress_free(deflate_compress_ctx *ctx); /* * Give the compression context some data to compress. The input * data is passed in `inblock', and has length `inlen'. This * function may or may not produce some output data; if so, it is * written to a dynamically allocated chunk of memory, a pointer to * that memory is stored in `outblock', and the length of output * data is stored in `outlen'. It is common for no data to be * output, if the input data has merely been stored in internal * buffers. * * `flushtype' indicates whether you want to force buffered data to * be output. It can be one of the following values: * * - DEFLATE_NO_FLUSH: nothing is output if the compressor would * rather not. Use this when the best compression is desired * (i.e. most of the time). * * - DEFLATE_SYNC_FLUSH: all the buffered data is output, but the * compressed data stream remains open and ready to continue * compressing data. Use this in interactive protocols when a * single compressed data stream is split across several network * packets. * * - DEFLATE_END_OF_DATA: all the buffered data is output and the * compressed data stream is cleaned up. Any checksums required * at the end of the stream are also output. */ void deflate_compress_data(deflate_compress_ctx *ctx, const void *inblock, int inlen, int flushtype, void **outblock, int *outlen); enum { DEFLATE_NO_FLUSH, DEFLATE_SYNC_FLUSH, DEFLATE_END_OF_DATA }; /* ---------------------------------------------------------------------- * Decompression functions. Create a decompression context with * deflate_decompress_new(); feed it data with repeated calls to * deflate_decompress_data(); destroy it with * deflate_decompress_free(). */ typedef struct deflate_decompress_ctx deflate_decompress_ctx; /* * Create a new decompression context. `type' means the same as it * does in deflate_compress_new(). */ deflate_decompress_ctx *deflate_decompress_new(int type); /* * Free a decompression context previously allocated by * deflate_decompress_new(). */ void deflate_decompress_free(deflate_decompress_ctx *ctx); /* * Give the decompression context some data to decompress. The * input data is passed in `inblock', and has length `inlen'. This * function may or may not produce some output data; if so, it is * written to a dynamically allocated chunk of memory, a pointer to * that memory is stored in `outblock', and the length of output * data is stored in `outlen'. * * Returns 0 on success, or a non-zero error code if there was a * decoding error. In case of an error return, the data decoded * before the error is still returned as well. The possible errors * are listed below. * * If you want to check that the compressed data stream was * correctly terminated, you can call this function with inlen==0 * to signal input EOF and see if an error comes back. If you don't * care, don't bother. */ int deflate_decompress_data(deflate_decompress_ctx *ctx, const void *inblock, int inlen, void **outblock, int *outlen); /* * Enumeration of error codes. The strange macro is so that I can * define description arrays in the accompanying source. */ #define DEFLATE_ERRORLIST(A) \ A(DEFLATE_NO_ERR, "success"), \ A(DEFLATE_ERR_ZLIB_HEADER, "invalid zlib header"), \ A(DEFLATE_ERR_ZLIB_WRONGCOMP, "zlib header specifies non-deflate compression"), \ A(DEFLATE_ERR_GZIP_HEADER, "invalid gzip header"), \ A(DEFLATE_ERR_GZIP_WRONGCOMP, "gzip header specifies non-deflate compression"), \ A(DEFLATE_ERR_GZIP_FHCRC, "gzip header specifies disputed FHCRC flag"), \ A(DEFLATE_ERR_SMALL_HUFTABLE, "under-committed Huffman code space"), \ A(DEFLATE_ERR_LARGE_HUFTABLE, "over-committed Huffman code space"), \ A(DEFLATE_ERR_UNCOMP_HDR, "wrongly formatted header in uncompressed block"), \ A(DEFLATE_ERR_NODISTTABLE, "backward copy encoded in block without distances table"), \ A(DEFLATE_ERR_BADDISTCODE, "invalid distance code 30 or 31 found in block"), \ A(DEFLATE_ERR_CHECKSUM, "incorrect data checksum"), \ A(DEFLATE_ERR_INLEN, "incorrect data length"), \ A(DEFLATE_ERR_UNEXPECTED_EOF, "unexpected end of data") #define DEFLATE_ENUM_DEF(x,y) x enum { DEFLATE_ERRORLIST(DEFLATE_ENUM_DEF), DEFLATE_NUM_ERRORS }; #undef DEFLATE_ENUM_DEF /* * Arrays mapping the above error codes to, respectively, a text * error string and a textual representation of the symbolic error * code. */ extern const char *const deflate_error_msg[DEFLATE_NUM_ERRORS]; extern const char *const deflate_error_sym[DEFLATE_NUM_ERRORS]; #endif /* DEFLATE_DEFLATE_H */ �����������������������������������������������halibut-1.1/error.c���������������������������������������������������������������������������������0000644�0001753�0001753�00000020436�12444773746�011256� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * error.c: Halibut error handling */ #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include "halibut.h" /* * Error flags */ #define PREFIX 0x0001 /* give `halibut:' prefix */ #define FILEPOS 0x0002 /* give file position prefix */ static void do_error(const filepos *fpos, const char *fmt, ...) { va_list ap; if (fpos) { fprintf(stderr, "%s:", fpos->filename ? fpos->filename : "<standard input>"); if (fpos->line > 0) fprintf(stderr, "%d:", fpos->line); if (fpos->col > 0) fprintf(stderr, "%d:", fpos->col); fputc(' ', stderr); } else { fputs("halibut: ", stderr); } va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fputc('\n', stderr); } void fatalerr_nomemory(void) { do_error(NULL, "out of memory"); exit(EXIT_FAILURE); } void err_optnoarg(const char *sp) { do_error(NULL, "option `-%s' requires an argument", sp); } void err_nosuchopt(const char *sp) { do_error(NULL, "unrecognised option `-%s'", sp); } void err_cmdcharset(const char *sp) { do_error(NULL, "character set `%s' not recognised", sp); } void err_futileopt(const char *sp, const char *sp2) { do_error(NULL, "warning: option `-%s' has no effect%s", sp, sp2); } void err_noinput(void) { do_error(NULL, "no input files"); } void err_cantopen(const char *sp) { do_error(NULL, "unable to open input file `%s'", sp); } void err_nodata(void) { do_error(NULL, "no data in input files"); } void err_brokencodepara(const filepos *fpos) { do_error(fpos, "every line of a code paragraph should begin `\\c'"); } void err_kwunclosed(const filepos *fpos) { do_error(fpos, "expected `}' after paragraph keyword"); } void err_kwexpected(const filepos *fpos) { do_error(fpos, "expected a paragraph keyword"); } void err_kwillegal(const filepos *fpos) { do_error(fpos, "expected no paragraph keyword"); } void err_kwtoomany(const filepos *fpos) { do_error(fpos, "expected only one paragraph keyword"); } void err_bodyillegal(const filepos *fpos) { do_error(fpos, "expected no text after paragraph keyword"); } void err_badparatype(const wchar_t *wsp, const filepos *fpos) { char *sp = utoa_locale_dup(wsp); do_error(fpos, "command `%s' unrecognised at start of paragraph", sp); sfree(sp); } void err_badmidcmd(const wchar_t *wsp, const filepos *fpos) { char *sp = utoa_locale_dup(wsp); do_error(fpos, "command `%s' unexpected in mid-paragraph", sp); sfree(sp); } void err_unexbrace(const filepos *fpos) { do_error(fpos, "brace character unexpected in mid-paragraph"); } void err_explbr(const filepos *fpos) { do_error(fpos, "expected `{' after command"); } void err_commenteof(const filepos *fpos) { do_error(fpos, "end of file unexpected inside `\\#{...}' comment"); } void err_kwexprbr(const filepos *fpos) { do_error(fpos, "expected `}' after cross-reference"); } void err_codequote(const filepos *fpos) { do_error(fpos, "unable to nest \\q{...} within \\c{...} or \\cw{...}"); } void err_missingrbrace(const filepos *fpos) { do_error(fpos, "unclosed braces at end of paragraph"); } void err_missingrbrace2(const filepos *fpos) { do_error(fpos, "unclosed braces at end of input file"); } void err_nestedstyles(const filepos *fpos) { do_error(fpos, "unable to nest text styles"); } void err_nestedindex(const filepos *fpos) { do_error(fpos, "unable to nest index markings"); } void err_indexcase(const filepos *fpos, const wchar_t *wsp, const filepos *fpos2, const wchar_t *wsp2) { char *sp = utoa_locale_dup(wsp), *sp2 = utoa_locale_dup(wsp2); do_error(fpos, "warning: index tag `%s' used with different " "case (`%s') at %s:%d", sp, sp2, fpos2->filename, fpos2->line); sfree(sp); sfree(sp2); } void err_nosuchkw(const filepos *fpos, const wchar_t *wsp) { char *sp = utoa_locale_dup(wsp); do_error(fpos, "unable to resolve cross-reference to `%s'", sp); sfree(sp); } void err_multiBR(const filepos *fpos, const wchar_t *wsp) { char *sp = utoa_locale_dup(wsp); do_error(fpos, "multiple `\\BR' entries given for `%s'", sp); sfree(sp); } void err_nosuchidxtag(const filepos *fpos, const wchar_t *wsp) { char *sp = utoa_locale_dup(wsp); do_error(fpos, "`\\IM' on unknown index tag `%s'", sp); sfree(sp); } void err_cantopenw(const char *sp) { do_error(NULL, "unable to open output file `%s'", sp); } void err_macroexists(const filepos *fpos, const wchar_t *wsp) { char *sp = utoa_locale_dup(wsp); do_error(fpos, "macro `%s' already defined", sp); sfree(sp); } void err_sectjump(const filepos *fpos) { do_error(fpos, "expected higher heading levels before this one"); } void err_winhelp_ctxclash(const filepos *fpos, const char *sp, const char *sp2) { do_error(fpos, "Windows Help context id `%s' clashes with " "previously defined `%s'", sp, sp2); } void err_multikw(const filepos *fpos, const filepos *fpos2, const wchar_t *wsp) { char *sp = utoa_locale_dup(wsp); do_error(fpos, "paragraph keyword `%s' already defined at %s:%d", sp, fpos2->filename, fpos2->line); sfree(sp); } void err_misplacedlcont(const filepos *fpos) { do_error(fpos, "\\lcont is only expected after a list item"); } void err_sectmarkerinblock(const filepos *fpos, const char *sp) { do_error(fpos, "section headings are not supported within \\%s", sp); } void err_cfginsufarg(const filepos *fpos, const char *sp, int i) { do_error(fpos, "\\cfg{%s} expects at least %d parameter%s", sp, i, (i==1)?"":"s"); } void err_infonodechar(const filepos *fpos, char c) /* fpos might be NULL */ { do_error(fpos, "info output format does not support '%c' in" " node names; removing", c); } void err_text_codeline(const filepos *fpos, int i, int j) { do_error(fpos, "warning: code paragraph line is %d chars wide, wider" " than body width %d", i, j); } void err_htmlver(const filepos *fpos, const wchar_t *wsp) { char *sp = utoa_locale_dup(wsp); do_error(fpos, "unrecognised HTML version keyword `%s'", sp); sfree(sp); } void err_charset(const filepos *fpos, const wchar_t *wsp) { char *sp = utoa_locale_dup(wsp); do_error(fpos, "character set `%s' not recognised", sp); sfree(sp); } void err_nofont(const filepos *fpos, const wchar_t *wsp) { char *sp = utoa_locale_dup(wsp); do_error(fpos, "font `%s' not recognised", sp); sfree(sp); } void err_afmeof(const filepos *fpos) { do_error(fpos, "AFM file ended unexpectedly"); } void err_afmkey(const filepos *fpos, const char *sp) { do_error(fpos, "required AFM key '%s' missing", sp); } void err_afmvers(const filepos *fpos) { do_error(fpos, "unsupported AFM version"); } void err_afmval(const filepos *fpos, const char *sp, int i) { if (i == 1) do_error(fpos, "AFM key '%s' requires a value", sp); else do_error(fpos, "AFM key '%s' requires %d values", sp, i); } void err_pfeof(const filepos *fpos) { do_error(fpos, "Type 1 font file ended unexpectedly"); } void err_pfhead(const filepos *fpos) { do_error(fpos, "Type 1 font file header line invalid"); } void err_pfbad(const filepos *fpos) { do_error(fpos, "Type 1 font file invalid"); } void err_pfnoafm(const filepos *fpos, const char *sp) { do_error(fpos, "no metrics available for Type 1 font '%s'", sp); } void err_chmnames(void) { do_error(NULL, "only one of html-mshtmlhelp-chm and " "html-mshtmlhelp-hhp found"); } void err_sfntnotable(const filepos *fpos, const char *sp) { do_error(fpos, "font has no '%s' table", sp); } void err_sfntnopsname(const filepos *fpos) { do_error(fpos, "font has no PostScript name"); } void err_sfntbadtable(const filepos *fpos, const char *sp) { do_error(fpos, "font has an invalid '%s' table", sp); } void err_sfntnounicmap(const filepos *fpos) { do_error(fpos, "font has no UCS-2 character map"); } void err_sfnttablevers(const filepos *fpos, const char *sp) { do_error(fpos, "font has an unsupported '%s' table version", sp); } void err_sfntbadhdr(const filepos *fpos) { do_error(fpos, "font has an invalid header"); } void err_sfntbadglyph(const filepos *fpos, unsigned wc) { do_error(fpos, "warning: character U+%04X references a non-existent glyph", wc); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/halibut.h�������������������������������������������������������������������������������0000644�0001753�0001753�00000044524�12444773746�011566� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef HALIBUT_HALIBUT_H #define HALIBUT_HALIBUT_H #include <stdio.h> #include <wchar.h> #include <time.h> #include <string.h> #include "charset.h" #ifdef __GNUC__ #define NORETURN __attribute__((__noreturn__)) #else #define NORETURN /* nothing */ #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* For suppressing unused-parameter warnings */ #define IGNORE(x) ( (x) = (x) ) #include "tree234.h" /* * Structure tags */ typedef struct input_Tag input; typedef struct filepos_Tag filepos; typedef struct paragraph_Tag paragraph; typedef struct word_Tag word; typedef struct keywordlist_Tag keywordlist; typedef struct keyword_Tag keyword; typedef struct numberstate_Tag numberstate; typedef struct indexdata_Tag indexdata; typedef struct indextag_Tag indextag; typedef struct indexentry_Tag indexentry; typedef struct macrostack_Tag macrostack; /* * Data structure to hold a file name and index, a line and a * column number, for reporting errors */ struct filepos_Tag { char *filename; int line, col; }; /* * Data structure to hold all the file names etc for input */ typedef struct pushback_Tag { int chr; filepos pos; } pushback; struct input_Tag { char **filenames; /* complete list of input files */ int nfiles; /* how many in the list */ FILE *currfp; /* the currently open one */ int currindex; /* which one is that in the list */ int wantclose; /* does the current file want closing */ pushback *pushback; /* pushed-back input characters */ int npushback, pushbacksize; filepos pos; int reportcols; /* report column numbers in errors */ macrostack *stack; /* macro expansions in force */ int defcharset, charset; /* character sets for input files */ charset_state csstate; wchar_t wc[16]; /* wide chars from input conversion */ int nwc, wcpos; /* size of, and position in, wc[] */ char *pushback_chars; /* used to save input-encoding data */ }; /* * Data structure to hold the input form of the source, ie a linked * list of paragraphs */ struct paragraph_Tag { paragraph *next; int type; wchar_t *keyword; /* for most special paragraphs */ char *origkeyword; /* same again in original charset */ word *words; /* list of words in paragraph */ int aux; /* number, in a numbered paragraph * or subsection level */ word *kwtext; /* chapter/section indication */ word *kwtext2; /* numeric-only form of kwtext */ filepos fpos; paragraph *parent, *child, *sibling; /* for hierarchy navigation */ void *private_data; /* for temp use in backends */ }; enum { para_IM, /* index merge */ para_BR, /* bibliography rewrite */ para_Rule, /* random horizontal rule */ para_Chapter, para_Appendix, para_UnnumberedChapter, para_Heading, para_Subsect, para_Normal, para_Biblio, /* causes no output unless turned ... */ para_BiblioCited, /* ... into this paragraph type */ para_Bullet, para_NumberedList, para_DescribedThing, para_Description, para_Code, para_Copyright, para_NoCite, para_Title, para_VersionID, para_Config, /* configuration directive */ para_LcontPush, /* begin continuation of list item */ para_LcontPop, /* end continuation of list item */ para_QuotePush, /* begin block quote */ para_QuotePop, /* end block quote */ /* * Back ends may define their own paragraph types beyond here, * in case they need to use them internally. */ para_NotParaType /* placeholder value */ }; /* * Data structure to hold an individual word */ struct word_Tag { word *next, *alt; int type; int aux; int breaks; /* can a line break after it? */ wchar_t *text; filepos fpos; void *private_data; /* for temp use in backends */ }; enum { /* ORDERING CONSTRAINT: these normal-word types ... */ word_Normal, word_Emph, word_Strong, word_Code, /* monospaced; `quoted' in text */ word_WeakCode, /* monospaced, normal in text */ /* ... must be in the same order as these space types ... */ word_WhiteSpace, /* text is NULL or ignorable */ word_EmphSpace, /* WhiteSpace when emphasised */ word_StrongSpace, /* WhiteSpace when strong */ word_CodeSpace, /* WhiteSpace when code */ word_WkCodeSpace, /* WhiteSpace when weak code */ /* ... and must be in the same order as these quote types ... */ word_Quote, /* text is NULL or ignorable */ word_EmphQuote, /* Quote when emphasised */ word_StrongQuote, /* Quote when strong */ word_CodeQuote, /* (can't happen) */ word_WkCodeQuote, /* (can't happen) */ /* END ORDERING CONSTRAINT */ word_internal_endattrs, word_UpperXref, /* \K */ word_LowerXref, /* \k */ word_XrefEnd, /* (invisible; no text) */ word_IndexRef, /* (always an invisible one) */ word_HyperLink, /* (invisible) */ word_HyperEnd, /* (also invisible; no text) */ /* * Back ends may define their own word types beyond here, in * case they need to use them internally. */ word_NotWordType /* placeholder value */ }; /* aux values for attributed words */ enum { attr_Only = 0x0000, /* a lone word with the attribute */ attr_First = 0x0001, /* the first of a series */ attr_Last = 0x0002, /* the last of a series */ attr_Always = 0x0003, /* any other part of a series */ attr_mask = 0x0003 }; /* aux values for quote-type words */ enum { quote_Open = 0x0010, quote_Close = 0x0020, quote_mask = 0x0030 }; #define isvis(x) ( ( (x) >= word_Normal && (x) <= word_LowerXref ) ) #define isattr(x) ( ( (x) > word_Normal && (x) < word_WhiteSpace ) || \ ( (x) > word_WhiteSpace && (x) < word_internal_endattrs ) ) #define NATTRS (word_WhiteSpace - word_Normal) #define sameattr(x,y) ( (((x)-(y)) % NATTRS) == 0 ) #define towordstyle(x) ( word_Normal + ((x) % NATTRS) ) #define tospacestyle(x) ( word_WhiteSpace + ((x) % NATTRS) ) #define toquotestyle(x) ( word_Quote + ((x) % NATTRS) ) #define removeattr(x) ( word_Normal + ((x)/NATTRS * NATTRS) ) #define attraux(x) ( (x) & attr_mask ) #define quoteaux(x) ( (x) & quote_mask ) /* * error.c */ /* out of memory */ void fatalerr_nomemory(void) NORETURN; /* option `-%s' requires an argument */ void err_optnoarg(const char *sp); /* unrecognised option `-%s' */ void err_nosuchopt(const char *sp); /* unrecognised charset %s (cmdline) */ void err_cmdcharset(const char *sp); /* futile option `-%s'%s */ void err_futileopt(const char *sp, const char *sp2); /* no input files */ void err_noinput(void); /* unable to open input file `%s' */ void err_cantopen(const char *sp); /* no data in input files */ void err_nodata(void); /* line in codepara didn't begin `\c' */ void err_brokencodepara(const filepos *fpos); /* expected `}' after keyword */ void err_kwunclosed(const filepos *fpos); /* paragraph type expects no keyword */ void err_kwexpected(const filepos *fpos); /* paragraph type expects a keyword */ void err_kwillegal(const filepos *fpos); /* paragraph type expects only 1 */ void err_kwtoomany(const filepos *fpos); /* paragraph type expects only kws! */ void err_bodyillegal(const filepos *fpos); /* invalid command at start of para */ void err_badparatype(const wchar_t *wsp, const filepos *fpos); /* invalid command in mid-para */ void err_badmidcmd(const wchar_t *wsp, const filepos *fpos); /* unexpected brace */ void err_unexbrace(const filepos *fpos); /* expected `{' after command */ void err_explbr(const filepos *fpos); /* EOF inside braced comment */ void err_commenteof(const filepos *fpos); /* expected `}' after cross-ref */ void err_kwexprbr(const filepos *fpos); /* \q within \c is not supported */ void err_codequote(const filepos *fpos); /* unclosed braces at end of para */ void err_missingrbrace(const filepos *fpos); /* unclosed braces at end of file */ void err_missingrbrace2(const filepos *fpos); /* unable to nest text styles */ void err_nestedstyles(const filepos *fpos); /* unable to nest `\i' thingys */ void err_nestedindex(const filepos *fpos); /* two \i differing only in case */ void err_indexcase(const filepos *fpos, const wchar_t *wsp, const filepos *fpos2, const wchar_t *wsp2); /* unresolved cross-reference */ void err_nosuchkw(const filepos *fpos, const wchar_t *wsp); /* multiple \BRs on same keyword */ void err_multiBR(const filepos *fpos, const wchar_t *wsp); /* \IM on unknown index tag (warning) */ void err_nosuchidxtag(const filepos *fpos, const wchar_t *wsp); /* can't open output file for write */ void err_cantopenw(const char *sp); /* this macro already exists */ void err_macroexists(const filepos *fpos, const wchar_t *wsp); /* jump a heading level, eg \C -> \S */ void err_sectjump(const filepos *fpos); /* WinHelp context ID hash clash */ void err_winhelp_ctxclash(const filepos *fpos, const char *sp, const char *sp2); /* keyword clash in sections */ void err_multikw(const filepos *fpos, const filepos *fpos2, const wchar_t *wsp); /* \lcont not after a list item */ void err_misplacedlcont(const filepos *fpos); /* section marker appeared in block */ void err_sectmarkerinblock(const filepos *fpos, const char *sp); /* \cfg{%s} insufficient args (<%d) */ void err_cfginsufarg(const filepos *fpos, const char *sp, int i); /* colon/comma in node name in info */ void err_infonodechar(const filepos *fpos, char c) /* fpos might be NULL */; /* \c line too long in text backend */ void err_text_codeline(const filepos *fpos, int i, int j); /* unrecognised HTML version keyword */ void err_htmlver(const filepos *fpos, const wchar_t *wsp); /* unrecognised character set name */ void err_charset(const filepos *fpos, const wchar_t *wsp); /* unrecognised font name */ void err_nofont(const filepos *fpos, const wchar_t *wsp); /* eof in AFM file */ void err_afmeof(const filepos *fpos); /* missing expected keyword in AFM */ void err_afmkey(const filepos *fpos, const char *sp); /* unsupported AFM version */ void err_afmvers(const filepos *fpos); /* missing value(s) for AFM key */ void err_afmval(const filepos *fpos, const char *sp, int i); /* eof in Type 1 font file */ void err_pfeof(const filepos *fpos); /* bad Type 1 header line */ void err_pfhead(const filepos *fpos); /* otherwise invalide Type 1 font */ void err_pfbad(const filepos *fpos); /* Type 1 font but no AFM */ void err_pfnoafm(const filepos *fpos, const char *sp); /* need both or neither of hhp+chm */ void err_chmnames(void); /* required sfnt table missing */ void err_sfntnotable(const filepos *fpos, const char *sp); /* sfnt has no PostScript name */ void err_sfntnopsname(const filepos *fpos); /* sfnt table not valid */ void err_sfntbadtable(const filepos *fpos, const char *sp); /* sfnt has no UCS-2 cmap */ void err_sfntnounicmap(const filepos *fpos); /* sfnt table version unknown */ void err_sfnttablevers(const filepos *fpos, const char *sp); /* sfnt has bad header */ void err_sfntbadhdr(const filepos *fpos); /* sfnt cmap references bad glyph */ void err_sfntbadglyph(const filepos *fpos, unsigned wc); /* * malloc.c */ #ifdef LOGALLOC void *smalloc(char *file, int line, int size); void *srealloc(char *file, int line, void *p, int size); void sfree(char *file, int line, void *p); #define smalloc(x) smalloc(__FILE__, __LINE__, x) #define srealloc(x, y) srealloc(__FILE__, __LINE__, x, y) #define sfree(x) sfree(__FILE__, __LINE__, x) #else void *smalloc(int size); void *srealloc(void *p, int size); void sfree(void *p); #endif void free_word_list(word *w); void free_para_list(paragraph *p); word *dup_word_list(word *w); char *dupstr(char const *s); #define snew(type) ( (type *) smalloc (sizeof (type)) ) #define snewn(number, type) ( (type *) smalloc ((number) * sizeof (type)) ) #define sresize(array, number, type) \ ( (type *) srealloc ((array), (number) * sizeof (type)) ) #define lenof(array) ( sizeof(array) / sizeof(*(array)) ) /* * ustring.c */ wchar_t *ustrdup(wchar_t const *s); char *ustrtoa(wchar_t const *s, char *outbuf, int size, int charset); char *ustrtoa_careful(wchar_t const *s, char *outbuf, int size, int charset); wchar_t *ustrfroma(char const *s, wchar_t *outbuf, int size, int charset); char *utoa_dup(wchar_t const *s, int charset); char *utoa_dup_len(wchar_t const *s, int charset, int *len); char *utoa_careful_dup(wchar_t const *s, int charset); wchar_t *ufroma_dup(char const *s, int charset); char *utoa_locale_dup(wchar_t const *s); wchar_t *ufroma_locale_dup(char const *s); int ustrlen(wchar_t const *s); wchar_t *uadv(wchar_t *s); wchar_t *ustrcpy(wchar_t *dest, wchar_t const *source); wchar_t *ustrncpy(wchar_t *dest, wchar_t const *source, int n); wchar_t utolower(wchar_t); int uisalpha(wchar_t); int ustrcmp(wchar_t *lhs, wchar_t *rhs); int ustricmp(wchar_t const *lhs, wchar_t const *rhs); int ustrnicmp(wchar_t const *lhs, wchar_t const *rhs, int maxlen); int utoi(wchar_t const *); double utof(wchar_t const *); int utob(wchar_t const *); int uisdigit(wchar_t); wchar_t *ustrlow(wchar_t *s); wchar_t *ustrftime(const wchar_t *wfmt, const struct tm *timespec); int cvt_ok(int charset, const wchar_t *s); int charset_from_ustr(filepos *fpos, const wchar_t *name); /* * wcwidth.c */ int strwid(char const *s, int charset); int ustrwid(wchar_t const *s, int charset); /* * help.c */ void help(void); void usage(void); void showversion(void); void listcharsets(void); /* * licence.c */ void licence(void); /* * version.c */ extern const char *const version; /* * misc.c */ char *adv(char *s); typedef struct stackTag *stack; stack stk_new(void); void stk_free(stack); void stk_push(stack, void *); void *stk_pop(stack); void *stk_top(stack); typedef struct tagRdstring rdstring; struct tagRdstring { int pos, size; wchar_t *text; }; typedef struct tagRdstringc rdstringc; struct tagRdstringc { int pos, size; char *text; }; extern const rdstring empty_rdstring; extern const rdstringc empty_rdstringc; void rdadd(rdstring *rs, wchar_t c); void rdadds(rdstring *rs, wchar_t const *p); wchar_t *rdtrim(rdstring *rs); void rdaddc(rdstringc *rs, char c); void rdaddsc(rdstringc *rs, char const *p); void rdaddsn(rdstringc *rc, char const *p, int len); char *rdtrimc(rdstringc *rs); int compare_wordlists(word *a, word *b); void mark_attr_ends(word *words); typedef struct tagWrappedLine wrappedline; struct tagWrappedLine { wrappedline *next; word *begin, *end; /* first & last words of line */ int nspaces; /* number of whitespaces in line */ int shortfall; /* how much shorter than max width */ }; wrappedline *wrap_para(word *, int, int, int (*)(void *, word *), void *, int); void wrap_free(wrappedline *); void cmdline_cfg_add(paragraph *cfg, char *string); paragraph *cmdline_cfg_new(void); paragraph *cmdline_cfg_simple(char *string, ...); /* * input.c */ paragraph *read_input(input *in, indexdata *idx); /* * in_afm.c */ void read_afm_file(input *in); /* * in_pf.c */ void read_pfa_file(input *in); void read_pfb_file(input *in); /* * in_sfnt.c */ void read_sfnt_file(input *in); /* * keywords.c */ struct keywordlist_Tag { int nkeywords; int size; tree234 *keys; /* sorted by `key' field */ word **looseends; /* non-keyword list element numbers */ int nlooseends; int looseendssize; }; struct keyword_Tag { wchar_t *key; /* the keyword itself */ word *text; /* "Chapter 2", "Appendix Q"... */ /* (NB: filepos are not set) */ paragraph *para; /* the paragraph referenced */ }; keyword *kw_lookup(keywordlist *, wchar_t *); keywordlist *get_keywords(paragraph *); void free_keywords(keywordlist *); void subst_keywords(paragraph *, keywordlist *); /* * index.c */ /* * Data structure to hold both sides of the index. */ struct indexdata_Tag { tree234 *tags; /* holds type `indextag' */ tree234 *entries; /* holds type `indexentry' */ }; /* * Data structure to hold an index tag (LHS of index). */ struct indextag_Tag { wchar_t *name; word *implicit_text; filepos implicit_fpos; word **explicit_texts; filepos *explicit_fpos; int nexplicit, explicit_size; int nrefs; indexentry **refs; /* array of entries referenced by tag */ }; /* * Data structure to hold an index entry (RHS of index). */ struct indexentry_Tag { word *text; void *backend_data; /* private to back end */ filepos fpos; }; indexdata *make_index(void); void cleanup_index(indexdata *); /* index_merge takes responsibility for freeing arg 3 iff implicit; never * takes responsibility for arg 2 */ void index_merge(indexdata *, int is_explicit, wchar_t *, word *, filepos *); void build_index(indexdata *); void index_debug(indexdata *); indextag *index_findtag(indexdata *idx, wchar_t *name); /* * contents.c */ numberstate *number_init(void); void number_cfg(numberstate *, paragraph *); word *number_mktext(numberstate *, paragraph *, wchar_t *, int *, int *); void number_free(numberstate *); /* * biblio.c */ void gen_citations(paragraph *, keywordlist *); /* * bk_text.c */ void text_backend(paragraph *, keywordlist *, indexdata *, void *); paragraph *text_config_filename(char *filename); /* * bk_html.c */ void html_backend(paragraph *, keywordlist *, indexdata *, void *); paragraph *html_config_filename(char *filename); /* * bk_whlp.c */ void whlp_backend(paragraph *, keywordlist *, indexdata *, void *); paragraph *whlp_config_filename(char *filename); /* * bk_man.c */ void man_backend(paragraph *, keywordlist *, indexdata *, void *); paragraph *man_config_filename(char *filename); /* * bk_info.c */ void info_backend(paragraph *, keywordlist *, indexdata *, void *); paragraph *info_config_filename(char *filename); /* * bk_paper.c */ void *paper_pre_backend(paragraph *, keywordlist *, indexdata *); void listfonts(void); /* * bk_ps.c */ void ps_backend(paragraph *, keywordlist *, indexdata *, void *); paragraph *ps_config_filename(char *filename); /* * bk_pdf.c */ void pdf_backend(paragraph *, keywordlist *, indexdata *, void *); paragraph *pdf_config_filename(char *filename); #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/help.c����������������������������������������������������������������������������������0000644�0001753�0001753�00000003257�12444773746�011057� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * help.c: usage instructions */ #include <stdio.h> #include "halibut.h" static const char *const helptext[] = { "usage: halibut [options] files", "options: --text[=filename] generate plain text output", " --html[=filename] generate XHTML output", " --winhelp[=filename] generate Windows Help output", " --man[=filename] generate man page output", " --info[=filename] generate GNU info output", " --ps[=filename] generate PostScript output", " --pdf[=filename] generate PDF output", " -Cfoo:bar:baz append \\cfg{foo}{bar}{baz} to input", " --input-charset=cs change default input file charset", " --list-charsets display supported character set names", " --list-fonts display supported font names", " --precise report column numbers in error messages", " --help display this text", " --version display version number", " --licence display licence text", NULL }; static const char *const usagetext[] = { "usage: halibut [--format[=filename]] [options] file.but [file.but...]", NULL }; void help(void) { const char *const *p; for (p = helptext; *p; p++) puts(*p); } void usage(void) { const char *const *p; for (p = usagetext; *p; p++) puts(*p); } void showversion(void) { printf("Halibut, %s\n", version); } void listcharsets(void) { int i = 0, c; do { c = charset_localenc_nth(i); if (c == CS_NONE) break; printf("%s\n", charset_to_localenc(c)); i++; } while (1); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/in_afm.c��������������������������������������������������������������������������������0000644�0001753�0001753�00000015337�12444773746�011362� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdio.h> #include <stdlib.h> #include "halibut.h" #include "paper.h" char *afm_read_line(input *in) { int i, len = 256; int c; char *line; do { i = 0; in->pos.line++; c = getc(in->currfp); if (c == EOF) { err_afmeof(&in->pos); return NULL; } line = snewn(len, char); while (c != EOF && c != '\r' && c != '\n') { if (i >= len - 1) { len += 256; line = sresize(line, len, char); } line[i++] = c; c = getc(in->currfp); } if (c == '\r') { /* Cope with CRLF terminated lines */ c = getc(in->currfp); if (c != '\n' && c != EOF) ungetc(c, in->currfp); } line[i] = 0; } while (line[(strspn(line, " \t"))] == 0 || strncmp(line, "Comment ", 8) == 0 || strncmp(line, "Comment\t", 8) == 0); return line; } static int afm_require_key(char *line, char const *expected, input *in) { char *key = strtok(line, " \t"); if (strcmp(key, expected) == 0) return TRUE; err_afmkey(&in->pos, expected); return FALSE; } void read_afm_file(input *in) { char *line, *key, *val; font_info *fi; size_t i; fi = snew(font_info); fi->name = NULL; fi->widths = newtree234(width_cmp); fi->fontfile = NULL; fi->kerns = newtree234(kern_cmp); fi->ligs = newtree234(lig_cmp); fi->fontbbox[0] = fi->fontbbox[1] = fi->fontbbox[2] = fi->fontbbox[3] = 0; fi->capheight = fi->xheight = fi->ascent = fi->descent = 0; fi->stemh = fi->stemv = fi->italicangle = 0; for (i = 0; i < lenof(fi->bmp); i++) fi->bmp[i] = 0xFFFF; in->pos.line = 0; line = afm_read_line(in); if (!line || !afm_require_key(line, "StartFontMetrics", in)) goto giveup; if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, "StartFontMetrics", 1); goto giveup; } if (atof(val) >= 5.0) { err_afmvers(&in->pos); goto giveup; } sfree(line); for (;;) { line = afm_read_line(in); if (line == NULL) goto giveup; key = strtok(line, " \t"); if (strcmp(key, "EndFontMetrics") == 0) { fi->next = all_fonts; all_fonts = fi; fclose(in->currfp); return; } else if (strcmp(key, "FontName") == 0) { if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } fi->name = dupstr(val); } else if (strcmp(key, "FontBBox") == 0) { int i; for (i = 0; i < 3; i++) { if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 4); goto giveup; } fi->fontbbox[i] = atof(val); } } else if (strcmp(key, "CapHeight") == 0) { if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } fi->capheight = atof(val); } else if (strcmp(key, "XHeight") == 0) { if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } fi->xheight = atof(val); } else if (strcmp(key, "Ascender") == 0) { if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } fi->ascent = atof(val); } else if (strcmp(key, "Descender") == 0) { if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } fi->descent = atof(val); } else if (strcmp(key, "CapHeight") == 0) { if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } fi->capheight = atof(val); } else if (strcmp(key, "StdHW") == 0) { if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } fi->stemh = atof(val); } else if (strcmp(key, "StdVW") == 0) { if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } fi->stemv = atof(val); } else if (strcmp(key, "ItalicAngle") == 0) { if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } fi->italicangle = atof(val); } else if (strcmp(key, "StartCharMetrics") == 0) { int nglyphs, i; if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } nglyphs = atoi(val); sfree(line); for (i = 0; i < nglyphs; i++) { int width = 0; glyph g = NOGLYPH; line = afm_read_line(in); if (line == NULL) goto giveup; key = strtok(line, " \t"); while (key != NULL) { if (strcmp(key, "WX") == 0 || strcmp(key, "W0X") == 0) { if (!(val = strtok(NULL, " \t")) || !strcmp(val, ";")) { err_afmval(&in->pos, key, 1); goto giveup; } width = atoi(val); } else if (strcmp(key, "N") == 0) { if (!(val = strtok(NULL, " \t")) || !strcmp(val, ";")) { err_afmval(&in->pos, key, 1); goto giveup; } g = glyph_intern(val); } else if (strcmp(key, "L") == 0) { glyph succ, lig; if (!(val = strtok(NULL, " \t")) || !strcmp(val, ";")) { err_afmval(&in->pos, key, 1); goto giveup; } succ = glyph_intern(val); if (!(val = strtok(NULL, " \t")) || !strcmp(val, ";")) { err_afmval(&in->pos, key, 1); goto giveup; } lig = glyph_intern(val); if (g != NOGLYPH && succ != NOGLYPH && lig != NOGLYPH) { ligature *l = snew(ligature); l->left = g; l->right = succ; l->lig = lig; add234(fi->ligs, l); } } do { key = strtok(NULL, " \t"); } while (key && strcmp(key, ";")); key = strtok(NULL, " \t"); } sfree(line); if (width != 0 && g != NOGLYPH) { wchar_t ucs; glyph_width *w = snew(glyph_width); w->glyph = g; w->width = width; add234(fi->widths, w); ucs = ps_glyph_to_unicode(g); if (ucs < 0xFFFF) fi->bmp[ucs] = g; } } line = afm_read_line(in); if (!line || !afm_require_key(line, "EndCharMetrics", in)) goto giveup; sfree(line); } else if (strcmp(key, "StartKernPairs") == 0 || strcmp(key, "StartKernPairs0") == 0) { int nkerns, i; if (!(val = strtok(NULL, " \t"))) { err_afmval(&in->pos, key, 1); goto giveup; } nkerns = atoi(val); sfree(line); for (i = 0; i < nkerns; i++) { line = afm_read_line(in); if (line == NULL) goto giveup; key = strtok(line, " \t"); if (strcmp(key, "KPX") == 0) { char *nl, *nr; int l, r; kern_pair *kp; nl = strtok(NULL, " \t"); nr = strtok(NULL, " \t"); val = strtok(NULL, " \t"); if (!val) { err_afmval(&in->pos, key, 3); goto giveup; } l = glyph_intern(nl); r = glyph_intern(nr); if (l == -1 || r == -1) continue; kp = snew(kern_pair); kp->left = l; kp->right = r; kp->kern = atoi(val); add234(fi->kerns, kp); } } line = afm_read_line(in); if (!line || !afm_require_key(line, "EndKernPairs", in)) goto giveup; sfree(line); } } giveup: sfree(fi); fclose(in->currfp); return; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/in_pf.c���������������������������������������������������������������������������������0000644�0001753�0001753�00000023347�12444773746�011224� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * PostScript Type 1 font file support for Halibut */ /* * Type 1 font file formats are specified by Adobe Technical Note * #5040: "Supporting Downloadable PostScript Language Fonts". * Halibut supports hexadecimal format (section 3.1) and IBM PC format * (section 3.3), commonly called PFA and PFB respectively. */ #include <assert.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include "halibut.h" #include "paper.h" #define PFB_ASCII 1 #define PFB_BINARY 2 #define PFB_EOF 3 typedef struct t1_font_Tag t1_font; typedef struct t1_data_Tag t1_data; struct t1_font_Tag { t1_data *data; size_t length1; size_t length2; filepos pos; }; struct t1_data_Tag { char type; size_t length; unsigned char *data; t1_data *next; }; typedef struct pfstate_Tag { t1_data *data; t1_data *curblock; size_t offset; } pfstate; static void pf_identify(t1_font *tf); static t1_data *load_pfb_file(FILE *fp, filepos *pos) { t1_data *head = NULL, *tail = NULL; int c, i; char type; pos->line = 0; for (;;) { if (fgetc(fp) != 128) abort(); type = fgetc(fp); if (type == PFB_EOF) return head; if (tail) { tail->next = snew(t1_data); tail = tail->next; } else { head = snew(t1_data); tail = head; } tail->type = type; tail->length = 0; for (i = 0; i < 4; i++) { c = fgetc(fp); if (c == EOF) abort(); tail->length |= c << (8 * i); } tail->data = snewn(tail->length, unsigned char); if (fread(tail->data, 1, tail->length, fp) != tail->length) abort(); } tail->next = NULL; } static t1_data *load_pfa_file(FILE *fp, filepos *pos) { t1_data *ret = snew(t1_data); size_t off = 0, len, got; pos->line = 0; ret->type = PFB_ASCII; len = 32768; ret->data = snewn(len, unsigned char); for (;;) { got = fread(ret->data + off, 1, len - off, fp); off += got; if (off != len) break; len *= 2; ret->data = sresize(ret->data, len, unsigned char); } ret->data = sresize(ret->data, off, unsigned char); ret->length = off; ret->next = NULL; return ret; } void read_pfa_file(input *in) { t1_font *tf = snew(t1_font); tf->data = load_pfa_file(in->currfp, &in->pos); tf->pos = in->pos; tf->length1 = tf->length2 = 0; fclose(in->currfp); pf_identify(tf); } void read_pfb_file(input *in) { t1_font *tf = snew(t1_font); tf->data = load_pfb_file(in->currfp, &in->pos); tf->pos = in->pos; tf->length1 = tf->length2 = 0; fclose(in->currfp); pf_identify(tf); } static char *pf_read_token(pfstate *); /* * Read a character from the initial plaintext part of a Type 1 font */ static int pf_getc(pfstate *pf) { if (pf->offset == pf->curblock->length) { if (pf->curblock->next == NULL) return EOF; pf->curblock = pf->curblock->next; pf->offset = 0; } if (pf->curblock->type != PFB_ASCII) return EOF; return pf->curblock->data[pf->offset++]; } static void pf_ungetc(int c, pfstate *pf) { assert(pf->offset > 0); pf->offset--; assert(c == pf->curblock->data[pf->offset]); } static void pf_rewind(pfstate *pf) { pf->curblock = pf->data; pf->offset = 0; } static void pf_seek(pfstate *pf, size_t off) { t1_data *td = pf->data; while (td->length < off) { off -= td->length; td = td->next; } pf->curblock = td; pf->offset = off; } static size_t pf_tell(pfstate *pf) { t1_data *td = pf->data; size_t o = 0; while (td != pf->curblock) { o += td->length; td = td->next; } return o + pf->offset; } static void pf_identify(t1_font *tf) { rdstringc rsc = { 0, 0, NULL }; char *p; size_t len; char *fontname; font_info *fi; int c; pfstate pfs, *pf = &pfs; pf->data = tf->data; pf_rewind(pf); do { c = pf_getc(pf); if (c == EOF) { sfree(rsc.text); err_pfeof(&tf->pos); return; } rdaddc(&rsc, c); } while (c != 012 && c != 015); p = rsc.text; if ((p = strchr(p, ':')) == NULL) { sfree(rsc.text); err_pfhead(&tf->pos); return; } p++; p += strspn(p, " \t"); len = strcspn(p, " \t"); fontname = snewn(len + 1, char); memcpy(fontname, p, len); fontname[len] = 0; sfree(rsc.text); for (fi = all_fonts; fi; fi = fi->next) { if (strcmp(fi->name, fontname) == 0) { fi->fontfile = tf; fi->filetype = TYPE1; sfree(fontname); return; } } err_pfnoafm(&tf->pos, fontname); sfree(fontname); } /* * PostScript white space characters; PLRM3 table 3.1 */ static int pf_isspace(int c) { return c == 000 || c == 011 || c == 012 || c == 014 || c == 015 || c == ' '; } /* * PostScript special characters; PLRM3 page 27 */ static int pf_isspecial(int c) { return c == '(' || c == ')' || c == '<' || c == '>' || c == '[' || c == ']' || c == '{' || c == '}' || c == '/' || c == '%'; } static size_t pf_findtoken(t1_font *tf, size_t off, char const *needle) { char *tok; pfstate pfs, *pf = &pfs; pf->data = tf->data; pf_seek(pf, off); for (;;) { tok = pf_read_token(pf); if (tok == NULL) { if (pf->offset == 0 && pf->curblock->type == PFB_BINARY) pf->curblock = pf->curblock->next; else return (size_t)-1; } else { if (strcmp(tok, needle) == 0) { sfree(tok); return pf_tell(pf); } sfree(tok); } } } static size_t pf_length1(t1_font *tf) { size_t ret; ret = pf_findtoken(tf, 0, "eexec"); if (ret == (size_t)-1) { err_pfeof(&tf->pos); return 0; } return ret; } static size_t pf_length2(t1_font *tf) { size_t ret; if (tf->length1 == 0) tf->length1 = pf_length1(tf); ret = pf_findtoken(tf, tf->length1, "cleartomark"); if (ret == (size_t)-1) { err_pfeof(&tf->pos); return 0; } return ret - 12 - tf->length1; /* backspace over "cleartomark\n" */ } static void pf_getascii(t1_font *tf, size_t off, size_t len, char **bufp, size_t *lenp) { t1_data *td = tf->data; size_t blk, i; char *p; while (td && off >= td->length) { off -= td->length; td = td->next; } *bufp = NULL; *lenp = 0; while (td && len) { blk = len < td->length ? len : td->length; if (td->type == PFB_ASCII) { *bufp = sresize(*bufp, *lenp + blk, char); memcpy(*bufp + *lenp, td->data + off, blk); *lenp += blk; } else { *bufp = sresize(*bufp, *lenp + blk * 2 + blk / 39 + 3, char); p = *bufp + *lenp; for (i = 0; i < blk; i++) { if (i % 39 == 0) p += sprintf(p, "\n"); p += sprintf(p, "%02x", td->data[off + i]); } p += sprintf(p, "\n"); *lenp = p - *bufp; } len -= blk; td = td->next; off = 0; } } void pf_writeps(font_info const *fi, FILE *ofp) { char *buf; size_t len; pf_getascii(fi->fontfile, 0, INT_MAX, &buf, &len); fwrite(buf, 1, len, ofp); sfree(buf); } static int hexval(char c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'A' && c <= 'F') return c - 'A' + 0xA; if (c >= 'a' && c <= 'f') return c - 'a' + 0xa; return 0; } static void pf_getbinary(t1_font *tf, size_t off, size_t len, char **bufp, size_t *lenp) { t1_data *td = tf->data; size_t blk, i; int havenybble = 0; char *p, nybble; while (td && off >= td->length) { off -= td->length; td = td->next; } *bufp = NULL; *lenp = 0; while (td && len) { blk = len < td->length ? len : td->length; if (td->type == PFB_BINARY) { *bufp = sresize(*bufp, *lenp + blk, char); memcpy(*bufp + *lenp, td->data + off, blk); *lenp += blk; } else { *bufp = sresize(*bufp, *lenp + blk / 2 + 1, char); p = *bufp + *lenp; for (i = 0; i < blk; i++) { if (pf_isspace(td->data[off + i])) continue; if (!havenybble) nybble = hexval(td->data[off+i]); else *p++ = (nybble << 4) | hexval(td->data[off+i]); havenybble = !havenybble; } *lenp = p - *bufp; } len -= blk; td = td->next; off = 0; } } /* * Return the initial, unencrypted, part of a font. */ void pf_part1(font_info *fi, char **bufp, size_t *lenp) { t1_font *tf = fi->fontfile; if (tf->length1 == 0) tf->length1 = pf_length1(tf); pf_getascii(tf, 0, tf->length1, bufp, lenp); } /* * Return the middle, encrypted, part of a font. */ void pf_part2(font_info *fi, char **bufp, size_t *lenp) { t1_font *tf = fi->fontfile; if (tf->length2 == 0) tf->length2 = pf_length2(tf); pf_getbinary(tf, tf->length1, tf->length2, bufp, lenp); if (*lenp >= 256) *lenp -= 256; } static char *pf_read_litstring(pfstate *pf) { rdstringc rsc = { 0, 0, NULL }; int depth = 1; int c; rdaddc(&rsc, '('); do { c = pf_getc(pf); switch (c) { case '(': depth++; break; case ')': depth--; break; case '\\': rdaddc(&rsc, '\\'); c = pf_getc(pf); break; } if (c != EOF) rdaddc(&rsc, c); } while (depth > 0 && c != EOF); return rsc.text; } static char *pf_read_hexstring(pfstate *pf) { rdstringc rsc = { 0, 0, NULL }; int c; rdaddc(&rsc, '<'); do { c = pf_getc(pf); if (c != EOF) rdaddc(&rsc, c); } while (c != '>' && c != EOF); return rsc.text; } static char *pf_read_word(pfstate *pf, int c) { rdstringc rsc = { 0, 0, NULL }; rdaddc(&rsc, c); if (c == '{' || c == '}' || c == '[' || c == ']') return rsc.text; for (;;) { c = pf_getc(pf); if (pf_isspecial(c) || pf_isspace(c) || c == EOF) break; rdaddc(&rsc, c); } if (pf_isspecial(c)) pf_ungetc(c, pf); return rsc.text; } static char *pf_read_token(pfstate *pf) { int c; do { c = pf_getc(pf); } while (pf_isspace(c)); if (c == EOF) return NULL; if (c == '%') { do { c = pf_getc(pf); } while (c != 012 && c != 015); return pf_read_token(pf); } if (c == '(') return pf_read_litstring(pf); if (c == '<') return pf_read_hexstring(pf); return pf_read_word(pf, c); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/in_sfnt.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000101537�12444773746�011567� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Support for sfnt-housed fonts for Halibut * * sfnt-housed fonts include TrueType, OpenType, sfnt-housed Type 1 * fonts and a couple of bitmap formats. * * The various tables that can appear in sfnt-housed fonts are defined * in several places. These include: * * The OpenType Specification: * <http://partners.adobe.com/public/developer/opentype/index_spec.html> * * The TrueType Reference Manual: * <http://developer.apple.com/textfonts/TTRefMan/> * * Microsoft typography specifications: * <http://www.microsoft.com/typography/SpecificationsOverview.mspx> */ #include <assert.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> #include "halibut.h" #include "paper.h" typedef struct sfnt_decode_Tag sfnt_decode; struct sfnt_decode_Tag { void (*decoder)(void *src, void *dest); size_t src_len; size_t dest_offset; }; #if 0 /* unused */ static void decode_uint8(void *src, void *dest) { *(unsigned int *)dest = *(unsigned char *)src; } #define d_uint8 decode_uint8, 1 #endif #if 0 /* unused */ static void decode_int8(void *src, void *dest) { *(int *)dest = *(signed char *)src; } #define d_int8 decode_int8, 1 #endif static void decode_uint16(void *src, void *dest) { unsigned char *cp = src; *(unsigned int *)dest = (cp[0] << 8) + cp[1]; } #define d_uint16 decode_uint16, 2 static void decode_int16(void *src, void *dest) { signed char *cp = src; unsigned char *ucp = src; *(int *)dest = (cp[0] << 8) + ucp[1]; } #define d_int16 decode_int16, 2 static void decode_uint32(void *src, void *dest) { unsigned char *cp = src; *(unsigned int *)dest = (cp[0] << 24) + (cp[1] << 16) + (cp[2] << 8) + cp[3]; } #define d_uint32 decode_uint32, 4 static void decode_int32(void *src, void *dest) { signed char *cp = src; unsigned char *ucp = src; *(int *)dest = (cp[0] << 24) + (ucp[1] << 16) + (ucp[2] << 8) + ucp[3]; } #define d_int32 decode_int32, 4 static void decode_skip(void *src, void *dest) { IGNORE(src); IGNORE(dest); /* do nothing */ } #define d_skip(n) decode_skip, (n), 0 static void decode_end(void *src, void *dest) { IGNORE(src); IGNORE(dest); /* never called */ } #define d_end decode_end, 0, 0 static void *decode(sfnt_decode *dec, void *src, void *end, void *dest) { while (dec->decoder != decode_end) { if ((char *)src + dec->src_len > (char *)end) return NULL; dec->decoder(src, (char *)dest + dec->dest_offset); src = (char *)src + dec->src_len; dec++; } return src; } static void *decoden(sfnt_decode *dec, void *src, void *end, void *dest, size_t size, size_t n) { while (n-- && src) { src = decode(dec, src, end, dest); dest = (char *)dest + size; } return src; } /* Decoding specs for simple data types */ sfnt_decode uint16_decode[] = { { d_uint16, 0 }, { d_end } }; sfnt_decode int16_decode[] = { { d_int16, 0 }, { d_end } }; sfnt_decode uint32_decode[] = { { d_uint32, 0 }, { d_end } }; /* Offset subdirectory -- the start of the file */ typedef struct offsubdir_Tag offsubdir; struct offsubdir_Tag { unsigned scaler_type; unsigned numTables; }; sfnt_decode offsubdir_decode[] = { { d_uint32, offsetof(offsubdir, scaler_type) }, { d_uint16, offsetof(offsubdir, numTables) }, { d_skip(6) }, { d_end } }; #define sfnt_00010000 0x00010000 #define TAG_OS_2 0x4f532f32 #define TAG_cmap 0x636d6170 #define TAG_glyf 0x676c7966 #define TAG_head 0x68656164 #define TAG_hhea 0x68686561 #define TAG_hmtx 0x686d7478 #define TAG_kern 0x6b65726e #define TAG_loca 0x6c6f6361 #define TAG_maxp 0x6d617870 #define TAG_name 0x6e616d65 #define TAG_post 0x706f7374 #define sfnt_true 0x74727565 /* Table directory */ typedef struct tabledir_Tag tabledir; struct tabledir_Tag { unsigned tag; unsigned checkSum; unsigned offset; unsigned length; }; sfnt_decode tabledir_decode[] = { { d_uint32, offsetof(tabledir, tag) }, { d_uint32, offsetof(tabledir, checkSum) }, { d_uint32, offsetof(tabledir, offset) }, { d_uint32, offsetof(tabledir, length) }, { d_end } }; /* OS/2 and Windows compatibility table */ typedef struct t_OS_2_Tag t_OS_2; struct t_OS_2_Tag { unsigned version; int sTypoAscender, sTypoDescender; int sxHeight, sCapHeight; }; sfnt_decode t_OS_2_v0_decode[] = { { d_uint16, offsetof(t_OS_2, version) }, { d_skip(66) }, /* xAvgCharWidth, usWeightClass, usWidthClass, fsType, */ /* ySubscriptXSize, ySubscriptYSize, ySubscriptXOffset, */ /* ySubscriptYOffset, ySuperscriptXSize, ySuperscriptYSize, */ /* ySuperscriptXOffset, ySupercriptYOffset, sFamilyClass, panose, */ /* ulUnicodeRange1, ulUnicodeRange2, ulUnicodeRange3, ulUnicodeRange4, */ /* achVendID, fsSelection, usFirstCharIndex, usLastCharIndex */ { d_end } }; sfnt_decode t_OS_2_v1_decode[] = { { d_uint16, offsetof(t_OS_2, version) }, { d_skip(66) }, /* xAvgCharWidth, usWeightClass, usWidthClass, fsType, */ /* ySubscriptXSize, ySubscriptYSize, ySubscriptXOffset, */ /* ySubscriptYOffset, ySuperscriptXSize, ySuperscriptYSize, */ /* ySuperscriptXOffset, ySupercriptYOffset, sFamilyClass, panose, */ /* ulUnicodeRange1, ulUnicodeRange2, ulUnicodeRange3, ulUnicodeRange4, */ /* achVendID, fsSelection, usFirstCharIndex, usLastCharIndex */ { d_int16, offsetof(t_OS_2, sTypoAscender) }, { d_int16, offsetof(t_OS_2, sTypoDescender) }, { d_skip(14) }, /* sTypoLineGap, usWinAscent, usWinDescent, */ /* ulCodePageRange1, ulCodePageRange2 */ { d_end } }; sfnt_decode t_OS_2_v2_decode[] = { { d_uint16, offsetof(t_OS_2, version) }, { d_skip(66) }, /* xAvgCharWidth, usWeightClass, usWidthClass, fsType, */ /* ySubscriptXSize, ySubscriptYSize, ySubscriptXOffset, */ /* ySubscriptYOffset, ySuperscriptXSize, ySuperscriptYSize, */ /* ySuperscriptXOffset, ySupercriptYOffset, sFamilyClass, panose, */ /* ulUnicodeRange1, ulUnicodeRange2, ulUnicodeRange3, ulUnicodeRange4, */ /* achVendID, fsSelection, usFirstCharIndex, usLastCharIndex */ { d_int16, offsetof(t_OS_2, sTypoAscender) }, { d_int16, offsetof(t_OS_2, sTypoDescender) }, { d_skip(14) }, /* sTypoLineGap, usWinAscent, usWinDescent, */ /* ulCodePageRange1, ulCodePageRange2 */ { d_int16, offsetof(t_OS_2, sxHeight) }, { d_int16, offsetof(t_OS_2, sCapHeight) }, { d_skip(6) }, /* usDefaultChar, usBreakChar, usMaxContext */ { d_end } }; /* Character to Glyph ('cmap') table */ typedef struct t_cmap_Tag t_cmap; struct t_cmap_Tag { unsigned numTables; }; sfnt_decode t_cmap_decode[] = { { d_skip(2) }, { d_uint16, offsetof(t_cmap, numTables) }, { d_end } }; typedef struct encodingrec_Tag encodingrec; struct encodingrec_Tag { unsigned platformID; unsigned encodingID; unsigned offset; }; sfnt_decode encodingrec_decode[] = { { d_uint16, offsetof(encodingrec, platformID) }, { d_uint16, offsetof(encodingrec, encodingID) }, { d_uint32, offsetof(encodingrec, offset) }, { d_end } }; typedef struct cmap4_Tag cmap4; struct cmap4_Tag { unsigned length; unsigned segCountX2; }; sfnt_decode cmap4_decode[] = { { d_skip(2) }, /* format */ { d_uint16, offsetof(cmap4, length) }, { d_skip(2) }, /* language */ { d_uint16, offsetof(cmap4, segCountX2) }, { d_skip(6) }, /* searchRange, entrySelector, rangeShift */ { d_end } }; /* Font Header ('head') table */ typedef struct t_head_Tag t_head; struct t_head_Tag { unsigned version; unsigned fontRevision; unsigned flags; unsigned unitsPerEm; int xMin, yMin, xMax, yMax; int indexToLocFormat; }; sfnt_decode t_head_decode[] = { { d_uint32, offsetof(t_head, version) }, { d_uint32, offsetof(t_head, fontRevision) }, { d_skip(8) }, /* checkSumAdjustment, magicNumber, flags */ { d_uint16, offsetof(t_head, flags) }, { d_uint16, offsetof(t_head, unitsPerEm) }, { d_skip(16) }, /* created, modified */ { d_int16, offsetof(t_head, xMin) }, { d_int16, offsetof(t_head, yMin) }, { d_int16, offsetof(t_head, xMax) }, { d_int16, offsetof(t_head, yMax) }, { d_skip(6) }, /* macStyle, lowestRecPPEM, fontDirectionHint */ { d_int16, offsetof(t_head, indexToLocFormat) }, { d_skip(2) }, { d_end } }; /* Horizontal Header ('hhea') table */ typedef struct t_hhea_Tag t_hhea; struct t_hhea_Tag { unsigned version; int ascent; int descent; int lineGap; int metricDataFormat; unsigned numOfLongHorMetrics; }; sfnt_decode t_hhea_decode[] = { { d_uint32, offsetof(t_hhea, version) }, { d_int16, offsetof(t_hhea, ascent) }, { d_int16, offsetof(t_hhea, descent) }, { d_int16, offsetof(t_hhea, lineGap) }, { d_skip(22) }, { d_int16, offsetof(t_hhea, metricDataFormat) }, { d_uint16, offsetof(t_hhea, numOfLongHorMetrics) }, { d_end } }; /* Horizontal Metrics ('hmtx') table */ sfnt_decode longhormetric_decode[] = { { d_uint16, 0 }, { d_skip(2) }, { d_end } }; /* Kerning ('kern') table */ typedef struct t_kern_Tag t_kern; struct t_kern_Tag { unsigned version; unsigned nTables; }; sfnt_decode t_kern_v0_decode[] = { { d_uint16, offsetof(t_kern, version) }, { d_uint16, offsetof(t_kern, nTables) }, { d_end } }; typedef struct kern_v0_subhdr_Tag kern_v0_subhdr; struct kern_v0_subhdr_Tag { unsigned version; unsigned length; unsigned coverage; }; sfnt_decode kern_v0_subhdr_decode[] = { { d_uint16, offsetof(kern_v0_subhdr, version) }, { d_uint16, offsetof(kern_v0_subhdr, length) }, { d_uint16, offsetof(kern_v0_subhdr, coverage) }, { d_end } }; #define KERN_V0_HORIZ 0x0001 #define KERN_V0_MINIMUM 0x0002 #define KERN_V0_CROSSSTREAM 0x0004 #define KERN_V0_OVERRIDE 0x0008 #define KERN_V0_FORMAT 0xff00 #define KERN_V0_FORMAT_0 0x0000 sfnt_decode t_kern_v1_decode[] = { { d_uint32, offsetof(t_kern, version) }, { d_uint32, offsetof(t_kern, nTables) }, { d_end } }; typedef struct kern_v1_subhdr_Tag kern_v1_subhdr; struct kern_v1_subhdr_Tag { unsigned length; unsigned coverage; }; sfnt_decode kern_v1_subhdr_decode[] = { { d_uint32, offsetof(kern_v1_subhdr, length) }, { d_uint16, offsetof(kern_v1_subhdr, coverage) }, { d_skip(2) }, /* tupleIndex */ { d_end } }; #define KERN_V1_VERTICAL 0x8000 #define KERN_V1_CROSSSTREAM 0x4000 #define KERN_V1_VARIATION 0x2000 #define KERN_V1_FORMAT 0x00ff #define KERN_V1_FORMAT_0 0x0000 typedef struct kern_f0_Tag kern_f0; struct kern_f0_Tag { unsigned nPairs; }; sfnt_decode kern_f0_decode[] = { { d_uint16, offsetof(kern_f0, nPairs) }, { d_skip(6) }, /* searchRange, entrySelector, rangeShift */ { d_end } }; typedef struct kern_f0_pair_Tag kern_f0_pair; struct kern_f0_pair_Tag { unsigned left; unsigned right; int value; }; sfnt_decode kern_f0_pair_decode[] = { { d_uint16, offsetof(kern_f0_pair, left) }, { d_uint16, offsetof(kern_f0_pair, right) }, { d_int16, offsetof(kern_f0_pair, value) }, { d_end } }; /* Maximum profile ('maxp') table */ typedef struct t_maxp_Tag t_maxp; struct t_maxp_Tag { unsigned version; unsigned numGlyphs; }; sfnt_decode t_maxp_decode[] = { { d_uint32, offsetof(t_maxp, version) }, { d_uint16, offsetof(t_maxp, numGlyphs) }, { d_end } }; /* Naming ('name') table */ typedef struct t_name_Tag t_name; typedef struct namerecord_Tag namerecord; struct t_name_Tag { unsigned format; unsigned count; unsigned stringOffset; namerecord *nameRecord; }; sfnt_decode t_name_decode[] = { { d_uint16, offsetof(t_name, format) }, { d_uint16, offsetof(t_name, count) }, { d_uint16, offsetof(t_name, stringOffset) }, { d_end } }; struct namerecord_Tag { unsigned platformID; unsigned encodingID; unsigned languageID; unsigned nameID; unsigned length; unsigned offset; }; sfnt_decode namerecord_decode[] = { { d_uint16, offsetof(namerecord, platformID) }, { d_uint16, offsetof(namerecord, encodingID) }, { d_uint16, offsetof(namerecord, languageID) }, { d_uint16, offsetof(namerecord, nameID) }, { d_uint16, offsetof(namerecord, length) }, { d_uint16, offsetof(namerecord, offset) }, { d_end } }; /* PostScript compatibility ('post') table */ typedef struct t_post_Tag t_post; struct t_post_Tag { unsigned format; int italicAngle; int underlinePosition; int underlineThickness; unsigned isFixedPitch; unsigned minMemType42; unsigned maxMemType42; }; sfnt_decode t_post_decode[] = { { d_uint32, offsetof(t_post, format) }, { d_int32, offsetof(t_post, italicAngle) }, { d_int16, offsetof(t_post, underlinePosition) }, { d_int16, offsetof(t_post, underlineThickness) }, { d_uint32, offsetof(t_post, isFixedPitch) }, { d_uint32, offsetof(t_post, minMemType42) }, { d_uint32, offsetof(t_post, maxMemType42) }, { d_skip(8) }, /* minMemType1, maxMemType1 */ { d_end } }; typedef struct { glyph name; unsigned short index; } glyphmap; struct sfnt_Tag { void *data; size_t len; void *end; filepos pos; offsubdir osd; tabledir *td; t_head head; unsigned nglyphs; glyph *glyphsbyindex; unsigned short *glyphsbyname; unsigned minmem, maxmem; }; static int sfnt_findtable(sfnt *sf, unsigned tag, void **startp, void **endp) { size_t i; for (i = 0; i < sf->osd.numTables; i++) { if (sf->td[i].tag == tag) { *startp = (char *)sf->data + sf->td[i].offset; *endp = (char *)*startp + sf->td[i].length; return TRUE; } } return FALSE; } static char *sfnt_psname(font_info *fi) { sfnt *sf = fi->fontfile; t_name name; void *ptr, *end; size_t i; char *psname; namerecord *nr; if (!sfnt_findtable(sf, TAG_name, &ptr, &end)) { err_sfntnotable(&sf->pos, "name"); return NULL; } ptr = decode(t_name_decode, ptr, end, &name); name.nameRecord = snewn(name.count, namerecord); ptr = decoden(namerecord_decode, ptr, sf->end, name.nameRecord, sizeof(*name.nameRecord), name.count); for (i = 0; i < name.count; i++) { nr = name.nameRecord + i; if (nr->nameID == 6) { /* PostScript name, but can we make sense of it? */ if (nr->platformID == 1 && nr->encodingID == 0) { /* Mac Roman, which is ASCII for our purposes */ psname = snewn(nr->length + 1, char); memcpy(psname, (char *)ptr + nr->offset, nr->length); psname[nr->length] = 0; sfree(name.nameRecord); return psname; } } } err_sfntnopsname(&sf->pos); return NULL; } static unsigned short *cmp_glyphsbyindex; static int glyphsbyname_cmp(void const *a, void const *b) { glyph ga = cmp_glyphsbyindex[*(unsigned short *)a]; glyph gb = cmp_glyphsbyindex[*(unsigned short *)b]; if (ga < gb) return -1; if (ga > gb) return 1; /* For de-duping, we'd prefer to have the first glyph stay first */ if (*(unsigned short *)a < *(unsigned short *)b) return -1; if (*(unsigned short *)a > *(unsigned short *)b) return 1; return 0; } static int glyphsbyname_cmp_search(void const *a, void const *b) { glyph ga = *(glyph *)a; glyph gb = cmp_glyphsbyindex[*(unsigned short *)b]; if (ga < gb) return -1; if (ga > gb) return 1; return 0; } /* Generate an name for a glyph that doesn't have one. */ static glyph genglyph(unsigned idx) { char buf[11]; if (idx == 0) return glyph_intern(".notdef"); sprintf(buf, "glyph%u", idx); return glyph_intern(buf); } /* * Extract data from the 'post' table (mostly glyph mappings) * * TODO: cope better with duplicated glyph names (usually .notdef) * TODO: when presented with format 3.0, try to use 'CFF' if present. */ static void sfnt_mapglyphs(font_info *fi) { sfnt *sf = fi->fontfile; t_post post; void *ptr, *end; unsigned char *sptr; char tmp[256]; glyph *extraglyphs, prev, this; unsigned nextras, i, g, suflen; sf->glyphsbyname = sf->glyphsbyindex = NULL; if (sfnt_findtable(sf, TAG_post, &ptr, &end)) { ptr = decode(t_post_decode, ptr, end, &post); if (ptr == NULL) { err_sfntbadtable(&sf->pos, "post"); goto noglyphs; } sf->minmem = post.minMemType42; sf->maxmem = post.maxMemType42; fi->italicangle = post.italicAngle / 65536.0; switch (post.format) { case 0x00010000: if (sf->nglyphs != 258) { err_sfntbadtable(&sf->pos, "post"); break; } sf->glyphsbyindex = (glyph *)tt_std_glyphs; break; case 0x00020000: if ((char *)ptr + 2 > (char *)end) { err_sfntbadtable(&sf->pos, "post"); break; } ptr = (char *)ptr + 2; if ((char *)ptr + 2*sf->nglyphs > (char *)end) { err_sfntbadtable(&sf->pos, "post"); break; } nextras = 0; for (sptr = (unsigned char *)ptr + 2*sf->nglyphs; sptr < (unsigned char *)end; sptr += *sptr+1) nextras++; extraglyphs = snewn(nextras, glyph); i = 0; for (sptr = (unsigned char *)ptr + 2*sf->nglyphs; sptr < (unsigned char *)end; sptr += *sptr+1) { memcpy(tmp, sptr + 1, *sptr); tmp[*sptr] = 0; assert(i < nextras); extraglyphs[i++] = glyph_intern(tmp); } sf->glyphsbyindex = snewn(sf->nglyphs, glyph); for (i = 0; i < sf->nglyphs; i++) { decode_uint16((char *)ptr + 2*i, &g); if (g <= 257) sf->glyphsbyindex[i] = tt_std_glyphs[g]; else if (g < 258 + nextras) sf->glyphsbyindex[i] = extraglyphs[g - 258]; else { err_sfntbadtable(&sf->pos, "post"); sf->glyphsbyindex[i] = genglyph(i); } } sfree(extraglyphs); break; case 0x00030000: break; default: err_sfnttablevers(&sf->pos, "post"); break; } } noglyphs: if (!sf->glyphsbyindex) { sf->glyphsbyindex = snewn(sf->nglyphs, glyph); for (i = 0; i < sf->nglyphs; i++) sf->glyphsbyindex[i] = genglyph(i); } /* Construct glyphsbyname */ sf->glyphsbyname = snewn(sf->nglyphs, unsigned short); for (i = 0; i < sf->nglyphs; i++) sf->glyphsbyname[i] = i; cmp_glyphsbyindex = sf->glyphsbyindex; qsort(sf->glyphsbyname, sf->nglyphs, sizeof(*sf->glyphsbyname), glyphsbyname_cmp); /* * It's possible for fonts to specify the same name for multiple * glyphs, which would make one of them inaccessible. Check for * that, and rename all but one of each set. * * To ensure that we don't clash with any existing glyph names, * our renaming involves appending the glyph number formatted with * enough leading zeroes to make it longer than any all-digit * suffix that already exists in the font. */ suflen = 4; for (i = 0; i < sf->nglyphs; i++) { char const *p; p = strrchr(glyph_extern(sfnt_indextoglyph(sf, i)), '.'); if (p && !(p+1)[strspn(p+1, "0123456789")] && strlen(p+1) > suflen) suflen = strlen(p+1); } suflen++; prev = sfnt_indextoglyph(sf, sf->glyphsbyname[0]); for (i = 1; i < sf->nglyphs; i++) { if (prev == (this = sfnt_indextoglyph(sf, sf->glyphsbyname[i]))) { char const *basename; char *buf; basename = glyph_extern(this); buf = snewn(strlen(basename) + 2 + suflen, char); strcpy(buf, basename); sprintf(buf + strlen(basename), ".%0*hu", suflen, sf->glyphsbyname[i]); sf->glyphsbyindex[sf->glyphsbyname[i]] = glyph_intern(buf); sfree(buf); } prev = this; } /* We may have renamed some glyphs, so re-sort the array. */ qsort(sf->glyphsbyname, sf->nglyphs, sizeof(*sf->glyphsbyname), glyphsbyname_cmp); } glyph sfnt_indextoglyph(sfnt *sf, unsigned idx) { return sf->glyphsbyindex[idx]; } unsigned sfnt_nglyphs(sfnt *sf) { return sf->nglyphs; } unsigned sfnt_glyphtoindex(sfnt *sf, glyph g) { cmp_glyphsbyindex = sf->glyphsbyindex; return *(unsigned short *)bsearch(&g, sf->glyphsbyname, sf->nglyphs, sizeof(*sf->glyphsbyname), glyphsbyname_cmp_search); } /* * Get data from 'hhea', 'hmtx', and 'OS/2' tables */ void sfnt_getmetrics(font_info *fi) { sfnt *sf = fi->fontfile; t_hhea hhea; t_OS_2 OS_2; void *ptr, *end; unsigned i, j; unsigned *hmtx; /* First, the bounding box from the 'head' table. */ fi->fontbbox[0] = sf->head.xMin * FUNITS_PER_PT / sf->head.unitsPerEm; fi->fontbbox[1] = sf->head.yMin * FUNITS_PER_PT / sf->head.unitsPerEm; fi->fontbbox[2] = sf->head.xMax * FUNITS_PER_PT / sf->head.unitsPerEm; fi->fontbbox[3] = sf->head.yMax * FUNITS_PER_PT / sf->head.unitsPerEm; if (!sfnt_findtable(sf, TAG_hhea, &ptr, &end)) { err_sfntnotable(&sf->pos, "hhea"); return; } if (decode(t_hhea_decode, ptr, end, &hhea) == NULL) { err_sfntbadtable(&sf->pos, "hhea"); return; } if ((hhea.version & 0xffff0000) != 0x00010000) { err_sfnttablevers(&sf->pos, "hhea"); return; } fi->ascent = hhea.ascent; fi->descent = hhea.descent; if (hhea.metricDataFormat != 0) { err_sfnttablevers(&sf->pos, "hmtx"); return; } if (!sfnt_findtable(sf, TAG_hmtx, &ptr, &end)) { err_sfntnotable(&sf->pos, "hmtx"); return; } hmtx = snewn(hhea.numOfLongHorMetrics, unsigned); if (decoden(longhormetric_decode, ptr, end, hmtx, sizeof(*hmtx), hhea.numOfLongHorMetrics) == NULL) { err_sfntbadtable(&sf->pos, "hmtx"); return; } for (i = 0; i < sf->nglyphs; i++) { glyph_width *w = snew(glyph_width); w->glyph = sfnt_indextoglyph(sf, i); j = i < hhea.numOfLongHorMetrics ? i : hhea.numOfLongHorMetrics - 1; w->width = hmtx[j] * UNITS_PER_PT / sf->head.unitsPerEm; add234(fi->widths, w); } /* Now see if the 'OS/2' table has any useful metrics */ if (!sfnt_findtable(sf, TAG_OS_2, &ptr, &end)) return; if (decode(uint16_decode, ptr, end, &OS_2.version) == NULL) goto bados2; if (OS_2.version >= 2) { if (decode(t_OS_2_v2_decode, ptr, end, &OS_2) == NULL) goto bados2; fi->xheight = OS_2.sxHeight * FUNITS_PER_PT / sf->head.unitsPerEm; fi->capheight = OS_2.sCapHeight * FUNITS_PER_PT / sf->head.unitsPerEm; } else if (OS_2.version == 1) { if (decode(t_OS_2_v1_decode, ptr, end, &OS_2) == NULL) goto bados2; } else return; fi->ascent = OS_2.sTypoAscender * FUNITS_PER_PT / sf->head.unitsPerEm; fi->descent = OS_2.sTypoDescender * FUNITS_PER_PT / sf->head.unitsPerEm; return; bados2: err_sfntbadtable(&sf->pos, "OS/2"); } /* * Get kerning data from a 'kern' table * * 'kern' tables have two gratuitously different header formats, one * used by Apple and one by Microsoft. Happily, the kerning tables * themselves use the same formats. Halibut only supports simple kern * pairs for horizontal kerning of horizontal text, and ignores * everything else. */ static void sfnt_getkern(font_info *fi) { sfnt *sf = fi->fontfile; t_kern kern; unsigned version, i, j; void *ptr, *end; if (!sfnt_findtable(sf, TAG_kern, &ptr, &end)) return; if (!decode(uint16_decode, ptr, end, &version)) goto bad; if (version == 0) ptr = decode(t_kern_v0_decode, ptr, end, &kern); else if (version == 1) ptr = decode(t_kern_v1_decode, ptr, end, &kern); else return; if (ptr == NULL) goto bad; for (i = 0; i < kern.nTables; i++) { kern_f0 f0; kern_pair *kerns; if (version == 0) { kern_v0_subhdr sub; ptr = decode(kern_v0_subhdr_decode, ptr, end, &sub); if (ptr == NULL) goto bad; if (sub.version != 0 || (sub.coverage & (KERN_V0_HORIZ | KERN_V0_MINIMUM | KERN_V0_CROSSSTREAM | KERN_V0_FORMAT)) != (KERN_V0_HORIZ | KERN_V0_FORMAT_0)) { ptr = (char *)ptr + sub.length - 6; continue; } } else { kern_v1_subhdr sub; ptr = decode(kern_v1_subhdr_decode, ptr, end, &sub); if (ptr == NULL) goto bad; if ((sub.coverage & (KERN_V1_VERTICAL | KERN_V1_CROSSSTREAM | KERN_V1_VARIATION | KERN_V1_FORMAT)) != KERN_V0_FORMAT_0) { ptr = (char *)ptr + sub.length - 8; continue; } } ptr = decode(kern_f0_decode, ptr, end, &f0); if (ptr == NULL) goto bad; kerns = snewn(f0.nPairs, kern_pair); for (j = 0; j < f0.nPairs; j++) { kern_f0_pair p; kern_pair *kp = kerns + j; ptr = decode(kern_f0_pair_decode, ptr, end, &p); if (ptr == NULL) goto bad; if (p.left >= sf->nglyphs || p.right >= sf->nglyphs) goto bad; kp->left = sfnt_indextoglyph(sf, p.left); kp->right = sfnt_indextoglyph(sf, p.right); kp->kern = p.value * UNITS_PER_PT / (int)sf->head.unitsPerEm; add234(fi->kerns, kp); } } return; bad: err_sfntbadtable(&sf->pos, "kern"); return; } /* * Get mapping data from 'cmap' table * * We look for either a (0, 0), (0, 2), (0, 3), or (3, 1) table, all * of these being versions of UCS-2. We ignore (0, 1), since it's * Unicode 1.1 with precomposed Hangul syllables. We only handle * format 4 of this table, since that seems to be the only one in use. */ void sfnt_getmap(font_info *fi) { sfnt *sf = fi->fontfile; t_cmap cmap; encodingrec *esd; void *base, *ptr, *end; unsigned i; unsigned format; for (i = 0; i < lenof(fi->bmp); i++) fi->bmp[i] = 0xFFFF; if (!sfnt_findtable(sf, TAG_cmap, &ptr, &end)) { err_sfntnotable(&sf->pos, "cmap"); } base = ptr; ptr = decode(t_cmap_decode, ptr, end, &cmap); if (ptr == NULL) goto bad; esd = snewn(cmap.numTables, encodingrec); ptr = decoden(encodingrec_decode, ptr, end, esd, sizeof(*esd), cmap.numTables); if (ptr == NULL) goto bad; for (i = 0; i < cmap.numTables; i++) { if (!decode(uint16_decode, (char *)base + esd[i].offset, end, &format)) goto bad; if ((esd[i].platformID == 0 && esd[i].encodingID == 0) || (esd[i].platformID == 0 && esd[i].encodingID == 2) || (esd[i].platformID == 0 && esd[i].encodingID == 3) || (esd[i].platformID == 3 && esd[i].encodingID == 1)) { /* UCS-2 encoding */ if (!decode(uint16_decode, (char *)base + esd[i].offset, end, &format)) goto bad; if (format == 4) { unsigned *data, *endCode, *startCode, *idDelta, *idRangeOffset; unsigned *glyphIndexArray; unsigned segcount, nword, nglyphindex, j; cmap4 cmap4; ptr = decode(cmap4_decode, (char *)base + esd[i].offset, end, &cmap4); if (!ptr) goto bad; segcount = cmap4.segCountX2 / 2; nword = cmap4.length / 2 - 7; data = snewn(nword, unsigned); if (!decoden(uint16_decode, ptr, (char *)ptr + nword * 2, data, sizeof(*data), nword)) goto bad; endCode = data; startCode = data + segcount + 1; idDelta = startCode + segcount; idRangeOffset = idDelta + segcount; glyphIndexArray = idRangeOffset + segcount; nglyphindex = nword - segcount * 4 - 1; for (j = 0; j < segcount; j++) { unsigned k, idx; if (idRangeOffset[j] == 0) { for (k = startCode[j]; k <= endCode[j]; k++) { idx = (k + idDelta[j]) & 0xffff; if (idx != 0) { if (idx > sf->nglyphs) { err_sfntbadglyph(&sf->pos, k); continue; } fi->bmp[k] = sfnt_indextoglyph(sf, idx); } } } else { unsigned startidx = idRangeOffset[j]/2 - segcount + j; for (k = startCode[j]; k <= endCode[j]; k++) { if (startidx + k - startCode[j] >= nglyphindex) { err_sfntbadglyph(&sf->pos, k); continue; } idx = glyphIndexArray[startidx + k - startCode[j]]; if (idx != 0) { idx = (idx + idDelta[j]) & 0xffff; if (idx > sf->nglyphs) { err_sfntbadglyph(&sf->pos, k); continue; } fi->bmp[k] = sfnt_indextoglyph(sf, idx); } } } } sfree(data); return; } } } err_sfntnounicmap(&sf->pos); return; bad: err_sfntbadtable(&sf->pos, "cmap"); } void read_sfnt_file(input *in) { sfnt *sf = snew(sfnt); size_t off = 0, got; FILE *fp = in->currfp; font_info *fi = snew(font_info); void *ptr, *end; t_maxp maxp; fi->name = NULL; fi->widths = newtree234(width_cmp); fi->kerns = newtree234(kern_cmp); fi->ligs = newtree234(lig_cmp); fi->fontbbox[0] = fi->fontbbox[1] = fi->fontbbox[2] = fi->fontbbox[3] = 0; fi->capheight = fi->xheight = fi->ascent = fi->descent = 0; fi->stemh = fi->stemv = fi->italicangle = 0; fi->fontfile = sf; fi->filetype = TRUETYPE; sf->len = 32768; sf->data = snewn(sf->len, unsigned char); for (;;) { got = fread((char *)sf->data + off, 1, sf->len - off, fp); off += got; if (off != sf->len) break; sf->len *= 2; sf->data = sresize(sf->data, sf->len, unsigned char); } fclose(in->currfp); sf->len = off; sf->data = sresize(sf->data, sf->len, unsigned char); sf->end = (char *)sf->data + sf->len; sf->pos = in->pos; sf->pos.line = 0; sf->nglyphs = 0; ptr = decode(offsubdir_decode, sf->data, sf->end, &sf->osd); if (ptr == NULL) { err_sfntbadhdr(&sf->pos); return; } sf->td = snewn(sf->osd.numTables, tabledir); ptr = decoden(tabledir_decode, ptr, sf->end, sf->td, sizeof(*sf->td), sf->osd.numTables); if (ptr == NULL) { err_sfntbadhdr(&sf->pos); return; } if (!sfnt_findtable(sf, TAG_head, &ptr, &end)) { err_sfntnotable(&sf->pos, "head"); return; } if (decode(t_head_decode, ptr, end, &sf->head) == NULL) { err_sfntbadtable(&sf->pos, "head"); return; } if ((sf->head.version & 0xffff0000) != 0x00010000) { err_sfnttablevers(&sf->pos, "head"); return; } if (!sfnt_findtable(sf, TAG_maxp, &ptr, &end)) { err_sfntnotable(&sf->pos, "maxp"); return; } if (decode(t_maxp_decode, ptr, end, &maxp) == NULL) { err_sfntbadtable(&sf->pos, "maxp"); return; } if (maxp.version < 0x00005000 || maxp.version > 0x0001ffff) { err_sfnttablevers(&sf->pos, "maxp"); return; } sf->nglyphs = maxp.numGlyphs; fi->name = sfnt_psname(fi); if (fi->name == NULL) return; sfnt_mapglyphs(fi); sfnt_getmetrics(fi); sfnt_getkern(fi); sfnt_getmap(fi); fi->next = all_fonts; all_fonts = fi; } static int sizecmp(const void *a, const void *b) { if (*(size_t *)a < *(size_t *)b) return -1; if (*(size_t *)a > *(size_t *)b) return 1; return 0; } /* * The format for embedding TrueType fonts in Postscript is defined in * Adobe Technical Note #5012: The Type 42 Font Format Specification. * <http://partners.adobe.com/public/developer/en/font/5012.Type42_Spec.pdf> */ void sfnt_writeps(font_info const *fi, FILE *ofp) { unsigned i, j, lastbreak; sfnt *sf = fi->fontfile; size_t *breaks, glyfoff, glyflen; void *glyfptr, *glyfend, *locaptr, *locaend; unsigned *loca; int cc = 0; /* XXX Unclear that this is the correct format. */ fprintf(ofp, "%%!PS-TrueTypeFont-%u-%u\n", sf->osd.scaler_type, sf->head.fontRevision); if (sf->minmem) fprintf(ofp, "%%%%VMUsage: %u %u\n", sf->minmem, sf->maxmem); fprintf(ofp, "9 dict dup begin\n"); fprintf(ofp, "/FontType 42 def\n"); fprintf(ofp, "/FontMatrix [1 0 0 1 0 0] def\n"); fprintf(ofp, "/FontName /%s def\n", fi->name); fprintf(ofp, "/Encoding StandardEncoding def\n"); if ((sf->head.flags & 0x0003) == 0x0003) { /* * Sensible font with the origin in the right place, such that * the bounding box is meaningful. */ fprintf(ofp, "/FontBBox [%g %g %g %g] readonly def\n", (double)sf->head.xMin / sf->head.unitsPerEm, (double)sf->head.yMin / sf->head.unitsPerEm, (double)sf->head.xMax / sf->head.unitsPerEm, (double)sf->head.yMax / sf->head.unitsPerEm); } else { /* Non-sensible font. */ fprintf(ofp, "/FontBBox [0 0 0 0] readonly def\n"); } fprintf(ofp, "/PaintType 0 def\n"); fprintf(ofp, "/CharStrings %u dict dup begin\n", sf->nglyphs); fprintf(ofp, "0 1 %u{currentfile token pop exch def}bind for\n", sf->nglyphs - 1); for (i = 0; i < sf->nglyphs; i++) ps_token(ofp, &cc, "/%s", glyph_extern(sfnt_indextoglyph(sf, i))); fprintf(ofp, "\nend readonly def\n"); fprintf(ofp, "/sfnts [<"); breaks = snewn(sf->osd.numTables + sf->nglyphs, size_t); for (i = 0; i < sf->osd.numTables; i++) { breaks[i] = sf->td[i].offset; } if (!sfnt_findtable(sf, TAG_glyf, &glyfptr, &glyfend)) { err_sfntnotable(&sf->pos, "glyf"); return; } glyfoff = (char *)glyfptr - (char *)sf->data; glyflen = (char *)glyfend - (char *)glyfptr; if (!sfnt_findtable(sf, TAG_loca, &locaptr, &locaend)) { err_sfntnotable(&sf->pos, "loca"); return; } loca = snewn(sf->nglyphs, unsigned); if (sf->head.indexToLocFormat == 0) { if (!decoden(uint16_decode, locaptr, locaend, loca, sizeof(*loca), sf->nglyphs)) goto badloca; for (i = 0; i < sf->nglyphs; i++) loca[i] *= 2; } else { if (!decoden(uint32_decode, locaptr, locaend, loca, sizeof(*loca), sf->nglyphs)) goto badloca; } for (i = 1; i < sf->nglyphs; i++) { if (loca[i] > glyflen) goto badloca; breaks[sf->osd.numTables + i - 1] = loca[i] + glyfoff; } breaks[sf->osd.numTables + sf->nglyphs - 1] = sf->len; qsort(breaks, sf->osd.numTables + sf->nglyphs, sizeof(*breaks), sizecmp); j = lastbreak = 0; for (i = 0; i < sf->len; i++) { if ((i - lastbreak) % 38 == 0) fprintf(ofp, "\n"); if (i == breaks[j]) { while (i == breaks[j]) j++; lastbreak = i; fprintf(ofp, "00><\n"); } fprintf(ofp, "%02x", *((unsigned char *)sf->data + i)); } fprintf(ofp, "00>] readonly def\n"); sfree(breaks); fprintf(ofp, "end /%s exch definefont\n", fi->name); return; badloca: err_sfntbadtable(&sf->pos, "loca"); } void sfnt_data(font_info *fi, char **bufp, size_t *lenp) { sfnt *sf = fi->fontfile; *bufp = sf->data; *lenp = sf->len; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/index.c���������������������������������������������������������������������������������0000644�0001753�0001753�00000015424�12444773746�011235� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * index.c: create and collate index data structures */ #include <stdio.h> #include <stdlib.h> #include "halibut.h" static int compare_tags(void *av, void *bv); static int compare_entries(void *av, void *bv); indexdata *make_index(void) { indexdata *ret = snew(indexdata); ret->tags = newtree234(compare_tags); ret->entries = newtree234(compare_entries); return ret; } static indextag *make_indextag(void) { indextag *ret = snew(indextag); ret->name = NULL; ret->implicit_text = NULL; ret->explicit_texts = NULL; ret->explicit_fpos = NULL; ret->nexplicit = ret->explicit_size = ret->nrefs = 0; ret->refs = NULL; return ret; } static int compare_tags(void *av, void *bv) { indextag *a = (indextag *)av, *b = (indextag *)bv; return ustricmp(a->name, b->name); } static int compare_to_find_tag(void *av, void *bv) { wchar_t *a = (wchar_t *)av; indextag *b = (indextag *)bv; return ustricmp(a, b->name); } static int compare_entries(void *av, void *bv) { indexentry *a = (indexentry *)av, *b = (indexentry *)bv; return compare_wordlists(a->text, b->text); } /* * Back-end utility: find the indextag with a given name. */ indextag *index_findtag(indexdata *idx, wchar_t *name) { return find234(idx->tags, name, compare_to_find_tag); } /* * Add a \IM. `tags' points to a zero-terminated chain of * zero-terminated strings ("first\0second\0thirdandlast\0\0"). * `text' points to a word list. * * Guarantee on calling sequence: all implicit merges are given * before the explicit ones. */ void index_merge(indexdata *idx, int is_explicit, wchar_t *tags, word *text, filepos *fpos) { indextag *t, *existing; /* * For an implicit merge, we want to remove all emphasis, * because the chances are that the user didn't really want to * index the term as emphasised. */ { word *w; for (w = text; w; w = w->next) { if (w->type == word_Emph || w->type == word_Strong) w->type = word_Normal; else if (w->type == word_EmphSpace || w->type == word_StrongSpace) w->type = word_WhiteSpace; else if (w->type == word_EmphQuote || w->type == word_StrongQuote) w->type = word_Quote; } } /* * FIXME: want to warn on overlapping source sets. */ for (; *tags; tags = uadv(tags)) { t = make_indextag(); t->name = tags; existing = add234(idx->tags, t); if (existing == t) { /* * Duplicate this so we can free it independently. */ t->name = ustrdup(tags); /* * Every tag has an implicit \IM. So if this tag * doesn't exist and we're explicit, then we should * warn (and drop it, since it won't be referenced). */ if (is_explicit) { err_nosuchidxtag(fpos, tags); continue; } /* * Otherwise, this is a new tag with an implicit \IM. */ t->implicit_text = text; t->implicit_fpos = *fpos; } else { if (!is_explicit) { /* * An implicit \IM for a tag that's had an implicit * \IM before. FIXME: we should check the text * against the existing text and warn on * differences. And check the tag for case match * against the existing tag, likewise. */ /* * Check the tag against its previous occurrence to * see if the cases match. */ if (ustrcmp(t->name, existing->name)) { err_indexcase(fpos, t->name, &existing->implicit_fpos, existing->name); } sfree(t); } else { /* * An explicit \IM added to a valid tag. In * particular, this removes the implicit \IM if * present. */ sfree(t); t = existing; if (t->implicit_text) { free_word_list(t->implicit_text); t->implicit_text = NULL; } if (t->nexplicit >= t->explicit_size) { t->explicit_size = t->nexplicit + 8; t->explicit_texts = sresize(t->explicit_texts, t->explicit_size, word *); t->explicit_fpos = sresize(t->explicit_fpos, t->explicit_size, filepos); } t->explicit_texts[t->nexplicit] = text; t->explicit_fpos[t->nexplicit] = *fpos; t->nexplicit++; } } } } /* * Build the final-form index. We now have every tag, with every * \IM, set up in a 2-3 tree indexed by tag. We now want to collate * the RHSes of the \IMs, and sort by final form, and decorate the * entries in the original 2-3 tree with pointers to the RHS * entries. */ void build_index(indexdata *i) { indextag *t; word **ta; filepos *fa; int ti; int j; for (ti = 0; (t = (indextag *)index234(i->tags, ti)) != NULL; ti++) { if (t->implicit_text) { t->nrefs = 1; ta = &t->implicit_text; fa = &t->implicit_fpos; } else { t->nrefs = t->nexplicit; ta = t->explicit_texts; fa = t->explicit_fpos; } if (t->nrefs) { t->refs = snewn(t->nrefs, indexentry *); for (j = 0; j < t->nrefs; j++) { indexentry *ent = snew(indexentry); ent->text = *ta++; ent->fpos = *fa++; t->refs[j] = add234(i->entries, ent); if (t->refs[j] != ent) /* duplicate */ sfree(ent); } } } } void cleanup_index(indexdata *i) { indextag *t; indexentry *ent; int ti; for (ti = 0; (t = (indextag *)index234(i->tags, ti)) != NULL; ti++) { sfree(t->name); free_word_list(t->implicit_text); sfree(t->explicit_texts); sfree(t->refs); sfree(t); } freetree234(i->tags); for (ti = 0; (ent = (indexentry *)index234(i->entries, ti))!=NULL; ti++) { sfree(ent); } freetree234(i->entries); sfree(i); } static void dbg_prtwordlist(int level, word *w); static void dbg_prtmerge(int is_explicit, wchar_t *tag, word *text); void index_debug(indexdata *i) { indextag *t; indexentry *y; int ti; int j; printf("\nINDEX TAGS\n==========\n\n"); for (ti = 0; (t = (indextag *)index234(i->tags, ti)) != NULL; ti++) { printf("\n"); if (t->implicit_text) dbg_prtmerge(0, t->name, t->implicit_text); for (j = 0; j < t->nexplicit; j++) dbg_prtmerge(1, t->name, t->explicit_texts[j]); } printf("\nINDEX ENTRIES\n=============\n\n"); for (ti = 0; (y = (indexentry *)index234(i->entries, ti)) != NULL; ti++) { printf("\n"); printf("{\n"); dbg_prtwordlist(1, y->text); printf("}\n"); } } static void dbg_prtmerge(int is_explicit, wchar_t *tag, word *text) { printf("\\IM: %splicit: \"", is_explicit ? "ex" : "im"); for (; *tag; tag++) putchar(*tag); printf("\" {\n"); dbg_prtwordlist(1, text); printf("}\n"); } static void dbg_prtwordlist(int level, word *w) { for (; w; w = w->next) { wchar_t *wp; printf("%*sword %d ", level*4, "", w->type); if (w->text) { printf("\""); for (wp = w->text; *wp; wp++) putchar(*wp); printf("\""); } else printf("(no text)"); if (w->alt) { printf(" alt = {\n"); dbg_prtwordlist(level+1, w->alt); printf("%*s}", level*4, ""); } printf("\n"); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/input.c���������������������������������������������������������������������������������0000644�0001753�0001753�00000127367�12444773746�011277� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * input.c: read the source form */ #include <stdio.h> #include <assert.h> #include <time.h> #include "halibut.h" #define TAB_STOP 8 /* for column number tracking */ static void setpos(input *in, char *fname) { in->pos.filename = fname; in->pos.line = 1; in->pos.col = (in->reportcols ? 1 : -1); } static void unget(input *in, int c, filepos *pos) { if (in->npushback >= in->pushbacksize) { in->pushbacksize = in->npushback + 16; in->pushback = sresize(in->pushback, in->pushbacksize, pushback); } in->pushback[in->npushback].chr = c; in->pushback[in->npushback].pos = *pos; /* structure copy */ in->npushback++; } /* ---------------------------------------------------------------------- */ /* * Macro subsystem */ typedef struct macro_Tag macro; struct macro_Tag { wchar_t *name, *text; }; struct macrostack_Tag { macrostack *next; wchar_t *text; int ptr, npushback; filepos pos; }; static int macrocmp(void *av, void *bv) { macro *a = (macro *)av, *b = (macro *)bv; return ustrcmp(a->name, b->name); } static void macrodef(tree234 *macros, wchar_t *name, wchar_t *text, filepos fpos) { macro *m = snew(macro); m->name = name; m->text = text; if (add234(macros, m) != m) { err_macroexists(&fpos, name); sfree(name); sfree(text); } } static int macrolookup(tree234 *macros, input *in, wchar_t *name, filepos *pos) { macro m, *gotit; m.name = name; gotit = find234(macros, &m, NULL); if (gotit) { macrostack *expansion = snew(macrostack); expansion->next = in->stack; expansion->text = gotit->text; expansion->pos = *pos; /* structure copy */ expansion->ptr = 0; expansion->npushback = in->npushback; in->stack = expansion; return TRUE; } else return FALSE; } static void macrocleanup(tree234 *macros) { int ti; macro *m; for (ti = 0; (m = (macro *)index234(macros, ti)) != NULL; ti++) { sfree(m->name); sfree(m->text); sfree(m); } freetree234(macros); } static void input_configure(input *in, paragraph *cfg) { assert(cfg->type == para_Config); if (!ustricmp(cfg->keyword, L"input-charset")) { in->charset = charset_from_ustr(&cfg->fpos, uadv(cfg->keyword)); } } /* * Can return EOF */ static int get(input *in, filepos *pos, rdstringc *rsc) { int pushbackpt = in->stack ? in->stack->npushback : 0; if (in->npushback > pushbackpt) { --in->npushback; if (pos) *pos = in->pushback[in->npushback].pos; /* structure copy */ return in->pushback[in->npushback].chr; } else if (in->stack) { wchar_t c = in->stack->text[in->stack->ptr]; if (pos) *pos = in->stack->pos; if (in->stack->text[++in->stack->ptr] == L'\0') { macrostack *tmp = in->stack; in->stack = tmp->next; sfree(tmp); } return c; } else if (in->currfp) { while (in->wcpos >= in->nwc) { int c = getc(in->currfp); if (c == EOF) { if (in->wantclose) fclose(in->currfp); in->currfp = NULL; return EOF; } if (rsc) rdaddc(rsc, c); /* Track line numbers, for error reporting */ if (pos) *pos = in->pos; if (in->reportcols) { switch (c) { case '\t': in->pos.col = 1 + (in->pos.col + TAB_STOP-1) % TAB_STOP; break; case '\n': in->pos.col = 1; in->pos.line++; break; default: in->pos.col++; break; } } else { in->pos.col = -1; if (c == '\n') in->pos.line++; } /* * Do input character set translation, so that we return * Unicode. */ { char buf[1]; char const *p; int inlen; buf[0] = (char)c; p = buf; inlen = 1; in->nwc = charset_to_unicode(&p, &inlen, in->wc, lenof(in->wc), in->charset, &in->csstate, NULL, 0); assert(p == buf+1 && inlen == 0); in->wcpos = 0; } } return in->wc[in->wcpos++]; } else return EOF; } /* * Lexical analysis of source files. */ typedef struct token_Tag token; struct token_Tag { int type; int cmd, aux; wchar_t *text; char *origtext; filepos pos; }; enum { tok_eof, /* end of file */ tok_eop, /* end of paragraph */ tok_white, /* whitespace */ tok_word, /* a word or word fragment */ tok_cmd, /* \command */ tok_lbrace, /* { */ tok_rbrace /* } */ }; /* Halibut command keywords. */ enum { c__invalid, /* invalid command */ c__comment, /* comment command (\#) */ c__escaped, /* escaped character */ c__nop, /* no-op */ c__nbsp, /* nonbreaking space */ c_A, /* appendix heading */ c_B, /* bibliography entry */ c_BR, /* bibliography rewrite */ c_C, /* chapter heading */ c_H, /* heading */ c_I, /* invisible index mark */ c_IM, /* index merge/rewrite */ c_K, /* capitalised cross-reference */ c_S, /* aux field is 0, 1, 2, ... */ c_U, /* unnumbered-chapter heading */ c_W, /* Web hyperlink */ c_b, /* bulletted list */ c_c, /* code */ c_cfg, /* configuration directive */ c_copyright, /* copyright statement */ c_cq, /* quoted code (sugar for \q{\cw{x}}) */ c_cw, /* weak code */ c_date, /* document processing date */ c_dd, /* description list: description */ c_define, /* macro definition */ c_dt, /* description list: described thing */ c_e, /* emphasis */ c_i, /* visible index mark */ c_ii, /* uncapitalised visible index mark */ c_k, /* uncapitalised cross-reference */ c_lcont, /* continuation para(s) for list item */ c_n, /* numbered list */ c_nocite, /* bibliography trickery */ c_preamble, /* (obsolete) preamble text */ c_q, /* quote marks */ c_quote, /* block-quoted paragraphs */ c_rule, /* horizontal rule */ c_s, /* strong */ c_title, /* document title */ c_u, /* aux field is char code */ c_versionid /* document RCS id */ }; /* Perhaps whitespace should be defined in a more Unicode-friendly way? */ #define iswhite(c) ( (c)==32 || (c)==9 || (c)==13 || (c)==10 ) #define isnl(c) ( (c)==10 ) #define isdec(c) ( ((c)>='0'&&(c)<='9') ) #define fromdec(c) ( (c)-'0' ) #define ishex(c) ( ((c)>='0'&&(c)<='9') || ((c)>='A'&&(c)<='F') || ((c)>='a'&&(c)<='f')) #define fromhex(c) ( (c)<='9' ? (c)-'0' : ((c)&0xDF) - ('A'-10) ) #define iscmd(c) ( ((c)>='0'&&(c)<='9') || ((c)>='A'&&(c)<='Z') || ((c)>='a'&&(c)<='z')) /* * Keyword comparison function. Like strcmp, but between a wchar_t * * and a char *. */ static int kwcmp(wchar_t const *p, char const *q) { int i; do { i = *p - *q; } while (*p++ && *q++ && !i); return i; } /* * Match a keyword. */ static void match_kw(token *tok) { /* * FIXME. The ids are explicit in here so as to allow long-name * equivalents to the various very short keywords. */ static const struct { char const *name; int id; } keywords[] = { {"#", c__comment}, /* comment command (\#) */ {"-", c__escaped}, /* nonbreaking hyphen */ {".", c__nop}, /* no-op */ {"A", c_A}, /* appendix heading */ {"B", c_B}, /* bibliography entry */ {"BR", c_BR}, /* bibliography rewrite */ {"C", c_C}, /* chapter heading */ {"H", c_H}, /* heading */ {"I", c_I}, /* invisible index mark */ {"IM", c_IM}, /* index merge/rewrite */ {"K", c_K}, /* capitalised cross-reference */ {"U", c_U}, /* unnumbered-chapter heading */ {"W", c_W}, /* Web hyperlink */ {"\\", c__escaped}, /* escaped backslash (\\) */ {"_", c__nbsp}, /* nonbreaking space (\_) */ {"b", c_b}, /* bulletted list */ {"c", c_c}, /* code */ {"cfg", c_cfg}, /* configuration directive */ {"copyright", c_copyright}, /* copyright statement */ {"cq", c_cq}, /* quoted code (sugar for \q{\cw{x}}) */ {"cw", c_cw}, /* weak code */ {"date", c_date}, /* document processing date */ {"dd", c_dd}, /* description list: description */ {"define", c_define}, /* macro definition */ {"dt", c_dt}, /* description list: described thing */ {"e", c_e}, /* emphasis */ {"i", c_i}, /* visible index mark */ {"ii", c_ii}, /* uncapitalised visible index mark */ {"k", c_k}, /* uncapitalised cross-reference */ {"lcont", c_lcont}, /* continuation para(s) for list item */ {"n", c_n}, /* numbered list */ {"nocite", c_nocite}, /* bibliography trickery */ {"preamble", c_preamble}, /* (obsolete) preamble text */ {"q", c_q}, /* quote marks */ {"quote", c_quote}, /* block-quoted paragraphs */ {"rule", c_rule}, /* horizontal rule */ {"s", c_s}, /* strong */ {"title", c_title}, /* document title */ {"versionid", c_versionid}, /* document RCS id */ {"{", c__escaped}, /* escaped lbrace (\{) */ {"}", c__escaped}, /* escaped rbrace (\}) */ }; int i, j, k, c; /* * Special cases: \S{0,1,2,...} and \uABCD. If the syntax * doesn't match correctly, we just fall through to the * binary-search phase. */ if (tok->text[0] == 'S') { /* We expect numeric characters thereafter. */ wchar_t *p = tok->text+1; int n; if (!*p) n = 1; else { n = 0; while (*p && isdec(*p)) { n = 10 * n + fromdec(*p); p++; } } if (!*p) { tok->cmd = c_S; tok->aux = n; return; } } else if (tok->text[0] == 'u') { /* We expect hex characters thereafter. */ wchar_t *p = tok->text+1; int n = 0; while (*p && ishex(*p)) { n = 16 * n + fromhex(*p); p++; } if (!*p) { tok->cmd = c_u; tok->aux = n; return; } } i = -1; j = sizeof(keywords)/sizeof(*keywords); while (j-i > 1) { k = (i+j)/2; c = kwcmp(tok->text, keywords[k].name); if (c < 0) j = k; else if (c > 0) i = k; else /* c == 0 */ { tok->cmd = keywords[k].id; return; } } tok->cmd = c__invalid; } /* * Read a token from the input file, in the normal way (`normal' in * the sense that code paragraphs work a different way). */ token get_token(input *in) { int c; int nls; int prevpos; token ret; rdstring rs = { 0, 0, NULL }; rdstringc rsc = { 0, 0, NULL }; filepos cpos; ret.text = NULL; /* default */ ret.origtext = NULL; /* default */ if (in->pushback_chars) { rdaddsc(&rsc, in->pushback_chars); sfree(in->pushback_chars); in->pushback_chars = NULL; } c = get(in, &cpos, &rsc); ret.pos = cpos; if (iswhite(c)) { /* tok_white or tok_eop */ nls = 0; prevpos = 0; do { if (isnl(c)) nls++; prevpos = rsc.pos; } while ((c = get(in, &cpos, &rsc)) != EOF && iswhite(c)); if (c == EOF) { ret.type = tok_eof; sfree(rsc.text); return ret; } if (rsc.text) { in->pushback_chars = dupstr(rsc.text + prevpos); sfree(rsc.text); } unget(in, c, &cpos); ret.type = (nls > 1 ? tok_eop : tok_white); return ret; } else if (c == EOF) { /* tok_eof */ ret.type = tok_eof; sfree(rsc.text); return ret; } else if (c == '\\') { /* tok_cmd */ rsc.pos = prevpos = 0; c = get(in, &cpos, &rsc); if (c == '-' || c == '\\' || c == '_' || c == '#' || c == '{' || c == '}' || c == '.') { /* single-char command */ rdadd(&rs, c); prevpos = rsc.pos; } else if (c == 'u') { int len = 0; do { rdadd(&rs, c); len++; prevpos = rsc.pos; c = get(in, &cpos, &rsc); } while (ishex(c) && len < 5); unget(in, c, &cpos); } else if (iscmd(c)) { do { rdadd(&rs, c); prevpos = rsc.pos; c = get(in, &cpos, &rsc); } while (iscmd(c)); unget(in, c, &cpos); } /* * Now match the command against the list of available * ones. */ ret.type = tok_cmd; ret.text = ustrdup(rs.text); if (rsc.text) { in->pushback_chars = dupstr(rsc.text + prevpos); rsc.text[prevpos] = '\0'; ret.origtext = dupstr(rsc.text); } else { ret.origtext = dupstr(""); } match_kw(&ret); sfree(rs.text); sfree(rsc.text); return ret; } else if (c == '{') { /* tok_lbrace */ ret.type = tok_lbrace; sfree(rsc.text); return ret; } else if (c == '}') { /* tok_rbrace */ ret.type = tok_rbrace; sfree(rsc.text); return ret; } else { /* tok_word */ /* * Read a word: the longest possible contiguous sequence of * things other than whitespace, backslash, braces and * hyphen. A hyphen terminates the word but is returned as * part of it; everything else is pushed back for the next * token. The `aux' field contains TRUE if the word ends in * a hyphen. */ ret.aux = FALSE; /* assumed for now */ prevpos = 0; while (1) { if (iswhite(c) || c=='{' || c=='}' || c=='\\' || c==EOF) { /* Put back the character that caused termination */ unget(in, c, &cpos); break; } else { rdadd(&rs, c); if (c == '-') { prevpos = rsc.pos; ret.aux = TRUE; break; /* hyphen terminates word */ } } prevpos = rsc.pos; c = get(in, &cpos, &rsc); } ret.type = tok_word; ret.text = ustrdup(rs.text); if (rsc.text) { in->pushback_chars = dupstr(rsc.text + prevpos); rsc.text[prevpos] = '\0'; ret.origtext = dupstr(rsc.text); } else { ret.origtext = dupstr(""); } sfree(rs.text); sfree(rsc.text); return ret; } } /* * Determine whether the next input character is an open brace (for * telling code paragraphs from paragraphs which merely start with * code). */ int isbrace(input *in) { int c; filepos cpos; c = get(in, &cpos, NULL); unget(in, c, &cpos); return (c == '{'); } /* * Read the rest of a line that starts `\c'. Including nothing at * all (tok_word with empty text). */ token get_codepar_token(input *in) { int c; token ret; rdstring rs = { 0, 0, NULL }; filepos cpos; ret.type = tok_word; ret.origtext = NULL; c = get(in, &cpos, NULL); /* expect (and discard) one space */ ret.pos = cpos; if (c == ' ') { c = get(in, &cpos, NULL); ret.pos = cpos; } while (!isnl(c) && c != EOF) { int c2 = c; c = get(in, &cpos, NULL); /* Discard \r just before \n. */ if (c2 != 13 || !isnl(c)) rdadd(&rs, c2); } unget(in, c, &cpos); ret.text = ustrdup(rs.text); sfree(rs.text); return ret; } /* * Adds a new word to a linked list */ static word *addword(word newword, word ***hptrptr) { word *mnewword; if (!hptrptr) return NULL; mnewword = snew(word); *mnewword = newword; /* structure copy */ mnewword->next = NULL; **hptrptr = mnewword; *hptrptr = &mnewword->next; return mnewword; } /* * Adds a new paragraph to a linked list */ static paragraph *addpara(paragraph newpara, paragraph ***hptrptr) { paragraph *mnewpara = snew(paragraph); *mnewpara = newpara; /* structure copy */ mnewpara->next = NULL; **hptrptr = mnewpara; *hptrptr = &mnewpara->next; return mnewpara; } /* * Destructor before token is reassigned; should catch most memory * leaks */ #define dtor(t) ( sfree(t.text), sfree(t.origtext) ) /* * Reads a single file (ie until get() returns EOF) */ static void read_file(paragraph ***ret, input *in, indexdata *idx, tree234 *macros) { token t; paragraph par; word wd, **whptr, **idximplicit; wchar_t utext[2], *wdtext; int style, spcstyle; int already; int iswhite, seenwhite; int type; int prev_para_type; struct stack_item { enum { stack_nop = 0, /* do nothing (for error recovery) */ stack_ualt = 1, /* \u alternative */ stack_style = 2, /* \e, \c, \cw */ stack_idx = 4, /* \I, \i, \ii */ stack_hyper = 8, /* \W */ stack_quote = 16 /* \q */ } type; word **whptr; /* to restore from \u alternatives */ word **idximplicit; /* to restore from \u alternatives */ filepos fpos; int in_code; } *sitem; stack parsestk; struct crossparaitem { int type; /* currently c_lcont, c_quote or -1 */ int seen_lcont, seen_quote; }; stack crossparastk; word *indexword, *uword, *iword; word *idxwordlist; rdstring indexstr; int index_downcase, index_visible, indexing; const rdstring nullrs = { 0, 0, NULL }; wchar_t uchr; t.text = NULL; t.origtext = NULL; already = FALSE; crossparastk = stk_new(); /* * Loop on each paragraph. */ while (1) { int start_cmd = c__invalid; par.words = NULL; par.keyword = NULL; par.origkeyword = NULL; whptr = &par.words; /* * Get a token. */ do { if (!already) { dtor(t), t = get_token(in); } already = FALSE; } while (t.type == tok_eop); if (t.type == tok_eof) break; /* * Parse code paragraphs separately. */ if (t.type == tok_cmd && t.cmd == c_c && !isbrace(in)) { int wtype = word_WeakCode; par.type = para_Code; par.fpos = t.pos; while (1) { dtor(t), t = get_codepar_token(in); wd.type = wtype; wd.breaks = FALSE; /* shouldn't need this... */ wd.text = ustrdup(t.text); wd.alt = NULL; wd.fpos = t.pos; addword(wd, &whptr); dtor(t), t = get_token(in); if (t.type == tok_white) { /* * The newline after a code-paragraph line */ dtor(t), t = get_token(in); } if (t.type == tok_eop || t.type == tok_eof || t.type == tok_rbrace) { /* might be } terminating \lcont */ if (t.type == tok_rbrace) already = TRUE; break; } else if (t.type == tok_cmd && t.cmd == c_c) { wtype = word_WeakCode; } else if (t.type == tok_cmd && t.cmd == c_e && wtype == word_WeakCode) { wtype = word_Emph; } else if (t.type == tok_cmd && t.cmd == c_s && wtype == word_WeakCode) { wtype = word_Strong; } else { err_brokencodepara(&t.pos); prev_para_type = par.type; addpara(par, ret); while (t.type != tok_eop) /* error recovery: */ dtor(t), t = get_token(in); /* eat rest of paragraph */ goto codeparabroken; /* ick, but such is life */ } } prev_para_type = par.type; addpara(par, ret); codeparabroken: continue; } /* * Spot the special commands that define a grouping of more * than one paragraph, and also the closing braces that * finish them. */ if (t.type == tok_cmd && (t.cmd == c_lcont || t.cmd == c_quote)) { struct crossparaitem *sitem, *stop; int cmd = t.cmd; /* * Expect, and swallow, an open brace. */ dtor(t), t = get_token(in); if (t.type != tok_lbrace) { err_explbr(&t.pos); continue; } /* * Also expect, and swallow, any whitespace after that * (a newline before a code paragraph wouldn't be * surprising). */ do { dtor(t), t = get_token(in); } while (t.type == tok_white); already = TRUE; if (cmd == c_lcont) { /* * \lcont causes a continuation of a list item into * multiple paragraphs (which may in turn contain * nested lists, code paras etc). Hence, the previous * paragraph must be of a list type. */ sitem = snew(struct crossparaitem); stop = (struct crossparaitem *)stk_top(crossparastk); if (stop) *sitem = *stop; else sitem->seen_quote = sitem->seen_lcont = 0; if (prev_para_type == para_Bullet || prev_para_type == para_NumberedList || prev_para_type == para_Description) { sitem->type = c_lcont; sitem->seen_lcont = 1; par.type = para_LcontPush; prev_para_type = par.type; addpara(par, ret); } else { /* * Push a null item on the cross-para stack so that * when we see the corresponding closing brace we * don't give a cascade error. */ sitem->type = -1; err_misplacedlcont(&t.pos); } } else { /* * \quote causes a group of paragraphs to be * block-quoted (typically they will be indented a * bit). */ sitem = snew(struct crossparaitem); stop = (struct crossparaitem *)stk_top(crossparastk); if (stop) *sitem = *stop; else sitem->seen_quote = sitem->seen_lcont = 0; sitem->type = c_quote; sitem->seen_quote = 1; par.type = para_QuotePush; prev_para_type = par.type; addpara(par, ret); } stk_push(crossparastk, sitem); continue; } else if (t.type == tok_rbrace) { struct crossparaitem *sitem = stk_pop(crossparastk); if (!sitem) err_unexbrace(&t.pos); else { switch (sitem->type) { case c_lcont: par.type = para_LcontPop; prev_para_type = par.type; addpara(par, ret); break; case c_quote: par.type = para_QuotePop; prev_para_type = par.type; addpara(par, ret); break; } sfree(sitem); } continue; } while (t.type == tok_cmd && macrolookup(macros, in, t.text, &t.pos)) { dtor(t), t = get_token(in); } /* * This token begins a paragraph. See if it's one of the * special commands that define a paragraph type. * * (note that \# is special in a way, and \nocite takes no * text) */ par.type = para_Normal; if (t.type == tok_cmd) { int needkw; int is_macro = FALSE; par.fpos = t.pos; switch (t.cmd) { default: needkw = -1; break; case c__invalid: err_badparatype(t.text, &t.pos); needkw = 4; break; case c__comment: if (isbrace(in)) { needkw = -1; break; /* `\#{': isn't a comment para */ } do { dtor(t), t = get_token(in); } while (t.type != tok_eop && t.type != tok_eof); continue; /* next paragraph */ /* * `needkw' values: * * 1 -- exactly one keyword * 2 -- at least one keyword * 4 -- any number of keywords including zero * 8 -- at least one keyword and then nothing else * 16 -- nothing at all! no keywords, no body * 32 -- no keywords at all */ case c_A: needkw = 2; par.type = para_Appendix; break; case c_B: needkw = 2; par.type = para_Biblio; break; case c_BR: needkw = 1; par.type = para_BR; start_cmd = c_BR; break; case c_C: needkw = 2; par.type = para_Chapter; break; case c_H: needkw = 2; par.type = para_Heading; par.aux = 0; break; case c_IM: needkw = 2; par.type = para_IM; start_cmd = c_IM; break; case c_S: needkw = 2; par.type = para_Subsect; par.aux = t.aux; break; case c_U: needkw = 32; par.type = para_UnnumberedChapter; break; /* For \b and \n the keyword is optional */ case c_b: needkw = 4; par.type = para_Bullet; break; case c_dt: needkw = 4; par.type = para_DescribedThing; break; case c_dd: needkw = 4; par.type = para_Description; break; case c_n: needkw = 4; par.type = para_NumberedList; break; case c_cfg: needkw = 8; par.type = para_Config; start_cmd = c_cfg; break; case c_copyright: needkw = 32; par.type = para_Copyright; break; case c_define: is_macro = TRUE; needkw = 1; break; /* For \nocite the keyword is _everything_ */ case c_nocite: needkw = 8; par.type = para_NoCite; break; case c_preamble: needkw = 32; par.type = para_Normal; break; case c_rule: needkw = 16; par.type = para_Rule; break; case c_title: needkw = 32; par.type = para_Title; break; case c_versionid: needkw = 32; par.type = para_VersionID; break; } if (par.type == para_Chapter || par.type == para_Heading || par.type == para_Subsect || par.type == para_Appendix || par.type == para_UnnumberedChapter) { struct crossparaitem *sitem = stk_top(crossparastk); if (sitem && (sitem->seen_lcont || sitem->seen_quote)) { err_sectmarkerinblock( &t.pos, (sitem->seen_lcont ? "lcont" : "quote")); } } if (needkw > 0) { rdstring rs = { 0, 0, NULL }; rdstringc rsc = { 0, 0, NULL }; int nkeys = 0; filepos fp; /* Get keywords. */ dtor(t), t = get_token(in); fp = t.pos; while (t.type == tok_lbrace || (t.type == tok_white && (needkw & 24))) { /* * In paragraph types which can't accept any * body text (such as \cfg), we are lenient * about whitespace between keywords. This is * important for \cfg in particular since it * can often have many keywords which are long * pieces of text, so it's useful to permit the * user to wrap the line between them. */ if (t.type == tok_white) { dtor(t), t = get_token(in); /* eat the space */ continue; } /* This is a keyword. */ nkeys++; /* FIXME: there will be bugs if anyone specifies an * empty keyword (\foo{}), so trap this case. */ while (dtor(t), t = get_token(in), t.type == tok_word || t.type == tok_white || (t.type == tok_cmd && t.cmd == c__nbsp) || (t.type == tok_cmd && t.cmd == c__escaped) || (t.type == tok_cmd && t.cmd == c_u)) { if (t.type == tok_white || (t.type == tok_cmd && t.cmd == c__nbsp)) { rdadd(&rs, ' '); rdaddc(&rsc, ' '); } else if (t.type == tok_cmd && t.cmd == c_u) { rdadd(&rs, t.aux); rdaddc(&rsc, '\\'); rdaddsc(&rsc, t.origtext); } else { rdadds(&rs, t.text); rdaddsc(&rsc, t.origtext); } } if (t.type != tok_rbrace) { err_kwunclosed(&t.pos); continue; } rdadd(&rs, 0); /* add string terminator */ rdaddc(&rsc, 0); /* add string terminator */ dtor(t), t = get_token(in); /* eat right brace */ } rdadd(&rs, 0); /* add string terminator */ rdaddc(&rsc, 0); /* add string terminator */ /* See whether we have the right number of keywords. */ if ((needkw & 48) && nkeys > 0) err_kwillegal(&fp); if ((needkw & 11) && nkeys == 0) err_kwexpected(&fp); if ((needkw & 5) && nkeys > 1) err_kwtoomany(&fp); if (is_macro) { /* * Macro definition. Get the rest of the line * as a code-paragraph token, repeatedly until * there's nothing more left of it. Separate * with newlines. */ rdstring macrotext = { 0, 0, NULL }; while (1) { dtor(t), t = get_codepar_token(in); if (macrotext.pos > 0) rdadd(¯otext, L'\n'); rdadds(¯otext, t.text); dtor(t), t = get_token(in); if (t.type == tok_eop || t.type == tok_eof) break; } macrodef(macros, rs.text, macrotext.text, fp); continue; /* next paragraph */ } par.keyword = rdtrim(&rs); par.origkeyword = rdtrimc(&rsc); /* Move to EOP in case of needkw==8 or 16 (no body) */ if (needkw & 24) { /* We allow whitespace even when we expect no para body */ while (t.type == tok_white) dtor(t), t = get_token(in); if (t.type != tok_eop && t.type != tok_eof && (start_cmd == c__invalid || t.type != tok_cmd || t.cmd != start_cmd)) { err_bodyillegal(&t.pos); /* Error recovery: eat the rest of the paragraph */ while (t.type != tok_eop && t.type != tok_eof && (start_cmd == c__invalid || t.type != tok_cmd || t.cmd != start_cmd)) dtor(t), t = get_token(in); } if (t.type == tok_cmd) already = TRUE;/* inhibit get_token at top of loop */ prev_para_type = par.type; addpara(par, ret); if (par.type == para_Config) { input_configure(in, &par); } continue; /* next paragraph */ } } } /* * Now read the actual paragraph, word by word, adding to * the paragraph list. * * Mid-paragraph commands: * * \K \k * \c \cw \cq * \e * \i \ii * \I * \q * \u * \W * \date * \\ \{ \} */ parsestk = stk_new(); style = word_Normal; spcstyle = word_WhiteSpace; indexing = FALSE; seenwhite = TRUE; while (t.type != tok_eop && t.type != tok_eof) { iswhite = FALSE; already = FALSE; /* Handle implicit paragraph breaks after \IM, \BR etc */ if (start_cmd != c__invalid && t.type == tok_cmd && t.cmd == start_cmd) { already = TRUE; /* inhibit get_token at top of loop */ break; } if (t.type == tok_cmd && t.cmd == c__nop) { dtor(t), t = get_token(in); continue; /* do nothing! */ } if (t.type == tok_cmd && t.cmd == c__escaped) { t.type = tok_word; /* nice and simple */ t.aux = 0; /* even if `\-' - nonbreaking! */ } if (t.type == tok_cmd && t.cmd == c__nbsp) { t.type = tok_word; /* nice and simple */ sfree(t.text); t.text = ustrdup(L" "); /* text is ` ' not `_' */ t.aux = 0; /* (nonbreaking) */ } switch (t.type) { case tok_white: if (whptr == &par.words) break; /* strip whitespace at start of para */ wd.text = NULL; wd.type = spcstyle; wd.alt = NULL; wd.aux = 0; wd.fpos = t.pos; wd.breaks = FALSE; /* * Inhibit use of whitespace if it's (probably the * newline) before a repeat \IM / \BR type * directive. */ if (start_cmd != c__invalid) { dtor(t), t = get_token(in); already = TRUE; if (t.type == tok_cmd && t.cmd == start_cmd) break; } if (indexing) rdadd(&indexstr, ' '); if (!indexing || index_visible) addword(wd, &whptr); if (indexing) addword(wd, &idximplicit); iswhite = TRUE; break; case tok_word: if (indexing) rdadds(&indexstr, t.text); wd.type = style; wd.alt = NULL; wd.aux = 0; wd.fpos = t.pos; wd.breaks = t.aux; if (!indexing || index_visible) { wd.text = ustrdup(t.text); addword(wd, &whptr); } if (indexing) { wd.text = ustrdup(t.text); addword(wd, &idximplicit); } break; case tok_lbrace: err_unexbrace(&t.pos); /* Error recovery: push nop */ sitem = snew(struct stack_item); sitem->type = stack_nop; sitem->fpos = t.pos; stk_push(parsestk, sitem); break; case tok_rbrace: sitem = stk_pop(parsestk); if (!sitem) { /* * This closing brace could have been an * indication that the cross-paragraph stack * wants popping. Accordingly, we treat it here * as an indication that the paragraph is over. */ already = TRUE; goto finished_para; } else { if (sitem->type & stack_ualt) { whptr = sitem->whptr; idximplicit = sitem->idximplicit; } if (sitem->type & stack_style) { style = word_Normal; spcstyle = word_WhiteSpace; } if (sitem->type & stack_idx) { indexword->text = ustrdup(indexstr.text); if (index_downcase) { word *w; ustrlow(indexword->text); ustrlow(indexstr.text); for (w = idxwordlist; w; w = w->next) if (w->text) ustrlow(w->text); } indexing = FALSE; rdadd(&indexstr, L'\0'); index_merge(idx, FALSE, indexstr.text, idxwordlist, &sitem->fpos); sfree(indexstr.text); } if (sitem->type & stack_hyper) { wd.text = NULL; wd.type = word_HyperEnd; wd.alt = NULL; wd.aux = 0; wd.fpos = t.pos; wd.breaks = FALSE; if (!indexing || index_visible) addword(wd, &whptr); if (indexing) addword(wd, &idximplicit); } if (sitem->type & stack_quote) { wd.text = NULL; wd.type = toquotestyle(style); wd.alt = NULL; wd.aux = quote_Close; wd.fpos = t.pos; wd.breaks = FALSE; if (!indexing || index_visible) addword(wd, &whptr); if (indexing) { rdadd(&indexstr, L'"'); addword(wd, &idximplicit); } } } sfree(sitem); break; case tok_cmd: switch (t.cmd) { case c__comment: /* * In-paragraph comment: \#{ balanced braces } * * Anything goes here; even tok_eop. We should * eat whitespace after the close brace _if_ * there was whitespace before the \#. */ dtor(t), t = get_token(in); if (t.type != tok_lbrace) { err_explbr(&t.pos); } else { int braces = 1; while (braces > 0) { dtor(t), t = get_token(in); if (t.type == tok_lbrace) braces++; else if (t.type == tok_rbrace) braces--; else if (t.type == tok_eof) { err_commenteof(&t.pos); break; } } } if (seenwhite) { already = TRUE; dtor(t), t = get_token(in); if (t.type == tok_white) { iswhite = TRUE; already = FALSE; } } break; case c_q: case c_cq: type = t.cmd; dtor(t), t = get_token(in); if (t.type != tok_lbrace) { err_explbr(&t.pos); } else { /* * Enforce that \q may not be used anywhere * within \c. (It shouldn't be necessary * since the whole point of \c should be * that the user wants to exercise exact * control over the glyphs used, and * forbidding it has the useful effect of * relieving some backends of having to * make difficult decisions.) */ int stype; if (style != word_Code && style != word_WeakCode) { wd.text = NULL; wd.type = toquotestyle(style); wd.alt = NULL; wd.aux = quote_Open; wd.fpos = t.pos; wd.breaks = FALSE; if (!indexing || index_visible) addword(wd, &whptr); if (indexing) { rdadd(&indexstr, L'"'); addword(wd, &idximplicit); } stype = stack_quote; } else { err_codequote(&t.pos); stype = stack_nop; } sitem = snew(struct stack_item); sitem->fpos = t.pos; sitem->type = stype; if (type == c_cq) { if (style != word_Normal) { err_nestedstyles(&t.pos); } else { style = word_WeakCode; spcstyle = tospacestyle(style); sitem->type |= stack_style; } } stk_push(parsestk, sitem); } break; case c_K: case c_k: case c_W: case c_date: /* * Keyword, hyperlink, or \date. We expect a * left brace, some text, and then a right * brace. No nesting; no arguments. */ wd.fpos = t.pos; wd.breaks = FALSE; if (t.cmd == c_K) wd.type = word_UpperXref; else if (t.cmd == c_k) wd.type = word_LowerXref; else if (t.cmd == c_W) wd.type = word_HyperLink; else wd.type = word_Normal; dtor(t), t = get_token(in); if (t.type != tok_lbrace) { if (wd.type == word_Normal) { time_t thetime = time(NULL); struct tm *broken = localtime(&thetime); already = TRUE; wdtext = ustrftime(NULL, broken); wd.type = style; } else { err_explbr(&t.pos); wdtext = NULL; } } else { rdstring rs = { 0, 0, NULL }; while (dtor(t), t = get_token(in), t.type == tok_word || t.type == tok_white) { if (t.type == tok_white) rdadd(&rs, ' '); else rdadds(&rs, t.text); } if (wd.type == word_Normal) { time_t thetime = time(NULL); struct tm *broken = localtime(&thetime); wdtext = ustrftime(rs.text, broken); wd.type = style; } else { wdtext = ustrdup(rs.text); } sfree(rs.text); if (t.type != tok_rbrace) { err_kwexprbr(&t.pos); } } wd.alt = NULL; wd.aux = 0; if (!indexing || index_visible) { wd.text = ustrdup(wdtext); addword(wd, &whptr); } if (indexing) { wd.text = ustrdup(wdtext); addword(wd, &idximplicit); } sfree(wdtext); if (wd.type == word_HyperLink) { /* * Hyperlinks are different: they then * expect another left brace, to begin * delimiting the text marked by the link. */ dtor(t), t = get_token(in); sitem = snew(struct stack_item); sitem->fpos = wd.fpos; sitem->type = stack_hyper; /* * Special cases: \W{}\i, \W{}\ii */ if (t.type == tok_cmd && (t.cmd == c_i || t.cmd == c_ii)) { if (indexing) { err_nestedindex(&t.pos); } else { /* Add an index-reference word with no * text as yet */ wd.type = word_IndexRef; wd.text = NULL; wd.alt = NULL; wd.aux = 0; wd.breaks = FALSE; indexword = addword(wd, &whptr); /* Set up a rdstring to read the * index text */ indexstr = nullrs; /* Flags so that we do the Right * Things with text */ index_visible = (type != c_I); index_downcase = (type == c_ii); indexing = TRUE; idxwordlist = NULL; idximplicit = &idxwordlist; sitem->type |= stack_idx; } dtor(t), t = get_token(in); } /* * Special cases: \W{}\c, \W{}\e, \W{}\s, \W{}\cw */ if (t.type == tok_cmd && (t.cmd == c_e || t.cmd == c_s || t.cmd == c_c || t.cmd == c_cw)) { if (style != word_Normal) err_nestedstyles(&t.pos); else { style = (t.cmd == c_c ? word_Code : t.cmd == c_cw ? word_WeakCode : t.cmd == c_s ? word_Strong : word_Emph); spcstyle = tospacestyle(style); sitem->type |= stack_style; } dtor(t), t = get_token(in); } if (t.type != tok_lbrace) { err_explbr(&t.pos); sfree(sitem); } else { stk_push(parsestk, sitem); } } break; case c_c: case c_cw: case c_e: case c_s: type = t.cmd; if (style != word_Normal) { err_nestedstyles(&t.pos); /* Error recovery: eat lbrace, push nop. */ dtor(t), t = get_token(in); sitem = snew(struct stack_item); sitem->fpos = t.pos; sitem->type = stack_nop; stk_push(parsestk, sitem); } dtor(t), t = get_token(in); if (t.type != tok_lbrace) { err_explbr(&t.pos); } else { style = (type == c_c ? word_Code : type == c_cw ? word_WeakCode : type == c_s ? word_Strong : word_Emph); spcstyle = tospacestyle(style); sitem = snew(struct stack_item); sitem->fpos = t.pos; sitem->type = stack_style; stk_push(parsestk, sitem); } break; case c_i: case c_ii: case c_I: type = t.cmd; if (indexing) { err_nestedindex(&t.pos); /* Error recovery: eat lbrace, push nop. */ dtor(t), t = get_token(in); sitem = snew(struct stack_item); sitem->fpos = t.pos; sitem->type = stack_nop; stk_push(parsestk, sitem); } sitem = snew(struct stack_item); sitem->fpos = t.pos; sitem->type = stack_idx; dtor(t), t = get_token(in); /* * Special cases: \i\c, \i\e, \i\s, \i\cw */ wd.fpos = t.pos; if (t.type == tok_cmd && (t.cmd == c_e || t.cmd == c_s || t.cmd == c_c || t.cmd == c_cw)) { if (style != word_Normal) err_nestedstyles(&t.pos); else { style = (t.cmd == c_c ? word_Code : t.cmd == c_cw ? word_WeakCode : t.cmd == c_s ? word_Strong : word_Emph); spcstyle = tospacestyle(style); sitem->type |= stack_style; } dtor(t), t = get_token(in); } if (t.type != tok_lbrace) { sfree(sitem); err_explbr(&t.pos); } else { /* Add an index-reference word with no text as yet */ wd.type = word_IndexRef; wd.text = NULL; wd.alt = NULL; wd.aux = 0; wd.breaks = FALSE; indexword = addword(wd, &whptr); /* Set up a rdstring to read the index text */ indexstr = nullrs; /* Flags so that we do the Right Things with text */ index_visible = (type != c_I); index_downcase = (type == c_ii); indexing = TRUE; idxwordlist = NULL; idximplicit = &idxwordlist; /* Stack item to close the indexing on exit */ stk_push(parsestk, sitem); } break; case c_u: uchr = t.aux; utext[0] = uchr; utext[1] = 0; wd.type = style; wd.breaks = FALSE; wd.alt = NULL; wd.aux = 0; wd.fpos = t.pos; if (!indexing || index_visible) { wd.text = ustrdup(utext); uword = addword(wd, &whptr); } else uword = NULL; if (indexing) { wd.text = ustrdup(utext); iword = addword(wd, &idximplicit); } else iword = NULL; dtor(t), t = get_token(in); if (t.type == tok_lbrace) { /* * \u with a left brace. Until the brace * closes, all further words go on a * sidetrack from the main thread of the * paragraph. */ sitem = snew(struct stack_item); sitem->fpos = t.pos; sitem->type = stack_ualt; sitem->whptr = whptr; sitem->idximplicit = idximplicit; stk_push(parsestk, sitem); whptr = uword ? &uword->alt : NULL; idximplicit = iword ? &iword->alt : NULL; } else { if (indexing) rdadd(&indexstr, uchr); already = TRUE; } break; default: if (!macrolookup(macros, in, t.text, &t.pos)) err_badmidcmd(t.text, &t.pos); break; } } if (!already) dtor(t), t = get_token(in); seenwhite = iswhite; } finished_para: /* Check the stack is empty */ if (stk_top(parsestk)) { while ((sitem = stk_pop(parsestk))) sfree(sitem); err_missingrbrace(&t.pos); } stk_free(parsestk); prev_para_type = par.type; /* * Before we add the paragraph to the output list, we * should check that there was any text in it at all; there * might not be if (for example) the paragraph contained * nothing but an unrecognised command sequence, and if we * put an empty paragraph on the list it may confuse the * back ends later on. */ if (par.words) { addpara(par, ret); } if (t.type == tok_eof) already = TRUE; } if (stk_top(crossparastk)) { void *p; err_missingrbrace2(&t.pos); while ((p = stk_pop(crossparastk))) sfree(p); } /* * We break to here rather than returning, because otherwise * this cleanup doesn't happen. */ dtor(t); stk_free(crossparastk); } struct { char const *magic; size_t nmagic; int binary; void (*reader)(input *); } magics[] = { { "%!FontType1-", 12, FALSE, &read_pfa_file }, { "%!PS-AdobeFont-", 15, FALSE, &read_pfa_file }, { "\x80\x01", 2, TRUE, &read_pfb_file }, { "StartFontMetrics", 16, FALSE, &read_afm_file }, { "\x00\x01\x00\x00", 4, TRUE, &read_sfnt_file }, { "true", 4, TRUE, &read_sfnt_file }, }; paragraph *read_input(input *in, indexdata *idx) { paragraph *head = NULL; paragraph **hptr = &head; tree234 *macros; char mag[16]; size_t len, i; int binary; void (*reader)(input *); macros = newtree234(macrocmp); while (in->currindex < in->nfiles) { setpos(in, in->filenames[in->currindex]); in->charset = in->defcharset; in->csstate = charset_init_state; in->wcpos = in->nwc = 0; in->pushback_chars = NULL; if (!in->filenames[in->currindex]) { in->currfp = stdin; in->wantclose = FALSE; /* don't fclose stdin */ /* * When reading standard input, we always expect to see * an actual Halibut file and not any of the unusual * input types like fonts. */ reader = NULL; } else { /* * Open the file in binary mode to look for magic * numbers. We'll switch to text mode if we find we're * looking at a text file type. */ in->currfp = fopen(in->filenames[in->currindex], "rb"); binary = FALSE; /* default to Halibut source, which is text */ if (in->currfp) { in->wantclose = TRUE; reader = NULL; len = fread(mag, 1, sizeof(mag), in->currfp); for (i = 0; i < lenof(magics); i++) { if (len >= magics[i].nmagic && memcmp(mag, magics[i].magic, magics[i].nmagic) == 0) { reader = magics[i].reader; binary = magics[i].binary; break; } } rewind(in->currfp); } if (!binary) { if (in->currfp) fclose(in->currfp); in->currfp = fopen(in->filenames[in->currindex], "r"); } } if (in->currfp) { if (reader == NULL) { read_file(&hptr, in, idx, macros); } else { (*reader)(in); } } else { err_cantopen(in->filenames[in->currindex]); } in->currindex++; } macrocleanup(macros); return head; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/keywords.c������������������������������������������������������������������������������0000644�0001753�0001753�00000007045�12444773746�011775� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * keywords.c: keep track of all cross-reference keywords */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "halibut.h" static int kwcmp(void *av, void *bv) { const keyword *a = (const keyword *)av; const keyword *b = (const keyword *)bv; return ustrcmp(a->key, b->key); } static int kwfind(void *av, void *bv) { wchar_t *a = (wchar_t *)av; const keyword *b = (const keyword *)bv; return ustrcmp(a, b->key); } keyword *kw_lookup(keywordlist *kl, wchar_t *str) { return find234(kl->keys, str, kwfind); } /* * This function reads through source form and collects the * keywords. They get collected in a heap, sorted by Unicode * collation, last at the top (so that we can Heapsort them when we * finish). */ keywordlist *get_keywords(paragraph *source) { int errors = FALSE; keywordlist *kl = snew(keywordlist); numberstate *n = number_init(); int prevpara = para_NotParaType; number_cfg(n, source); kl->size = 0; kl->keys = newtree234(kwcmp); kl->nlooseends = kl->looseendssize = 0; kl->looseends = NULL; for (; source; source = source->next) { wchar_t *p, *q; p = q = source->keyword; /* * Look for the section type override (`example', * `question' or whatever - to replace `chapter' or * `section' on a per-section basis). */ if (q) { q = uadv(q); /* point q at the word beyond */ if (!*q) q = NULL; } /* * Number the chapter / section / list-item / whatever. * This also sets up the `parent', `child' and `sibling' * links. */ source->kwtext = number_mktext(n, source, q, &prevpara, &errors); if (p && *p) { if (source->kwtext || source->type == para_Biblio) { keyword *kw, *ret; kw = snew(keyword); kw->key = p; kw->text = source->kwtext; kw->para = source; ret = add234(kl->keys, kw); if (ret != kw) { err_multikw(&source->fpos, &ret->para->fpos, p); sfree(kw); /* FIXME: what happens to kw->text? Does it leak? */ } } } else { if (kl->nlooseends >= kl->looseendssize) { kl->looseendssize = kl->nlooseends + 32; kl->looseends = sresize(kl->looseends, kl->looseendssize, word *); } kl->looseends[kl->nlooseends++] = source->kwtext; } } number_free(n); if (errors) { free_keywords(kl); return NULL; } return kl; } void free_keywords(keywordlist *kl) { keyword *kw; while (kl->nlooseends) free_word_list(kl->looseends[--kl->nlooseends]); sfree(kl->looseends); while ( (kw = index234(kl->keys, 0)) != NULL) { delpos234(kl->keys, 0); free_word_list(kw->text); sfree(kw); } freetree234(kl->keys); sfree(kl); } void subst_keywords(paragraph *source, keywordlist *kl) { for (; source; source = source->next) { word *ptr; for (ptr = source->words; ptr; ptr = ptr->next) { if (ptr->type == word_UpperXref || ptr->type == word_LowerXref) { keyword *kw; word **endptr, *close, *subst; kw = kw_lookup(kl, ptr->text); if (!kw) { err_nosuchkw(&ptr->fpos, ptr->text); subst = NULL; } else subst = dup_word_list(kw->text); if (subst && ptr->type == word_LowerXref && kw->para->type != para_Biblio && kw->para->type != para_BiblioCited) ustrlow(subst->text); close = snew(word); close->text = NULL; close->alt = NULL; close->type = word_XrefEnd; close->fpos = ptr->fpos; close->next = ptr->next; ptr->next = subst; for (endptr = &ptr->next; *endptr; endptr = &(*endptr)->next) (*endptr)->fpos = ptr->fpos; *endptr = close; ptr = close; } } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/licence.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000004416�12444773746�011527� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * licence.c: licence text */ #include <stdio.h> static const char *const licencetext[] = { "Halibut is copyright (c) 1999-2007 Simon Tatham.", "", "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.", "", "Halibut contains font metrics derived from the \"Font Metrics for PDF", "Core 14 Fonts\", which carry the following copyright notice and licence:", "", " Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1993, 1997", " Adobe Systems Incorporated. All Rights Reserved.", "", " This file and the 14 PostScript(R) AFM files it accompanies may be", " used, copied, and distributed for any purpose and without charge,", " with or without modification, provided that all copyright notices", " are retained; that the AFM files are not distributed without this", " file; that all modifications to this file or any of the AFM files", " are prominently noted in the modified file(s); and that this", " paragraph is not modified. Adobe Systems has no responsibility or", " obligation to support the use of the AFM files.", NULL }; void licence(void) { const char *const *p; for (p = licencetext; *p; p++) puts(*p); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/main.c����������������������������������������������������������������������������������0000644�0001753�0001753�00000024153�12444773746�011051� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * main.c: command line parsing and top level */ #include <assert.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> #include "halibut.h" static void dbg_prtsource(paragraph *sourceform); static void dbg_prtwordlist(int level, word *w); static void dbg_prtkws(keywordlist *kws); static const struct pre_backend { void *(*func)(paragraph *, keywordlist *, indexdata *); int bitfield; } pre_backends[] = { {paper_pre_backend, 0x0001} }; static const struct backend { char *name; void (*func)(paragraph *, keywordlist *, indexdata *, void *); paragraph *(*filename)(char *filename); int bitfield, prebackend_bitfield; } backends[] = { {"text", text_backend, text_config_filename, 0x0001, 0}, {"xhtml", html_backend, html_config_filename, 0x0002, 0}, {"html", html_backend, html_config_filename, 0x0002, 0}, {"hlp", whlp_backend, whlp_config_filename, 0x0004, 0}, {"whlp", whlp_backend, whlp_config_filename, 0x0004, 0}, {"winhelp", whlp_backend, whlp_config_filename, 0x0004, 0}, {"man", man_backend, man_config_filename, 0x0008, 0}, {"info", info_backend, info_config_filename, 0x0010, 0}, {"ps", ps_backend, ps_config_filename, 0x0020, 0x0001}, {"pdf", pdf_backend, pdf_config_filename, 0x0040, 0x0001}, }; int main(int argc, char **argv) { char **infiles; int nfiles; int nogo; int errs; int reportcols; int list_fonts; int input_charset; int debug; int backendbits, prebackbits; int k, b; paragraph *cfg, *cfg_tail; void *pre_backend_data[16]; /* * Use the specified locale everywhere. It'll be used for * output of error messages, and as the default character set * for input files if one is not explicitly specified. * * However, we need to use standard numeric formatting for * output of things like PDF. */ setlocale(LC_ALL, ""); setlocale(LC_NUMERIC, "C"); /* * Set up initial (default) parameters. */ infiles = snewn(argc, char *); nfiles = 0; nogo = errs = FALSE; reportcols = 0; list_fonts = 0; input_charset = CS_ASCII; debug = 0; backendbits = 0; cfg = cfg_tail = NULL; if (argc == 1) { usage(); exit(EXIT_SUCCESS); } /* * Parse command line arguments. */ while (--argc) { char *p = *++argv; if (*p == '-' && p[1]) { /* * An option. */ while (p && *++p) { char c = *p; switch (c) { case '-': /* * Long option. */ { char *opt, *val; opt = p++; /* opt will have _one_ leading - */ while (*p && *p != '=') p++; /* find end of option */ if (*p == '=') { *p++ = '\0'; val = p; } else val = NULL; assert(opt[0] == '-'); for (k = 0; k < (int)lenof(backends); k++) if (!strcmp(opt+1, backends[k].name)) { backendbits |= backends[k].bitfield; if (val) { paragraph *p = backends[k].filename(val); assert(p); if (cfg_tail) cfg_tail->next = p; else cfg = p; while (p->next) p = p->next; cfg_tail = p; } break; } if (k < (int)lenof(backends)) { /* do nothing */; } else if (!strcmp(opt, "-input-charset")) { if (!val) { errs = TRUE, err_optnoarg(opt); } else { int charset = charset_from_localenc(val); if (charset == CS_NONE) { errs = TRUE, err_cmdcharset(val); } else { input_charset = charset; } } } else if (!strcmp(opt, "-help")) { help(); nogo = TRUE; } else if (!strcmp(opt, "-version")) { showversion(); nogo = TRUE; } else if (!strcmp(opt, "-licence") || !strcmp(opt, "-license")) { licence(); nogo = TRUE; } else if (!strcmp(opt, "-list-charsets")) { listcharsets(); nogo = TRUE; } else if (!strcmp(opt, "-list-fonts")) { list_fonts = TRUE; } else if (!strcmp(opt, "-precise")) { reportcols = 1; } else { errs = TRUE, err_nosuchopt(opt); } } p = NULL; break; case 'h': case 'V': case 'L': case 'P': case 'd': /* * Option requiring no parameter. */ switch (c) { case 'h': help(); nogo = TRUE; break; case 'V': showversion(); nogo = TRUE; break; case 'L': licence(); nogo = TRUE; break; case 'P': reportcols = 1; break; case 'd': debug = TRUE; break; } break; case 'C': /* * Option requiring parameter. */ p++; if (!*p && argc > 1) --argc, p = *++argv; else if (!*p) { char opt[2]; opt[0] = c; opt[1] = '\0'; errs = TRUE, err_optnoarg(opt); } /* * Now c is the option and p is the parameter. */ switch (c) { case 'C': /* * -C means we split our argument up into * colon-separated chunks and assemble them * into a config paragraph. */ { char *s = dupstr(p), *q, *r; paragraph *para; para = cmdline_cfg_new(); q = r = s; while (*q) { if (*q == ':') { *r = '\0'; /* XXX ad-hoc diagnostic */ if (!strcmp(s, "input-charset")) err_futileopt("Cinput-charset", "; use --input-charset"); cmdline_cfg_add(para, s); r = s; } else { if (*q == '\\' && q[1]) q++; *r++ = *q; } q++; } *r = '\0'; cmdline_cfg_add(para, s); if (cfg_tail) cfg_tail->next = para; else cfg = para; cfg_tail = para; } break; } p = NULL; /* prevent continued processing */ break; default: /* * Unrecognised option. */ { char opt[2]; opt[0] = c; opt[1] = '\0'; errs = TRUE, err_nosuchopt(opt); } } } } else { /* * A non-option argument. */ if (!strcmp(p, "-")) infiles[nfiles++] = NULL; /* special case: read stdin */ else infiles[nfiles++] = p; } } if (errs) exit(EXIT_FAILURE); if (nogo) exit(EXIT_SUCCESS); /* * Do the work. */ if (nfiles == 0 && !list_fonts) { err_noinput(); usage(); exit(EXIT_FAILURE); } { input in; paragraph *sourceform, *p; indexdata *idx; keywordlist *keywords; in.filenames = infiles; in.nfiles = nfiles; in.currfp = NULL; in.currindex = 0; in.npushback = in.pushbacksize = 0; in.pushback = NULL; in.reportcols = reportcols; in.stack = NULL; in.defcharset = input_charset; idx = make_index(); sourceform = read_input(&in, idx); if (list_fonts) { listfonts(); exit(EXIT_SUCCESS); } if (!sourceform) exit(EXIT_FAILURE); /* * Append the config directives acquired from the command * line. */ { paragraph *end; end = sourceform; while (end && end->next) end = end->next; assert(end); end->next = cfg; } sfree(in.pushback); sfree(infiles); keywords = get_keywords(sourceform); if (!keywords) exit(EXIT_FAILURE); gen_citations(sourceform, keywords); subst_keywords(sourceform, keywords); for (p = sourceform; p; p = p->next) if (p->type == para_IM) index_merge(idx, TRUE, p->keyword, p->words, &p->fpos); build_index(idx); /* * Set up attr_First / attr_Last / attr_Always, in the main * document and in the index entries. */ for (p = sourceform; p; p = p->next) mark_attr_ends(p->words); { int i; indexentry *entry; for (i = 0; (entry = index234(idx->entries, i)) != NULL; i++) mark_attr_ends(entry->text); } if (debug) { index_debug(idx); dbg_prtkws(keywords); dbg_prtsource(sourceform); } /* * Select and run the pre-backends. */ prebackbits = 0; for (k = 0; k < (int)lenof(backends); k++) if (backendbits == 0 || (backendbits & backends[k].bitfield)) prebackbits |= backends[k].prebackend_bitfield; for (k = 0; k < (int)lenof(pre_backends); k++) if (prebackbits & pre_backends[k].bitfield) { assert(k < (int)lenof(pre_backend_data)); pre_backend_data[k] = pre_backends[k].func(sourceform, keywords, idx); } /* * Run the selected set of backends. */ for (k = b = 0; k < (int)lenof(backends); k++) if (b != backends[k].bitfield) { b = backends[k].bitfield; if (backendbits == 0 || (backendbits & b)) { void *pbd = NULL; int pbb = backends[k].prebackend_bitfield; int m; for (m = 0; m < (int)lenof(pre_backends); m++) if (pbb & pre_backends[m].bitfield) { assert(m < (int)lenof(pre_backend_data)); pbd = pre_backend_data[m]; break; } backends[k].func(sourceform, keywords, idx, pbd); } } free_para_list(sourceform); free_keywords(keywords); cleanup_index(idx); } return 0; } static void dbg_prtsource(paragraph *sourceform) { /* * Output source form in debugging format. */ paragraph *p; for (p = sourceform; p; p = p->next) { wchar_t *wp; printf("para %d ", p->type); if (p->keyword) { wp = p->keyword; while (*wp) { putchar('\"'); for (; *wp; wp++) putchar(*wp); putchar('\"'); if (*++wp) printf(", "); } } else printf("(no keyword)"); printf(" {\n"); dbg_prtwordlist(1, p->words); printf("}\n"); } } static void dbg_prtkws(keywordlist *kws) { /* * Output keywords in debugging format. */ int i; keyword *kw; for (i = 0; (kw = index234(kws->keys, i)) != NULL; i++) { wchar_t *wp; printf("keyword "); wp = kw->key; while (*wp) { putchar('\"'); for (; *wp; wp++) putchar(*wp); putchar('\"'); if (*++wp) printf(", "); } printf(" {\n"); dbg_prtwordlist(1, kw->text); printf("}\n"); } } static void dbg_prtwordlist(int level, word *w) { for (; w; w = w->next) { wchar_t *wp; printf("%*sword %d ", level*4, "", w->type); if (w->text) { printf("\""); for (wp = w->text; *wp; wp++) putchar(*wp); printf("\""); } else printf("(no text)"); if (w->breaks) printf(" [breaks]"); if (w->alt) { printf(" alt = {\n"); dbg_prtwordlist(level+1, w->alt); printf("%*s}", level*4, ""); } printf("\n"); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/malloc.c��������������������������������������������������������������������������������0000644�0001753�0001753�00000005660�12444773746�011376� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * malloc.c: safe wrappers around malloc, realloc, free, strdup */ #include <stdlib.h> #include <stdarg.h> #include "halibut.h" #ifdef LOGALLOC #define LOGPARAMS char *file, int line, static FILE *logallocfp = NULL; static int logline = 2; /* off by 1: `null pointer is' */ static void loginc(void) { } static void logallocinit(void) { if (!logallocfp) { logallocfp = fopen("malloc.log", "w"); if (!logallocfp) { fprintf(stderr, "panic: unable to open malloc.log\n"); exit(10); } setvbuf (logallocfp, NULL, _IOLBF, BUFSIZ); fprintf(logallocfp, "null pointer is %p\n", NULL); } } static void logprintf(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(logallocfp, fmt, ap); va_end(ap); } #define LOGPRINT(x) ( logallocinit(), logprintf x ) #define LOGINC do { loginc(); logline++; } while (0) #else #define LOGPARAMS #define LOGPRINT(x) #define LOGINC ((void)0) #endif /* * smalloc should guarantee to return a useful pointer - Halibut * can do nothing except die when it's out of memory anyway. */ void *(smalloc)(LOGPARAMS int size) { void *p; LOGINC; LOGPRINT(("%s %d malloc(%ld)", file, line, (long)size)); p = malloc(size); if (!p) fatalerr_nomemory(); LOGPRINT((" returns %p\n", p)); return p; } /* * sfree should guaranteeably deal gracefully with freeing NULL */ void (sfree)(LOGPARAMS void *p) { if (p) { LOGINC; LOGPRINT(("%s %d free(%p)\n", file, line, p)); free(p); } } /* * srealloc should guaranteeably be able to realloc NULL */ void *(srealloc)(LOGPARAMS void *p, int size) { void *q; if (p) { LOGINC; LOGPRINT(("%s %d realloc(%p,%ld)", file, line, p, (long)size)); q = realloc(p, size); LOGPRINT((" returns %p\n", q)); } else { LOGINC; LOGPRINT(("%s %d malloc(%ld)", file, line, (long)size)); q = malloc(size); LOGPRINT((" returns %p\n", q)); } if (!q) fatalerr_nomemory(); return q; } /* * dupstr is like strdup, but with the never-return-NULL property * of smalloc (and also reliably defined in all environments :-) */ char *dupstr(char const *s) { char *r = smalloc(1+strlen(s)); strcpy(r,s); return r; } /* * Duplicate a linked list of words */ word *dup_word_list(word *w) { word *head = NULL, **eptr = &head; while (w) { word *newwd = snew(word); *newwd = *w; /* structure copy */ newwd->text = ustrdup(w->text); if (w->alt) newwd->alt = dup_word_list(w->alt); *eptr = newwd; newwd->next = NULL; eptr = &newwd->next; w = w->next; } return head; } /* * Free a linked list of words */ void free_word_list(word *w) { word *t; while (w) { t = w; w = w->next; sfree(t->text); if (t->alt) free_word_list(t->alt); sfree(t); } } /* * Free a linked list of paragraphs */ void free_para_list(paragraph *p) { paragraph *t; while (p) { t = p; p = p->next; sfree(t->keyword); free_word_list(t->words); sfree(t); } } ��������������������������������������������������������������������������������halibut-1.1/misc.c����������������������������������������������������������������������������������0000644�0001753�0001753�00000034055�12444773746�011062� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * misc.c: miscellaneous useful items */ #include <stdarg.h> #include "halibut.h" char *adv(char *s) { return s + 1 + strlen(s); } struct stackTag { void **data; int sp; int size; }; stack stk_new(void) { stack s; s = snew(struct stackTag); s->sp = 0; s->size = 0; s->data = NULL; return s; } void stk_free(stack s) { sfree(s->data); sfree(s); } void stk_push(stack s, void *item) { if (s->size <= s->sp) { s->size = s->sp + 32; s->data = sresize(s->data, s->size, void *); } s->data[s->sp++] = item; } void *stk_pop(stack s) { if (s->sp > 0) return s->data[--s->sp]; else return NULL; } void *stk_top(stack s) { if (s->sp > 0) return s->data[s->sp-1]; else return NULL; } /* * Small routines to amalgamate a string from an input source. */ const rdstring empty_rdstring = {0, 0, NULL}; const rdstringc empty_rdstringc = {0, 0, NULL}; void rdadd(rdstring *rs, wchar_t c) { if (rs->pos >= rs->size-1) { rs->size = rs->pos + 128; rs->text = sresize(rs->text, rs->size, wchar_t); } rs->text[rs->pos++] = c; rs->text[rs->pos] = 0; } void rdadds(rdstring *rs, wchar_t const *p) { int len = ustrlen(p); if (rs->pos >= rs->size - len) { rs->size = rs->pos + len + 128; rs->text = sresize(rs->text, rs->size, wchar_t); } ustrcpy(rs->text + rs->pos, p); rs->pos += len; } wchar_t *rdtrim(rdstring *rs) { rs->text = sresize(rs->text, rs->pos + 1, wchar_t); return rs->text; } void rdaddc(rdstringc *rs, char c) { if (rs->pos >= rs->size-1) { rs->size = rs->pos + 128; rs->text = sresize(rs->text, rs->size, char); } rs->text[rs->pos++] = c; rs->text[rs->pos] = 0; } void rdaddsc(rdstringc *rs, char const *p) { rdaddsn(rs, p, strlen(p)); } void rdaddsn(rdstringc *rs, char const *p, int len) { if (rs->pos >= rs->size - len) { rs->size = rs->pos + len + 128; rs->text = sresize(rs->text, rs->size, char); } memcpy(rs->text + rs->pos, p, len); rs->pos += len; rs->text[rs->pos] = 0; } char *rdtrimc(rdstringc *rs) { rs->text = sresize(rs->text, rs->pos + 1, char); return rs->text; } static int compare_wordlists_literally(word *a, word *b) { int t; while (a && b) { if (a->type != b->type) return (a->type < b->type ? -1 : +1); /* FIXME? */ t = a->type; if ((t != word_Normal && t != word_Code && t != word_WeakCode && t != word_Emph && t != word_Strong) || a->alt || b->alt) { int c; if (a->text && b->text) { c = ustricmp(a->text, b->text); if (c) return c; } c = compare_wordlists_literally(a->alt, b->alt); if (c) return c; a = a->next; b = b->next; } else { wchar_t *ap = a->text, *bp = b->text; while (*ap && *bp) { wchar_t ac = *ap, bc = *bp; if (ac != bc) return (ac < bc ? -1 : +1); if (!*++ap && a->next && a->next->type == t && !a->next->alt) a = a->next, ap = a->text; if (!*++bp && b->next && b->next->type == t && !b->next->alt) b = b->next, bp = b->text; } if (*ap || *bp) return (*ap ? +1 : -1); a = a->next; b = b->next; } } if (a || b) return (a ? +1 : -1); else return 0; } int compare_wordlists(word *a, word *b) { /* * First we compare only the alphabetic content of the word * lists, with case not a factor. If that comes out equal, * _then_ we compare the word lists literally. */ struct { word *w; int i; wchar_t c; } pos[2]; pos[0].w = a; pos[1].w = b; pos[0].i = pos[1].i = 0; while (1) { /* * Find the next alphabetic character in each word list. */ int k; for (k = 0; k < 2; k++) { /* * Advance until we hit either an alphabetic character * or the end of the word list. */ while (1) { if (!pos[k].w) { /* End of word list. */ pos[k].c = 0; break; } else if (!pos[k].w->text || !pos[k].w->text[pos[k].i]) { /* No characters remaining in this word; move on. */ pos[k].w = pos[k].w->next; pos[k].i = 0; } else if (!uisalpha(pos[k].w->text[pos[k].i])) { /* This character isn't alphabetic; move on. */ pos[k].i++; } else { /* We have an alphabetic! Lowercase it and continue. */ pos[k].c = utolower(pos[k].w->text[pos[k].i]); break; } } } #ifdef HAS_WCSCOLL { wchar_t a[2], b[2]; int ret; a[0] = pos[0].c; b[0] = pos[1].c; a[1] = b[1] = L'\0'; ret = wcscoll(a, b); if (ret) return ret; } #else if (pos[0].c < pos[1].c) return -1; else if (pos[0].c > pos[1].c) return +1; #endif if (!pos[0].c) break; /* they're equal */ pos[0].i++; pos[1].i++; } /* * If we reach here, the strings were alphabetically equal, so * compare in more detail. */ return compare_wordlists_literally(a, b); } void mark_attr_ends(word *words) { word *w, *wp; wp = NULL; for (w = words; w; w = w->next) { int both; if (!isvis(w->type)) /* Invisible elements should not affect this calculation */ continue; both = (isattr(w->type) && wp && isattr(wp->type) && sameattr(wp->type, w->type)); w->aux |= both ? attr_Always : attr_First; if (wp && !both) { /* If previous considered word turns out to have been * the end of a run, tidy it up. */ int wp_attr = attraux(wp->aux); wp->aux = (wp->aux & ~attr_mask) | ((wp_attr == attr_Always) ? attr_Last /* attr_First */ : attr_Only); } wp = w; } /* Tidy up last word touched */ if (wp) { int wp_attr = attraux(wp->aux); wp->aux = (wp->aux & ~attr_mask) | ((wp_attr == attr_Always) ? attr_Last /* attr_First */ : attr_Only); } } /* * This function implements the optimal paragraph wrapping * algorithm, pretty much as used in TeX. A cost function is * defined for each line of the wrapped paragraph (typically some * convex function of the difference between the line's length and * its desired length), and a dynamic programming approach is used * to optimise globally across all possible layouts of the * paragraph to find the one with the minimum total cost. * * The function as implemented here gives a choice of two options * for the cost function: * * - If `natural_space' is zero, then the algorithm attempts to * make each line the maximum possible width (either `width' or * `subsequentwidth' depending on whether it's the first line of * the paragraph or not), and the cost function is simply the * square of the unused space at the end of each line. This is a * simple mechanism suitable for use in fixed-pitch environments * such as plain text displayed on a terminal. * * - However, if `natural_space' is positive, the algorithm * assumes the medium is fully graphical and that the width of * space characters can be adjusted finely, and it attempts to * make each _space character_ the width given in * `natural_space'. (The provided width function should return * the _minimum_ acceptable width of a space character in this * case.) Therefore, the cost function for a line is dependent * on the number of spaces on that line as well as the amount by * which the line width differs from the optimum. */ wrappedline *wrap_para(word *text, int width, int subsequentwidth, int (*widthfn)(void *, word *), void *ctx, int natural_space) { wrappedline *head = NULL, **ptr = &head; int nwords, wordsize; struct wrapword { word *begin, *end; int width; int spacewidth; int cost; int nwords; } *wrapwords; int i, j, n; /* * Break the line up into wrappable components. */ nwords = wordsize = 0; wrapwords = NULL; while (text) { if (nwords >= wordsize) { wordsize = nwords + 64; wrapwords = srealloc(wrapwords, wordsize * sizeof(*wrapwords)); } wrapwords[nwords].width = 0; wrapwords[nwords].begin = text; while (text) { wrapwords[nwords].width += widthfn(ctx, text); wrapwords[nwords].end = text->next; if (text->next && (text->next->type == word_WhiteSpace || text->next->type == word_EmphSpace || text->next->type == word_StrongSpace || text->breaks)) break; text = text->next; } if (text && text->next && (text->next->type == word_WhiteSpace || text->next->type == word_EmphSpace || text->next->type == word_StrongSpace)) { wrapwords[nwords].spacewidth = widthfn(ctx, text->next); text = text->next; } else { wrapwords[nwords].spacewidth = 0; } nwords++; if (text) text = text->next; } /* * Perform the dynamic wrapping algorithm: work backwards from * nwords-1, determining the optimal wrapping for each terminal * subsequence of the paragraph. */ for (i = nwords; i-- ;) { int best = -1; int bestcost = 0; int cost; int linelen = 0, spacewidth = 0, minspacewidth = 0; int nspaces; int thiswidth = (i == 0 ? width : subsequentwidth); j = 0; nspaces = 0; while (i+j < nwords) { /* * See what happens if we put j+1 words on this line. */ if (spacewidth) { nspaces++; minspacewidth = spacewidth; } linelen += spacewidth + wrapwords[i+j].width; spacewidth = wrapwords[i+j].spacewidth; j++; if (linelen > thiswidth) { /* * If we're over the width limit, abandon ship, * _unless_ there is no best-effort yet (which will * only happen if the first word is too long all by * itself). */ if (best > 0) break; } /* * Compute the cost of this line. The method of doing * this differs hugely depending on whether * natural_space is nonzero or not. */ if (natural_space) { if (!nspaces && linelen > thiswidth) { /* * Special case: if there are no spaces at all * on the line because one single word is too * long for its line, cost is zero because * there's nothing we can do about it anyway. */ cost = 0; } else { int shortfall = thiswidth - linelen; int spaceextra = shortfall / (nspaces ? nspaces : 1); int spaceshortfall = natural_space - (minspacewidth + spaceextra); if (i+j == nwords && spaceshortfall < 0) { /* * Special case: on the very last line of * the paragraph, we don't score penalty * points for having to _stretch_ the line, * since we won't stretch it anyway. * However, we score penalties as normal * for having to squeeze it. */ cost = 0; } else { /* * Squaring this number is tricky since * it's liable to be quite big. Let's * divide it through by 256. */ int x = spaceshortfall >> 8; int xf = spaceshortfall & 0xFF; /* * Not counting strange variable-fixed- * point oddities, we are computing * * (x+xf)^2 = x^2 + 2*x*xf + xf*xf * * except that _our_ xf is 256 times the * one listed there. */ cost = x * x; cost += (2 * x * xf) >> 8; } } } else { if (i+j == nwords) { /* * Special case: if we're at the very end of the * paragraph, we don't score penalty points for the * white space left on the line. */ cost = 0; } else { cost = (thiswidth-linelen) * (thiswidth-linelen); } } /* * Add in the cost of wrapping all lines after this * point too. */ if (i+j < nwords) cost += wrapwords[i+j].cost; /* * We compare bestcost >= cost, not bestcost > cost, * because in cases where the costs are identical we * want to try to look like the greedy algorithm, * because readers are likely to have spent a lot of * time looking at greedy-wrapped paragraphs and * there's no point violating the Principle of Least * Surprise if it doesn't actually gain anything. */ if (best < 0 || bestcost >= cost) { bestcost = cost; best = j; } } /* * Now we know the optimal answer for this terminal * subsequence, so put it in wrapwords. */ wrapwords[i].cost = bestcost; wrapwords[i].nwords = best; } /* * We've wrapped the paragraph. Now build the output * `wrappedline' list. */ i = 0; while (i < nwords) { wrappedline *w = snew(wrappedline); *ptr = w; ptr = &w->next; w->next = NULL; n = wrapwords[i].nwords; w->begin = wrapwords[i].begin; w->end = wrapwords[i+n-1].end; /* * Count along the words to find nspaces and shortfall. */ w->nspaces = 0; w->shortfall = width; for (j = 0; j < n; j++) { w->shortfall -= wrapwords[i+j].width; if (j < n-1 && wrapwords[i+j].spacewidth) { w->nspaces++; w->shortfall -= wrapwords[i+j].spacewidth; } } i += n; } sfree(wrapwords); return head; } void wrap_free(wrappedline *w) { while (w) { wrappedline *t = w->next; sfree(w); w = t; } } void cmdline_cfg_add(paragraph *cfg, char *string) { wchar_t *ustring; int upos, ulen, pos, len; ulen = 0; while (cfg->keyword[ulen]) ulen += 1 + ustrlen(cfg->keyword+ulen); len = 0; while (cfg->origkeyword[len]) len += 1 + strlen(cfg->origkeyword+len); ustring = ufroma_locale_dup(string); upos = ulen; ulen += 2 + ustrlen(ustring); cfg->keyword = sresize(cfg->keyword, ulen, wchar_t); ustrcpy(cfg->keyword+upos, ustring); cfg->keyword[ulen-1] = L'\0'; pos = len; len += 2 + strlen(string); cfg->origkeyword = sresize(cfg->origkeyword, len, char); strcpy(cfg->origkeyword+pos, string); cfg->origkeyword[len-1] = '\0'; sfree(ustring); } paragraph *cmdline_cfg_new(void) { paragraph *p; p = snew(paragraph); memset(p, 0, sizeof(*p)); p->type = para_Config; p->next = NULL; p->fpos.filename = "<command line>"; p->fpos.line = p->fpos.col = -1; p->keyword = ustrdup(L"\0"); p->origkeyword = dupstr("\0"); return p; } paragraph *cmdline_cfg_simple(char *string, ...) { va_list ap; char *s; paragraph *p; p = cmdline_cfg_new(); cmdline_cfg_add(p, string); va_start(ap, string); while ((s = va_arg(ap, char *)) != NULL) cmdline_cfg_add(p, s); va_end(ap); return p; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/paper.h���������������������������������������������������������������������������������0000644�0001753�0001753�00000026547�12444773746�011252� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Paper printing definitions. * * This header file defines data structures and constants which are * shared between bk_paper.c and its clients bk_ps.c and bk_pdf.c. */ #ifndef HALIBUT_PAPER_H #define HALIBUT_PAPER_H /* Number of internal units per PostScript point. */ #define UNITS_PER_PT 1000 #define FUNITS_PER_PT 1000.0 /* Glyphs are represented by integer indicies into a table of names. */ typedef unsigned short glyph; #define NOGLYPH 0xFFFF typedef struct document_Tag document; typedef struct glyph_width_Tag glyph_width; typedef struct kern_pair_Tag kern_pair; typedef struct ligature_Tag ligature; typedef struct font_info_Tag font_info; typedef struct font_data_Tag font_data; typedef struct font_encoding_Tag font_encoding; typedef struct font_list_Tag font_list; typedef struct para_data_Tag para_data; typedef struct line_data_Tag line_data; typedef struct page_data_Tag page_data; typedef struct subfont_map_entry_Tag subfont_map_entry; typedef struct text_fragment_Tag text_fragment; typedef struct xref_Tag xref; typedef struct xref_dest_Tag xref_dest; typedef struct rect_Tag rect; typedef struct outline_element_Tag outline_element; /* * This data structure represents the overall document, in the form * it will be given to the client backends. */ struct document_Tag { int paper_width, paper_height; font_list *fonts; page_data *pages; outline_element *outline_elements; int n_outline_elements; }; /* * This data structure represents the normal width of a single glyph * in a font. */ struct glyph_width_Tag { glyph glyph; int width; }; /* * This data structure represents a kerning pair within a font. */ struct kern_pair_Tag { /* Glyph indices. */ glyph left, right; /* Kern amount, in internal units. */ int kern; }; /* * ... and this one represents a ligature. */ struct ligature_Tag { glyph left, right, lig; }; /* * This data structure holds static information about a font that doesn't * depend on the particular document. It gets generated when the font's * metrics are read in. */ font_info *all_fonts; struct font_info_Tag { font_info *next; /* * Specify the PostScript name of the font and its point size. */ const char *name; /* * Pointer to data about the file containing the font, if any. */ void *fontfile; enum { TYPE1, TRUETYPE } filetype; /* A tree of glyph_widths */ tree234 *widths; /* A tree of kern_pairs */ tree234 *kerns; /* ... and one of ligatures */ tree234 *ligs; /* * For reasonably speedy lookup, we set up a 65536-element * table representing the Unicode BMP (I can conveniently * restrict myself to the BMP for the moment since I happen to * know that no glyph in the Adobe Glyph List falls outside * it), whose elements are indices into the above two arrays. */ glyph bmp[65536]; /* * Various bits of metadata needed for the /FontDescriptor dictionary * in PDF. */ float fontbbox[4]; float capheight; float xheight; float ascent; float descent; float stemv; float stemh; float italicangle; }; /* * This structure holds the information about how a font is used * in a document. */ struct font_data_Tag { font_info const *info; /* * At some point I'm going to divide the font into sub-fonts * with largely non-overlapping encoding vectors. This tree * will track which glyphs go into which subfonts. Also here I * keep track of the latest subfont of any given font, so I can * go back and extend its encoding. */ tree234 *subfont_map; font_encoding *latest_subfont; /* * The font list to which this font belongs. */ font_list *list; }; struct subfont_map_entry_Tag { font_encoding *subfont; unsigned char position; }; /* * This data structure represents a sub-font: a font with an * encoding vector. */ struct font_encoding_Tag { font_encoding *next; char *name; /* used by client backends */ font_data *font; /* the parent font structure */ glyph vector[256]; /* the actual encoding vector */ wchar_t to_unicode[256]; /* PDF will want to know this */ int free_pos; /* space left to extend encoding */ }; /* * This data structure represents the overall list of sub-fonts in * the whole document. */ struct font_list_Tag { font_encoding *head; font_encoding *tail; }; /* * Constants defining array indices for the various fonts used in a * paragraph. */ enum { FONT_NORMAL, FONT_EMPH, FONT_STRONG, FONT_CODE, NFONTS }; /* * This is the data structure which is stored in the private_data * field of each paragraph. It divides the paragraph up into a * linked list of lines, while at the same time providing for those * lines to be linked together into a much longer list spanning the * whole document for page-breaking purposes. */ struct para_data_Tag { para_data *next; /* * Data about the fonts used in this paragraph. Indices are the * FONT_* constants defined above. */ font_data *fonts[NFONTS]; int sizes[NFONTS]; /* * Pointers to the first and last line of the paragraph. The * line structures are linked into a list, which runs from * `first' to `last' as might be expected. However, the list * does not terminate there: first->prev will end up pointing * to the last line of the previous paragraph in most cases, * and likewise last->next will point to the first line of the * next paragraph. */ line_data *first; /* first line in paragraph */ line_data *last; /* last line in paragraph */ /* * Some paragraphs have associated graphics; currently this is * nothing more complex than a single black rectangle. */ enum { RECT_NONE, RECT_CHAPTER_UNDERLINE, RECT_RULE } rect_type; /* * We left- and right-justify in special circumstances. */ enum { JUST, LEFT, RIGHT } justification; /* * Sometimes (in code paragraphs) we want to override the flags * passed to render_string(). */ unsigned extraflags; /* * For constructing the page outline. */ int outline_level; /* 0=title 1=C 2=H 3=S 4=S2... */ wchar_t *outline_title; /* * For adding the page number of a contents entry afterwards. */ paragraph *contents_entry; }; struct line_data_Tag { /* * The parent paragraph. */ para_data *pdata; /* * Pointers to join lines into a linked list. */ line_data *prev; line_data *next; /* * The extent of the text displayed on this line. Also mention * its starting x position, and by how much the width of spaces * needs to be adjusted for paragraph justification. * * (Unlike most of the `last' pointers defined in this file, * this `end' pointer points to the word _after_ the last one * that should be displayed on the line. This is how it's * returned from wrap_para().) */ word *first; word *end; int xpos; int hshortfall, nspaces; /* for justifying paragraphs */ int real_shortfall; /* * Auxiliary text: a section number in a margin, or a list item * bullet or number. Also mention where to display this text * relative to the left margin. */ word *aux_text; word *aux_text_2; int aux_left_indent; /* * This line might have a non-negotiable page break before it. * Also there will be space required above and below it; also I * store the physical line height (defined as the maximum of * the heights of the three fonts in the pdata) because it's * easier than looking it up repeatedly during page breaking. */ int page_break; int space_before; int space_after; int line_height; /* * Penalties for page breaking before or after this line. */ int penalty_before, penalty_after; /* * These fields are used in the page breaking algorithm. */ int *bestcost; int *vshortfall, *text, *space; line_data **page_last; /* last line on a page starting here */ /* * After page breaking, we can assign an actual y-coordinate on * the page to each line. Also we store a pointer back to the * page structure itself. */ int ypos; page_data *page; }; /* * This data structure is constructed to describe each page of the * printed output. */ struct page_data_Tag { /* * Pointers to join pages into a linked list. */ page_data *prev; page_data *next; /* * The set of lines displayed on this page. */ line_data *first_line; line_data *last_line; /* * After text rendering: the set of actual pieces of text * needing to be displayed on this page. */ text_fragment *first_text; text_fragment *last_text; /* * Cross-references. */ xref *first_xref; xref *last_xref; /* * Rectangles to be drawn. (These are currently only used for * underlining chapter titles and drawing horizontal rules.) */ rect *first_rect; rect *last_rect; /* * The page number, as a string. */ wchar_t *number; /* * This spare pointer field is for use by the client backends. */ void *spare; }; struct text_fragment_Tag { text_fragment *next; int x, y; font_encoding *fe; int fontsize; char *text; int width; }; struct xref_dest_Tag { enum { NONE, PAGE, URL } type; page_data *page; char *url; }; struct xref_Tag { xref *next; int lx, rx, ty, by; xref_dest dest; }; struct rect_Tag { rect *next; int x, y, w, h; }; struct outline_element_Tag { int level; /* 0=title 1=C 2=H 3=S 4=S2... */ para_data *pdata; }; /* * Functions exported from bk_paper.c */ int width_cmp(void *, void *); /* use when setting up widths */ int kern_cmp(void *, void *); /* use when setting up kern_pairs */ int lig_cmp(void *, void *); /* use when setting up ligatures */ int find_width(font_data *, glyph); /* * Functions and data exported from psdata.c. */ glyph glyph_intern(char const *); char const *glyph_extern(glyph); wchar_t ps_glyph_to_unicode(glyph); extern const char *const ps_std_glyphs[]; extern glyph const tt_std_glyphs[]; void init_std_fonts(void); const int *ps_std_font_widths(char const *fontname); const kern_pair *ps_std_font_kerns(char const *fontname); /* * Functions exported from bk_pdf.c */ typedef struct object_Tag object; typedef struct objlist_Tag objlist; object *new_object(objlist *list); void objtext(object *o, char const *text); void objstream(object *o, char const *text); void objstream_len(object *o, char const *text, size_t len); char *pdf_outline_convert(wchar_t *s, int *len); /* * Function exported from bk_ps.c */ void ps_token(FILE *fp, int *cc, char const *fmt, ...); /* * Backend functions exported by in_pf.c */ void pf_part1(font_info *fi, char **bufp, size_t *lenp); void pf_part2(font_info *fi, char **bufp, size_t *lenp); void pf_writeps(font_info const *fi, FILE *ofp); /* * Backend functions exported by in_sfnt.c */ typedef struct sfnt_Tag sfnt; glyph sfnt_indextoglyph(sfnt *sf, unsigned idx); unsigned sfnt_glyphtoindex(sfnt *sf, glyph g); unsigned sfnt_nglyphs(sfnt *sf); void sfnt_writeps(font_info const *fi, FILE *ofp); void sfnt_data(font_info *fi, char **bufp, size_t *lenp); #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/psdata.c��������������������������������������������������������������������������������0000644�0001753�0001753�00001067057�12444773746�011414� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Data, and supporting functions, for PostScript-based output * formats. */ #include <assert.h> #include "halibut.h" #include "paper.h" /* * Within the paper backends, PostScript glyph names are represented * by small integers. For standard glyphs, these are indicies into * a table generated from the Adobe Glyph List from * <http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt>. * There are a few glyphs that are needed statically but aren't in the * Glyph List. We manually add them with a mapping of U+FFFF. * Since all the scripts that generate fragments of code for this file * need that list, it's worth generating a file containing just the names. echo ".notdef;FFFF" >>glyphlist.txt echo ".null;FFFF" >>glyphlist.txt echo "nonmarkingreturn;FFFF" >>glyphlist.txt grep '^[^#;][^;]*;[^ ][^ ][^ ][^ ]$' glyphlist.txt | sort -t\; -k1,1 | \ cut -f1 -d\; > glyphnames.txt < glyphnames.txt xargs printf '"%s", ' | fold -s -w68 | sed 's/^/ /'; echo */ static const char *const ps_glyphs_alphabetic[] = { ".notdef", ".null", "A", "AE", "AEacute", "AEmacron", "AEsmall", "Aacute", "Aacutesmall", "Abreve", "Abreveacute", "Abrevecyrillic", "Abrevedotbelow", "Abrevegrave", "Abrevehookabove", "Abrevetilde", "Acaron", "Acircle", "Acircumflex", "Acircumflexacute", "Acircumflexdotbelow", "Acircumflexgrave", "Acircumflexhookabove", "Acircumflexsmall", "Acircumflextilde", "Acute", "Acutesmall", "Acyrillic", "Adblgrave", "Adieresis", "Adieresiscyrillic", "Adieresismacron", "Adieresissmall", "Adotbelow", "Adotmacron", "Agrave", "Agravesmall", "Ahookabove", "Aiecyrillic", "Ainvertedbreve", "Alpha", "Alphatonos", "Amacron", "Amonospace", "Aogonek", "Aring", "Aringacute", "Aringbelow", "Aringsmall", "Asmall", "Atilde", "Atildesmall", "Aybarmenian", "B", "Bcircle", "Bdotaccent", "Bdotbelow", "Becyrillic", "Benarmenian", "Beta", "Bhook", "Blinebelow", "Bmonospace", "Brevesmall", "Bsmall", "Btopbar", "C", "Caarmenian", "Cacute", "Caron", "Caronsmall", "Ccaron", "Ccedilla", "Ccedillaacute", "Ccedillasmall", "Ccircle", "Ccircumflex", "Cdot", "Cdotaccent", "Cedillasmall", "Chaarmenian", "Cheabkhasiancyrillic", "Checyrillic", "Chedescenderabkhasiancyrillic", "Chedescendercyrillic", "Chedieresiscyrillic", "Cheharmenian", "Chekhakassiancyrillic", "Cheverticalstrokecyrillic", "Chi", "Chook", "Circumflexsmall", "Cmonospace", "Coarmenian", "Csmall", "D", "DZ", "DZcaron", "Daarmenian", "Dafrican", "Dcaron", "Dcedilla", "Dcircle", "Dcircumflexbelow", "Dcroat", "Ddotaccent", "Ddotbelow", "Decyrillic", "Deicoptic", "Delta", "Deltagreek", "Dhook", "Dieresis", "DieresisAcute", "DieresisGrave", "Dieresissmall", "Digammagreek", "Djecyrillic", "Dlinebelow", "Dmonospace", "Dotaccentsmall", "Dslash", "Dsmall", "Dtopbar", "Dz", "Dzcaron", "Dzeabkhasiancyrillic", "Dzecyrillic", "Dzhecyrillic", "E", "Eacute", "Eacutesmall", "Ebreve", "Ecaron", "Ecedillabreve", "Echarmenian", "Ecircle", "Ecircumflex", "Ecircumflexacute", "Ecircumflexbelow", "Ecircumflexdotbelow", "Ecircumflexgrave", "Ecircumflexhookabove", "Ecircumflexsmall", "Ecircumflextilde", "Ecyrillic", "Edblgrave", "Edieresis", "Edieresissmall", "Edot", "Edotaccent", "Edotbelow", "Efcyrillic", "Egrave", "Egravesmall", "Eharmenian", "Ehookabove", "Eightroman", "Einvertedbreve", "Eiotifiedcyrillic", "Elcyrillic", "Elevenroman", "Emacron", "Emacronacute", "Emacrongrave", "Emcyrillic", "Emonospace", "Encyrillic", "Endescendercyrillic", "Eng", "Enghecyrillic", "Enhookcyrillic", "Eogonek", "Eopen", "Epsilon", "Epsilontonos", "Ercyrillic", "Ereversed", "Ereversedcyrillic", "Escyrillic", "Esdescendercyrillic", "Esh", "Esmall", "Eta", "Etarmenian", "Etatonos", "Eth", "Ethsmall", "Etilde", "Etildebelow", "Euro", "Ezh", "Ezhcaron", "Ezhreversed", "F", "Fcircle", "Fdotaccent", "Feharmenian", "Feicoptic", "Fhook", "Fitacyrillic", "Fiveroman", "Fmonospace", "Fourroman", "Fsmall", "G", "GBsquare", "Gacute", "Gamma", "Gammaafrican", "Gangiacoptic", "Gbreve", "Gcaron", "Gcedilla", "Gcircle", "Gcircumflex", "Gcommaaccent", "Gdot", "Gdotaccent", "Gecyrillic", "Ghadarmenian", "Ghemiddlehookcyrillic", "Ghestrokecyrillic", "Gheupturncyrillic", "Ghook", "Gimarmenian", "Gjecyrillic", "Gmacron", "Gmonospace", "Grave", "Gravesmall", "Gsmall", "Gsmallhook", "Gstroke", "H", "H18533", "H18543", "H18551", "H22073", "HPsquare", "Haabkhasiancyrillic", "Hadescendercyrillic", "Hardsigncyrillic", "Hbar", "Hbrevebelow", "Hcedilla", "Hcircle", "Hcircumflex", "Hdieresis", "Hdotaccent", "Hdotbelow", "Hmonospace", "Hoarmenian", "Horicoptic", "Hsmall", "Hungarumlaut", "Hungarumlautsmall", "Hzsquare", "I", "IAcyrillic", "IJ", "IUcyrillic", "Iacute", "Iacutesmall", "Ibreve", "Icaron", "Icircle", "Icircumflex", "Icircumflexsmall", "Icyrillic", "Idblgrave", "Idieresis", "Idieresisacute", "Idieresiscyrillic", "Idieresissmall", "Idot", "Idotaccent", "Idotbelow", "Iebrevecyrillic", "Iecyrillic", "Ifraktur", "Igrave", "Igravesmall", "Ihookabove", "Iicyrillic", "Iinvertedbreve", "Iishortcyrillic", "Imacron", "Imacroncyrillic", "Imonospace", "Iniarmenian", "Iocyrillic", "Iogonek", "Iota", "Iotaafrican", "Iotadieresis", "Iotatonos", "Ismall", "Istroke", "Itilde", "Itildebelow", "Izhitsacyrillic", "Izhitsadblgravecyrillic", "J", "Jaarmenian", "Jcircle", "Jcircumflex", "Jecyrillic", "Jheharmenian", "Jmonospace", "Jsmall", "K", "KBsquare", "KKsquare", "Kabashkircyrillic", "Kacute", "Kacyrillic", "Kadescendercyrillic", "Kahookcyrillic", "Kappa", "Kastrokecyrillic", "Kaverticalstrokecyrillic", "Kcaron", "Kcedilla", "Kcircle", "Kcommaaccent", "Kdotbelow", "Keharmenian", "Kenarmenian", "Khacyrillic", "Kheicoptic", "Khook", "Kjecyrillic", "Klinebelow", "Kmonospace", "Koppacyrillic", "Koppagreek", "Ksicyrillic", "Ksmall", "L", "LJ", "LL", "Lacute", "Lambda", "Lcaron", "Lcedilla", "Lcircle", "Lcircumflexbelow", "Lcommaaccent", "Ldot", "Ldotaccent", "Ldotbelow", "Ldotbelowmacron", "Liwnarmenian", "Lj", "Ljecyrillic", "Llinebelow", "Lmonospace", "Lslash", "Lslashsmall", "Lsmall", "M", "MBsquare", "Macron", "Macronsmall", "Macute", "Mcircle", "Mdotaccent", "Mdotbelow", "Menarmenian", "Mmonospace", "Msmall", "Mturned", "Mu", "N", "NJ", "Nacute", "Ncaron", "Ncedilla", "Ncircle", "Ncircumflexbelow", "Ncommaaccent", "Ndotaccent", "Ndotbelow", "Nhookleft", "Nineroman", "Nj", "Njecyrillic", "Nlinebelow", "Nmonospace", "Nowarmenian", "Nsmall", "Ntilde", "Ntildesmall", "Nu", "O", "OE", "OEsmall", "Oacute", "Oacutesmall", "Obarredcyrillic", "Obarreddieresiscyrillic", "Obreve", "Ocaron", "Ocenteredtilde", "Ocircle", "Ocircumflex", "Ocircumflexacute", "Ocircumflexdotbelow", "Ocircumflexgrave", "Ocircumflexhookabove", "Ocircumflexsmall", "Ocircumflextilde", "Ocyrillic", "Odblacute", "Odblgrave", "Odieresis", "Odieresiscyrillic", "Odieresissmall", "Odotbelow", "Ogoneksmall", "Ograve", "Ogravesmall", "Oharmenian", "Ohm", "Ohookabove", "Ohorn", "Ohornacute", "Ohorndotbelow", "Ohorngrave", "Ohornhookabove", "Ohorntilde", "Ohungarumlaut", "Oi", "Oinvertedbreve", "Omacron", "Omacronacute", "Omacrongrave", "Omega", "Omegacyrillic", "Omegagreek", "Omegaroundcyrillic", "Omegatitlocyrillic", "Omegatonos", "Omicron", "Omicrontonos", "Omonospace", "Oneroman", "Oogonek", "Oogonekmacron", "Oopen", "Oslash", "Oslashacute", "Oslashsmall", "Osmall", "Ostrokeacute", "Otcyrillic", "Otilde", "Otildeacute", "Otildedieresis", "Otildesmall", "P", "Pacute", "Pcircle", "Pdotaccent", "Pecyrillic", "Peharmenian", "Pemiddlehookcyrillic", "Phi", "Phook", "Pi", "Piwrarmenian", "Pmonospace", "Psi", "Psicyrillic", "Psmall", "Q", "Qcircle", "Qmonospace", "Qsmall", "R", "Raarmenian", "Racute", "Rcaron", "Rcedilla", "Rcircle", "Rcommaaccent", "Rdblgrave", "Rdotaccent", "Rdotbelow", "Rdotbelowmacron", "Reharmenian", "Rfraktur", "Rho", "Ringsmall", "Rinvertedbreve", "Rlinebelow", "Rmonospace", "Rsmall", "Rsmallinverted", "Rsmallinvertedsuperior", "S", "SF010000", "SF020000", "SF030000", "SF040000", "SF050000", "SF060000", "SF070000", "SF080000", "SF090000", "SF100000", "SF110000", "SF190000", "SF200000", "SF210000", "SF220000", "SF230000", "SF240000", "SF250000", "SF260000", "SF270000", "SF280000", "SF360000", "SF370000", "SF380000", "SF390000", "SF400000", "SF410000", "SF420000", "SF430000", "SF440000", "SF450000", "SF460000", "SF470000", "SF480000", "SF490000", "SF500000", "SF510000", "SF520000", "SF530000", "SF540000", "Sacute", "Sacutedotaccent", "Sampigreek", "Scaron", "Scarondotaccent", "Scaronsmall", "Scedilla", "Schwa", "Schwacyrillic", "Schwadieresiscyrillic", "Scircle", "Scircumflex", "Scommaaccent", "Sdotaccent", "Sdotbelow", "Sdotbelowdotaccent", "Seharmenian", "Sevenroman", "Shaarmenian", "Shacyrillic", "Shchacyrillic", "Sheicoptic", "Shhacyrillic", "Shimacoptic", "Sigma", "Sixroman", "Smonospace", "Softsigncyrillic", "Ssmall", "Stigmagreek", "T", "Tau", "Tbar", "Tcaron", "Tcedilla", "Tcircle", "Tcircumflexbelow", "Tcommaaccent", "Tdotaccent", "Tdotbelow", "Tecyrillic", "Tedescendercyrillic", "Tenroman", "Tetsecyrillic", "Theta", "Thook", "Thorn", "Thornsmall", "Threeroman", "Tildesmall", "Tiwnarmenian", "Tlinebelow", "Tmonospace", "Toarmenian", "Tonefive", "Tonesix", "Tonetwo", "Tretroflexhook", "Tsecyrillic", "Tshecyrillic", "Tsmall", "Twelveroman", "Tworoman", "U", "Uacute", "Uacutesmall", "Ubreve", "Ucaron", "Ucircle", "Ucircumflex", "Ucircumflexbelow", "Ucircumflexsmall", "Ucyrillic", "Udblacute", "Udblgrave", "Udieresis", "Udieresisacute", "Udieresisbelow", "Udieresiscaron", "Udieresiscyrillic", "Udieresisgrave", "Udieresismacron", "Udieresissmall", "Udotbelow", "Ugrave", "Ugravesmall", "Uhookabove", "Uhorn", "Uhornacute", "Uhorndotbelow", "Uhorngrave", "Uhornhookabove", "Uhorntilde", "Uhungarumlaut", "Uhungarumlautcyrillic", "Uinvertedbreve", "Ukcyrillic", "Umacron", "Umacroncyrillic", "Umacrondieresis", "Umonospace", "Uogonek", "Upsilon", "Upsilon1", "Upsilonacutehooksymbolgreek", "Upsilonafrican", "Upsilondieresis", "Upsilondieresishooksymbolgreek", "Upsilonhooksymbol", "Upsilontonos", "Uring", "Ushortcyrillic", "Usmall", "Ustraightcyrillic", "Ustraightstrokecyrillic", "Utilde", "Utildeacute", "Utildebelow", "V", "Vcircle", "Vdotbelow", "Vecyrillic", "Vewarmenian", "Vhook", "Vmonospace", "Voarmenian", "Vsmall", "Vtilde", "W", "Wacute", "Wcircle", "Wcircumflex", "Wdieresis", "Wdotaccent", "Wdotbelow", "Wgrave", "Wmonospace", "Wsmall", "X", "Xcircle", "Xdieresis", "Xdotaccent", "Xeharmenian", "Xi", "Xmonospace", "Xsmall", "Y", "Yacute", "Yacutesmall", "Yatcyrillic", "Ycircle", "Ycircumflex", "Ydieresis", "Ydieresissmall", "Ydotaccent", "Ydotbelow", "Yericyrillic", "Yerudieresiscyrillic", "Ygrave", "Yhook", "Yhookabove", "Yiarmenian", "Yicyrillic", "Yiwnarmenian", "Ymonospace", "Ysmall", "Ytilde", "Yusbigcyrillic", "Yusbigiotifiedcyrillic", "Yuslittlecyrillic", "Yuslittleiotifiedcyrillic", "Z", "Zaarmenian", "Zacute", "Zcaron", "Zcaronsmall", "Zcircle", "Zcircumflex", "Zdot", "Zdotaccent", "Zdotbelow", "Zecyrillic", "Zedescendercyrillic", "Zedieresiscyrillic", "Zeta", "Zhearmenian", "Zhebrevecyrillic", "Zhecyrillic", "Zhedescendercyrillic", "Zhedieresiscyrillic", "Zlinebelow", "Zmonospace", "Zsmall", "Zstroke", "a", "aabengali", "aacute", "aadeva", "aagujarati", "aagurmukhi", "aamatragurmukhi", "aarusquare", "aavowelsignbengali", "aavowelsigndeva", "aavowelsigngujarati", "abbreviationmarkarmenian", "abbreviationsigndeva", "abengali", "abopomofo", "abreve", "abreveacute", "abrevecyrillic", "abrevedotbelow", "abrevegrave", "abrevehookabove", "abrevetilde", "acaron", "acircle", "acircumflex", "acircumflexacute", "acircumflexdotbelow", "acircumflexgrave", "acircumflexhookabove", "acircumflextilde", "acute", "acutebelowcmb", "acutecmb", "acutecomb", "acutedeva", "acutelowmod", "acutetonecmb", "acyrillic", "adblgrave", "addakgurmukhi", "adeva", "adieresis", "adieresiscyrillic", "adieresismacron", "adotbelow", "adotmacron", "ae", "aeacute", "aekorean", "aemacron", "afii00208", "afii08941", "afii10017", "afii10018", "afii10019", "afii10020", "afii10021", "afii10022", "afii10023", "afii10024", "afii10025", "afii10026", "afii10027", "afii10028", "afii10029", "afii10030", "afii10031", "afii10032", "afii10033", "afii10034", "afii10035", "afii10036", "afii10037", "afii10038", "afii10039", "afii10040", "afii10041", "afii10042", "afii10043", "afii10044", "afii10045", "afii10046", "afii10047", "afii10048", "afii10049", "afii10050", "afii10051", "afii10052", "afii10053", "afii10054", "afii10055", "afii10056", "afii10057", "afii10058", "afii10059", "afii10060", "afii10061", "afii10062", "afii10063", "afii10064", "afii10065", "afii10066", "afii10067", "afii10068", "afii10069", "afii10070", "afii10071", "afii10072", "afii10073", "afii10074", "afii10075", "afii10076", "afii10077", "afii10078", "afii10079", "afii10080", "afii10081", "afii10082", "afii10083", "afii10084", "afii10085", "afii10086", "afii10087", "afii10088", "afii10089", "afii10090", "afii10091", "afii10092", "afii10093", "afii10094", "afii10095", "afii10096", "afii10097", "afii10098", "afii10099", "afii10100", "afii10101", "afii10102", "afii10103", "afii10104", "afii10105", "afii10106", "afii10107", "afii10108", "afii10109", "afii10110", "afii10145", "afii10146", "afii10147", "afii10148", "afii10192", "afii10193", "afii10194", "afii10195", "afii10196", "afii10831", "afii10832", "afii10846", "afii299", "afii300", "afii301", "afii57381", "afii57388", "afii57392", "afii57393", "afii57394", "afii57395", "afii57396", "afii57397", "afii57398", "afii57399", "afii57400", "afii57401", "afii57403", "afii57407", "afii57409", "afii57410", "afii57411", "afii57412", "afii57413", "afii57414", "afii57415", "afii57416", "afii57417", "afii57418", "afii57419", "afii57420", "afii57421", "afii57422", "afii57423", "afii57424", "afii57425", "afii57426", "afii57427", "afii57428", "afii57429", "afii57430", "afii57431", "afii57432", "afii57433", "afii57434", "afii57440", "afii57441", "afii57442", "afii57443", "afii57444", "afii57445", "afii57446", "afii57448", "afii57449", "afii57450", "afii57451", "afii57452", "afii57453", "afii57454", "afii57455", "afii57456", "afii57457", "afii57458", "afii57470", "afii57505", "afii57506", "afii57507", "afii57508", "afii57509", "afii57511", "afii57512", "afii57513", "afii57514", "afii57519", "afii57534", "afii57636", "afii57645", "afii57658", "afii57664", "afii57665", "afii57666", "afii57667", "afii57668", "afii57669", "afii57670", "afii57671", "afii57672", "afii57673", "afii57674", "afii57675", "afii57676", "afii57677", "afii57678", "afii57679", "afii57680", "afii57681", "afii57682", "afii57683", "afii57684", "afii57685", "afii57686", "afii57687", "afii57688", "afii57689", "afii57690", "afii57694", "afii57695", "afii57700", "afii57705", "afii57716", "afii57717", "afii57718", "afii57723", "afii57793", "afii57794", "afii57795", "afii57796", "afii57797", "afii57798", "afii57799", "afii57800", "afii57801", "afii57802", "afii57803", "afii57804", "afii57806", "afii57807", "afii57839", "afii57841", "afii57842", "afii57929", "afii61248", "afii61289", "afii61352", "afii61573", "afii61574", "afii61575", "afii61664", "afii63167", "afii64937", "agrave", "agujarati", "agurmukhi", "ahiragana", "ahookabove", "aibengali", "aibopomofo", "aideva", "aiecyrillic", "aigujarati", "aigurmukhi", "aimatragurmukhi", "ainarabic", "ainfinalarabic", "aininitialarabic", "ainmedialarabic", "ainvertedbreve", "aivowelsignbengali", "aivowelsigndeva", "aivowelsigngujarati", "akatakana", "akatakanahalfwidth", "akorean", "alef", "alefarabic", "alefdageshhebrew", "aleffinalarabic", "alefhamzaabovearabic", "alefhamzaabovefinalarabic", "alefhamzabelowarabic", "alefhamzabelowfinalarabic", "alefhebrew", "aleflamedhebrew", "alefmaddaabovearabic", "alefmaddaabovefinalarabic", "alefmaksuraarabic", "alefmaksurafinalarabic", "alefmaksurainitialarabic", "alefmaksuramedialarabic", "alefpatahhebrew", "alefqamatshebrew", "aleph", "allequal", "alpha", "alphatonos", "amacron", "amonospace", "ampersand", "ampersandmonospace", "ampersandsmall", "amsquare", "anbopomofo", "angbopomofo", "angkhankhuthai", "angle", "anglebracketleft", "anglebracketleftvertical", "anglebracketright", "anglebracketrightvertical", "angleleft", "angleright", "angstrom", "anoteleia", "anudattadeva", "anusvarabengali", "anusvaradeva", "anusvaragujarati", "aogonek", "apaatosquare", "aparen", "apostrophearmenian", "apostrophemod", "apple", "approaches", "approxequal", "approxequalorimage", "approximatelyequal", "araeaekorean", "araeakorean", "arc", "arighthalfring", "aring", "aringacute", "aringbelow", "arrowboth", "arrowdashdown", "arrowdashleft", "arrowdashright", "arrowdashup", "arrowdblboth", "arrowdbldown", "arrowdblleft", "arrowdblright", "arrowdblup", "arrowdown", "arrowdownleft", "arrowdownright", "arrowdownwhite", "arrowheaddownmod", "arrowheadleftmod", "arrowheadrightmod", "arrowheadupmod", "arrowhorizex", "arrowleft", "arrowleftdbl", "arrowleftdblstroke", "arrowleftoverright", "arrowleftwhite", "arrowright", "arrowrightdblstroke", "arrowrightheavy", "arrowrightoverleft", "arrowrightwhite", "arrowtableft", "arrowtabright", "arrowup", "arrowupdn", "arrowupdnbse", "arrowupdownbase", "arrowupleft", "arrowupleftofdown", "arrowupright", "arrowupwhite", "arrowvertex", "asciicircum", "asciicircummonospace", "asciitilde", "asciitildemonospace", "ascript", "ascriptturned", "asmallhiragana", "asmallkatakana", "asmallkatakanahalfwidth", "asterisk", "asteriskaltonearabic", "asteriskarabic", "asteriskmath", "asteriskmonospace", "asterisksmall", "asterism", "asuperior", "asymptoticallyequal", "at", "atilde", "atmonospace", "atsmall", "aturned", "aubengali", "aubopomofo", "audeva", "augujarati", "augurmukhi", "aulengthmarkbengali", "aumatragurmukhi", "auvowelsignbengali", "auvowelsigndeva", "auvowelsigngujarati", "avagrahadeva", "aybarmenian", "ayin", "ayinaltonehebrew", "ayinhebrew", "b", "babengali", "backslash", "backslashmonospace", "badeva", "bagujarati", "bagurmukhi", "bahiragana", "bahtthai", "bakatakana", "bar", "barmonospace", "bbopomofo", "bcircle", "bdotaccent", "bdotbelow", "beamedsixteenthnotes", "because", "becyrillic", "beharabic", "behfinalarabic", "behinitialarabic", "behiragana", "behmedialarabic", "behmeeminitialarabic", "behmeemisolatedarabic", "behnoonfinalarabic", "bekatakana", "benarmenian", "bet", "beta", "betasymbolgreek", "betdagesh", "betdageshhebrew", "bethebrew", "betrafehebrew", "bhabengali", "bhadeva", "bhagujarati", "bhagurmukhi", "bhook", "bihiragana", "bikatakana", "bilabialclick", "bindigurmukhi", "birusquare", "blackcircle", "blackdiamond", "blackdownpointingtriangle", "blackleftpointingpointer", "blackleftpointingtriangle", "blacklenticularbracketleft", "blacklenticularbracketleftvertical", "blacklenticularbracketright", "blacklenticularbracketrightvertical", "blacklowerlefttriangle", "blacklowerrighttriangle", "blackrectangle", "blackrightpointingpointer", "blackrightpointingtriangle", "blacksmallsquare", "blacksmilingface", "blacksquare", "blackstar", "blackupperlefttriangle", "blackupperrighttriangle", "blackuppointingsmalltriangle", "blackuppointingtriangle", "blank", "blinebelow", "block", "bmonospace", "bobaimaithai", "bohiragana", "bokatakana", "bparen", "bqsquare", "braceex", "braceleft", "braceleftbt", "braceleftmid", "braceleftmonospace", "braceleftsmall", "bracelefttp", "braceleftvertical", "braceright", "bracerightbt", "bracerightmid", "bracerightmonospace", "bracerightsmall", "bracerighttp", "bracerightvertical", "bracketleft", "bracketleftbt", "bracketleftex", "bracketleftmonospace", "bracketlefttp", "bracketright", "bracketrightbt", "bracketrightex", "bracketrightmonospace", "bracketrighttp", "breve", "brevebelowcmb", "brevecmb", "breveinvertedbelowcmb", "breveinvertedcmb", "breveinverteddoublecmb", "bridgebelowcmb", "bridgeinvertedbelowcmb", "brokenbar", "bstroke", "bsuperior", "btopbar", "buhiragana", "bukatakana", "bullet", "bulletinverse", "bulletoperator", "bullseye", "c", "caarmenian", "cabengali", "cacute", "cadeva", "cagujarati", "cagurmukhi", "calsquare", "candrabindubengali", "candrabinducmb", "candrabindudeva", "candrabindugujarati", "capslock", "careof", "caron", "caronbelowcmb", "caroncmb", "carriagereturn", "cbopomofo", "ccaron", "ccedilla", "ccedillaacute", "ccircle", "ccircumflex", "ccurl", "cdot", "cdotaccent", "cdsquare", "cedilla", "cedillacmb", "cent", "centigrade", "centinferior", "centmonospace", "centoldstyle", "centsuperior", "chaarmenian", "chabengali", "chadeva", "chagujarati", "chagurmukhi", "chbopomofo", "cheabkhasiancyrillic", "checkmark", "checyrillic", "chedescenderabkhasiancyrillic", "chedescendercyrillic", "chedieresiscyrillic", "cheharmenian", "chekhakassiancyrillic", "cheverticalstrokecyrillic", "chi", "chieuchacirclekorean", "chieuchaparenkorean", "chieuchcirclekorean", "chieuchkorean", "chieuchparenkorean", "chochangthai", "chochanthai", "chochingthai", "chochoethai", "chook", "cieucacirclekorean", "cieucaparenkorean", "cieuccirclekorean", "cieuckorean", "cieucparenkorean", "cieucuparenkorean", "circle", "circlemultiply", "circleot", "circleplus", "circlepostalmark", "circlewithlefthalfblack", "circlewithrighthalfblack", "circumflex", "circumflexbelowcmb", "circumflexcmb", "clear", "clickalveolar", "clickdental", "clicklateral", "clickretroflex", "club", "clubsuitblack", "clubsuitwhite", "cmcubedsquare", "cmonospace", "cmsquaredsquare", "coarmenian", "colon", "colonmonetary", "colonmonospace", "colonsign", "colonsmall", "colontriangularhalfmod", "colontriangularmod", "comma", "commaabovecmb", "commaaboverightcmb", "commaaccent", "commaarabic", "commaarmenian", "commainferior", "commamonospace", "commareversedabovecmb", "commareversedmod", "commasmall", "commasuperior", "commaturnedabovecmb", "commaturnedmod", "compass", "congruent", "contourintegral", "control", "controlACK", "controlBEL", "controlBS", "controlCAN", "controlCR", "controlDC1", "controlDC2", "controlDC3", "controlDC4", "controlDEL", "controlDLE", "controlEM", "controlENQ", "controlEOT", "controlESC", "controlETB", "controlETX", "controlFF", "controlFS", "controlGS", "controlHT", "controlLF", "controlNAK", "controlRS", "controlSI", "controlSO", "controlSOT", "controlSTX", "controlSUB", "controlSYN", "controlUS", "controlVT", "copyright", "copyrightsans", "copyrightserif", "cornerbracketleft", "cornerbracketlefthalfwidth", "cornerbracketleftvertical", "cornerbracketright", "cornerbracketrighthalfwidth", "cornerbracketrightvertical", "corporationsquare", "cosquare", "coverkgsquare", "cparen", "cruzeiro", "cstretched", "curlyand", "curlyor", "currency", "cyrBreve", "cyrFlex", "cyrbreve", "cyrflex", "d", "daarmenian", "dabengali", "dadarabic", "dadeva", "dadfinalarabic", "dadinitialarabic", "dadmedialarabic", "dagesh", "dageshhebrew", "dagger", "daggerdbl", "dagujarati", "dagurmukhi", "dahiragana", "dakatakana", "dalarabic", "dalet", "daletdagesh", "daletdageshhebrew", "dalethebrew", "dalfinalarabic", "dammaarabic", "dammalowarabic", "dammatanaltonearabic", "dammatanarabic", "danda", "dargahebrew", "dargalefthebrew", "dasiapneumatacyrilliccmb", "dblGrave", "dblanglebracketleft", "dblanglebracketleftvertical", "dblanglebracketright", "dblanglebracketrightvertical", "dblarchinvertedbelowcmb", "dblarrowleft", "dblarrowright", "dbldanda", "dblgrave", "dblgravecmb", "dblintegral", "dbllowline", "dbllowlinecmb", "dbloverlinecmb", "dblprimemod", "dblverticalbar", "dblverticallineabovecmb", "dbopomofo", "dbsquare", "dcaron", "dcedilla", "dcircle", "dcircumflexbelow", "dcroat", "ddabengali", "ddadeva", "ddagujarati", "ddagurmukhi", "ddalarabic", "ddalfinalarabic", "dddhadeva", "ddhabengali", "ddhadeva", "ddhagujarati", "ddhagurmukhi", "ddotaccent", "ddotbelow", "decimalseparatorarabic", "decimalseparatorpersian", "decyrillic", "degree", "dehihebrew", "dehiragana", "deicoptic", "dekatakana", "deleteleft", "deleteright", "delta", "deltaturned", "denominatorminusonenumeratorbengali", "dezh", "dhabengali", "dhadeva", "dhagujarati", "dhagurmukhi", "dhook", "dialytikatonos", "dialytikatonoscmb", "diamond", "diamondsuitwhite", "dieresis", "dieresisacute", "dieresisbelowcmb", "dieresiscmb", "dieresisgrave", "dieresistonos", "dihiragana", "dikatakana", "dittomark", "divide", "divides", "divisionslash", "djecyrillic", "dkshade", "dlinebelow", "dlsquare", "dmacron", "dmonospace", "dnblock", "dochadathai", "dodekthai", "dohiragana", "dokatakana", "dollar", "dollarinferior", "dollarmonospace", "dollaroldstyle", "dollarsmall", "dollarsuperior", "dong", "dorusquare", "dotaccent", "dotaccentcmb", "dotbelowcmb", "dotbelowcomb", "dotkatakana", "dotlessi", "dotlessj", "dotlessjstrokehook", "dotmath", "dottedcircle", "doubleyodpatah", "doubleyodpatahhebrew", "downtackbelowcmb", "downtackmod", "dparen", "dsuperior", "dtail", "dtopbar", "duhiragana", "dukatakana", "dz", "dzaltone", "dzcaron", "dzcurl", "dzeabkhasiancyrillic", "dzecyrillic", "dzhecyrillic", "e", "eacute", "earth", "ebengali", "ebopomofo", "ebreve", "ecandradeva", "ecandragujarati", "ecandravowelsigndeva", "ecandravowelsigngujarati", "ecaron", "ecedillabreve", "echarmenian", "echyiwnarmenian", "ecircle", "ecircumflex", "ecircumflexacute", "ecircumflexbelow", "ecircumflexdotbelow", "ecircumflexgrave", "ecircumflexhookabove", "ecircumflextilde", "ecyrillic", "edblgrave", "edeva", "edieresis", "edot", "edotaccent", "edotbelow", "eegurmukhi", "eematragurmukhi", "efcyrillic", "egrave", "egujarati", "eharmenian", "ehbopomofo", "ehiragana", "ehookabove", "eibopomofo", "eight", "eightarabic", "eightbengali", "eightcircle", "eightcircleinversesansserif", "eightdeva", "eighteencircle", "eighteenparen", "eighteenperiod", "eightgujarati", "eightgurmukhi", "eighthackarabic", "eighthangzhou", "eighthnotebeamed", "eightideographicparen", "eightinferior", "eightmonospace", "eightoldstyle", "eightparen", "eightperiod", "eightpersian", "eightroman", "eightsuperior", "eightthai", "einvertedbreve", "eiotifiedcyrillic", "ekatakana", "ekatakanahalfwidth", "ekonkargurmukhi", "ekorean", "elcyrillic", "element", "elevencircle", "elevenparen", "elevenperiod", "elevenroman", "ellipsis", "ellipsisvertical", "emacron", "emacronacute", "emacrongrave", "emcyrillic", "emdash", "emdashvertical", "emonospace", "emphasismarkarmenian", "emptyset", "enbopomofo", "encyrillic", "endash", "endashvertical", "endescendercyrillic", "eng", "engbopomofo", "enghecyrillic", "enhookcyrillic", "enspace", "eogonek", "eokorean", "eopen", "eopenclosed", "eopenreversed", "eopenreversedclosed", "eopenreversedhook", "eparen", "epsilon", "epsilontonos", "equal", "equalmonospace", "equalsmall", "equalsuperior", "equivalence", "erbopomofo", "ercyrillic", "ereversed", "ereversedcyrillic", "escyrillic", "esdescendercyrillic", "esh", "eshcurl", "eshortdeva", "eshortvowelsigndeva", "eshreversedloop", "eshsquatreversed", "esmallhiragana", "esmallkatakana", "esmallkatakanahalfwidth", "estimated", "esuperior", "eta", "etarmenian", "etatonos", "eth", "etilde", "etildebelow", "etnahtafoukhhebrew", "etnahtafoukhlefthebrew", "etnahtahebrew", "etnahtalefthebrew", "eturned", "eukorean", "euro", "evowelsignbengali", "evowelsigndeva", "evowelsigngujarati", "exclam", "exclamarmenian", "exclamdbl", "exclamdown", "exclamdownsmall", "exclammonospace", "exclamsmall", "existential", "ezh", "ezhcaron", "ezhcurl", "ezhreversed", "ezhtail", "f", "fadeva", "fagurmukhi", "fahrenheit", "fathaarabic", "fathalowarabic", "fathatanarabic", "fbopomofo", "fcircle", "fdotaccent", "feharabic", "feharmenian", "fehfinalarabic", "fehinitialarabic", "fehmedialarabic", "feicoptic", "female", "ff", "ffi", "ffl", "fi", "fifteencircle", "fifteenparen", "fifteenperiod", "figuredash", "filledbox", "filledrect", "finalkaf", "finalkafdagesh", "finalkafdageshhebrew", "finalkafhebrew", "finalmem", "finalmemhebrew", "finalnun", "finalnunhebrew", "finalpe", "finalpehebrew", "finaltsadi", "finaltsadihebrew", "firsttonechinese", "fisheye", "fitacyrillic", "five", "fivearabic", "fivebengali", "fivecircle", "fivecircleinversesansserif", "fivedeva", "fiveeighths", "fivegujarati", "fivegurmukhi", "fivehackarabic", "fivehangzhou", "fiveideographicparen", "fiveinferior", "fivemonospace", "fiveoldstyle", "fiveparen", "fiveperiod", "fivepersian", "fiveroman", "fivesuperior", "fivethai", "fl", "florin", "fmonospace", "fmsquare", "fofanthai", "fofathai", "fongmanthai", "forall", "four", "fourarabic", "fourbengali", "fourcircle", "fourcircleinversesansserif", "fourdeva", "fourgujarati", "fourgurmukhi", "fourhackarabic", "fourhangzhou", "fourideographicparen", "fourinferior", "fourmonospace", "fournumeratorbengali", "fouroldstyle", "fourparen", "fourperiod", "fourpersian", "fourroman", "foursuperior", "fourteencircle", "fourteenparen", "fourteenperiod", "fourthai", "fourthtonechinese", "fparen", "fraction", "franc", "g", "gabengali", "gacute", "gadeva", "gafarabic", "gaffinalarabic", "gafinitialarabic", "gafmedialarabic", "gagujarati", "gagurmukhi", "gahiragana", "gakatakana", "gamma", "gammalatinsmall", "gammasuperior", "gangiacoptic", "gbopomofo", "gbreve", "gcaron", "gcedilla", "gcircle", "gcircumflex", "gcommaaccent", "gdot", "gdotaccent", "gecyrillic", "gehiragana", "gekatakana", "geometricallyequal", "gereshaccenthebrew", "gereshhebrew", "gereshmuqdamhebrew", "germandbls", "gershayimaccenthebrew", "gershayimhebrew", "getamark", "ghabengali", "ghadarmenian", "ghadeva", "ghagujarati", "ghagurmukhi", "ghainarabic", "ghainfinalarabic", "ghaininitialarabic", "ghainmedialarabic", "ghemiddlehookcyrillic", "ghestrokecyrillic", "gheupturncyrillic", "ghhadeva", "ghhagurmukhi", "ghook", "ghzsquare", "gihiragana", "gikatakana", "gimarmenian", "gimel", "gimeldagesh", "gimeldageshhebrew", "gimelhebrew", "gjecyrillic", "glottalinvertedstroke", "glottalstop", "glottalstopinverted", "glottalstopmod", "glottalstopreversed", "glottalstopreversedmod", "glottalstopreversedsuperior", "glottalstopstroke", "glottalstopstrokereversed", "gmacron", "gmonospace", "gohiragana", "gokatakana", "gparen", "gpasquare", "gradient", "grave", "gravebelowcmb", "gravecmb", "gravecomb", "gravedeva", "gravelowmod", "gravemonospace", "gravetonecmb", "greater", "greaterequal", "greaterequalorless", "greatermonospace", "greaterorequivalent", "greaterorless", "greateroverequal", "greatersmall", "gscript", "gstroke", "guhiragana", "guillemotleft", "guillemotright", "guilsinglleft", "guilsinglright", "gukatakana", "guramusquare", "gysquare", "h", "haabkhasiancyrillic", "haaltonearabic", "habengali", "hadescendercyrillic", "hadeva", "hagujarati", "hagurmukhi", "haharabic", "hahfinalarabic", "hahinitialarabic", "hahiragana", "hahmedialarabic", "haitusquare", "hakatakana", "hakatakanahalfwidth", "halantgurmukhi", "hamzaarabic", "hamzalowarabic", "hangulfiller", "hardsigncyrillic", "harpoonleftbarbup", "harpoonrightbarbup", "hasquare", "hatafpatah", "hatafpatah16", "hatafpatah23", "hatafpatah2f", "hatafpatahhebrew", "hatafpatahnarrowhebrew", "hatafpatahquarterhebrew", "hatafpatahwidehebrew", "hatafqamats", "hatafqamats1b", "hatafqamats28", "hatafqamats34", "hatafqamatshebrew", "hatafqamatsnarrowhebrew", "hatafqamatsquarterhebrew", "hatafqamatswidehebrew", "hatafsegol", "hatafsegol17", "hatafsegol24", "hatafsegol30", "hatafsegolhebrew", "hatafsegolnarrowhebrew", "hatafsegolquarterhebrew", "hatafsegolwidehebrew", "hbar", "hbopomofo", "hbrevebelow", "hcedilla", "hcircle", "hcircumflex", "hdieresis", "hdotaccent", "hdotbelow", "he", "heart", "heartsuitblack", "heartsuitwhite", "hedagesh", "hedageshhebrew", "hehaltonearabic", "heharabic", "hehebrew", "hehfinalaltonearabic", "hehfinalalttwoarabic", "hehfinalarabic", "hehhamzaabovefinalarabic", "hehhamzaaboveisolatedarabic", "hehinitialaltonearabic", "hehinitialarabic", "hehiragana", "hehmedialaltonearabic", "hehmedialarabic", "heiseierasquare", "hekatakana", "hekatakanahalfwidth", "hekutaarusquare", "henghook", "herutusquare", "het", "hethebrew", "hhook", "hhooksuperior", "hieuhacirclekorean", "hieuhaparenkorean", "hieuhcirclekorean", "hieuhkorean", "hieuhparenkorean", "hihiragana", "hikatakana", "hikatakanahalfwidth", "hiriq", "hiriq14", "hiriq21", "hiriq2d", "hiriqhebrew", "hiriqnarrowhebrew", "hiriqquarterhebrew", "hiriqwidehebrew", "hlinebelow", "hmonospace", "hoarmenian", "hohipthai", "hohiragana", "hokatakana", "hokatakanahalfwidth", "holam", "holam19", "holam26", "holam32", "holamhebrew", "holamnarrowhebrew", "holamquarterhebrew", "holamwidehebrew", "honokhukthai", "hookabovecomb", "hookcmb", "hookpalatalizedbelowcmb", "hookretroflexbelowcmb", "hoonsquare", "horicoptic", "horizontalbar", "horncmb", "hotsprings", "house", "hparen", "hsuperior", "hturned", "huhiragana", "huiitosquare", "hukatakana", "hukatakanahalfwidth", "hungarumlaut", "hungarumlautcmb", "hv", "hyphen", "hypheninferior", "hyphenmonospace", "hyphensmall", "hyphensuperior", "hyphentwo", "i", "iacute", "iacyrillic", "ibengali", "ibopomofo", "ibreve", "icaron", "icircle", "icircumflex", "icyrillic", "idblgrave", "ideographearthcircle", "ideographfirecircle", "ideographicallianceparen", "ideographiccallparen", "ideographiccentrecircle", "ideographicclose", "ideographiccomma", "ideographiccommaleft", "ideographiccongratulationparen", "ideographiccorrectcircle", "ideographicearthparen", "ideographicenterpriseparen", "ideographicexcellentcircle", "ideographicfestivalparen", "ideographicfinancialcircle", "ideographicfinancialparen", "ideographicfireparen", "ideographichaveparen", "ideographichighcircle", "ideographiciterationmark", "ideographiclaborcircle", "ideographiclaborparen", "ideographicleftcircle", "ideographiclowcircle", "ideographicmedicinecircle", "ideographicmetalparen", "ideographicmoonparen", "ideographicnameparen", "ideographicperiod", "ideographicprintcircle", "ideographicreachparen", "ideographicrepresentparen", "ideographicresourceparen", "ideographicrightcircle", "ideographicsecretcircle", "ideographicselfparen", "ideographicsocietyparen", "ideographicspace", "ideographicspecialparen", "ideographicstockparen", "ideographicstudyparen", "ideographicsunparen", "ideographicsuperviseparen", "ideographicwaterparen", "ideographicwoodparen", "ideographiczero", "ideographmetalcircle", "ideographmooncircle", "ideographnamecircle", "ideographsuncircle", "ideographwatercircle", "ideographwoodcircle", "ideva", "idieresis", "idieresisacute", "idieresiscyrillic", "idotbelow", "iebrevecyrillic", "iecyrillic", "ieungacirclekorean", "ieungaparenkorean", "ieungcirclekorean", "ieungkorean", "ieungparenkorean", "igrave", "igujarati", "igurmukhi", "ihiragana", "ihookabove", "iibengali", "iicyrillic", "iideva", "iigujarati", "iigurmukhi", "iimatragurmukhi", "iinvertedbreve", "iishortcyrillic", "iivowelsignbengali", "iivowelsigndeva", "iivowelsigngujarati", "ij", "ikatakana", "ikatakanahalfwidth", "ikorean", "ilde", "iluyhebrew", "imacron", "imacroncyrillic", "imageorapproximatelyequal", "imatragurmukhi", "imonospace", "increment", "infinity", "iniarmenian", "integral", "integralbottom", "integralbt", "integralex", "integraltop", "integraltp", "intersection", "intisquare", "invbullet", "invcircle", "invsmileface", "iocyrillic", "iogonek", "iota", "iotadieresis", "iotadieresistonos", "iotalatin", "iotatonos", "iparen", "irigurmukhi", "ismallhiragana", "ismallkatakana", "ismallkatakanahalfwidth", "issharbengali", "istroke", "isuperior", "iterationhiragana", "iterationkatakana", "itilde", "itildebelow", "iubopomofo", "iucyrillic", "ivowelsignbengali", "ivowelsigndeva", "ivowelsigngujarati", "izhitsacyrillic", "izhitsadblgravecyrillic", "j", "jaarmenian", "jabengali", "jadeva", "jagujarati", "jagurmukhi", "jbopomofo", "jcaron", "jcircle", "jcircumflex", "jcrossedtail", "jdotlessstroke", "jecyrillic", "jeemarabic", "jeemfinalarabic", "jeeminitialarabic", "jeemmedialarabic", "jeharabic", "jehfinalarabic", "jhabengali", "jhadeva", "jhagujarati", "jhagurmukhi", "jheharmenian", "jis", "jmonospace", "jparen", "jsuperior", "k", "kabashkircyrillic", "kabengali", "kacute", "kacyrillic", "kadescendercyrillic", "kadeva", "kaf", "kafarabic", "kafdagesh", "kafdageshhebrew", "kaffinalarabic", "kafhebrew", "kafinitialarabic", "kafmedialarabic", "kafrafehebrew", "kagujarati", "kagurmukhi", "kahiragana", "kahookcyrillic", "kakatakana", "kakatakanahalfwidth", "kappa", "kappasymbolgreek", "kapyeounmieumkorean", "kapyeounphieuphkorean", "kapyeounpieupkorean", "kapyeounssangpieupkorean", "karoriisquare", "kashidaautoarabic", "kashidaautonosidebearingarabic", "kasmallkatakana", "kasquare", "kasraarabic", "kasratanarabic", "kastrokecyrillic", "katahiraprolongmarkhalfwidth", "kaverticalstrokecyrillic", "kbopomofo", "kcalsquare", "kcaron", "kcedilla", "kcircle", "kcommaaccent", "kdotbelow", "keharmenian", "kehiragana", "kekatakana", "kekatakanahalfwidth", "kenarmenian", "kesmallkatakana", "kgreenlandic", "khabengali", "khacyrillic", "khadeva", "khagujarati", "khagurmukhi", "khaharabic", "khahfinalarabic", "khahinitialarabic", "khahmedialarabic", "kheicoptic", "khhadeva", "khhagurmukhi", "khieukhacirclekorean", "khieukhaparenkorean", "khieukhcirclekorean", "khieukhkorean", "khieukhparenkorean", "khokhaithai", "khokhonthai", "khokhuatthai", "khokhwaithai", "khomutthai", "khook", "khorakhangthai", "khzsquare", "kihiragana", "kikatakana", "kikatakanahalfwidth", "kiroguramusquare", "kiromeetorusquare", "kirosquare", "kiyeokacirclekorean", "kiyeokaparenkorean", "kiyeokcirclekorean", "kiyeokkorean", "kiyeokparenkorean", "kiyeoksioskorean", "kjecyrillic", "klinebelow", "klsquare", "kmcubedsquare", "kmonospace", "kmsquaredsquare", "kohiragana", "kohmsquare", "kokaithai", "kokatakana", "kokatakanahalfwidth", "kooposquare", "koppacyrillic", "koreanstandardsymbol", "koroniscmb", "kparen", "kpasquare", "ksicyrillic", "ktsquare", "kturned", "kuhiragana", "kukatakana", "kukatakanahalfwidth", "kvsquare", "kwsquare", "l", "labengali", "lacute", "ladeva", "lagujarati", "lagurmukhi", "lakkhangyaothai", "lamaleffinalarabic", "lamalefhamzaabovefinalarabic", "lamalefhamzaaboveisolatedarabic", "lamalefhamzabelowfinalarabic", "lamalefhamzabelowisolatedarabic", "lamalefisolatedarabic", "lamalefmaddaabovefinalarabic", "lamalefmaddaaboveisolatedarabic", "lamarabic", "lambda", "lambdastroke", "lamed", "lameddagesh", "lameddageshhebrew", "lamedhebrew", "lamfinalarabic", "lamhahinitialarabic", "laminitialarabic", "lamjeeminitialarabic", "lamkhahinitialarabic", "lamlamhehisolatedarabic", "lammedialarabic", "lammeemhahinitialarabic", "lammeeminitialarabic", "largecircle", "lbar", "lbelt", "lbopomofo", "lcaron", "lcedilla", "lcircle", "lcircumflexbelow", "lcommaaccent", "ldot", "ldotaccent", "ldotbelow", "ldotbelowmacron", "leftangleabovecmb", "lefttackbelowcmb", "less", "lessequal", "lessequalorgreater", "lessmonospace", "lessorequivalent", "lessorgreater", "lessoverequal", "lesssmall", "lezh", "lfblock", "lhookretroflex", "lira", "liwnarmenian", "lj", "ljecyrillic", "ll", "lladeva", "llagujarati", "llinebelow", "llladeva", "llvocalicbengali", "llvocalicdeva", "llvocalicvowelsignbengali", "llvocalicvowelsigndeva", "lmiddletilde", "lmonospace", "lmsquare", "lochulathai", "logicaland", "logicalnot", "logicalnotreversed", "logicalor", "lolingthai", "longs", "lowlinecenterline", "lowlinecmb", "lowlinedashed", "lozenge", "lparen", "lslash", "lsquare", "lsuperior", "ltshade", "luthai", "lvocalicbengali", "lvocalicdeva", "lvocalicvowelsignbengali", "lvocalicvowelsigndeva", "lxsquare", "m", "mabengali", "macron", "macronbelowcmb", "macroncmb", "macronlowmod", "macronmonospace", "macute", "madeva", "magujarati", "magurmukhi", "mahapakhhebrew", "mahapakhlefthebrew", "mahiragana", "maichattawalowleftthai", "maichattawalowrightthai", "maichattawathai", "maichattawaupperleftthai", "maieklowleftthai", "maieklowrightthai", "maiekthai", "maiekupperleftthai", "maihanakatleftthai", "maihanakatthai", "maitaikhuleftthai", "maitaikhuthai", "maitholowleftthai", "maitholowrightthai", "maithothai", "maithoupperleftthai", "maitrilowleftthai", "maitrilowrightthai", "maitrithai", "maitriupperleftthai", "maiyamokthai", "makatakana", "makatakanahalfwidth", "male", "mansyonsquare", "maqafhebrew", "mars", "masoracirclehebrew", "masquare", "mbopomofo", "mbsquare", "mcircle", "mcubedsquare", "mdotaccent", "mdotbelow", "meemarabic", "meemfinalarabic", "meeminitialarabic", "meemmedialarabic", "meemmeeminitialarabic", "meemmeemisolatedarabic", "meetorusquare", "mehiragana", "meizierasquare", "mekatakana", "mekatakanahalfwidth", "mem", "memdagesh", "memdageshhebrew", "memhebrew", "menarmenian", "merkhahebrew", "merkhakefulahebrew", "merkhakefulalefthebrew", "merkhalefthebrew", "mhook", "mhzsquare", "middledotkatakanahalfwidth", "middot", "mieumacirclekorean", "mieumaparenkorean", "mieumcirclekorean", "mieumkorean", "mieumpansioskorean", "mieumparenkorean", "mieumpieupkorean", "mieumsioskorean", "mihiragana", "mikatakana", "mikatakanahalfwidth", "minus", "minusbelowcmb", "minuscircle", "minusmod", "minusplus", "minute", "miribaarusquare", "mirisquare", "mlonglegturned", "mlsquare", "mmcubedsquare", "mmonospace", "mmsquaredsquare", "mohiragana", "mohmsquare", "mokatakana", "mokatakanahalfwidth", "molsquare", "momathai", "moverssquare", "moverssquaredsquare", "mparen", "mpasquare", "mssquare", "msuperior", "mturned", "mu", "mu1", "muasquare", "muchgreater", "muchless", "mufsquare", "mugreek", "mugsquare", "muhiragana", "mukatakana", "mukatakanahalfwidth", "mulsquare", "multiply", "mumsquare", "munahhebrew", "munahlefthebrew", "musicalnote", "musicalnotedbl", "musicflatsign", "musicsharpsign", "mussquare", "muvsquare", "muwsquare", "mvmegasquare", "mvsquare", "mwmegasquare", "mwsquare", "n", "nabengali", "nabla", "nacute", "nadeva", "nagujarati", "nagurmukhi", "nahiragana", "nakatakana", "nakatakanahalfwidth", "napostrophe", "nasquare", "nbopomofo", "nbspace", "ncaron", "ncedilla", "ncircle", "ncircumflexbelow", "ncommaaccent", "ndotaccent", "ndotbelow", "nehiragana", "nekatakana", "nekatakanahalfwidth", "newsheqelsign", "nfsquare", "ngabengali", "ngadeva", "ngagujarati", "ngagurmukhi", "ngonguthai", "nhiragana", "nhookleft", "nhookretroflex", "nieunacirclekorean", "nieunaparenkorean", "nieuncieuckorean", "nieuncirclekorean", "nieunhieuhkorean", "nieunkorean", "nieunpansioskorean", "nieunparenkorean", "nieunsioskorean", "nieuntikeutkorean", "nihiragana", "nikatakana", "nikatakanahalfwidth", "nikhahitleftthai", "nikhahitthai", "nine", "ninearabic", "ninebengali", "ninecircle", "ninecircleinversesansserif", "ninedeva", "ninegujarati", "ninegurmukhi", "ninehackarabic", "ninehangzhou", "nineideographicparen", "nineinferior", "ninemonospace", "nineoldstyle", "nineparen", "nineperiod", "ninepersian", "nineroman", "ninesuperior", "nineteencircle", "nineteenparen", "nineteenperiod", "ninethai", "nj", "njecyrillic", "nkatakana", "nkatakanahalfwidth", "nlegrightlong", "nlinebelow", "nmonospace", "nmsquare", "nnabengali", "nnadeva", "nnagujarati", "nnagurmukhi", "nnnadeva", "nohiragana", "nokatakana", "nokatakanahalfwidth", "nonbreakingspace", "nonenthai", "nonmarkingreturn", "nonuthai", "noonarabic", "noonfinalarabic", "noonghunnaarabic", "noonghunnafinalarabic", "nooninitialarabic", "noonjeeminitialarabic", "noonjeemisolatedarabic", "noonmedialarabic", "noonmeeminitialarabic", "noonmeemisolatedarabic", "noonnoonfinalarabic", "notcontains", "notelement", "notelementof", "notequal", "notgreater", "notgreaternorequal", "notgreaternorless", "notidentical", "notless", "notlessnorequal", "notparallel", "notprecedes", "notsubset", "notsucceeds", "notsuperset", "nowarmenian", "nparen", "nssquare", "nsuperior", "ntilde", "nu", "nuhiragana", "nukatakana", "nukatakanahalfwidth", "nuktabengali", "nuktadeva", "nuktagujarati", "nuktagurmukhi", "numbersign", "numbersignmonospace", "numbersignsmall", "numeralsigngreek", "numeralsignlowergreek", "numero", "nun", "nundagesh", "nundageshhebrew", "nunhebrew", "nvsquare", "nwsquare", "nyabengali", "nyadeva", "nyagujarati", "nyagurmukhi", "o", "oacute", "oangthai", "obarred", "obarredcyrillic", "obarreddieresiscyrillic", "obengali", "obopomofo", "obreve", "ocandradeva", "ocandragujarati", "ocandravowelsigndeva", "ocandravowelsigngujarati", "ocaron", "ocircle", "ocircumflex", "ocircumflexacute", "ocircumflexdotbelow", "ocircumflexgrave", "ocircumflexhookabove", "ocircumflextilde", "ocyrillic", "odblacute", "odblgrave", "odeva", "odieresis", "odieresiscyrillic", "odotbelow", "oe", "oekorean", "ogonek", "ogonekcmb", "ograve", "ogujarati", "oharmenian", "ohiragana", "ohookabove", "ohorn", "ohornacute", "ohorndotbelow", "ohorngrave", "ohornhookabove", "ohorntilde", "ohungarumlaut", "oi", "oinvertedbreve", "okatakana", "okatakanahalfwidth", "okorean", "olehebrew", "omacron", "omacronacute", "omacrongrave", "omdeva", "omega", "omega1", "omegacyrillic", "omegalatinclosed", "omegaroundcyrillic", "omegatitlocyrillic", "omegatonos", "omgujarati", "omicron", "omicrontonos", "omonospace", "one", "onearabic", "onebengali", "onecircle", "onecircleinversesansserif", "onedeva", "onedotenleader", "oneeighth", "onefitted", "onegujarati", "onegurmukhi", "onehackarabic", "onehalf", "onehangzhou", "oneideographicparen", "oneinferior", "onemonospace", "onenumeratorbengali", "oneoldstyle", "oneparen", "oneperiod", "onepersian", "onequarter", "oneroman", "onesuperior", "onethai", "onethird", "oogonek", "oogonekmacron", "oogurmukhi", "oomatragurmukhi", "oopen", "oparen", "openbullet", "option", "ordfeminine", "ordmasculine", "orthogonal", "oshortdeva", "oshortvowelsigndeva", "oslash", "oslashacute", "osmallhiragana", "osmallkatakana", "osmallkatakanahalfwidth", "ostrokeacute", "osuperior", "otcyrillic", "otilde", "otildeacute", "otildedieresis", "oubopomofo", "overline", "overlinecenterline", "overlinecmb", "overlinedashed", "overlinedblwavy", "overlinewavy", "overscore", "ovowelsignbengali", "ovowelsigndeva", "ovowelsigngujarati", "p", "paampssquare", "paasentosquare", "pabengali", "pacute", "padeva", "pagedown", "pageup", "pagujarati", "pagurmukhi", "pahiragana", "paiyannoithai", "pakatakana", "palatalizationcyrilliccmb", "palochkacyrillic", "pansioskorean", "paragraph", "parallel", "parenleft", "parenleftaltonearabic", "parenleftbt", "parenleftex", "parenleftinferior", "parenleftmonospace", "parenleftsmall", "parenleftsuperior", "parenlefttp", "parenleftvertical", "parenright", "parenrightaltonearabic", "parenrightbt", "parenrightex", "parenrightinferior", "parenrightmonospace", "parenrightsmall", "parenrightsuperior", "parenrighttp", "parenrightvertical", "partialdiff", "paseqhebrew", "pashtahebrew", "pasquare", "patah", "patah11", "patah1d", "patah2a", "patahhebrew", "patahnarrowhebrew", "patahquarterhebrew", "patahwidehebrew", "pazerhebrew", "pbopomofo", "pcircle", "pdotaccent", "pe", "pecyrillic", "pedagesh", "pedageshhebrew", "peezisquare", "pefinaldageshhebrew", "peharabic", "peharmenian", "pehebrew", "pehfinalarabic", "pehinitialarabic", "pehiragana", "pehmedialarabic", "pekatakana", "pemiddlehookcyrillic", "perafehebrew", "percent", "percentarabic", "percentmonospace", "percentsmall", "period", "periodarmenian", "periodcentered", "periodhalfwidth", "periodinferior", "periodmonospace", "periodsmall", "periodsuperior", "perispomenigreekcmb", "perpendicular", "perthousand", "peseta", "pfsquare", "phabengali", "phadeva", "phagujarati", "phagurmukhi", "phi", "phi1", "phieuphacirclekorean", "phieuphaparenkorean", "phieuphcirclekorean", "phieuphkorean", "phieuphparenkorean", "philatin", "phinthuthai", "phisymbolgreek", "phook", "phophanthai", "phophungthai", "phosamphaothai", "pi", "pieupacirclekorean", "pieupaparenkorean", "pieupcieuckorean", "pieupcirclekorean", "pieupkiyeokkorean", "pieupkorean", "pieupparenkorean", "pieupsioskiyeokkorean", "pieupsioskorean", "pieupsiostikeutkorean", "pieupthieuthkorean", "pieuptikeutkorean", "pihiragana", "pikatakana", "pisymbolgreek", "piwrarmenian", "plus", "plusbelowcmb", "pluscircle", "plusminus", "plusmod", "plusmonospace", "plussmall", "plussuperior", "pmonospace", "pmsquare", "pohiragana", "pointingindexdownwhite", "pointingindexleftwhite", "pointingindexrightwhite", "pointingindexupwhite", "pokatakana", "poplathai", "postalmark", "postalmarkface", "pparen", "precedes", "prescription", "primemod", "primereversed", "product", "projective", "prolongedkana", "propellor", "propersubset", "propersuperset", "proportion", "proportional", "psi", "psicyrillic", "psilipneumatacyrilliccmb", "pssquare", "puhiragana", "pukatakana", "pvsquare", "pwsquare", "q", "qadeva", "qadmahebrew", "qafarabic", "qaffinalarabic", "qafinitialarabic", "qafmedialarabic", "qamats", "qamats10", "qamats1a", "qamats1c", "qamats27", "qamats29", "qamats33", "qamatsde", "qamatshebrew", "qamatsnarrowhebrew", "qamatsqatanhebrew", "qamatsqatannarrowhebrew", "qamatsqatanquarterhebrew", "qamatsqatanwidehebrew", "qamatsquarterhebrew", "qamatswidehebrew", "qarneyparahebrew", "qbopomofo", "qcircle", "qhook", "qmonospace", "qof", "qofdagesh", "qofdageshhebrew", "qofhebrew", "qparen", "quarternote", "qubuts", "qubuts18", "qubuts25", "qubuts31", "qubutshebrew", "qubutsnarrowhebrew", "qubutsquarterhebrew", "qubutswidehebrew", "question", "questionarabic", "questionarmenian", "questiondown", "questiondownsmall", "questiongreek", "questionmonospace", "questionsmall", "quotedbl", "quotedblbase", "quotedblleft", "quotedblmonospace", "quotedblprime", "quotedblprimereversed", "quotedblright", "quoteleft", "quoteleftreversed", "quotereversed", "quoteright", "quoterightn", "quotesinglbase", "quotesingle", "quotesinglemonospace", "r", "raarmenian", "rabengali", "racute", "radeva", "radical", "radicalex", "radoverssquare", "radoverssquaredsquare", "radsquare", "rafe", "rafehebrew", "ragujarati", "ragurmukhi", "rahiragana", "rakatakana", "rakatakanahalfwidth", "ralowerdiagonalbengali", "ramiddlediagonalbengali", "ramshorn", "ratio", "rbopomofo", "rcaron", "rcedilla", "rcircle", "rcommaaccent", "rdblgrave", "rdotaccent", "rdotbelow", "rdotbelowmacron", "referencemark", "reflexsubset", "reflexsuperset", "registered", "registersans", "registerserif", "reharabic", "reharmenian", "rehfinalarabic", "rehiragana", "rekatakana", "rekatakanahalfwidth", "resh", "reshdageshhebrew", "reshhebrew", "reversedtilde", "reviahebrew", "reviamugrashhebrew", "revlogicalnot", "rfishhook", "rfishhookreversed", "rhabengali", "rhadeva", "rho", "rhook", "rhookturned", "rhookturnedsuperior", "rhosymbolgreek", "rhotichookmod", "rieulacirclekorean", "rieulaparenkorean", "rieulcirclekorean", "rieulhieuhkorean", "rieulkiyeokkorean", "rieulkiyeoksioskorean", "rieulkorean", "rieulmieumkorean", "rieulpansioskorean", "rieulparenkorean", "rieulphieuphkorean", "rieulpieupkorean", "rieulpieupsioskorean", "rieulsioskorean", "rieulthieuthkorean", "rieultikeutkorean", "rieulyeorinhieuhkorean", "rightangle", "righttackbelowcmb", "righttriangle", "rihiragana", "rikatakana", "rikatakanahalfwidth", "ring", "ringbelowcmb", "ringcmb", "ringhalfleft", "ringhalfleftarmenian", "ringhalfleftbelowcmb", "ringhalfleftcentered", "ringhalfright", "ringhalfrightbelowcmb", "ringhalfrightcentered", "rinvertedbreve", "rittorusquare", "rlinebelow", "rlongleg", "rlonglegturned", "rmonospace", "rohiragana", "rokatakana", "rokatakanahalfwidth", "roruathai", "rparen", "rrabengali", "rradeva", "rragurmukhi", "rreharabic", "rrehfinalarabic", "rrvocalicbengali", "rrvocalicdeva", "rrvocalicgujarati", "rrvocalicvowelsignbengali", "rrvocalicvowelsigndeva", "rrvocalicvowelsigngujarati", "rsuperior", "rtblock", "rturned", "rturnedsuperior", "ruhiragana", "rukatakana", "rukatakanahalfwidth", "rupeemarkbengali", "rupeesignbengali", "rupiah", "ruthai", "rvocalicbengali", "rvocalicdeva", "rvocalicgujarati", "rvocalicvowelsignbengali", "rvocalicvowelsigndeva", "rvocalicvowelsigngujarati", "s", "sabengali", "sacute", "sacutedotaccent", "sadarabic", "sadeva", "sadfinalarabic", "sadinitialarabic", "sadmedialarabic", "sagujarati", "sagurmukhi", "sahiragana", "sakatakana", "sakatakanahalfwidth", "sallallahoualayhewasallamarabic", "samekh", "samekhdagesh", "samekhdageshhebrew", "samekhhebrew", "saraaathai", "saraaethai", "saraaimaimalaithai", "saraaimaimuanthai", "saraamthai", "saraathai", "saraethai", "saraiileftthai", "saraiithai", "saraileftthai", "saraithai", "saraothai", "saraueeleftthai", "saraueethai", "saraueleftthai", "sarauethai", "sarauthai", "sarauuthai", "sbopomofo", "scaron", "scarondotaccent", "scedilla", "schwa", "schwacyrillic", "schwadieresiscyrillic", "schwahook", "scircle", "scircumflex", "scommaaccent", "sdotaccent", "sdotbelow", "sdotbelowdotaccent", "seagullbelowcmb", "second", "secondtonechinese", "section", "seenarabic", "seenfinalarabic", "seeninitialarabic", "seenmedialarabic", "segol", "segol13", "segol1f", "segol2c", "segolhebrew", "segolnarrowhebrew", "segolquarterhebrew", "segoltahebrew", "segolwidehebrew", "seharmenian", "sehiragana", "sekatakana", "sekatakanahalfwidth", "semicolon", "semicolonarabic", "semicolonmonospace", "semicolonsmall", "semivoicedmarkkana", "semivoicedmarkkanahalfwidth", "sentisquare", "sentosquare", "seven", "sevenarabic", "sevenbengali", "sevencircle", "sevencircleinversesansserif", "sevendeva", "seveneighths", "sevengujarati", "sevengurmukhi", "sevenhackarabic", "sevenhangzhou", "sevenideographicparen", "seveninferior", "sevenmonospace", "sevenoldstyle", "sevenparen", "sevenperiod", "sevenpersian", "sevenroman", "sevensuperior", "seventeencircle", "seventeenparen", "seventeenperiod", "seventhai", "sfthyphen", "shaarmenian", "shabengali", "shacyrillic", "shaddaarabic", "shaddadammaarabic", "shaddadammatanarabic", "shaddafathaarabic", "shaddakasraarabic", "shaddakasratanarabic", "shade", "shadedark", "shadelight", "shademedium", "shadeva", "shagujarati", "shagurmukhi", "shalshelethebrew", "shbopomofo", "shchacyrillic", "sheenarabic", "sheenfinalarabic", "sheeninitialarabic", "sheenmedialarabic", "sheicoptic", "sheqel", "sheqelhebrew", "sheva", "sheva115", "sheva15", "sheva22", "sheva2e", "shevahebrew", "shevanarrowhebrew", "shevaquarterhebrew", "shevawidehebrew", "shhacyrillic", "shimacoptic", "shin", "shindagesh", "shindageshhebrew", "shindageshshindot", "shindageshshindothebrew", "shindageshsindot", "shindageshsindothebrew", "shindothebrew", "shinhebrew", "shinshindot", "shinshindothebrew", "shinsindot", "shinsindothebrew", "shook", "sigma", "sigma1", "sigmafinal", "sigmalunatesymbolgreek", "sihiragana", "sikatakana", "sikatakanahalfwidth", "siluqhebrew", "siluqlefthebrew", "similar", "sindothebrew", "siosacirclekorean", "siosaparenkorean", "sioscieuckorean", "sioscirclekorean", "sioskiyeokkorean", "sioskorean", "siosnieunkorean", "siosparenkorean", "siospieupkorean", "siostikeutkorean", "six", "sixarabic", "sixbengali", "sixcircle", "sixcircleinversesansserif", "sixdeva", "sixgujarati", "sixgurmukhi", "sixhackarabic", "sixhangzhou", "sixideographicparen", "sixinferior", "sixmonospace", "sixoldstyle", "sixparen", "sixperiod", "sixpersian", "sixroman", "sixsuperior", "sixteencircle", "sixteencurrencydenominatorbengali", "sixteenparen", "sixteenperiod", "sixthai", "slash", "slashmonospace", "slong", "slongdotaccent", "smileface", "smonospace", "sofpasuqhebrew", "softhyphen", "softsigncyrillic", "sohiragana", "sokatakana", "sokatakanahalfwidth", "soliduslongoverlaycmb", "solidusshortoverlaycmb", "sorusithai", "sosalathai", "sosothai", "sosuathai", "space", "spacehackarabic", "spade", "spadesuitblack", "spadesuitwhite", "sparen", "squarebelowcmb", "squarecc", "squarecm", "squarediagonalcrosshatchfill", "squarehorizontalfill", "squarekg", "squarekm", "squarekmcapital", "squareln", "squarelog", "squaremg", "squaremil", "squaremm", "squaremsquared", "squareorthogonalcrosshatchfill", "squareupperlefttolowerrightfill", "squareupperrighttolowerleftfill", "squareverticalfill", "squarewhitewithsmallblack", "srsquare", "ssabengali", "ssadeva", "ssagujarati", "ssangcieuckorean", "ssanghieuhkorean", "ssangieungkorean", "ssangkiyeokkorean", "ssangnieunkorean", "ssangpieupkorean", "ssangsioskorean", "ssangtikeutkorean", "ssuperior", "sterling", "sterlingmonospace", "strokelongoverlaycmb", "strokeshortoverlaycmb", "subset", "subsetnotequal", "subsetorequal", "succeeds", "suchthat", "suhiragana", "sukatakana", "sukatakanahalfwidth", "sukunarabic", "summation", "sun", "superset", "supersetnotequal", "supersetorequal", "svsquare", "syouwaerasquare", "t", "tabengali", "tackdown", "tackleft", "tadeva", "tagujarati", "tagurmukhi", "taharabic", "tahfinalarabic", "tahinitialarabic", "tahiragana", "tahmedialarabic", "taisyouerasquare", "takatakana", "takatakanahalfwidth", "tatweelarabic", "tau", "tav", "tavdages", "tavdagesh", "tavdageshhebrew", "tavhebrew", "tbar", "tbopomofo", "tcaron", "tccurl", "tcedilla", "tcheharabic", "tchehfinalarabic", "tchehinitialarabic", "tchehmedialarabic", "tcircle", "tcircumflexbelow", "tcommaaccent", "tdieresis", "tdotaccent", "tdotbelow", "tecyrillic", "tedescendercyrillic", "teharabic", "tehfinalarabic", "tehhahinitialarabic", "tehhahisolatedarabic", "tehinitialarabic", "tehiragana", "tehjeeminitialarabic", "tehjeemisolatedarabic", "tehmarbutaarabic", "tehmarbutafinalarabic", "tehmedialarabic", "tehmeeminitialarabic", "tehmeemisolatedarabic", "tehnoonfinalarabic", "tekatakana", "tekatakanahalfwidth", "telephone", "telephoneblack", "telishagedolahebrew", "telishaqetanahebrew", "tencircle", "tenideographicparen", "tenparen", "tenperiod", "tenroman", "tesh", "tet", "tetdagesh", "tetdageshhebrew", "tethebrew", "tetsecyrillic", "tevirhebrew", "tevirlefthebrew", "thabengali", "thadeva", "thagujarati", "thagurmukhi", "thalarabic", "thalfinalarabic", "thanthakhatlowleftthai", "thanthakhatlowrightthai", "thanthakhatthai", "thanthakhatupperleftthai", "theharabic", "thehfinalarabic", "thehinitialarabic", "thehmedialarabic", "thereexists", "therefore", "theta", "theta1", "thetasymbolgreek", "thieuthacirclekorean", "thieuthaparenkorean", "thieuthcirclekorean", "thieuthkorean", "thieuthparenkorean", "thirteencircle", "thirteenparen", "thirteenperiod", "thonangmonthothai", "thook", "thophuthaothai", "thorn", "thothahanthai", "thothanthai", "thothongthai", "thothungthai", "thousandcyrillic", "thousandsseparatorarabic", "thousandsseparatorpersian", "three", "threearabic", "threebengali", "threecircle", "threecircleinversesansserif", "threedeva", "threeeighths", "threegujarati", "threegurmukhi", "threehackarabic", "threehangzhou", "threeideographicparen", "threeinferior", "threemonospace", "threenumeratorbengali", "threeoldstyle", "threeparen", "threeperiod", "threepersian", "threequarters", "threequartersemdash", "threeroman", "threesuperior", "threethai", "thzsquare", "tihiragana", "tikatakana", "tikatakanahalfwidth", "tikeutacirclekorean", "tikeutaparenkorean", "tikeutcirclekorean", "tikeutkorean", "tikeutparenkorean", "tilde", "tildebelowcmb", "tildecmb", "tildecomb", "tildedoublecmb", "tildeoperator", "tildeoverlaycmb", "tildeverticalcmb", "timescircle", "tipehahebrew", "tipehalefthebrew", "tippigurmukhi", "titlocyrilliccmb", "tiwnarmenian", "tlinebelow", "tmonospace", "toarmenian", "tohiragana", "tokatakana", "tokatakanahalfwidth", "tonebarextrahighmod", "tonebarextralowmod", "tonebarhighmod", "tonebarlowmod", "tonebarmidmod", "tonefive", "tonesix", "tonetwo", "tonos", "tonsquare", "topatakthai", "tortoiseshellbracketleft", "tortoiseshellbracketleftsmall", "tortoiseshellbracketleftvertical", "tortoiseshellbracketright", "tortoiseshellbracketrightsmall", "tortoiseshellbracketrightvertical", "totaothai", "tpalatalhook", "tparen", "trademark", "trademarksans", "trademarkserif", "tretroflexhook", "triagdn", "triaglf", "triagrt", "triagup", "ts", "tsadi", "tsadidagesh", "tsadidageshhebrew", "tsadihebrew", "tsecyrillic", "tsere", "tsere12", "tsere1e", "tsere2b", "tserehebrew", "tserenarrowhebrew", "tserequarterhebrew", "tserewidehebrew", "tshecyrillic", "tsuperior", "ttabengali", "ttadeva", "ttagujarati", "ttagurmukhi", "tteharabic", "ttehfinalarabic", "ttehinitialarabic", "ttehmedialarabic", "tthabengali", "tthadeva", "tthagujarati", "tthagurmukhi", "tturned", "tuhiragana", "tukatakana", "tukatakanahalfwidth", "tusmallhiragana", "tusmallkatakana", "tusmallkatakanahalfwidth", "twelvecircle", "twelveparen", "twelveperiod", "twelveroman", "twentycircle", "twentyhangzhou", "twentyparen", "twentyperiod", "two", "twoarabic", "twobengali", "twocircle", "twocircleinversesansserif", "twodeva", "twodotenleader", "twodotleader", "twodotleadervertical", "twogujarati", "twogurmukhi", "twohackarabic", "twohangzhou", "twoideographicparen", "twoinferior", "twomonospace", "twonumeratorbengali", "twooldstyle", "twoparen", "twoperiod", "twopersian", "tworoman", "twostroke", "twosuperior", "twothai", "twothirds", "u", "uacute", "ubar", "ubengali", "ubopomofo", "ubreve", "ucaron", "ucircle", "ucircumflex", "ucircumflexbelow", "ucyrillic", "udattadeva", "udblacute", "udblgrave", "udeva", "udieresis", "udieresisacute", "udieresisbelow", "udieresiscaron", "udieresiscyrillic", "udieresisgrave", "udieresismacron", "udotbelow", "ugrave", "ugujarati", "ugurmukhi", "uhiragana", "uhookabove", "uhorn", "uhornacute", "uhorndotbelow", "uhorngrave", "uhornhookabove", "uhorntilde", "uhungarumlaut", "uhungarumlautcyrillic", "uinvertedbreve", "ukatakana", "ukatakanahalfwidth", "ukcyrillic", "ukorean", "umacron", "umacroncyrillic", "umacrondieresis", "umatragurmukhi", "umonospace", "underscore", "underscoredbl", "underscoremonospace", "underscorevertical", "underscorewavy", "union", "universal", "uogonek", "uparen", "upblock", "upperdothebrew", "upsilon", "upsilondieresis", "upsilondieresistonos", "upsilonlatin", "upsilontonos", "uptackbelowcmb", "uptackmod", "uragurmukhi", "uring", "ushortcyrillic", "usmallhiragana", "usmallkatakana", "usmallkatakanahalfwidth", "ustraightcyrillic", "ustraightstrokecyrillic", "utilde", "utildeacute", "utildebelow", "uubengali", "uudeva", "uugujarati", "uugurmukhi", "uumatragurmukhi", "uuvowelsignbengali", "uuvowelsigndeva", "uuvowelsigngujarati", "uvowelsignbengali", "uvowelsigndeva", "uvowelsigngujarati", "v", "vadeva", "vagujarati", "vagurmukhi", "vakatakana", "vav", "vavdagesh", "vavdagesh65", "vavdageshhebrew", "vavhebrew", "vavholam", "vavholamhebrew", "vavvavhebrew", "vavyodhebrew", "vcircle", "vdotbelow", "vecyrillic", "veharabic", "vehfinalarabic", "vehinitialarabic", "vehmedialarabic", "vekatakana", "venus", "verticalbar", "verticallineabovecmb", "verticallinebelowcmb", "verticallinelowmod", "verticallinemod", "vewarmenian", "vhook", "vikatakana", "viramabengali", "viramadeva", "viramagujarati", "visargabengali", "visargadeva", "visargagujarati", "vmonospace", "voarmenian", "voicediterationhiragana", "voicediterationkatakana", "voicedmarkkana", "voicedmarkkanahalfwidth", "vokatakana", "vparen", "vtilde", "vturned", "vuhiragana", "vukatakana", "w", "wacute", "waekorean", "wahiragana", "wakatakana", "wakatakanahalfwidth", "wakorean", "wasmallhiragana", "wasmallkatakana", "wattosquare", "wavedash", "wavyunderscorevertical", "wawarabic", "wawfinalarabic", "wawhamzaabovearabic", "wawhamzaabovefinalarabic", "wbsquare", "wcircle", "wcircumflex", "wdieresis", "wdotaccent", "wdotbelow", "wehiragana", "weierstrass", "wekatakana", "wekorean", "weokorean", "wgrave", "whitebullet", "whitecircle", "whitecircleinverse", "whitecornerbracketleft", "whitecornerbracketleftvertical", "whitecornerbracketright", "whitecornerbracketrightvertical", "whitediamond", "whitediamondcontainingblacksmalldiamond", "whitedownpointingsmalltriangle", "whitedownpointingtriangle", "whiteleftpointingsmalltriangle", "whiteleftpointingtriangle", "whitelenticularbracketleft", "whitelenticularbracketright", "whiterightpointingsmalltriangle", "whiterightpointingtriangle", "whitesmallsquare", "whitesmilingface", "whitesquare", "whitestar", "whitetelephone", "whitetortoiseshellbracketleft", "whitetortoiseshellbracketright", "whiteuppointingsmalltriangle", "whiteuppointingtriangle", "wihiragana", "wikatakana", "wikorean", "wmonospace", "wohiragana", "wokatakana", "wokatakanahalfwidth", "won", "wonmonospace", "wowaenthai", "wparen", "wring", "wsuperior", "wturned", "wynn", "x", "xabovecmb", "xbopomofo", "xcircle", "xdieresis", "xdotaccent", "xeharmenian", "xi", "xmonospace", "xparen", "xsuperior", "y", "yaadosquare", "yabengali", "yacute", "yadeva", "yaekorean", "yagujarati", "yagurmukhi", "yahiragana", "yakatakana", "yakatakanahalfwidth", "yakorean", "yamakkanthai", "yasmallhiragana", "yasmallkatakana", "yasmallkatakanahalfwidth", "yatcyrillic", "ycircle", "ycircumflex", "ydieresis", "ydotaccent", "ydotbelow", "yeharabic", "yehbarreearabic", "yehbarreefinalarabic", "yehfinalarabic", "yehhamzaabovearabic", "yehhamzaabovefinalarabic", "yehhamzaaboveinitialarabic", "yehhamzaabovemedialarabic", "yehinitialarabic", "yehmedialarabic", "yehmeeminitialarabic", "yehmeemisolatedarabic", "yehnoonfinalarabic", "yehthreedotsbelowarabic", "yekorean", "yen", "yenmonospace", "yeokorean", "yeorinhieuhkorean", "yerahbenyomohebrew", "yerahbenyomolefthebrew", "yericyrillic", "yerudieresiscyrillic", "yesieungkorean", "yesieungpansioskorean", "yesieungsioskorean", "yetivhebrew", "ygrave", "yhook", "yhookabove", "yiarmenian", "yicyrillic", "yikorean", "yinyang", "yiwnarmenian", "ymonospace", "yod", "yoddagesh", "yoddageshhebrew", "yodhebrew", "yodyodhebrew", "yodyodpatahhebrew", "yohiragana", "yoikorean", "yokatakana", "yokatakanahalfwidth", "yokorean", "yosmallhiragana", "yosmallkatakana", "yosmallkatakanahalfwidth", "yotgreek", "yoyaekorean", "yoyakorean", "yoyakthai", "yoyingthai", "yparen", "ypogegrammeni", "ypogegrammenigreekcmb", "yr", "yring", "ysuperior", "ytilde", "yturned", "yuhiragana", "yuikorean", "yukatakana", "yukatakanahalfwidth", "yukorean", "yusbigcyrillic", "yusbigiotifiedcyrillic", "yuslittlecyrillic", "yuslittleiotifiedcyrillic", "yusmallhiragana", "yusmallkatakana", "yusmallkatakanahalfwidth", "yuyekorean", "yuyeokorean", "yyabengali", "yyadeva", "z", "zaarmenian", "zacute", "zadeva", "zagurmukhi", "zaharabic", "zahfinalarabic", "zahinitialarabic", "zahiragana", "zahmedialarabic", "zainarabic", "zainfinalarabic", "zakatakana", "zaqefgadolhebrew", "zaqefqatanhebrew", "zarqahebrew", "zayin", "zayindagesh", "zayindageshhebrew", "zayinhebrew", "zbopomofo", "zcaron", "zcircle", "zcircumflex", "zcurl", "zdot", "zdotaccent", "zdotbelow", "zecyrillic", "zedescendercyrillic", "zedieresiscyrillic", "zehiragana", "zekatakana", "zero", "zeroarabic", "zerobengali", "zerodeva", "zerogujarati", "zerogurmukhi", "zerohackarabic", "zeroinferior", "zeromonospace", "zerooldstyle", "zeropersian", "zerosuperior", "zerothai", "zerowidthjoiner", "zerowidthnonjoiner", "zerowidthspace", "zeta", "zhbopomofo", "zhearmenian", "zhebrevecyrillic", "zhecyrillic", "zhedescendercyrillic", "zhedieresiscyrillic", "zihiragana", "zikatakana", "zinorhebrew", "zlinebelow", "zmonospace", "zohiragana", "zokatakana", "zparen", "zretroflexhook", "zstroke", "zuhiragana", "zukatakana", }; char const **extraglyphs = NULL; glyph nextglyph = lenof(ps_glyphs_alphabetic); tree234 *extrabyname = NULL; char const *glyph_extern(glyph glyph) { if (glyph == NOGLYPH) return ".notdef"; if (glyph < lenof(ps_glyphs_alphabetic)) return ps_glyphs_alphabetic[glyph]; else return extraglyphs[glyph - lenof(ps_glyphs_alphabetic)]; } static int glyphcmp(void *a, void *b) { glyph ga = *(glyph *)a, gb = *(glyph *)b; return strcmp(glyph_extern(ga), glyph_extern(gb)); } static int glyphcmp_search(void *a, void *b) { glyph gb = *(glyph *)b; return strcmp(a, glyph_extern(gb)); } glyph glyph_intern(char const *glyphname) { int i, j, k, c; glyph *gp; i = -1; j = lenof(ps_glyphs_alphabetic); while (j-i > 1) { k = (i + j) / 2; c = strcmp(glyphname, ps_glyphs_alphabetic[k]); if (c == 0) return k; else if (c < 0) j = k; else i = k; } /* Non-standard glyph. We may need to add it to our tree. */ if (extrabyname == NULL) extrabyname = newtree234(glyphcmp); gp = find234(extrabyname, (void *)glyphname, glyphcmp_search); if (gp) { k = *gp; } else { extraglyphs = sresize(extraglyphs, nextglyph, char const *); k = nextglyph++; extraglyphs[k - lenof(ps_glyphs_alphabetic)] = dupstr(glyphname); gp = snew(glyph); *gp = k; add234(extrabyname, gp); } return k; } /* ---------------------------------------------------------------------- * Mapping between PS character names (/aacute, /zcaron etc) and * Unicode code points. * * Generated from the Adobe Glyph List at * * http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt * * by another Perl/sh fragment. grep '^[^#;][^;]*;[^ ][^ ][^ ][^ ]$' glyphlist.txt | sort -t\; -k1,1 | \ cut -f2 -d\; | perl -ne 'chomp; print "0x$_, "' | \ fold -s -w68 | sed 's/^/ /'; echo */ static const unsigned short ps_codes_alphabetic[] = { 0xFFFF, 0xFFFF, 0x0041, 0x00C6, 0x01FC, 0x01E2, 0xF7E6, 0x00C1, 0xF7E1, 0x0102, 0x1EAE, 0x04D0, 0x1EB6, 0x1EB0, 0x1EB2, 0x1EB4, 0x01CD, 0x24B6, 0x00C2, 0x1EA4, 0x1EAC, 0x1EA6, 0x1EA8, 0xF7E2, 0x1EAA, 0xF6C9, 0xF7B4, 0x0410, 0x0200, 0x00C4, 0x04D2, 0x01DE, 0xF7E4, 0x1EA0, 0x01E0, 0x00C0, 0xF7E0, 0x1EA2, 0x04D4, 0x0202, 0x0391, 0x0386, 0x0100, 0xFF21, 0x0104, 0x00C5, 0x01FA, 0x1E00, 0xF7E5, 0xF761, 0x00C3, 0xF7E3, 0x0531, 0x0042, 0x24B7, 0x1E02, 0x1E04, 0x0411, 0x0532, 0x0392, 0x0181, 0x1E06, 0xFF22, 0xF6F4, 0xF762, 0x0182, 0x0043, 0x053E, 0x0106, 0xF6CA, 0xF6F5, 0x010C, 0x00C7, 0x1E08, 0xF7E7, 0x24B8, 0x0108, 0x010A, 0x010A, 0xF7B8, 0x0549, 0x04BC, 0x0427, 0x04BE, 0x04B6, 0x04F4, 0x0543, 0x04CB, 0x04B8, 0x03A7, 0x0187, 0xF6F6, 0xFF23, 0x0551, 0xF763, 0x0044, 0x01F1, 0x01C4, 0x0534, 0x0189, 0x010E, 0x1E10, 0x24B9, 0x1E12, 0x0110, 0x1E0A, 0x1E0C, 0x0414, 0x03EE, 0x2206, 0x0394, 0x018A, 0xF6CB, 0xF6CC, 0xF6CD, 0xF7A8, 0x03DC, 0x0402, 0x1E0E, 0xFF24, 0xF6F7, 0x0110, 0xF764, 0x018B, 0x01F2, 0x01C5, 0x04E0, 0x0405, 0x040F, 0x0045, 0x00C9, 0xF7E9, 0x0114, 0x011A, 0x1E1C, 0x0535, 0x24BA, 0x00CA, 0x1EBE, 0x1E18, 0x1EC6, 0x1EC0, 0x1EC2, 0xF7EA, 0x1EC4, 0x0404, 0x0204, 0x00CB, 0xF7EB, 0x0116, 0x0116, 0x1EB8, 0x0424, 0x00C8, 0xF7E8, 0x0537, 0x1EBA, 0x2167, 0x0206, 0x0464, 0x041B, 0x216A, 0x0112, 0x1E16, 0x1E14, 0x041C, 0xFF25, 0x041D, 0x04A2, 0x014A, 0x04A4, 0x04C7, 0x0118, 0x0190, 0x0395, 0x0388, 0x0420, 0x018E, 0x042D, 0x0421, 0x04AA, 0x01A9, 0xF765, 0x0397, 0x0538, 0x0389, 0x00D0, 0xF7F0, 0x1EBC, 0x1E1A, 0x20AC, 0x01B7, 0x01EE, 0x01B8, 0x0046, 0x24BB, 0x1E1E, 0x0556, 0x03E4, 0x0191, 0x0472, 0x2164, 0xFF26, 0x2163, 0xF766, 0x0047, 0x3387, 0x01F4, 0x0393, 0x0194, 0x03EA, 0x011E, 0x01E6, 0x0122, 0x24BC, 0x011C, 0x0122, 0x0120, 0x0120, 0x0413, 0x0542, 0x0494, 0x0492, 0x0490, 0x0193, 0x0533, 0x0403, 0x1E20, 0xFF27, 0xF6CE, 0xF760, 0xF767, 0x029B, 0x01E4, 0x0048, 0x25CF, 0x25AA, 0x25AB, 0x25A1, 0x33CB, 0x04A8, 0x04B2, 0x042A, 0x0126, 0x1E2A, 0x1E28, 0x24BD, 0x0124, 0x1E26, 0x1E22, 0x1E24, 0xFF28, 0x0540, 0x03E8, 0xF768, 0xF6CF, 0xF6F8, 0x3390, 0x0049, 0x042F, 0x0132, 0x042E, 0x00CD, 0xF7ED, 0x012C, 0x01CF, 0x24BE, 0x00CE, 0xF7EE, 0x0406, 0x0208, 0x00CF, 0x1E2E, 0x04E4, 0xF7EF, 0x0130, 0x0130, 0x1ECA, 0x04D6, 0x0415, 0x2111, 0x00CC, 0xF7EC, 0x1EC8, 0x0418, 0x020A, 0x0419, 0x012A, 0x04E2, 0xFF29, 0x053B, 0x0401, 0x012E, 0x0399, 0x0196, 0x03AA, 0x038A, 0xF769, 0x0197, 0x0128, 0x1E2C, 0x0474, 0x0476, 0x004A, 0x0541, 0x24BF, 0x0134, 0x0408, 0x054B, 0xFF2A, 0xF76A, 0x004B, 0x3385, 0x33CD, 0x04A0, 0x1E30, 0x041A, 0x049A, 0x04C3, 0x039A, 0x049E, 0x049C, 0x01E8, 0x0136, 0x24C0, 0x0136, 0x1E32, 0x0554, 0x053F, 0x0425, 0x03E6, 0x0198, 0x040C, 0x1E34, 0xFF2B, 0x0480, 0x03DE, 0x046E, 0xF76B, 0x004C, 0x01C7, 0xF6BF, 0x0139, 0x039B, 0x013D, 0x013B, 0x24C1, 0x1E3C, 0x013B, 0x013F, 0x013F, 0x1E36, 0x1E38, 0x053C, 0x01C8, 0x0409, 0x1E3A, 0xFF2C, 0x0141, 0xF6F9, 0xF76C, 0x004D, 0x3386, 0xF6D0, 0xF7AF, 0x1E3E, 0x24C2, 0x1E40, 0x1E42, 0x0544, 0xFF2D, 0xF76D, 0x019C, 0x039C, 0x004E, 0x01CA, 0x0143, 0x0147, 0x0145, 0x24C3, 0x1E4A, 0x0145, 0x1E44, 0x1E46, 0x019D, 0x2168, 0x01CB, 0x040A, 0x1E48, 0xFF2E, 0x0546, 0xF76E, 0x00D1, 0xF7F1, 0x039D, 0x004F, 0x0152, 0xF6FA, 0x00D3, 0xF7F3, 0x04E8, 0x04EA, 0x014E, 0x01D1, 0x019F, 0x24C4, 0x00D4, 0x1ED0, 0x1ED8, 0x1ED2, 0x1ED4, 0xF7F4, 0x1ED6, 0x041E, 0x0150, 0x020C, 0x00D6, 0x04E6, 0xF7F6, 0x1ECC, 0xF6FB, 0x00D2, 0xF7F2, 0x0555, 0x2126, 0x1ECE, 0x01A0, 0x1EDA, 0x1EE2, 0x1EDC, 0x1EDE, 0x1EE0, 0x0150, 0x01A2, 0x020E, 0x014C, 0x1E52, 0x1E50, 0x2126, 0x0460, 0x03A9, 0x047A, 0x047C, 0x038F, 0x039F, 0x038C, 0xFF2F, 0x2160, 0x01EA, 0x01EC, 0x0186, 0x00D8, 0x01FE, 0xF7F8, 0xF76F, 0x01FE, 0x047E, 0x00D5, 0x1E4C, 0x1E4E, 0xF7F5, 0x0050, 0x1E54, 0x24C5, 0x1E56, 0x041F, 0x054A, 0x04A6, 0x03A6, 0x01A4, 0x03A0, 0x0553, 0xFF30, 0x03A8, 0x0470, 0xF770, 0x0051, 0x24C6, 0xFF31, 0xF771, 0x0052, 0x054C, 0x0154, 0x0158, 0x0156, 0x24C7, 0x0156, 0x0210, 0x1E58, 0x1E5A, 0x1E5C, 0x0550, 0x211C, 0x03A1, 0xF6FC, 0x0212, 0x1E5E, 0xFF32, 0xF772, 0x0281, 0x02B6, 0x0053, 0x250C, 0x2514, 0x2510, 0x2518, 0x253C, 0x252C, 0x2534, 0x251C, 0x2524, 0x2500, 0x2502, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x015A, 0x1E64, 0x03E0, 0x0160, 0x1E66, 0xF6FD, 0x015E, 0x018F, 0x04D8, 0x04DA, 0x24C8, 0x015C, 0x0218, 0x1E60, 0x1E62, 0x1E68, 0x054D, 0x2166, 0x0547, 0x0428, 0x0429, 0x03E2, 0x04BA, 0x03EC, 0x03A3, 0x2165, 0xFF33, 0x042C, 0xF773, 0x03DA, 0x0054, 0x03A4, 0x0166, 0x0164, 0x0162, 0x24C9, 0x1E70, 0x0162, 0x1E6A, 0x1E6C, 0x0422, 0x04AC, 0x2169, 0x04B4, 0x0398, 0x01AC, 0x00DE, 0xF7FE, 0x2162, 0xF6FE, 0x054F, 0x1E6E, 0xFF34, 0x0539, 0x01BC, 0x0184, 0x01A7, 0x01AE, 0x0426, 0x040B, 0xF774, 0x216B, 0x2161, 0x0055, 0x00DA, 0xF7FA, 0x016C, 0x01D3, 0x24CA, 0x00DB, 0x1E76, 0xF7FB, 0x0423, 0x0170, 0x0214, 0x00DC, 0x01D7, 0x1E72, 0x01D9, 0x04F0, 0x01DB, 0x01D5, 0xF7FC, 0x1EE4, 0x00D9, 0xF7F9, 0x1EE6, 0x01AF, 0x1EE8, 0x1EF0, 0x1EEA, 0x1EEC, 0x1EEE, 0x0170, 0x04F2, 0x0216, 0x0478, 0x016A, 0x04EE, 0x1E7A, 0xFF35, 0x0172, 0x03A5, 0x03D2, 0x03D3, 0x01B1, 0x03AB, 0x03D4, 0x03D2, 0x038E, 0x016E, 0x040E, 0xF775, 0x04AE, 0x04B0, 0x0168, 0x1E78, 0x1E74, 0x0056, 0x24CB, 0x1E7E, 0x0412, 0x054E, 0x01B2, 0xFF36, 0x0548, 0xF776, 0x1E7C, 0x0057, 0x1E82, 0x24CC, 0x0174, 0x1E84, 0x1E86, 0x1E88, 0x1E80, 0xFF37, 0xF777, 0x0058, 0x24CD, 0x1E8C, 0x1E8A, 0x053D, 0x039E, 0xFF38, 0xF778, 0x0059, 0x00DD, 0xF7FD, 0x0462, 0x24CE, 0x0176, 0x0178, 0xF7FF, 0x1E8E, 0x1EF4, 0x042B, 0x04F8, 0x1EF2, 0x01B3, 0x1EF6, 0x0545, 0x0407, 0x0552, 0xFF39, 0xF779, 0x1EF8, 0x046A, 0x046C, 0x0466, 0x0468, 0x005A, 0x0536, 0x0179, 0x017D, 0xF6FF, 0x24CF, 0x1E90, 0x017B, 0x017B, 0x1E92, 0x0417, 0x0498, 0x04DE, 0x0396, 0x053A, 0x04C1, 0x0416, 0x0496, 0x04DC, 0x1E94, 0xFF3A, 0xF77A, 0x01B5, 0x0061, 0x0986, 0x00E1, 0x0906, 0x0A86, 0x0A06, 0x0A3E, 0x3303, 0x09BE, 0x093E, 0x0ABE, 0x055F, 0x0970, 0x0985, 0x311A, 0x0103, 0x1EAF, 0x04D1, 0x1EB7, 0x1EB1, 0x1EB3, 0x1EB5, 0x01CE, 0x24D0, 0x00E2, 0x1EA5, 0x1EAD, 0x1EA7, 0x1EA9, 0x1EAB, 0x00B4, 0x0317, 0x0301, 0x0301, 0x0954, 0x02CF, 0x0341, 0x0430, 0x0201, 0x0A71, 0x0905, 0x00E4, 0x04D3, 0x01DF, 0x1EA1, 0x01E1, 0x00E6, 0x01FD, 0x3150, 0x01E3, 0x2015, 0x20A4, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0490, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x040E, 0xF6C4, 0xF6C5, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x0491, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x045E, 0x040F, 0x0462, 0x0472, 0x0474, 0xF6C6, 0x045F, 0x0463, 0x0473, 0x0475, 0xF6C7, 0xF6C8, 0x04D9, 0x200E, 0x200F, 0x200D, 0x066A, 0x060C, 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0x061B, 0x061F, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0x0647, 0x06A4, 0x067E, 0x0686, 0x0698, 0x06AF, 0x0679, 0x0688, 0x0691, 0x06BA, 0x06D2, 0x06D5, 0x20AA, 0x05BE, 0x05C3, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0xFB2A, 0xFB2B, 0xFB4B, 0xFB1F, 0x05F0, 0x05F1, 0x05F2, 0xFB35, 0x05B4, 0x05B5, 0x05B6, 0x05BB, 0x05B8, 0x05B7, 0x05B0, 0x05B2, 0x05B1, 0x05B3, 0x05C2, 0x05C1, 0x05B9, 0x05BC, 0x05BD, 0x05BF, 0x05C0, 0x02BC, 0x2105, 0x2113, 0x2116, 0x202C, 0x202D, 0x202E, 0x200C, 0x066D, 0x02BD, 0x00E0, 0x0A85, 0x0A05, 0x3042, 0x1EA3, 0x0990, 0x311E, 0x0910, 0x04D5, 0x0A90, 0x0A10, 0x0A48, 0x0639, 0xFECA, 0xFECB, 0xFECC, 0x0203, 0x09C8, 0x0948, 0x0AC8, 0x30A2, 0xFF71, 0x314F, 0x05D0, 0x0627, 0xFB30, 0xFE8E, 0x0623, 0xFE84, 0x0625, 0xFE88, 0x05D0, 0xFB4F, 0x0622, 0xFE82, 0x0649, 0xFEF0, 0xFEF3, 0xFEF4, 0xFB2E, 0xFB2F, 0x2135, 0x224C, 0x03B1, 0x03AC, 0x0101, 0xFF41, 0x0026, 0xFF06, 0xF726, 0x33C2, 0x3122, 0x3124, 0x0E5A, 0x2220, 0x3008, 0xFE3F, 0x3009, 0xFE40, 0x2329, 0x232A, 0x212B, 0x0387, 0x0952, 0x0982, 0x0902, 0x0A82, 0x0105, 0x3300, 0x249C, 0x055A, 0x02BC, 0xF8FF, 0x2250, 0x2248, 0x2252, 0x2245, 0x318E, 0x318D, 0x2312, 0x1E9A, 0x00E5, 0x01FB, 0x1E01, 0x2194, 0x21E3, 0x21E0, 0x21E2, 0x21E1, 0x21D4, 0x21D3, 0x21D0, 0x21D2, 0x21D1, 0x2193, 0x2199, 0x2198, 0x21E9, 0x02C5, 0x02C2, 0x02C3, 0x02C4, 0xF8E7, 0x2190, 0x21D0, 0x21CD, 0x21C6, 0x21E6, 0x2192, 0x21CF, 0x279E, 0x21C4, 0x21E8, 0x21E4, 0x21E5, 0x2191, 0x2195, 0x21A8, 0x21A8, 0x2196, 0x21C5, 0x2197, 0x21E7, 0xF8E6, 0x005E, 0xFF3E, 0x007E, 0xFF5E, 0x0251, 0x0252, 0x3041, 0x30A1, 0xFF67, 0x002A, 0x066D, 0x066D, 0x2217, 0xFF0A, 0xFE61, 0x2042, 0xF6E9, 0x2243, 0x0040, 0x00E3, 0xFF20, 0xFE6B, 0x0250, 0x0994, 0x3120, 0x0914, 0x0A94, 0x0A14, 0x09D7, 0x0A4C, 0x09CC, 0x094C, 0x0ACC, 0x093D, 0x0561, 0x05E2, 0xFB20, 0x05E2, 0x0062, 0x09AC, 0x005C, 0xFF3C, 0x092C, 0x0AAC, 0x0A2C, 0x3070, 0x0E3F, 0x30D0, 0x007C, 0xFF5C, 0x3105, 0x24D1, 0x1E03, 0x1E05, 0x266C, 0x2235, 0x0431, 0x0628, 0xFE90, 0xFE91, 0x3079, 0xFE92, 0xFC9F, 0xFC08, 0xFC6D, 0x30D9, 0x0562, 0x05D1, 0x03B2, 0x03D0, 0xFB31, 0xFB31, 0x05D1, 0xFB4C, 0x09AD, 0x092D, 0x0AAD, 0x0A2D, 0x0253, 0x3073, 0x30D3, 0x0298, 0x0A02, 0x3331, 0x25CF, 0x25C6, 0x25BC, 0x25C4, 0x25C0, 0x3010, 0xFE3B, 0x3011, 0xFE3C, 0x25E3, 0x25E2, 0x25AC, 0x25BA, 0x25B6, 0x25AA, 0x263B, 0x25A0, 0x2605, 0x25E4, 0x25E5, 0x25B4, 0x25B2, 0x2423, 0x1E07, 0x2588, 0xFF42, 0x0E1A, 0x307C, 0x30DC, 0x249D, 0x33C3, 0xF8F4, 0x007B, 0xF8F3, 0xF8F2, 0xFF5B, 0xFE5B, 0xF8F1, 0xFE37, 0x007D, 0xF8FE, 0xF8FD, 0xFF5D, 0xFE5C, 0xF8FC, 0xFE38, 0x005B, 0xF8F0, 0xF8EF, 0xFF3B, 0xF8EE, 0x005D, 0xF8FB, 0xF8FA, 0xFF3D, 0xF8F9, 0x02D8, 0x032E, 0x0306, 0x032F, 0x0311, 0x0361, 0x032A, 0x033A, 0x00A6, 0x0180, 0xF6EA, 0x0183, 0x3076, 0x30D6, 0x2022, 0x25D8, 0x2219, 0x25CE, 0x0063, 0x056E, 0x099A, 0x0107, 0x091A, 0x0A9A, 0x0A1A, 0x3388, 0x0981, 0x0310, 0x0901, 0x0A81, 0x21EA, 0x2105, 0x02C7, 0x032C, 0x030C, 0x21B5, 0x3118, 0x010D, 0x00E7, 0x1E09, 0x24D2, 0x0109, 0x0255, 0x010B, 0x010B, 0x33C5, 0x00B8, 0x0327, 0x00A2, 0x2103, 0xF6DF, 0xFFE0, 0xF7A2, 0xF6E0, 0x0579, 0x099B, 0x091B, 0x0A9B, 0x0A1B, 0x3114, 0x04BD, 0x2713, 0x0447, 0x04BF, 0x04B7, 0x04F5, 0x0573, 0x04CC, 0x04B9, 0x03C7, 0x3277, 0x3217, 0x3269, 0x314A, 0x3209, 0x0E0A, 0x0E08, 0x0E09, 0x0E0C, 0x0188, 0x3276, 0x3216, 0x3268, 0x3148, 0x3208, 0x321C, 0x25CB, 0x2297, 0x2299, 0x2295, 0x3036, 0x25D0, 0x25D1, 0x02C6, 0x032D, 0x0302, 0x2327, 0x01C2, 0x01C0, 0x01C1, 0x01C3, 0x2663, 0x2663, 0x2667, 0x33A4, 0xFF43, 0x33A0, 0x0581, 0x003A, 0x20A1, 0xFF1A, 0x20A1, 0xFE55, 0x02D1, 0x02D0, 0x002C, 0x0313, 0x0315, 0xF6C3, 0x060C, 0x055D, 0xF6E1, 0xFF0C, 0x0314, 0x02BD, 0xFE50, 0xF6E2, 0x0312, 0x02BB, 0x263C, 0x2245, 0x222E, 0x2303, 0x0006, 0x0007, 0x0008, 0x0018, 0x000D, 0x0011, 0x0012, 0x0013, 0x0014, 0x007F, 0x0010, 0x0019, 0x0005, 0x0004, 0x001B, 0x0017, 0x0003, 0x000C, 0x001C, 0x001D, 0x0009, 0x000A, 0x0015, 0x001E, 0x000F, 0x000E, 0x0002, 0x0001, 0x001A, 0x0016, 0x001F, 0x000B, 0x00A9, 0xF8E9, 0xF6D9, 0x300C, 0xFF62, 0xFE41, 0x300D, 0xFF63, 0xFE42, 0x337F, 0x33C7, 0x33C6, 0x249E, 0x20A2, 0x0297, 0x22CF, 0x22CE, 0x00A4, 0xF6D1, 0xF6D2, 0xF6D4, 0xF6D5, 0x0064, 0x0564, 0x09A6, 0x0636, 0x0926, 0xFEBE, 0xFEBF, 0xFEC0, 0x05BC, 0x05BC, 0x2020, 0x2021, 0x0AA6, 0x0A26, 0x3060, 0x30C0, 0x062F, 0x05D3, 0xFB33, 0xFB33, 0x05D3, 0xFEAA, 0x064F, 0x064F, 0x064C, 0x064C, 0x0964, 0x05A7, 0x05A7, 0x0485, 0xF6D3, 0x300A, 0xFE3D, 0x300B, 0xFE3E, 0x032B, 0x21D4, 0x21D2, 0x0965, 0xF6D6, 0x030F, 0x222C, 0x2017, 0x0333, 0x033F, 0x02BA, 0x2016, 0x030E, 0x3109, 0x33C8, 0x010F, 0x1E11, 0x24D3, 0x1E13, 0x0111, 0x09A1, 0x0921, 0x0AA1, 0x0A21, 0x0688, 0xFB89, 0x095C, 0x09A2, 0x0922, 0x0AA2, 0x0A22, 0x1E0B, 0x1E0D, 0x066B, 0x066B, 0x0434, 0x00B0, 0x05AD, 0x3067, 0x03EF, 0x30C7, 0x232B, 0x2326, 0x03B4, 0x018D, 0x09F8, 0x02A4, 0x09A7, 0x0927, 0x0AA7, 0x0A27, 0x0257, 0x0385, 0x0344, 0x2666, 0x2662, 0x00A8, 0xF6D7, 0x0324, 0x0308, 0xF6D8, 0x0385, 0x3062, 0x30C2, 0x3003, 0x00F7, 0x2223, 0x2215, 0x0452, 0x2593, 0x1E0F, 0x3397, 0x0111, 0xFF44, 0x2584, 0x0E0E, 0x0E14, 0x3069, 0x30C9, 0x0024, 0xF6E3, 0xFF04, 0xF724, 0xFE69, 0xF6E4, 0x20AB, 0x3326, 0x02D9, 0x0307, 0x0323, 0x0323, 0x30FB, 0x0131, 0xF6BE, 0x0284, 0x22C5, 0x25CC, 0xFB1F, 0xFB1F, 0x031E, 0x02D5, 0x249F, 0xF6EB, 0x0256, 0x018C, 0x3065, 0x30C5, 0x01F3, 0x02A3, 0x01C6, 0x02A5, 0x04E1, 0x0455, 0x045F, 0x0065, 0x00E9, 0x2641, 0x098F, 0x311C, 0x0115, 0x090D, 0x0A8D, 0x0945, 0x0AC5, 0x011B, 0x1E1D, 0x0565, 0x0587, 0x24D4, 0x00EA, 0x1EBF, 0x1E19, 0x1EC7, 0x1EC1, 0x1EC3, 0x1EC5, 0x0454, 0x0205, 0x090F, 0x00EB, 0x0117, 0x0117, 0x1EB9, 0x0A0F, 0x0A47, 0x0444, 0x00E8, 0x0A8F, 0x0567, 0x311D, 0x3048, 0x1EBB, 0x311F, 0x0038, 0x0668, 0x09EE, 0x2467, 0x2791, 0x096E, 0x2471, 0x2485, 0x2499, 0x0AEE, 0x0A6E, 0x0668, 0x3028, 0x266B, 0x3227, 0x2088, 0xFF18, 0xF738, 0x247B, 0x248F, 0x06F8, 0x2177, 0x2078, 0x0E58, 0x0207, 0x0465, 0x30A8, 0xFF74, 0x0A74, 0x3154, 0x043B, 0x2208, 0x246A, 0x247E, 0x2492, 0x217A, 0x2026, 0x22EE, 0x0113, 0x1E17, 0x1E15, 0x043C, 0x2014, 0xFE31, 0xFF45, 0x055B, 0x2205, 0x3123, 0x043D, 0x2013, 0xFE32, 0x04A3, 0x014B, 0x3125, 0x04A5, 0x04C8, 0x2002, 0x0119, 0x3153, 0x025B, 0x029A, 0x025C, 0x025E, 0x025D, 0x24A0, 0x03B5, 0x03AD, 0x003D, 0xFF1D, 0xFE66, 0x207C, 0x2261, 0x3126, 0x0440, 0x0258, 0x044D, 0x0441, 0x04AB, 0x0283, 0x0286, 0x090E, 0x0946, 0x01AA, 0x0285, 0x3047, 0x30A7, 0xFF6A, 0x212E, 0xF6EC, 0x03B7, 0x0568, 0x03AE, 0x00F0, 0x1EBD, 0x1E1B, 0x0591, 0x0591, 0x0591, 0x0591, 0x01DD, 0x3161, 0x20AC, 0x09C7, 0x0947, 0x0AC7, 0x0021, 0x055C, 0x203C, 0x00A1, 0xF7A1, 0xFF01, 0xF721, 0x2203, 0x0292, 0x01EF, 0x0293, 0x01B9, 0x01BA, 0x0066, 0x095E, 0x0A5E, 0x2109, 0x064E, 0x064E, 0x064B, 0x3108, 0x24D5, 0x1E1F, 0x0641, 0x0586, 0xFED2, 0xFED3, 0xFED4, 0x03E5, 0x2640, 0xFB00, 0xFB03, 0xFB04, 0xFB01, 0x246E, 0x2482, 0x2496, 0x2012, 0x25A0, 0x25AC, 0x05DA, 0xFB3A, 0xFB3A, 0x05DA, 0x05DD, 0x05DD, 0x05DF, 0x05DF, 0x05E3, 0x05E3, 0x05E5, 0x05E5, 0x02C9, 0x25C9, 0x0473, 0x0035, 0x0665, 0x09EB, 0x2464, 0x278E, 0x096B, 0x215D, 0x0AEB, 0x0A6B, 0x0665, 0x3025, 0x3224, 0x2085, 0xFF15, 0xF735, 0x2478, 0x248C, 0x06F5, 0x2174, 0x2075, 0x0E55, 0xFB02, 0x0192, 0xFF46, 0x3399, 0x0E1F, 0x0E1D, 0x0E4F, 0x2200, 0x0034, 0x0664, 0x09EA, 0x2463, 0x278D, 0x096A, 0x0AEA, 0x0A6A, 0x0664, 0x3024, 0x3223, 0x2084, 0xFF14, 0x09F7, 0xF734, 0x2477, 0x248B, 0x06F4, 0x2173, 0x2074, 0x246D, 0x2481, 0x2495, 0x0E54, 0x02CB, 0x24A1, 0x2044, 0x20A3, 0x0067, 0x0997, 0x01F5, 0x0917, 0x06AF, 0xFB93, 0xFB94, 0xFB95, 0x0A97, 0x0A17, 0x304C, 0x30AC, 0x03B3, 0x0263, 0x02E0, 0x03EB, 0x310D, 0x011F, 0x01E7, 0x0123, 0x24D6, 0x011D, 0x0123, 0x0121, 0x0121, 0x0433, 0x3052, 0x30B2, 0x2251, 0x059C, 0x05F3, 0x059D, 0x00DF, 0x059E, 0x05F4, 0x3013, 0x0998, 0x0572, 0x0918, 0x0A98, 0x0A18, 0x063A, 0xFECE, 0xFECF, 0xFED0, 0x0495, 0x0493, 0x0491, 0x095A, 0x0A5A, 0x0260, 0x3393, 0x304E, 0x30AE, 0x0563, 0x05D2, 0xFB32, 0xFB32, 0x05D2, 0x0453, 0x01BE, 0x0294, 0x0296, 0x02C0, 0x0295, 0x02C1, 0x02E4, 0x02A1, 0x02A2, 0x1E21, 0xFF47, 0x3054, 0x30B4, 0x24A2, 0x33AC, 0x2207, 0x0060, 0x0316, 0x0300, 0x0300, 0x0953, 0x02CE, 0xFF40, 0x0340, 0x003E, 0x2265, 0x22DB, 0xFF1E, 0x2273, 0x2277, 0x2267, 0xFE65, 0x0261, 0x01E5, 0x3050, 0x00AB, 0x00BB, 0x2039, 0x203A, 0x30B0, 0x3318, 0x33C9, 0x0068, 0x04A9, 0x06C1, 0x09B9, 0x04B3, 0x0939, 0x0AB9, 0x0A39, 0x062D, 0xFEA2, 0xFEA3, 0x306F, 0xFEA4, 0x332A, 0x30CF, 0xFF8A, 0x0A4D, 0x0621, 0x0621, 0x3164, 0x044A, 0x21BC, 0x21C0, 0x33CA, 0x05B2, 0x05B2, 0x05B2, 0x05B2, 0x05B2, 0x05B2, 0x05B2, 0x05B2, 0x05B3, 0x05B3, 0x05B3, 0x05B3, 0x05B3, 0x05B3, 0x05B3, 0x05B3, 0x05B1, 0x05B1, 0x05B1, 0x05B1, 0x05B1, 0x05B1, 0x05B1, 0x05B1, 0x0127, 0x310F, 0x1E2B, 0x1E29, 0x24D7, 0x0125, 0x1E27, 0x1E23, 0x1E25, 0x05D4, 0x2665, 0x2665, 0x2661, 0xFB34, 0xFB34, 0x06C1, 0x0647, 0x05D4, 0xFBA7, 0xFEEA, 0xFEEA, 0xFBA5, 0xFBA4, 0xFBA8, 0xFEEB, 0x3078, 0xFBA9, 0xFEEC, 0x337B, 0x30D8, 0xFF8D, 0x3336, 0x0267, 0x3339, 0x05D7, 0x05D7, 0x0266, 0x02B1, 0x327B, 0x321B, 0x326D, 0x314E, 0x320D, 0x3072, 0x30D2, 0xFF8B, 0x05B4, 0x05B4, 0x05B4, 0x05B4, 0x05B4, 0x05B4, 0x05B4, 0x05B4, 0x1E96, 0xFF48, 0x0570, 0x0E2B, 0x307B, 0x30DB, 0xFF8E, 0x05B9, 0x05B9, 0x05B9, 0x05B9, 0x05B9, 0x05B9, 0x05B9, 0x05B9, 0x0E2E, 0x0309, 0x0309, 0x0321, 0x0322, 0x3342, 0x03E9, 0x2015, 0x031B, 0x2668, 0x2302, 0x24A3, 0x02B0, 0x0265, 0x3075, 0x3333, 0x30D5, 0xFF8C, 0x02DD, 0x030B, 0x0195, 0x002D, 0xF6E5, 0xFF0D, 0xFE63, 0xF6E6, 0x2010, 0x0069, 0x00ED, 0x044F, 0x0987, 0x3127, 0x012D, 0x01D0, 0x24D8, 0x00EE, 0x0456, 0x0209, 0x328F, 0x328B, 0x323F, 0x323A, 0x32A5, 0x3006, 0x3001, 0xFF64, 0x3237, 0x32A3, 0x322F, 0x323D, 0x329D, 0x3240, 0x3296, 0x3236, 0x322B, 0x3232, 0x32A4, 0x3005, 0x3298, 0x3238, 0x32A7, 0x32A6, 0x32A9, 0x322E, 0x322A, 0x3234, 0x3002, 0x329E, 0x3243, 0x3239, 0x323E, 0x32A8, 0x3299, 0x3242, 0x3233, 0x3000, 0x3235, 0x3231, 0x323B, 0x3230, 0x323C, 0x322C, 0x322D, 0x3007, 0x328E, 0x328A, 0x3294, 0x3290, 0x328C, 0x328D, 0x0907, 0x00EF, 0x1E2F, 0x04E5, 0x1ECB, 0x04D7, 0x0435, 0x3275, 0x3215, 0x3267, 0x3147, 0x3207, 0x00EC, 0x0A87, 0x0A07, 0x3044, 0x1EC9, 0x0988, 0x0438, 0x0908, 0x0A88, 0x0A08, 0x0A40, 0x020B, 0x0439, 0x09C0, 0x0940, 0x0AC0, 0x0133, 0x30A4, 0xFF72, 0x3163, 0x02DC, 0x05AC, 0x012B, 0x04E3, 0x2253, 0x0A3F, 0xFF49, 0x2206, 0x221E, 0x056B, 0x222B, 0x2321, 0x2321, 0xF8F5, 0x2320, 0x2320, 0x2229, 0x3305, 0x25D8, 0x25D9, 0x263B, 0x0451, 0x012F, 0x03B9, 0x03CA, 0x0390, 0x0269, 0x03AF, 0x24A4, 0x0A72, 0x3043, 0x30A3, 0xFF68, 0x09FA, 0x0268, 0xF6ED, 0x309D, 0x30FD, 0x0129, 0x1E2D, 0x3129, 0x044E, 0x09BF, 0x093F, 0x0ABF, 0x0475, 0x0477, 0x006A, 0x0571, 0x099C, 0x091C, 0x0A9C, 0x0A1C, 0x3110, 0x01F0, 0x24D9, 0x0135, 0x029D, 0x025F, 0x0458, 0x062C, 0xFE9E, 0xFE9F, 0xFEA0, 0x0698, 0xFB8B, 0x099D, 0x091D, 0x0A9D, 0x0A1D, 0x057B, 0x3004, 0xFF4A, 0x24A5, 0x02B2, 0x006B, 0x04A1, 0x0995, 0x1E31, 0x043A, 0x049B, 0x0915, 0x05DB, 0x0643, 0xFB3B, 0xFB3B, 0xFEDA, 0x05DB, 0xFEDB, 0xFEDC, 0xFB4D, 0x0A95, 0x0A15, 0x304B, 0x04C4, 0x30AB, 0xFF76, 0x03BA, 0x03F0, 0x3171, 0x3184, 0x3178, 0x3179, 0x330D, 0x0640, 0x0640, 0x30F5, 0x3384, 0x0650, 0x064D, 0x049F, 0xFF70, 0x049D, 0x310E, 0x3389, 0x01E9, 0x0137, 0x24DA, 0x0137, 0x1E33, 0x0584, 0x3051, 0x30B1, 0xFF79, 0x056F, 0x30F6, 0x0138, 0x0996, 0x0445, 0x0916, 0x0A96, 0x0A16, 0x062E, 0xFEA6, 0xFEA7, 0xFEA8, 0x03E7, 0x0959, 0x0A59, 0x3278, 0x3218, 0x326A, 0x314B, 0x320A, 0x0E02, 0x0E05, 0x0E03, 0x0E04, 0x0E5B, 0x0199, 0x0E06, 0x3391, 0x304D, 0x30AD, 0xFF77, 0x3315, 0x3316, 0x3314, 0x326E, 0x320E, 0x3260, 0x3131, 0x3200, 0x3133, 0x045C, 0x1E35, 0x3398, 0x33A6, 0xFF4B, 0x33A2, 0x3053, 0x33C0, 0x0E01, 0x30B3, 0xFF7A, 0x331E, 0x0481, 0x327F, 0x0343, 0x24A6, 0x33AA, 0x046F, 0x33CF, 0x029E, 0x304F, 0x30AF, 0xFF78, 0x33B8, 0x33BE, 0x006C, 0x09B2, 0x013A, 0x0932, 0x0AB2, 0x0A32, 0x0E45, 0xFEFC, 0xFEF8, 0xFEF7, 0xFEFA, 0xFEF9, 0xFEFB, 0xFEF6, 0xFEF5, 0x0644, 0x03BB, 0x019B, 0x05DC, 0xFB3C, 0xFB3C, 0x05DC, 0xFEDE, 0xFCCA, 0xFEDF, 0xFCC9, 0xFCCB, 0xFDF2, 0xFEE0, 0xFD88, 0xFCCC, 0x25EF, 0x019A, 0x026C, 0x310C, 0x013E, 0x013C, 0x24DB, 0x1E3D, 0x013C, 0x0140, 0x0140, 0x1E37, 0x1E39, 0x031A, 0x0318, 0x003C, 0x2264, 0x22DA, 0xFF1C, 0x2272, 0x2276, 0x2266, 0xFE64, 0x026E, 0x258C, 0x026D, 0x20A4, 0x056C, 0x01C9, 0x0459, 0xF6C0, 0x0933, 0x0AB3, 0x1E3B, 0x0934, 0x09E1, 0x0961, 0x09E3, 0x0963, 0x026B, 0xFF4C, 0x33D0, 0x0E2C, 0x2227, 0x00AC, 0x2310, 0x2228, 0x0E25, 0x017F, 0xFE4E, 0x0332, 0xFE4D, 0x25CA, 0x24A7, 0x0142, 0x2113, 0xF6EE, 0x2591, 0x0E26, 0x098C, 0x090C, 0x09E2, 0x0962, 0x33D3, 0x006D, 0x09AE, 0x00AF, 0x0331, 0x0304, 0x02CD, 0xFFE3, 0x1E3F, 0x092E, 0x0AAE, 0x0A2E, 0x05A4, 0x05A4, 0x307E, 0xF895, 0xF894, 0x0E4B, 0xF893, 0xF88C, 0xF88B, 0x0E48, 0xF88A, 0xF884, 0x0E31, 0xF889, 0x0E47, 0xF88F, 0xF88E, 0x0E49, 0xF88D, 0xF892, 0xF891, 0x0E4A, 0xF890, 0x0E46, 0x30DE, 0xFF8F, 0x2642, 0x3347, 0x05BE, 0x2642, 0x05AF, 0x3383, 0x3107, 0x33D4, 0x24DC, 0x33A5, 0x1E41, 0x1E43, 0x0645, 0xFEE2, 0xFEE3, 0xFEE4, 0xFCD1, 0xFC48, 0x334D, 0x3081, 0x337E, 0x30E1, 0xFF92, 0x05DE, 0xFB3E, 0xFB3E, 0x05DE, 0x0574, 0x05A5, 0x05A6, 0x05A6, 0x05A5, 0x0271, 0x3392, 0xFF65, 0x00B7, 0x3272, 0x3212, 0x3264, 0x3141, 0x3170, 0x3204, 0x316E, 0x316F, 0x307F, 0x30DF, 0xFF90, 0x2212, 0x0320, 0x2296, 0x02D7, 0x2213, 0x2032, 0x334A, 0x3349, 0x0270, 0x3396, 0x33A3, 0xFF4D, 0x339F, 0x3082, 0x33C1, 0x30E2, 0xFF93, 0x33D6, 0x0E21, 0x33A7, 0x33A8, 0x24A8, 0x33AB, 0x33B3, 0xF6EF, 0x026F, 0x00B5, 0x00B5, 0x3382, 0x226B, 0x226A, 0x338C, 0x03BC, 0x338D, 0x3080, 0x30E0, 0xFF91, 0x3395, 0x00D7, 0x339B, 0x05A3, 0x05A3, 0x266A, 0x266B, 0x266D, 0x266F, 0x33B2, 0x33B6, 0x33BC, 0x33B9, 0x33B7, 0x33BF, 0x33BD, 0x006E, 0x09A8, 0x2207, 0x0144, 0x0928, 0x0AA8, 0x0A28, 0x306A, 0x30CA, 0xFF85, 0x0149, 0x3381, 0x310B, 0x00A0, 0x0148, 0x0146, 0x24DD, 0x1E4B, 0x0146, 0x1E45, 0x1E47, 0x306D, 0x30CD, 0xFF88, 0x20AA, 0x338B, 0x0999, 0x0919, 0x0A99, 0x0A19, 0x0E07, 0x3093, 0x0272, 0x0273, 0x326F, 0x320F, 0x3135, 0x3261, 0x3136, 0x3134, 0x3168, 0x3201, 0x3167, 0x3166, 0x306B, 0x30CB, 0xFF86, 0xF899, 0x0E4D, 0x0039, 0x0669, 0x09EF, 0x2468, 0x2792, 0x096F, 0x0AEF, 0x0A6F, 0x0669, 0x3029, 0x3228, 0x2089, 0xFF19, 0xF739, 0x247C, 0x2490, 0x06F9, 0x2178, 0x2079, 0x2472, 0x2486, 0x249A, 0x0E59, 0x01CC, 0x045A, 0x30F3, 0xFF9D, 0x019E, 0x1E49, 0xFF4E, 0x339A, 0x09A3, 0x0923, 0x0AA3, 0x0A23, 0x0929, 0x306E, 0x30CE, 0xFF89, 0x00A0, 0x0E13, 0xFFFF, 0x0E19, 0x0646, 0xFEE6, 0x06BA, 0xFB9F, 0xFEE7, 0xFCD2, 0xFC4B, 0xFEE8, 0xFCD5, 0xFC4E, 0xFC8D, 0x220C, 0x2209, 0x2209, 0x2260, 0x226F, 0x2271, 0x2279, 0x2262, 0x226E, 0x2270, 0x2226, 0x2280, 0x2284, 0x2281, 0x2285, 0x0576, 0x24A9, 0x33B1, 0x207F, 0x00F1, 0x03BD, 0x306C, 0x30CC, 0xFF87, 0x09BC, 0x093C, 0x0ABC, 0x0A3C, 0x0023, 0xFF03, 0xFE5F, 0x0374, 0x0375, 0x2116, 0x05E0, 0xFB40, 0xFB40, 0x05E0, 0x33B5, 0x33BB, 0x099E, 0x091E, 0x0A9E, 0x0A1E, 0x006F, 0x00F3, 0x0E2D, 0x0275, 0x04E9, 0x04EB, 0x0993, 0x311B, 0x014F, 0x0911, 0x0A91, 0x0949, 0x0AC9, 0x01D2, 0x24DE, 0x00F4, 0x1ED1, 0x1ED9, 0x1ED3, 0x1ED5, 0x1ED7, 0x043E, 0x0151, 0x020D, 0x0913, 0x00F6, 0x04E7, 0x1ECD, 0x0153, 0x315A, 0x02DB, 0x0328, 0x00F2, 0x0A93, 0x0585, 0x304A, 0x1ECF, 0x01A1, 0x1EDB, 0x1EE3, 0x1EDD, 0x1EDF, 0x1EE1, 0x0151, 0x01A3, 0x020F, 0x30AA, 0xFF75, 0x3157, 0x05AB, 0x014D, 0x1E53, 0x1E51, 0x0950, 0x03C9, 0x03D6, 0x0461, 0x0277, 0x047B, 0x047D, 0x03CE, 0x0AD0, 0x03BF, 0x03CC, 0xFF4F, 0x0031, 0x0661, 0x09E7, 0x2460, 0x278A, 0x0967, 0x2024, 0x215B, 0xF6DC, 0x0AE7, 0x0A67, 0x0661, 0x00BD, 0x3021, 0x3220, 0x2081, 0xFF11, 0x09F4, 0xF731, 0x2474, 0x2488, 0x06F1, 0x00BC, 0x2170, 0x00B9, 0x0E51, 0x2153, 0x01EB, 0x01ED, 0x0A13, 0x0A4B, 0x0254, 0x24AA, 0x25E6, 0x2325, 0x00AA, 0x00BA, 0x221F, 0x0912, 0x094A, 0x00F8, 0x01FF, 0x3049, 0x30A9, 0xFF6B, 0x01FF, 0xF6F0, 0x047F, 0x00F5, 0x1E4D, 0x1E4F, 0x3121, 0x203E, 0xFE4A, 0x0305, 0xFE49, 0xFE4C, 0xFE4B, 0x00AF, 0x09CB, 0x094B, 0x0ACB, 0x0070, 0x3380, 0x332B, 0x09AA, 0x1E55, 0x092A, 0x21DF, 0x21DE, 0x0AAA, 0x0A2A, 0x3071, 0x0E2F, 0x30D1, 0x0484, 0x04C0, 0x317F, 0x00B6, 0x2225, 0x0028, 0xFD3E, 0xF8ED, 0xF8EC, 0x208D, 0xFF08, 0xFE59, 0x207D, 0xF8EB, 0xFE35, 0x0029, 0xFD3F, 0xF8F8, 0xF8F7, 0x208E, 0xFF09, 0xFE5A, 0x207E, 0xF8F6, 0xFE36, 0x2202, 0x05C0, 0x0599, 0x33A9, 0x05B7, 0x05B7, 0x05B7, 0x05B7, 0x05B7, 0x05B7, 0x05B7, 0x05B7, 0x05A1, 0x3106, 0x24DF, 0x1E57, 0x05E4, 0x043F, 0xFB44, 0xFB44, 0x333B, 0xFB43, 0x067E, 0x057A, 0x05E4, 0xFB57, 0xFB58, 0x307A, 0xFB59, 0x30DA, 0x04A7, 0xFB4E, 0x0025, 0x066A, 0xFF05, 0xFE6A, 0x002E, 0x0589, 0x00B7, 0xFF61, 0xF6E7, 0xFF0E, 0xFE52, 0xF6E8, 0x0342, 0x22A5, 0x2030, 0x20A7, 0x338A, 0x09AB, 0x092B, 0x0AAB, 0x0A2B, 0x03C6, 0x03D5, 0x327A, 0x321A, 0x326C, 0x314D, 0x320C, 0x0278, 0x0E3A, 0x03D5, 0x01A5, 0x0E1E, 0x0E1C, 0x0E20, 0x03C0, 0x3273, 0x3213, 0x3176, 0x3265, 0x3172, 0x3142, 0x3205, 0x3174, 0x3144, 0x3175, 0x3177, 0x3173, 0x3074, 0x30D4, 0x03D6, 0x0583, 0x002B, 0x031F, 0x2295, 0x00B1, 0x02D6, 0xFF0B, 0xFE62, 0x207A, 0xFF50, 0x33D8, 0x307D, 0x261F, 0x261C, 0x261E, 0x261D, 0x30DD, 0x0E1B, 0x3012, 0x3020, 0x24AB, 0x227A, 0x211E, 0x02B9, 0x2035, 0x220F, 0x2305, 0x30FC, 0x2318, 0x2282, 0x2283, 0x2237, 0x221D, 0x03C8, 0x0471, 0x0486, 0x33B0, 0x3077, 0x30D7, 0x33B4, 0x33BA, 0x0071, 0x0958, 0x05A8, 0x0642, 0xFED6, 0xFED7, 0xFED8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x05B8, 0x059F, 0x3111, 0x24E0, 0x02A0, 0xFF51, 0x05E7, 0xFB47, 0xFB47, 0x05E7, 0x24AC, 0x2669, 0x05BB, 0x05BB, 0x05BB, 0x05BB, 0x05BB, 0x05BB, 0x05BB, 0x05BB, 0x003F, 0x061F, 0x055E, 0x00BF, 0xF7BF, 0x037E, 0xFF1F, 0xF73F, 0x0022, 0x201E, 0x201C, 0xFF02, 0x301E, 0x301D, 0x201D, 0x2018, 0x201B, 0x201B, 0x2019, 0x0149, 0x201A, 0x0027, 0xFF07, 0x0072, 0x057C, 0x09B0, 0x0155, 0x0930, 0x221A, 0xF8E5, 0x33AE, 0x33AF, 0x33AD, 0x05BF, 0x05BF, 0x0AB0, 0x0A30, 0x3089, 0x30E9, 0xFF97, 0x09F1, 0x09F0, 0x0264, 0x2236, 0x3116, 0x0159, 0x0157, 0x24E1, 0x0157, 0x0211, 0x1E59, 0x1E5B, 0x1E5D, 0x203B, 0x2286, 0x2287, 0x00AE, 0xF8E8, 0xF6DA, 0x0631, 0x0580, 0xFEAE, 0x308C, 0x30EC, 0xFF9A, 0x05E8, 0xFB48, 0x05E8, 0x223D, 0x0597, 0x0597, 0x2310, 0x027E, 0x027F, 0x09DD, 0x095D, 0x03C1, 0x027D, 0x027B, 0x02B5, 0x03F1, 0x02DE, 0x3271, 0x3211, 0x3263, 0x3140, 0x313A, 0x3169, 0x3139, 0x313B, 0x316C, 0x3203, 0x313F, 0x313C, 0x316B, 0x313D, 0x313E, 0x316A, 0x316D, 0x221F, 0x0319, 0x22BF, 0x308A, 0x30EA, 0xFF98, 0x02DA, 0x0325, 0x030A, 0x02BF, 0x0559, 0x031C, 0x02D3, 0x02BE, 0x0339, 0x02D2, 0x0213, 0x3351, 0x1E5F, 0x027C, 0x027A, 0xFF52, 0x308D, 0x30ED, 0xFF9B, 0x0E23, 0x24AD, 0x09DC, 0x0931, 0x0A5C, 0x0691, 0xFB8D, 0x09E0, 0x0960, 0x0AE0, 0x09C4, 0x0944, 0x0AC4, 0xF6F1, 0x2590, 0x0279, 0x02B4, 0x308B, 0x30EB, 0xFF99, 0x09F2, 0x09F3, 0xF6DD, 0x0E24, 0x098B, 0x090B, 0x0A8B, 0x09C3, 0x0943, 0x0AC3, 0x0073, 0x09B8, 0x015B, 0x1E65, 0x0635, 0x0938, 0xFEBA, 0xFEBB, 0xFEBC, 0x0AB8, 0x0A38, 0x3055, 0x30B5, 0xFF7B, 0xFDFA, 0x05E1, 0xFB41, 0xFB41, 0x05E1, 0x0E32, 0x0E41, 0x0E44, 0x0E43, 0x0E33, 0x0E30, 0x0E40, 0xF886, 0x0E35, 0xF885, 0x0E34, 0x0E42, 0xF888, 0x0E37, 0xF887, 0x0E36, 0x0E38, 0x0E39, 0x3119, 0x0161, 0x1E67, 0x015F, 0x0259, 0x04D9, 0x04DB, 0x025A, 0x24E2, 0x015D, 0x0219, 0x1E61, 0x1E63, 0x1E69, 0x033C, 0x2033, 0x02CA, 0x00A7, 0x0633, 0xFEB2, 0xFEB3, 0xFEB4, 0x05B6, 0x05B6, 0x05B6, 0x05B6, 0x05B6, 0x05B6, 0x05B6, 0x0592, 0x05B6, 0x057D, 0x305B, 0x30BB, 0xFF7E, 0x003B, 0x061B, 0xFF1B, 0xFE54, 0x309C, 0xFF9F, 0x3322, 0x3323, 0x0037, 0x0667, 0x09ED, 0x2466, 0x2790, 0x096D, 0x215E, 0x0AED, 0x0A6D, 0x0667, 0x3027, 0x3226, 0x2087, 0xFF17, 0xF737, 0x247A, 0x248E, 0x06F7, 0x2176, 0x2077, 0x2470, 0x2484, 0x2498, 0x0E57, 0x00AD, 0x0577, 0x09B6, 0x0448, 0x0651, 0xFC61, 0xFC5E, 0xFC60, 0xFC62, 0xFC5F, 0x2592, 0x2593, 0x2591, 0x2592, 0x0936, 0x0AB6, 0x0A36, 0x0593, 0x3115, 0x0449, 0x0634, 0xFEB6, 0xFEB7, 0xFEB8, 0x03E3, 0x20AA, 0x20AA, 0x05B0, 0x05B0, 0x05B0, 0x05B0, 0x05B0, 0x05B0, 0x05B0, 0x05B0, 0x05B0, 0x04BB, 0x03ED, 0x05E9, 0xFB49, 0xFB49, 0xFB2C, 0xFB2C, 0xFB2D, 0xFB2D, 0x05C1, 0x05E9, 0xFB2A, 0xFB2A, 0xFB2B, 0xFB2B, 0x0282, 0x03C3, 0x03C2, 0x03C2, 0x03F2, 0x3057, 0x30B7, 0xFF7C, 0x05BD, 0x05BD, 0x223C, 0x05C2, 0x3274, 0x3214, 0x317E, 0x3266, 0x317A, 0x3145, 0x317B, 0x3206, 0x317D, 0x317C, 0x0036, 0x0666, 0x09EC, 0x2465, 0x278F, 0x096C, 0x0AEC, 0x0A6C, 0x0666, 0x3026, 0x3225, 0x2086, 0xFF16, 0xF736, 0x2479, 0x248D, 0x06F6, 0x2175, 0x2076, 0x246F, 0x09F9, 0x2483, 0x2497, 0x0E56, 0x002F, 0xFF0F, 0x017F, 0x1E9B, 0x263A, 0xFF53, 0x05C3, 0x00AD, 0x044C, 0x305D, 0x30BD, 0xFF7F, 0x0338, 0x0337, 0x0E29, 0x0E28, 0x0E0B, 0x0E2A, 0x0020, 0x0020, 0x2660, 0x2660, 0x2664, 0x24AE, 0x033B, 0x33C4, 0x339D, 0x25A9, 0x25A4, 0x338F, 0x339E, 0x33CE, 0x33D1, 0x33D2, 0x338E, 0x33D5, 0x339C, 0x33A1, 0x25A6, 0x25A7, 0x25A8, 0x25A5, 0x25A3, 0x33DB, 0x09B7, 0x0937, 0x0AB7, 0x3149, 0x3185, 0x3180, 0x3132, 0x3165, 0x3143, 0x3146, 0x3138, 0xF6F2, 0x00A3, 0xFFE1, 0x0336, 0x0335, 0x2282, 0x228A, 0x2286, 0x227B, 0x220B, 0x3059, 0x30B9, 0xFF7D, 0x0652, 0x2211, 0x263C, 0x2283, 0x228B, 0x2287, 0x33DC, 0x337C, 0x0074, 0x09A4, 0x22A4, 0x22A3, 0x0924, 0x0AA4, 0x0A24, 0x0637, 0xFEC2, 0xFEC3, 0x305F, 0xFEC4, 0x337D, 0x30BF, 0xFF80, 0x0640, 0x03C4, 0x05EA, 0xFB4A, 0xFB4A, 0xFB4A, 0x05EA, 0x0167, 0x310A, 0x0165, 0x02A8, 0x0163, 0x0686, 0xFB7B, 0xFB7C, 0xFB7D, 0x24E3, 0x1E71, 0x0163, 0x1E97, 0x1E6B, 0x1E6D, 0x0442, 0x04AD, 0x062A, 0xFE96, 0xFCA2, 0xFC0C, 0xFE97, 0x3066, 0xFCA1, 0xFC0B, 0x0629, 0xFE94, 0xFE98, 0xFCA4, 0xFC0E, 0xFC73, 0x30C6, 0xFF83, 0x2121, 0x260E, 0x05A0, 0x05A9, 0x2469, 0x3229, 0x247D, 0x2491, 0x2179, 0x02A7, 0x05D8, 0xFB38, 0xFB38, 0x05D8, 0x04B5, 0x059B, 0x059B, 0x09A5, 0x0925, 0x0AA5, 0x0A25, 0x0630, 0xFEAC, 0xF898, 0xF897, 0x0E4C, 0xF896, 0x062B, 0xFE9A, 0xFE9B, 0xFE9C, 0x2203, 0x2234, 0x03B8, 0x03D1, 0x03D1, 0x3279, 0x3219, 0x326B, 0x314C, 0x320B, 0x246C, 0x2480, 0x2494, 0x0E11, 0x01AD, 0x0E12, 0x00FE, 0x0E17, 0x0E10, 0x0E18, 0x0E16, 0x0482, 0x066C, 0x066C, 0x0033, 0x0663, 0x09E9, 0x2462, 0x278C, 0x0969, 0x215C, 0x0AE9, 0x0A69, 0x0663, 0x3023, 0x3222, 0x2083, 0xFF13, 0x09F6, 0xF733, 0x2476, 0x248A, 0x06F3, 0x00BE, 0xF6DE, 0x2172, 0x00B3, 0x0E53, 0x3394, 0x3061, 0x30C1, 0xFF81, 0x3270, 0x3210, 0x3262, 0x3137, 0x3202, 0x02DC, 0x0330, 0x0303, 0x0303, 0x0360, 0x223C, 0x0334, 0x033E, 0x2297, 0x0596, 0x0596, 0x0A70, 0x0483, 0x057F, 0x1E6F, 0xFF54, 0x0569, 0x3068, 0x30C8, 0xFF84, 0x02E5, 0x02E9, 0x02E6, 0x02E8, 0x02E7, 0x01BD, 0x0185, 0x01A8, 0x0384, 0x3327, 0x0E0F, 0x3014, 0xFE5D, 0xFE39, 0x3015, 0xFE5E, 0xFE3A, 0x0E15, 0x01AB, 0x24AF, 0x2122, 0xF8EA, 0xF6DB, 0x0288, 0x25BC, 0x25C4, 0x25BA, 0x25B2, 0x02A6, 0x05E6, 0xFB46, 0xFB46, 0x05E6, 0x0446, 0x05B5, 0x05B5, 0x05B5, 0x05B5, 0x05B5, 0x05B5, 0x05B5, 0x05B5, 0x045B, 0xF6F3, 0x099F, 0x091F, 0x0A9F, 0x0A1F, 0x0679, 0xFB67, 0xFB68, 0xFB69, 0x09A0, 0x0920, 0x0AA0, 0x0A20, 0x0287, 0x3064, 0x30C4, 0xFF82, 0x3063, 0x30C3, 0xFF6F, 0x246B, 0x247F, 0x2493, 0x217B, 0x2473, 0x5344, 0x2487, 0x249B, 0x0032, 0x0662, 0x09E8, 0x2461, 0x278B, 0x0968, 0x2025, 0x2025, 0xFE30, 0x0AE8, 0x0A68, 0x0662, 0x3022, 0x3221, 0x2082, 0xFF12, 0x09F5, 0xF732, 0x2475, 0x2489, 0x06F2, 0x2171, 0x01BB, 0x00B2, 0x0E52, 0x2154, 0x0075, 0x00FA, 0x0289, 0x0989, 0x3128, 0x016D, 0x01D4, 0x24E4, 0x00FB, 0x1E77, 0x0443, 0x0951, 0x0171, 0x0215, 0x0909, 0x00FC, 0x01D8, 0x1E73, 0x01DA, 0x04F1, 0x01DC, 0x01D6, 0x1EE5, 0x00F9, 0x0A89, 0x0A09, 0x3046, 0x1EE7, 0x01B0, 0x1EE9, 0x1EF1, 0x1EEB, 0x1EED, 0x1EEF, 0x0171, 0x04F3, 0x0217, 0x30A6, 0xFF73, 0x0479, 0x315C, 0x016B, 0x04EF, 0x1E7B, 0x0A41, 0xFF55, 0x005F, 0x2017, 0xFF3F, 0xFE33, 0xFE4F, 0x222A, 0x2200, 0x0173, 0x24B0, 0x2580, 0x05C4, 0x03C5, 0x03CB, 0x03B0, 0x028A, 0x03CD, 0x031D, 0x02D4, 0x0A73, 0x016F, 0x045E, 0x3045, 0x30A5, 0xFF69, 0x04AF, 0x04B1, 0x0169, 0x1E79, 0x1E75, 0x098A, 0x090A, 0x0A8A, 0x0A0A, 0x0A42, 0x09C2, 0x0942, 0x0AC2, 0x09C1, 0x0941, 0x0AC1, 0x0076, 0x0935, 0x0AB5, 0x0A35, 0x30F7, 0x05D5, 0xFB35, 0xFB35, 0xFB35, 0x05D5, 0xFB4B, 0xFB4B, 0x05F0, 0x05F1, 0x24E5, 0x1E7F, 0x0432, 0x06A4, 0xFB6B, 0xFB6C, 0xFB6D, 0x30F9, 0x2640, 0x007C, 0x030D, 0x0329, 0x02CC, 0x02C8, 0x057E, 0x028B, 0x30F8, 0x09CD, 0x094D, 0x0ACD, 0x0983, 0x0903, 0x0A83, 0xFF56, 0x0578, 0x309E, 0x30FE, 0x309B, 0xFF9E, 0x30FA, 0x24B1, 0x1E7D, 0x028C, 0x3094, 0x30F4, 0x0077, 0x1E83, 0x3159, 0x308F, 0x30EF, 0xFF9C, 0x3158, 0x308E, 0x30EE, 0x3357, 0x301C, 0xFE34, 0x0648, 0xFEEE, 0x0624, 0xFE86, 0x33DD, 0x24E6, 0x0175, 0x1E85, 0x1E87, 0x1E89, 0x3091, 0x2118, 0x30F1, 0x315E, 0x315D, 0x1E81, 0x25E6, 0x25CB, 0x25D9, 0x300E, 0xFE43, 0x300F, 0xFE44, 0x25C7, 0x25C8, 0x25BF, 0x25BD, 0x25C3, 0x25C1, 0x3016, 0x3017, 0x25B9, 0x25B7, 0x25AB, 0x263A, 0x25A1, 0x2606, 0x260F, 0x3018, 0x3019, 0x25B5, 0x25B3, 0x3090, 0x30F0, 0x315F, 0xFF57, 0x3092, 0x30F2, 0xFF66, 0x20A9, 0xFFE6, 0x0E27, 0x24B2, 0x1E98, 0x02B7, 0x028D, 0x01BF, 0x0078, 0x033D, 0x3112, 0x24E7, 0x1E8D, 0x1E8B, 0x056D, 0x03BE, 0xFF58, 0x24B3, 0x02E3, 0x0079, 0x334E, 0x09AF, 0x00FD, 0x092F, 0x3152, 0x0AAF, 0x0A2F, 0x3084, 0x30E4, 0xFF94, 0x3151, 0x0E4E, 0x3083, 0x30E3, 0xFF6C, 0x0463, 0x24E8, 0x0177, 0x00FF, 0x1E8F, 0x1EF5, 0x064A, 0x06D2, 0xFBAF, 0xFEF2, 0x0626, 0xFE8A, 0xFE8B, 0xFE8C, 0xFEF3, 0xFEF4, 0xFCDD, 0xFC58, 0xFC94, 0x06D1, 0x3156, 0x00A5, 0xFFE5, 0x3155, 0x3186, 0x05AA, 0x05AA, 0x044B, 0x04F9, 0x3181, 0x3183, 0x3182, 0x059A, 0x1EF3, 0x01B4, 0x1EF7, 0x0575, 0x0457, 0x3162, 0x262F, 0x0582, 0xFF59, 0x05D9, 0xFB39, 0xFB39, 0x05D9, 0x05F2, 0xFB1F, 0x3088, 0x3189, 0x30E8, 0xFF96, 0x315B, 0x3087, 0x30E7, 0xFF6E, 0x03F3, 0x3188, 0x3187, 0x0E22, 0x0E0D, 0x24B4, 0x037A, 0x0345, 0x01A6, 0x1E99, 0x02B8, 0x1EF9, 0x028E, 0x3086, 0x318C, 0x30E6, 0xFF95, 0x3160, 0x046B, 0x046D, 0x0467, 0x0469, 0x3085, 0x30E5, 0xFF6D, 0x318B, 0x318A, 0x09DF, 0x095F, 0x007A, 0x0566, 0x017A, 0x095B, 0x0A5B, 0x0638, 0xFEC6, 0xFEC7, 0x3056, 0xFEC8, 0x0632, 0xFEB0, 0x30B6, 0x0595, 0x0594, 0x0598, 0x05D6, 0xFB36, 0xFB36, 0x05D6, 0x3117, 0x017E, 0x24E9, 0x1E91, 0x0291, 0x017C, 0x017C, 0x1E93, 0x0437, 0x0499, 0x04DF, 0x305C, 0x30BC, 0x0030, 0x0660, 0x09E6, 0x0966, 0x0AE6, 0x0A66, 0x0660, 0x2080, 0xFF10, 0xF730, 0x06F0, 0x2070, 0x0E50, 0xFEFF, 0x200C, 0x200B, 0x03B6, 0x3113, 0x056A, 0x04C2, 0x0436, 0x0497, 0x04DD, 0x3058, 0x30B8, 0x05AE, 0x1E95, 0xFF5A, 0x305E, 0x30BE, 0x24B5, 0x0290, 0x01B6, 0x305A, 0x30BA, }; wchar_t ps_glyph_to_unicode(glyph g) { if (g < lenof(ps_codes_alphabetic)) return ps_codes_alphabetic[g]; return 0xFFFF; } /* ---------------------------------------------------------------------- * Data about the standard fonts: available glyphs and font metrics. */ /* * Character set list extracted from the back of the PostScript * Language Reference Manual. * * I'm going to include a bit of shell which creates a file * containing the list of characters, and then several further bits * of shell that process it in different ways. */ /* tr -s ' \n' '\n' << EOF > stdchars.txt A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z AE Aacute Acircumflex Adieresis Agrave Aring Atilde Ccedilla Eacute Ecircumflex Edieresis Egrave Eth Iacute Icircumflex Idieresis Igrave Lslash Ntilde OE Oacute Ocircumflex Odieresis Ograve Oslash Otilde Scaron Thorn Uacute Ucircumflex Udieresis Ugrave Yacute Ydieresis Zcaron ae aacute acircumflex adieresis agrave aring atilde ccedilla eacute ecircumflex edieresis egrave eth iacute icircumflex idieresis igrave lslash ntilde oe oacute ocircumflex odieresis ograve oslash otilde scaron thorn uacute ucircumflex udieresis ugrave yacute ydieresis zcaron acute ampersand asciicircum asciitilde asterisk at backslash bar braceleft braceright bracketleft bracketright breve brokenbar bullet caron cedilla cent circumflex colon comma copyright currency dagger daggerdbl degree dieresis divide dollar dotaccent dotlessi eight ellipsis emdash endash equal exclam exclamdown fi five fl florin four fraction germandbls grave greater guillemotleft guillemotright guilsinglleft guilsinglright hungarumlaut hyphen less logicalnot macron minus mu multiply nine numbersign ogonek one onehalf onequarter onesuperior ordfeminine ordmasculine paragraph parenleft parenright percent period periodcentered perthousand plus plusminus question questiondown quotedbl quotedblbase quotedblleft quotedblright quoteleft quoteright quotesinglbase quotesingle registered ring section semicolon seven six slash space sterling three threequarters threesuperior tilde trademark two twosuperior underscore yen zero EOF */ /* * A simple string array giving the glyph list. */ /* perl -ne 'chomp; print "\"$_\", "; END { print "NULL" }' stdchars.txt | \ fold -s -w68 | sed 's/^/ /' */ const char *const ps_std_glyphs[] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "AE", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Eth", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Lslash", "Ntilde", "OE", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Oslash", "Otilde", "Scaron", "Thorn", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "ae", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "eth", "iacute", "icircumflex", "idieresis", "igrave", "lslash", "ntilde", "oe", "oacute", "ocircumflex", "odieresis", "ograve", "oslash", "otilde", "scaron", "thorn", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "acute", "ampersand", "asciicircum", "asciitilde", "asterisk", "at", "backslash", "bar", "braceleft", "braceright", "bracketleft", "bracketright", "breve", "brokenbar", "bullet", "caron", "cedilla", "cent", "circumflex", "colon", "comma", "copyright", "currency", "dagger", "daggerdbl", "degree", "dieresis", "divide", "dollar", "dotaccent", "dotlessi", "eight", "ellipsis", "emdash", "endash", "equal", "exclam", "exclamdown", "fi", "five", "fl", "florin", "four", "fraction", "germandbls", "grave", "greater", "guillemotleft", "guillemotright", "guilsinglleft", "guilsinglright", "hungarumlaut", "hyphen", "less", "logicalnot", "macron", "minus", "mu", "multiply", "nine", "numbersign", "ogonek", "one", "onehalf", "onequarter", "onesuperior", "ordfeminine", "ordmasculine", "paragraph", "parenleft", "parenright", "percent", "period", "periodcentered", "perthousand", "plus", "plusminus", "question", "questiondown", "quotedbl", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "quotesinglbase", "quotesingle", "registered", "ring", "section", "semicolon", "seven", "six", "slash", "space", "sterling", "three", "threequarters", "threesuperior", "tilde", "trademark", "two", "twosuperior", "underscore", "yen", "zero", NULL }; /* * Standard TrueType glyph mapping, from the TrueType reference manual. */ /* wget http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6post.html < Chap6post.html \ sed -n '/<td>\.notdef/,/<\/table>/s/^.*<td>\([^0-9].*\)<\/td>$/\1/p' | perl -e ' open G, "glyphnames.txt" or die; chomp(@g = <G>); %g = map(($_, $i++), @g); while(<>){chomp;print"$g{$_}, "} print "NOGLYPH\n";' | fold -sw68 | sed 's/^/ /' */ glyph const tt_std_glyphs[] = { 0, 1, 2740, 3501, 1776, 3136, 2781, 1597, 2994, 1079, 3149, 2942, 2952, 1165, 3046, 1411, 2128, 2998, 3483, 4168, 2862, 3793, 3669, 1860, 1831, 3459, 3362, 1671, 2699, 1404, 3354, 2464, 1738, 1972, 3128, 1174, 2, 53, 66, 95, 129, 194, 205, 234, 258, 303, 311, 339, 361, 374, 395, 461, 476, 480, 501, 572, 605, 660, 670, 680, 688, 713, 1286, 1196, 1291, 1156, 3865, 1964, 736, 1194, 1314, 1483, 1632, 1789, 1888, 1990, 2134, 2276, 2304, 2418, 2513, 2650, 2797, 2924, 3086, 3151, 3282, 3559, 3819, 3905, 3954, 4023, 4034, 4135, 1272, 1204, 1279, 1158, 29, 45, 72, 130, 392, 416, 617, 738, 1032, 760, 777, 1175, 1113, 1334, 1633, 1664, 1647, 1657, 2135, 2209, 2142, 2198, 2772, 2798, 2829, 2812, 2822, 2910, 3820, 3842, 3827, 3834, 1493, 1554, 1344, 3539, 3336, 1310, 2940, 1920, 3184, 1461, 3742, 766, 1574, 2756, 3, 451, 2237, 3049, 2465, 1973, 4071, 2623, 2962, 3552, 3070, 3029, 2239, 2897, 2898, 438, 782, 2902, 3131, 1779, 2493, 3156, 1853, 1106, 109, 1983, 1984, 1707, 2738, 35, 50, 457, 396, 2825, 1720, 1713, 3138, 3142, 3143, 3146, 1583, 2501, 4053, 694, 1886, 1478, 1985, 1986, 1809, 1852, 1494, 3000, 3148, 3137, 3008, 18, 137, 7, 147, 153, 262, 267, 271, 281, 398, 406, 1104, 421, 606, 611, 626, 1610, 1389, 3702, 2515, 1296, 1605, 3233, 1342, 2125, 2827, 1328, 358, 2503, 545, 3320, 716, 4156, 1304, 186, 1763, 689, 4037, 588, 3661, 2597, 2635, 2886, 3816, 3691, 2874, 2884, 3688, 1887, 211, 1905, 276, 548, 3322, 68, 1317, 71, 1333, 1537, NOGLYPH }; /* * Character width information from the standard PS fonts. * Units are UNITS_PER_PT defined in paper.h. * Extracted from the AFM files in * <http://partners.adobe.com/public/developer/en/pdf/Core14_AFMs.tar> * by the following script: fonts="Times-Roman Times-Italic Times-Bold Times-BoldItalic \ Helvetica Helvetica-Oblique Helvetica-Bold Helvetica-BoldOblique \ Courier Courier-Oblique Courier-Bold Courier-BoldOblique" for i in $fonts; do printf 'static const kern_pair %s_kerns[] = {\n' $(echo $i | tr 'A-Z\-' a-z_) perl -e ' open S, "stdchars.txt" or die; chomp(@s = <S>); open G, "glyphnames.txt" or die; chomp(@g = <G>); %g = map(($_, $i++), @g); %g = map(($_, $g{$_}), @s); open M, "$ARGV[0].afm" or die; while (<M>) { /KPX (\S+) (\S+) (\S+)/ and exists $g{$1} and exists $g{$2} and print "{$g{$1},$g{$2},$3}, "; } print "\n"' $i |\ fold -sw 68 | sed 's/^/ /' printf ' {NOGLYPH,NOGLYPH,0}\n};\n' printf 'static const ligature %s_ligs[] = {\n' $(echo $i | tr 'A-Z\-' a-z_) perl -e ' open S, "stdchars.txt" or die; chomp(@s = <S>); open G, "glyphnames.txt" or die; chomp(@g = <G>); %g = map(($_, $i++), @g); %g = map(($_, $g{$_}), @s); open M, "$ARGV[0].afm" or die; while (<M>) { / N (\S+) / and $l = $1; while (/ L (\S+) (\S+) /g) { exists $g{$l} and exists $g{$1} and exists $g{$2} and print "{$g{$l},$g{$1},$g{$2}}, "; } } print "\n"' $i |\ fold -sw 68 | sed 's/^/ /' printf ' {NOGLYPH,NOGLYPH,NOGLYPH}\n};\n' done cat <<DECL static const struct ps_std_font_data { char const *name; kern_pair const *kerns; ligature const *ligs; int widths[lenof(ps_std_glyphs)-1]; } ps_std_fonts[] = { DECL for i in $fonts; do printf ' { "%s",\n\t%s_kerns, %s_ligs, {\n' $i \ $(echo $i | tr 'A-Z\-' a-z_) $(echo $i | tr 'A-Z\-' a-z_) perl -e ' open M, "$ARGV[0].afm" or die; while (<M>) { /WX (\d+) ; N (\S+)/ and $m{$2} = $1; } open G, "stdchars.txt" or die; while (<G>) { chomp; print "$m{$_}, " }; print "\n"' $i |\ fold -sw 68 | sed 's/^/ /' printf ' }},\n' done printf '};\n' * The AFM files have the following copyright and licence: * * Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1993, 1997 * Adobe Systems Incorporated. All Rights Reserved. * * This file and the 14 PostScript(R) AFM files it accompanies may be * used, copied, and distributed for any purpose and without charge, * with or without modification, provided that all copyright notices * are retained; that the AFM files are not distributed without this * file; that all modifications to this file or any of the AFM files * are prominently noted in the modified file(s); and that this * paragraph is not modified. Adobe Systems has no responsibility or * obligation to support the use of the AFM files. */ static const kern_pair times_roman_kerns[] = { {2,66,-40}, {2,72,-40}, {2,205,-40}, {2,395,-55}, {2,398,-55}, {2,406,-55}, {2,416,-55}, {2,421,-55}, {2,451,-55}, {2,457,-55}, {2,476,-55}, {2,572,-111}, {2,605,-55}, {2,606,-55}, {2,611,-55}, {2,617,-55}, {2,626,-55}, {2,660,-135}, {2,670,-90}, {2,688,-105}, {2,689,-105}, {2,694,-105}, {2,3146,-111}, {2,3905,-74}, {2,3954,-92}, {2,4034,-92}, {2,4037,-92}, {2,4053,-92}, {7,66,-40}, {7,72,-40}, {7,205,-40}, {7,395,-55}, {7,398,-55}, {7,406,-55}, {7,416,-55}, {7,421,-55}, {7,451,-55}, {7,457,-55}, {7,476,-55}, {7,572,-111}, {7,605,-55}, {7,606,-55}, {7,611,-55}, {7,617,-55}, {7,626,-55}, {7,660,-135}, {7,670,-90}, {7,688,-105}, {7,689,-105}, {7,694,-105}, {7,3146,-111}, {7,3905,-74}, {7,3954,-92}, {7,4034,-92}, {7,4037,-92}, {7,4053,-92}, {18,66,-40}, {18,72,-40}, {18,205,-40}, {18,395,-55}, {18,398,-55}, {18,406,-55}, {18,416,-55}, {18,421,-55}, {18,451,-55}, {18,457,-55}, {18,476,-55}, {18,572,-111}, {18,605,-55}, {18,606,-55}, {18,611,-55}, {18,617,-55}, {18,626,-55}, {18,660,-135}, {18,670,-90}, {18,688,-105}, {18,689,-105}, {18,694,-105}, {18,3146,-111}, {18,3905,-74}, {18,3954,-92}, {18,4034,-92}, {18,4037,-92}, {18,4053,-92}, {29,66,-40}, {29,72,-40}, {29,205,-40}, {29,395,-55}, {29,398,-55}, {29,406,-55}, {29,416,-55}, {29,421,-55}, {29,451,-55}, {29,457,-55}, {29,476,-55}, {29,572,-111}, {29,605,-55}, {29,606,-55}, {29,611,-55}, {29,617,-55}, {29,626,-55}, {29,660,-135}, {29,670,-90}, {29,688,-105}, {29,689,-105}, {29,694,-105}, {29,3146,-111}, {29,3905,-74}, {29,3954,-92}, {29,4034,-92}, {29,4037,-92}, {29,4053,-92}, {35,66,-40}, {35,72,-40}, {35,205,-40}, {35,395,-55}, {35,398,-55}, {35,406,-55}, {35,416,-55}, {35,421,-55}, {35,451,-55}, {35,457,-55}, {35,476,-55}, {35,572,-111}, {35,605,-55}, {35,606,-55}, {35,611,-55}, {35,617,-55}, {35,626,-55}, {35,660,-135}, {35,670,-90}, {35,688,-105}, {35,689,-105}, {35,694,-105}, {35,3146,-111}, {35,3905,-74}, {35,3954,-92}, {35,4034,-92}, {35,4037,-92}, {35,4053,-92}, {45,66,-40}, {45,72,-40}, {45,205,-40}, {45,395,-55}, {45,398,-55}, {45,406,-55}, {45,416,-55}, {45,421,-55}, {45,451,-55}, {45,457,-55}, {45,476,-55}, {45,572,-111}, {45,605,-55}, {45,606,-55}, {45,611,-55}, {45,617,-55}, {45,626,-55}, {45,660,-135}, {45,670,-90}, {45,688,-105}, {45,689,-105}, {45,694,-105}, {45,3146,-111}, {45,3905,-74}, {45,3954,-92}, {45,4034,-92}, {45,4037,-92}, {45,4053,-92}, {50,66,-40}, {50,72,-40}, {50,205,-40}, {50,395,-55}, {50,398,-55}, {50,406,-55}, {50,416,-55}, {50,421,-55}, {50,451,-55}, {50,457,-55}, {50,476,-55}, {50,572,-111}, {50,605,-55}, {50,606,-55}, {50,611,-55}, {50,617,-55}, {50,626,-55}, {50,660,-135}, {50,670,-90}, {50,688,-105}, {50,689,-105}, {50,694,-105}, {50,3146,-111}, {50,3905,-74}, {50,3954,-92}, {50,4034,-92}, {50,4037,-92}, {50,4053,-92}, {53,2,-35}, {53,7,-35}, {53,18,-35}, {53,29,-35}, {53,35,-35}, {53,45,-35}, {53,50,-35}, {53,605,-10}, {53,606,-10}, {53,611,-10}, {53,617,-10}, {53,626,-10}, {95,2,-40}, {95,7,-40}, {95,18,-40}, {95,29,-40}, {95,35,-40}, {95,45,-40}, {95,50,-40}, {95,660,-40}, {95,670,-30}, {95,688,-55}, {95,689,-55}, {95,694,-55}, {194,2,-74}, {194,7,-74}, {194,18,-74}, {194,29,-74}, {194,35,-74}, {194,45,-74}, {194,50,-74}, {194,736,-15}, {194,738,-15}, {194,760,-15}, {194,777,-15}, {194,1032,-15}, {194,1113,-15}, {194,1175,-15}, {194,1411,-80}, {194,2797,-15}, {194,2798,-15}, {194,2812,-15}, {194,2822,-15}, {194,2829,-15}, {194,2902,-15}, {194,2910,-15}, {194,2998,-80}, {303,2,-60}, {303,7,-60}, {303,18,-60}, {303,29,-60}, {303,35,-60}, {303,45,-60}, {303,50,-60}, {311,395,-30}, {311,398,-30}, {311,406,-30}, {311,416,-30}, {311,421,-30}, {311,451,-30}, {311,457,-30}, {311,1632,-25}, {311,1633,-25}, {311,1647,-25}, {311,1657,-25}, {311,1664,-25}, {311,2797,-35}, {311,2798,-35}, {311,2812,-35}, {311,2822,-35}, {311,2829,-35}, {311,2902,-35}, {311,2910,-35}, {311,3819,-15}, {311,3820,-15}, {311,3827,-15}, {311,3834,-15}, {311,3842,-15}, {311,4034,-25}, {311,4037,-25}, {311,4053,-25}, {339,572,-92}, {339,660,-100}, {339,670,-74}, {339,688,-100}, {339,689,-100}, {339,694,-100}, {339,3146,-92}, {339,4034,-55}, {339,4037,-55}, {339,4053,-55}, {358,572,-92}, {358,660,-100}, {358,670,-74}, {358,688,-100}, {358,689,-100}, {358,694,-100}, {358,3146,-92}, {358,4034,-55}, {358,4037,-55}, {358,4053,-55}, {374,2,-35}, {374,7,-35}, {374,18,-35}, {374,29,-35}, {374,35,-35}, {374,45,-35}, {374,50,-35}, {392,2,-35}, {392,7,-35}, {392,18,-35}, {392,29,-35}, {392,35,-35}, {392,45,-35}, {392,50,-35}, {395,2,-35}, {395,7,-35}, {395,18,-35}, {395,29,-35}, {395,35,-35}, {395,45,-35}, {395,50,-35}, {395,572,-40}, {395,660,-50}, {395,670,-35}, {395,680,-40}, {395,688,-50}, {395,689,-50}, {395,694,-50}, {398,2,-35}, {398,7,-35}, {398,18,-35}, {398,29,-35}, {398,35,-35}, {398,45,-35}, {398,50,-35}, {398,572,-40}, {398,660,-50}, {398,670,-35}, {398,680,-40}, {398,688,-50}, {398,689,-50}, {398,694,-50}, {406,2,-35}, {406,7,-35}, {406,18,-35}, {406,29,-35}, {406,35,-35}, {406,45,-35}, {406,50,-35}, {406,572,-40}, {406,660,-50}, {406,670,-35}, {406,680,-40}, {406,688,-50}, {406,689,-50}, {406,694,-50}, {416,2,-35}, {416,7,-35}, {416,18,-35}, {416,29,-35}, {416,35,-35}, {416,45,-35}, {416,50,-35}, {416,572,-40}, {416,660,-50}, {416,670,-35}, {416,680,-40}, {416,688,-50}, {416,689,-50}, {416,694,-50}, {421,2,-35}, {421,7,-35}, {421,18,-35}, {421,29,-35}, {421,35,-35}, {421,45,-35}, {421,50,-35}, {421,572,-40}, {421,660,-50}, {421,670,-35}, {421,680,-40}, {421,688,-50}, {421,689,-50}, {421,694,-50}, {451,2,-35}, {451,7,-35}, {451,18,-35}, {451,29,-35}, {451,35,-35}, {451,45,-35}, {451,50,-35}, {451,572,-40}, {451,660,-50}, {451,670,-35}, {451,680,-40}, {451,688,-50}, {451,689,-50}, {451,694,-50}, {457,2,-35}, {457,7,-35}, {457,18,-35}, {457,29,-35}, {457,35,-35}, {457,45,-35}, {457,50,-35}, {457,572,-40}, {457,660,-50}, {457,670,-35}, {457,680,-40}, {457,688,-50}, {457,689,-50}, {457,694,-50}, {461,2,-92}, {461,7,-92}, {461,18,-92}, {461,29,-92}, {461,35,-92}, {461,45,-92}, {461,50,-92}, {461,736,-15}, {461,738,-15}, {461,760,-15}, {461,777,-15}, {461,1032,-15}, {461,1113,-15}, {461,1175,-15}, {461,1411,-111}, {461,2998,-111}, {476,605,-10}, {476,606,-10}, {476,611,-10}, {476,617,-10}, {476,626,-10}, {480,395,-40}, {480,398,-40}, {480,406,-40}, {480,416,-40}, {480,421,-40}, {480,451,-40}, {480,457,-40}, {480,572,-60}, {480,605,-40}, {480,606,-40}, {480,611,-40}, {480,617,-40}, {480,626,-40}, {480,660,-80}, {480,670,-55}, {480,688,-65}, {480,689,-65}, {480,694,-65}, {572,2,-93}, {572,7,-93}, {572,18,-93}, {572,29,-93}, {572,35,-93}, {572,45,-93}, {572,50,-93}, {572,395,-18}, {572,398,-18}, {572,406,-18}, {572,416,-18}, {572,421,-18}, {572,451,-18}, {572,457,-18}, {572,736,-80}, {572,738,-80}, {572,760,-80}, {572,777,-40}, {572,1032,-40}, {572,1113,-80}, {572,1175,-40}, {572,1404,-50}, {572,1411,-74}, {572,1632,-70}, {572,1633,-70}, {572,1647,-70}, {572,1657,-30}, {572,1664,-70}, {572,2128,-92}, {572,2134,-35}, {572,2135,-35}, {572,2797,-80}, {572,2798,-80}, {572,2812,-80}, {572,2822,-80}, {572,2829,-80}, {572,2902,-80}, {572,2910,-80}, {572,2998,-74}, {572,3151,-35}, {572,3354,-55}, {572,3819,-45}, {572,3820,-45}, {572,3827,-45}, {572,3834,-45}, {572,3842,-45}, {572,3954,-80}, {572,4034,-80}, {572,4037,-80}, {572,4053,-80}, {605,2,-40}, {605,7,-40}, {605,18,-40}, {605,29,-40}, {605,35,-40}, {605,45,-40}, {605,50,-40}, {606,2,-40}, {606,7,-40}, {606,18,-40}, {606,29,-40}, {606,35,-40}, {606,45,-40}, {606,50,-40}, {611,2,-40}, {611,7,-40}, {611,18,-40}, {611,29,-40}, {611,35,-40}, {611,45,-40}, {611,50,-40}, {617,2,-40}, {617,7,-40}, {617,18,-40}, {617,29,-40}, {617,35,-40}, {617,45,-40}, {617,50,-40}, {626,2,-40}, {626,7,-40}, {626,18,-40}, {626,29,-40}, {626,35,-40}, {626,45,-40}, {626,50,-40}, {660,2,-135}, {660,7,-135}, {660,18,-135}, {660,29,-135}, {660,35,-135}, {660,45,-135}, {660,50,-135}, {660,205,-15}, {660,395,-40}, {660,398,-40}, {660,406,-40}, {660,416,-40}, {660,421,-40}, {660,451,-40}, {660,457,-40}, {660,736,-111}, {660,738,-111}, {660,760,-71}, {660,777,-71}, {660,1032,-71}, {660,1113,-111}, {660,1175,-71}, {660,1404,-74}, {660,1411,-129}, {660,1632,-111}, {660,1633,-111}, {660,1647,-71}, {660,1657,-71}, {660,1664,-71}, {660,2128,-100}, {660,2134,-60}, {660,2135,-60}, {660,2142,-20}, {660,2198,-20}, {660,2209,-20}, {660,2797,-129}, {660,2798,-129}, {660,2812,-129}, {660,2822,-89}, {660,2829,-89}, {660,2902,-129}, {660,2910,-89}, {660,2998,-129}, {660,3354,-74}, {660,3819,-75}, {660,3820,-75}, {660,3827,-75}, {660,3834,-75}, {660,3842,-75}, {670,2,-120}, {670,7,-120}, {670,18,-120}, {670,29,-120}, {670,35,-120}, {670,45,-120}, {670,50,-120}, {670,395,-10}, {670,398,-10}, {670,406,-10}, {670,416,-10}, {670,421,-10}, {670,451,-10}, {670,457,-10}, {670,736,-80}, {670,738,-80}, {670,760,-80}, {670,777,-80}, {670,1032,-80}, {670,1113,-80}, {670,1175,-80}, {670,1404,-37}, {670,1411,-92}, {670,1632,-80}, {670,1633,-80}, {670,1647,-80}, {670,1657,-40}, {670,1664,-40}, {670,2128,-65}, {670,2134,-40}, {670,2135,-40}, {670,2797,-80}, {670,2798,-80}, {670,2812,-80}, {670,2822,-80}, {670,2829,-80}, {670,2902,-80}, {670,2910,-80}, {670,2998,-92}, {670,3354,-37}, {670,3819,-50}, {670,3820,-50}, {670,3827,-50}, {670,3834,-50}, {670,3842,-50}, {670,4034,-73}, {670,4037,-73}, {670,4053,-73}, {688,2,-120}, {688,7,-120}, {688,18,-120}, {688,29,-120}, {688,35,-120}, {688,45,-120}, {688,50,-120}, {688,395,-30}, {688,398,-30}, {688,406,-30}, {688,416,-30}, {688,421,-30}, {688,451,-30}, {688,457,-30}, {688,736,-100}, {688,738,-100}, {688,760,-100}, {688,777,-60}, {688,1032,-60}, {688,1113,-100}, {688,1175,-60}, {688,1404,-92}, {688,1411,-129}, {688,1632,-100}, {688,1633,-100}, {688,1647,-100}, {688,1657,-60}, {688,1664,-60}, {688,2128,-111}, {688,2134,-55}, {688,2135,-55}, {688,2797,-110}, {688,2798,-110}, {688,2812,-110}, {688,2822,-70}, {688,2829,-70}, {688,2902,-110}, {688,2910,-70}, {688,2998,-129}, {688,3354,-92}, {688,3819,-111}, {688,3820,-111}, {688,3827,-111}, {688,3834,-71}, {688,3842,-71}, {689,2,-120}, {689,7,-120}, {689,18,-120}, {689,29,-120}, {689,35,-120}, {689,45,-120}, {689,50,-120}, {689,395,-30}, {689,398,-30}, {689,406,-30}, {689,416,-30}, {689,421,-30}, {689,451,-30}, {689,457,-30}, {689,736,-100}, {689,738,-100}, {689,760,-100}, {689,777,-60}, {689,1032,-60}, {689,1113,-100}, {689,1175,-60}, {689,1404,-92}, {689,1411,-129}, {689,1632,-100}, {689,1633,-100}, {689,1647,-100}, {689,1657,-60}, {689,1664,-60}, {689,2128,-111}, {689,2134,-55}, {689,2135,-55}, {689,2797,-110}, {689,2798,-110}, {689,2812,-110}, {689,2822,-70}, {689,2829,-70}, {689,2902,-110}, {689,2910,-70}, {689,2998,-129}, {689,3354,-92}, {689,3819,-111}, {689,3820,-111}, {689,3827,-111}, {689,3834,-71}, {689,3842,-71}, {694,2,-120}, {694,7,-120}, {694,18,-120}, {694,29,-120}, {694,35,-120}, {694,45,-120}, {694,50,-120}, {694,395,-30}, {694,398,-30}, {694,406,-30}, {694,416,-30}, {694,421,-30}, {694,451,-30}, {694,457,-30}, {694,736,-100}, {694,738,-100}, {694,760,-100}, {694,777,-60}, {694,1032,-60}, {694,1113,-100}, {694,1175,-100}, {694,1404,-92}, {694,1411,-129}, {694,1632,-100}, {694,1633,-100}, {694,1647,-100}, {694,1657,-60}, {694,1664,-60}, {694,2128,-111}, {694,2134,-55}, {694,2135,-55}, {694,2797,-110}, {694,2798,-110}, {694,2812,-110}, {694,2822,-70}, {694,2829,-70}, {694,2902,-110}, {694,2910,-70}, {694,2998,-129}, {694,3354,-92}, {694,3819,-111}, {694,3820,-111}, {694,3827,-111}, {694,3834,-71}, {694,3842,-71}, {736,3905,-20}, {736,3954,-15}, {738,3905,-20}, {738,3954,-15}, {760,3905,-20}, {760,3954,-15}, {777,3905,-20}, {777,3954,-15}, {1032,3905,-20}, {1032,3954,-15}, {1113,3905,-20}, {1113,3954,-15}, {1175,3905,-20}, {1175,3954,-15}, {1194,2998,-40}, {1194,3819,-20}, {1194,3820,-20}, {1194,3827,-20}, {1194,3834,-20}, {1194,3842,-20}, {1194,3905,-15}, {1314,4034,-15}, {1314,4037,-15}, {1314,4053,-15}, {1334,4034,-15}, {1334,4037,-15}, {1334,4053,-15}, {1411,3142,-70}, {1411,3146,-70}, {1632,1888,-15}, {1632,3905,-25}, {1632,3954,-25}, {1632,4023,-15}, {1632,4034,-15}, {1632,4037,-15}, {1632,4053,-15}, {1633,1888,-15}, {1633,3905,-25}, {1633,3954,-25}, {1633,4023,-15}, {1633,4034,-15}, {1633,4037,-15}, {1633,4053,-15}, {1647,1888,-15}, {1647,3905,-25}, {1647,3954,-25}, {1647,4023,-15}, {1647,4034,-15}, {1647,4037,-15}, {1647,4053,-15}, {1657,1888,-15}, {1657,3905,-25}, {1657,3954,-25}, {1657,4023,-15}, {1657,4034,-15}, {1657,4037,-15}, {1657,4053,-15}, {1664,1888,-15}, {1664,3905,-25}, {1664,3954,-25}, {1664,4023,-15}, {1664,4034,-15}, {1664,4037,-15}, {1664,4053,-15}, {1789,736,-10}, {1789,738,-10}, {1789,760,-10}, {1789,777,-10}, {1789,1032,-10}, {1789,1113,-10}, {1789,1175,-10}, {1789,1610,-50}, {1789,1789,-25}, {1789,2134,-20}, {1789,2135,-20}, {1789,3146,55}, {1888,736,-5}, {1888,738,-5}, {1888,760,-5}, {1888,777,-5}, {1888,1032,-5}, {1888,1113,-5}, {1888,1175,-5}, {1990,4034,-5}, {1990,4037,-5}, {1990,4053,-5}, {2134,3905,-25}, {2135,3905,-25}, {2142,3905,-25}, {2198,3905,-25}, {2209,3905,-25}, {2304,1632,-10}, {2304,1633,-10}, {2304,1647,-10}, {2304,1657,-10}, {2304,1664,-10}, {2304,2797,-10}, {2304,2798,-10}, {2304,2812,-10}, {2304,2822,-10}, {2304,2829,-10}, {2304,2902,-10}, {2304,2910,-10}, {2304,4034,-15}, {2304,4037,-15}, {2304,4053,-15}, {2418,3954,-10}, {2503,3954,-10}, {2650,3905,-40}, {2650,4034,-15}, {2650,4037,-15}, {2650,4053,-15}, {2772,3905,-40}, {2772,4034,-15}, {2772,4037,-15}, {2772,4053,-15}, {2797,3905,-15}, {2797,3954,-25}, {2797,4034,-10}, {2797,4037,-10}, {2797,4053,-10}, {2798,3905,-15}, {2798,3954,-25}, {2798,4034,-10}, {2798,4037,-10}, {2798,4053,-10}, {2812,3905,-15}, {2812,3954,-25}, {2812,4034,-10}, {2812,4037,-10}, {2812,4053,-10}, {2822,3905,-15}, {2822,3954,-25}, {2822,4034,-10}, {2822,4037,-10}, {2822,4053,-10}, {2829,3905,-15}, {2829,3954,-25}, {2829,4034,-10}, {2829,4037,-10}, {2829,4053,-10}, {2902,3905,-15}, {2902,3954,-25}, {2902,4034,-10}, {2902,4037,-10}, {2902,4053,-10}, {2910,3905,-15}, {2910,3954,-25}, {2910,4034,-10}, {2910,4037,-10}, {2910,4053,-10}, {2924,4034,-10}, {2924,4037,-10}, {2924,4053,-10}, {2998,3142,-70}, {2998,3146,-70}, {3138,2,-80}, {3138,7,-80}, {3138,18,-80}, {3138,29,-80}, {3138,35,-80}, {3138,45,-80}, {3138,50,-80}, {3143,2,-80}, {3143,7,-80}, {3143,18,-80}, {3143,29,-80}, {3143,35,-80}, {3143,45,-80}, {3143,50,-80}, {3143,3143,-74}, {3146,1483,-50}, {3146,2418,-10}, {3146,2503,-10}, {3146,3146,-74}, {3146,3151,-50}, {3146,3282,-55}, {3146,3320,-55}, {3146,3501,-74}, {3146,3559,-18}, {3146,3905,-50}, {3151,1411,-40}, {3151,1888,-18}, {3151,2128,-20}, {3151,2998,-55}, {3501,2,-55}, {3501,7,-55}, {3501,18,-55}, {3501,29,-55}, {3501,35,-55}, {3501,45,-55}, {3501,50,-55}, {3501,572,-18}, {3501,660,-50}, {3501,670,-30}, {3501,688,-90}, {3501,689,-90}, {3501,694,-90}, {3905,736,-25}, {3905,738,-25}, {3905,760,-25}, {3905,777,-25}, {3905,1032,-25}, {3905,1113,-25}, {3905,1175,-25}, {3905,1411,-65}, {3905,1632,-15}, {3905,1633,-15}, {3905,1647,-15}, {3905,1657,-15}, {3905,1664,-15}, {3905,2797,-20}, {3905,2798,-20}, {3905,2812,-20}, {3905,2822,-20}, {3905,2829,-20}, {3905,2902,-20}, {3905,2910,-20}, {3905,2998,-65}, {3954,736,-10}, {3954,738,-10}, {3954,760,-10}, {3954,777,-10}, {3954,1032,-10}, {3954,1113,-10}, {3954,1175,-10}, {3954,1411,-65}, {3954,2797,-10}, {3954,2798,-10}, {3954,2812,-10}, {3954,2822,-10}, {3954,2829,-10}, {3954,2902,-10}, {3954,2910,-10}, {3954,2998,-65}, {4023,1632,-15}, {4023,1633,-15}, {4023,1647,-15}, {4023,1657,-15}, {4023,1664,-15}, {4034,1411,-65}, {4034,2998,-65}, {4037,1411,-65}, {4037,2998,-65}, {4053,1411,-65}, {4053,2998,-65}, {NOGLYPH,NOGLYPH,0} }; static const ligature times_roman_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair times_italic_kerns[] = { {2,66,-30}, {2,72,-30}, {2,205,-35}, {2,395,-40}, {2,398,-40}, {2,406,-40}, {2,416,-40}, {2,421,-40}, {2,451,-40}, {2,457,-40}, {2,476,-40}, {2,572,-37}, {2,605,-50}, {2,606,-50}, {2,611,-50}, {2,617,-50}, {2,626,-50}, {2,660,-105}, {2,670,-95}, {2,688,-55}, {2,689,-55}, {2,694,-55}, {2,3146,-37}, {2,3819,-20}, {2,3820,-20}, {2,3827,-20}, {2,3834,-20}, {2,3842,-20}, {2,3905,-55}, {2,3954,-55}, {2,4034,-55}, {2,4037,-55}, {2,4053,-55}, {7,66,-30}, {7,72,-30}, {7,205,-35}, {7,395,-40}, {7,398,-40}, {7,406,-40}, {7,416,-40}, {7,421,-40}, {7,451,-40}, {7,457,-40}, {7,476,-40}, {7,572,-37}, {7,605,-50}, {7,606,-50}, {7,611,-50}, {7,617,-50}, {7,626,-50}, {7,660,-105}, {7,670,-95}, {7,688,-55}, {7,689,-55}, {7,694,-55}, {7,3146,-37}, {7,3819,-20}, {7,3820,-20}, {7,3827,-20}, {7,3834,-20}, {7,3842,-20}, {7,3905,-55}, {7,3954,-55}, {7,4034,-55}, {7,4037,-55}, {7,4053,-55}, {18,66,-30}, {18,72,-30}, {18,205,-35}, {18,395,-40}, {18,398,-40}, {18,406,-40}, {18,416,-40}, {18,421,-40}, {18,451,-40}, {18,457,-40}, {18,476,-40}, {18,572,-37}, {18,605,-50}, {18,606,-50}, {18,611,-50}, {18,617,-50}, {18,626,-50}, {18,660,-105}, {18,670,-95}, {18,688,-55}, {18,689,-55}, {18,694,-55}, {18,3146,-37}, {18,3819,-20}, {18,3820,-20}, {18,3827,-20}, {18,3834,-20}, {18,3842,-20}, {18,3905,-55}, {18,3954,-55}, {18,4034,-55}, {18,4037,-55}, {18,4053,-55}, {29,66,-30}, {29,72,-30}, {29,205,-35}, {29,395,-40}, {29,398,-40}, {29,406,-40}, {29,416,-40}, {29,421,-40}, {29,451,-40}, {29,457,-40}, {29,476,-40}, {29,572,-37}, {29,605,-50}, {29,606,-50}, {29,611,-50}, {29,617,-50}, {29,626,-50}, {29,660,-105}, {29,670,-95}, {29,688,-55}, {29,689,-55}, {29,694,-55}, {29,3146,-37}, {29,3819,-20}, {29,3820,-20}, {29,3827,-20}, {29,3834,-20}, {29,3842,-20}, {29,3905,-55}, {29,3954,-55}, {29,4034,-55}, {29,4037,-55}, {29,4053,-55}, {35,66,-30}, {35,72,-30}, {35,205,-35}, {35,395,-40}, {35,398,-40}, {35,406,-40}, {35,416,-40}, {35,421,-40}, {35,451,-40}, {35,457,-40}, {35,476,-40}, {35,572,-37}, {35,605,-50}, {35,606,-50}, {35,611,-50}, {35,617,-50}, {35,626,-50}, {35,660,-105}, {35,670,-95}, {35,688,-55}, {35,689,-55}, {35,694,-55}, {35,3146,-37}, {35,3819,-20}, {35,3820,-20}, {35,3827,-20}, {35,3834,-20}, {35,3842,-20}, {35,3905,-55}, {35,3954,-55}, {35,4034,-55}, {35,4037,-55}, {35,4053,-55}, {45,66,-30}, {45,72,-30}, {45,205,-35}, {45,395,-40}, {45,398,-40}, {45,406,-40}, {45,416,-40}, {45,421,-40}, {45,451,-40}, {45,457,-40}, {45,476,-40}, {45,572,-37}, {45,605,-50}, {45,606,-50}, {45,611,-50}, {45,617,-50}, {45,626,-50}, {45,660,-105}, {45,670,-95}, {45,688,-55}, {45,689,-55}, {45,694,-55}, {45,3146,-37}, {45,3819,-20}, {45,3820,-20}, {45,3827,-20}, {45,3834,-20}, {45,3842,-20}, {45,3905,-55}, {45,3954,-55}, {45,4034,-55}, {45,4037,-55}, {45,4053,-55}, {50,66,-30}, {50,72,-30}, {50,205,-35}, {50,395,-40}, {50,398,-40}, {50,406,-40}, {50,416,-40}, {50,421,-40}, {50,451,-40}, {50,457,-40}, {50,476,-40}, {50,572,-37}, {50,605,-50}, {50,606,-50}, {50,611,-50}, {50,617,-50}, {50,626,-50}, {50,660,-105}, {50,670,-95}, {50,688,-55}, {50,689,-55}, {50,694,-55}, {50,3146,-37}, {50,3819,-20}, {50,3820,-20}, {50,3827,-20}, {50,3834,-20}, {50,3842,-20}, {50,3905,-55}, {50,3954,-55}, {50,4034,-55}, {50,4037,-55}, {50,4053,-55}, {53,2,-25}, {53,7,-25}, {53,18,-25}, {53,29,-25}, {53,35,-25}, {53,45,-25}, {53,50,-25}, {53,605,-10}, {53,606,-10}, {53,611,-10}, {53,617,-10}, {53,626,-10}, {95,2,-35}, {95,7,-35}, {95,18,-35}, {95,29,-35}, {95,35,-35}, {95,45,-35}, {95,50,-35}, {95,660,-40}, {95,670,-40}, {95,688,-40}, {95,689,-40}, {95,694,-40}, {194,2,-115}, {194,7,-115}, {194,18,-115}, {194,29,-115}, {194,35,-115}, {194,45,-115}, {194,50,-115}, {194,736,-75}, {194,738,-75}, {194,760,-75}, {194,777,-75}, {194,1032,-75}, {194,1113,-75}, {194,1175,-75}, {194,1411,-135}, {194,1632,-75}, {194,1633,-75}, {194,1647,-75}, {194,1657,-75}, {194,1664,-75}, {194,2134,-45}, {194,2135,-45}, {194,2142,-45}, {194,2198,-45}, {194,2209,-45}, {194,2797,-105}, {194,2798,-105}, {194,2812,-105}, {194,2822,-105}, {194,2829,-105}, {194,2902,-105}, {194,2910,-105}, {194,2998,-135}, {194,3151,-55}, {303,2,-40}, {303,7,-40}, {303,18,-40}, {303,29,-40}, {303,35,-40}, {303,45,-40}, {303,50,-40}, {303,736,-35}, {303,738,-35}, {303,760,-35}, {303,777,-35}, {303,1032,-35}, {303,1113,-35}, {303,1175,-35}, {303,1411,-25}, {303,1632,-25}, {303,1633,-25}, {303,1647,-25}, {303,1657,-25}, {303,1664,-25}, {303,2797,-25}, {303,2798,-25}, {303,2812,-25}, {303,2822,-25}, {303,2829,-25}, {303,2902,-25}, {303,2910,-25}, {303,2998,-25}, {303,3819,-35}, {303,3820,-35}, {303,3827,-35}, {303,3834,-35}, {303,3842,-35}, {311,395,-50}, {311,398,-50}, {311,406,-50}, {311,416,-50}, {311,421,-50}, {311,451,-50}, {311,457,-50}, {311,1632,-35}, {311,1633,-35}, {311,1647,-35}, {311,1657,-35}, {311,1664,-35}, {311,2797,-40}, {311,2798,-40}, {311,2812,-40}, {311,2822,-40}, {311,2829,-40}, {311,2902,-40}, {311,2910,-40}, {311,3819,-40}, {311,3820,-40}, {311,3827,-40}, {311,3834,-40}, {311,3842,-40}, {311,4034,-40}, {311,4037,-40}, {311,4053,-40}, {339,572,-20}, {339,660,-55}, {339,670,-55}, {339,688,-20}, {339,689,-20}, {339,694,-20}, {339,3146,-37}, {339,4034,-30}, {339,4037,-30}, {339,4053,-30}, {358,572,-20}, {358,660,-55}, {358,670,-55}, {358,688,-20}, {358,689,-20}, {358,694,-20}, {358,3146,-37}, {358,4034,-30}, {358,4037,-30}, {358,4053,-30}, {374,2,-27}, {374,7,-27}, {374,18,-27}, {374,29,-27}, {374,35,-27}, {374,45,-27}, {374,50,-27}, {392,2,-27}, {392,7,-27}, {392,18,-27}, {392,29,-27}, {392,35,-27}, {392,45,-27}, {392,50,-27}, {395,2,-55}, {395,7,-55}, {395,18,-55}, {395,29,-55}, {395,35,-55}, {395,45,-55}, {395,50,-55}, {395,572,-40}, {395,660,-50}, {395,670,-50}, {395,680,-40}, {395,688,-50}, {395,689,-50}, {395,694,-50}, {398,2,-55}, {398,7,-55}, {398,18,-55}, {398,29,-55}, {398,35,-55}, {398,45,-55}, {398,50,-55}, {398,572,-40}, {398,660,-50}, {398,670,-50}, {398,680,-40}, {398,688,-50}, {398,689,-50}, {398,694,-50}, {406,2,-55}, {406,7,-55}, {406,18,-55}, {406,29,-55}, {406,35,-55}, {406,45,-55}, {406,50,-55}, {406,572,-40}, {406,660,-50}, {406,670,-50}, {406,680,-40}, {406,688,-50}, {406,689,-50}, {406,694,-50}, {416,2,-55}, {416,7,-55}, {416,18,-55}, {416,29,-55}, {416,35,-55}, {416,45,-55}, {416,50,-55}, {416,572,-40}, {416,660,-50}, {416,670,-50}, {416,680,-40}, {416,688,-50}, {416,689,-50}, {416,694,-50}, {421,2,-55}, {421,7,-55}, {421,18,-55}, {421,29,-55}, {421,35,-55}, {421,45,-55}, {421,50,-55}, {421,572,-40}, {421,660,-50}, {421,670,-50}, {421,680,-40}, {421,688,-50}, {421,689,-50}, {421,694,-50}, {451,2,-55}, {451,7,-55}, {451,18,-55}, {451,29,-55}, {451,35,-55}, {451,45,-55}, {451,50,-55}, {451,572,-40}, {451,660,-50}, {451,670,-50}, {451,680,-40}, {451,688,-50}, {451,689,-50}, {451,694,-50}, {457,2,-55}, {457,7,-55}, {457,18,-55}, {457,29,-55}, {457,35,-55}, {457,45,-55}, {457,50,-55}, {457,572,-40}, {457,660,-50}, {457,670,-50}, {457,680,-40}, {457,688,-50}, {457,689,-50}, {457,694,-50}, {461,2,-90}, {461,7,-90}, {461,18,-90}, {461,29,-90}, {461,35,-90}, {461,45,-90}, {461,50,-90}, {461,736,-80}, {461,738,-80}, {461,760,-80}, {461,777,-80}, {461,1032,-80}, {461,1113,-80}, {461,1175,-80}, {461,1411,-135}, {461,1632,-80}, {461,1633,-80}, {461,1647,-80}, {461,1657,-80}, {461,1664,-80}, {461,2797,-80}, {461,2798,-80}, {461,2812,-80}, {461,2822,-80}, {461,2829,-80}, {461,2902,-80}, {461,2910,-80}, {461,2998,-135}, {476,605,-10}, {476,606,-10}, {476,611,-10}, {476,617,-10}, {476,626,-10}, {480,395,-40}, {480,398,-40}, {480,406,-40}, {480,416,-40}, {480,421,-40}, {480,451,-40}, {480,457,-40}, {480,605,-40}, {480,606,-40}, {480,611,-40}, {480,617,-40}, {480,626,-40}, {480,660,-18}, {480,670,-18}, {480,688,-18}, {480,689,-18}, {480,694,-18}, {572,2,-50}, {572,7,-50}, {572,18,-50}, {572,29,-50}, {572,35,-50}, {572,45,-50}, {572,50,-50}, {572,395,-18}, {572,398,-18}, {572,406,-18}, {572,416,-18}, {572,421,-18}, {572,451,-18}, {572,457,-18}, {572,736,-92}, {572,738,-92}, {572,760,-92}, {572,777,-92}, {572,1032,-92}, {572,1113,-92}, {572,1175,-92}, {572,1404,-55}, {572,1411,-74}, {572,1632,-92}, {572,1633,-92}, {572,1647,-52}, {572,1657,-52}, {572,1664,-52}, {572,2128,-74}, {572,2134,-55}, {572,2135,-55}, {572,2797,-92}, {572,2798,-92}, {572,2812,-92}, {572,2822,-92}, {572,2829,-92}, {572,2902,-92}, {572,2910,-92}, {572,2998,-74}, {572,3151,-55}, {572,3354,-65}, {572,3819,-55}, {572,3820,-55}, {572,3827,-55}, {572,3834,-55}, {572,3842,-55}, {572,3954,-74}, {572,4034,-74}, {572,4037,-74}, {572,4053,-34}, {605,2,-40}, {605,7,-40}, {605,18,-40}, {605,29,-40}, {605,35,-40}, {605,45,-40}, {605,50,-40}, {605,1411,-25}, {605,2998,-25}, {606,2,-40}, {606,7,-40}, {606,18,-40}, {606,29,-40}, {606,35,-40}, {606,45,-40}, {606,50,-40}, {606,1411,-25}, {606,2998,-25}, {611,2,-40}, {611,7,-40}, {611,18,-40}, {611,29,-40}, {611,35,-40}, {611,45,-40}, {611,50,-40}, {611,1411,-25}, {611,2998,-25}, {617,2,-40}, {617,7,-40}, {617,18,-40}, {617,29,-40}, {617,35,-40}, {617,45,-40}, {617,50,-40}, {617,1411,-25}, {617,2998,-25}, {626,2,-40}, {626,7,-40}, {626,18,-40}, {626,29,-40}, {626,35,-40}, {626,45,-40}, {626,50,-40}, {626,1411,-25}, {626,2998,-25}, {660,2,-60}, {660,7,-60}, {660,18,-60}, {660,29,-60}, {660,35,-60}, {660,45,-60}, {660,50,-60}, {660,395,-30}, {660,398,-30}, {660,406,-30}, {660,416,-30}, {660,421,-30}, {660,451,-30}, {660,457,-30}, {660,736,-111}, {660,738,-111}, {660,760,-111}, {660,777,-111}, {660,1032,-111}, {660,1113,-111}, {660,1175,-111}, {660,1404,-65}, {660,1411,-129}, {660,1632,-111}, {660,1633,-111}, {660,1647,-111}, {660,1657,-71}, {660,1664,-71}, {660,2128,-55}, {660,2134,-74}, {660,2135,-74}, {660,2142,-34}, {660,2198,-34}, {660,2209,-34}, {660,2797,-111}, {660,2798,-111}, {660,2812,-111}, {660,2822,-111}, {660,2829,-111}, {660,2902,-111}, {660,2910,-111}, {660,2998,-129}, {660,3354,-74}, {660,3819,-74}, {660,3820,-74}, {660,3827,-74}, {660,3834,-74}, {660,3842,-74}, {670,2,-60}, {670,7,-60}, {670,18,-60}, {670,29,-60}, {670,35,-60}, {670,45,-60}, {670,50,-60}, {670,395,-25}, {670,398,-25}, {670,406,-25}, {670,416,-25}, {670,421,-25}, {670,451,-25}, {670,457,-25}, {670,736,-92}, {670,738,-92}, {670,760,-92}, {670,777,-92}, {670,1032,-92}, {670,1113,-92}, {670,1175,-92}, {670,1404,-65}, {670,1411,-92}, {670,1632,-92}, {670,1633,-92}, {670,1647,-92}, {670,1657,-52}, {670,1664,-52}, {670,2128,-37}, {670,2134,-55}, {670,2135,-55}, {670,2797,-92}, {670,2798,-92}, {670,2812,-92}, {670,2822,-92}, {670,2829,-92}, {670,2902,-92}, {670,2910,-92}, {670,2998,-92}, {670,3354,-65}, {670,3819,-55}, {670,3820,-55}, {670,3827,-55}, {670,3834,-55}, {670,3842,-55}, {670,4034,-70}, {670,4037,-70}, {670,4053,-70}, {688,2,-50}, {688,7,-50}, {688,18,-50}, {688,29,-50}, {688,35,-50}, {688,45,-50}, {688,50,-50}, {688,395,-15}, {688,398,-15}, {688,406,-15}, {688,416,-15}, {688,421,-15}, {688,451,-15}, {688,457,-15}, {688,736,-92}, {688,738,-92}, {688,760,-92}, {688,777,-92}, {688,1032,-92}, {688,1113,-92}, {688,1175,-92}, {688,1404,-65}, {688,1411,-92}, {688,1632,-92}, {688,1633,-92}, {688,1647,-92}, {688,1657,-52}, {688,1664,-52}, {688,2128,-74}, {688,2134,-74}, {688,2135,-74}, {688,2142,-34}, {688,2198,-34}, {688,2209,-34}, {688,2797,-92}, {688,2798,-92}, {688,2812,-92}, {688,2822,-92}, {688,2829,-92}, {688,2902,-92}, {688,2910,-92}, {688,2998,-92}, {688,3354,-65}, {688,3819,-92}, {688,3820,-92}, {688,3827,-92}, {688,3834,-92}, {688,3842,-92}, {689,2,-50}, {689,7,-50}, {689,18,-50}, {689,29,-50}, {689,35,-50}, {689,45,-50}, {689,50,-50}, {689,395,-15}, {689,398,-15}, {689,406,-15}, {689,416,-15}, {689,421,-15}, {689,451,-15}, {689,457,-15}, {689,736,-92}, {689,738,-92}, {689,760,-92}, {689,777,-92}, {689,1032,-92}, {689,1113,-92}, {689,1175,-92}, {689,1404,-65}, {689,1411,-92}, {689,1632,-92}, {689,1633,-92}, {689,1647,-92}, {689,1657,-52}, {689,1664,-52}, {689,2128,-74}, {689,2134,-74}, {689,2135,-74}, {689,2142,-34}, {689,2198,-34}, {689,2209,-34}, {689,2797,-92}, {689,2798,-92}, {689,2812,-92}, {689,2822,-92}, {689,2829,-92}, {689,2902,-92}, {689,2910,-92}, {689,2998,-92}, {689,3354,-65}, {689,3819,-92}, {689,3820,-92}, {689,3827,-92}, {689,3834,-92}, {689,3842,-92}, {694,2,-50}, {694,7,-50}, {694,18,-50}, {694,29,-50}, {694,35,-50}, {694,45,-50}, {694,50,-50}, {694,395,-15}, {694,398,-15}, {694,406,-15}, {694,416,-15}, {694,421,-15}, {694,451,-15}, {694,457,-15}, {694,736,-92}, {694,738,-92}, {694,760,-92}, {694,777,-92}, {694,1032,-92}, {694,1113,-92}, {694,1175,-92}, {694,1404,-65}, {694,1411,-92}, {694,1632,-92}, {694,1633,-92}, {694,1647,-92}, {694,1657,-52}, {694,1664,-52}, {694,2128,-74}, {694,2134,-74}, {694,2135,-74}, {694,2142,-34}, {694,2198,-34}, {694,2209,-34}, {694,2797,-92}, {694,2798,-92}, {694,2812,-92}, {694,2822,-92}, {694,2829,-92}, {694,2902,-92}, {694,2910,-92}, {694,2998,-92}, {694,3354,-65}, {694,3819,-92}, {694,3820,-92}, {694,3827,-92}, {694,3834,-92}, {694,3842,-92}, {736,1888,-10}, {738,1888,-10}, {760,1888,-10}, {777,1888,-10}, {1032,1888,-10}, {1113,1888,-10}, {1175,1888,-10}, {1194,2998,-40}, {1194,3819,-20}, {1194,3820,-20}, {1194,3827,-20}, {1194,3834,-20}, {1194,3842,-20}, {1314,1990,-15}, {1314,2304,-20}, {1334,1990,-15}, {1334,2304,-20}, {1411,3142,-140}, {1411,3146,-140}, {1632,1411,-10}, {1632,1888,-40}, {1632,2998,-15}, {1632,3905,-15}, {1632,3954,-15}, {1632,4023,-20}, {1632,4034,-30}, {1632,4037,-30}, {1632,4053,-30}, {1633,1411,-10}, {1633,1888,-40}, {1633,2998,-15}, {1633,3905,-15}, {1633,3954,-15}, {1633,4023,-20}, {1633,4034,-30}, {1633,4037,-30}, {1633,4053,-30}, {1647,1411,-10}, {1647,1888,-40}, {1647,2998,-15}, {1647,3905,-15}, {1647,3954,-15}, {1647,4023,-20}, {1647,4034,-30}, {1647,4037,-30}, {1647,4053,-30}, {1657,1411,-10}, {1657,1888,-40}, {1657,2998,-15}, {1657,3905,-15}, {1657,3954,-15}, {1657,4023,-20}, {1657,4034,-30}, {1657,4037,-30}, {1657,4053,-30}, {1664,1411,-10}, {1664,1888,-40}, {1664,2998,-15}, {1664,3905,-15}, {1664,3954,-15}, {1664,4023,-20}, {1664,4034,-30}, {1664,4037,-30}, {1664,4053,-30}, {1789,1411,-10}, {1789,1610,-60}, {1789,1789,-18}, {1789,2134,-20}, {1789,2998,-15}, {1789,3146,92}, {1888,1411,-10}, {1888,1632,-10}, {1888,1633,-10}, {1888,1647,-10}, {1888,1657,-10}, {1888,1664,-10}, {1888,1888,-10}, {1888,2998,-15}, {2304,1632,-10}, {2304,1633,-10}, {2304,1647,-10}, {2304,1657,-10}, {2304,1664,-10}, {2304,2797,-10}, {2304,2798,-10}, {2304,2812,-10}, {2304,2822,-10}, {2304,2829,-10}, {2304,2902,-10}, {2304,2910,-10}, {2304,4034,-10}, {2304,4037,-10}, {2304,4053,-10}, {2650,3905,-40}, {2772,3905,-40}, {2797,1888,-10}, {2797,3905,-10}, {2798,1888,-10}, {2798,3905,-10}, {2812,1888,-10}, {2812,3905,-10}, {2822,1888,-10}, {2822,3905,-10}, {2829,1888,-10}, {2829,3905,-10}, {2902,1888,-10}, {2902,3905,-10}, {2910,1888,-10}, {2910,3905,-10}, {2998,3142,-140}, {2998,3146,-140}, {3143,3143,-111}, {3146,1483,-25}, {3146,3146,-111}, {3146,3151,-25}, {3146,3282,-40}, {3146,3320,-40}, {3146,3501,-111}, {3146,3559,-30}, {3146,3905,-10}, {3151,736,-15}, {3151,738,-15}, {3151,760,-15}, {3151,777,-15}, {3151,1032,-15}, {3151,1113,-15}, {3151,1175,-15}, {3151,1314,-37}, {3151,1334,-37}, {3151,1411,-111}, {3151,1483,-37}, {3151,1632,-37}, {3151,1633,-37}, {3151,1647,-37}, {3151,1657,-37}, {3151,1664,-37}, {3151,1888,-37}, {3151,2128,-20}, {3151,2797,-45}, {3151,2798,-45}, {3151,2812,-45}, {3151,2822,-45}, {3151,2829,-45}, {3151,2902,-45}, {3151,2910,-45}, {3151,2998,-111}, {3151,3086,-37}, {3151,3282,-10}, {3151,3320,-10}, {3501,2,-18}, {3501,7,-18}, {3501,18,-18}, {3501,29,-18}, {3501,35,-18}, {3501,45,-18}, {3501,50,-18}, {3501,572,-18}, {3501,660,-35}, {3501,670,-40}, {3501,688,-75}, {3501,689,-75}, {3501,694,-75}, {3905,1411,-74}, {3905,2998,-74}, {3954,1411,-74}, {3954,2998,-74}, {4034,1411,-55}, {4034,2998,-55}, {4037,1411,-55}, {4037,2998,-55}, {4053,1411,-55}, {4053,2998,-55}, {NOGLYPH,NOGLYPH,0} }; static const ligature times_italic_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair times_bold_kerns[] = { {2,66,-55}, {2,72,-55}, {2,205,-55}, {2,395,-45}, {2,398,-45}, {2,406,-45}, {2,416,-45}, {2,421,-45}, {2,451,-45}, {2,457,-45}, {2,476,-45}, {2,572,-95}, {2,605,-50}, {2,606,-50}, {2,611,-50}, {2,617,-50}, {2,626,-50}, {2,660,-145}, {2,670,-130}, {2,688,-100}, {2,689,-100}, {2,694,-100}, {2,2924,-25}, {2,3146,-74}, {2,3819,-50}, {2,3820,-50}, {2,3827,-50}, {2,3834,-50}, {2,3842,-50}, {2,3905,-100}, {2,3954,-90}, {2,4034,-74}, {2,4037,-74}, {2,4053,-74}, {7,66,-55}, {7,72,-55}, {7,205,-55}, {7,395,-45}, {7,398,-45}, {7,406,-45}, {7,416,-45}, {7,421,-45}, {7,451,-45}, {7,457,-45}, {7,476,-45}, {7,572,-95}, {7,605,-50}, {7,606,-50}, {7,611,-50}, {7,617,-50}, {7,626,-50}, {7,660,-145}, {7,670,-130}, {7,688,-100}, {7,689,-100}, {7,694,-100}, {7,2924,-25}, {7,3146,-74}, {7,3819,-50}, {7,3820,-50}, {7,3827,-50}, {7,3834,-50}, {7,3842,-50}, {7,3905,-100}, {7,3954,-90}, {7,4034,-74}, {7,4037,-74}, {7,4053,-74}, {18,66,-55}, {18,72,-55}, {18,205,-55}, {18,395,-45}, {18,398,-45}, {18,406,-45}, {18,416,-45}, {18,421,-45}, {18,451,-45}, {18,457,-45}, {18,476,-45}, {18,572,-95}, {18,605,-50}, {18,606,-50}, {18,611,-50}, {18,617,-50}, {18,626,-50}, {18,660,-145}, {18,670,-130}, {18,688,-100}, {18,689,-100}, {18,694,-100}, {18,2924,-25}, {18,3146,-74}, {18,3819,-50}, {18,3820,-50}, {18,3827,-50}, {18,3834,-50}, {18,3842,-50}, {18,3905,-100}, {18,3954,-90}, {18,4034,-74}, {18,4037,-74}, {18,4053,-74}, {29,66,-55}, {29,72,-55}, {29,205,-55}, {29,395,-45}, {29,398,-45}, {29,406,-45}, {29,416,-45}, {29,421,-45}, {29,451,-45}, {29,457,-45}, {29,476,-45}, {29,572,-95}, {29,605,-50}, {29,606,-50}, {29,611,-50}, {29,617,-50}, {29,626,-50}, {29,660,-145}, {29,670,-130}, {29,688,-100}, {29,689,-100}, {29,694,-100}, {29,2924,-25}, {29,3146,-74}, {29,3819,-50}, {29,3820,-50}, {29,3827,-50}, {29,3834,-50}, {29,3842,-50}, {29,3905,-100}, {29,3954,-90}, {29,4034,-74}, {29,4037,-74}, {29,4053,-74}, {35,66,-55}, {35,72,-55}, {35,205,-55}, {35,395,-45}, {35,398,-45}, {35,406,-45}, {35,416,-45}, {35,421,-45}, {35,451,-45}, {35,457,-45}, {35,476,-45}, {35,572,-95}, {35,605,-50}, {35,606,-50}, {35,611,-50}, {35,617,-50}, {35,626,-50}, {35,660,-145}, {35,670,-130}, {35,688,-100}, {35,689,-100}, {35,694,-100}, {35,2924,-25}, {35,3146,-74}, {35,3819,-50}, {35,3820,-50}, {35,3827,-50}, {35,3834,-50}, {35,3842,-50}, {35,3905,-100}, {35,3954,-90}, {35,4034,-74}, {35,4037,-74}, {35,4053,-74}, {45,66,-55}, {45,72,-55}, {45,205,-55}, {45,395,-45}, {45,398,-45}, {45,406,-45}, {45,416,-45}, {45,421,-45}, {45,451,-45}, {45,457,-45}, {45,476,-45}, {45,572,-95}, {45,605,-50}, {45,606,-50}, {45,611,-50}, {45,617,-50}, {45,626,-50}, {45,660,-145}, {45,670,-130}, {45,688,-100}, {45,689,-100}, {45,694,-100}, {45,2924,-25}, {45,3146,-74}, {45,3819,-50}, {45,3820,-50}, {45,3827,-50}, {45,3834,-50}, {45,3842,-50}, {45,3905,-100}, {45,3954,-90}, {45,4034,-74}, {45,4037,-74}, {45,4053,-74}, {50,66,-55}, {50,72,-55}, {50,205,-55}, {50,395,-45}, {50,398,-45}, {50,406,-45}, {50,416,-45}, {50,421,-45}, {50,451,-45}, {50,457,-45}, {50,476,-45}, {50,572,-95}, {50,605,-50}, {50,606,-50}, {50,611,-50}, {50,617,-50}, {50,626,-50}, {50,660,-145}, {50,670,-130}, {50,688,-100}, {50,689,-100}, {50,694,-100}, {50,2924,-25}, {50,3146,-74}, {50,3819,-50}, {50,3820,-50}, {50,3827,-50}, {50,3834,-50}, {50,3842,-50}, {50,3905,-100}, {50,3954,-90}, {50,4034,-74}, {50,4037,-74}, {50,4053,-74}, {53,2,-30}, {53,7,-30}, {53,18,-30}, {53,29,-30}, {53,35,-30}, {53,45,-30}, {53,50,-30}, {53,605,-10}, {53,606,-10}, {53,611,-10}, {53,617,-10}, {53,626,-10}, {95,2,-35}, {95,7,-35}, {95,18,-35}, {95,29,-35}, {95,35,-35}, {95,45,-35}, {95,50,-35}, {95,660,-40}, {95,670,-40}, {95,688,-40}, {95,689,-40}, {95,694,-40}, {95,2998,-20}, {194,2,-90}, {194,7,-90}, {194,18,-90}, {194,29,-90}, {194,35,-90}, {194,45,-90}, {194,50,-90}, {194,736,-25}, {194,738,-25}, {194,760,-25}, {194,777,-25}, {194,1032,-25}, {194,1113,-25}, {194,1175,-25}, {194,1411,-92}, {194,1632,-25}, {194,1633,-25}, {194,1647,-25}, {194,1657,-25}, {194,1664,-25}, {194,2797,-25}, {194,2798,-25}, {194,2812,-25}, {194,2822,-25}, {194,2829,-25}, {194,2902,-25}, {194,2910,-25}, {194,2998,-110}, {303,2,-30}, {303,7,-30}, {303,18,-30}, {303,29,-30}, {303,35,-30}, {303,45,-30}, {303,50,-30}, {303,736,-15}, {303,738,-15}, {303,760,-15}, {303,777,-15}, {303,1032,-15}, {303,1113,-15}, {303,1175,-15}, {303,1632,-15}, {303,1633,-15}, {303,1647,-15}, {303,1657,-15}, {303,1664,-15}, {303,2797,-15}, {303,2798,-15}, {303,2812,-15}, {303,2822,-15}, {303,2829,-15}, {303,2902,-15}, {303,2910,-15}, {303,2998,-20}, {303,3819,-15}, {303,3820,-15}, {303,3827,-15}, {303,3834,-15}, {303,3842,-15}, {311,395,-30}, {311,398,-30}, {311,406,-30}, {311,416,-30}, {311,421,-30}, {311,451,-30}, {311,457,-30}, {311,1632,-25}, {311,1633,-25}, {311,1647,-25}, {311,1657,-25}, {311,1664,-25}, {311,2797,-25}, {311,2798,-25}, {311,2812,-25}, {311,2822,-25}, {311,2829,-25}, {311,2902,-25}, {311,2910,-25}, {311,3819,-15}, {311,3820,-15}, {311,3827,-15}, {311,3834,-15}, {311,3842,-15}, {311,4034,-45}, {311,4037,-45}, {311,4053,-45}, {339,572,-92}, {339,660,-92}, {339,670,-92}, {339,688,-92}, {339,689,-92}, {339,694,-92}, {339,3142,-20}, {339,3146,-110}, {339,4034,-55}, {339,4037,-55}, {339,4053,-55}, {358,572,-92}, {358,660,-92}, {358,670,-92}, {358,688,-92}, {358,689,-92}, {358,694,-92}, {358,3142,-20}, {358,3146,-110}, {358,4034,-55}, {358,4037,-55}, {358,4053,-55}, {374,2,-20}, {374,7,-20}, {374,18,-20}, {374,29,-20}, {374,35,-20}, {374,45,-20}, {374,50,-20}, {392,2,-20}, {392,7,-20}, {392,18,-20}, {392,29,-20}, {392,35,-20}, {392,45,-20}, {392,50,-20}, {395,2,-40}, {395,7,-40}, {395,18,-40}, {395,29,-40}, {395,35,-40}, {395,45,-40}, {395,50,-40}, {395,572,-40}, {395,660,-50}, {395,670,-50}, {395,680,-40}, {395,688,-50}, {395,689,-50}, {395,694,-50}, {398,2,-40}, {398,7,-40}, {398,18,-40}, {398,29,-40}, {398,35,-40}, {398,45,-40}, {398,50,-40}, {398,572,-40}, {398,660,-50}, {398,670,-50}, {398,680,-40}, {398,688,-50}, {398,689,-50}, {398,694,-50}, {406,2,-40}, {406,7,-40}, {406,18,-40}, {406,29,-40}, {406,35,-40}, {406,45,-40}, {406,50,-40}, {406,572,-40}, {406,660,-50}, {406,670,-50}, {406,680,-40}, {406,688,-50}, {406,689,-50}, {406,694,-50}, {416,2,-40}, {416,7,-40}, {416,18,-40}, {416,29,-40}, {416,35,-40}, {416,45,-40}, {416,50,-40}, {416,572,-40}, {416,660,-50}, {416,670,-50}, {416,680,-40}, {416,688,-50}, {416,689,-50}, {416,694,-50}, {421,2,-40}, {421,7,-40}, {421,18,-40}, {421,29,-40}, {421,35,-40}, {421,45,-40}, {421,50,-40}, {421,572,-40}, {421,660,-50}, {421,670,-50}, {421,680,-40}, {421,688,-50}, {421,689,-50}, {421,694,-50}, {451,2,-40}, {451,7,-40}, {451,18,-40}, {451,29,-40}, {451,35,-40}, {451,45,-40}, {451,50,-40}, {451,572,-40}, {451,660,-50}, {451,670,-50}, {451,680,-40}, {451,688,-50}, {451,689,-50}, {451,694,-50}, {457,2,-40}, {457,7,-40}, {457,18,-40}, {457,29,-40}, {457,35,-40}, {457,45,-40}, {457,50,-40}, {457,572,-40}, {457,660,-50}, {457,670,-50}, {457,680,-40}, {457,688,-50}, {457,689,-50}, {457,694,-50}, {461,2,-74}, {461,7,-74}, {461,18,-74}, {461,29,-74}, {461,35,-74}, {461,45,-74}, {461,50,-74}, {461,736,-10}, {461,738,-10}, {461,760,-10}, {461,777,-10}, {461,1032,-10}, {461,1113,-10}, {461,1175,-10}, {461,1411,-92}, {461,1632,-20}, {461,1633,-20}, {461,1647,-20}, {461,1657,-20}, {461,1664,-20}, {461,2797,-20}, {461,2798,-20}, {461,2812,-20}, {461,2822,-20}, {461,2829,-20}, {461,2902,-20}, {461,2910,-20}, {461,2998,-110}, {476,605,-10}, {476,606,-10}, {476,611,-10}, {476,617,-10}, {476,626,-10}, {476,2998,-20}, {480,395,-30}, {480,398,-30}, {480,406,-30}, {480,416,-30}, {480,421,-30}, {480,451,-30}, {480,457,-30}, {480,572,-40}, {480,605,-30}, {480,606,-30}, {480,611,-30}, {480,617,-30}, {480,626,-30}, {480,660,-55}, {480,670,-35}, {480,688,-35}, {480,689,-35}, {480,694,-35}, {572,2,-90}, {572,7,-90}, {572,18,-90}, {572,29,-90}, {572,35,-90}, {572,45,-90}, {572,50,-90}, {572,395,-18}, {572,398,-18}, {572,406,-18}, {572,416,-18}, {572,421,-18}, {572,451,-18}, {572,457,-18}, {572,736,-92}, {572,738,-92}, {572,760,-52}, {572,777,-52}, {572,1032,-52}, {572,1113,-92}, {572,1175,-52}, {572,1404,-74}, {572,1411,-74}, {572,1632,-92}, {572,1633,-92}, {572,1647,-92}, {572,1657,-52}, {572,1664,-52}, {572,2128,-92}, {572,2134,-18}, {572,2135,-18}, {572,2797,-92}, {572,2798,-92}, {572,2812,-92}, {572,2822,-92}, {572,2829,-92}, {572,2902,-92}, {572,2910,-92}, {572,2998,-90}, {572,3151,-74}, {572,3354,-74}, {572,3819,-92}, {572,3820,-92}, {572,3827,-92}, {572,3834,-92}, {572,3842,-92}, {572,3954,-74}, {572,4034,-34}, {572,4037,-34}, {572,4053,-34}, {605,2,-60}, {605,7,-60}, {605,18,-60}, {605,29,-60}, {605,35,-60}, {605,45,-60}, {605,50,-60}, {605,1411,-50}, {605,2998,-50}, {606,2,-60}, {606,7,-60}, {606,18,-60}, {606,29,-60}, {606,35,-60}, {606,45,-60}, {606,50,-60}, {606,1411,-50}, {606,2998,-50}, {611,2,-60}, {611,7,-60}, {611,18,-60}, {611,29,-60}, {611,35,-60}, {611,45,-60}, {611,50,-60}, {611,1411,-50}, {611,2998,-50}, {617,2,-60}, {617,7,-60}, {617,18,-60}, {617,29,-60}, {617,35,-60}, {617,45,-60}, {617,50,-60}, {617,1411,-50}, {617,2998,-50}, {626,2,-60}, {626,7,-60}, {626,18,-60}, {626,29,-60}, {626,35,-60}, {626,45,-60}, {626,50,-60}, {626,1411,-50}, {626,2998,-50}, {660,2,-135}, {660,7,-135}, {660,18,-135}, {660,29,-135}, {660,35,-135}, {660,45,-135}, {660,50,-135}, {660,205,-30}, {660,395,-45}, {660,398,-45}, {660,406,-45}, {660,416,-45}, {660,421,-45}, {660,451,-45}, {660,457,-45}, {660,736,-92}, {660,738,-92}, {660,760,-92}, {660,777,-92}, {660,1032,-92}, {660,1113,-92}, {660,1175,-92}, {660,1404,-92}, {660,1411,-129}, {660,1632,-100}, {660,1633,-100}, {660,1647,-100}, {660,1657,-100}, {660,1664,-100}, {660,2128,-74}, {660,2134,-37}, {660,2135,-37}, {660,2142,-37}, {660,2198,-37}, {660,2209,-37}, {660,2797,-100}, {660,2798,-100}, {660,2812,-100}, {660,2822,-100}, {660,2829,-100}, {660,2902,-100}, {660,2910,-100}, {660,2998,-145}, {660,3354,-92}, {660,3819,-92}, {660,3820,-92}, {660,3827,-92}, {660,3834,-92}, {660,3842,-92}, {670,2,-120}, {670,7,-120}, {670,18,-120}, {670,29,-120}, {670,35,-120}, {670,45,-120}, {670,50,-120}, {670,395,-10}, {670,398,-10}, {670,406,-10}, {670,416,-10}, {670,421,-10}, {670,451,-10}, {670,457,-10}, {670,736,-65}, {670,738,-65}, {670,760,-65}, {670,777,-65}, {670,1032,-65}, {670,1113,-65}, {670,1175,-65}, {670,1404,-55}, {670,1411,-92}, {670,1632,-65}, {670,1633,-65}, {670,1647,-65}, {670,1657,-65}, {670,1664,-65}, {670,2128,-37}, {670,2134,-18}, {670,2135,-18}, {670,2797,-75}, {670,2798,-75}, {670,2812,-75}, {670,2822,-75}, {670,2829,-75}, {670,2902,-75}, {670,2910,-75}, {670,2998,-92}, {670,3354,-55}, {670,3819,-50}, {670,3820,-50}, {670,3827,-50}, {670,3834,-50}, {670,3842,-50}, {670,4034,-60}, {670,4037,-60}, {670,4053,-60}, {688,2,-110}, {688,7,-110}, {688,18,-110}, {688,29,-110}, {688,35,-110}, {688,45,-110}, {688,50,-110}, {688,395,-35}, {688,398,-35}, {688,406,-35}, {688,416,-35}, {688,421,-35}, {688,451,-35}, {688,457,-35}, {688,736,-85}, {688,738,-85}, {688,760,-85}, {688,777,-85}, {688,1032,-85}, {688,1113,-85}, {688,1175,-85}, {688,1404,-92}, {688,1411,-92}, {688,1632,-111}, {688,1633,-111}, {688,1647,-111}, {688,1657,-71}, {688,1664,-71}, {688,2128,-92}, {688,2134,-37}, {688,2135,-37}, {688,2797,-111}, {688,2798,-111}, {688,2812,-111}, {688,2822,-111}, {688,2829,-111}, {688,2902,-111}, {688,2910,-111}, {688,2998,-92}, {688,3354,-92}, {688,3819,-92}, {688,3820,-92}, {688,3827,-92}, {688,3834,-92}, {688,3842,-92}, {689,2,-110}, {689,7,-110}, {689,18,-110}, {689,29,-110}, {689,35,-110}, {689,45,-110}, {689,50,-110}, {689,395,-35}, {689,398,-35}, {689,406,-35}, {689,416,-35}, {689,421,-35}, {689,451,-35}, {689,457,-35}, {689,736,-85}, {689,738,-85}, {689,760,-85}, {689,777,-85}, {689,1032,-85}, {689,1113,-85}, {689,1175,-85}, {689,1404,-92}, {689,1411,-92}, {689,1632,-111}, {689,1633,-111}, {689,1647,-111}, {689,1657,-71}, {689,1664,-71}, {689,2128,-92}, {689,2134,-37}, {689,2135,-37}, {689,2797,-111}, {689,2798,-111}, {689,2812,-111}, {689,2822,-111}, {689,2829,-111}, {689,2902,-111}, {689,2910,-111}, {689,2998,-92}, {689,3354,-92}, {689,3819,-92}, {689,3820,-92}, {689,3827,-92}, {689,3834,-92}, {689,3842,-92}, {694,2,-110}, {694,7,-110}, {694,18,-110}, {694,29,-110}, {694,35,-110}, {694,45,-110}, {694,50,-110}, {694,395,-35}, {694,398,-35}, {694,406,-35}, {694,416,-35}, {694,421,-35}, {694,451,-35}, {694,457,-35}, {694,736,-85}, {694,738,-85}, {694,760,-85}, {694,777,-85}, {694,1032,-85}, {694,1113,-85}, {694,1175,-85}, {694,1404,-92}, {694,1411,-92}, {694,1632,-111}, {694,1633,-111}, {694,1647,-111}, {694,1657,-71}, {694,1664,-71}, {694,2128,-92}, {694,2134,-37}, {694,2135,-37}, {694,2797,-111}, {694,2798,-111}, {694,2812,-111}, {694,2822,-111}, {694,2829,-111}, {694,2902,-111}, {694,2910,-111}, {694,2998,-92}, {694,3354,-92}, {694,3819,-92}, {694,3820,-92}, {694,3827,-92}, {694,3834,-92}, {694,3842,-92}, {736,3905,-25}, {738,3905,-25}, {760,3905,-25}, {777,3905,-25}, {1032,3905,-25}, {1113,3905,-25}, {1175,3905,-25}, {1194,1194,-10}, {1194,2998,-40}, {1194,3819,-20}, {1194,3820,-20}, {1194,3827,-20}, {1194,3834,-20}, {1194,3842,-20}, {1194,3905,-15}, {1411,3142,-45}, {1411,3146,-55}, {1483,3954,-15}, {1632,3905,-15}, {1633,3905,-15}, {1647,3905,-15}, {1657,3905,-15}, {1664,3905,-15}, {1789,1411,-15}, {1789,1610,-35}, {1789,2134,-25}, {1789,2797,-25}, {1789,2798,-25}, {1789,2812,-25}, {1789,2822,-25}, {1789,2829,-25}, {1789,2902,-25}, {1789,2910,-25}, {1789,2998,-15}, {1789,3142,50}, {1789,3146,55}, {1888,2998,-15}, {1990,4034,-15}, {1990,4037,-15}, {1990,4053,-15}, {2134,3905,-10}, {2135,3905,-10}, {2142,3905,-10}, {2198,3905,-10}, {2209,3905,-10}, {2304,1632,-10}, {2304,1633,-10}, {2304,1647,-10}, {2304,1657,-10}, {2304,1664,-10}, {2304,2797,-15}, {2304,2798,-15}, {2304,2812,-15}, {2304,2822,-15}, {2304,2829,-15}, {2304,2902,-15}, {2304,2910,-15}, {2304,4034,-15}, {2304,4037,-15}, {2304,4053,-15}, {2650,3905,-40}, {2772,3905,-40}, {2797,3905,-10}, {2797,3954,-10}, {2798,3905,-10}, {2798,3954,-10}, {2812,3905,-10}, {2812,3954,-10}, {2822,3905,-10}, {2822,3954,-10}, {2829,3905,-10}, {2829,3954,-10}, {2902,3905,-10}, {2902,3954,-10}, {2910,3905,-10}, {2910,3954,-10}, {2998,3142,-55}, {2998,3146,-55}, {3138,2,-10}, {3138,7,-10}, {3138,18,-10}, {3138,29,-10}, {3138,35,-10}, {3138,45,-10}, {3138,50,-10}, {3143,2,-10}, {3143,7,-10}, {3143,18,-10}, {3143,29,-10}, {3143,35,-10}, {3143,45,-10}, {3143,50,-10}, {3143,3143,-63}, {3146,1483,-20}, {3146,3146,-63}, {3146,3151,-20}, {3146,3282,-37}, {3146,3320,-37}, {3146,3501,-74}, {3146,3905,-20}, {3151,1314,-18}, {3151,1334,-18}, {3151,1411,-92}, {3151,1632,-18}, {3151,1633,-18}, {3151,1647,-18}, {3151,1657,-18}, {3151,1664,-18}, {3151,1888,-10}, {3151,2128,-37}, {3151,2650,-15}, {3151,2772,-15}, {3151,2797,-18}, {3151,2798,-18}, {3151,2812,-18}, {3151,2822,-18}, {3151,2829,-18}, {3151,2902,-18}, {3151,2910,-18}, {3151,2924,-10}, {3151,2998,-100}, {3151,3086,-18}, {3151,3905,-10}, {3501,2,-55}, {3501,7,-55}, {3501,18,-55}, {3501,29,-55}, {3501,35,-55}, {3501,45,-55}, {3501,50,-55}, {3501,572,-30}, {3501,660,-45}, {3501,670,-30}, {3501,688,-55}, {3501,689,-55}, {3501,694,-55}, {3905,736,-10}, {3905,738,-10}, {3905,760,-10}, {3905,777,-10}, {3905,1032,-10}, {3905,1113,-10}, {3905,1175,-10}, {3905,1411,-55}, {3905,1632,-10}, {3905,1633,-10}, {3905,1647,-10}, {3905,1657,-10}, {3905,1664,-10}, {3905,2797,-10}, {3905,2798,-10}, {3905,2812,-10}, {3905,2822,-10}, {3905,2829,-10}, {3905,2902,-10}, {3905,2910,-10}, {3905,2998,-70}, {3954,1411,-55}, {3954,2797,-10}, {3954,2798,-10}, {3954,2812,-10}, {3954,2822,-10}, {3954,2829,-10}, {3954,2902,-10}, {3954,2910,-10}, {3954,2998,-70}, {4034,1411,-55}, {4034,1632,-10}, {4034,1633,-10}, {4034,1647,-10}, {4034,1657,-10}, {4034,1664,-10}, {4034,2797,-25}, {4034,2798,-25}, {4034,2812,-25}, {4034,2822,-25}, {4034,2829,-25}, {4034,2902,-25}, {4034,2910,-25}, {4034,2998,-70}, {4037,1411,-55}, {4037,1632,-10}, {4037,1633,-10}, {4037,1647,-10}, {4037,1657,-10}, {4037,1664,-10}, {4037,2797,-25}, {4037,2798,-25}, {4037,2812,-25}, {4037,2822,-25}, {4037,2829,-25}, {4037,2902,-25}, {4037,2910,-25}, {4037,2998,-70}, {4053,1411,-55}, {4053,1632,-10}, {4053,1633,-10}, {4053,1647,-10}, {4053,1657,-10}, {4053,1664,-10}, {4053,2797,-25}, {4053,2798,-25}, {4053,2812,-25}, {4053,2822,-25}, {4053,2829,-25}, {4053,2902,-25}, {4053,2910,-25}, {4053,2998,-70}, {NOGLYPH,NOGLYPH,0} }; static const ligature times_bold_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair times_bolditalic_kerns[] = { {2,66,-65}, {2,72,-65}, {2,205,-60}, {2,395,-50}, {2,398,-50}, {2,406,-50}, {2,416,-50}, {2,421,-50}, {2,451,-50}, {2,457,-50}, {2,476,-55}, {2,572,-55}, {2,605,-50}, {2,606,-50}, {2,611,-50}, {2,617,-50}, {2,626,-50}, {2,660,-95}, {2,670,-100}, {2,688,-70}, {2,689,-70}, {2,694,-70}, {2,3146,-74}, {2,3819,-30}, {2,3820,-30}, {2,3827,-30}, {2,3834,-30}, {2,3842,-30}, {2,3905,-74}, {2,3954,-74}, {2,4034,-74}, {2,4037,-74}, {2,4053,-74}, {7,66,-65}, {7,72,-65}, {7,205,-60}, {7,395,-50}, {7,398,-50}, {7,406,-50}, {7,416,-50}, {7,421,-50}, {7,451,-50}, {7,457,-50}, {7,476,-55}, {7,572,-55}, {7,605,-50}, {7,606,-50}, {7,611,-50}, {7,617,-50}, {7,626,-50}, {7,660,-95}, {7,670,-100}, {7,688,-70}, {7,689,-70}, {7,694,-70}, {7,3146,-74}, {7,3819,-30}, {7,3820,-30}, {7,3827,-30}, {7,3834,-30}, {7,3842,-30}, {7,3905,-74}, {7,3954,-74}, {7,4034,-74}, {7,4037,-74}, {7,4053,-74}, {18,66,-65}, {18,72,-65}, {18,205,-60}, {18,395,-50}, {18,398,-50}, {18,406,-50}, {18,416,-50}, {18,421,-50}, {18,451,-50}, {18,457,-50}, {18,476,-55}, {18,572,-55}, {18,605,-50}, {18,606,-50}, {18,611,-50}, {18,617,-50}, {18,626,-50}, {18,660,-95}, {18,670,-100}, {18,688,-70}, {18,689,-70}, {18,694,-70}, {18,3146,-74}, {18,3819,-30}, {18,3820,-30}, {18,3827,-30}, {18,3834,-30}, {18,3842,-30}, {18,3905,-74}, {18,3954,-74}, {18,4034,-74}, {18,4037,-74}, {18,4053,-74}, {29,66,-65}, {29,72,-65}, {29,205,-60}, {29,395,-50}, {29,398,-50}, {29,406,-50}, {29,416,-50}, {29,421,-50}, {29,451,-50}, {29,457,-50}, {29,476,-55}, {29,572,-55}, {29,605,-50}, {29,606,-50}, {29,611,-50}, {29,617,-50}, {29,626,-50}, {29,660,-95}, {29,670,-100}, {29,688,-70}, {29,689,-70}, {29,694,-70}, {29,3146,-74}, {29,3819,-30}, {29,3820,-30}, {29,3827,-30}, {29,3834,-30}, {29,3842,-30}, {29,3905,-74}, {29,3954,-74}, {29,4034,-74}, {29,4037,-74}, {29,4053,-74}, {35,66,-65}, {35,72,-65}, {35,205,-60}, {35,395,-50}, {35,398,-50}, {35,406,-50}, {35,416,-50}, {35,421,-50}, {35,451,-50}, {35,457,-50}, {35,476,-55}, {35,572,-55}, {35,605,-50}, {35,606,-50}, {35,611,-50}, {35,617,-50}, {35,626,-50}, {35,660,-95}, {35,670,-100}, {35,688,-70}, {35,689,-70}, {35,694,-70}, {35,3146,-74}, {35,3819,-30}, {35,3820,-30}, {35,3827,-30}, {35,3834,-30}, {35,3842,-30}, {35,3905,-74}, {35,3954,-74}, {35,4034,-74}, {35,4037,-74}, {35,4053,-74}, {45,66,-65}, {45,72,-65}, {45,205,-60}, {45,395,-50}, {45,398,-50}, {45,406,-50}, {45,416,-50}, {45,421,-50}, {45,451,-50}, {45,457,-50}, {45,476,-55}, {45,572,-55}, {45,605,-50}, {45,606,-50}, {45,611,-50}, {45,617,-50}, {45,626,-50}, {45,660,-95}, {45,670,-100}, {45,688,-70}, {45,689,-70}, {45,694,-70}, {45,3146,-74}, {45,3819,-30}, {45,3820,-30}, {45,3827,-30}, {45,3834,-30}, {45,3842,-30}, {45,3905,-74}, {45,3954,-74}, {45,4034,-74}, {45,4037,-74}, {45,4053,-74}, {50,66,-65}, {50,72,-65}, {50,205,-60}, {50,395,-50}, {50,398,-50}, {50,406,-50}, {50,416,-50}, {50,421,-50}, {50,451,-50}, {50,457,-50}, {50,476,-55}, {50,572,-55}, {50,605,-50}, {50,606,-50}, {50,611,-50}, {50,617,-50}, {50,626,-50}, {50,660,-95}, {50,670,-100}, {50,688,-70}, {50,689,-70}, {50,694,-70}, {50,3146,-74}, {50,3819,-30}, {50,3820,-30}, {50,3827,-30}, {50,3834,-30}, {50,3842,-30}, {50,3905,-74}, {50,3954,-74}, {50,4034,-74}, {50,4037,-74}, {50,4053,-74}, {53,2,-25}, {53,7,-25}, {53,18,-25}, {53,29,-25}, {53,35,-25}, {53,45,-25}, {53,50,-25}, {53,605,-10}, {53,606,-10}, {53,611,-10}, {53,617,-10}, {53,626,-10}, {95,2,-25}, {95,7,-25}, {95,18,-25}, {95,29,-25}, {95,35,-25}, {95,45,-25}, {95,50,-25}, {95,660,-50}, {95,670,-40}, {95,688,-50}, {95,689,-50}, {95,694,-50}, {194,2,-100}, {194,7,-100}, {194,18,-100}, {194,29,-100}, {194,35,-100}, {194,45,-100}, {194,50,-100}, {194,736,-95}, {194,738,-95}, {194,760,-95}, {194,777,-95}, {194,1032,-95}, {194,1113,-95}, {194,1175,-95}, {194,1411,-129}, {194,1632,-100}, {194,1633,-100}, {194,1647,-100}, {194,1657,-100}, {194,1664,-100}, {194,2134,-40}, {194,2135,-40}, {194,2142,-40}, {194,2198,-40}, {194,2209,-40}, {194,2797,-70}, {194,2798,-70}, {194,2812,-70}, {194,2822,-70}, {194,2829,-70}, {194,2902,-70}, {194,2910,-70}, {194,2998,-129}, {194,3151,-50}, {303,2,-25}, {303,7,-25}, {303,18,-25}, {303,29,-25}, {303,35,-25}, {303,45,-25}, {303,50,-25}, {303,736,-40}, {303,738,-40}, {303,760,-40}, {303,777,-40}, {303,1032,-40}, {303,1113,-40}, {303,1175,-40}, {303,1411,-10}, {303,1632,-40}, {303,1633,-40}, {303,1647,-40}, {303,1657,-40}, {303,1664,-40}, {303,2797,-40}, {303,2798,-40}, {303,2812,-40}, {303,2822,-40}, {303,2829,-40}, {303,2902,-40}, {303,2910,-40}, {303,2998,-10}, {303,3819,-40}, {303,3820,-40}, {303,3827,-40}, {303,3834,-40}, {303,3842,-40}, {311,395,-30}, {311,398,-30}, {311,406,-30}, {311,416,-30}, {311,421,-30}, {311,451,-30}, {311,457,-30}, {311,1632,-25}, {311,1633,-25}, {311,1647,-25}, {311,1657,-25}, {311,1664,-25}, {311,2797,-25}, {311,2798,-25}, {311,2812,-25}, {311,2822,-25}, {311,2829,-25}, {311,2902,-25}, {311,2910,-25}, {311,3819,-20}, {311,3820,-20}, {311,3827,-20}, {311,3834,-20}, {311,3842,-20}, {311,4034,-20}, {311,4037,-20}, {311,4053,-20}, {339,572,-18}, {339,660,-37}, {339,670,-37}, {339,688,-37}, {339,689,-37}, {339,694,-37}, {339,3146,-55}, {339,4034,-37}, {339,4037,-37}, {339,4053,-37}, {358,572,-18}, {358,660,-37}, {358,670,-37}, {358,688,-37}, {358,689,-37}, {358,694,-37}, {358,3146,-55}, {358,4034,-37}, {358,4037,-37}, {358,4053,-37}, {374,2,-30}, {374,7,-30}, {374,18,-30}, {374,29,-30}, {374,35,-30}, {374,45,-30}, {374,50,-30}, {392,2,-30}, {392,7,-30}, {392,18,-30}, {392,29,-30}, {392,35,-30}, {392,45,-30}, {392,50,-30}, {395,2,-40}, {395,7,-40}, {395,18,-40}, {395,29,-40}, {395,35,-40}, {395,45,-40}, {395,50,-40}, {395,572,-40}, {395,660,-50}, {395,670,-50}, {395,680,-40}, {395,688,-50}, {395,689,-50}, {395,694,-50}, {398,2,-40}, {398,7,-40}, {398,18,-40}, {398,29,-40}, {398,35,-40}, {398,45,-40}, {398,50,-40}, {398,572,-40}, {398,660,-50}, {398,670,-50}, {398,680,-40}, {398,688,-50}, {398,689,-50}, {398,694,-50}, {406,2,-40}, {406,7,-40}, {406,18,-40}, {406,29,-40}, {406,35,-40}, {406,45,-40}, {406,50,-40}, {406,572,-40}, {406,660,-50}, {406,670,-50}, {406,680,-40}, {406,688,-50}, {406,689,-50}, {406,694,-50}, {416,2,-40}, {416,7,-40}, {416,18,-40}, {416,29,-40}, {416,35,-40}, {416,45,-40}, {416,50,-40}, {416,572,-40}, {416,660,-50}, {416,670,-50}, {416,680,-40}, {416,688,-50}, {416,689,-50}, {416,694,-50}, {421,2,-40}, {421,7,-40}, {421,18,-40}, {421,29,-40}, {421,35,-40}, {421,45,-40}, {421,50,-40}, {421,572,-40}, {421,660,-50}, {421,670,-50}, {421,680,-40}, {421,688,-50}, {421,689,-50}, {421,694,-50}, {451,2,-40}, {451,7,-40}, {451,18,-40}, {451,29,-40}, {451,35,-40}, {451,45,-40}, {451,50,-40}, {451,572,-40}, {451,660,-50}, {451,670,-50}, {451,680,-40}, {451,688,-50}, {451,689,-50}, {451,694,-50}, {457,2,-40}, {457,7,-40}, {457,18,-40}, {457,29,-40}, {457,35,-40}, {457,45,-40}, {457,50,-40}, {457,572,-40}, {457,660,-50}, {457,670,-50}, {457,680,-40}, {457,688,-50}, {457,689,-50}, {457,694,-50}, {461,2,-85}, {461,7,-85}, {461,18,-85}, {461,29,-85}, {461,35,-85}, {461,45,-85}, {461,50,-85}, {461,736,-40}, {461,738,-40}, {461,760,-40}, {461,777,-40}, {461,1032,-40}, {461,1113,-40}, {461,1175,-40}, {461,1411,-129}, {461,1632,-50}, {461,1633,-50}, {461,1647,-50}, {461,1657,-50}, {461,1664,-50}, {461,2797,-55}, {461,2798,-55}, {461,2812,-55}, {461,2822,-55}, {461,2829,-55}, {461,2902,-55}, {461,2910,-55}, {461,2998,-129}, {476,605,-10}, {476,606,-10}, {476,611,-10}, {476,617,-10}, {476,626,-10}, {480,395,-40}, {480,398,-40}, {480,406,-40}, {480,416,-40}, {480,421,-40}, {480,451,-40}, {480,457,-40}, {480,572,-30}, {480,605,-40}, {480,606,-40}, {480,611,-40}, {480,617,-40}, {480,626,-40}, {480,660,-18}, {480,670,-18}, {480,688,-18}, {480,689,-18}, {480,694,-18}, {572,2,-55}, {572,7,-55}, {572,18,-55}, {572,29,-55}, {572,35,-55}, {572,45,-55}, {572,50,-55}, {572,395,-18}, {572,398,-18}, {572,406,-18}, {572,416,-18}, {572,421,-18}, {572,451,-18}, {572,457,-18}, {572,736,-92}, {572,738,-92}, {572,760,-92}, {572,777,-92}, {572,1032,-92}, {572,1113,-92}, {572,1175,-92}, {572,1404,-74}, {572,1411,-92}, {572,1632,-92}, {572,1633,-92}, {572,1647,-92}, {572,1657,-52}, {572,1664,-52}, {572,2128,-92}, {572,2134,-37}, {572,2135,-37}, {572,2797,-95}, {572,2798,-95}, {572,2812,-95}, {572,2822,-95}, {572,2829,-95}, {572,2902,-95}, {572,2910,-95}, {572,2998,-92}, {572,3151,-37}, {572,3354,-74}, {572,3819,-37}, {572,3820,-37}, {572,3827,-37}, {572,3834,-37}, {572,3842,-37}, {572,3954,-37}, {572,4034,-37}, {572,4037,-37}, {572,4053,-37}, {605,2,-45}, {605,7,-45}, {605,18,-45}, {605,29,-45}, {605,35,-45}, {605,45,-45}, {605,50,-45}, {606,2,-45}, {606,7,-45}, {606,18,-45}, {606,29,-45}, {606,35,-45}, {606,45,-45}, {606,50,-45}, {611,2,-45}, {611,7,-45}, {611,18,-45}, {611,29,-45}, {611,35,-45}, {611,45,-45}, {611,50,-45}, {617,2,-45}, {617,7,-45}, {617,18,-45}, {617,29,-45}, {617,35,-45}, {617,45,-45}, {617,50,-45}, {626,2,-45}, {626,7,-45}, {626,18,-45}, {626,29,-45}, {626,35,-45}, {626,45,-45}, {626,50,-45}, {660,2,-85}, {660,7,-85}, {660,18,-85}, {660,29,-85}, {660,35,-85}, {660,45,-85}, {660,50,-85}, {660,205,-10}, {660,395,-30}, {660,398,-30}, {660,406,-30}, {660,416,-30}, {660,421,-30}, {660,451,-30}, {660,457,-30}, {660,736,-111}, {660,738,-111}, {660,760,-111}, {660,777,-111}, {660,1032,-111}, {660,1113,-111}, {660,1175,-111}, {660,1404,-74}, {660,1411,-129}, {660,1632,-111}, {660,1633,-111}, {660,1647,-111}, {660,1657,-71}, {660,1664,-71}, {660,2128,-70}, {660,2134,-55}, {660,2135,-55}, {660,2797,-111}, {660,2798,-111}, {660,2812,-111}, {660,2822,-111}, {660,2829,-111}, {660,2902,-111}, {660,2910,-111}, {660,2998,-129}, {660,3354,-74}, {660,3819,-55}, {660,3820,-55}, {660,3827,-55}, {660,3834,-55}, {660,3842,-55}, {670,2,-74}, {670,7,-74}, {670,18,-74}, {670,29,-74}, {670,35,-74}, {670,45,-74}, {670,50,-74}, {670,395,-15}, {670,398,-15}, {670,406,-15}, {670,416,-15}, {670,421,-15}, {670,451,-15}, {670,457,-15}, {670,736,-85}, {670,738,-85}, {670,760,-85}, {670,777,-85}, {670,1032,-85}, {670,1113,-85}, {670,1175,-85}, {670,1404,-55}, {670,1411,-74}, {670,1632,-90}, {670,1633,-90}, {670,1647,-90}, {670,1657,-50}, {670,1664,-50}, {670,2128,-50}, {670,2134,-37}, {670,2135,-37}, {670,2797,-80}, {670,2798,-80}, {670,2812,-80}, {670,2822,-80}, {670,2829,-80}, {670,2902,-80}, {670,2910,-80}, {670,2998,-74}, {670,3354,-55}, {670,3819,-55}, {670,3820,-55}, {670,3827,-55}, {670,3834,-55}, {670,3842,-55}, {670,4034,-55}, {670,4037,-55}, {670,4053,-55}, {688,2,-74}, {688,7,-74}, {688,18,-74}, {688,29,-74}, {688,35,-74}, {688,45,-74}, {688,50,-74}, {688,395,-25}, {688,398,-25}, {688,406,-25}, {688,416,-25}, {688,421,-25}, {688,451,-25}, {688,457,-25}, {688,736,-92}, {688,738,-92}, {688,760,-92}, {688,777,-92}, {688,1032,-92}, {688,1113,-92}, {688,1175,-92}, {688,1404,-92}, {688,1411,-92}, {688,1632,-111}, {688,1633,-111}, {688,1647,-71}, {688,1657,-71}, {688,1664,-71}, {688,2128,-92}, {688,2134,-55}, {688,2135,-55}, {688,2797,-111}, {688,2798,-111}, {688,2812,-111}, {688,2822,-111}, {688,2829,-111}, {688,2902,-111}, {688,2910,-111}, {688,2998,-74}, {688,3354,-92}, {688,3819,-92}, {688,3820,-92}, {688,3827,-92}, {688,3834,-92}, {688,3842,-92}, {689,2,-74}, {689,7,-74}, {689,18,-74}, {689,29,-74}, {689,35,-74}, {689,45,-74}, {689,50,-74}, {689,395,-25}, {689,398,-25}, {689,406,-25}, {689,416,-25}, {689,421,-25}, {689,451,-25}, {689,457,-25}, {689,736,-92}, {689,738,-92}, {689,760,-92}, {689,777,-92}, {689,1032,-92}, {689,1113,-92}, {689,1175,-92}, {689,1404,-92}, {689,1411,-92}, {689,1632,-111}, {689,1633,-111}, {689,1647,-71}, {689,1657,-71}, {689,1664,-71}, {689,2128,-92}, {689,2134,-55}, {689,2135,-55}, {689,2797,-111}, {689,2798,-111}, {689,2812,-111}, {689,2822,-111}, {689,2829,-111}, {689,2902,-111}, {689,2910,-111}, {689,2998,-74}, {689,3354,-92}, {689,3819,-92}, {689,3820,-92}, {689,3827,-92}, {689,3834,-92}, {689,3842,-92}, {694,2,-74}, {694,7,-74}, {694,18,-74}, {694,29,-74}, {694,35,-74}, {694,45,-74}, {694,50,-74}, {694,395,-25}, {694,398,-25}, {694,406,-25}, {694,416,-25}, {694,421,-25}, {694,451,-25}, {694,457,-25}, {694,736,-92}, {694,738,-92}, {694,760,-92}, {694,777,-92}, {694,1032,-92}, {694,1113,-92}, {694,1175,-92}, {694,1404,-92}, {694,1411,-92}, {694,1632,-111}, {694,1633,-111}, {694,1647,-71}, {694,1657,-71}, {694,1664,-71}, {694,2128,-92}, {694,2134,-55}, {694,2135,-55}, {694,2797,-111}, {694,2798,-111}, {694,2812,-111}, {694,2822,-111}, {694,2829,-111}, {694,2902,-111}, {694,2910,-111}, {694,2998,-74}, {694,3354,-92}, {694,3819,-92}, {694,3820,-92}, {694,3827,-92}, {694,3834,-92}, {694,3842,-92}, {1194,1194,-10}, {1194,2998,-40}, {1194,3819,-20}, {1194,3820,-20}, {1194,3827,-20}, {1194,3834,-20}, {1194,3842,-20}, {1314,1990,-10}, {1314,2304,-10}, {1334,1990,-10}, {1334,2304,-10}, {1411,3142,-95}, {1411,3146,-95}, {1632,1194,-10}, {1633,1194,-10}, {1647,1194,-10}, {1657,1194,-10}, {1664,1194,-10}, {1789,1411,-10}, {1789,1610,-30}, {1789,1632,-10}, {1789,1633,-10}, {1789,1789,-18}, {1789,2797,-10}, {1789,2798,-10}, {1789,2812,-10}, {1789,2829,-10}, {1789,2902,-10}, {1789,2910,-10}, {1789,2998,-10}, {1789,3146,55}, {2304,1632,-30}, {2304,1633,-30}, {2304,1647,-30}, {2304,1657,-30}, {2304,1664,-30}, {2304,2797,-10}, {2304,2798,-10}, {2304,2812,-10}, {2304,2822,-10}, {2304,2829,-10}, {2304,2902,-10}, {2304,2910,-10}, {2650,3905,-40}, {2772,3905,-40}, {2797,3905,-15}, {2797,3954,-25}, {2797,4023,-10}, {2797,4034,-10}, {2797,4037,-10}, {2797,4053,-10}, {2798,3905,-15}, {2798,3954,-25}, {2798,4023,-10}, {2798,4034,-10}, {2798,4037,-10}, {2798,4053,-10}, {2812,3905,-15}, {2812,3954,-25}, {2812,4023,-10}, {2812,4034,-10}, {2812,4037,-10}, {2812,4053,-10}, {2822,3905,-15}, {2822,3954,-25}, {2822,4023,-10}, {2822,4034,-10}, {2822,4037,-10}, {2822,4053,-10}, {2829,3905,-15}, {2829,3954,-25}, {2829,4023,-10}, {2829,4034,-10}, {2829,4037,-10}, {2829,4053,-10}, {2902,3905,-15}, {2902,3954,-25}, {2902,4023,-10}, {2902,4034,-10}, {2902,4037,-10}, {2902,4053,-10}, {2910,3905,-15}, {2910,3954,-25}, {2910,4023,-10}, {2910,4034,-10}, {2910,4037,-10}, {2910,4053,-10}, {2998,3142,-95}, {2998,3146,-95}, {3143,3143,-74}, {3146,1483,-15}, {3146,3146,-74}, {3146,3151,-15}, {3146,3282,-74}, {3146,3320,-74}, {3146,3501,-74}, {3146,3559,-37}, {3146,3905,-15}, {3151,1411,-65}, {3151,2998,-65}, {3501,2,-37}, {3501,7,-37}, {3501,18,-37}, {3501,29,-37}, {3501,35,-37}, {3501,45,-37}, {3501,50,-37}, {3501,660,-70}, {3501,670,-70}, {3501,688,-70}, {3501,689,-70}, {3501,694,-70}, {3905,1411,-37}, {3905,1632,-15}, {3905,1633,-15}, {3905,1647,-15}, {3905,1657,-15}, {3905,1664,-15}, {3905,2797,-15}, {3905,2798,-15}, {3905,2812,-15}, {3905,2822,-15}, {3905,2829,-15}, {3905,2902,-15}, {3905,2910,-15}, {3905,2998,-37}, {3954,736,-10}, {3954,738,-10}, {3954,760,-10}, {3954,777,-10}, {3954,1032,-10}, {3954,1113,-10}, {3954,1175,-10}, {3954,1411,-37}, {3954,1632,-10}, {3954,1633,-10}, {3954,1647,-10}, {3954,1657,-10}, {3954,1664,-10}, {3954,2797,-15}, {3954,2798,-15}, {3954,2812,-15}, {3954,2822,-15}, {3954,2829,-15}, {3954,2902,-15}, {3954,2910,-15}, {3954,2998,-37}, {4023,1632,-10}, {4023,1633,-10}, {4023,1647,-10}, {4023,1657,-10}, {4023,1664,-10}, {4034,1411,-37}, {4034,2998,-37}, {4037,1411,-37}, {4037,2998,-37}, {4053,1411,-37}, {4053,2998,-37}, {NOGLYPH,NOGLYPH,0} }; static const ligature times_bolditalic_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair helvetica_kerns[] = { {2,66,-30}, {2,72,-30}, {2,205,-30}, {2,395,-30}, {2,398,-30}, {2,406,-30}, {2,416,-30}, {2,421,-30}, {2,451,-30}, {2,457,-30}, {2,476,-30}, {2,572,-120}, {2,605,-50}, {2,606,-50}, {2,611,-50}, {2,617,-50}, {2,626,-50}, {2,660,-70}, {2,670,-50}, {2,688,-100}, {2,689,-100}, {2,694,-100}, {2,3819,-30}, {2,3820,-30}, {2,3827,-30}, {2,3834,-30}, {2,3842,-30}, {2,3905,-40}, {2,3954,-40}, {2,4034,-40}, {2,4037,-40}, {2,4053,-40}, {7,66,-30}, {7,72,-30}, {7,205,-30}, {7,395,-30}, {7,398,-30}, {7,406,-30}, {7,416,-30}, {7,421,-30}, {7,451,-30}, {7,457,-30}, {7,476,-30}, {7,572,-120}, {7,605,-50}, {7,606,-50}, {7,611,-50}, {7,617,-50}, {7,626,-50}, {7,660,-70}, {7,670,-50}, {7,688,-100}, {7,689,-100}, {7,694,-100}, {7,3819,-30}, {7,3820,-30}, {7,3827,-30}, {7,3834,-30}, {7,3842,-30}, {7,3905,-40}, {7,3954,-40}, {7,4034,-40}, {7,4037,-40}, {7,4053,-40}, {18,66,-30}, {18,72,-30}, {18,205,-30}, {18,395,-30}, {18,398,-30}, {18,406,-30}, {18,416,-30}, {18,421,-30}, {18,451,-30}, {18,457,-30}, {18,476,-30}, {18,572,-120}, {18,605,-50}, {18,606,-50}, {18,611,-50}, {18,617,-50}, {18,626,-50}, {18,660,-70}, {18,670,-50}, {18,688,-100}, {18,689,-100}, {18,694,-100}, {18,3819,-30}, {18,3820,-30}, {18,3827,-30}, {18,3834,-30}, {18,3842,-30}, {18,3905,-40}, {18,3954,-40}, {18,4034,-40}, {18,4037,-40}, {18,4053,-40}, {29,66,-30}, {29,72,-30}, {29,205,-30}, {29,395,-30}, {29,398,-30}, {29,406,-30}, {29,416,-30}, {29,421,-30}, {29,451,-30}, {29,457,-30}, {29,476,-30}, {29,572,-120}, {29,605,-50}, {29,606,-50}, {29,611,-50}, {29,617,-50}, {29,626,-50}, {29,660,-70}, {29,670,-50}, {29,688,-100}, {29,689,-100}, {29,694,-100}, {29,3819,-30}, {29,3820,-30}, {29,3827,-30}, {29,3834,-30}, {29,3842,-30}, {29,3905,-40}, {29,3954,-40}, {29,4034,-40}, {29,4037,-40}, {29,4053,-40}, {35,66,-30}, {35,72,-30}, {35,205,-30}, {35,395,-30}, {35,398,-30}, {35,406,-30}, {35,416,-30}, {35,421,-30}, {35,451,-30}, {35,457,-30}, {35,476,-30}, {35,572,-120}, {35,605,-50}, {35,606,-50}, {35,611,-50}, {35,617,-50}, {35,626,-50}, {35,660,-70}, {35,670,-50}, {35,688,-100}, {35,689,-100}, {35,694,-100}, {35,3819,-30}, {35,3820,-30}, {35,3827,-30}, {35,3834,-30}, {35,3842,-30}, {35,3905,-40}, {35,3954,-40}, {35,4034,-40}, {35,4037,-40}, {35,4053,-40}, {45,66,-30}, {45,72,-30}, {45,205,-30}, {45,395,-30}, {45,398,-30}, {45,406,-30}, {45,416,-30}, {45,421,-30}, {45,451,-30}, {45,457,-30}, {45,476,-30}, {45,572,-120}, {45,605,-50}, {45,606,-50}, {45,611,-50}, {45,617,-50}, {45,626,-50}, {45,660,-70}, {45,670,-50}, {45,688,-100}, {45,689,-100}, {45,694,-100}, {45,3819,-30}, {45,3820,-30}, {45,3827,-30}, {45,3834,-30}, {45,3842,-30}, {45,3905,-40}, {45,3954,-40}, {45,4034,-40}, {45,4037,-40}, {45,4053,-40}, {50,66,-30}, {50,72,-30}, {50,205,-30}, {50,395,-30}, {50,398,-30}, {50,406,-30}, {50,416,-30}, {50,421,-30}, {50,451,-30}, {50,457,-30}, {50,476,-30}, {50,572,-120}, {50,605,-50}, {50,606,-50}, {50,611,-50}, {50,617,-50}, {50,626,-50}, {50,660,-70}, {50,670,-50}, {50,688,-100}, {50,689,-100}, {50,694,-100}, {50,3819,-30}, {50,3820,-30}, {50,3827,-30}, {50,3834,-30}, {50,3842,-30}, {50,3905,-40}, {50,3954,-40}, {50,4034,-40}, {50,4037,-40}, {50,4053,-40}, {53,605,-10}, {53,606,-10}, {53,611,-10}, {53,617,-10}, {53,626,-10}, {53,1411,-20}, {53,2998,-20}, {66,1411,-30}, {66,2998,-30}, {72,1411,-30}, {72,2998,-30}, {95,2,-40}, {95,7,-40}, {95,18,-40}, {95,29,-40}, {95,35,-40}, {95,45,-40}, {95,50,-40}, {95,660,-70}, {95,670,-40}, {95,688,-90}, {95,689,-90}, {95,694,-90}, {95,1411,-70}, {95,2998,-70}, {194,2,-80}, {194,7,-80}, {194,18,-80}, {194,29,-80}, {194,35,-80}, {194,45,-80}, {194,50,-80}, {194,736,-50}, {194,738,-50}, {194,760,-50}, {194,777,-50}, {194,1032,-50}, {194,1113,-50}, {194,1175,-50}, {194,1411,-150}, {194,1632,-30}, {194,1633,-30}, {194,1647,-30}, {194,1657,-30}, {194,1664,-30}, {194,2797,-30}, {194,2798,-30}, {194,2812,-30}, {194,2822,-30}, {194,2829,-30}, {194,2902,-30}, {194,2910,-30}, {194,2998,-150}, {194,3151,-45}, {303,2,-20}, {303,7,-20}, {303,18,-20}, {303,29,-20}, {303,35,-20}, {303,45,-20}, {303,50,-20}, {303,736,-20}, {303,738,-20}, {303,760,-20}, {303,777,-20}, {303,1032,-20}, {303,1113,-20}, {303,1175,-20}, {303,1411,-30}, {303,2998,-30}, {303,3819,-20}, {303,3820,-20}, {303,3827,-20}, {303,3834,-20}, {303,3842,-20}, {311,395,-50}, {311,398,-50}, {311,406,-50}, {311,416,-50}, {311,421,-50}, {311,451,-50}, {311,457,-50}, {311,1632,-40}, {311,1633,-40}, {311,1647,-40}, {311,1657,-40}, {311,1664,-40}, {311,2797,-40}, {311,2798,-40}, {311,2812,-40}, {311,2822,-40}, {311,2829,-40}, {311,2902,-40}, {311,2910,-40}, {311,3819,-30}, {311,3820,-30}, {311,3827,-30}, {311,3834,-30}, {311,3842,-30}, {311,4034,-50}, {311,4037,-50}, {311,4053,-50}, {339,572,-110}, {339,660,-110}, {339,670,-70}, {339,688,-140}, {339,689,-140}, {339,694,-140}, {339,3142,-140}, {339,3146,-160}, {339,4034,-30}, {339,4037,-30}, {339,4053,-30}, {358,572,-110}, {358,660,-110}, {358,670,-70}, {358,688,-140}, {358,689,-140}, {358,694,-140}, {358,3142,-140}, {358,3146,-160}, {358,4034,-30}, {358,4037,-30}, {358,4053,-30}, {395,2,-20}, {395,7,-20}, {395,18,-20}, {395,29,-20}, {395,35,-20}, {395,45,-20}, {395,50,-20}, {395,572,-40}, {395,660,-50}, {395,670,-30}, {395,680,-60}, {395,688,-70}, {395,689,-70}, {395,694,-70}, {395,1411,-40}, {395,2998,-40}, {398,2,-20}, {398,7,-20}, {398,18,-20}, {398,29,-20}, {398,35,-20}, {398,45,-20}, {398,50,-20}, {398,572,-40}, {398,660,-50}, {398,670,-30}, {398,680,-60}, {398,688,-70}, {398,689,-70}, {398,694,-70}, {398,1411,-40}, {398,2998,-40}, {406,2,-20}, {406,7,-20}, {406,18,-20}, {406,29,-20}, {406,35,-20}, {406,45,-20}, {406,50,-20}, {406,572,-40}, {406,660,-50}, {406,670,-30}, {406,680,-60}, {406,688,-70}, {406,689,-70}, {406,694,-70}, {406,1411,-40}, {406,2998,-40}, {416,2,-20}, {416,7,-20}, {416,18,-20}, {416,29,-20}, {416,35,-20}, {416,45,-20}, {416,50,-20}, {416,572,-40}, {416,660,-50}, {416,670,-30}, {416,680,-60}, {416,688,-70}, {416,689,-70}, {416,694,-70}, {416,1411,-40}, {416,2998,-40}, {421,2,-20}, {421,7,-20}, {421,18,-20}, {421,29,-20}, {421,35,-20}, {421,45,-20}, {421,50,-20}, {421,572,-40}, {421,660,-50}, {421,670,-30}, {421,680,-60}, {421,688,-70}, {421,689,-70}, {421,694,-70}, {421,1411,-40}, {421,2998,-40}, {451,2,-20}, {451,7,-20}, {451,18,-20}, {451,29,-20}, {451,35,-20}, {451,45,-20}, {451,50,-20}, {451,572,-40}, {451,660,-50}, {451,670,-30}, {451,680,-60}, {451,688,-70}, {451,689,-70}, {451,694,-70}, {451,1411,-40}, {451,2998,-40}, {457,2,-20}, {457,7,-20}, {457,18,-20}, {457,29,-20}, {457,35,-20}, {457,45,-20}, {457,50,-20}, {457,572,-40}, {457,660,-50}, {457,670,-30}, {457,680,-60}, {457,688,-70}, {457,689,-70}, {457,694,-70}, {457,1411,-40}, {457,2998,-40}, {461,2,-120}, {461,7,-120}, {461,18,-120}, {461,29,-120}, {461,35,-120}, {461,45,-120}, {461,50,-120}, {461,736,-40}, {461,738,-40}, {461,760,-40}, {461,777,-40}, {461,1032,-40}, {461,1113,-40}, {461,1175,-40}, {461,1411,-180}, {461,1632,-50}, {461,1633,-50}, {461,1647,-50}, {461,1657,-50}, {461,1664,-50}, {461,2797,-50}, {461,2798,-50}, {461,2812,-50}, {461,2822,-50}, {461,2829,-50}, {461,2902,-50}, {461,2910,-50}, {461,2998,-180}, {476,605,-10}, {476,606,-10}, {476,611,-10}, {476,617,-10}, {476,626,-10}, {480,395,-20}, {480,398,-20}, {480,406,-20}, {480,416,-20}, {480,421,-20}, {480,451,-20}, {480,457,-20}, {480,572,-30}, {480,605,-40}, {480,606,-40}, {480,611,-40}, {480,617,-40}, {480,626,-40}, {480,660,-50}, {480,670,-30}, {480,688,-50}, {480,689,-50}, {480,694,-50}, {501,1411,-20}, {501,2998,-20}, {545,1411,-20}, {545,2998,-20}, {572,2,-120}, {572,7,-120}, {572,18,-120}, {572,29,-120}, {572,35,-120}, {572,45,-120}, {572,50,-120}, {572,395,-40}, {572,398,-40}, {572,406,-40}, {572,416,-40}, {572,421,-40}, {572,451,-40}, {572,457,-40}, {572,736,-120}, {572,738,-120}, {572,760,-120}, {572,777,-120}, {572,1032,-120}, {572,1113,-120}, {572,1175,-60}, {572,1404,-20}, {572,1411,-120}, {572,1632,-120}, {572,1633,-120}, {572,1647,-120}, {572,1657,-120}, {572,1664,-60}, {572,2128,-140}, {572,2797,-120}, {572,2798,-120}, {572,2812,-120}, {572,2822,-120}, {572,2829,-120}, {572,2902,-120}, {572,2910,-60}, {572,2998,-120}, {572,3151,-120}, {572,3354,-20}, {572,3819,-120}, {572,3820,-120}, {572,3827,-120}, {572,3834,-120}, {572,3842,-120}, {572,3954,-120}, {572,4034,-120}, {572,4037,-120}, {572,4053,-60}, {605,2,-40}, {605,7,-40}, {605,18,-40}, {605,29,-40}, {605,35,-40}, {605,45,-40}, {605,50,-40}, {605,1411,-40}, {605,2998,-40}, {606,2,-40}, {606,7,-40}, {606,18,-40}, {606,29,-40}, {606,35,-40}, {606,45,-40}, {606,50,-40}, {606,1411,-40}, {606,2998,-40}, {611,2,-40}, {611,7,-40}, {611,18,-40}, {611,29,-40}, {611,35,-40}, {611,45,-40}, {611,50,-40}, {611,1411,-40}, {611,2998,-40}, {617,2,-40}, {617,7,-40}, {617,18,-40}, {617,29,-40}, {617,35,-40}, {617,45,-40}, {617,50,-40}, {617,1411,-40}, {617,2998,-40}, {626,2,-40}, {626,7,-40}, {626,18,-40}, {626,29,-40}, {626,35,-40}, {626,45,-40}, {626,50,-40}, {626,1411,-40}, {626,2998,-40}, {660,2,-80}, {660,7,-80}, {660,18,-80}, {660,29,-80}, {660,35,-80}, {660,45,-80}, {660,50,-80}, {660,205,-40}, {660,395,-40}, {660,398,-40}, {660,406,-40}, {660,416,-40}, {660,421,-40}, {660,451,-40}, {660,457,-40}, {660,736,-70}, {660,738,-70}, {660,760,-70}, {660,777,-70}, {660,1032,-70}, {660,1113,-70}, {660,1175,-70}, {660,1404,-40}, {660,1411,-125}, {660,1632,-80}, {660,1633,-80}, {660,1647,-80}, {660,1657,-80}, {660,1664,-80}, {660,2128,-80}, {660,2797,-80}, {660,2798,-80}, {660,2812,-80}, {660,2822,-80}, {660,2829,-80}, {660,2902,-80}, {660,2910,-80}, {660,2998,-125}, {660,3354,-40}, {660,3819,-70}, {660,3820,-70}, {660,3827,-70}, {660,3834,-70}, {660,3842,-70}, {670,2,-50}, {670,7,-50}, {670,18,-50}, {670,29,-50}, {670,35,-50}, {670,45,-50}, {670,50,-50}, {670,395,-20}, {670,398,-20}, {670,406,-20}, {670,416,-20}, {670,421,-20}, {670,451,-20}, {670,457,-20}, {670,736,-40}, {670,738,-40}, {670,760,-40}, {670,777,-40}, {670,1032,-40}, {670,1113,-40}, {670,1175,-40}, {670,1411,-80}, {670,1632,-30}, {670,1633,-30}, {670,1647,-30}, {670,1657,-30}, {670,1664,-30}, {670,2128,-40}, {670,2797,-30}, {670,2798,-30}, {670,2812,-30}, {670,2822,-30}, {670,2829,-30}, {670,2902,-30}, {670,2910,-30}, {670,2998,-80}, {670,3819,-30}, {670,3820,-30}, {670,3827,-30}, {670,3834,-30}, {670,3842,-30}, {670,4034,-20}, {670,4037,-20}, {670,4053,-20}, {688,2,-110}, {688,7,-110}, {688,18,-110}, {688,29,-110}, {688,35,-110}, {688,45,-110}, {688,50,-110}, {688,395,-85}, {688,398,-85}, {688,406,-85}, {688,416,-85}, {688,421,-85}, {688,451,-85}, {688,457,-85}, {688,736,-140}, {688,738,-140}, {688,760,-140}, {688,777,-140}, {688,1032,-140}, {688,1113,-140}, {688,1175,-140}, {688,1404,-60}, {688,1411,-140}, {688,1632,-140}, {688,1633,-140}, {688,1647,-140}, {688,1657,-140}, {688,1664,-140}, {688,2128,-140}, {688,2134,-20}, {688,2135,-20}, {688,2797,-140}, {688,2798,-140}, {688,2812,-140}, {688,2822,-140}, {688,2829,-140}, {688,2902,-140}, {688,2910,-140}, {688,2998,-140}, {688,3354,-60}, {688,3819,-110}, {688,3820,-110}, {688,3827,-110}, {688,3834,-110}, {688,3842,-110}, {689,2,-110}, {689,7,-110}, {689,18,-110}, {689,29,-110}, {689,35,-110}, {689,45,-110}, {689,50,-110}, {689,395,-85}, {689,398,-85}, {689,406,-85}, {689,416,-85}, {689,421,-85}, {689,451,-85}, {689,457,-85}, {689,736,-140}, {689,738,-140}, {689,760,-140}, {689,777,-140}, {689,1032,-140}, {689,1113,-140}, {689,1175,-70}, {689,1404,-60}, {689,1411,-140}, {689,1632,-140}, {689,1633,-140}, {689,1647,-140}, {689,1657,-140}, {689,1664,-140}, {689,2128,-140}, {689,2134,-20}, {689,2135,-20}, {689,2797,-140}, {689,2798,-140}, {689,2812,-140}, {689,2822,-140}, {689,2829,-140}, {689,2902,-140}, {689,2910,-140}, {689,2998,-140}, {689,3354,-60}, {689,3819,-110}, {689,3820,-110}, {689,3827,-110}, {689,3834,-110}, {689,3842,-110}, {694,2,-110}, {694,7,-110}, {694,18,-110}, {694,29,-110}, {694,35,-110}, {694,45,-110}, {694,50,-110}, {694,395,-85}, {694,398,-85}, {694,406,-85}, {694,416,-85}, {694,421,-85}, {694,451,-85}, {694,457,-85}, {694,736,-140}, {694,738,-140}, {694,760,-140}, {694,777,-140}, {694,1032,-140}, {694,1113,-140}, {694,1175,-70}, {694,1404,-60}, {694,1411,-140}, {694,1632,-140}, {694,1633,-140}, {694,1647,-140}, {694,1657,-140}, {694,1664,-140}, {694,2128,-140}, {694,2134,-20}, {694,2135,-20}, {694,2797,-140}, {694,2798,-140}, {694,2812,-140}, {694,2822,-140}, {694,2829,-140}, {694,2902,-140}, {694,2910,-140}, {694,2998,-140}, {694,3354,-60}, {694,3819,-110}, {694,3820,-110}, {694,3827,-110}, {694,3834,-110}, {694,3842,-110}, {736,3905,-20}, {736,3954,-20}, {736,4034,-30}, {736,4037,-30}, {736,4053,-30}, {738,3905,-20}, {738,3954,-20}, {738,4034,-30}, {738,4037,-30}, {738,4053,-30}, {760,3905,-20}, {760,3954,-20}, {760,4034,-30}, {760,4037,-30}, {760,4053,-30}, {777,3905,-20}, {777,3954,-20}, {777,4034,-30}, {777,4037,-30}, {777,4053,-30}, {1032,3905,-20}, {1032,3954,-20}, {1032,4034,-30}, {1032,4037,-30}, {1032,4053,-30}, {1113,3905,-20}, {1113,3954,-20}, {1113,4034,-30}, {1113,4037,-30}, {1113,4053,-30}, {1175,3905,-20}, {1175,3954,-20}, {1175,4034,-30}, {1175,4037,-30}, {1175,4053,-30}, {1194,1194,-10}, {1194,1411,-40}, {1194,2418,-20}, {1194,2503,-20}, {1194,2998,-40}, {1194,3819,-20}, {1194,3820,-20}, {1194,3827,-20}, {1194,3834,-20}, {1194,3842,-20}, {1194,3905,-20}, {1194,4034,-20}, {1194,4037,-20}, {1194,4053,-20}, {1314,1411,-15}, {1314,2304,-20}, {1334,1411,-15}, {1334,2304,-20}, {1404,3501,-50}, {1411,3142,-100}, {1411,3146,-100}, {1632,1411,-15}, {1632,2998,-15}, {1632,3905,-30}, {1632,3954,-20}, {1632,4023,-30}, {1632,4034,-20}, {1632,4037,-20}, {1632,4053,-20}, {1633,1411,-15}, {1633,2998,-15}, {1633,3905,-30}, {1633,3954,-20}, {1633,4023,-30}, {1633,4034,-20}, {1633,4037,-20}, {1633,4053,-20}, {1647,1411,-15}, {1647,2998,-15}, {1647,3905,-30}, {1647,3954,-20}, {1647,4023,-30}, {1647,4034,-20}, {1647,4037,-20}, {1647,4053,-20}, {1657,1411,-15}, {1657,2998,-15}, {1657,3905,-30}, {1657,3954,-20}, {1657,4023,-30}, {1657,4034,-20}, {1657,4037,-20}, {1657,4053,-20}, {1664,1411,-15}, {1664,2998,-15}, {1664,3905,-30}, {1664,3954,-20}, {1664,4023,-30}, {1664,4034,-20}, {1664,4037,-20}, {1664,4053,-20}, {1789,736,-30}, {1789,738,-30}, {1789,760,-30}, {1789,777,-30}, {1789,1032,-30}, {1789,1113,-30}, {1789,1175,-30}, {1789,1411,-30}, {1789,1610,-28}, {1789,1632,-30}, {1789,1633,-30}, {1789,1647,-30}, {1789,1657,-30}, {1789,1664,-30}, {1789,2797,-30}, {1789,2798,-30}, {1789,2812,-30}, {1789,2822,-30}, {1789,2829,-30}, {1789,2902,-30}, {1789,2910,-30}, {1789,2998,-30}, {1789,3142,60}, {1789,3146,50}, {1888,3151,-10}, {1990,4034,-30}, {1990,4037,-30}, {1990,4053,-30}, {2304,1632,-20}, {2304,1633,-20}, {2304,1647,-20}, {2304,1657,-20}, {2304,1664,-20}, {2304,2797,-20}, {2304,2798,-20}, {2304,2812,-20}, {2304,2822,-20}, {2304,2829,-20}, {2304,2902,-20}, {2304,2910,-20}, {2513,3819,-10}, {2513,3820,-10}, {2513,3827,-10}, {2513,3834,-10}, {2513,3842,-10}, {2513,4034,-15}, {2513,4037,-15}, {2513,4053,-15}, {2650,3819,-10}, {2650,3820,-10}, {2650,3827,-10}, {2650,3834,-10}, {2650,3842,-10}, {2650,3905,-20}, {2650,4034,-15}, {2650,4037,-15}, {2650,4053,-15}, {2772,3819,-10}, {2772,3820,-10}, {2772,3827,-10}, {2772,3834,-10}, {2772,3842,-10}, {2772,3905,-20}, {2772,4034,-15}, {2772,4037,-15}, {2772,4053,-15}, {2797,1411,-40}, {2797,2998,-40}, {2797,3905,-15}, {2797,3954,-15}, {2797,4023,-30}, {2797,4034,-30}, {2797,4037,-30}, {2797,4053,-30}, {2798,1411,-40}, {2798,2998,-40}, {2798,3905,-15}, {2798,3954,-15}, {2798,4023,-30}, {2798,4034,-30}, {2798,4037,-30}, {2798,4053,-30}, {2812,1411,-40}, {2812,2998,-40}, {2812,3905,-15}, {2812,3954,-15}, {2812,4023,-30}, {2812,4034,-30}, {2812,4037,-30}, {2812,4053,-30}, {2822,1411,-40}, {2822,2998,-40}, {2822,3905,-15}, {2822,3954,-15}, {2822,4023,-30}, {2822,4034,-30}, {2822,4037,-30}, {2822,4053,-30}, {2829,1411,-40}, {2829,2998,-40}, {2829,3905,-15}, {2829,3954,-15}, {2829,4023,-30}, {2829,4034,-30}, {2829,4037,-30}, {2829,4053,-30}, {2902,736,-55}, {2902,738,-55}, {2902,760,-55}, {2902,777,-55}, {2902,1032,-55}, {2902,1113,-55}, {2902,1175,-55}, {2902,1194,-55}, {2902,1314,-55}, {2902,1334,-55}, {2902,1411,-95}, {2902,1483,-55}, {2902,1632,-55}, {2902,1633,-55}, {2902,1647,-55}, {2902,1657,-55}, {2902,1664,-55}, {2902,1789,-55}, {2902,1888,-55}, {2902,1990,-55}, {2902,2134,-55}, {2902,2135,-55}, {2902,2142,-55}, {2902,2198,-55}, {2902,2209,-55}, {2902,2276,-55}, {2902,2304,-55}, {2902,2418,-55}, {2902,2503,-55}, {2902,2513,-55}, {2902,2650,-55}, {2902,2772,-55}, {2902,2797,-55}, {2902,2798,-55}, {2902,2812,-55}, {2902,2822,-55}, {2902,2829,-55}, {2902,2902,-55}, {2902,2910,-55}, {2902,2924,-55}, {2902,2998,-95}, {2902,3086,-55}, {2902,3151,-55}, {2902,3282,-55}, {2902,3320,-55}, {2902,3559,-55}, {2902,3819,-55}, {2902,3820,-55}, {2902,3827,-55}, {2902,3834,-55}, {2902,3842,-55}, {2902,3905,-70}, {2902,3954,-70}, {2902,4023,-85}, {2902,4034,-70}, {2902,4037,-70}, {2902,4053,-70}, {2902,4135,-55}, {2902,4156,-55}, {2910,1411,-40}, {2910,2998,-40}, {2910,3905,-15}, {2910,3954,-15}, {2910,4023,-30}, {2910,4034,-30}, {2910,4037,-30}, {2910,4053,-30}, {2924,1411,-35}, {2924,2998,-35}, {2924,4034,-30}, {2924,4037,-30}, {2924,4053,-30}, {2998,3142,-100}, {2998,3146,-100}, {2998,3501,-60}, {3142,3501,-40}, {3143,3143,-57}, {3146,1483,-50}, {3146,3146,-57}, {3146,3151,-50}, {3146,3282,-50}, {3146,3320,-50}, {3146,3501,-70}, {3151,736,-10}, {3151,738,-10}, {3151,760,-10}, {3151,777,-10}, {3151,1032,-10}, {3151,1113,-10}, {3151,1175,-10}, {3151,1404,30}, {3151,1411,-50}, {3151,2134,15}, {3151,2135,15}, {3151,2142,15}, {3151,2198,15}, {3151,2209,15}, {3151,2304,15}, {3151,2418,15}, {3151,2503,15}, {3151,2513,25}, {3151,2650,25}, {3151,2772,25}, {3151,2924,30}, {3151,2998,-50}, {3151,3354,30}, {3151,3559,40}, {3151,3819,15}, {3151,3820,15}, {3151,3827,15}, {3151,3834,15}, {3151,3842,15}, {3151,3905,30}, {3151,4034,30}, {3151,4037,30}, {3151,4053,30}, {3282,1411,-15}, {3282,2998,-15}, {3282,3954,-30}, {3320,1411,-15}, {3320,2998,-15}, {3320,3954,-30}, {3354,3501,-50}, {3501,572,-50}, {3501,660,-50}, {3501,670,-40}, {3501,688,-90}, {3501,689,-90}, {3501,694,-90}, {3501,3138,-30}, {3501,3143,-60}, {3905,736,-25}, {3905,738,-25}, {3905,760,-25}, {3905,777,-25}, {3905,1032,-25}, {3905,1113,-25}, {3905,1175,-25}, {3905,1411,-80}, {3905,1632,-25}, {3905,1633,-25}, {3905,1647,-25}, {3905,1657,-25}, {3905,1664,-25}, {3905,2797,-25}, {3905,2798,-25}, {3905,2812,-25}, {3905,2822,-25}, {3905,2829,-25}, {3905,2902,-25}, {3905,2910,-25}, {3905,2998,-80}, {3954,736,-15}, {3954,738,-15}, {3954,760,-15}, {3954,777,-15}, {3954,1032,-15}, {3954,1113,-15}, {3954,1175,-15}, {3954,1411,-60}, {3954,1632,-10}, {3954,1633,-10}, {3954,1647,-10}, {3954,1657,-10}, {3954,1664,-10}, {3954,2797,-10}, {3954,2798,-10}, {3954,2812,-10}, {3954,2822,-10}, {3954,2829,-10}, {3954,2902,-10}, {3954,2910,-10}, {3954,2998,-60}, {4023,1632,-30}, {4023,1633,-30}, {4023,1647,-30}, {4023,1657,-30}, {4023,1664,-30}, {4034,736,-20}, {4034,738,-20}, {4034,760,-20}, {4034,777,-20}, {4034,1032,-20}, {4034,1113,-20}, {4034,1175,-20}, {4034,1411,-100}, {4034,1632,-20}, {4034,1633,-20}, {4034,1647,-20}, {4034,1657,-20}, {4034,1664,-20}, {4034,2797,-20}, {4034,2798,-20}, {4034,2812,-20}, {4034,2822,-20}, {4034,2829,-20}, {4034,2902,-20}, {4034,2910,-20}, {4034,2998,-100}, {4037,736,-20}, {4037,738,-20}, {4037,760,-20}, {4037,777,-20}, {4037,1032,-20}, {4037,1113,-20}, {4037,1175,-20}, {4037,1411,-100}, {4037,1632,-20}, {4037,1633,-20}, {4037,1647,-20}, {4037,1657,-20}, {4037,1664,-20}, {4037,2797,-20}, {4037,2798,-20}, {4037,2812,-20}, {4037,2822,-20}, {4037,2829,-20}, {4037,2902,-20}, {4037,2910,-20}, {4037,2998,-100}, {4053,736,-20}, {4053,738,-20}, {4053,760,-20}, {4053,777,-20}, {4053,1032,-20}, {4053,1113,-20}, {4053,1175,-20}, {4053,1411,-100}, {4053,1632,-20}, {4053,1633,-20}, {4053,1647,-20}, {4053,1657,-20}, {4053,1664,-20}, {4053,2797,-20}, {4053,2798,-20}, {4053,2812,-20}, {4053,2822,-20}, {4053,2829,-20}, {4053,2902,-20}, {4053,2910,-20}, {4053,2998,-100}, {4135,1632,-15}, {4135,1633,-15}, {4135,1647,-15}, {4135,1657,-15}, {4135,1664,-15}, {4135,2797,-15}, {4135,2798,-15}, {4135,2812,-15}, {4135,2822,-15}, {4135,2829,-15}, {4135,2902,-15}, {4135,2910,-15}, {4156,1632,-15}, {4156,1633,-15}, {4156,1647,-15}, {4156,1657,-15}, {4156,1664,-15}, {4156,2797,-15}, {4156,2798,-15}, {4156,2812,-15}, {4156,2822,-15}, {4156,2829,-15}, {4156,2902,-15}, {4156,2910,-15}, {NOGLYPH,NOGLYPH,0} }; static const ligature helvetica_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair helvetica_oblique_kerns[] = { {2,66,-30}, {2,72,-30}, {2,205,-30}, {2,395,-30}, {2,398,-30}, {2,406,-30}, {2,416,-30}, {2,421,-30}, {2,451,-30}, {2,457,-30}, {2,476,-30}, {2,572,-120}, {2,605,-50}, {2,606,-50}, {2,611,-50}, {2,617,-50}, {2,626,-50}, {2,660,-70}, {2,670,-50}, {2,688,-100}, {2,689,-100}, {2,694,-100}, {2,3819,-30}, {2,3820,-30}, {2,3827,-30}, {2,3834,-30}, {2,3842,-30}, {2,3905,-40}, {2,3954,-40}, {2,4034,-40}, {2,4037,-40}, {2,4053,-40}, {7,66,-30}, {7,72,-30}, {7,205,-30}, {7,395,-30}, {7,398,-30}, {7,406,-30}, {7,416,-30}, {7,421,-30}, {7,451,-30}, {7,457,-30}, {7,476,-30}, {7,572,-120}, {7,605,-50}, {7,606,-50}, {7,611,-50}, {7,617,-50}, {7,626,-50}, {7,660,-70}, {7,670,-50}, {7,688,-100}, {7,689,-100}, {7,694,-100}, {7,3819,-30}, {7,3820,-30}, {7,3827,-30}, {7,3834,-30}, {7,3842,-30}, {7,3905,-40}, {7,3954,-40}, {7,4034,-40}, {7,4037,-40}, {7,4053,-40}, {18,66,-30}, {18,72,-30}, {18,205,-30}, {18,395,-30}, {18,398,-30}, {18,406,-30}, {18,416,-30}, {18,421,-30}, {18,451,-30}, {18,457,-30}, {18,476,-30}, {18,572,-120}, {18,605,-50}, {18,606,-50}, {18,611,-50}, {18,617,-50}, {18,626,-50}, {18,660,-70}, {18,670,-50}, {18,688,-100}, {18,689,-100}, {18,694,-100}, {18,3819,-30}, {18,3820,-30}, {18,3827,-30}, {18,3834,-30}, {18,3842,-30}, {18,3905,-40}, {18,3954,-40}, {18,4034,-40}, {18,4037,-40}, {18,4053,-40}, {29,66,-30}, {29,72,-30}, {29,205,-30}, {29,395,-30}, {29,398,-30}, {29,406,-30}, {29,416,-30}, {29,421,-30}, {29,451,-30}, {29,457,-30}, {29,476,-30}, {29,572,-120}, {29,605,-50}, {29,606,-50}, {29,611,-50}, {29,617,-50}, {29,626,-50}, {29,660,-70}, {29,670,-50}, {29,688,-100}, {29,689,-100}, {29,694,-100}, {29,3819,-30}, {29,3820,-30}, {29,3827,-30}, {29,3834,-30}, {29,3842,-30}, {29,3905,-40}, {29,3954,-40}, {29,4034,-40}, {29,4037,-40}, {29,4053,-40}, {35,66,-30}, {35,72,-30}, {35,205,-30}, {35,395,-30}, {35,398,-30}, {35,406,-30}, {35,416,-30}, {35,421,-30}, {35,451,-30}, {35,457,-30}, {35,476,-30}, {35,572,-120}, {35,605,-50}, {35,606,-50}, {35,611,-50}, {35,617,-50}, {35,626,-50}, {35,660,-70}, {35,670,-50}, {35,688,-100}, {35,689,-100}, {35,694,-100}, {35,3819,-30}, {35,3820,-30}, {35,3827,-30}, {35,3834,-30}, {35,3842,-30}, {35,3905,-40}, {35,3954,-40}, {35,4034,-40}, {35,4037,-40}, {35,4053,-40}, {45,66,-30}, {45,72,-30}, {45,205,-30}, {45,395,-30}, {45,398,-30}, {45,406,-30}, {45,416,-30}, {45,421,-30}, {45,451,-30}, {45,457,-30}, {45,476,-30}, {45,572,-120}, {45,605,-50}, {45,606,-50}, {45,611,-50}, {45,617,-50}, {45,626,-50}, {45,660,-70}, {45,670,-50}, {45,688,-100}, {45,689,-100}, {45,694,-100}, {45,3819,-30}, {45,3820,-30}, {45,3827,-30}, {45,3834,-30}, {45,3842,-30}, {45,3905,-40}, {45,3954,-40}, {45,4034,-40}, {45,4037,-40}, {45,4053,-40}, {50,66,-30}, {50,72,-30}, {50,205,-30}, {50,395,-30}, {50,398,-30}, {50,406,-30}, {50,416,-30}, {50,421,-30}, {50,451,-30}, {50,457,-30}, {50,476,-30}, {50,572,-120}, {50,605,-50}, {50,606,-50}, {50,611,-50}, {50,617,-50}, {50,626,-50}, {50,660,-70}, {50,670,-50}, {50,688,-100}, {50,689,-100}, {50,694,-100}, {50,3819,-30}, {50,3820,-30}, {50,3827,-30}, {50,3834,-30}, {50,3842,-30}, {50,3905,-40}, {50,3954,-40}, {50,4034,-40}, {50,4037,-40}, {50,4053,-40}, {53,605,-10}, {53,606,-10}, {53,611,-10}, {53,617,-10}, {53,626,-10}, {53,1411,-20}, {53,2998,-20}, {66,1411,-30}, {66,2998,-30}, {72,1411,-30}, {72,2998,-30}, {95,2,-40}, {95,7,-40}, {95,18,-40}, {95,29,-40}, {95,35,-40}, {95,45,-40}, {95,50,-40}, {95,660,-70}, {95,670,-40}, {95,688,-90}, {95,689,-90}, {95,694,-90}, {95,1411,-70}, {95,2998,-70}, {194,2,-80}, {194,7,-80}, {194,18,-80}, {194,29,-80}, {194,35,-80}, {194,45,-80}, {194,50,-80}, {194,736,-50}, {194,738,-50}, {194,760,-50}, {194,777,-50}, {194,1032,-50}, {194,1113,-50}, {194,1175,-50}, {194,1411,-150}, {194,1632,-30}, {194,1633,-30}, {194,1647,-30}, {194,1657,-30}, {194,1664,-30}, {194,2797,-30}, {194,2798,-30}, {194,2812,-30}, {194,2822,-30}, {194,2829,-30}, {194,2902,-30}, {194,2910,-30}, {194,2998,-150}, {194,3151,-45}, {303,2,-20}, {303,7,-20}, {303,18,-20}, {303,29,-20}, {303,35,-20}, {303,45,-20}, {303,50,-20}, {303,736,-20}, {303,738,-20}, {303,760,-20}, {303,777,-20}, {303,1032,-20}, {303,1113,-20}, {303,1175,-20}, {303,1411,-30}, {303,2998,-30}, {303,3819,-20}, {303,3820,-20}, {303,3827,-20}, {303,3834,-20}, {303,3842,-20}, {311,395,-50}, {311,398,-50}, {311,406,-50}, {311,416,-50}, {311,421,-50}, {311,451,-50}, {311,457,-50}, {311,1632,-40}, {311,1633,-40}, {311,1647,-40}, {311,1657,-40}, {311,1664,-40}, {311,2797,-40}, {311,2798,-40}, {311,2812,-40}, {311,2822,-40}, {311,2829,-40}, {311,2902,-40}, {311,2910,-40}, {311,3819,-30}, {311,3820,-30}, {311,3827,-30}, {311,3834,-30}, {311,3842,-30}, {311,4034,-50}, {311,4037,-50}, {311,4053,-50}, {339,572,-110}, {339,660,-110}, {339,670,-70}, {339,688,-140}, {339,689,-140}, {339,694,-140}, {339,3142,-140}, {339,3146,-160}, {339,4034,-30}, {339,4037,-30}, {339,4053,-30}, {358,572,-110}, {358,660,-110}, {358,670,-70}, {358,688,-140}, {358,689,-140}, {358,694,-140}, {358,3142,-140}, {358,3146,-160}, {358,4034,-30}, {358,4037,-30}, {358,4053,-30}, {395,2,-20}, {395,7,-20}, {395,18,-20}, {395,29,-20}, {395,35,-20}, {395,45,-20}, {395,50,-20}, {395,572,-40}, {395,660,-50}, {395,670,-30}, {395,680,-60}, {395,688,-70}, {395,689,-70}, {395,694,-70}, {395,1411,-40}, {395,2998,-40}, {398,2,-20}, {398,7,-20}, {398,18,-20}, {398,29,-20}, {398,35,-20}, {398,45,-20}, {398,50,-20}, {398,572,-40}, {398,660,-50}, {398,670,-30}, {398,680,-60}, {398,688,-70}, {398,689,-70}, {398,694,-70}, {398,1411,-40}, {398,2998,-40}, {406,2,-20}, {406,7,-20}, {406,18,-20}, {406,29,-20}, {406,35,-20}, {406,45,-20}, {406,50,-20}, {406,572,-40}, {406,660,-50}, {406,670,-30}, {406,680,-60}, {406,688,-70}, {406,689,-70}, {406,694,-70}, {406,1411,-40}, {406,2998,-40}, {416,2,-20}, {416,7,-20}, {416,18,-20}, {416,29,-20}, {416,35,-20}, {416,45,-20}, {416,50,-20}, {416,572,-40}, {416,660,-50}, {416,670,-30}, {416,680,-60}, {416,688,-70}, {416,689,-70}, {416,694,-70}, {416,1411,-40}, {416,2998,-40}, {421,2,-20}, {421,7,-20}, {421,18,-20}, {421,29,-20}, {421,35,-20}, {421,45,-20}, {421,50,-20}, {421,572,-40}, {421,660,-50}, {421,670,-30}, {421,680,-60}, {421,688,-70}, {421,689,-70}, {421,694,-70}, {421,1411,-40}, {421,2998,-40}, {451,2,-20}, {451,7,-20}, {451,18,-20}, {451,29,-20}, {451,35,-20}, {451,45,-20}, {451,50,-20}, {451,572,-40}, {451,660,-50}, {451,670,-30}, {451,680,-60}, {451,688,-70}, {451,689,-70}, {451,694,-70}, {451,1411,-40}, {451,2998,-40}, {457,2,-20}, {457,7,-20}, {457,18,-20}, {457,29,-20}, {457,35,-20}, {457,45,-20}, {457,50,-20}, {457,572,-40}, {457,660,-50}, {457,670,-30}, {457,680,-60}, {457,688,-70}, {457,689,-70}, {457,694,-70}, {457,1411,-40}, {457,2998,-40}, {461,2,-120}, {461,7,-120}, {461,18,-120}, {461,29,-120}, {461,35,-120}, {461,45,-120}, {461,50,-120}, {461,736,-40}, {461,738,-40}, {461,760,-40}, {461,777,-40}, {461,1032,-40}, {461,1113,-40}, {461,1175,-40}, {461,1411,-180}, {461,1632,-50}, {461,1633,-50}, {461,1647,-50}, {461,1657,-50}, {461,1664,-50}, {461,2797,-50}, {461,2798,-50}, {461,2812,-50}, {461,2822,-50}, {461,2829,-50}, {461,2902,-50}, {461,2910,-50}, {461,2998,-180}, {476,605,-10}, {476,606,-10}, {476,611,-10}, {476,617,-10}, {476,626,-10}, {480,395,-20}, {480,398,-20}, {480,406,-20}, {480,416,-20}, {480,421,-20}, {480,451,-20}, {480,457,-20}, {480,572,-30}, {480,605,-40}, {480,606,-40}, {480,611,-40}, {480,617,-40}, {480,626,-40}, {480,660,-50}, {480,670,-30}, {480,688,-50}, {480,689,-50}, {480,694,-50}, {501,1411,-20}, {501,2998,-20}, {545,1411,-20}, {545,2998,-20}, {572,2,-120}, {572,7,-120}, {572,18,-120}, {572,29,-120}, {572,35,-120}, {572,45,-120}, {572,50,-120}, {572,395,-40}, {572,398,-40}, {572,406,-40}, {572,416,-40}, {572,421,-40}, {572,451,-40}, {572,457,-40}, {572,736,-120}, {572,738,-120}, {572,760,-120}, {572,777,-120}, {572,1032,-120}, {572,1113,-120}, {572,1175,-60}, {572,1404,-20}, {572,1411,-120}, {572,1632,-120}, {572,1633,-120}, {572,1647,-120}, {572,1657,-120}, {572,1664,-60}, {572,2128,-140}, {572,2797,-120}, {572,2798,-120}, {572,2812,-120}, {572,2822,-120}, {572,2829,-120}, {572,2902,-120}, {572,2910,-60}, {572,2998,-120}, {572,3151,-120}, {572,3354,-20}, {572,3819,-120}, {572,3820,-120}, {572,3827,-120}, {572,3834,-120}, {572,3842,-120}, {572,3954,-120}, {572,4034,-120}, {572,4037,-120}, {572,4053,-60}, {605,2,-40}, {605,7,-40}, {605,18,-40}, {605,29,-40}, {605,35,-40}, {605,45,-40}, {605,50,-40}, {605,1411,-40}, {605,2998,-40}, {606,2,-40}, {606,7,-40}, {606,18,-40}, {606,29,-40}, {606,35,-40}, {606,45,-40}, {606,50,-40}, {606,1411,-40}, {606,2998,-40}, {611,2,-40}, {611,7,-40}, {611,18,-40}, {611,29,-40}, {611,35,-40}, {611,45,-40}, {611,50,-40}, {611,1411,-40}, {611,2998,-40}, {617,2,-40}, {617,7,-40}, {617,18,-40}, {617,29,-40}, {617,35,-40}, {617,45,-40}, {617,50,-40}, {617,1411,-40}, {617,2998,-40}, {626,2,-40}, {626,7,-40}, {626,18,-40}, {626,29,-40}, {626,35,-40}, {626,45,-40}, {626,50,-40}, {626,1411,-40}, {626,2998,-40}, {660,2,-80}, {660,7,-80}, {660,18,-80}, {660,29,-80}, {660,35,-80}, {660,45,-80}, {660,50,-80}, {660,205,-40}, {660,395,-40}, {660,398,-40}, {660,406,-40}, {660,416,-40}, {660,421,-40}, {660,451,-40}, {660,457,-40}, {660,736,-70}, {660,738,-70}, {660,760,-70}, {660,777,-70}, {660,1032,-70}, {660,1113,-70}, {660,1175,-70}, {660,1404,-40}, {660,1411,-125}, {660,1632,-80}, {660,1633,-80}, {660,1647,-80}, {660,1657,-80}, {660,1664,-80}, {660,2128,-80}, {660,2797,-80}, {660,2798,-80}, {660,2812,-80}, {660,2822,-80}, {660,2829,-80}, {660,2902,-80}, {660,2910,-80}, {660,2998,-125}, {660,3354,-40}, {660,3819,-70}, {660,3820,-70}, {660,3827,-70}, {660,3834,-70}, {660,3842,-70}, {670,2,-50}, {670,7,-50}, {670,18,-50}, {670,29,-50}, {670,35,-50}, {670,45,-50}, {670,50,-50}, {670,395,-20}, {670,398,-20}, {670,406,-20}, {670,416,-20}, {670,421,-20}, {670,451,-20}, {670,457,-20}, {670,736,-40}, {670,738,-40}, {670,760,-40}, {670,777,-40}, {670,1032,-40}, {670,1113,-40}, {670,1175,-40}, {670,1411,-80}, {670,1632,-30}, {670,1633,-30}, {670,1647,-30}, {670,1657,-30}, {670,1664,-30}, {670,2128,-40}, {670,2797,-30}, {670,2798,-30}, {670,2812,-30}, {670,2822,-30}, {670,2829,-30}, {670,2902,-30}, {670,2910,-30}, {670,2998,-80}, {670,3819,-30}, {670,3820,-30}, {670,3827,-30}, {670,3834,-30}, {670,3842,-30}, {670,4034,-20}, {670,4037,-20}, {670,4053,-20}, {688,2,-110}, {688,7,-110}, {688,18,-110}, {688,29,-110}, {688,35,-110}, {688,45,-110}, {688,50,-110}, {688,395,-85}, {688,398,-85}, {688,406,-85}, {688,416,-85}, {688,421,-85}, {688,451,-85}, {688,457,-85}, {688,736,-140}, {688,738,-140}, {688,760,-140}, {688,777,-140}, {688,1032,-140}, {688,1113,-140}, {688,1175,-140}, {688,1404,-60}, {688,1411,-140}, {688,1632,-140}, {688,1633,-140}, {688,1647,-140}, {688,1657,-140}, {688,1664,-140}, {688,2128,-140}, {688,2134,-20}, {688,2135,-20}, {688,2797,-140}, {688,2798,-140}, {688,2812,-140}, {688,2822,-140}, {688,2829,-140}, {688,2902,-140}, {688,2910,-140}, {688,2998,-140}, {688,3354,-60}, {688,3819,-110}, {688,3820,-110}, {688,3827,-110}, {688,3834,-110}, {688,3842,-110}, {689,2,-110}, {689,7,-110}, {689,18,-110}, {689,29,-110}, {689,35,-110}, {689,45,-110}, {689,50,-110}, {689,395,-85}, {689,398,-85}, {689,406,-85}, {689,416,-85}, {689,421,-85}, {689,451,-85}, {689,457,-85}, {689,736,-140}, {689,738,-140}, {689,760,-140}, {689,777,-140}, {689,1032,-140}, {689,1113,-140}, {689,1175,-70}, {689,1404,-60}, {689,1411,-140}, {689,1632,-140}, {689,1633,-140}, {689,1647,-140}, {689,1657,-140}, {689,1664,-140}, {689,2128,-140}, {689,2134,-20}, {689,2135,-20}, {689,2797,-140}, {689,2798,-140}, {689,2812,-140}, {689,2822,-140}, {689,2829,-140}, {689,2902,-140}, {689,2910,-140}, {689,2998,-140}, {689,3354,-60}, {689,3819,-110}, {689,3820,-110}, {689,3827,-110}, {689,3834,-110}, {689,3842,-110}, {694,2,-110}, {694,7,-110}, {694,18,-110}, {694,29,-110}, {694,35,-110}, {694,45,-110}, {694,50,-110}, {694,395,-85}, {694,398,-85}, {694,406,-85}, {694,416,-85}, {694,421,-85}, {694,451,-85}, {694,457,-85}, {694,736,-140}, {694,738,-140}, {694,760,-140}, {694,777,-140}, {694,1032,-140}, {694,1113,-140}, {694,1175,-70}, {694,1404,-60}, {694,1411,-140}, {694,1632,-140}, {694,1633,-140}, {694,1647,-140}, {694,1657,-140}, {694,1664,-140}, {694,2128,-140}, {694,2134,-20}, {694,2135,-20}, {694,2797,-140}, {694,2798,-140}, {694,2812,-140}, {694,2822,-140}, {694,2829,-140}, {694,2902,-140}, {694,2910,-140}, {694,2998,-140}, {694,3354,-60}, {694,3819,-110}, {694,3820,-110}, {694,3827,-110}, {694,3834,-110}, {694,3842,-110}, {736,3905,-20}, {736,3954,-20}, {736,4034,-30}, {736,4037,-30}, {736,4053,-30}, {738,3905,-20}, {738,3954,-20}, {738,4034,-30}, {738,4037,-30}, {738,4053,-30}, {760,3905,-20}, {760,3954,-20}, {760,4034,-30}, {760,4037,-30}, {760,4053,-30}, {777,3905,-20}, {777,3954,-20}, {777,4034,-30}, {777,4037,-30}, {777,4053,-30}, {1032,3905,-20}, {1032,3954,-20}, {1032,4034,-30}, {1032,4037,-30}, {1032,4053,-30}, {1113,3905,-20}, {1113,3954,-20}, {1113,4034,-30}, {1113,4037,-30}, {1113,4053,-30}, {1175,3905,-20}, {1175,3954,-20}, {1175,4034,-30}, {1175,4037,-30}, {1175,4053,-30}, {1194,1194,-10}, {1194,1411,-40}, {1194,2418,-20}, {1194,2503,-20}, {1194,2998,-40}, {1194,3819,-20}, {1194,3820,-20}, {1194,3827,-20}, {1194,3834,-20}, {1194,3842,-20}, {1194,3905,-20}, {1194,4034,-20}, {1194,4037,-20}, {1194,4053,-20}, {1314,1411,-15}, {1314,2304,-20}, {1334,1411,-15}, {1334,2304,-20}, {1404,3501,-50}, {1411,3142,-100}, {1411,3146,-100}, {1632,1411,-15}, {1632,2998,-15}, {1632,3905,-30}, {1632,3954,-20}, {1632,4023,-30}, {1632,4034,-20}, {1632,4037,-20}, {1632,4053,-20}, {1633,1411,-15}, {1633,2998,-15}, {1633,3905,-30}, {1633,3954,-20}, {1633,4023,-30}, {1633,4034,-20}, {1633,4037,-20}, {1633,4053,-20}, {1647,1411,-15}, {1647,2998,-15}, {1647,3905,-30}, {1647,3954,-20}, {1647,4023,-30}, {1647,4034,-20}, {1647,4037,-20}, {1647,4053,-20}, {1657,1411,-15}, {1657,2998,-15}, {1657,3905,-30}, {1657,3954,-20}, {1657,4023,-30}, {1657,4034,-20}, {1657,4037,-20}, {1657,4053,-20}, {1664,1411,-15}, {1664,2998,-15}, {1664,3905,-30}, {1664,3954,-20}, {1664,4023,-30}, {1664,4034,-20}, {1664,4037,-20}, {1664,4053,-20}, {1789,736,-30}, {1789,738,-30}, {1789,760,-30}, {1789,777,-30}, {1789,1032,-30}, {1789,1113,-30}, {1789,1175,-30}, {1789,1411,-30}, {1789,1610,-28}, {1789,1632,-30}, {1789,1633,-30}, {1789,1647,-30}, {1789,1657,-30}, {1789,1664,-30}, {1789,2797,-30}, {1789,2798,-30}, {1789,2812,-30}, {1789,2822,-30}, {1789,2829,-30}, {1789,2902,-30}, {1789,2910,-30}, {1789,2998,-30}, {1789,3142,60}, {1789,3146,50}, {1888,3151,-10}, {1990,4034,-30}, {1990,4037,-30}, {1990,4053,-30}, {2304,1632,-20}, {2304,1633,-20}, {2304,1647,-20}, {2304,1657,-20}, {2304,1664,-20}, {2304,2797,-20}, {2304,2798,-20}, {2304,2812,-20}, {2304,2822,-20}, {2304,2829,-20}, {2304,2902,-20}, {2304,2910,-20}, {2513,3819,-10}, {2513,3820,-10}, {2513,3827,-10}, {2513,3834,-10}, {2513,3842,-10}, {2513,4034,-15}, {2513,4037,-15}, {2513,4053,-15}, {2650,3819,-10}, {2650,3820,-10}, {2650,3827,-10}, {2650,3834,-10}, {2650,3842,-10}, {2650,3905,-20}, {2650,4034,-15}, {2650,4037,-15}, {2650,4053,-15}, {2772,3819,-10}, {2772,3820,-10}, {2772,3827,-10}, {2772,3834,-10}, {2772,3842,-10}, {2772,3905,-20}, {2772,4034,-15}, {2772,4037,-15}, {2772,4053,-15}, {2797,1411,-40}, {2797,2998,-40}, {2797,3905,-15}, {2797,3954,-15}, {2797,4023,-30}, {2797,4034,-30}, {2797,4037,-30}, {2797,4053,-30}, {2798,1411,-40}, {2798,2998,-40}, {2798,3905,-15}, {2798,3954,-15}, {2798,4023,-30}, {2798,4034,-30}, {2798,4037,-30}, {2798,4053,-30}, {2812,1411,-40}, {2812,2998,-40}, {2812,3905,-15}, {2812,3954,-15}, {2812,4023,-30}, {2812,4034,-30}, {2812,4037,-30}, {2812,4053,-30}, {2822,1411,-40}, {2822,2998,-40}, {2822,3905,-15}, {2822,3954,-15}, {2822,4023,-30}, {2822,4034,-30}, {2822,4037,-30}, {2822,4053,-30}, {2829,1411,-40}, {2829,2998,-40}, {2829,3905,-15}, {2829,3954,-15}, {2829,4023,-30}, {2829,4034,-30}, {2829,4037,-30}, {2829,4053,-30}, {2902,736,-55}, {2902,738,-55}, {2902,760,-55}, {2902,777,-55}, {2902,1032,-55}, {2902,1113,-55}, {2902,1175,-55}, {2902,1194,-55}, {2902,1314,-55}, {2902,1334,-55}, {2902,1411,-95}, {2902,1483,-55}, {2902,1632,-55}, {2902,1633,-55}, {2902,1647,-55}, {2902,1657,-55}, {2902,1664,-55}, {2902,1789,-55}, {2902,1888,-55}, {2902,1990,-55}, {2902,2134,-55}, {2902,2135,-55}, {2902,2142,-55}, {2902,2198,-55}, {2902,2209,-55}, {2902,2276,-55}, {2902,2304,-55}, {2902,2418,-55}, {2902,2503,-55}, {2902,2513,-55}, {2902,2650,-55}, {2902,2772,-55}, {2902,2797,-55}, {2902,2798,-55}, {2902,2812,-55}, {2902,2822,-55}, {2902,2829,-55}, {2902,2902,-55}, {2902,2910,-55}, {2902,2924,-55}, {2902,2998,-95}, {2902,3086,-55}, {2902,3151,-55}, {2902,3282,-55}, {2902,3320,-55}, {2902,3559,-55}, {2902,3819,-55}, {2902,3820,-55}, {2902,3827,-55}, {2902,3834,-55}, {2902,3842,-55}, {2902,3905,-70}, {2902,3954,-70}, {2902,4023,-85}, {2902,4034,-70}, {2902,4037,-70}, {2902,4053,-70}, {2902,4135,-55}, {2902,4156,-55}, {2910,1411,-40}, {2910,2998,-40}, {2910,3905,-15}, {2910,3954,-15}, {2910,4023,-30}, {2910,4034,-30}, {2910,4037,-30}, {2910,4053,-30}, {2924,1411,-35}, {2924,2998,-35}, {2924,4034,-30}, {2924,4037,-30}, {2924,4053,-30}, {2998,3142,-100}, {2998,3146,-100}, {2998,3501,-60}, {3142,3501,-40}, {3143,3143,-57}, {3146,1483,-50}, {3146,3146,-57}, {3146,3151,-50}, {3146,3282,-50}, {3146,3320,-50}, {3146,3501,-70}, {3151,736,-10}, {3151,738,-10}, {3151,760,-10}, {3151,777,-10}, {3151,1032,-10}, {3151,1113,-10}, {3151,1175,-10}, {3151,1404,30}, {3151,1411,-50}, {3151,2134,15}, {3151,2135,15}, {3151,2142,15}, {3151,2198,15}, {3151,2209,15}, {3151,2304,15}, {3151,2418,15}, {3151,2503,15}, {3151,2513,25}, {3151,2650,25}, {3151,2772,25}, {3151,2924,30}, {3151,2998,-50}, {3151,3354,30}, {3151,3559,40}, {3151,3819,15}, {3151,3820,15}, {3151,3827,15}, {3151,3834,15}, {3151,3842,15}, {3151,3905,30}, {3151,4034,30}, {3151,4037,30}, {3151,4053,30}, {3282,1411,-15}, {3282,2998,-15}, {3282,3954,-30}, {3320,1411,-15}, {3320,2998,-15}, {3320,3954,-30}, {3354,3501,-50}, {3501,572,-50}, {3501,660,-50}, {3501,670,-40}, {3501,688,-90}, {3501,689,-90}, {3501,694,-90}, {3501,3138,-30}, {3501,3143,-60}, {3905,736,-25}, {3905,738,-25}, {3905,760,-25}, {3905,777,-25}, {3905,1032,-25}, {3905,1113,-25}, {3905,1175,-25}, {3905,1411,-80}, {3905,1632,-25}, {3905,1633,-25}, {3905,1647,-25}, {3905,1657,-25}, {3905,1664,-25}, {3905,2797,-25}, {3905,2798,-25}, {3905,2812,-25}, {3905,2822,-25}, {3905,2829,-25}, {3905,2902,-25}, {3905,2910,-25}, {3905,2998,-80}, {3954,736,-15}, {3954,738,-15}, {3954,760,-15}, {3954,777,-15}, {3954,1032,-15}, {3954,1113,-15}, {3954,1175,-15}, {3954,1411,-60}, {3954,1632,-10}, {3954,1633,-10}, {3954,1647,-10}, {3954,1657,-10}, {3954,1664,-10}, {3954,2797,-10}, {3954,2798,-10}, {3954,2812,-10}, {3954,2822,-10}, {3954,2829,-10}, {3954,2902,-10}, {3954,2910,-10}, {3954,2998,-60}, {4023,1632,-30}, {4023,1633,-30}, {4023,1647,-30}, {4023,1657,-30}, {4023,1664,-30}, {4034,736,-20}, {4034,738,-20}, {4034,760,-20}, {4034,777,-20}, {4034,1032,-20}, {4034,1113,-20}, {4034,1175,-20}, {4034,1411,-100}, {4034,1632,-20}, {4034,1633,-20}, {4034,1647,-20}, {4034,1657,-20}, {4034,1664,-20}, {4034,2797,-20}, {4034,2798,-20}, {4034,2812,-20}, {4034,2822,-20}, {4034,2829,-20}, {4034,2902,-20}, {4034,2910,-20}, {4034,2998,-100}, {4037,736,-20}, {4037,738,-20}, {4037,760,-20}, {4037,777,-20}, {4037,1032,-20}, {4037,1113,-20}, {4037,1175,-20}, {4037,1411,-100}, {4037,1632,-20}, {4037,1633,-20}, {4037,1647,-20}, {4037,1657,-20}, {4037,1664,-20}, {4037,2797,-20}, {4037,2798,-20}, {4037,2812,-20}, {4037,2822,-20}, {4037,2829,-20}, {4037,2902,-20}, {4037,2910,-20}, {4037,2998,-100}, {4053,736,-20}, {4053,738,-20}, {4053,760,-20}, {4053,777,-20}, {4053,1032,-20}, {4053,1113,-20}, {4053,1175,-20}, {4053,1411,-100}, {4053,1632,-20}, {4053,1633,-20}, {4053,1647,-20}, {4053,1657,-20}, {4053,1664,-20}, {4053,2797,-20}, {4053,2798,-20}, {4053,2812,-20}, {4053,2822,-20}, {4053,2829,-20}, {4053,2902,-20}, {4053,2910,-20}, {4053,2998,-100}, {4135,1632,-15}, {4135,1633,-15}, {4135,1647,-15}, {4135,1657,-15}, {4135,1664,-15}, {4135,2797,-15}, {4135,2798,-15}, {4135,2812,-15}, {4135,2822,-15}, {4135,2829,-15}, {4135,2902,-15}, {4135,2910,-15}, {4156,1632,-15}, {4156,1633,-15}, {4156,1647,-15}, {4156,1657,-15}, {4156,1664,-15}, {4156,2797,-15}, {4156,2798,-15}, {4156,2812,-15}, {4156,2822,-15}, {4156,2829,-15}, {4156,2902,-15}, {4156,2910,-15}, {NOGLYPH,NOGLYPH,0} }; static const ligature helvetica_oblique_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair helvetica_bold_kerns[] = { {2,66,-40}, {2,72,-40}, {2,205,-50}, {2,395,-40}, {2,398,-40}, {2,406,-40}, {2,416,-40}, {2,421,-40}, {2,451,-40}, {2,457,-40}, {2,476,-40}, {2,572,-90}, {2,605,-50}, {2,606,-50}, {2,611,-50}, {2,617,-50}, {2,626,-50}, {2,660,-80}, {2,670,-60}, {2,688,-110}, {2,689,-110}, {2,694,-110}, {2,3819,-30}, {2,3820,-30}, {2,3827,-30}, {2,3834,-30}, {2,3842,-30}, {2,3905,-40}, {2,3954,-30}, {2,4034,-30}, {2,4037,-30}, {2,4053,-30}, {7,66,-40}, {7,72,-40}, {7,205,-50}, {7,395,-40}, {7,398,-40}, {7,406,-40}, {7,416,-40}, {7,421,-40}, {7,451,-40}, {7,457,-40}, {7,476,-40}, {7,572,-90}, {7,605,-50}, {7,606,-50}, {7,611,-50}, {7,617,-50}, {7,626,-50}, {7,660,-80}, {7,670,-60}, {7,688,-110}, {7,689,-110}, {7,694,-110}, {7,3819,-30}, {7,3820,-30}, {7,3827,-30}, {7,3834,-30}, {7,3842,-30}, {7,3905,-40}, {7,3954,-30}, {7,4034,-30}, {7,4037,-30}, {7,4053,-30}, {18,66,-40}, {18,72,-40}, {18,205,-50}, {18,395,-40}, {18,398,-40}, {18,406,-40}, {18,416,-40}, {18,421,-40}, {18,451,-40}, {18,457,-40}, {18,476,-40}, {18,572,-90}, {18,605,-50}, {18,606,-50}, {18,611,-50}, {18,617,-50}, {18,626,-50}, {18,660,-80}, {18,670,-60}, {18,688,-110}, {18,689,-110}, {18,694,-110}, {18,3819,-30}, {18,3820,-30}, {18,3827,-30}, {18,3834,-30}, {18,3842,-30}, {18,3905,-40}, {18,3954,-30}, {18,4034,-30}, {18,4037,-30}, {18,4053,-30}, {29,66,-40}, {29,72,-40}, {29,205,-50}, {29,395,-40}, {29,398,-40}, {29,406,-40}, {29,416,-40}, {29,421,-40}, {29,451,-40}, {29,457,-40}, {29,476,-40}, {29,572,-90}, {29,605,-50}, {29,606,-50}, {29,611,-50}, {29,617,-50}, {29,626,-50}, {29,660,-80}, {29,670,-60}, {29,688,-110}, {29,689,-110}, {29,694,-110}, {29,3819,-30}, {29,3820,-30}, {29,3827,-30}, {29,3834,-30}, {29,3842,-30}, {29,3905,-40}, {29,3954,-30}, {29,4034,-30}, {29,4037,-30}, {29,4053,-30}, {35,66,-40}, {35,72,-40}, {35,205,-50}, {35,395,-40}, {35,398,-40}, {35,406,-40}, {35,416,-40}, {35,421,-40}, {35,451,-40}, {35,457,-40}, {35,476,-40}, {35,572,-90}, {35,605,-50}, {35,606,-50}, {35,611,-50}, {35,617,-50}, {35,626,-50}, {35,660,-80}, {35,670,-60}, {35,688,-110}, {35,689,-110}, {35,694,-110}, {35,3819,-30}, {35,3820,-30}, {35,3827,-30}, {35,3834,-30}, {35,3842,-30}, {35,3905,-40}, {35,3954,-30}, {35,4034,-30}, {35,4037,-30}, {35,4053,-30}, {45,66,-40}, {45,72,-40}, {45,205,-50}, {45,395,-40}, {45,398,-40}, {45,406,-40}, {45,416,-40}, {45,421,-40}, {45,451,-40}, {45,457,-40}, {45,476,-40}, {45,572,-90}, {45,605,-50}, {45,606,-50}, {45,611,-50}, {45,617,-50}, {45,626,-50}, {45,660,-80}, {45,670,-60}, {45,688,-110}, {45,689,-110}, {45,694,-110}, {45,3819,-30}, {45,3820,-30}, {45,3827,-30}, {45,3834,-30}, {45,3842,-30}, {45,3905,-40}, {45,3954,-30}, {45,4034,-30}, {45,4037,-30}, {45,4053,-30}, {50,66,-40}, {50,72,-40}, {50,205,-50}, {50,395,-40}, {50,398,-40}, {50,406,-40}, {50,416,-40}, {50,421,-40}, {50,451,-40}, {50,457,-40}, {50,476,-40}, {50,572,-90}, {50,605,-50}, {50,606,-50}, {50,611,-50}, {50,617,-50}, {50,626,-50}, {50,660,-80}, {50,670,-60}, {50,688,-110}, {50,689,-110}, {50,694,-110}, {50,3819,-30}, {50,3820,-30}, {50,3827,-30}, {50,3834,-30}, {50,3842,-30}, {50,3905,-40}, {50,3954,-30}, {50,4034,-30}, {50,4037,-30}, {50,4053,-30}, {53,2,-30}, {53,7,-30}, {53,18,-30}, {53,29,-30}, {53,35,-30}, {53,45,-30}, {53,50,-30}, {53,605,-10}, {53,606,-10}, {53,611,-10}, {53,617,-10}, {53,626,-10}, {95,2,-40}, {95,7,-40}, {95,18,-40}, {95,29,-40}, {95,35,-40}, {95,45,-40}, {95,50,-40}, {95,660,-40}, {95,670,-40}, {95,688,-70}, {95,689,-70}, {95,694,-70}, {95,1411,-30}, {95,2998,-30}, {194,2,-80}, {194,7,-80}, {194,18,-80}, {194,29,-80}, {194,35,-80}, {194,45,-80}, {194,50,-80}, {194,736,-20}, {194,738,-20}, {194,760,-20}, {194,777,-20}, {194,1032,-20}, {194,1113,-20}, {194,1175,-20}, {194,1411,-100}, {194,2998,-100}, {303,2,-20}, {303,7,-20}, {303,18,-20}, {303,29,-20}, {303,35,-20}, {303,45,-20}, {303,50,-20}, {303,1411,-20}, {303,2998,-20}, {303,3819,-20}, {303,3820,-20}, {303,3827,-20}, {303,3834,-20}, {303,3842,-20}, {311,395,-30}, {311,398,-30}, {311,406,-30}, {311,416,-30}, {311,421,-30}, {311,451,-30}, {311,457,-30}, {311,1632,-15}, {311,1633,-15}, {311,1647,-15}, {311,1657,-15}, {311,1664,-15}, {311,2797,-35}, {311,2798,-35}, {311,2812,-35}, {311,2822,-35}, {311,2829,-35}, {311,2902,-35}, {311,2910,-35}, {311,3819,-30}, {311,3820,-30}, {311,3827,-30}, {311,3834,-30}, {311,3842,-30}, {311,4034,-40}, {311,4037,-40}, {311,4053,-40}, {339,572,-90}, {339,660,-110}, {339,670,-80}, {339,688,-120}, {339,689,-120}, {339,694,-120}, {339,3142,-140}, {339,3146,-140}, {339,4034,-30}, {339,4037,-30}, {339,4053,-30}, {358,572,-90}, {358,660,-110}, {358,670,-80}, {358,688,-120}, {358,689,-120}, {358,694,-120}, {358,3142,-140}, {358,3146,-140}, {358,4034,-30}, {358,4037,-30}, {358,4053,-30}, {395,2,-50}, {395,7,-50}, {395,18,-50}, {395,29,-50}, {395,35,-50}, {395,45,-50}, {395,50,-50}, {395,572,-40}, {395,660,-50}, {395,670,-50}, {395,680,-50}, {395,688,-70}, {395,689,-70}, {395,694,-70}, {395,1411,-40}, {395,2998,-40}, {398,2,-50}, {398,7,-50}, {398,18,-50}, {398,29,-50}, {398,35,-50}, {398,45,-50}, {398,50,-50}, {398,572,-40}, {398,660,-50}, {398,670,-50}, {398,680,-50}, {398,688,-70}, {398,689,-70}, {398,694,-70}, {398,1411,-40}, {398,2998,-40}, {406,2,-50}, {406,7,-50}, {406,18,-50}, {406,29,-50}, {406,35,-50}, {406,45,-50}, {406,50,-50}, {406,572,-40}, {406,660,-50}, {406,670,-50}, {406,680,-50}, {406,688,-70}, {406,689,-70}, {406,694,-70}, {406,1411,-40}, {406,2998,-40}, {416,2,-50}, {416,7,-50}, {416,18,-50}, {416,29,-50}, {416,35,-50}, {416,45,-50}, {416,50,-50}, {416,572,-40}, {416,660,-50}, {416,670,-50}, {416,680,-50}, {416,688,-70}, {416,689,-70}, {416,694,-70}, {416,1411,-40}, {416,2998,-40}, {421,2,-50}, {421,7,-50}, {421,18,-50}, {421,29,-50}, {421,35,-50}, {421,45,-50}, {421,50,-50}, {421,572,-40}, {421,660,-50}, {421,670,-50}, {421,680,-50}, {421,688,-70}, {421,689,-70}, {421,694,-70}, {421,1411,-40}, {421,2998,-40}, {451,2,-50}, {451,7,-50}, {451,18,-50}, {451,29,-50}, {451,35,-50}, {451,45,-50}, {451,50,-50}, {451,572,-40}, {451,660,-50}, {451,670,-50}, {451,680,-50}, {451,688,-70}, {451,689,-70}, {451,694,-70}, {451,1411,-40}, {451,2998,-40}, {457,2,-50}, {457,7,-50}, {457,18,-50}, {457,29,-50}, {457,35,-50}, {457,45,-50}, {457,50,-50}, {457,572,-40}, {457,660,-50}, {457,670,-50}, {457,680,-50}, {457,688,-70}, {457,689,-70}, {457,694,-70}, {457,1411,-40}, {457,2998,-40}, {461,2,-100}, {461,7,-100}, {461,18,-100}, {461,29,-100}, {461,35,-100}, {461,45,-100}, {461,50,-100}, {461,736,-30}, {461,738,-30}, {461,760,-30}, {461,777,-30}, {461,1032,-30}, {461,1113,-30}, {461,1175,-30}, {461,1411,-120}, {461,1632,-30}, {461,1633,-30}, {461,1647,-30}, {461,1657,-30}, {461,1664,-30}, {461,2797,-40}, {461,2798,-40}, {461,2812,-40}, {461,2822,-40}, {461,2829,-40}, {461,2902,-40}, {461,2910,-40}, {461,2998,-120}, {476,605,-10}, {476,606,-10}, {476,611,-10}, {476,617,-10}, {476,626,-10}, {476,1411,20}, {476,2998,20}, {480,395,-20}, {480,398,-20}, {480,406,-20}, {480,416,-20}, {480,421,-20}, {480,451,-20}, {480,457,-20}, {480,572,-20}, {480,605,-20}, {480,606,-20}, {480,611,-20}, {480,617,-20}, {480,626,-20}, {480,660,-50}, {480,670,-40}, {480,688,-50}, {480,689,-50}, {480,694,-50}, {572,2,-90}, {572,7,-90}, {572,18,-90}, {572,29,-90}, {572,35,-90}, {572,45,-90}, {572,50,-90}, {572,395,-40}, {572,398,-40}, {572,406,-40}, {572,416,-40}, {572,421,-40}, {572,451,-40}, {572,457,-40}, {572,736,-80}, {572,738,-80}, {572,760,-80}, {572,777,-80}, {572,1032,-80}, {572,1113,-80}, {572,1175,-80}, {572,1404,-40}, {572,1411,-80}, {572,1632,-60}, {572,1633,-60}, {572,1647,-60}, {572,1657,-60}, {572,1664,-60}, {572,2128,-120}, {572,2797,-80}, {572,2798,-80}, {572,2812,-80}, {572,2822,-80}, {572,2829,-80}, {572,2902,-80}, {572,2910,-80}, {572,2998,-80}, {572,3151,-80}, {572,3354,-40}, {572,3819,-90}, {572,3820,-90}, {572,3827,-90}, {572,3834,-90}, {572,3842,-90}, {572,3954,-60}, {572,4034,-60}, {572,4037,-60}, {572,4053,-60}, {605,2,-50}, {605,7,-50}, {605,18,-50}, {605,29,-50}, {605,35,-50}, {605,45,-50}, {605,50,-50}, {605,1411,-30}, {605,2998,-30}, {606,2,-50}, {606,7,-50}, {606,18,-50}, {606,29,-50}, {606,35,-50}, {606,45,-50}, {606,50,-50}, {606,1411,-30}, {606,2998,-30}, {611,2,-50}, {611,7,-50}, {611,18,-50}, {611,29,-50}, {611,35,-50}, {611,45,-50}, {611,50,-50}, {611,1411,-30}, {611,2998,-30}, {617,2,-50}, {617,7,-50}, {617,18,-50}, {617,29,-50}, {617,35,-50}, {617,45,-50}, {617,50,-50}, {617,1411,-30}, {617,2998,-30}, {626,2,-50}, {626,7,-50}, {626,18,-50}, {626,29,-50}, {626,35,-50}, {626,45,-50}, {626,50,-50}, {626,1411,-30}, {626,2998,-30}, {660,2,-80}, {660,7,-80}, {660,18,-80}, {660,29,-80}, {660,35,-80}, {660,45,-80}, {660,50,-80}, {660,205,-50}, {660,395,-50}, {660,398,-50}, {660,406,-50}, {660,416,-50}, {660,421,-50}, {660,451,-50}, {660,457,-50}, {660,736,-60}, {660,738,-60}, {660,760,-60}, {660,777,-60}, {660,1032,-60}, {660,1113,-60}, {660,1175,-60}, {660,1404,-40}, {660,1411,-120}, {660,1632,-50}, {660,1633,-50}, {660,1647,-50}, {660,1657,-50}, {660,1664,-50}, {660,2128,-80}, {660,2797,-90}, {660,2798,-90}, {660,2812,-90}, {660,2822,-90}, {660,2829,-90}, {660,2902,-90}, {660,2910,-90}, {660,2998,-120}, {660,3354,-40}, {660,3819,-60}, {660,3820,-60}, {660,3827,-60}, {660,3834,-60}, {660,3842,-60}, {670,2,-60}, {670,7,-60}, {670,18,-60}, {670,29,-60}, {670,35,-60}, {670,45,-60}, {670,50,-60}, {670,395,-20}, {670,398,-20}, {670,406,-20}, {670,416,-20}, {670,421,-20}, {670,451,-20}, {670,457,-20}, {670,736,-40}, {670,738,-40}, {670,760,-40}, {670,777,-40}, {670,1032,-40}, {670,1113,-40}, {670,1175,-40}, {670,1404,-10}, {670,1411,-80}, {670,1632,-35}, {670,1633,-35}, {670,1647,-35}, {670,1657,-35}, {670,1664,-35}, {670,2128,-40}, {670,2797,-60}, {670,2798,-60}, {670,2812,-60}, {670,2822,-60}, {670,2829,-60}, {670,2902,-60}, {670,2910,-60}, {670,2998,-80}, {670,3354,-10}, {670,3819,-45}, {670,3820,-45}, {670,3827,-45}, {670,3834,-45}, {670,3842,-45}, {670,4034,-20}, {670,4037,-20}, {670,4053,-20}, {688,2,-110}, {688,7,-110}, {688,18,-110}, {688,29,-110}, {688,35,-110}, {688,45,-110}, {688,50,-110}, {688,395,-70}, {688,398,-70}, {688,406,-70}, {688,416,-70}, {688,421,-70}, {688,451,-70}, {688,457,-70}, {688,736,-90}, {688,738,-90}, {688,760,-90}, {688,777,-90}, {688,1032,-90}, {688,1113,-90}, {688,1175,-90}, {688,1404,-50}, {688,1411,-100}, {688,1632,-80}, {688,1633,-80}, {688,1647,-80}, {688,1657,-80}, {688,1664,-80}, {688,2797,-100}, {688,2798,-100}, {688,2812,-100}, {688,2822,-100}, {688,2829,-100}, {688,2902,-100}, {688,2910,-100}, {688,2998,-100}, {688,3354,-50}, {688,3819,-100}, {688,3820,-100}, {688,3827,-100}, {688,3834,-100}, {688,3842,-100}, {689,2,-110}, {689,7,-110}, {689,18,-110}, {689,29,-110}, {689,35,-110}, {689,45,-110}, {689,50,-110}, {689,395,-70}, {689,398,-70}, {689,406,-70}, {689,416,-70}, {689,421,-70}, {689,451,-70}, {689,457,-70}, {689,736,-90}, {689,738,-90}, {689,760,-90}, {689,777,-90}, {689,1032,-90}, {689,1113,-90}, {689,1175,-90}, {689,1404,-50}, {689,1411,-100}, {689,1632,-80}, {689,1633,-80}, {689,1647,-80}, {689,1657,-80}, {689,1664,-80}, {689,2797,-100}, {689,2798,-100}, {689,2812,-100}, {689,2822,-100}, {689,2829,-100}, {689,2902,-100}, {689,2910,-100}, {689,2998,-100}, {689,3354,-50}, {689,3819,-100}, {689,3820,-100}, {689,3827,-100}, {689,3834,-100}, {689,3842,-100}, {694,2,-110}, {694,7,-110}, {694,18,-110}, {694,29,-110}, {694,35,-110}, {694,45,-110}, {694,50,-110}, {694,395,-70}, {694,398,-70}, {694,406,-70}, {694,416,-70}, {694,421,-70}, {694,451,-70}, {694,457,-70}, {694,736,-90}, {694,738,-90}, {694,760,-90}, {694,777,-90}, {694,1032,-90}, {694,1113,-90}, {694,1175,-90}, {694,1404,-50}, {694,1411,-100}, {694,1632,-80}, {694,1633,-80}, {694,1647,-80}, {694,1657,-80}, {694,1664,-80}, {694,2797,-100}, {694,2798,-100}, {694,2812,-100}, {694,2822,-100}, {694,2829,-100}, {694,2902,-100}, {694,2910,-100}, {694,2998,-100}, {694,3354,-50}, {694,3819,-100}, {694,3820,-100}, {694,3827,-100}, {694,3834,-100}, {694,3842,-100}, {736,1888,-10}, {736,3905,-15}, {736,3954,-15}, {736,4034,-20}, {736,4037,-20}, {736,4053,-20}, {738,1888,-10}, {738,3905,-15}, {738,3954,-15}, {738,4034,-20}, {738,4037,-20}, {738,4053,-20}, {760,1888,-10}, {760,3905,-15}, {760,3954,-15}, {760,4034,-20}, {760,4037,-20}, {760,4053,-20}, {777,1888,-10}, {777,3905,-15}, {777,3954,-15}, {777,4034,-20}, {777,4037,-20}, {777,4053,-20}, {1032,1888,-10}, {1032,3905,-15}, {1032,3954,-15}, {1032,4034,-20}, {1032,4037,-20}, {1032,4053,-20}, {1113,1888,-10}, {1113,3905,-15}, {1113,3954,-15}, {1113,4034,-20}, {1113,4037,-20}, {1113,4053,-20}, {1175,1888,-10}, {1175,3905,-15}, {1175,3954,-15}, {1175,4034,-20}, {1175,4037,-20}, {1175,4053,-20}, {1194,2418,-10}, {1194,2503,-10}, {1194,3819,-20}, {1194,3820,-20}, {1194,3827,-20}, {1194,3834,-20}, {1194,3842,-20}, {1194,3905,-20}, {1194,4034,-20}, {1194,4037,-20}, {1194,4053,-20}, {1314,1990,-10}, {1314,2304,-20}, {1314,2418,-20}, {1314,2503,-20}, {1314,4034,-10}, {1314,4037,-10}, {1314,4053,-10}, {1334,1990,-10}, {1334,2304,-20}, {1334,2418,-20}, {1334,2503,-20}, {1334,4034,-10}, {1334,4037,-10}, {1334,4053,-10}, {1404,3501,-40}, {1411,3142,-120}, {1411,3146,-120}, {1411,3501,-40}, {1483,1483,-10}, {1483,3905,-15}, {1483,3954,-15}, {1483,4034,-15}, {1483,4037,-15}, {1483,4053,-15}, {1632,1411,10}, {1632,2998,20}, {1632,3905,-15}, {1632,3954,-15}, {1632,4023,-15}, {1632,4034,-15}, {1632,4037,-15}, {1632,4053,-15}, {1633,1411,10}, {1633,2998,20}, {1633,3905,-15}, {1633,3954,-15}, {1633,4023,-15}, {1633,4034,-15}, {1633,4037,-15}, {1633,4053,-15}, {1647,1411,10}, {1647,2998,20}, {1647,3905,-15}, {1647,3954,-15}, {1647,4023,-15}, {1647,4034,-15}, {1647,4037,-15}, {1647,4053,-15}, {1657,1411,10}, {1657,2998,20}, {1657,3905,-15}, {1657,3954,-15}, {1657,4023,-15}, {1657,4034,-15}, {1657,4037,-15}, {1657,4053,-15}, {1664,1411,10}, {1664,2998,20}, {1664,3905,-15}, {1664,3954,-15}, {1664,4023,-15}, {1664,4034,-15}, {1664,4037,-15}, {1664,4053,-15}, {1789,1411,-10}, {1789,1632,-10}, {1789,1633,-10}, {1789,1647,-10}, {1789,1657,-10}, {1789,1664,-10}, {1789,2797,-20}, {1789,2798,-20}, {1789,2812,-20}, {1789,2822,-20}, {1789,2829,-20}, {1789,2902,-20}, {1789,2910,-20}, {1789,2998,-10}, {1789,3142,30}, {1789,3146,30}, {1888,1632,10}, {1888,1633,10}, {1888,1647,10}, {1888,1657,10}, {1888,1664,10}, {1888,1888,-10}, {1990,4034,-20}, {1990,4037,-20}, {1990,4053,-20}, {2304,2797,-15}, {2304,2798,-15}, {2304,2812,-15}, {2304,2822,-15}, {2304,2829,-15}, {2304,2902,-15}, {2304,2910,-15}, {2418,3954,-15}, {2418,4034,-15}, {2418,4037,-15}, {2418,4053,-15}, {2503,3954,-15}, {2503,4034,-15}, {2503,4037,-15}, {2503,4053,-15}, {2513,3819,-20}, {2513,3820,-20}, {2513,3827,-20}, {2513,3834,-20}, {2513,3842,-20}, {2513,4034,-30}, {2513,4037,-30}, {2513,4053,-30}, {2650,3819,-10}, {2650,3820,-10}, {2650,3827,-10}, {2650,3834,-10}, {2650,3842,-10}, {2650,3905,-40}, {2650,4034,-20}, {2650,4037,-20}, {2650,4053,-20}, {2772,3819,-10}, {2772,3820,-10}, {2772,3827,-10}, {2772,3834,-10}, {2772,3842,-10}, {2772,3905,-40}, {2772,4034,-20}, {2772,4037,-20}, {2772,4053,-20}, {2797,3905,-20}, {2797,3954,-15}, {2797,4023,-30}, {2797,4034,-20}, {2797,4037,-20}, {2797,4053,-20}, {2798,3905,-20}, {2798,3954,-15}, {2798,4023,-30}, {2798,4034,-20}, {2798,4037,-20}, {2798,4053,-20}, {2812,3905,-20}, {2812,3954,-15}, {2812,4023,-30}, {2812,4034,-20}, {2812,4037,-20}, {2812,4053,-20}, {2822,3905,-20}, {2822,3954,-15}, {2822,4023,-30}, {2822,4034,-20}, {2822,4037,-20}, {2822,4053,-20}, {2829,3905,-20}, {2829,3954,-15}, {2829,4023,-30}, {2829,4034,-20}, {2829,4037,-20}, {2829,4053,-20}, {2902,3905,-20}, {2902,3954,-15}, {2902,4023,-30}, {2902,4034,-20}, {2902,4037,-20}, {2902,4053,-20}, {2910,3905,-20}, {2910,3954,-15}, {2910,4023,-30}, {2910,4034,-20}, {2910,4037,-20}, {2910,4053,-20}, {2924,4034,-15}, {2924,4037,-15}, {2924,4053,-15}, {2998,3142,-120}, {2998,3146,-120}, {2998,3501,-40}, {3142,3501,-80}, {3143,3143,-46}, {3146,1483,-80}, {3146,2418,-20}, {3146,2503,-20}, {3146,3146,-46}, {3146,3151,-40}, {3146,3282,-60}, {3146,3320,-60}, {3146,3501,-80}, {3146,3905,-20}, {3151,1314,-20}, {3151,1334,-20}, {3151,1411,-60}, {3151,1483,-20}, {3151,1888,-15}, {3151,2128,-20}, {3151,2797,-20}, {3151,2798,-20}, {3151,2812,-20}, {3151,2822,-20}, {3151,2829,-20}, {3151,2902,-20}, {3151,2910,-20}, {3151,2998,-60}, {3151,3086,-20}, {3151,3282,-15}, {3151,3320,-15}, {3151,3559,20}, {3151,3905,10}, {3151,4034,10}, {3151,4037,10}, {3151,4053,10}, {3282,3954,-15}, {3320,3954,-15}, {3354,3501,-40}, {3501,572,-100}, {3501,660,-80}, {3501,670,-80}, {3501,688,-120}, {3501,689,-120}, {3501,694,-120}, {3501,3138,-80}, {3501,3143,-60}, {3905,736,-20}, {3905,738,-20}, {3905,760,-20}, {3905,777,-20}, {3905,1032,-20}, {3905,1113,-20}, {3905,1175,-20}, {3905,1411,-80}, {3905,2797,-30}, {3905,2798,-30}, {3905,2812,-30}, {3905,2822,-30}, {3905,2829,-30}, {3905,2902,-30}, {3905,2910,-30}, {3905,2998,-80}, {3954,1411,-40}, {3954,2797,-20}, {3954,2798,-20}, {3954,2812,-20}, {3954,2822,-20}, {3954,2829,-20}, {3954,2902,-20}, {3954,2910,-20}, {3954,2998,-40}, {4023,1632,-10}, {4023,1633,-10}, {4023,1647,-10}, {4023,1657,-10}, {4023,1664,-10}, {4034,736,-30}, {4034,738,-30}, {4034,760,-30}, {4034,777,-30}, {4034,1032,-30}, {4034,1113,-30}, {4034,1175,-30}, {4034,1411,-80}, {4034,1632,-10}, {4034,1633,-10}, {4034,1647,-10}, {4034,1657,-10}, {4034,1664,-10}, {4034,2797,-25}, {4034,2798,-25}, {4034,2812,-25}, {4034,2822,-25}, {4034,2829,-25}, {4034,2902,-25}, {4034,2910,-25}, {4034,2998,-80}, {4037,736,-30}, {4037,738,-30}, {4037,760,-30}, {4037,777,-30}, {4037,1032,-30}, {4037,1113,-30}, {4037,1175,-30}, {4037,1411,-80}, {4037,1632,-10}, {4037,1633,-10}, {4037,1647,-10}, {4037,1657,-10}, {4037,1664,-10}, {4037,2797,-25}, {4037,2798,-25}, {4037,2812,-25}, {4037,2822,-25}, {4037,2829,-25}, {4037,2902,-25}, {4037,2910,-25}, {4037,2998,-80}, {4053,736,-30}, {4053,738,-30}, {4053,760,-30}, {4053,777,-30}, {4053,1032,-30}, {4053,1113,-30}, {4053,1175,-30}, {4053,1411,-80}, {4053,1632,-10}, {4053,1633,-10}, {4053,1647,-10}, {4053,1657,-10}, {4053,1664,-10}, {4053,2797,-25}, {4053,2798,-25}, {4053,2812,-25}, {4053,2822,-25}, {4053,2829,-25}, {4053,2902,-25}, {4053,2910,-25}, {4053,2998,-80}, {4135,1632,10}, {4135,1633,10}, {4135,1647,10}, {4135,1657,10}, {4135,1664,10}, {4156,1632,10}, {4156,1633,10}, {4156,1647,10}, {4156,1657,10}, {4156,1664,10}, {NOGLYPH,NOGLYPH,0} }; static const ligature helvetica_bold_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair helvetica_boldoblique_kerns[] = { {2,66,-40}, {2,72,-40}, {2,205,-50}, {2,395,-40}, {2,398,-40}, {2,406,-40}, {2,416,-40}, {2,421,-40}, {2,451,-40}, {2,457,-40}, {2,476,-40}, {2,572,-90}, {2,605,-50}, {2,606,-50}, {2,611,-50}, {2,617,-50}, {2,626,-50}, {2,660,-80}, {2,670,-60}, {2,688,-110}, {2,689,-110}, {2,694,-110}, {2,3819,-30}, {2,3820,-30}, {2,3827,-30}, {2,3834,-30}, {2,3842,-30}, {2,3905,-40}, {2,3954,-30}, {2,4034,-30}, {2,4037,-30}, {2,4053,-30}, {7,66,-40}, {7,72,-40}, {7,205,-50}, {7,395,-40}, {7,398,-40}, {7,406,-40}, {7,416,-40}, {7,421,-40}, {7,451,-40}, {7,457,-40}, {7,476,-40}, {7,572,-90}, {7,605,-50}, {7,606,-50}, {7,611,-50}, {7,617,-50}, {7,626,-50}, {7,660,-80}, {7,670,-60}, {7,688,-110}, {7,689,-110}, {7,694,-110}, {7,3819,-30}, {7,3820,-30}, {7,3827,-30}, {7,3834,-30}, {7,3842,-30}, {7,3905,-40}, {7,3954,-30}, {7,4034,-30}, {7,4037,-30}, {7,4053,-30}, {18,66,-40}, {18,72,-40}, {18,205,-50}, {18,395,-40}, {18,398,-40}, {18,406,-40}, {18,416,-40}, {18,421,-40}, {18,451,-40}, {18,457,-40}, {18,476,-40}, {18,572,-90}, {18,605,-50}, {18,606,-50}, {18,611,-50}, {18,617,-50}, {18,626,-50}, {18,660,-80}, {18,670,-60}, {18,688,-110}, {18,689,-110}, {18,694,-110}, {18,3819,-30}, {18,3820,-30}, {18,3827,-30}, {18,3834,-30}, {18,3842,-30}, {18,3905,-40}, {18,3954,-30}, {18,4034,-30}, {18,4037,-30}, {18,4053,-30}, {29,66,-40}, {29,72,-40}, {29,205,-50}, {29,395,-40}, {29,398,-40}, {29,406,-40}, {29,416,-40}, {29,421,-40}, {29,451,-40}, {29,457,-40}, {29,476,-40}, {29,572,-90}, {29,605,-50}, {29,606,-50}, {29,611,-50}, {29,617,-50}, {29,626,-50}, {29,660,-80}, {29,670,-60}, {29,688,-110}, {29,689,-110}, {29,694,-110}, {29,3819,-30}, {29,3820,-30}, {29,3827,-30}, {29,3834,-30}, {29,3842,-30}, {29,3905,-40}, {29,3954,-30}, {29,4034,-30}, {29,4037,-30}, {29,4053,-30}, {35,66,-40}, {35,72,-40}, {35,205,-50}, {35,395,-40}, {35,398,-40}, {35,406,-40}, {35,416,-40}, {35,421,-40}, {35,451,-40}, {35,457,-40}, {35,476,-40}, {35,572,-90}, {35,605,-50}, {35,606,-50}, {35,611,-50}, {35,617,-50}, {35,626,-50}, {35,660,-80}, {35,670,-60}, {35,688,-110}, {35,689,-110}, {35,694,-110}, {35,3819,-30}, {35,3820,-30}, {35,3827,-30}, {35,3834,-30}, {35,3842,-30}, {35,3905,-40}, {35,3954,-30}, {35,4034,-30}, {35,4037,-30}, {35,4053,-30}, {45,66,-40}, {45,72,-40}, {45,205,-50}, {45,395,-40}, {45,398,-40}, {45,406,-40}, {45,416,-40}, {45,421,-40}, {45,451,-40}, {45,457,-40}, {45,476,-40}, {45,572,-90}, {45,605,-50}, {45,606,-50}, {45,611,-50}, {45,617,-50}, {45,626,-50}, {45,660,-80}, {45,670,-60}, {45,688,-110}, {45,689,-110}, {45,694,-110}, {45,3819,-30}, {45,3820,-30}, {45,3827,-30}, {45,3834,-30}, {45,3842,-30}, {45,3905,-40}, {45,3954,-30}, {45,4034,-30}, {45,4037,-30}, {45,4053,-30}, {50,66,-40}, {50,72,-40}, {50,205,-50}, {50,395,-40}, {50,398,-40}, {50,406,-40}, {50,416,-40}, {50,421,-40}, {50,451,-40}, {50,457,-40}, {50,476,-40}, {50,572,-90}, {50,605,-50}, {50,606,-50}, {50,611,-50}, {50,617,-50}, {50,626,-50}, {50,660,-80}, {50,670,-60}, {50,688,-110}, {50,689,-110}, {50,694,-110}, {50,3819,-30}, {50,3820,-30}, {50,3827,-30}, {50,3834,-30}, {50,3842,-30}, {50,3905,-40}, {50,3954,-30}, {50,4034,-30}, {50,4037,-30}, {50,4053,-30}, {53,2,-30}, {53,7,-30}, {53,18,-30}, {53,29,-30}, {53,35,-30}, {53,45,-30}, {53,50,-30}, {53,605,-10}, {53,606,-10}, {53,611,-10}, {53,617,-10}, {53,626,-10}, {95,2,-40}, {95,7,-40}, {95,18,-40}, {95,29,-40}, {95,35,-40}, {95,45,-40}, {95,50,-40}, {95,660,-40}, {95,670,-40}, {95,688,-70}, {95,689,-70}, {95,694,-70}, {95,1411,-30}, {95,2998,-30}, {194,2,-80}, {194,7,-80}, {194,18,-80}, {194,29,-80}, {194,35,-80}, {194,45,-80}, {194,50,-80}, {194,736,-20}, {194,738,-20}, {194,760,-20}, {194,777,-20}, {194,1032,-20}, {194,1113,-20}, {194,1175,-20}, {194,1411,-100}, {194,2998,-100}, {303,2,-20}, {303,7,-20}, {303,18,-20}, {303,29,-20}, {303,35,-20}, {303,45,-20}, {303,50,-20}, {303,1411,-20}, {303,2998,-20}, {303,3819,-20}, {303,3820,-20}, {303,3827,-20}, {303,3834,-20}, {303,3842,-20}, {311,395,-30}, {311,398,-30}, {311,406,-30}, {311,416,-30}, {311,421,-30}, {311,451,-30}, {311,457,-30}, {311,1632,-15}, {311,1633,-15}, {311,1647,-15}, {311,1657,-15}, {311,1664,-15}, {311,2797,-35}, {311,2798,-35}, {311,2812,-35}, {311,2822,-35}, {311,2829,-35}, {311,2902,-35}, {311,2910,-35}, {311,3819,-30}, {311,3820,-30}, {311,3827,-30}, {311,3834,-30}, {311,3842,-30}, {311,4034,-40}, {311,4037,-40}, {311,4053,-40}, {339,572,-90}, {339,660,-110}, {339,670,-80}, {339,688,-120}, {339,689,-120}, {339,694,-120}, {339,3142,-140}, {339,3146,-140}, {339,4034,-30}, {339,4037,-30}, {339,4053,-30}, {358,572,-90}, {358,660,-110}, {358,670,-80}, {358,688,-120}, {358,689,-120}, {358,694,-120}, {358,3142,-140}, {358,3146,-140}, {358,4034,-30}, {358,4037,-30}, {358,4053,-30}, {395,2,-50}, {395,7,-50}, {395,18,-50}, {395,29,-50}, {395,35,-50}, {395,45,-50}, {395,50,-50}, {395,572,-40}, {395,660,-50}, {395,670,-50}, {395,680,-50}, {395,688,-70}, {395,689,-70}, {395,694,-70}, {395,1411,-40}, {395,2998,-40}, {398,2,-50}, {398,7,-50}, {398,18,-50}, {398,29,-50}, {398,35,-50}, {398,45,-50}, {398,50,-50}, {398,572,-40}, {398,660,-50}, {398,670,-50}, {398,680,-50}, {398,688,-70}, {398,689,-70}, {398,694,-70}, {398,1411,-40}, {398,2998,-40}, {406,2,-50}, {406,7,-50}, {406,18,-50}, {406,29,-50}, {406,35,-50}, {406,45,-50}, {406,50,-50}, {406,572,-40}, {406,660,-50}, {406,670,-50}, {406,680,-50}, {406,688,-70}, {406,689,-70}, {406,694,-70}, {406,1411,-40}, {406,2998,-40}, {416,2,-50}, {416,7,-50}, {416,18,-50}, {416,29,-50}, {416,35,-50}, {416,45,-50}, {416,50,-50}, {416,572,-40}, {416,660,-50}, {416,670,-50}, {416,680,-50}, {416,688,-70}, {416,689,-70}, {416,694,-70}, {416,1411,-40}, {416,2998,-40}, {421,2,-50}, {421,7,-50}, {421,18,-50}, {421,29,-50}, {421,35,-50}, {421,45,-50}, {421,50,-50}, {421,572,-40}, {421,660,-50}, {421,670,-50}, {421,680,-50}, {421,688,-70}, {421,689,-70}, {421,694,-70}, {421,1411,-40}, {421,2998,-40}, {451,2,-50}, {451,7,-50}, {451,18,-50}, {451,29,-50}, {451,35,-50}, {451,45,-50}, {451,50,-50}, {451,572,-40}, {451,660,-50}, {451,670,-50}, {451,680,-50}, {451,688,-70}, {451,689,-70}, {451,694,-70}, {451,1411,-40}, {451,2998,-40}, {457,2,-50}, {457,7,-50}, {457,18,-50}, {457,29,-50}, {457,35,-50}, {457,45,-50}, {457,50,-50}, {457,572,-40}, {457,660,-50}, {457,670,-50}, {457,680,-50}, {457,688,-70}, {457,689,-70}, {457,694,-70}, {457,1411,-40}, {457,2998,-40}, {461,2,-100}, {461,7,-100}, {461,18,-100}, {461,29,-100}, {461,35,-100}, {461,45,-100}, {461,50,-100}, {461,736,-30}, {461,738,-30}, {461,760,-30}, {461,777,-30}, {461,1032,-30}, {461,1113,-30}, {461,1175,-30}, {461,1411,-120}, {461,1632,-30}, {461,1633,-30}, {461,1647,-30}, {461,1657,-30}, {461,1664,-30}, {461,2797,-40}, {461,2798,-40}, {461,2812,-40}, {461,2822,-40}, {461,2829,-40}, {461,2902,-40}, {461,2910,-40}, {461,2998,-120}, {476,605,-10}, {476,606,-10}, {476,611,-10}, {476,617,-10}, {476,626,-10}, {476,1411,20}, {476,2998,20}, {480,395,-20}, {480,398,-20}, {480,406,-20}, {480,416,-20}, {480,421,-20}, {480,451,-20}, {480,457,-20}, {480,572,-20}, {480,605,-20}, {480,606,-20}, {480,611,-20}, {480,617,-20}, {480,626,-20}, {480,660,-50}, {480,670,-40}, {480,688,-50}, {480,689,-50}, {480,694,-50}, {572,2,-90}, {572,7,-90}, {572,18,-90}, {572,29,-90}, {572,35,-90}, {572,45,-90}, {572,50,-90}, {572,395,-40}, {572,398,-40}, {572,406,-40}, {572,416,-40}, {572,421,-40}, {572,451,-40}, {572,457,-40}, {572,736,-80}, {572,738,-80}, {572,760,-80}, {572,777,-80}, {572,1032,-80}, {572,1113,-80}, {572,1175,-80}, {572,1404,-40}, {572,1411,-80}, {572,1632,-60}, {572,1633,-60}, {572,1647,-60}, {572,1657,-60}, {572,1664,-60}, {572,2128,-120}, {572,2797,-80}, {572,2798,-80}, {572,2812,-80}, {572,2822,-80}, {572,2829,-80}, {572,2902,-80}, {572,2910,-80}, {572,2998,-80}, {572,3151,-80}, {572,3354,-40}, {572,3819,-90}, {572,3820,-90}, {572,3827,-90}, {572,3834,-90}, {572,3842,-90}, {572,3954,-60}, {572,4034,-60}, {572,4037,-60}, {572,4053,-60}, {605,2,-50}, {605,7,-50}, {605,18,-50}, {605,29,-50}, {605,35,-50}, {605,45,-50}, {605,50,-50}, {605,1411,-30}, {605,2998,-30}, {606,2,-50}, {606,7,-50}, {606,18,-50}, {606,29,-50}, {606,35,-50}, {606,45,-50}, {606,50,-50}, {606,1411,-30}, {606,2998,-30}, {611,2,-50}, {611,7,-50}, {611,18,-50}, {611,29,-50}, {611,35,-50}, {611,45,-50}, {611,50,-50}, {611,1411,-30}, {611,2998,-30}, {617,2,-50}, {617,7,-50}, {617,18,-50}, {617,29,-50}, {617,35,-50}, {617,45,-50}, {617,50,-50}, {617,1411,-30}, {617,2998,-30}, {626,2,-50}, {626,7,-50}, {626,18,-50}, {626,29,-50}, {626,35,-50}, {626,45,-50}, {626,50,-50}, {626,1411,-30}, {626,2998,-30}, {660,2,-80}, {660,7,-80}, {660,18,-80}, {660,29,-80}, {660,35,-80}, {660,45,-80}, {660,50,-80}, {660,205,-50}, {660,395,-50}, {660,398,-50}, {660,406,-50}, {660,416,-50}, {660,421,-50}, {660,451,-50}, {660,457,-50}, {660,736,-60}, {660,738,-60}, {660,760,-60}, {660,777,-60}, {660,1032,-60}, {660,1113,-60}, {660,1175,-60}, {660,1404,-40}, {660,1411,-120}, {660,1632,-50}, {660,1633,-50}, {660,1647,-50}, {660,1657,-50}, {660,1664,-50}, {660,2128,-80}, {660,2797,-90}, {660,2798,-90}, {660,2812,-90}, {660,2822,-90}, {660,2829,-90}, {660,2902,-90}, {660,2910,-90}, {660,2998,-120}, {660,3354,-40}, {660,3819,-60}, {660,3820,-60}, {660,3827,-60}, {660,3834,-60}, {660,3842,-60}, {670,2,-60}, {670,7,-60}, {670,18,-60}, {670,29,-60}, {670,35,-60}, {670,45,-60}, {670,50,-60}, {670,395,-20}, {670,398,-20}, {670,406,-20}, {670,416,-20}, {670,421,-20}, {670,451,-20}, {670,457,-20}, {670,736,-40}, {670,738,-40}, {670,760,-40}, {670,777,-40}, {670,1032,-40}, {670,1113,-40}, {670,1175,-40}, {670,1404,-10}, {670,1411,-80}, {670,1632,-35}, {670,1633,-35}, {670,1647,-35}, {670,1657,-35}, {670,1664,-35}, {670,2128,-40}, {670,2797,-60}, {670,2798,-60}, {670,2812,-60}, {670,2822,-60}, {670,2829,-60}, {670,2902,-60}, {670,2910,-60}, {670,2998,-80}, {670,3354,-10}, {670,3819,-45}, {670,3820,-45}, {670,3827,-45}, {670,3834,-45}, {670,3842,-45}, {670,4034,-20}, {670,4037,-20}, {670,4053,-20}, {688,2,-110}, {688,7,-110}, {688,18,-110}, {688,29,-110}, {688,35,-110}, {688,45,-110}, {688,50,-110}, {688,395,-70}, {688,398,-70}, {688,406,-70}, {688,416,-70}, {688,421,-70}, {688,451,-70}, {688,457,-70}, {688,736,-90}, {688,738,-90}, {688,760,-90}, {688,777,-90}, {688,1032,-90}, {688,1113,-90}, {688,1175,-90}, {688,1404,-50}, {688,1411,-100}, {688,1632,-80}, {688,1633,-80}, {688,1647,-80}, {688,1657,-80}, {688,1664,-80}, {688,2797,-100}, {688,2798,-100}, {688,2812,-100}, {688,2822,-100}, {688,2829,-100}, {688,2902,-100}, {688,2910,-100}, {688,2998,-100}, {688,3354,-50}, {688,3819,-100}, {688,3820,-100}, {688,3827,-100}, {688,3834,-100}, {688,3842,-100}, {689,2,-110}, {689,7,-110}, {689,18,-110}, {689,29,-110}, {689,35,-110}, {689,45,-110}, {689,50,-110}, {689,395,-70}, {689,398,-70}, {689,406,-70}, {689,416,-70}, {689,421,-70}, {689,451,-70}, {689,457,-70}, {689,736,-90}, {689,738,-90}, {689,760,-90}, {689,777,-90}, {689,1032,-90}, {689,1113,-90}, {689,1175,-90}, {689,1404,-50}, {689,1411,-100}, {689,1632,-80}, {689,1633,-80}, {689,1647,-80}, {689,1657,-80}, {689,1664,-80}, {689,2797,-100}, {689,2798,-100}, {689,2812,-100}, {689,2822,-100}, {689,2829,-100}, {689,2902,-100}, {689,2910,-100}, {689,2998,-100}, {689,3354,-50}, {689,3819,-100}, {689,3820,-100}, {689,3827,-100}, {689,3834,-100}, {689,3842,-100}, {694,2,-110}, {694,7,-110}, {694,18,-110}, {694,29,-110}, {694,35,-110}, {694,45,-110}, {694,50,-110}, {694,395,-70}, {694,398,-70}, {694,406,-70}, {694,416,-70}, {694,421,-70}, {694,451,-70}, {694,457,-70}, {694,736,-90}, {694,738,-90}, {694,760,-90}, {694,777,-90}, {694,1032,-90}, {694,1113,-90}, {694,1175,-90}, {694,1404,-50}, {694,1411,-100}, {694,1632,-80}, {694,1633,-80}, {694,1647,-80}, {694,1657,-80}, {694,1664,-80}, {694,2797,-100}, {694,2798,-100}, {694,2812,-100}, {694,2822,-100}, {694,2829,-100}, {694,2902,-100}, {694,2910,-100}, {694,2998,-100}, {694,3354,-50}, {694,3819,-100}, {694,3820,-100}, {694,3827,-100}, {694,3834,-100}, {694,3842,-100}, {736,1888,-10}, {736,3905,-15}, {736,3954,-15}, {736,4034,-20}, {736,4037,-20}, {736,4053,-20}, {738,1888,-10}, {738,3905,-15}, {738,3954,-15}, {738,4034,-20}, {738,4037,-20}, {738,4053,-20}, {760,1888,-10}, {760,3905,-15}, {760,3954,-15}, {760,4034,-20}, {760,4037,-20}, {760,4053,-20}, {777,1888,-10}, {777,3905,-15}, {777,3954,-15}, {777,4034,-20}, {777,4037,-20}, {777,4053,-20}, {1032,1888,-10}, {1032,3905,-15}, {1032,3954,-15}, {1032,4034,-20}, {1032,4037,-20}, {1032,4053,-20}, {1113,1888,-10}, {1113,3905,-15}, {1113,3954,-15}, {1113,4034,-20}, {1113,4037,-20}, {1113,4053,-20}, {1175,1888,-10}, {1175,3905,-15}, {1175,3954,-15}, {1175,4034,-20}, {1175,4037,-20}, {1175,4053,-20}, {1194,2418,-10}, {1194,2503,-10}, {1194,3819,-20}, {1194,3820,-20}, {1194,3827,-20}, {1194,3834,-20}, {1194,3842,-20}, {1194,3905,-20}, {1194,4034,-20}, {1194,4037,-20}, {1194,4053,-20}, {1314,1990,-10}, {1314,2304,-20}, {1314,2418,-20}, {1314,2503,-20}, {1314,4034,-10}, {1314,4037,-10}, {1314,4053,-10}, {1334,1990,-10}, {1334,2304,-20}, {1334,2418,-20}, {1334,2503,-20}, {1334,4034,-10}, {1334,4037,-10}, {1334,4053,-10}, {1404,3501,-40}, {1411,3142,-120}, {1411,3146,-120}, {1411,3501,-40}, {1483,1483,-10}, {1483,3905,-15}, {1483,3954,-15}, {1483,4034,-15}, {1483,4037,-15}, {1483,4053,-15}, {1632,1411,10}, {1632,2998,20}, {1632,3905,-15}, {1632,3954,-15}, {1632,4023,-15}, {1632,4034,-15}, {1632,4037,-15}, {1632,4053,-15}, {1633,1411,10}, {1633,2998,20}, {1633,3905,-15}, {1633,3954,-15}, {1633,4023,-15}, {1633,4034,-15}, {1633,4037,-15}, {1633,4053,-15}, {1647,1411,10}, {1647,2998,20}, {1647,3905,-15}, {1647,3954,-15}, {1647,4023,-15}, {1647,4034,-15}, {1647,4037,-15}, {1647,4053,-15}, {1657,1411,10}, {1657,2998,20}, {1657,3905,-15}, {1657,3954,-15}, {1657,4023,-15}, {1657,4034,-15}, {1657,4037,-15}, {1657,4053,-15}, {1664,1411,10}, {1664,2998,20}, {1664,3905,-15}, {1664,3954,-15}, {1664,4023,-15}, {1664,4034,-15}, {1664,4037,-15}, {1664,4053,-15}, {1789,1411,-10}, {1789,1632,-10}, {1789,1633,-10}, {1789,1647,-10}, {1789,1657,-10}, {1789,1664,-10}, {1789,2797,-20}, {1789,2798,-20}, {1789,2812,-20}, {1789,2822,-20}, {1789,2829,-20}, {1789,2902,-20}, {1789,2910,-20}, {1789,2998,-10}, {1789,3142,30}, {1789,3146,30}, {1888,1632,10}, {1888,1633,10}, {1888,1647,10}, {1888,1657,10}, {1888,1664,10}, {1888,1888,-10}, {1990,4034,-20}, {1990,4037,-20}, {1990,4053,-20}, {2304,2797,-15}, {2304,2798,-15}, {2304,2812,-15}, {2304,2822,-15}, {2304,2829,-15}, {2304,2902,-15}, {2304,2910,-15}, {2418,3954,-15}, {2418,4034,-15}, {2418,4037,-15}, {2418,4053,-15}, {2503,3954,-15}, {2503,4034,-15}, {2503,4037,-15}, {2503,4053,-15}, {2513,3819,-20}, {2513,3820,-20}, {2513,3827,-20}, {2513,3834,-20}, {2513,3842,-20}, {2513,4034,-30}, {2513,4037,-30}, {2513,4053,-30}, {2650,3819,-10}, {2650,3820,-10}, {2650,3827,-10}, {2650,3834,-10}, {2650,3842,-10}, {2650,3905,-40}, {2650,4034,-20}, {2650,4037,-20}, {2650,4053,-20}, {2772,3819,-10}, {2772,3820,-10}, {2772,3827,-10}, {2772,3834,-10}, {2772,3842,-10}, {2772,3905,-40}, {2772,4034,-20}, {2772,4037,-20}, {2772,4053,-20}, {2797,3905,-20}, {2797,3954,-15}, {2797,4023,-30}, {2797,4034,-20}, {2797,4037,-20}, {2797,4053,-20}, {2798,3905,-20}, {2798,3954,-15}, {2798,4023,-30}, {2798,4034,-20}, {2798,4037,-20}, {2798,4053,-20}, {2812,3905,-20}, {2812,3954,-15}, {2812,4023,-30}, {2812,4034,-20}, {2812,4037,-20}, {2812,4053,-20}, {2822,3905,-20}, {2822,3954,-15}, {2822,4023,-30}, {2822,4034,-20}, {2822,4037,-20}, {2822,4053,-20}, {2829,3905,-20}, {2829,3954,-15}, {2829,4023,-30}, {2829,4034,-20}, {2829,4037,-20}, {2829,4053,-20}, {2902,3905,-20}, {2902,3954,-15}, {2902,4023,-30}, {2902,4034,-20}, {2902,4037,-20}, {2902,4053,-20}, {2910,3905,-20}, {2910,3954,-15}, {2910,4023,-30}, {2910,4034,-20}, {2910,4037,-20}, {2910,4053,-20}, {2924,4034,-15}, {2924,4037,-15}, {2924,4053,-15}, {2998,3142,-120}, {2998,3146,-120}, {2998,3501,-40}, {3142,3501,-80}, {3143,3143,-46}, {3146,1483,-80}, {3146,2418,-20}, {3146,2503,-20}, {3146,3146,-46}, {3146,3151,-40}, {3146,3282,-60}, {3146,3320,-60}, {3146,3501,-80}, {3146,3905,-20}, {3151,1314,-20}, {3151,1334,-20}, {3151,1411,-60}, {3151,1483,-20}, {3151,1888,-15}, {3151,2128,-20}, {3151,2797,-20}, {3151,2798,-20}, {3151,2812,-20}, {3151,2822,-20}, {3151,2829,-20}, {3151,2902,-20}, {3151,2910,-20}, {3151,2998,-60}, {3151,3086,-20}, {3151,3282,-15}, {3151,3320,-15}, {3151,3559,20}, {3151,3905,10}, {3151,4034,10}, {3151,4037,10}, {3151,4053,10}, {3282,3954,-15}, {3320,3954,-15}, {3354,3501,-40}, {3501,572,-100}, {3501,660,-80}, {3501,670,-80}, {3501,688,-120}, {3501,689,-120}, {3501,694,-120}, {3501,3138,-80}, {3501,3143,-60}, {3905,736,-20}, {3905,738,-20}, {3905,760,-20}, {3905,777,-20}, {3905,1032,-20}, {3905,1113,-20}, {3905,1175,-20}, {3905,1411,-80}, {3905,2797,-30}, {3905,2798,-30}, {3905,2812,-30}, {3905,2822,-30}, {3905,2829,-30}, {3905,2902,-30}, {3905,2910,-30}, {3905,2998,-80}, {3954,1411,-40}, {3954,2797,-20}, {3954,2798,-20}, {3954,2812,-20}, {3954,2822,-20}, {3954,2829,-20}, {3954,2902,-20}, {3954,2910,-20}, {3954,2998,-40}, {4023,1632,-10}, {4023,1633,-10}, {4023,1647,-10}, {4023,1657,-10}, {4023,1664,-10}, {4034,736,-30}, {4034,738,-30}, {4034,760,-30}, {4034,777,-30}, {4034,1032,-30}, {4034,1113,-30}, {4034,1175,-30}, {4034,1411,-80}, {4034,1632,-10}, {4034,1633,-10}, {4034,1647,-10}, {4034,1657,-10}, {4034,1664,-10}, {4034,2797,-25}, {4034,2798,-25}, {4034,2812,-25}, {4034,2822,-25}, {4034,2829,-25}, {4034,2902,-25}, {4034,2910,-25}, {4034,2998,-80}, {4037,736,-30}, {4037,738,-30}, {4037,760,-30}, {4037,777,-30}, {4037,1032,-30}, {4037,1113,-30}, {4037,1175,-30}, {4037,1411,-80}, {4037,1632,-10}, {4037,1633,-10}, {4037,1647,-10}, {4037,1657,-10}, {4037,1664,-10}, {4037,2797,-25}, {4037,2798,-25}, {4037,2812,-25}, {4037,2822,-25}, {4037,2829,-25}, {4037,2902,-25}, {4037,2910,-25}, {4037,2998,-80}, {4053,736,-30}, {4053,738,-30}, {4053,760,-30}, {4053,777,-30}, {4053,1032,-30}, {4053,1113,-30}, {4053,1175,-30}, {4053,1411,-80}, {4053,1632,-10}, {4053,1633,-10}, {4053,1647,-10}, {4053,1657,-10}, {4053,1664,-10}, {4053,2797,-25}, {4053,2798,-25}, {4053,2812,-25}, {4053,2822,-25}, {4053,2829,-25}, {4053,2902,-25}, {4053,2910,-25}, {4053,2998,-80}, {4135,1632,10}, {4135,1633,10}, {4135,1647,10}, {4135,1657,10}, {4135,1664,10}, {4156,1632,10}, {4156,1633,10}, {4156,1647,10}, {4156,1657,10}, {4156,1664,10}, {NOGLYPH,NOGLYPH,0} }; static const ligature helvetica_boldoblique_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair courier_kerns[] = { {NOGLYPH,NOGLYPH,0} }; static const ligature courier_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair courier_oblique_kerns[] = { {NOGLYPH,NOGLYPH,0} }; static const ligature courier_oblique_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair courier_bold_kerns[] = { {NOGLYPH,NOGLYPH,0} }; static const ligature courier_bold_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const kern_pair courier_boldoblique_kerns[] = { {NOGLYPH,NOGLYPH,0} }; static const ligature courier_boldoblique_ligs[] = { {1789,2134,1809}, {1789,2418,1852}, {NOGLYPH,NOGLYPH,NOGLYPH} }; static const struct ps_std_font_data { char const *name; kern_pair const *kerns; ligature const *ligs; int widths[lenof(ps_std_glyphs)-1]; } ps_std_fonts[] = { { "Times-Roman", times_roman_kerns, times_roman_ligs, { 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 889, 722, 722, 722, 722, 722, 722, 667, 611, 611, 611, 611, 722, 333, 333, 333, 333, 611, 722, 889, 722, 722, 722, 722, 722, 722, 556, 556, 722, 722, 722, 722, 722, 722, 611, 667, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 500, 278, 278, 278, 278, 278, 500, 722, 500, 500, 500, 500, 500, 500, 389, 500, 500, 500, 500, 500, 500, 500, 444, 333, 778, 469, 541, 500, 921, 278, 200, 480, 480, 333, 333, 333, 200, 350, 333, 333, 500, 333, 278, 250, 760, 500, 500, 500, 400, 333, 564, 500, 333, 278, 500, 1000, 1000, 500, 564, 333, 333, 556, 500, 556, 500, 500, 167, 500, 333, 564, 500, 500, 333, 333, 333, 333, 564, 564, 333, 564, 500, 564, 500, 500, 333, 500, 750, 750, 300, 276, 310, 453, 333, 333, 833, 250, 250, 1000, 564, 564, 444, 444, 408, 444, 444, 444, 333, 333, 333, 180, 760, 333, 500, 278, 500, 500, 278, 250, 500, 500, 750, 300, 333, 980, 500, 300, 500, 500, 500, }}, { "Times-Italic", times_italic_kerns, times_italic_ligs, { 611, 611, 667, 722, 611, 611, 722, 722, 333, 444, 667, 556, 833, 667, 722, 611, 722, 611, 500, 556, 722, 611, 833, 611, 556, 556, 500, 500, 444, 500, 444, 278, 500, 500, 278, 278, 444, 278, 722, 500, 500, 500, 500, 389, 389, 278, 500, 444, 667, 444, 444, 389, 889, 611, 611, 611, 611, 611, 611, 667, 611, 611, 611, 611, 722, 333, 333, 333, 333, 556, 667, 944, 722, 722, 722, 722, 722, 722, 500, 611, 722, 722, 722, 722, 556, 556, 556, 667, 500, 500, 500, 500, 500, 500, 444, 444, 444, 444, 444, 500, 278, 278, 278, 278, 278, 500, 667, 500, 500, 500, 500, 500, 500, 389, 500, 500, 500, 500, 500, 444, 444, 389, 333, 778, 422, 541, 500, 920, 278, 275, 400, 400, 389, 389, 333, 275, 350, 333, 333, 500, 333, 333, 250, 760, 500, 500, 500, 400, 333, 675, 500, 333, 278, 500, 889, 889, 500, 675, 333, 389, 500, 500, 500, 500, 500, 167, 500, 333, 675, 500, 500, 333, 333, 333, 333, 675, 675, 333, 675, 500, 675, 500, 500, 333, 500, 750, 750, 300, 276, 310, 523, 333, 333, 833, 250, 250, 1000, 675, 675, 500, 500, 420, 556, 556, 556, 333, 333, 333, 214, 760, 333, 500, 333, 500, 500, 278, 250, 500, 500, 750, 300, 333, 980, 500, 300, 500, 500, 500, }}, { "Times-Bold", times_bold_kerns, times_bold_ligs, { 722, 667, 722, 722, 667, 611, 778, 778, 389, 500, 778, 667, 944, 722, 778, 611, 778, 722, 556, 667, 722, 722, 1000, 722, 722, 667, 500, 556, 444, 556, 444, 333, 500, 556, 278, 333, 556, 278, 833, 556, 500, 556, 556, 444, 389, 333, 556, 500, 722, 500, 500, 444, 1000, 722, 722, 722, 722, 722, 722, 722, 667, 667, 667, 667, 722, 389, 389, 389, 389, 667, 722, 1000, 778, 778, 778, 778, 778, 778, 556, 611, 722, 722, 722, 722, 722, 722, 667, 722, 500, 500, 500, 500, 500, 500, 444, 444, 444, 444, 444, 500, 278, 278, 278, 278, 278, 556, 722, 500, 500, 500, 500, 500, 500, 389, 556, 556, 556, 556, 556, 500, 500, 444, 333, 833, 581, 520, 500, 930, 278, 220, 394, 394, 333, 333, 333, 220, 350, 333, 333, 500, 333, 333, 250, 747, 500, 500, 500, 400, 333, 570, 500, 333, 278, 500, 1000, 1000, 500, 570, 333, 333, 556, 500, 556, 500, 500, 167, 556, 333, 570, 500, 500, 333, 333, 333, 333, 570, 570, 333, 570, 556, 570, 500, 500, 333, 500, 750, 750, 300, 300, 330, 540, 333, 333, 1000, 250, 250, 1000, 570, 570, 500, 500, 555, 500, 500, 500, 333, 333, 333, 278, 747, 333, 500, 333, 500, 500, 278, 250, 500, 500, 750, 300, 333, 1000, 500, 300, 500, 500, 500, }}, { "Times-BoldItalic", times_bolditalic_kerns, times_bolditalic_ligs, { 667, 667, 667, 722, 667, 667, 722, 778, 389, 500, 667, 611, 889, 722, 722, 611, 722, 667, 556, 611, 722, 667, 889, 667, 611, 611, 500, 500, 444, 500, 444, 333, 500, 556, 278, 278, 500, 278, 778, 556, 500, 500, 500, 389, 389, 278, 556, 444, 667, 500, 444, 389, 944, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 389, 389, 389, 389, 611, 722, 944, 722, 722, 722, 722, 722, 722, 556, 611, 722, 722, 722, 722, 611, 611, 611, 722, 500, 500, 500, 500, 500, 500, 444, 444, 444, 444, 444, 500, 278, 278, 278, 278, 278, 556, 722, 500, 500, 500, 500, 500, 500, 389, 500, 556, 556, 556, 556, 444, 444, 389, 333, 778, 570, 570, 500, 832, 278, 220, 348, 348, 333, 333, 333, 220, 350, 333, 333, 500, 333, 333, 250, 747, 500, 500, 500, 400, 333, 570, 500, 333, 278, 500, 1000, 1000, 500, 570, 389, 389, 556, 500, 556, 500, 500, 167, 500, 333, 570, 500, 500, 333, 333, 333, 333, 570, 606, 333, 606, 576, 570, 500, 500, 333, 500, 750, 750, 300, 266, 300, 500, 333, 333, 833, 250, 250, 1000, 570, 570, 500, 500, 555, 500, 500, 500, 333, 333, 333, 278, 747, 333, 500, 333, 500, 500, 278, 250, 500, 500, 750, 300, 333, 1000, 500, 300, 500, 500, 500, }}, { "Helvetica", helvetica_kerns, helvetica_ligs, { 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 1000, 667, 667, 667, 667, 667, 667, 722, 667, 667, 667, 667, 722, 278, 278, 278, 278, 556, 722, 1000, 778, 778, 778, 778, 778, 778, 667, 667, 722, 722, 722, 722, 667, 667, 611, 889, 556, 556, 556, 556, 556, 556, 500, 556, 556, 556, 556, 556, 278, 278, 278, 278, 222, 556, 944, 556, 556, 556, 556, 611, 556, 500, 556, 556, 556, 556, 556, 500, 500, 500, 333, 667, 469, 584, 389, 1015, 278, 260, 334, 334, 278, 278, 333, 260, 350, 333, 333, 556, 333, 278, 278, 737, 556, 556, 556, 400, 333, 584, 556, 333, 278, 556, 1000, 1000, 556, 584, 278, 333, 500, 556, 500, 556, 556, 167, 611, 333, 584, 556, 556, 333, 333, 333, 333, 584, 584, 333, 584, 556, 584, 556, 556, 333, 556, 834, 834, 333, 370, 365, 537, 333, 333, 889, 278, 278, 1000, 584, 584, 556, 611, 355, 333, 333, 333, 222, 222, 222, 191, 737, 333, 556, 278, 556, 556, 278, 278, 556, 556, 834, 333, 333, 1000, 556, 333, 556, 556, 556, }}, { "Helvetica-Oblique", helvetica_oblique_kerns, helvetica_oblique_ligs, { 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 1000, 667, 667, 667, 667, 667, 667, 722, 667, 667, 667, 667, 722, 278, 278, 278, 278, 556, 722, 1000, 778, 778, 778, 778, 778, 778, 667, 667, 722, 722, 722, 722, 667, 667, 611, 889, 556, 556, 556, 556, 556, 556, 500, 556, 556, 556, 556, 556, 278, 278, 278, 278, 222, 556, 944, 556, 556, 556, 556, 611, 556, 500, 556, 556, 556, 556, 556, 500, 500, 500, 333, 667, 469, 584, 389, 1015, 278, 260, 334, 334, 278, 278, 333, 260, 350, 333, 333, 556, 333, 278, 278, 737, 556, 556, 556, 400, 333, 584, 556, 333, 278, 556, 1000, 1000, 556, 584, 278, 333, 500, 556, 500, 556, 556, 167, 611, 333, 584, 556, 556, 333, 333, 333, 333, 584, 584, 333, 584, 556, 584, 556, 556, 333, 556, 834, 834, 333, 370, 365, 537, 333, 333, 889, 278, 278, 1000, 584, 584, 556, 611, 355, 333, 333, 333, 222, 222, 222, 191, 737, 333, 556, 278, 556, 556, 278, 278, 556, 556, 834, 333, 333, 1000, 556, 333, 556, 556, 556, }}, { "Helvetica-Bold", helvetica_bold_kerns, helvetica_bold_ligs, { 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 1000, 722, 722, 722, 722, 722, 722, 722, 667, 667, 667, 667, 722, 278, 278, 278, 278, 611, 722, 1000, 778, 778, 778, 778, 778, 778, 667, 667, 722, 722, 722, 722, 667, 667, 611, 889, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 611, 278, 278, 278, 278, 278, 611, 944, 611, 611, 611, 611, 611, 611, 556, 611, 611, 611, 611, 611, 556, 556, 500, 333, 722, 584, 584, 389, 975, 278, 280, 389, 389, 333, 333, 333, 280, 350, 333, 333, 556, 333, 333, 278, 737, 556, 556, 556, 400, 333, 584, 556, 333, 278, 556, 1000, 1000, 556, 584, 333, 333, 611, 556, 611, 556, 556, 167, 611, 333, 584, 556, 556, 333, 333, 333, 333, 584, 584, 333, 584, 611, 584, 556, 556, 333, 556, 834, 834, 333, 370, 365, 556, 333, 333, 889, 278, 278, 1000, 584, 584, 611, 611, 474, 500, 500, 500, 278, 278, 278, 238, 737, 333, 556, 333, 556, 556, 278, 278, 556, 556, 834, 333, 333, 1000, 556, 333, 556, 556, 556, }}, { "Helvetica-BoldOblique", helvetica_boldoblique_kerns, helvetica_boldoblique_ligs, { 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 1000, 722, 722, 722, 722, 722, 722, 722, 667, 667, 667, 667, 722, 278, 278, 278, 278, 611, 722, 1000, 778, 778, 778, 778, 778, 778, 667, 667, 722, 722, 722, 722, 667, 667, 611, 889, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 611, 278, 278, 278, 278, 278, 611, 944, 611, 611, 611, 611, 611, 611, 556, 611, 611, 611, 611, 611, 556, 556, 500, 333, 722, 584, 584, 389, 975, 278, 280, 389, 389, 333, 333, 333, 280, 350, 333, 333, 556, 333, 333, 278, 737, 556, 556, 556, 400, 333, 584, 556, 333, 278, 556, 1000, 1000, 556, 584, 333, 333, 611, 556, 611, 556, 556, 167, 611, 333, 584, 556, 556, 333, 333, 333, 333, 584, 584, 333, 584, 611, 584, 556, 556, 333, 556, 834, 834, 333, 370, 365, 556, 333, 333, 889, 278, 278, 1000, 584, 584, 611, 611, 474, 500, 500, 500, 278, 278, 278, 238, 737, 333, 556, 333, 556, 556, 278, 278, 556, 556, 834, 333, 333, 1000, 556, 333, 556, 556, 556, }}, { "Courier", courier_kerns, courier_ligs, { 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, }}, { "Courier-Oblique", courier_oblique_kerns, courier_oblique_ligs, { 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, }}, { "Courier-Bold", courier_bold_kerns, courier_bold_ligs, { 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, }}, { "Courier-BoldOblique", courier_boldoblique_kerns, courier_boldoblique_ligs, { 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, }}, }; void init_std_fonts(void) { int i, j; ligature const *lig; kern_pair const *kern; static int done = FALSE; if (done) return; for (i = 0; i < (int)lenof(ps_std_fonts); i++) { font_info *fi = snew(font_info); fi->fontfile = NULL; fi->name = ps_std_fonts[i].name; fi->widths = newtree234(width_cmp); for (j = 0; j < (int)lenof(fi->bmp); j++) fi->bmp[j] = NOGLYPH; for (j = 0; j < (int)lenof(ps_std_glyphs) - 1; j++) { glyph_width *w = snew(glyph_width); wchar_t ucs; w->glyph = glyph_intern(ps_std_glyphs[j]); w->width = ps_std_fonts[i].widths[j]; add234(fi->widths, w); ucs = ps_glyph_to_unicode(w->glyph); assert(ucs != 0xFFFF); fi->bmp[ucs] = w->glyph; } fi->kerns = newtree234(kern_cmp); for (kern = ps_std_fonts[i].kerns; kern->left != NOGLYPH; kern++) add234(fi->kerns, (void *)kern); fi->ligs = newtree234(lig_cmp); for (lig = ps_std_fonts[i].ligs; lig->left != NOGLYPH; lig++) add234(fi->ligs, (void *)lig); fi->next = all_fonts; all_fonts = fi; } done = TRUE; } const int *ps_std_font_widths(char const *fontname) { int i; for (i = 0; i < (int)lenof(ps_std_fonts); i++) if (!strcmp(ps_std_fonts[i].name, fontname)) return ps_std_fonts[i].widths; return NULL; } const kern_pair *ps_std_font_kerns(char const *fontname) { int i; for (i = 0; i < (int)lenof(ps_std_fonts); i++) if (!strcmp(ps_std_fonts[i].name, fontname)) return ps_std_fonts[i].kerns; return NULL; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/release.sh������������������������������������������������������������������������������0000755�0001753�0001753�00000001556�12444773746�011742� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # Make a Halibut release archive. RELDIR="$1" VERSION="$2" linkmirror() { (cd "$1"; find . -name CVS -prune -o -name .svn -prune -o \ -name build -prune -o -name reltmp -prune -o -type d -print) | \ while read dir; do mkdir -p "$2"/"$dir"; done (cd "$1"; find . -name CVS -prune -o -name .svn -prune -o \ -name build -prune -o -name reltmp -prune -o \ -name '*.orig' -prune -o -name '*.rej' -prune -o \ -name '*.txt' -prune -o -name '*.html' -prune -o \ -name '*.1' -prune -o -name '.cvsignore' -prune -o \ -name '*.gz' -prune -o -name '.[^.]*' -prune -o \ -type f -print) | \ while read file; do ln -s "$1"/"$file" "$2"/"$file"; done } linkmirror $PWD reltmp/$RELDIR if ! test -d charset; then linkmirror $PWD/../charset reltmp/$RELDIR/charset fi tar chzvoCf reltmp $RELDIR.tar.gz $RELDIR rm -rf reltmp ��������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/tree234.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000175176�12444773746�011331� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * tree234.c: reasonably generic counted 2-3-4 tree routines. * * This file is copyright 1999-2001 Simon Tatham. * * 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 SIMON TATHAM 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. */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "tree234.h" #define smalloc malloc #define sfree free #define snew(typ) ( (typ *) smalloc (sizeof (typ)) ) #ifdef TEST #define LOG(x) (printf x) #else #define LOG(x) #endif typedef struct node234_Tag node234; struct tree234_Tag { node234 *root; cmpfn234 cmp; }; struct node234_Tag { node234 *parent; node234 *kids[4]; int counts[4]; void *elems[3]; }; /* * Create a 2-3-4 tree. */ tree234 *newtree234(cmpfn234 cmp) { tree234 *ret = snew(tree234); LOG(("created tree %p\n", ret)); ret->root = NULL; ret->cmp = cmp; return ret; } /* * Free a 2-3-4 tree (not including freeing the elements). */ static void freenode234(node234 *n) { if (!n) return; freenode234(n->kids[0]); freenode234(n->kids[1]); freenode234(n->kids[2]); freenode234(n->kids[3]); sfree(n); } void freetree234(tree234 *t) { freenode234(t->root); sfree(t); } /* * Internal function to count a node. */ static int countnode234(node234 *n) { int count = 0; int i; if (!n) return 0; for (i = 0; i < 4; i++) count += n->counts[i]; for (i = 0; i < 3; i++) if (n->elems[i]) count++; return count; } /* * Count the elements in a tree. */ int count234(tree234 *t) { if (t->root) return countnode234(t->root); else return 0; } /* * Propagate a node overflow up a tree until it stops. Returns 0 or * 1, depending on whether the root had to be split or not. */ static int add234_insert(node234 *left, void *e, node234 *right, node234 **root, node234 *n, int ki) { int lcount, rcount; /* * We need to insert the new left/element/right set in n at * child position ki. */ lcount = countnode234(left); rcount = countnode234(right); while (n) { LOG((" at %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" need to insert %p/%d \"%s\" %p/%d at position %d\n", left, lcount, e, right, rcount, ki)); if (n->elems[1] == NULL) { /* * Insert in a 2-node; simple. */ if (ki == 0) { LOG((" inserting on left of 2-node\n")); n->kids[2] = n->kids[1]; n->counts[2] = n->counts[1]; n->elems[1] = n->elems[0]; n->kids[1] = right; n->counts[1] = rcount; n->elems[0] = e; n->kids[0] = left; n->counts[0] = lcount; } else { /* ki == 1 */ LOG((" inserting on right of 2-node\n")); n->kids[2] = right; n->counts[2] = rcount; n->elems[1] = e; n->kids[1] = left; n->counts[1] = lcount; } if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; if (n->kids[2]) n->kids[2]->parent = n; LOG((" done\n")); break; } else if (n->elems[2] == NULL) { /* * Insert in a 3-node; simple. */ if (ki == 0) { LOG((" inserting on left of 3-node\n")); n->kids[3] = n->kids[2]; n->counts[3] = n->counts[2]; n->elems[2] = n->elems[1]; n->kids[2] = n->kids[1]; n->counts[2] = n->counts[1]; n->elems[1] = n->elems[0]; n->kids[1] = right; n->counts[1] = rcount; n->elems[0] = e; n->kids[0] = left; n->counts[0] = lcount; } else if (ki == 1) { LOG((" inserting in middle of 3-node\n")); n->kids[3] = n->kids[2]; n->counts[3] = n->counts[2]; n->elems[2] = n->elems[1]; n->kids[2] = right; n->counts[2] = rcount; n->elems[1] = e; n->kids[1] = left; n->counts[1] = lcount; } else { /* ki == 2 */ LOG((" inserting on right of 3-node\n")); n->kids[3] = right; n->counts[3] = rcount; n->elems[2] = e; n->kids[2] = left; n->counts[2] = lcount; } if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; if (n->kids[2]) n->kids[2]->parent = n; if (n->kids[3]) n->kids[3]->parent = n; LOG((" done\n")); break; } else { node234 *m = snew(node234); m->parent = n->parent; LOG((" splitting a 4-node; created new node %p\n", m)); /* * Insert in a 4-node; split into a 2-node and a * 3-node, and move focus up a level. * * I don't think it matters which way round we put the * 2 and the 3. For simplicity, we'll put the 3 first * always. */ if (ki == 0) { m->kids[0] = left; m->counts[0] = lcount; m->elems[0] = e; m->kids[1] = right; m->counts[1] = rcount; m->elems[1] = n->elems[0]; m->kids[2] = n->kids[1]; m->counts[2] = n->counts[1]; e = n->elems[1]; n->kids[0] = n->kids[2]; n->counts[0] = n->counts[2]; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; n->counts[1] = n->counts[3]; } else if (ki == 1) { m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = left; m->counts[1] = lcount; m->elems[1] = e; m->kids[2] = right; m->counts[2] = rcount; e = n->elems[1]; n->kids[0] = n->kids[2]; n->counts[0] = n->counts[2]; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; n->counts[1] = n->counts[3]; } else if (ki == 2) { m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = n->kids[1]; m->counts[1] = n->counts[1]; m->elems[1] = n->elems[1]; m->kids[2] = left; m->counts[2] = lcount; /* e = e; */ n->kids[0] = right; n->counts[0] = rcount; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; n->counts[1] = n->counts[3]; } else { /* ki == 3 */ m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = n->kids[1]; m->counts[1] = n->counts[1]; m->elems[1] = n->elems[1]; m->kids[2] = n->kids[2]; m->counts[2] = n->counts[2]; n->kids[0] = left; n->counts[0] = lcount; n->elems[0] = e; n->kids[1] = right; n->counts[1] = rcount; e = n->elems[2]; } m->kids[3] = n->kids[3] = n->kids[2] = NULL; m->counts[3] = n->counts[3] = n->counts[2] = 0; m->elems[2] = n->elems[2] = n->elems[1] = NULL; if (m->kids[0]) m->kids[0]->parent = m; if (m->kids[1]) m->kids[1]->parent = m; if (m->kids[2]) m->kids[2]->parent = m; if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; LOG((" left (%p): %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", m, m->kids[0], m->counts[0], m->elems[0], m->kids[1], m->counts[1], m->elems[1], m->kids[2], m->counts[2])); LOG((" right (%p): %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1])); left = m; lcount = countnode234(left); right = n; rcount = countnode234(right); } if (n->parent) ki = (n->parent->kids[0] == n ? 0 : n->parent->kids[1] == n ? 1 : n->parent->kids[2] == n ? 2 : 3); n = n->parent; } /* * If we've come out of here by `break', n will still be * non-NULL and all we need to do is go back up the tree * updating counts. If we've come here because n is NULL, we * need to create a new root for the tree because the old one * has just split into two. */ if (n) { while (n->parent) { int count = countnode234(n); int childnum; childnum = (n->parent->kids[0] == n ? 0 : n->parent->kids[1] == n ? 1 : n->parent->kids[2] == n ? 2 : 3); n->parent->counts[childnum] = count; n = n->parent; } return 0; /* root unchanged */ } else { LOG((" root is overloaded, split into two\n")); (*root) = snew(node234); (*root)->kids[0] = left; (*root)->counts[0] = lcount; (*root)->elems[0] = e; (*root)->kids[1] = right; (*root)->counts[1] = rcount; (*root)->elems[1] = NULL; (*root)->kids[2] = NULL; (*root)->counts[2] = 0; (*root)->elems[2] = NULL; (*root)->kids[3] = NULL; (*root)->counts[3] = 0; (*root)->parent = NULL; if ((*root)->kids[0]) (*root)->kids[0]->parent = (*root); if ((*root)->kids[1]) (*root)->kids[1]->parent = (*root); LOG((" new root is %p/%d \"%s\" %p/%d\n", (*root)->kids[0], (*root)->counts[0], (*root)->elems[0], (*root)->kids[1], (*root)->counts[1])); return 1; /* root moved */ } } /* * Add an element e to a 2-3-4 tree t. Returns e on success, or if * an existing element compares equal, returns that. */ static void *add234_internal(tree234 *t, void *e, int index) { node234 *n; int ki; void *orig_e = e; int c; LOG(("adding element \"%s\" to tree %p\n", e, t)); if (t->root == NULL) { t->root = snew(node234); t->root->elems[1] = t->root->elems[2] = NULL; t->root->kids[0] = t->root->kids[1] = NULL; t->root->kids[2] = t->root->kids[3] = NULL; t->root->counts[0] = t->root->counts[1] = 0; t->root->counts[2] = t->root->counts[3] = 0; t->root->parent = NULL; t->root->elems[0] = e; LOG((" created root %p\n", t->root)); return orig_e; } n = t->root; while (n) { LOG((" node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); if (index >= 0) { if (!n->kids[0]) { /* * Leaf node. We want to insert at kid position * equal to the index: * * 0 A 1 B 2 C 3 */ ki = index; } else { /* * Internal node. We always descend through it (add * always starts at the bottom, never in the * middle). */ if (index <= n->counts[0]) { ki = 0; } else if (index -= n->counts[0] + 1, index <= n->counts[1]) { ki = 1; } else if (index -= n->counts[1] + 1, index <= n->counts[2]) { ki = 2; } else if (index -= n->counts[2] + 1, index <= n->counts[3]) { ki = 3; } else return NULL; /* error: index out of range */ } } else { if ((c = t->cmp(e, n->elems[0])) < 0) ki = 0; else if (c == 0) return n->elems[0]; /* already exists */ else if (n->elems[1] == NULL || (c = t->cmp(e, n->elems[1])) < 0) ki = 1; else if (c == 0) return n->elems[1]; /* already exists */ else if (n->elems[2] == NULL || (c = t->cmp(e, n->elems[2])) < 0) ki = 2; else if (c == 0) return n->elems[2]; /* already exists */ else ki = 3; } LOG((" moving to child %d (%p)\n", ki, n->kids[ki])); if (!n->kids[ki]) break; n = n->kids[ki]; } add234_insert(NULL, e, NULL, &t->root, n, ki); return orig_e; } void *add234(tree234 *t, void *e) { if (!t->cmp) /* tree is unsorted */ return NULL; return add234_internal(t, e, -1); } void *addpos234(tree234 *t, void *e, int index) { if (index < 0 || /* index out of range */ t->cmp) /* tree is sorted */ return NULL; /* return failure */ return add234_internal(t, e, index); /* this checks the upper bound */ } /* * Look up the element at a given numeric index in a 2-3-4 tree. * Returns NULL if the index is out of range. */ void *index234(tree234 *t, int index) { node234 *n; if (!t->root) return NULL; /* tree is empty */ if (index < 0 || index >= countnode234(t->root)) return NULL; /* out of range */ n = t->root; while (n) { if (index < n->counts[0]) n = n->kids[0]; else if (index -= n->counts[0] + 1, index < 0) return n->elems[0]; else if (index < n->counts[1]) n = n->kids[1]; else if (index -= n->counts[1] + 1, index < 0) return n->elems[1]; else if (index < n->counts[2]) n = n->kids[2]; else if (index -= n->counts[2] + 1, index < 0) return n->elems[2]; else n = n->kids[3]; } /* We shouldn't ever get here. I wonder how we did. */ return NULL; } /* * Find an element e in a sorted 2-3-4 tree t. Returns NULL if not * found. e is always passed as the first argument to cmp, so cmp * can be an asymmetric function if desired. cmp can also be passed * as NULL, in which case the compare function from the tree proper * will be used. */ void *findrelpos234(tree234 *t, void *e, cmpfn234 cmp, int relation, int *index) { node234 *n; void *ret; int c; int idx, ecount, kcount, cmpret; if (t->root == NULL) return NULL; if (cmp == NULL) cmp = t->cmp; n = t->root; /* * Attempt to find the element itself. */ idx = 0; ecount = -1; /* * Prepare a fake `cmp' result if e is NULL. */ cmpret = 0; if (e == NULL) { assert(relation == REL234_LT || relation == REL234_GT); if (relation == REL234_LT) cmpret = +1; /* e is a max: always greater */ else if (relation == REL234_GT) cmpret = -1; /* e is a min: always smaller */ } while (1) { for (kcount = 0; kcount < 4; kcount++) { if (kcount >= 3 || n->elems[kcount] == NULL || (c = cmpret ? cmpret : cmp(e, n->elems[kcount])) < 0) { break; } if (n->kids[kcount]) idx += n->counts[kcount]; if (c == 0) { ecount = kcount; break; } idx++; } if (ecount >= 0) break; if (n->kids[kcount]) n = n->kids[kcount]; else break; } if (ecount >= 0) { /* * We have found the element we're looking for. It's * n->elems[ecount], at tree index idx. If our search * relation is EQ, LE or GE we can now go home. */ if (relation != REL234_LT && relation != REL234_GT) { if (index) *index = idx; return n->elems[ecount]; } /* * Otherwise, we'll do an indexed lookup for the previous * or next element. (It would be perfectly possible to * implement these search types in a non-counted tree by * going back up from where we are, but far more fiddly.) */ if (relation == REL234_LT) idx--; else idx++; } else { /* * We've found our way to the bottom of the tree and we * know where we would insert this node if we wanted to: * we'd put it in in place of the (empty) subtree * n->kids[kcount], and it would have index idx * * But the actual element isn't there. So if our search * relation is EQ, we're doomed. */ if (relation == REL234_EQ) return NULL; /* * Otherwise, we must do an index lookup for index idx-1 * (if we're going left - LE or LT) or index idx (if we're * going right - GE or GT). */ if (relation == REL234_LT || relation == REL234_LE) { idx--; } } /* * We know the index of the element we want; just call index234 * to do the rest. This will return NULL if the index is out of * bounds, which is exactly what we want. */ ret = index234(t, idx); if (ret && index) *index = idx; return ret; } void *find234(tree234 *t, void *e, cmpfn234 cmp) { return findrelpos234(t, e, cmp, REL234_EQ, NULL); } void *findrel234(tree234 *t, void *e, cmpfn234 cmp, int relation) { return findrelpos234(t, e, cmp, relation, NULL); } void *findpos234(tree234 *t, void *e, cmpfn234 cmp, int *index) { return findrelpos234(t, e, cmp, REL234_EQ, index); } /* * Tree transformation used in delete and split: move a subtree * right, from child ki of a node to the next child. Update k and * index so that they still point to the same place in the * transformed tree. Assumes the destination child is not full, and * that the source child does have a subtree to spare. Can cope if * the destination child is undersized. * * . C . . B . * / \ -> / \ * [more] a A b B c d D e [more] a A b c C d D e * * . C . . B . * / \ -> / \ * [more] a A b B c d [more] a A b c C d */ static void trans234_subtree_right(node234 *n, int ki, int *k, int *index) { node234 *src, *dest; int i, srclen, adjust; src = n->kids[ki]; dest = n->kids[ki+1]; LOG((" trans234_subtree_right(%p, %d):\n", n, ki)); LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" src %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", src, src->kids[0], src->counts[0], src->elems[0], src->kids[1], src->counts[1], src->elems[1], src->kids[2], src->counts[2], src->elems[2], src->kids[3], src->counts[3])); LOG((" dest %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", dest, dest->kids[0], dest->counts[0], dest->elems[0], dest->kids[1], dest->counts[1], dest->elems[1], dest->kids[2], dest->counts[2], dest->elems[2], dest->kids[3], dest->counts[3])); /* * Move over the rest of the destination node to make space. */ dest->kids[3] = dest->kids[2]; dest->counts[3] = dest->counts[2]; dest->elems[2] = dest->elems[1]; dest->kids[2] = dest->kids[1]; dest->counts[2] = dest->counts[1]; dest->elems[1] = dest->elems[0]; dest->kids[1] = dest->kids[0]; dest->counts[1] = dest->counts[0]; /* which element to move over */ i = (src->elems[2] ? 2 : src->elems[1] ? 1 : 0); dest->elems[0] = n->elems[ki]; n->elems[ki] = src->elems[i]; src->elems[i] = NULL; dest->kids[0] = src->kids[i+1]; dest->counts[0] = src->counts[i+1]; src->kids[i+1] = NULL; src->counts[i+1] = 0; if (dest->kids[0]) dest->kids[0]->parent = dest; adjust = dest->counts[0] + 1; n->counts[ki] -= adjust; n->counts[ki+1] += adjust; srclen = n->counts[ki]; if (k) { LOG((" before: k,index = %d,%d\n", (*k), (*index))); if ((*k) == ki && (*index) > srclen) { (*index) -= srclen + 1; (*k)++; } else if ((*k) == ki+1) { (*index) += adjust; } LOG((" after: k,index = %d,%d\n", (*k), (*index))); } LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" src %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", src, src->kids[0], src->counts[0], src->elems[0], src->kids[1], src->counts[1], src->elems[1], src->kids[2], src->counts[2], src->elems[2], src->kids[3], src->counts[3])); LOG((" dest %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", dest, dest->kids[0], dest->counts[0], dest->elems[0], dest->kids[1], dest->counts[1], dest->elems[1], dest->kids[2], dest->counts[2], dest->elems[2], dest->kids[3], dest->counts[3])); } /* * Tree transformation used in delete and split: move a subtree * left, from child ki of a node to the previous child. Update k * and index so that they still point to the same place in the * transformed tree. Assumes the destination child is not full, and * that the source child does have a subtree to spare. Can cope if * the destination child is undersized. * * . B . . C . * / \ -> / \ * a A b c C d D e [more] a A b B c d D e [more] * * . A . . B . * / \ -> / \ * a b B c C d [more] a A b c C d [more] */ static void trans234_subtree_left(node234 *n, int ki, int *k, int *index) { node234 *src, *dest; int i, adjust; src = n->kids[ki]; dest = n->kids[ki-1]; LOG((" trans234_subtree_left(%p, %d):\n", n, ki)); LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" dest %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", dest, dest->kids[0], dest->counts[0], dest->elems[0], dest->kids[1], dest->counts[1], dest->elems[1], dest->kids[2], dest->counts[2], dest->elems[2], dest->kids[3], dest->counts[3])); LOG((" src %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", src, src->kids[0], src->counts[0], src->elems[0], src->kids[1], src->counts[1], src->elems[1], src->kids[2], src->counts[2], src->elems[2], src->kids[3], src->counts[3])); /* where in dest to put it */ i = (dest->elems[1] ? 2 : dest->elems[0] ? 1 : 0); dest->elems[i] = n->elems[ki-1]; n->elems[ki-1] = src->elems[0]; dest->kids[i+1] = src->kids[0]; dest->counts[i+1] = src->counts[0]; if (dest->kids[i+1]) dest->kids[i+1]->parent = dest; /* * Move over the rest of the source node. */ src->kids[0] = src->kids[1]; src->counts[0] = src->counts[1]; src->elems[0] = src->elems[1]; src->kids[1] = src->kids[2]; src->counts[1] = src->counts[2]; src->elems[1] = src->elems[2]; src->kids[2] = src->kids[3]; src->counts[2] = src->counts[3]; src->elems[2] = NULL; src->kids[3] = NULL; src->counts[3] = 0; adjust = dest->counts[i+1] + 1; n->counts[ki] -= adjust; n->counts[ki-1] += adjust; if (k) { LOG((" before: k,index = %d,%d\n", (*k), (*index))); if ((*k) == ki) { (*index) -= adjust; if ((*index) < 0) { (*index) += n->counts[ki-1] + 1; (*k)--; } } LOG((" after: k,index = %d,%d\n", (*k), (*index))); } LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" dest %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", dest, dest->kids[0], dest->counts[0], dest->elems[0], dest->kids[1], dest->counts[1], dest->elems[1], dest->kids[2], dest->counts[2], dest->elems[2], dest->kids[3], dest->counts[3])); LOG((" src %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", src, src->kids[0], src->counts[0], src->elems[0], src->kids[1], src->counts[1], src->elems[1], src->kids[2], src->counts[2], src->elems[2], src->kids[3], src->counts[3])); } /* * Tree transformation used in delete and split: merge child nodes * ki and ki+1 of a node. Update k and index so that they still * point to the same place in the transformed tree. Assumes both * children _are_ sufficiently small. * * . B . . * / \ -> | * a A b c C d a A b B c C d * * This routine can also cope with either child being undersized: * * . A . . * / \ -> | * a b B c a A b B c * * . A . . * / \ -> | * a b B c C d a A b B c C d */ static void trans234_subtree_merge(node234 *n, int ki, int *k, int *index) { node234 *left, *right; int i, leftlen, rightlen, lsize, rsize; left = n->kids[ki]; leftlen = n->counts[ki]; right = n->kids[ki+1]; rightlen = n->counts[ki+1]; LOG((" trans234_subtree_merge(%p, %d):\n", n, ki)); LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" left %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", left, left->kids[0], left->counts[0], left->elems[0], left->kids[1], left->counts[1], left->elems[1], left->kids[2], left->counts[2], left->elems[2], left->kids[3], left->counts[3])); LOG((" right %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", right, right->kids[0], right->counts[0], right->elems[0], right->kids[1], right->counts[1], right->elems[1], right->kids[2], right->counts[2], right->elems[2], right->kids[3], right->counts[3])); assert(!left->elems[2] && !right->elems[2]); /* neither is large! */ lsize = (left->elems[1] ? 2 : left->elems[0] ? 1 : 0); rsize = (right->elems[1] ? 2 : right->elems[0] ? 1 : 0); left->elems[lsize] = n->elems[ki]; for (i = 0; i < rsize+1; i++) { left->kids[lsize+1+i] = right->kids[i]; left->counts[lsize+1+i] = right->counts[i]; if (left->kids[lsize+1+i]) left->kids[lsize+1+i]->parent = left; if (i < rsize) left->elems[lsize+1+i] = right->elems[i]; } n->counts[ki] += rightlen + 1; sfree(right); /* * Move the rest of n up by one. */ for (i = ki+1; i < 3; i++) { n->kids[i] = n->kids[i+1]; n->counts[i] = n->counts[i+1]; } for (i = ki; i < 2; i++) { n->elems[i] = n->elems[i+1]; } n->kids[3] = NULL; n->counts[3] = 0; n->elems[2] = NULL; if (k) { LOG((" before: k,index = %d,%d\n", (*k), (*index))); if ((*k) == ki+1) { (*k)--; (*index) += leftlen + 1; } else if ((*k) > ki+1) { (*k)--; } LOG((" after: k,index = %d,%d\n", (*k), (*index))); } LOG((" parent %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" merged %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", left, left->kids[0], left->counts[0], left->elems[0], left->kids[1], left->counts[1], left->elems[1], left->kids[2], left->counts[2], left->elems[2], left->kids[3], left->counts[3])); } /* * Delete an element e in a 2-3-4 tree. Does not free the element, * merely removes all links to it from the tree nodes. */ static void *delpos234_internal(tree234 *t, int index) { node234 *n; void *retval; int ki, i; retval = NULL; n = t->root; /* by assumption this is non-NULL */ LOG(("deleting item %d from tree %p\n", index, t)); while (1) { node234 *sub; LOG((" node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d index=%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3], index)); if (index <= n->counts[0]) { ki = 0; } else if (index -= n->counts[0]+1, index <= n->counts[1]) { ki = 1; } else if (index -= n->counts[1]+1, index <= n->counts[2]) { ki = 2; } else if (index -= n->counts[2]+1, index <= n->counts[3]) { ki = 3; } else { assert(0); /* can't happen */ } if (!n->kids[0]) break; /* n is a leaf node; we're here! */ /* * Check to see if we've found our target element. If so, * we must choose a new target (we'll use the old target's * successor, which will be in a leaf), move it into the * place of the old one, continue down to the leaf and * delete the old copy of the new target. */ if (index == n->counts[ki]) { node234 *m; LOG((" found element in internal node, index %d\n", ki)); assert(n->elems[ki]); /* must be a kid _before_ an element */ ki++; index = 0; for (m = n->kids[ki]; m->kids[0]; m = m->kids[0]) continue; LOG((" replacing with element \"%s\" from leaf node %p\n", m->elems[0], m)); retval = n->elems[ki-1]; n->elems[ki-1] = m->elems[0]; } /* * Recurse down to subtree ki. If it has only one element, * we have to do some transformation to start with. */ LOG((" moving to subtree %d\n", ki)); sub = n->kids[ki]; if (!sub->elems[1]) { LOG((" subtree has only one element!\n")); if (ki > 0 && n->kids[ki-1]->elems[1]) { /* * Child ki has only one element, but child * ki-1 has two or more. So we need to move a * subtree from ki-1 to ki. */ trans234_subtree_right(n, ki-1, &ki, &index); } else if (ki < 3 && n->kids[ki+1] && n->kids[ki+1]->elems[1]) { /* * Child ki has only one element, but ki+1 has * two or more. Move a subtree from ki+1 to ki. */ trans234_subtree_left(n, ki+1, &ki, &index); } else { /* * ki is small with only small neighbours. Pick a * neighbour and merge with it. */ trans234_subtree_merge(n, ki>0 ? ki-1 : ki, &ki, &index); sub = n->kids[ki]; if (!n->elems[0]) { /* * The root is empty and needs to be * removed. */ LOG((" shifting root!\n")); t->root = sub; sub->parent = NULL; sfree(n); n = NULL; } } } if (n) n->counts[ki]--; n = sub; } /* * Now n is a leaf node, and ki marks the element number we * want to delete. We've already arranged for the leaf to be * bigger than minimum size, so let's just go to it. */ assert(!n->kids[0]); if (!retval) retval = n->elems[ki]; for (i = ki; i < 2 && n->elems[i+1]; i++) n->elems[i] = n->elems[i+1]; n->elems[i] = NULL; /* * It's just possible that we have reduced the leaf to zero * size. This can only happen if it was the root - so destroy * it and make the tree empty. */ if (!n->elems[0]) { LOG((" removed last element in tree, destroying empty root\n")); assert(n == t->root); sfree(n); t->root = NULL; } return retval; /* finished! */ } void *delpos234(tree234 *t, int index) { if (index < 0 || index >= countnode234(t->root)) return NULL; return delpos234_internal(t, index); } void *del234(tree234 *t, void *e) { int index; if (!findrelpos234(t, e, NULL, REL234_EQ, &index)) return NULL; /* it wasn't in there anyway */ return delpos234_internal(t, index); /* it's there; delete it. */ } /* * Join two subtrees together with a separator element between * them, given their relative height. * * (Height<0 means the left tree is shorter, >0 means the right * tree is shorter, =0 means (duh) they're equal.) * * It is assumed that any checks needed on the ordering criterion * have _already_ been done. * * The value returned in `height' is 0 or 1 depending on whether the * resulting tree is the same height as the original larger one, or * one higher. */ static node234 *join234_internal(node234 *left, void *sep, node234 *right, int *height) { node234 *root, *node; int relht = *height; int ki; LOG((" join: joining %p \"%s\" %p, relative height is %d\n", left, sep, right, relht)); if (relht == 0) { /* * The trees are the same height. Create a new one-element * root containing the separator and pointers to the two * nodes. */ node234 *newroot; newroot = snew(node234); newroot->kids[0] = left; newroot->counts[0] = countnode234(left); newroot->elems[0] = sep; newroot->kids[1] = right; newroot->counts[1] = countnode234(right); newroot->elems[1] = NULL; newroot->kids[2] = NULL; newroot->counts[2] = 0; newroot->elems[2] = NULL; newroot->kids[3] = NULL; newroot->counts[3] = 0; newroot->parent = NULL; if (left) left->parent = newroot; if (right) right->parent = newroot; *height = 1; LOG((" join: same height, brand new root\n")); return newroot; } /* * This now works like the addition algorithm on the larger * tree. We're replacing a single kid pointer with two kid * pointers separated by an element; if that causes the node to * overload, we split it in two, move a separator element up to * the next node, and repeat. */ if (relht < 0) { /* * Left tree is shorter. Search down the right tree to find * the pointer we're inserting at. */ node = root = right; while (++relht < 0) { node = node->kids[0]; } ki = 0; right = node->kids[ki]; } else { /* * Right tree is shorter; search down the left to find the * pointer we're inserting at. */ node = root = left; while (--relht > 0) { if (node->elems[2]) node = node->kids[3]; else if (node->elems[1]) node = node->kids[2]; else node = node->kids[1]; } if (node->elems[2]) ki = 3; else if (node->elems[1]) ki = 2; else ki = 1; left = node->kids[ki]; } /* * Now proceed as for addition. */ *height = add234_insert(left, sep, right, &root, node, ki); return root; } static int height234(tree234 *t) { int level = 0; node234 *n = t->root; while (n) { level++; n = n->kids[0]; } return level; } tree234 *join234(tree234 *t1, tree234 *t2) { int size2 = countnode234(t2->root); if (size2 > 0) { void *element; int relht; if (t1->cmp) { element = index234(t2, 0); element = findrelpos234(t1, element, NULL, REL234_GE, NULL); if (element) return NULL; } element = delpos234(t2, 0); relht = height234(t1) - height234(t2); t1->root = join234_internal(t1->root, element, t2->root, &relht); t2->root = NULL; } return t1; } tree234 *join234r(tree234 *t1, tree234 *t2) { int size1 = countnode234(t1->root); if (size1 > 0) { void *element; int relht; if (t2->cmp) { element = index234(t1, size1-1); element = findrelpos234(t2, element, NULL, REL234_LE, NULL); if (element) return NULL; } element = delpos234(t1, size1-1); relht = height234(t1) - height234(t2); t2->root = join234_internal(t1->root, element, t2->root, &relht); t1->root = NULL; } return t2; } /* * Split out the first <index> elements in a tree and return a * pointer to the root node. Leave the root node of the remainder * in t. */ static node234 *split234_internal(tree234 *t, int index) { node234 *halves[2], *n, *sib, *sub; node234 *lparent, *rparent; int ki, pki, i, half, lcount, rcount; n = t->root; LOG(("splitting tree %p at point %d\n", t, index)); /* * Easy special cases. After this we have also dealt completely * with the empty-tree case and we can assume the root exists. */ if (index == 0) /* return nothing */ return NULL; if (index == countnode234(t->root)) { /* return the whole tree */ node234 *ret = t->root; t->root = NULL; return ret; } /* * Search down the tree to find the split point. */ lparent = rparent = NULL; while (n) { LOG((" node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d index=%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3], index)); lcount = index; rcount = countnode234(n) - lcount; if (index <= n->counts[0]) { ki = 0; } else if (index -= n->counts[0]+1, index <= n->counts[1]) { ki = 1; } else if (index -= n->counts[1]+1, index <= n->counts[2]) { ki = 2; } else { index -= n->counts[2]+1; ki = 3; } LOG((" splitting at subtree %d\n", ki)); sub = n->kids[ki]; LOG((" splitting at child index %d\n", ki)); /* * Split the node, put halves[0] on the right of the left * one and halves[1] on the left of the right one, put the * new node pointers in halves[0] and halves[1], and go up * a level. */ sib = snew(node234); for (i = 0; i < 3; i++) { if (i+ki < 3 && n->elems[i+ki]) { sib->elems[i] = n->elems[i+ki]; sib->kids[i+1] = n->kids[i+ki+1]; if (sib->kids[i+1]) sib->kids[i+1]->parent = sib; sib->counts[i+1] = n->counts[i+ki+1]; n->elems[i+ki] = NULL; n->kids[i+ki+1] = NULL; n->counts[i+ki+1] = 0; } else { sib->elems[i] = NULL; sib->kids[i+1] = NULL; sib->counts[i+1] = 0; } } if (lparent) { lparent->kids[pki] = n; lparent->counts[pki] = lcount; n->parent = lparent; rparent->kids[0] = sib; rparent->counts[0] = rcount; sib->parent = rparent; } else { halves[0] = n; n->parent = NULL; halves[1] = sib; sib->parent = NULL; } lparent = n; rparent = sib; pki = ki; LOG((" left node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" right node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", sib, sib->kids[0], sib->counts[0], sib->elems[0], sib->kids[1], sib->counts[1], sib->elems[1], sib->kids[2], sib->counts[2], sib->elems[2], sib->kids[3], sib->counts[3])); n = sub; } /* * We've come off the bottom here, so we've successfully split * the tree into two equally high subtrees. The only problem is * that some of the nodes down the fault line will be smaller * than the minimum permitted size. (Since this is a 2-3-4 * tree, that means they'll be zero-element one-child nodes.) */ LOG((" fell off bottom, lroot is %p, rroot is %p\n", halves[0], halves[1])); lparent->counts[pki] = rparent->counts[0] = 0; lparent->kids[pki] = rparent->kids[0] = NULL; /* * So now we go back down the tree from each of the two roots, * fixing up undersize nodes. */ for (half = 0; half < 2; half++) { /* * Remove the root if it's undersize (it will contain only * one child pointer, so just throw it away and replace it * with its child). This might happen several times. */ while (halves[half] && !halves[half]->elems[0]) { LOG((" root %p is undersize, throwing away\n", halves[half])); halves[half] = halves[half]->kids[0]; sfree(halves[half]->parent); halves[half]->parent = NULL; LOG((" new root is %p\n", halves[half])); } n = halves[half]; while (n) { void (*toward)(node234 *n, int ki, int *k, int *index); int ni, merge; /* * Now we have a potentially undersize node on the * right (if half==0) or left (if half==1). Sort it * out, by merging with a neighbour or by transferring * subtrees over. At this time we must also ensure that * nodes are bigger than minimum, in case we need an * element to merge two nodes below. */ LOG((" node %p: %p/%d \"%s\" %p/%d \"%s\" %p/%d \"%s\" %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); if (half == 1) { ki = 0; /* the kid we're interested in */ ni = 1; /* the neighbour */ merge = 0; /* for merge: leftmost of the two */ toward = trans234_subtree_left; } else { ki = (n->kids[3] ? 3 : n->kids[2] ? 2 : 1); ni = ki-1; merge = ni; toward = trans234_subtree_right; } sub = n->kids[ki]; if (sub && !sub->elems[1]) { /* * This node is undersized or minimum-size. If we * can merge it with its neighbour, we do so; * otherwise we must be able to transfer subtrees * over to it until it is greater than minimum * size. */ int undersized = (!sub->elems[0]); LOG((" child %d is %ssize\n", ki, undersized ? "under" : "minimum-")); LOG((" neighbour is %s\n", n->kids[ni]->elems[2] ? "large" : n->kids[ni]->elems[1] ? "medium" : "small")); if (!n->kids[ni]->elems[1] || (undersized && !n->kids[ni]->elems[2])) { /* * Neighbour is small, or possibly neighbour is * medium and we are undersize. */ trans234_subtree_merge(n, merge, NULL, NULL); sub = n->kids[merge]; if (!n->elems[0]) { /* * n is empty, and hence must have been the * root and needs to be removed. */ assert(!n->parent); LOG((" shifting root!\n")); halves[half] = sub; halves[half]->parent = NULL; sfree(n); } } else { /* Neighbour is big enough to move trees over. */ toward(n, ni, NULL, NULL); if (undersized) toward(n, ni, NULL, NULL); } } n = sub; } } t->root = halves[1]; return halves[0]; } tree234 *splitpos234(tree234 *t, int index, int before) { tree234 *ret; node234 *n; int count; count = countnode234(t->root); if (index < 0 || index > count) return NULL; /* error */ ret = newtree234(t->cmp); n = split234_internal(t, index); if (before) { /* We want to return the ones before the index. */ ret->root = n; } else { /* * We want to keep the ones before the index and return the * ones after. */ ret->root = t->root; t->root = n; } return ret; } tree234 *split234(tree234 *t, void *e, cmpfn234 cmp, int rel) { int before; int index; assert(rel != REL234_EQ); if (rel == REL234_GT || rel == REL234_GE) { before = 1; rel = (rel == REL234_GT ? REL234_LE : REL234_LT); } else { before = 0; } if (!findrelpos234(t, e, cmp, rel, &index)) index = 0; return splitpos234(t, index+1, before); } static node234 *copynode234(node234 *n, copyfn234 copyfn, void *copyfnstate) { int i; node234 *n2 = snew(node234); for (i = 0; i < 3; i++) { if (n->elems[i] && copyfn) n2->elems[i] = copyfn(copyfnstate, n->elems[i]); else n2->elems[i] = n->elems[i]; } for (i = 0; i < 4; i++) { if (n->kids[i]) { n2->kids[i] = copynode234(n->kids[i], copyfn, copyfnstate); n2->kids[i]->parent = n2; } else { n2->kids[i] = NULL; } n2->counts[i] = n->counts[i]; } return n2; } tree234 *copytree234(tree234 *t, copyfn234 copyfn, void *copyfnstate) { tree234 *t2; t2 = newtree234(t->cmp); if (t->root) { t2->root = copynode234(t->root, copyfn, copyfnstate); t2->root->parent = NULL; } else t2->root = NULL; return t2; } #ifdef TEST /* * Test code for the 2-3-4 tree. This code maintains an alternative * representation of the data in the tree, in an array (using the * obvious and slow insert and delete functions). After each tree * operation, the verify() function is called, which ensures all * the tree properties are preserved: * - node->child->parent always equals node * - tree->root->parent always equals NULL * - number of kids == 0 or number of elements + 1; * - tree has the same depth everywhere * - every node has at least one element * - subtree element counts are accurate * - any NULL kid pointer is accompanied by a zero count * - in a sorted tree: ordering property between elements of a * node and elements of its children is preserved * and also ensures the list represented by the tree is the same * list it should be. (This last check also doubly verifies the * ordering properties, because the `same list it should be' is by * definition correctly ordered. It also ensures all nodes are * distinct, because the enum functions would get caught in a loop * if not.) */ #include <stdarg.h> #define srealloc realloc /* * Error reporting function. */ void error(char *fmt, ...) { va_list ap; printf("ERROR: "); va_start(ap, fmt); vfprintf(stdout, fmt, ap); va_end(ap); printf("\n"); } /* The array representation of the data. */ void **array; int arraylen, arraysize; cmpfn234 cmp; /* The tree representation of the same data. */ tree234 *tree; /* * Routines to provide a diagnostic printout of a tree. Currently * relies on every element in the tree being a one-character string * :-) */ typedef struct { char **levels; } dispctx; int dispnode(node234 *n, int level, dispctx *ctx) { if (level == 0) { int xpos = strlen(ctx->levels[0]); int len; if (n->elems[2]) len = sprintf(ctx->levels[0]+xpos, " %s%s%s", n->elems[0], n->elems[1], n->elems[2]); else if (n->elems[1]) len = sprintf(ctx->levels[0]+xpos, " %s%s", n->elems[0], n->elems[1]); else len = sprintf(ctx->levels[0]+xpos, " %s", n->elems[0]); return xpos + 1 + (len-1) / 2; } else { int xpos[4], nkids; int nodelen, mypos, myleft, x, i; xpos[0] = dispnode(n->kids[0], level-3, ctx); xpos[1] = dispnode(n->kids[1], level-3, ctx); nkids = 2; if (n->kids[2]) { xpos[2] = dispnode(n->kids[2], level-3, ctx); nkids = 3; } if (n->kids[3]) { xpos[3] = dispnode(n->kids[3], level-3, ctx); nkids = 4; } if (nkids == 4) mypos = (xpos[1] + xpos[2]) / 2; else if (nkids == 3) mypos = xpos[1]; else mypos = (xpos[0] + xpos[1]) / 2; nodelen = nkids * 2 - 1; myleft = mypos - ((nodelen-1)/2); assert(myleft >= xpos[0]); assert(myleft + nodelen-1 <= xpos[nkids-1]); x = strlen(ctx->levels[level]); while (x <= xpos[0] && x < myleft) ctx->levels[level][x++] = ' '; while (x < myleft) ctx->levels[level][x++] = '_'; if (nkids==4) x += sprintf(ctx->levels[level]+x, ".%s.%s.%s.", n->elems[0], n->elems[1], n->elems[2]); else if (nkids==3) x += sprintf(ctx->levels[level]+x, ".%s.%s.", n->elems[0], n->elems[1]); else x += sprintf(ctx->levels[level]+x, ".%s.", n->elems[0]); while (x < xpos[nkids-1]) ctx->levels[level][x++] = '_'; ctx->levels[level][x] = '\0'; x = strlen(ctx->levels[level-1]); for (i = 0; i < nkids; i++) { int rpos, pos; rpos = xpos[i]; if (i > 0 && i < nkids-1) pos = myleft + 2*i; else pos = rpos; if (rpos < pos) rpos++; while (x < pos && x < rpos) ctx->levels[level-1][x++] = ' '; if (x == pos) ctx->levels[level-1][x++] = '|'; while (x < pos || x < rpos) ctx->levels[level-1][x++] = '_'; if (x == pos) ctx->levels[level-1][x++] = '|'; } ctx->levels[level-1][x] = '\0'; x = strlen(ctx->levels[level-2]); for (i = 0; i < nkids; i++) { int rpos = xpos[i]; while (x < rpos) ctx->levels[level-2][x++] = ' '; ctx->levels[level-2][x++] = '|'; } ctx->levels[level-2][x] = '\0'; return mypos; } } void disptree(tree234 *t) { dispctx ctx; char *leveldata; int width = count234(t); int ht = height234(t) * 3 - 2; int i; if (!t->root) { printf("[empty tree]\n"); } leveldata = smalloc(ht * (width+2)); ctx.levels = smalloc(ht * sizeof(char *)); for (i = 0; i < ht; i++) { ctx.levels[i] = leveldata + i * (width+2); ctx.levels[i][0] = '\0'; } (void) dispnode(t->root, ht-1, &ctx); for (i = ht; i-- ;) printf("%s\n", ctx.levels[i]); sfree(ctx.levels); sfree(leveldata); } typedef struct { int treedepth; int elemcount; } chkctx; int chknode(chkctx *ctx, int level, node234 *node, void *lowbound, void *highbound) { int nkids, nelems; int i; int count; /* Count the non-NULL kids. */ for (nkids = 0; nkids < 4 && node->kids[nkids]; nkids++); /* Ensure no kids beyond the first NULL are non-NULL. */ for (i = nkids; i < 4; i++) if (node->kids[i]) { error("node %p: nkids=%d but kids[%d] non-NULL", node, nkids, i); } else if (node->counts[i]) { error("node %p: kids[%d] NULL but count[%d]=%d nonzero", node, i, i, node->counts[i]); } /* Count the non-NULL elements. */ for (nelems = 0; nelems < 3 && node->elems[nelems]; nelems++); /* Ensure no elements beyond the first NULL are non-NULL. */ for (i = nelems; i < 3; i++) if (node->elems[i]) { error("node %p: nelems=%d but elems[%d] non-NULL", node, nelems, i); } if (nkids == 0) { /* * If nkids==0, this is a leaf node; verify that the tree * depth is the same everywhere. */ if (ctx->treedepth < 0) ctx->treedepth = level; /* we didn't know the depth yet */ else if (ctx->treedepth != level) error("node %p: leaf at depth %d, previously seen depth %d", node, level, ctx->treedepth); } else { /* * If nkids != 0, then it should be nelems+1, unless nelems * is 0 in which case nkids should also be 0 (and so we * shouldn't be in this condition at all). */ int shouldkids = (nelems ? nelems+1 : 0); if (nkids != shouldkids) { error("node %p: %d elems should mean %d kids but has %d", node, nelems, shouldkids, nkids); } } /* * nelems should be at least 1. */ if (nelems == 0) { error("node %p: no elems", node, nkids); } /* * Add nelems to the running element count of the whole tree. */ ctx->elemcount += nelems; /* * Check ordering property: all elements should be strictly > * lowbound, strictly < highbound, and strictly < each other in * sequence. (lowbound and highbound are NULL at edges of tree * - both NULL at root node - and NULL is considered to be < * everything and > everything. IYSWIM.) */ if (cmp) { for (i = -1; i < nelems; i++) { void *lower = (i == -1 ? lowbound : node->elems[i]); void *higher = (i+1 == nelems ? highbound : node->elems[i+1]); if (lower && higher && cmp(lower, higher) >= 0) { error("node %p: kid comparison [%d=%s,%d=%s] failed", node, i, lower, i+1, higher); } } } /* * Check parent pointers: all non-NULL kids should have a * parent pointer coming back to this node. */ for (i = 0; i < nkids; i++) if (node->kids[i]->parent != node) { error("node %p kid %d: parent ptr is %p not %p", node, i, node->kids[i]->parent, node); } /* * Now (finally!) recurse into subtrees. */ count = nelems; for (i = 0; i < nkids; i++) { void *lower = (i == 0 ? lowbound : node->elems[i-1]); void *higher = (i >= nelems ? highbound : node->elems[i]); int subcount = chknode(ctx, level+1, node->kids[i], lower, higher); if (node->counts[i] != subcount) { error("node %p kid %d: count says %d, subtree really has %d", node, i, node->counts[i], subcount); } count += subcount; } return count; } void verifytree(tree234 *tree, void **array, int arraylen) { chkctx ctx; int i; void *p; ctx.treedepth = -1; /* depth unknown yet */ ctx.elemcount = 0; /* no elements seen yet */ /* * Verify validity of tree properties. */ if (tree->root) { if (tree->root->parent != NULL) error("root->parent is %p should be null", tree->root->parent); chknode(&ctx, 0, tree->root, NULL, NULL); } printf("tree depth: %d\n", ctx.treedepth); /* * Enumerate the tree and ensure it matches up to the array. */ for (i = 0; NULL != (p = index234(tree, i)); i++) { if (i >= arraylen) error("tree contains more than %d elements", arraylen); if (array[i] != p) error("enum at position %d: array says %s, tree says %s", i, array[i], p); } if (ctx.elemcount != i) { error("tree really contains %d elements, enum gave %d", ctx.elemcount, i); } if (i < arraylen) { error("enum gave only %d elements, array has %d", i, arraylen); } i = count234(tree); if (ctx.elemcount != i) { error("tree really contains %d elements, count234 gave %d", ctx.elemcount, i); } } void verify(void) { verifytree(tree, array, arraylen); } void internal_addtest(void *elem, int index, void *realret) { int i, j; void *retval; if (arraysize < arraylen+1) { arraysize = arraylen+1+256; array = (array == NULL ? smalloc(arraysize*sizeof(*array)) : srealloc(array, arraysize*sizeof(*array))); } i = index; /* now i points to the first element >= elem */ retval = elem; /* expect elem returned (success) */ for (j = arraylen; j > i; j--) array[j] = array[j-1]; array[i] = elem; /* add elem to array */ arraylen++; if (realret != retval) { error("add: retval was %p expected %p", realret, retval); } verify(); } void addtest(void *elem) { int i; void *realret; realret = add234(tree, elem); i = 0; while (i < arraylen && cmp(elem, array[i]) > 0) i++; if (i < arraylen && !cmp(elem, array[i])) { void *retval = array[i]; /* expect that returned not elem */ if (realret != retval) { error("add: retval was %p expected %p", realret, retval); } } else internal_addtest(elem, i, realret); } void addpostest(void *elem, int i) { void *realret; realret = addpos234(tree, elem, i); internal_addtest(elem, i, realret); } void delpostest(int i) { int index = i; void *elem = array[i], *ret; /* i points to the right element */ while (i < arraylen-1) { array[i] = array[i+1]; i++; } arraylen--; /* delete elem from array */ if (tree->cmp) ret = del234(tree, elem); else ret = delpos234(tree, index); if (ret != elem) { error("del returned %p, expected %p", ret, elem); } verify(); } void deltest(void *elem) { int i; i = 0; while (i < arraylen && cmp(elem, array[i]) > 0) i++; if (i >= arraylen || cmp(elem, array[i]) != 0) return; /* don't do it! */ delpostest(i); } /* A sample data set and test utility. Designed for pseudo-randomness, * and yet repeatability. */ /* * This random number generator uses the `portable implementation' * given in ANSI C99 draft N869. It assumes `unsigned' is 32 bits; * change it if not. */ int randomnumber(unsigned *seed) { *seed *= 1103515245; *seed += 12345; return ((*seed) / 65536) % 32768; } int mycmp(void *av, void *bv) { char const *a = (char const *)av; char const *b = (char const *)bv; return strcmp(a, b); } #define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) char *strings[] = { "0", "2", "3", "I", "K", "d", "H", "J", "Q", "N", "n", "q", "j", "i", "7", "G", "F", "D", "b", "x", "g", "B", "e", "v", "V", "T", "f", "E", "S", "8", "A", "k", "X", "p", "C", "R", "a", "o", "r", "O", "Z", "u", "6", "1", "w", "L", "P", "M", "c", "U", "h", "9", "t", "5", "W", "Y", "m", "s", "l", "4", #if 0 "a", "ab", "absque", "coram", "de", "palam", "clam", "cum", "ex", "e", "sine", "tenus", "pro", "prae", "banana", "carrot", "cabbage", "broccoli", "onion", "zebra", "penguin", "blancmange", "pangolin", "whale", "hedgehog", "giraffe", "peanut", "bungee", "foo", "bar", "baz", "quux", "murfl", "spoo", "breen", "flarn", "octothorpe", "snail", "tiger", "elephant", "octopus", "warthog", "armadillo", "aardvark", "wyvern", "dragon", "elf", "dwarf", "orc", "goblin", "pixie", "basilisk", "warg", "ape", "lizard", "newt", "shopkeeper", "wand", "ring", "amulet" #endif }; #define NSTR lenof(strings) void findtest(void) { static const int rels[] = { REL234_EQ, REL234_GE, REL234_LE, REL234_LT, REL234_GT }; static const char *const relnames[] = { "EQ", "GE", "LE", "LT", "GT" }; int i, j, rel, index; char *p, *ret, *realret, *realret2; int lo, hi, mid, c; for (i = 0; i < (int)NSTR; i++) { p = strings[i]; for (j = 0; j < (int)(sizeof(rels)/sizeof(*rels)); j++) { rel = rels[j]; lo = 0; hi = arraylen-1; while (lo <= hi) { mid = (lo + hi) / 2; c = strcmp(p, array[mid]); if (c < 0) hi = mid-1; else if (c > 0) lo = mid+1; else break; } if (c == 0) { if (rel == REL234_LT) ret = (mid > 0 ? array[--mid] : NULL); else if (rel == REL234_GT) ret = (mid < arraylen-1 ? array[++mid] : NULL); else ret = array[mid]; } else { assert(lo == hi+1); if (rel == REL234_LT || rel == REL234_LE) { mid = hi; ret = (hi >= 0 ? array[hi] : NULL); } else if (rel == REL234_GT || rel == REL234_GE) { mid = lo; ret = (lo < arraylen ? array[lo] : NULL); } else ret = NULL; } realret = findrelpos234(tree, p, NULL, rel, &index); if (realret != ret) { error("find(\"%s\",%s) gave %s should be %s", p, relnames[j], realret, ret); } if (realret && index != mid) { error("find(\"%s\",%s) gave %d should be %d", p, relnames[j], index, mid); } if (realret && rel == REL234_EQ) { realret2 = index234(tree, index); if (realret2 != realret) { error("find(\"%s\",%s) gave %s(%d) but %d -> %s", p, relnames[j], realret, index, index, realret2); } } #if 0 printf("find(\"%s\",%s) gave %s(%d)\n", p, relnames[j], realret, index); #endif } } realret = findrelpos234(tree, NULL, NULL, REL234_GT, &index); if (arraylen && (realret != array[0] || index != 0)) { error("find(NULL,GT) gave %s(%d) should be %s(0)", realret, index, array[0]); } else if (!arraylen && (realret != NULL)) { error("find(NULL,GT) gave %s(%d) should be NULL", realret, index); } realret = findrelpos234(tree, NULL, NULL, REL234_LT, &index); if (arraylen && (realret != array[arraylen-1] || index != arraylen-1)) { error("find(NULL,LT) gave %s(%d) should be %s(0)", realret, index, array[arraylen-1]); } else if (!arraylen && (realret != NULL)) { error("find(NULL,LT) gave %s(%d) should be NULL", realret, index); } } void splittest(tree234 *tree, void **array, int arraylen) { int i; tree234 *tree3, *tree4; for (i = 0; i <= arraylen; i++) { tree3 = copytree234(tree, NULL, NULL); tree4 = splitpos234(tree3, i, 0); verifytree(tree3, array, i); verifytree(tree4, array+i, arraylen-i); join234(tree3, tree4); freetree234(tree4); /* left empty by join */ verifytree(tree3, array, arraylen); freetree234(tree3); } } int main(void) { int in[NSTR]; int i, j, k; int tworoot, tmplen; unsigned seed = 0; tree234 *tree2, *tree3, *tree4; int c; setvbuf(stdout, NULL, _IOLBF, 0); for (i = 0; i < (int)NSTR; i++) in[i] = 0; array = NULL; arraylen = arraysize = 0; tree = newtree234(mycmp); cmp = mycmp; verify(); for (i = 0; i < 10000; i++) { j = randomnumber(&seed); j %= NSTR; printf("trial: %d\n", i); if (in[j]) { printf("deleting %s (%d)\n", strings[j], j); deltest(strings[j]); in[j] = 0; } else { printf("adding %s (%d)\n", strings[j], j); addtest(strings[j]); in[j] = 1; } disptree(tree); findtest(); } while (arraylen > 0) { j = randomnumber(&seed); j %= arraylen; deltest(array[j]); } freetree234(tree); /* * Now try an unsorted tree. We don't really need to test * delpos234 because we know del234 is based on it, so it's * already been tested in the above sorted-tree code; but for * completeness we'll use it to tear down our unsorted tree * once we've built it. */ tree = newtree234(NULL); cmp = NULL; verify(); for (i = 0; i < 1000; i++) { printf("trial: %d\n", i); j = randomnumber(&seed); j %= NSTR; k = randomnumber(&seed); k %= count234(tree)+1; printf("adding string %s at index %d\n", strings[j], k); addpostest(strings[j], k); } /* * While we have this tree in its full form, we'll take a copy * of it to use in split and join testing. */ tree2 = copytree234(tree, NULL, NULL); verifytree(tree2, array, arraylen);/* check the copy is accurate */ /* * Split tests. Split the tree at every possible point and * check the resulting subtrees. */ tworoot = (!tree2->root->elems[1]);/* see if it has a 2-root */ splittest(tree2, array, arraylen); /* * Now do the split test again, but on a tree that has a 2-root * (if the previous one didn't) or doesn't (if the previous one * did). */ tmplen = arraylen; while ((!tree2->root->elems[1]) == tworoot) { delpos234(tree2, --tmplen); } printf("now trying splits on second tree\n"); splittest(tree2, array, tmplen); freetree234(tree2); /* * Back to the main testing of uncounted trees. */ while (count234(tree) > 0) { printf("cleanup: tree size %d\n", count234(tree)); j = randomnumber(&seed); j %= count234(tree); printf("deleting string %s from index %d\n", (char *)array[j], j); delpostest(j); } freetree234(tree); /* * Finally, do some testing on split/join on _sorted_ trees. At * the same time, we'll be testing split on very small trees. */ tree = newtree234(mycmp); cmp = mycmp; arraylen = 0; for (i = 0; i < 17; i++) { tree2 = copytree234(tree, NULL, NULL); splittest(tree2, array, arraylen); freetree234(tree2); if (i < 16) addtest(strings[i]); } freetree234(tree); /* * Test silly cases of join: join(emptytree, emptytree), and * also ensure join correctly spots when sorted trees fail the * ordering constraint. */ tree = newtree234(mycmp); tree2 = newtree234(mycmp); tree3 = newtree234(mycmp); tree4 = newtree234(mycmp); assert(mycmp(strings[0], strings[1]) < 0); /* just in case :-) */ add234(tree2, strings[1]); add234(tree4, strings[0]); array[0] = strings[0]; array[1] = strings[1]; verifytree(tree, array, 0); verifytree(tree2, array+1, 1); verifytree(tree3, array, 0); verifytree(tree4, array, 1); /* * So: * - join(tree,tree3) should leave both tree and tree3 unchanged. * - joinr(tree,tree2) should leave both tree and tree2 unchanged. * - join(tree4,tree3) should leave both tree3 and tree4 unchanged. * - join(tree, tree2) should move the element from tree2 to tree. * - joinr(tree4, tree3) should move the element from tree4 to tree3. * - join(tree,tree3) should return NULL and leave both unchanged. * - join(tree3,tree) should work and create a bigger tree in tree3. */ assert(tree == join234(tree, tree3)); verifytree(tree, array, 0); verifytree(tree3, array, 0); assert(tree2 == join234r(tree, tree2)); verifytree(tree, array, 0); verifytree(tree2, array+1, 1); assert(tree4 == join234(tree4, tree3)); verifytree(tree3, array, 0); verifytree(tree4, array, 1); assert(tree == join234(tree, tree2)); verifytree(tree, array+1, 1); verifytree(tree2, array, 0); assert(tree3 == join234r(tree4, tree3)); verifytree(tree3, array, 1); verifytree(tree4, array, 0); assert(NULL == join234(tree, tree3)); verifytree(tree, array+1, 1); verifytree(tree3, array, 1); assert(tree3 == join234(tree3, tree)); verifytree(tree3, array, 2); verifytree(tree, array, 0); return 0; } #endif #if 0 /* sorted list of strings might be useful */ { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", } #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/tree234.h�������������������������������������������������������������������������������0000644�0001753�0001753�00000016072�12444773746�011323� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * tree234.h: header defining functions in tree234.c. * * This file is copyright 1999-2001 Simon Tatham. * * 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 SIMON TATHAM 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. */ #ifndef TREE234_H #define TREE234_H /* * This typedef is opaque outside tree234.c itself. */ typedef struct tree234_Tag tree234; typedef int (*cmpfn234)(void *, void *); typedef void *(*copyfn234)(void *state, void *element); /* * Create a 2-3-4 tree. If `cmp' is NULL, the tree is unsorted, and * lookups by key will fail: you can only look things up by numeric * index, and you have to use addpos234() and delpos234(). */ tree234 *newtree234(cmpfn234 cmp); /* * Free a 2-3-4 tree (not including freeing the elements). */ void freetree234(tree234 *t); /* * Add an element e to a sorted 2-3-4 tree t. Returns e on success, * or if an existing element compares equal, returns that. */ void *add234(tree234 *t, void *e); /* * Add an element e to an unsorted 2-3-4 tree t. Returns e on * success, NULL on failure. (Failure should only occur if the * index is out of range or the tree is sorted.) * * Index range can be from 0 to the tree's current element count, * inclusive. */ void *addpos234(tree234 *t, void *e, int index); /* * Look up the element at a given numeric index in a 2-3-4 tree. * Returns NULL if the index is out of range. * * One obvious use for this function is in iterating over the whole * of a tree (sorted or unsorted): * * for (i = 0; (p = index234(tree, i)) != NULL; i++) consume(p); * * or * * int maxcount = count234(tree); * for (i = 0; i < maxcount; i++) { * p = index234(tree, i); * assert(p != NULL); * consume(p); * } */ void *index234(tree234 *t, int index); /* * Find an element e in a sorted 2-3-4 tree t. Returns NULL if not * found. e is always passed as the first argument to cmp, so cmp * can be an asymmetric function if desired. cmp can also be passed * as NULL, in which case the compare function from the tree proper * will be used. * * Three of these functions are special cases of findrelpos234. The * non-`pos' variants lack the `index' parameter: if the parameter * is present and non-NULL, it must point to an integer variable * which will be filled with the numeric index of the returned * element. * * The non-`rel' variants lack the `relation' parameter. This * parameter allows you to specify what relation the element you * provide has to the element you're looking for. This parameter * can be: * * REL234_EQ - find only an element that compares equal to e * REL234_LT - find the greatest element that compares < e * REL234_LE - find the greatest element that compares <= e * REL234_GT - find the smallest element that compares > e * REL234_GE - find the smallest element that compares >= e * * Non-`rel' variants assume REL234_EQ. * * If `rel' is REL234_GT or REL234_LT, the `e' parameter may be * NULL. In this case, REL234_GT will return the smallest element * in the tree, and REL234_LT will return the greatest. This gives * an alternative means of iterating over a sorted tree, instead of * using index234: * * // to loop forwards * for (p = NULL; (p = findrel234(tree, p, NULL, REL234_GT)) != NULL ;) * consume(p); * * // to loop backwards * for (p = NULL; (p = findrel234(tree, p, NULL, REL234_LT)) != NULL ;) * consume(p); */ enum { REL234_EQ, REL234_LT, REL234_LE, REL234_GT, REL234_GE }; void *find234(tree234 *t, void *e, cmpfn234 cmp); void *findrel234(tree234 *t, void *e, cmpfn234 cmp, int relation); void *findpos234(tree234 *t, void *e, cmpfn234 cmp, int *index); void *findrelpos234(tree234 *t, void *e, cmpfn234 cmp, int relation, int *index); /* * Delete an element e in a 2-3-4 tree. Does not free the element, * merely removes all links to it from the tree nodes. * * delpos234 deletes the element at a particular tree index: it * works on both sorted and unsorted trees. * * del234 deletes the element passed to it, so it only works on * sorted trees. (It's equivalent to using findpos234 to determine * the index of an element, and then passing that index to * delpos234.) * * Both functions return a pointer to the element they delete, for * the user to free or pass on elsewhere or whatever. If the index * is out of range (delpos234) or the element is already not in the * tree (del234) then they return NULL. */ void *del234(tree234 *t, void *e); void *delpos234(tree234 *t, int index); /* * Return the total element count of a tree234. */ int count234(tree234 *t); /* * Split a tree234 into two valid tree234s. * * splitpos234 splits at a given index. If `before' is TRUE, the * items at and after that index are left in t and the ones before * are returned; if `before' is FALSE, the items before that index * are left in t and the rest are returned. * * split234 splits at a given key. You can pass any of the * relations used with findrel234, except for REL234_EQ. The items * in the tree that satisfy the relation are returned; the * remainder are left. */ tree234 *splitpos234(tree234 *t, int index, int before); tree234 *split234(tree234 *t, void *e, cmpfn234 cmp, int rel); /* * Join two tree234s together into a single one. * * All the elements in t1 are placed to the left of all the * elements in t2. If the trees are sorted, there will be a test to * ensure that this satisfies the ordering criterion, and NULL will * be returned otherwise. If the trees are unsorted, there is no * restriction on the use of join234. * * The tree returned is t1 (join234) or t2 (join234r), if the * operation is successful. */ tree234 *join234(tree234 *t1, tree234 *t2); tree234 *join234r(tree234 *t1, tree234 *t2); /* * Make a complete copy of a tree234. Element pointers will be * reused unless copyfn is non-NULL, in which case it will be used * to copy each element. (copyfn takes two `void *' parameters; the * first is private state and the second is the element. A simple * copy routine probably won't need private state.) */ tree234 *copytree234(tree234 *t, copyfn234 copyfn, void *copyfnstate); #endif /* TREE234_H */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/ustring.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000023763�12444773746�011626� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * ustring.c: Unicode string routines */ #include <wchar.h> #include <stdlib.h> #include <assert.h> #include <time.h> #include "halibut.h" wchar_t *ustrdup(wchar_t const *s) { wchar_t *r; if (s) { r = snewn(1+ustrlen(s), wchar_t); ustrcpy(r, s); } else { r = snew(wchar_t); *r = 0; } return r; } static char *ustrtoa_internal(wchar_t const *s, char *outbuf, int size, int charset, int careful) { int len, ret, err; charset_state state = CHARSET_INIT_STATE; if (!s) { *outbuf = '\0'; return outbuf; } len = ustrlen(s); size--; /* leave room for terminating NUL */ *outbuf = '\0'; while (len > 0) { err = 0; ret = charset_from_unicode(&s, &len, outbuf, size, charset, &state, (careful ? &err : NULL)); if (err) return NULL; if (!ret) return outbuf; size -= ret; outbuf += ret; *outbuf = '\0'; } /* * Clean up */ ret = charset_from_unicode(NULL, 0, outbuf, size, charset, &state, NULL); size -= ret; outbuf += ret; *outbuf = '\0'; return outbuf; } char *ustrtoa(wchar_t const *s, char *outbuf, int size, int charset) { return ustrtoa_internal(s, outbuf, size, charset, FALSE); } char *ustrtoa_careful(wchar_t const *s, char *outbuf, int size, int charset) { return ustrtoa_internal(s, outbuf, size, charset, TRUE); } wchar_t *ustrfroma(char const *s, wchar_t *outbuf, int size, int charset) { int len, ret; charset_state state = CHARSET_INIT_STATE; if (!s) { *outbuf = L'\0'; return outbuf; } len = strlen(s); size--; /* allow for terminating NUL */ *outbuf = L'\0'; while (len > 0) { ret = charset_to_unicode(&s, &len, outbuf, size, charset, &state, NULL, 0); if (!ret) return outbuf; outbuf += ret; size -= ret; *outbuf = L'\0'; } return outbuf; } char *utoa_internal_dup(wchar_t const *s, int charset, int *lenp, int careful) { char *outbuf; int outpos, outlen, len, ret, err; charset_state state = CHARSET_INIT_STATE; if (!s) { return dupstr(""); } len = ustrlen(s); outlen = len + 10; outbuf = snewn(outlen, char); outpos = 0; outbuf[outpos] = '\0'; while (len > 0) { err = 0; ret = charset_from_unicode(&s, &len, outbuf + outpos, outlen - outpos - 1, charset, &state, (careful ? &err : NULL)); if (err) { sfree(outbuf); return NULL; } if (!ret) { outlen = outlen * 3 / 2; outbuf = sresize(outbuf, outlen, char); } outpos += ret; outbuf[outpos] = '\0'; } /* * Clean up */ outlen = outpos + 32; outbuf = sresize(outbuf, outlen, char); ret = charset_from_unicode(NULL, 0, outbuf + outpos, outlen - outpos + 1, charset, &state, NULL); outpos += ret; outbuf[outpos] = '\0'; if (lenp) *lenp = outpos; return outbuf; } char *utoa_dup(wchar_t const *s, int charset) { return utoa_internal_dup(s, charset, NULL, FALSE); } char *utoa_dup_len(wchar_t const *s, int charset, int *len) { return utoa_internal_dup(s, charset, len, FALSE); } char *utoa_careful_dup(wchar_t const *s, int charset) { return utoa_internal_dup(s, charset, NULL, TRUE); } wchar_t *ufroma_dup(char const *s, int charset) { int len; wchar_t *buf = NULL; len = strlen(s) + 1; do { buf = sresize(buf, len, wchar_t); ustrfroma(s, buf, len, charset); len = (3 * len) / 2 + 1; /* this guarantees a strict increase */ } while (ustrlen(buf) >= len-1); buf = sresize(buf, ustrlen(buf)+1, wchar_t); return buf; } char *utoa_locale_dup(wchar_t const *s) { /* * This variant uses the C library locale. */ char *ret; int len, outlen; size_t siz; len = ustrlen(s); outlen = 1 + MB_CUR_MAX * len; ret = snewn(outlen+1, char); siz = wcstombs(ret, s, outlen); if (siz) { assert(siz <= (size_t)(outlen)); ret[siz] = '\0'; ret = sresize(ret, siz+1, char); return ret; } /* * If that failed, try a different strategy (which we will also * attempt in the total absence of wcstombs). Retrieve the * locale's charset from nl_langinfo or equivalent, and use * normal utoa_dup. */ return utoa_dup(s, charset_from_locale()); } wchar_t *ufroma_locale_dup(char const *s) { /* * This variant uses the C library locale. */ wchar_t *ret; int len, outlen; size_t siz; len = strlen(s); outlen = 1 + 2*len; ret = snewn(outlen+1, wchar_t); /* be conservative */ siz = mbstowcs(ret, s, outlen); if (siz) { assert(siz <= (size_t)(outlen)); ret[siz] = L'\0'; ret = sresize(ret, siz+1, wchar_t); return ret; } /* * If that failed, try a different strategy (which we will also * attempt in the total absence of wcstombs). Retrieve the * locale's charset from nl_langinfo or equivalent, and use * normal ufroma_dup. */ return ufroma_dup(s, charset_from_locale()); } int ustrlen(wchar_t const *s) { int len = 0; while (*s++) len++; return len; } wchar_t *uadv(wchar_t *s) { return s + 1 + ustrlen(s); } wchar_t *ustrcpy(wchar_t *dest, wchar_t const *source) { wchar_t *ret = dest; do { *dest++ = *source; } while (*source++); return ret; } wchar_t *ustrncpy(wchar_t *dest, wchar_t const *source, int n) { wchar_t *ret = dest; do { *dest++ = *source; if (*source) source++; } while (n-- > 0); return ret; } int ustrcmp(wchar_t *lhs, wchar_t *rhs) { if (!lhs && !rhs) return 0; if (!lhs) return -1; if (!rhs) return +1; while (*lhs && *rhs && *lhs==*rhs) lhs++, rhs++; if (*lhs < *rhs) return -1; else if (*lhs > *rhs) return 1; return 0; } wchar_t utolower(wchar_t c) { if (c == L'\0') return c; /* this property needed by ustricmp */ #ifdef HAS_TOWLOWER return towlower(c); #else if (c >= 'A' && c <= 'Z') c += 'a'-'A'; return c; #endif } int uisalpha(wchar_t c) { #ifdef HAS_ISWALPHA return iswalpha(c); #else return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); #endif } int ustricmp(wchar_t const *lhs, wchar_t const *rhs) { wchar_t lc, rc; while ((lc = utolower(*lhs)) == (rc = utolower(*rhs)) && lc && rc) lhs++, rhs++; if (!lc && !rc) return 0; if (lc < rc) return -1; else return 1; } int ustrnicmp(wchar_t const *lhs, wchar_t const *rhs, int maxlen) { wchar_t lc = 0, rc = 0; while (maxlen-- > 0 && (lc = utolower(*lhs)) == (rc = utolower(*rhs)) && lc && rc) lhs++, rhs++; if (lc < rc) return -1; else if (lc > rc) return 1; else return 0; } wchar_t *ustrlow(wchar_t *s) { wchar_t *p = s; while (*p) { *p = utolower(*p); p++; } return s; } int utoi(wchar_t const *s) { int sign = +1; int n; if (*s == L'-') { s++; sign = -1; } n = 0; while (*s && *s >= L'0' && *s <= L'9') { n *= 10; n += (*s - '0'); s++; } return n * sign; } double utof(wchar_t const *s) { char *cs = utoa_dup(s, CS_ASCII); double ret = atof(cs); sfree(cs); return ret; } int utob(wchar_t const *s) { if (!ustricmp(s, L"yes") || !ustricmp(s, L"y") || !ustricmp(s, L"true") || !ustricmp(s, L"t")) return TRUE; return FALSE; } int uisdigit(wchar_t c) { return c >= L'0' && c <= L'9'; } #define USTRFTIME_DELTA 128 static void ustrftime_internal(rdstring *rs, char formatchr, const struct tm *timespec) { /* * strftime has the entertaining property that it returns 0 * _either_ on out-of-space _or_ on successful generation of * the empty string. Hence we must ensure our format can never * generate the empty string. Somebody throw a custard pie at * whoever was responsible for that. Please? */ #ifdef HAS_WCSFTIME wchar_t *buf = NULL; wchar_t fmt[4]; int size, ret; fmt[0] = L' '; fmt[1] = L'%'; /* Format chars are all ASCII, so conversion to Unicode is no problem */ fmt[2] = formatchr; fmt[3] = L'\0'; size = 0; do { size += USTRFTIME_DELTA; buf = sresize(buf, size, wchar_t); ret = (int) wcsftime(buf, size, fmt, timespec); } while (ret == 0); rdadds(rs, buf+1); sfree(buf); #else char *buf = NULL; wchar_t *cvtbuf; char fmt[4]; int size, ret; fmt[0] = ' '; fmt[1] = '%'; fmt[2] = formatchr; fmt[3] = '\0'; size = 0; do { size += USTRFTIME_DELTA; buf = sresize(buf, size, char); ret = (int) strftime(buf, size, fmt, timespec); } while (ret == 0); cvtbuf = ufroma_locale_dup(buf+1); rdadds(rs, cvtbuf); sfree(cvtbuf); sfree(buf); #endif } wchar_t *ustrftime(const wchar_t *wfmt, const struct tm *timespec) { rdstring rs = { 0, 0, NULL }; if (!wfmt) wfmt = L"%c"; while (*wfmt) { if (wfmt[0] == L'%' && wfmt[1] == L'%') { rdadd(&rs, L'%'); wfmt += 2; } else if (wfmt[0] == L'%' && wfmt[1]) { ustrftime_internal(&rs, wfmt[1], timespec); wfmt += 2; } else { rdadd(&rs, wfmt[0]); wfmt++; } } return rdtrim(&rs); } /* * Determine whether a Unicode string can be translated into a * given charset without any missing characters. */ int cvt_ok(int charset, const wchar_t *s) { char buf[256]; charset_state state = CHARSET_INIT_STATE; int err, len = ustrlen(s); err = 0; while (len > 0) { (void)charset_from_unicode(&s, &len, buf, lenof(buf), charset, &state, &err); if (err) return FALSE; } return TRUE; } /* * Wrapper around charset_from_localenc which accepts the charset * name as a wide string (since that happens to be more useful). * Also throws a Halibut error and falls back to CS_ASCII if the * charset is unrecognised, meaning the rest of the program can * rely on always getting a valid charset id back from this * function. */ int charset_from_ustr(filepos *fpos, const wchar_t *name) { char *csname; int charset; csname = utoa_dup(name, CS_ASCII); charset = charset_from_localenc(csname); if (charset == CS_NONE) { charset = CS_ASCII; err_charset(fpos, name); } sfree(csname); return charset; } �������������halibut-1.1/version.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000000140�12444773746�011600� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * version.c: version string */ #include "version.h" const char *const version = VERSION; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/version.h�������������������������������������������������������������������������������0000644�0001753�0001753�00000000110�12444773746�011602� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Generated by automated build script */ #define VERSION "version 1.1" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/wcwidth.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000013214�12444773746�011572� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * A wrapper around wcswidth() to have it ignore characters which * are not represented in a particular output charset. */ #include <assert.h> #include <stdlib.h> #include "halibut.h" #ifndef HAS_WCSWIDTH /* * Markus Kuhn's public domain wcwidth() implementation, cribbed * from * * http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c */ #define wcswidth mk_wcswidth struct interval { int first; int last; }; /* auxiliary function for binary search in interval table */ static int bisearch(wchar_t ucs, const struct interval *table, int max) { int min = 0; int mid; if (ucs < table[0].first || ucs > table[max].last) return 0; while (max >= min) { mid = (min + max) / 2; if (ucs > table[mid].last) min = mid + 1; else if (ucs < table[mid].first) max = mid - 1; else return 1; } return 0; } int mk_wcwidth(wchar_t ucs) { /* sorted list of non-overlapping intervals of non-spacing characters */ /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ static const struct interval combining[] = { { 0x0300, 0x0357 }, { 0x035D, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, { 0x0591, 0x05A1 }, { 0x05A3, 0x05B9 }, { 0x05BB, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C4 }, { 0x0600, 0x0603 }, { 0x0610, 0x0615 }, { 0x064B, 0x0658 }, { 0x0670, 0x0670 }, { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 }, { 0x206A, 0x206F }, { 0x20D0, 0x20EA }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, { 0x1D167, 0x1D169 }, { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, { 0xE0100, 0xE01EF } }; /* test for 8-bit control characters */ if (ucs == 0) return 0; if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) return -1; /* binary search in table of non-spacing characters */ if (bisearch(ucs, combining, sizeof(combining) / sizeof(struct interval) - 1)) return 0; /* if we arrive here, ucs is not a combining or C0/C1 control character */ return 1 + (ucs >= 0x1100 && (ucs <= 0x115f || /* Hangul Jamo init. consonants */ ucs == 0x2329 || ucs == 0x232a || (ucs >= 0x2e80 && ucs <= 0xa4cf && ucs != 0x303f) || /* CJK ... Yi */ (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */ (ucs >= 0xffe0 && ucs <= 0xffe6) || (ucs >= 0x20000 && ucs <= 0x2fffd) || (ucs >= 0x30000 && ucs <= 0x3fffd))); } int mk_wcswidth(const wchar_t *pwcs, size_t n) { int w, width = 0; for (;*pwcs && n-- > 0; pwcs++) if ((w = mk_wcwidth(*pwcs)) < 0) return -1; else width += w; return width; } #endif int ustrwid(wchar_t const *s, int charset) { char buf[256]; int wid, len = ustrlen(s); charset_state state = CHARSET_INIT_STATE; wid = 0; while (len > 0) { int err; wchar_t const *s_orig; err = 0; s_orig = s; charset_from_unicode(&s, &len, buf, lenof(buf), charset, &state, &err); wid += wcswidth(s_orig, s - s_orig); if (err) { assert(len > 0 && *s); s++; len--; } } return wid; } int strwid(char const *s, int charset) { wchar_t buf[256]; int wid, len = strlen(s); charset_state state = CHARSET_INIT_STATE; wid = 0; while (len > 0) { int ret; ret = charset_to_unicode(&s, &len, buf, lenof(buf), charset, &state, NULL, 0); if (ret > 0) wid += wcswidth(buf, ret); } return wid; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������halibut-1.1/winhelp.c�������������������������������������������������������������������������������0000644�0001753�0001753�00000213602�12444773746�011572� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * winhelp.c a module to generate Windows .HLP files * * Documentation of the .HLP file format comes from the excellent * HELPFILE.TXT, published alongside the Help decompiler HELPDECO * by Manfred Winterhoff. This code would not have been possible * without his efforts. Many thanks. */ /* * Potential future features: * * - perhaps LZ77 compression? This appears to cause a phase order * problem: it's hard to do the compression until the data to be * compressed is finalised, and yet you can't finalise the data * to be compressed until you know how much of it is going into * which TOPICBLOCK in order to work out the offsets in the * topic headers - for which you have to have already done the * compression. Perhaps the thing to do is to implement an LZ77 * compressor that can guarantee to leave particular bytes in * the stream as literals, and then go back and fix the offsets * up later. Not pleasant. * * - It would be good to find out what relation (if any) the LCID * record in the |SYSTEM section bears to the codepage used in * the actual help text, so as to be able to vary that if the * user needs it. For the moment I suspect we're stuck with * Win1252. * * - tables might be nice. * * Unlikely future features: * * - Phrase compression sounds harder. It's reasonably easy * (though space-costly) to analyse all the text in the file to * determine the one key phrase which would save most space if * replaced by a reference everywhere it appears; but finding * the _1024_ most effective phrases seems much harder since a * naive analysis might find lots of phrases that all overlap * (so you wouldn't get the saving you expected, as after taking * out the first phrase the rest would never crop up). In * addition, MS hold US patent number 4955066 which may cover * phrase compression, so perhaps it's best just to leave it. * * Cleanup work: * * - sort out begin_topic. Ideally we should have a separate * topic_macro function that adds to the existing linkdata for * the topic, because that's more flexible than a variadic * function. This will be fiddly, though: if it's called before * whlp_begin_topic then we must buffer macros, and if it's * called afterwards then we must be able to go back and modify * the linkdata2 of the topic start block. Foo. * * - find out what should happen if a single topiclink crosses * _two_ topicblock boundaries. * * - What is the BlockSize in a topic header (first 4 bytes of * LinkData1 in a type 2 record) supposed to mean? How on earth * is it measured? The help file doesn't become perceptibly * corrupt if I frob it randomly; and on some occasions taking a * bit _out_ of the help file _increases_ that value. I have a * feeling it's completely made up and/or vestigial, so for the * moment I'm just making up a plausible value as I go along. */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <assert.h> #include <time.h> #include <stdarg.h> #include "halibut.h" #include "winhelp.h" #include "tree234.h" #ifdef WINHELP_TESTMODE /* * This lot is useful for testing. Something like it will also be * needed to use this module standalone. */ #define smalloc malloc #define srealloc realloc #define sfree free #define snew(type) ( (type *) smalloc (sizeof (type)) ) #define snewn(number, type) ( (type *) smalloc ((number) * sizeof (type)) ) #define sresize(array, len, type) \ ( (type *) srealloc ((array), (len) * sizeof (type)) ) #define lenof(array) ( sizeof(array) / sizeof(*(array)) ) char *dupstr(char *s) { char *r = snewn(1+strlen(s), char); strcpy(r,s); return r; } #endif #define UNUSEDARG(x) ( (x) = (x) ) #define GET_32BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8) | \ ((unsigned long)(unsigned char)(cp)[2] << 16) | \ ((unsigned long)(unsigned char)(cp)[3] << 24)) #define PUT_32BIT_LSB_FIRST(cp, value) do { \ (cp)[0] = 0xFF & (value); \ (cp)[1] = 0xFF & ((value) >> 8); \ (cp)[2] = 0xFF & ((value) >> 16); \ (cp)[3] = 0xFF & ((value) >> 24); } while (0) #define GET_16BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8)) #define PUT_16BIT_LSB_FIRST(cp, value) do { \ (cp)[0] = 0xFF & (value); \ (cp)[1] = 0xFF & ((value) >> 8); } while (0) #define MAX_PAGE_SIZE 0x800 /* max page size in any B-tree */ #define TOPIC_BLKSIZE 4096 /* implied by version/flags combo */ typedef struct WHLP_TOPIC_tag context; struct file { char *name; /* file name, will need freeing */ unsigned char *data; /* file data, will need freeing */ int pos; /* position for adding data */ int len; /* # of meaningful bytes in data */ int size; /* # of allocated bytes in data */ int fileoffset; /* offset in the real .HLP file */ }; struct indexrec { char *term; /* index term, will need freeing */ context *topic; /* topic it links to */ int count, offset; /* used when building |KWDATA */ }; struct topiclink { int topicoffset, topicpos; /* for referencing from elsewhere */ int recordtype; int len1, len2; unsigned char *data1, *data2; context *context; struct topiclink *nonscroll, *scroll, *nexttopic; int block_size; /* for the topic header - *boggle* */ }; struct WHLP_TOPIC_tag { char *name; /* needs freeing */ unsigned long hash; struct topiclink *link; /* this provides TOPICOFFSET */ context *browse_next, *browse_prev; char *title; /* needs freeing */ int index; /* arbitrary number */ }; struct fontdesc { char *font; int family, rendition, halfpoints; int r, g, b; }; struct WHLP_tag { tree234 *files; /* stores `struct file' */ tree234 *pre_contexts; /* stores `context' */ tree234 *contexts; /* also stores `context' */ tree234 *titles; /* _also_ stores `context' */ tree234 *text; /* stores `struct topiclink' */ tree234 *index; /* stores `struct indexrec' */ tree234 *tabstops; /* stores `int' */ tree234 *fontnames; /* stores `char *' */ tree234 *fontdescs; /* stores `struct fontdesc' */ struct file *systemfile; /* the |SYSTEM internal file */ context *ptopic; /* primary topic */ struct topiclink *prevtopic; /* to link type-2 records together */ struct topiclink *link; /* while building a topiclink */ unsigned char linkdata1[TOPIC_BLKSIZE]; /* while building a topiclink */ unsigned char linkdata2[TOPIC_BLKSIZE]; /* while building a topiclink */ int topicblock_remaining; /* while building |TOPIC section */ int lasttopiclink; /* while building |TOPIC section */ int firsttopiclink_offset; /* while building |TOPIC section */ int lasttopicstart; /* while building |TOPIC section */ int para_flags; int para_attrs[7]; int ncontexts; int picture_index; }; /* Functions to return the index and leaf data for B-tree contents. */ typedef int (*bt_index_fn)(const void *item, unsigned char *outbuf); typedef int (*bt_leaf_fn)(const void *item, unsigned char *outbuf); /* Forward references. */ static void whlp_para_reset(WHLP h); static struct file *whlp_new_file(WHLP h, char *name); static void whlp_file_add(struct file *f, const void *data, int len); static void whlp_file_add_char(struct file *f, int data); static void whlp_file_add_short(struct file *f, int data); static void whlp_file_add_long(struct file *f, int data); static void whlp_file_add_cushort(struct file *f, int data); #if 0 /* currently unused */ static void whlp_file_add_csshort(struct file *f, int data); #endif static void whlp_file_add_culong(struct file *f, int data); #if 0 /* currently unused */ static void whlp_file_add_cslong(struct file *f, int data); #endif static void whlp_file_fill(struct file *f, int len); static void whlp_file_seek(struct file *f, int pos, int whence); static int whlp_file_offset(struct file *f); /* ---------------------------------------------------------------------- * Fiddly little functions: B-tree compare, index and leaf functions. */ /* The master index maps file names to help-file offsets. */ static int filecmp(void *av, void *bv) { const struct file *a = (const struct file *)av; const struct file *b = (const struct file *)bv; return strcmp(a->name, b->name); } static int fileindex(const void *av, unsigned char *outbuf) { const struct file *a = (const struct file *)av; int len = 1+strlen(a->name); memcpy(outbuf, a->name, len); return len; } static int fileleaf(const void *av, unsigned char *outbuf) { const struct file *a = (const struct file *)av; int len = 1+strlen(a->name); memcpy(outbuf, a->name, len); PUT_32BIT_LSB_FIRST(outbuf+len, a->fileoffset); return len+4; } /* The |CONTEXT internal file maps help context hashes to TOPICOFFSETs. */ static int ctxcmp(void *av, void *bv) { const context *a = (const context *)av; const context *b = (const context *)bv; if ((signed long)a->hash < (signed long)b->hash) return -1; if ((signed long)a->hash > (signed long)b->hash) return +1; return 0; } static int ctxindex(const void *av, unsigned char *outbuf) { const context *a = (const context *)av; PUT_32BIT_LSB_FIRST(outbuf, a->hash); return 4; } static int ctxleaf(const void *av, unsigned char *outbuf) { const context *a = (const context *)av; PUT_32BIT_LSB_FIRST(outbuf, a->hash); PUT_32BIT_LSB_FIRST(outbuf+4, a->link->topicoffset); return 8; } /* The |TTLBTREE internal file maps TOPICOFFSETs to title strings. */ static int ttlcmp(void *av, void *bv) { const context *a = (const context *)av; const context *b = (const context *)bv; if (a->link->topicoffset < b->link->topicoffset) return -1; if (a->link->topicoffset > b->link->topicoffset) return +1; return 0; } static int ttlindex(const void *av, unsigned char *outbuf) { const context *a = (const context *)av; PUT_32BIT_LSB_FIRST(outbuf, a->link->topicoffset); return 4; } static int ttlleaf(const void *av, unsigned char *outbuf) { const context *a = (const context *)av; int slen; PUT_32BIT_LSB_FIRST(outbuf, a->link->topicoffset); slen = 1+strlen(a->title); memcpy(outbuf+4, a->title, slen); return 4+slen; } /* The |KWBTREE internal file maps index strings to TOPICOFFSETs. */ static int idxcmp(void *av, void *bv) { const struct indexrec *a = (const struct indexrec *)av; const struct indexrec *b = (const struct indexrec *)bv; int cmp; if ( (cmp = strcmp(a->term, b->term)) != 0) return cmp; /* Now sort on the index field of the topics. */ if (a->topic->index < b->topic->index) return -1; if (a->topic->index > b->topic->index) return +1; return 0; } static int idxindex(const void *av, unsigned char *outbuf) { const struct indexrec *a = (const struct indexrec *)av; int len = 1+strlen(a->term); memcpy(outbuf, a->term, len); return len; } static int idxleaf(const void *av, unsigned char *outbuf) { const struct indexrec *a = (const struct indexrec *)av; int len = 1+strlen(a->term); memcpy(outbuf, a->term, len); PUT_16BIT_LSB_FIRST(outbuf+len, a->count); PUT_32BIT_LSB_FIRST(outbuf+len+2, a->offset); return len+6; } /* * The internal `tabstops' B-tree stores pointers-to-int. Sorting * is by the low 16 bits of the number (above that is flags). */ static int tabcmp(void *av, void *bv) { const int *a = (const int *)av; const int *b = (const int *)bv; if ((*a & 0xFFFF) < (*b & 0xFFFF)) return -1; if ((*a & 0xFFFF) > (*b & 0xFFFF)) return +1; return 0; } /* The internal `fontnames' B-tree stores strings. */ static int fontcmp(void *av, void *bv) { const char *a = (const char *)av; const char *b = (const char *)bv; return strcmp(a,b); } /* ---------------------------------------------------------------------- * Manage help contexts and topics. */ /* * This is the code to compute the hash of a context name. Copied * straight from Winterhoff's documentation. */ static unsigned long context_hash(char *context) { signed char bytemapping[256] = "\x00\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF" "\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF" "\xF0\x0B\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\x0C\xFF" "\x0A\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F" "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x0B\x0C\x0D\x0E\x0D" "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F" "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F" "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F" "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F" "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F" "\x80\x81\x82\x83\x0B\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F" "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F" "\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF" "\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF" "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF"; unsigned long hash; /* * The hash algorithm starts the hash at 0 and updates it with * each character. Therefore, logically, the hash of an empty * string should be 0 (it starts at 0 and is never updated); * but Winterhoff says it is in fact 1. Shouldn't matter, since * I never plan to use empty context names, but I'll stick the * special case in here anyway. */ if (!*context) return 1; /* * Now compute the hash in the normal way. */ hash = 0; while (*context) { /* * Be careful of overflowing `unsigned long', for maximum * portability. */ /* * Multiply `hash' by 43. */ { unsigned long bottom, top; bottom = (hash & 0xFFFFUL) * 43; top = ((hash >> 16) & 0xFFFFUL) * 43; top += (bottom >> 16); bottom &= 0xFFFFUL; top &= 0xFFFFUL; hash = (top << 16) | bottom; } /* * Add the mapping value for this byte to `hash'. */ { int val = bytemapping[(unsigned char)*context]; if (val > 0 && hash > (0xFFFFFFFFUL - val)) { hash -= (0xFFFFFFFFUL - val) + 1; } else if (val < 0 && hash < (unsigned long)-val) { hash += (0xFFFFFFFFUL + val) + 1; } else hash += val; } context++; } return hash; } WHLP_TOPIC whlp_register_topic(WHLP h, char *context_name, char **clash) { context *ctx = snew(context); context *otherctx; /* * Index contexts in order of creation, just so there's some * sort of non-arbitrary ordering in the index B-tree. Call me * fussy, but I don't like indexing on pointer values because I * prefer the code to be deterministic when run under different * C libraries. */ ctx->index = h->ncontexts++; ctx->browse_prev = ctx->browse_next = NULL; if (context_name) { /* * We have a context name, which means we can put this * context straight into the `contexts' tree. */ ctx->name = dupstr(context_name); ctx->hash = context_hash(context_name); otherctx = add234(h->contexts, ctx); if (otherctx != ctx) { /* * Hash clash. Destroy the new context and return NULL, * providing the clashing string. */ sfree(ctx->name); sfree(ctx); if (clash) *clash = otherctx->name; return NULL; } } else { /* * We have no context name yet. Enter this into the * pre_contexts tree of anonymous topics, which we will go * through later and allocate unique context names and hash * values. */ ctx->name = NULL; addpos234(h->pre_contexts, ctx, count234(h->pre_contexts)); } return ctx; } void whlp_prepare(WHLP h) { /* * We must go through pre_contexts and allocate a context ID to * each anonymous context, making sure it doesn't clash with * the existing contexts. * * Our own context IDs will just be of the form `t00000001', * and we'll increment the number each time and skip over any * IDs that clash with existing context names. */ int ctx_num = 0; context *ctx, *otherctx; while ( (ctx = index234(h->pre_contexts, 0)) != NULL ) { delpos234(h->pre_contexts, 0); ctx->name = snewn(20, char); do { sprintf(ctx->name, "t%08d", ctx_num++); ctx->hash = context_hash(ctx->name); otherctx = add234(h->contexts, ctx); } while (otherctx != ctx); } /* * Ensure paragraph attributes are clear for the start of text * output. */ whlp_para_reset(h); } char *whlp_topic_id(WHLP_TOPIC topic) { return topic->name; } void whlp_begin_topic(WHLP h, WHLP_TOPIC topic, char *title, ...) { struct topiclink *link = snew(struct topiclink); int len, slen; char *macro; va_list ap; link->nexttopic = NULL; if (h->prevtopic) h->prevtopic->nexttopic = link; h->prevtopic = link; link->nonscroll = link->scroll = NULL; link->context = topic; link->block_size = 0; link->recordtype = 2; /* topic header */ link->len1 = 4*7; /* standard linkdata1 size */ link->data1 = snewn(link->len1, unsigned char); slen = strlen(title); assert(slen+1 <= TOPIC_BLKSIZE); memcpy(h->linkdata2, title, slen+1); len = slen+1; va_start(ap, title); while ( (macro = va_arg(ap, char *)) != NULL) { slen = strlen(macro); assert(len+slen+1 <= TOPIC_BLKSIZE); memcpy(h->linkdata2+len, macro, slen+1); len += slen+1; } va_end(ap); len--; /* lose the last \0 on the last macro */ link->len2 = len; link->data2 = snewn(link->len2, unsigned char); memcpy(link->data2, h->linkdata2, link->len2); topic->title = dupstr(title); topic->link = link; addpos234(h->text, link, count234(h->text)); } void whlp_browse_link(WHLP h, WHLP_TOPIC before, WHLP_TOPIC after) { UNUSEDARG(h); /* * See if the `before' topic is already linked to another one, * and break the link to that if so. Likewise the `after' * topic. */ if (before->browse_next) before->browse_next->browse_prev = NULL; if (after->browse_prev) after->browse_prev->browse_next = NULL; before->browse_next = after; after->browse_prev = before; } /* ---------------------------------------------------------------------- * Manage the actual generation of paragraph and text records. */ static void whlp_linkdata(WHLP h, int which, int c) { int *len = (which == 1 ? &h->link->len1 : &h->link->len2); unsigned char *data = (which == 1 ? h->linkdata1 : h->linkdata2); assert(*len < TOPIC_BLKSIZE); data[(*len)++] = c; } static void whlp_linkdata_short(WHLP h, int which, int data) { whlp_linkdata(h, which, data & 0xFF); whlp_linkdata(h, which, (data >> 8) & 0xFF); } static void whlp_linkdata_long(WHLP h, int which, int data) { whlp_linkdata(h, which, data & 0xFF); whlp_linkdata(h, which, (data >> 8) & 0xFF); whlp_linkdata(h, which, (data >> 16) & 0xFF); whlp_linkdata(h, which, (data >> 24) & 0xFF); } static void whlp_linkdata_cushort(WHLP h, int which, int data) { if (data <= 0x7F) { whlp_linkdata(h, which, data*2); } else { whlp_linkdata(h, which, 1 + (data%128 * 2)); whlp_linkdata(h, which, data/128); } } static void whlp_linkdata_csshort(WHLP h, int which, int data) { if (data >= -0x40 && data <= 0x3F) whlp_linkdata_cushort(h, which, data+64); else whlp_linkdata_cushort(h, which, data+16384); } static void whlp_linkdata_culong(WHLP h, int which, int data) { if (data <= 0x7FFF) { whlp_linkdata_short(h, which, data*2); } else { whlp_linkdata_short(h, which, 1 + (data%32768 * 2)); whlp_linkdata_short(h, which, data/32768); } } static void whlp_linkdata_cslong(WHLP h, int which, int data) { if (data >= -0x4000 && data <= 0x3FFF) whlp_linkdata_culong(h, which, data+16384); else whlp_linkdata_culong(h, which, data+67108864); } static void whlp_para_reset(WHLP h) { int *p; h->para_flags = 0; while ( (p = index234(h->tabstops, 0)) != NULL) { delpos234(h->tabstops, 0); sfree(p); } } void whlp_para_attr(WHLP h, int attr_id, int attr_param) { if (attr_id >= WHLP_PARA_SPACEABOVE && attr_id <= WHLP_PARA_FIRSTLINEINDENT) { h->para_flags |= 1 << attr_id; h->para_attrs[attr_id] = attr_param; } else if (attr_id == WHLP_PARA_ALIGNMENT) { h->para_flags &= ~0xC00; if (attr_param == WHLP_ALIGN_RIGHT) h->para_flags |= 0x400; else if (attr_param == WHLP_ALIGN_CENTRE) h->para_flags |= 0x800; } } void whlp_set_tabstop(WHLP h, int tabstop, int alignment) { int *p; if (alignment == WHLP_ALIGN_CENTRE) tabstop |= 0x20000; if (alignment == WHLP_ALIGN_RIGHT) tabstop |= 0x10000; p = snew(int); *p = tabstop; add234(h->tabstops, p); h->para_flags |= 0x0200; } void whlp_begin_para(WHLP h, int para_type) { struct topiclink *link = snew(struct topiclink); int i; /* * Clear these to NULL out of paranoia, although in records * that aren't type 2 they should never actually be needed. */ link->nexttopic = NULL; link->context = NULL; link->nonscroll = link->scroll = NULL; link->recordtype = 32; /* text record */ h->link = link; link->len1 = link->len2 = 0; link->data1 = h->linkdata1; link->data2 = h->linkdata2; if (para_type == WHLP_PARA_NONSCROLL && h->prevtopic && !h->prevtopic->nonscroll) h->prevtopic->nonscroll = link; if (para_type == WHLP_PARA_SCROLL && h->prevtopic && !h->prevtopic->scroll) h->prevtopic->scroll = link; /* * Now we're ready to start accumulating stuff in linkdata1 and * linkdata2. Next we build up the paragraph info. Note that * the TopicSize (cslong: size of LinkData1 minus the topicsize * and topiclength fields) and TopicLength (cushort: size of * LinkData2) fields are missing; we will put those on when we * end the paragraph. */ whlp_linkdata(h, 1, 0); /* must-be-0x00 */ whlp_linkdata(h, 1, 0x80); /* must-be-0x80 */ whlp_linkdata_short(h, 1, 0); /* Winterhoff says `id'; always 0 AFAICT */ whlp_linkdata_short(h, 1, h->para_flags); for (i = WHLP_PARA_SPACEABOVE; i <= WHLP_PARA_FIRSTLINEINDENT; i++) { if (h->para_flags & (1<<i)) whlp_linkdata_csshort(h, 1, h->para_attrs[i]); } if (h->para_flags & 0x0200) { int ntabs; /* * Write out tab stop data. */ ntabs = count234(h->tabstops); whlp_linkdata_csshort(h, 1, ntabs); for (i = 0; i < ntabs; i++) { int tab, *tabp; tabp = index234(h->tabstops, i); tab = *tabp; if (tab & 0x30000) tab |= 0x4000; whlp_linkdata_cushort(h, 1, tab & 0xFFFF); if (tab & 0x4000) whlp_linkdata_cushort(h, 1, tab >> 16); } } /* * Fine. Now we're ready to start writing actual text and * formatting commands. */ } void whlp_set_font(WHLP h, int font_id) { /* * Write a NUL into linkdata2 to cause the reader to flip over * to linkdata1 to see the formatting command. */ whlp_linkdata(h, 2, 0); /* * Now the formatting command is 0x80 followed by a short. */ whlp_linkdata(h, 1, 0x80); whlp_linkdata_short(h, 1, font_id); } void whlp_start_hyperlink(WHLP h, WHLP_TOPIC target) { /* * Write a NUL into linkdata2. */ whlp_linkdata(h, 2, 0); /* * Now the formatting command is 0xE3 followed by the context * hash. */ whlp_linkdata(h, 1, 0xE3); whlp_linkdata_long(h, 1, target->hash); } void whlp_end_hyperlink(WHLP h) { /* * Write a NUL into linkdata2. */ whlp_linkdata(h, 2, 0); /* * Now the formatting command is 0x89. */ whlp_linkdata(h, 1, 0x89); } void whlp_tab(WHLP h) { /* * Write a NUL into linkdata2. */ whlp_linkdata(h, 2, 0); /* * Now the formatting command is 0x83. */ whlp_linkdata(h, 1, 0x83); } int whlp_add_picture(WHLP h, int wd, int ht, const void *vpicdata, const unsigned long *palette) { struct file *f; char filename[80]; const unsigned char *picdata = (const unsigned char *)vpicdata; int picstart, picoff, imgoff, imgstart; int palettelen; int i, index; int wdrounded; /* * Determine the limit of the colour palette. */ palettelen = -1; for (i = 0; i < wd*ht; i++) if (palettelen < picdata[i]) palettelen = picdata[i]; palettelen++; /* * Round up the width to the next multiple of 4. */ wdrounded = (wd + 3) & ~3; index = h->picture_index++; sprintf(filename, "bm%d", index); f = whlp_new_file(h, filename); whlp_file_add_short(f, 0x706C); /* magic number */ whlp_file_add_short(f, 1); /* number of pictures */ picoff = whlp_file_offset(f); whlp_file_add_long(f, 0); /* offset of first (only) picture */ picstart = whlp_file_offset(f); whlp_file_add_char(f, 6); /* DIB */ whlp_file_add_char(f, 0); /* no packing */ whlp_file_add_culong(f, 100); /* xdpi */ whlp_file_add_culong(f, 100); /* ydpi */ whlp_file_add_cushort(f, 1); /* planes (?) */ whlp_file_add_cushort(f, 8); /* bitcount */ whlp_file_add_culong(f, wd); /* width */ whlp_file_add_culong(f, ht); /* height */ whlp_file_add_culong(f, palettelen);/* colours used */ whlp_file_add_culong(f, palettelen);/* colours important */ whlp_file_add_culong(f, wdrounded*ht); /* `compressed' data size */ whlp_file_add_culong(f, 0); /* hotspot size (no hotspots) */ imgoff = whlp_file_offset(f); whlp_file_add_long(f, 0); /* offset of `compressed' data */ whlp_file_add_long(f, 0); /* offset of hotspot data (none) */ for (i = 0; i < palettelen; i++) whlp_file_add_long(f, palette[i]); imgstart = whlp_file_offset(f); /* * Windows Help files, like BMP, start from the bottom scanline. */ for (i = ht; i-- > 0 ;) { whlp_file_add(f, picdata + i*wd, wd); if (wd < wdrounded) whlp_file_add(f, "\0\0\0", wdrounded - wd); } /* Now go back and fix up internal offsets */ whlp_file_seek(f, picoff, 0); whlp_file_add_long(f, picstart); whlp_file_seek(f, imgoff, 0); whlp_file_add_long(f, imgstart - picstart); whlp_file_seek(f, 0, 2); return index; } void whlp_ref_picture(WHLP h, int picid) { /* * Write a NUL into linkdata2. */ whlp_linkdata(h, 2, 0); /* * Write the formatting command and its followup data to * specify a picture in a separate file. */ whlp_linkdata(h, 1, 0x86); whlp_linkdata(h, 1, 3); /* type (picture without hotspots) */ whlp_linkdata_cslong(h, 1, 4); whlp_linkdata_short(h, 1, 0); whlp_linkdata_short(h, 1, picid); } void whlp_text(WHLP h, char *text) { while (*text) { whlp_linkdata(h, 2, *text++); } } void whlp_end_para(WHLP h) { int data1cut; /* * Round off the paragraph with 0x82 and 0xFF formatting * commands. Each requires a NUL in linkdata2. */ whlp_linkdata(h, 2, 0); whlp_linkdata(h, 1, 0x82); whlp_linkdata(h, 2, 0); whlp_linkdata(h, 1, 0xFF); /* * Now finish up: create the header of linkdata1 (TopicLength * and TopicSize fields), allocate the real linkdata1 and * linkdata2 fields, and copy them out of the buffers in h. * Then insert the finished topiclink into the `text' tree, and * clean up. */ data1cut = h->link->len1; whlp_linkdata_cslong(h, 1, data1cut); whlp_linkdata_cushort(h, 1, h->link->len2); h->link->data1 = snewn(h->link->len1, unsigned char); memcpy(h->link->data1, h->linkdata1 + data1cut, h->link->len1 - data1cut); memcpy(h->link->data1 + h->link->len1 - data1cut, h->linkdata1, data1cut); h->link->data2 = snewn(h->link->len2, unsigned char); memcpy(h->link->data2, h->linkdata2, h->link->len2); addpos234(h->text, h->link, count234(h->text)); /* Hack: accumulate the `blocksize' parameter in the topic header. */ if (h->prevtopic) h->prevtopic->block_size += 21 + h->link->len1 + h->link->len2; h->link = NULL; /* this is now in the tree */ whlp_para_reset(h); } /* ---------------------------------------------------------------------- * Manage the layout and generation of the |TOPIC section. */ static void whlp_topicsect_write(WHLP h, struct file *f, void *data, int len, int can_break) { unsigned char *p = (unsigned char *)data; if (h->topicblock_remaining <= 0 || h->topicblock_remaining < can_break) { /* * Start a new block. */ if (h->topicblock_remaining > 0) whlp_file_fill(f, h->topicblock_remaining); whlp_file_add_long(f, h->lasttopiclink); h->firsttopiclink_offset = whlp_file_offset(f); whlp_file_add_long(f, -1L); /* this will be filled in later */ whlp_file_add_long(f, h->lasttopicstart); h->topicblock_remaining = TOPIC_BLKSIZE - 12; } while (len > 0) { int thislen = (h->topicblock_remaining < len ? h->topicblock_remaining : len); whlp_file_add(f, p, thislen); p += thislen; len -= thislen; h->topicblock_remaining -= thislen; if (len > 0 && h->topicblock_remaining <= 0) { /* * Start a new block. */ whlp_file_add_long(f, h->lasttopiclink); h->firsttopiclink_offset = whlp_file_offset(f); whlp_file_add_long(f, -1L); /* this will be filled in later */ whlp_file_add_long(f, h->lasttopicstart); h->topicblock_remaining = TOPIC_BLKSIZE - 12; } } } static void whlp_topic_layout(WHLP h) { int block, offset, pos; int i, nlinks, size; int topicnum; struct topiclink *link; struct file *f; /* * Create a final TOPICLINK containing no usable data. */ link = snew(struct topiclink); link->nexttopic = NULL; if (h->prevtopic) h->prevtopic->nexttopic = link; h->prevtopic = link; link->data1 = snewn(0x1c, unsigned char); link->block_size = 0; link->data2 = NULL; link->len1 = 0x1c; link->len2 = 0; link->nexttopic = NULL; link->recordtype = 2; link->nonscroll = link->scroll = NULL; link->context = NULL; addpos234(h->text, link, count234(h->text)); /* * Each TOPICBLOCK has space for TOPIC_BLKSIZE-12 bytes. The * size of each TOPICLINK is 21 bytes plus the combined lengths * of LinkData1 and LinkData2. So we can now go through and * break up the TOPICLINKs into TOPICBLOCKs, and also set up * the TOPICOFFSET and TOPICPOS of each one while we do so. */ block = 0; offset = 0; pos = 12; nlinks = count234(h->text); for (i = 0; i < nlinks; i++) { link = index234(h->text, i); size = 21 + link->len1 + link->len2; /* * We can't split within the topicblock header or within * linkdata1. So if the split would fall in that area, * start a new block _now_. */ if (TOPIC_BLKSIZE - pos < 21 + link->len1) { block++; offset = 0; pos = 12; } link->topicoffset = block * 0x8000 + offset; link->topicpos = block * 0x4000 + pos; pos += size; if (link->recordtype != 2) /* TOPICOFFSET doesn't count titles */ offset += link->len2; while (pos > TOPIC_BLKSIZE) { block++; offset = 0; pos -= TOPIC_BLKSIZE - 12; } } /* * Now we have laid out the TOPICLINKs into blocks, and * determined the final TOPICOFFSET and TOPICPOS of each one. * So now we can go through and write the headers of the type-2 * records. */ topicnum = 0; for (i = 0; i < nlinks; i++) { link = index234(h->text, i); if (link->recordtype != 2) continue; PUT_32BIT_LSB_FIRST(link->data1 + 0, link->block_size); if (link->context && link->context->browse_prev) PUT_32BIT_LSB_FIRST(link->data1 + 4, link->context->browse_prev->link->topicoffset); else PUT_32BIT_LSB_FIRST(link->data1 + 4, 0xFFFFFFFFL); if (link->context && link->context->browse_next) PUT_32BIT_LSB_FIRST(link->data1 + 8, link->context->browse_next->link->topicoffset); else PUT_32BIT_LSB_FIRST(link->data1 + 8, 0xFFFFFFFFL); PUT_32BIT_LSB_FIRST(link->data1 + 12, topicnum); topicnum++; if (link->nonscroll) PUT_32BIT_LSB_FIRST(link->data1 + 16, link->nonscroll->topicpos); else PUT_32BIT_LSB_FIRST(link->data1 + 16, 0xFFFFFFFFL); if (link->scroll) PUT_32BIT_LSB_FIRST(link->data1 + 20, link->scroll->topicpos); else PUT_32BIT_LSB_FIRST(link->data1 + 20, 0xFFFFFFFFL); if (link->nexttopic) PUT_32BIT_LSB_FIRST(link->data1 + 24, link->nexttopic->topicpos); else PUT_32BIT_LSB_FIRST(link->data1 + 24, 0xFFFFFFFFL); } /* * Having done all _that_, we're now finally ready to go * through and create the |TOPIC section in its final form. */ h->lasttopiclink = -1L; h->lasttopicstart = 0L; f = whlp_new_file(h, "|TOPIC"); h->topicblock_remaining = -1; whlp_topicsect_write(h, f, NULL, 0, 0); /* start the first block */ for (i = 0; i < nlinks; i++) { unsigned char header[21]; struct topiclink *otherlink; link = index234(h->text, i); /* * Create and output the TOPICLINK header. */ PUT_32BIT_LSB_FIRST(header + 0, 21 + link->len1 + link->len2); PUT_32BIT_LSB_FIRST(header + 4, link->len2); if (i == 0) { PUT_32BIT_LSB_FIRST(header + 8, 0xFFFFFFFFL); } else { otherlink = index234(h->text, i-1); PUT_32BIT_LSB_FIRST(header + 8, otherlink->topicpos); } if (i+1 >= nlinks) { PUT_32BIT_LSB_FIRST(header + 12, 0xFFFFFFFFL); } else { otherlink = index234(h->text, i+1); PUT_32BIT_LSB_FIRST(header + 12, otherlink->topicpos); } PUT_32BIT_LSB_FIRST(header + 16, 21 + link->len1); header[20] = link->recordtype; whlp_topicsect_write(h, f, header, 21, 21 + link->len1); /* * Fill in the `first topiclink' pointer in the block * header if appropriate. (We do this _after_ outputting * the header because then we can be sure we'll be in the * same block as we think we are.) */ if (h->firsttopiclink_offset > 0) { whlp_file_seek(f, h->firsttopiclink_offset, 0); whlp_file_add_long(f, link->topicpos); h->firsttopiclink_offset = 0; whlp_file_seek(f, 0, 2); } /* * Update the `last topiclink', and possibly `last * topicstart', pointers. */ h->lasttopiclink = link->topicpos; if (link->recordtype == 2) h->lasttopicstart = link->topicpos; /* * Output LinkData1 and LinkData2. */ whlp_topicsect_write(h, f, link->data1, link->len1, link->len1); whlp_topicsect_write(h, f, link->data2, link->len2, 0); /* * Output the block header. */ link = index234(h->text, i); } } /* ---------------------------------------------------------------------- * Manage the index sections (|KWDATA, |KWMAP, |KWBTREE). */ void whlp_index_term(WHLP h, char *index, WHLP_TOPIC topic) { struct indexrec *idx = snew(struct indexrec); idx->term = dupstr(index); idx->topic = topic; /* * If this reference is already in the tree, just silently drop * the duplicate. */ if (add234(h->index, idx) != idx) { sfree(idx->term); sfree(idx); } } static void whlp_build_kwdata(WHLP h) { struct file *f; int i; struct indexrec *first, *next; f = whlp_new_file(h, "|KWDATA"); /* * Go through the index B-tree, condensing all sequences of * records with the same term into a single one with a valid * (count,offset) pair, and building up the KWDATA section. */ i = 0; while ( (first = index234(h->index, i)) != NULL) { first->count = 1; first->offset = whlp_file_offset(f); whlp_file_add_long(f, first->topic->link->topicoffset); i++; while ( (next = index234(h->index, i)) != NULL && !strcmp(first->term, next->term)) { /* * The next index record has the same term. Fold it * into this one and remove from the tree. */ whlp_file_add_long(f, next->topic->link->topicoffset); first->count++; delpos234(h->index, i); sfree(next->term); sfree(next); } } /* * Now we should have `index' in a form that's ready to * construct |KWBTREE. So we can return. */ } /* ---------------------------------------------------------------------- * Standard chunks of data for the |SYSTEM and |FONT sections. */ static void whlp_system_record(struct file *f, int id, const void *data, int length) { whlp_file_add_short(f, id); whlp_file_add_short(f, length); whlp_file_add(f, data, length); } static void whlp_standard_systemsection(struct file *f) { const char lcid[] = { 0, 0, 0, 0, 0, 0, 0, 0, 9, 4 }; const char charset[] = { 0, 0, 0, 2, 0 }; whlp_file_add_short(f, 0x36C); /* magic number */ whlp_file_add_short(f, 33); /* minor version: HCW 4.00 Win95+ */ whlp_file_add_short(f, 1); /* major version */ whlp_file_add_long(f, time(NULL)); /* generation date */ whlp_file_add_short(f, 0); /* flags=0 means no compression */ /* * Add some magic locale identifier information. (We ought to * find out something about what all this means; see the TODO * list at the top of the file.) */ whlp_system_record(f, 9, lcid, sizeof(lcid)); whlp_system_record(f, 11, charset, sizeof(charset)); } void whlp_title(WHLP h, char *title) { whlp_system_record(h->systemfile, 1, title, 1+strlen(title)); } void whlp_copyright(WHLP h, char *copyright) { whlp_system_record(h->systemfile, 2, copyright, 1+strlen(copyright)); } void whlp_start_macro(WHLP h, char *macro) { whlp_system_record(h->systemfile, 4, macro, 1+strlen(macro)); } void whlp_primary_topic(WHLP h, WHLP_TOPIC t) { h->ptopic = t; } static void whlp_do_primary_topic(WHLP h) { unsigned char firsttopic[4]; PUT_32BIT_LSB_FIRST(firsttopic, h->ptopic->link->topicoffset); whlp_system_record(h->systemfile, 3, firsttopic, sizeof(firsttopic)); } int whlp_create_font(WHLP h, char *font, int family, int halfpoints, int rendition, int r, int g, int b) { char *fontname = dupstr(font); struct fontdesc *fontdesc; int index; font = add234(h->fontnames, fontname); if (font != fontname) { /* The font name was already present. Free the new copy. */ sfree(fontname); } fontdesc = snew(struct fontdesc); fontdesc->font = font; fontdesc->family = family; fontdesc->halfpoints = halfpoints; fontdesc->rendition = rendition; fontdesc->r = r; fontdesc->g = g; fontdesc->b = b; index = count234(h->fontdescs); addpos234(h->fontdescs, fontdesc, index); return index; } static void whlp_make_fontsection(WHLP h, struct file *f) { int i; char *fontname; struct fontdesc *fontdesc; /* * Header block: number of font names, number of font * descriptors, offset to font names, and offset to font * descriptors. */ whlp_file_add_short(f, count234(h->fontnames)); whlp_file_add_short(f, count234(h->fontdescs)); whlp_file_add_short(f, 8); whlp_file_add_short(f, 8 + 32 * count234(h->fontnames)); /* * Font names. */ for (i = 0; (fontname = index234(h->fontnames, i)) != NULL; i++) { char data[32]; memset(data, i, sizeof(data)); strncpy(data, fontname, sizeof(data)); whlp_file_add(f, data, sizeof(data)); } /* * Font descriptors. */ for (i = 0; (fontdesc = index234(h->fontdescs, i)) != NULL; i++) { int fontpos; void *ret; ret = findpos234(h->fontnames, fontdesc->font, NULL, &fontpos); assert(ret != NULL); whlp_file_add_char(f, fontdesc->rendition); whlp_file_add_char(f, fontdesc->halfpoints); whlp_file_add_char(f, fontdesc->family); whlp_file_add_short(f, fontpos); /* Foreground RGB */ whlp_file_add_char(f, fontdesc->r); whlp_file_add_char(f, fontdesc->g); whlp_file_add_char(f, fontdesc->b); /* Background RGB is apparently unused and always set to zero */ whlp_file_add_char(f, 0); whlp_file_add_char(f, 0); whlp_file_add_char(f, 0); } } /* ---------------------------------------------------------------------- * Routines to manage a B-tree type file. */ static void whlp_make_btree(struct file *f, int flags, int pagesize, char *dataformat, tree234 *tree, struct file *map, bt_index_fn indexfn, bt_leaf_fn leaffn) { void **page_elements = NULL; int npages = 0, pagessize = 0; int npages_this_level, nentries, nlevels; int total_leaf_entries; unsigned char btdata[MAX_PAGE_SIZE]; int btlen; int page_start, fixups_offset, unused_bytes; void *element; int index; assert(pagesize <= MAX_PAGE_SIZE); /* * Start with the B-tree header. We'll have to come back and * fill in a few bits later. */ whlp_file_add_short(f, 0x293B); /* magic number */ whlp_file_add_short(f, flags); whlp_file_add_short(f, pagesize); { char data[16]; memset(data, 0, sizeof(data)); assert(strlen(dataformat) <= sizeof(data)); memcpy(data, dataformat, strlen(dataformat)); whlp_file_add(f, data, sizeof(data)); } whlp_file_add_short(f, 0); /* must-be-zero */ fixups_offset = whlp_file_offset(f); whlp_file_add_short(f, 0); /* page splits; fix up later */ whlp_file_add_short(f, 0); /* root page index; fix up later */ whlp_file_add_short(f, -1); /* must-be-minus-one */ whlp_file_add_short(f, 0); /* total number of pages; fix later */ whlp_file_add_short(f, 0); /* number of levels; fix later */ whlp_file_add_long(f, count234(tree));/* total B-tree entries */ /* * If we have a map section, leave space at the start for its * element count. */ if (map) { whlp_file_add_short(map, 0); } /* * Now create the leaf pages. */ index = 0; npages_this_level = 0; total_leaf_entries = 0; element = index234(tree, index); while (element) { /* * Make a new leaf page. */ npages_this_level++; if (npages >= pagessize) { pagessize = npages + 32; page_elements = sresize(page_elements, pagessize, void *); } page_elements[npages++] = element; /* * Leave space in the leaf page for the header. We'll * come back and add it later. */ page_start = whlp_file_offset(f); whlp_file_add(f, "12345678", 8); unused_bytes = pagesize - 8; nentries = 0; /* * Now add leaf entries until we run out of room, or out of * elements. */ while (element) { btlen = leaffn(element, btdata); if (btlen > unused_bytes) break; whlp_file_add(f, btdata, btlen); unused_bytes -= btlen; nentries++; index++; element = index234(tree, index); } /* * Now add the unused bytes, and then go back and put * in the header. */ whlp_file_fill(f, unused_bytes); whlp_file_seek(f, page_start, 0); whlp_file_add_short(f, unused_bytes); whlp_file_add_short(f, nentries); /* Previous-page indicator will automatically go to -1 when * absent. */ whlp_file_add_short(f, npages-2); /* Next-page indicator must be -1 if we're at the end. */ if (!element) whlp_file_add_short(f, -1); else whlp_file_add_short(f, npages); whlp_file_seek(f, 0, 2); /* * If we have a map section, add a map entry. */ if (map) { whlp_file_add_long(map, total_leaf_entries); whlp_file_add_short(map, npages_this_level-1); } total_leaf_entries += nentries; } /* * If we have a map section, write the total number of map * entries into it. */ if (map) { whlp_file_seek(map, 0, 0); whlp_file_add_short(map, npages_this_level); whlp_file_seek(map, 0, 2); } /* * Now create further levels until we're down to one page. */ nlevels = 1; while (npages_this_level > 1) { int first = npages - npages_this_level; int last = npages - 1; int current; nlevels++; npages_this_level = 0; current = first; while (current <= last) { /* * Make a new index page. */ npages_this_level++; if (npages >= pagessize) { pagessize = npages + 32; page_elements = sresize(page_elements, pagessize, void *); } page_elements[npages++] = page_elements[current]; /* * Leave space for some of the header, but we can put * in the PreviousPage link already. */ page_start = whlp_file_offset(f); whlp_file_add(f, "1234", 4); whlp_file_add_short(f, current); unused_bytes = pagesize - 6; /* * Now add index entries until we run out of either * space or pages. */ current++; nentries = 0; while (current <= last) { btlen = indexfn(page_elements[current], btdata); if (btlen + 2 > unused_bytes) break; whlp_file_add(f, btdata, btlen); whlp_file_add_short(f, current); unused_bytes -= btlen+2; nentries++; current++; } /* * Now add the unused bytes, and then go back and put * in the header. */ whlp_file_fill(f, unused_bytes); whlp_file_seek(f, page_start, 0); whlp_file_add_short(f, unused_bytes); whlp_file_add_short(f, nentries); whlp_file_seek(f, 0, 2); } } /* * Now we have all our pages ready, and we know where our root * page is. Fix up the main B-tree header. */ whlp_file_seek(f, fixups_offset, 0); /* Creation of every page requires a split unless it's the first in * a new level. Hence, page splits equals pages minus levels. */ whlp_file_add_short(f, npages - nlevels); whlp_file_add_short(f, npages-1); /* root page index */ whlp_file_add_short(f, -1); /* must-be-minus-one */ whlp_file_add_short(f, npages); /* total number of pages */ whlp_file_add_short(f, nlevels); /* number of levels */ /* Just for tidiness, seek to the end of the file :-) */ whlp_file_seek(f, 0, 2); /* Clean up. */ sfree(page_elements); } /* ---------------------------------------------------------------------- * Routines to manage the `internal file' structure. */ static struct file *whlp_new_file(WHLP h, char *name) { struct file *f; f = snew(struct file); f->data = NULL; f->pos = f->len = f->size = 0; if (name) { f->name = dupstr(name); add234(h->files, f); } else { f->name = NULL; } return f; } static void whlp_free_file(struct file *f) { sfree(f->data); sfree(f->name); /* may be NULL */ sfree(f); } static void whlp_file_add(struct file *f, const void *data, int len) { if (f->pos + len > f->size) { f->size = f->pos + len + 1024; f->data = sresize(f->data, f->size, unsigned char); } memcpy(f->data + f->pos, data, len); f->pos += len; if (f->len < f->pos) f->len = f->pos; } static void whlp_file_add_char(struct file *f, int data) { unsigned char s; s = data & 0xFF; whlp_file_add(f, &s, 1); } static void whlp_file_add_short(struct file *f, int data) { unsigned char s[2]; PUT_16BIT_LSB_FIRST(s, data); whlp_file_add(f, s, 2); } static void whlp_file_add_long(struct file *f, int data) { unsigned char s[4]; PUT_32BIT_LSB_FIRST(s, data); whlp_file_add(f, s, 4); } static void whlp_file_add_cushort(struct file *f, int data) { if (data <= 0x7F) { whlp_file_add_char(f, data*2); } else { whlp_file_add_char(f, 1 + (data%128 * 2)); whlp_file_add_char(f, data/128); } } #if 0 /* currently unused */ static void whlp_file_add_csshort(struct file *f, int data) { if (data >= -0x40 && data <= 0x3F) whlp_file_add_cushort(f, data+64); else whlp_file_add_cushort(f, data+16384); } #endif static void whlp_file_add_culong(struct file *f, int data) { if (data <= 0x7FFF) { whlp_file_add_short(f, data*2); } else { whlp_file_add_short(f, 1 + (data%32768 * 2)); whlp_file_add_short(f, data/32768); } } #if 0 /* currently unused */ static void whlp_file_add_cslong(struct file *f, int data) { if (data >= -0x4000 && data <= 0x3FFF) whlp_file_add_culong(f, data+16384); else whlp_file_add_culong(f, data+67108864); } #endif static void whlp_file_fill(struct file *f, int len) { if (f->pos + len > f->size) { f->size = f->pos + len + 1024; f->data = sresize(f->data, f->size, unsigned char); } memset(f->data + f->pos, 0, len); f->pos += len; if (f->len < f->pos) f->len = f->pos; } static void whlp_file_seek(struct file *f, int pos, int whence) { f->pos = (whence == 0 ? 0 : whence == 1 ? f->pos : f->len) + pos; } static int whlp_file_offset(struct file *f) { return f->pos; } /* ---------------------------------------------------------------------- * Open and close routines; final wrapper around everything. */ WHLP whlp_new(void) { WHLP ret; struct file *f; ret = snew(struct WHLP_tag); /* * Internal B-trees. */ ret->files = newtree234(filecmp); ret->pre_contexts = newtree234(NULL); ret->contexts = newtree234(ctxcmp); ret->titles = newtree234(ttlcmp); ret->text = newtree234(NULL); ret->index = newtree234(idxcmp); ret->tabstops = newtree234(tabcmp); ret->fontnames = newtree234(fontcmp); ret->fontdescs = newtree234(NULL); /* * Some standard files. */ f = whlp_new_file(ret, "|CTXOMAP"); whlp_file_add_short(f, 0); /* dummy section */ f = whlp_new_file(ret, "|SYSTEM"); whlp_standard_systemsection(f); ret->systemfile = f; /* * Other variables. */ ret->prevtopic = NULL; ret->ncontexts = 0; ret->link = NULL; ret->picture_index = 0; return ret; } void whlp_close(WHLP h, char *filename) { FILE *fp; int filecount, offset, index, filelen; struct file *file, *map, *md; context *ctx; int has_index; /* * Lay out the topic section. */ whlp_topic_layout(h); /* * Finish off the system section. */ whlp_do_primary_topic(h); /* * Assemble the font section. */ file = whlp_new_file(h, "|FONT"); whlp_make_fontsection(h, file); /* * Set up the index. */ has_index = (count234(h->index) != 0); if (has_index) whlp_build_kwdata(h); /* * Set up the `titles' B-tree for the |TTLBTREE section. */ for (index = 0; (ctx = index234(h->contexts, index)) != NULL; index++) add234(h->titles, ctx); /* * Construct the various B-trees. */ file = whlp_new_file(h, "|CONTEXT"); whlp_make_btree(file, 0x0002, 0x0800, "L4", h->contexts, NULL, ctxindex, ctxleaf); file = whlp_new_file(h, "|TTLBTREE"); whlp_make_btree(file, 0x0002, 0x0800, "Lz", h->titles, NULL, ttlindex, ttlleaf); if (has_index) { file = whlp_new_file(h, "|KWBTREE"); map = whlp_new_file(h, "|KWMAP"); whlp_make_btree(file, 0x0002, 0x0800, "F24", h->index, map, idxindex, idxleaf); } /* * Open the output file. */ fp = fopen(filename, "wb"); if (!fp) { whlp_abandon(h); return; } /* * Work out all the file offsets. */ filecount = count234(h->files); offset = 16; /* just after header */ for (index = 0; index < filecount; index++) { file = index234(h->files, index); file->fileoffset = offset; offset += 9 + file->len; /* 9 is size of file header */ } /* Now `offset' holds what will be the offset of the master directory. */ md = whlp_new_file(h, NULL); /* master directory file */ whlp_make_btree(md, 0x0402, 0x0400, "z4", h->files, NULL, fileindex, fileleaf); filelen = offset + 9 + md->len; /* * Write out the file header. */ { unsigned char header[16]; PUT_32BIT_LSB_FIRST(header+0, 0x00035F3FL); /* magic */ PUT_32BIT_LSB_FIRST(header+4, offset); /* offset to directory */ PUT_32BIT_LSB_FIRST(header+8, 0xFFFFFFFFL); /* first free block */ PUT_32BIT_LSB_FIRST(header+12, filelen); /* total file length */ fwrite(header, 1, 16, fp); } /* * Now write out each file. */ for (index = 0; index <= filecount; index++) { int used, reserved; unsigned char header[9]; if (index == filecount) file = md; /* master directory comes last */ else file = index234(h->files, index); used = file->len; reserved = used + 9; /* File header. */ PUT_32BIT_LSB_FIRST(header+0, reserved); PUT_32BIT_LSB_FIRST(header+4, used); header[8] = 0; /* flags */ fwrite(header, 1, 9, fp); /* File data. */ fwrite(file->data, 1, file->len, fp); } fclose(fp); whlp_free_file(md); whlp_abandon(h); /* now free everything */ } void whlp_abandon(WHLP h) { struct file *f; struct indexrec *idx; struct topiclink *link; struct fontdesc *fontdesc; char *fontname; context *ctx; /* Get rid of any lingering tab stops. */ whlp_para_reset(h); /* Delete the (now empty) tabstops tree. */ freetree234(h->tabstops); /* Delete the index tree and all its entries. */ while ( (idx = index234(h->index, 0)) != NULL) { delpos234(h->index, 0); sfree(idx->term); sfree(idx); } freetree234(h->index); /* Delete the text tree and all its topiclinks. */ while ( (link = index234(h->text, 0)) != NULL) { delpos234(h->text, 0); sfree(link->data1); /* may be NULL */ sfree(link->data2); /* may be NULL */ sfree(link); } freetree234(h->text); /* Delete the fontdescs tree and all its entries. */ while ( (fontdesc = index234(h->fontdescs, 0)) != NULL) { delpos234(h->fontdescs, 0); sfree(fontdesc); } freetree234(h->fontdescs); /* Delete the fontnames tree and all its entries. */ while ( (fontname = index234(h->fontnames, 0)) != NULL) { delpos234(h->fontnames, 0); sfree(fontname); } freetree234(h->fontnames); /* There might be an unclosed paragraph in h->link. */ if (h->link) sfree(h->link); /* if so it won't have data1 or data2 */ /* * `titles' contains copies of the `contexts' entries, so we * don't need to free them here. */ freetree234(h->titles); /* * `contexts' and `pre_contexts' _both_ contain contexts that * need freeing. (pre_contexts shouldn't contain any, unless * the help generation was abandoned half-way through.) */ while ( (ctx = index234(h->pre_contexts, 0)) != NULL) { delpos234(h->index, 0); sfree(ctx->name); sfree(ctx->title); sfree(ctx); } freetree234(h->pre_contexts); while ( (ctx = index234(h->contexts, 0)) != NULL) { delpos234(h->contexts, 0); sfree(ctx->name); sfree(ctx->title); sfree(ctx); } freetree234(h->contexts); /* * Free all the internal files. */ while ( (f = index234(h->files, 0)) != NULL ) { delpos234(h->files, 0); whlp_free_file(f); } freetree234(h->files); sfree(h); } #ifdef WINHELP_TESTMODE #ifdef PICTURE_FROM_CMDLINE #include "png.h" #include "colquant.h" #include "dither.h" #endif int main(int argc, char **argv) { WHLP h; WHLP_TOPIC t1, t2, t3; char *e; char mymacro[100]; h = whlp_new(); whlp_title(h, "Test Help File"); whlp_copyright(h, "This manual is copyright \251 2001 Simon Tatham." " All rights reversed."); whlp_start_macro(h, "CB(\"btn_about\",\"&About\",\"About()\")"); whlp_start_macro(h, "CB(\"btn_up\",\"&Up\",\"Contents()\")"); whlp_start_macro(h, "BrowseButtons()"); whlp_create_font(h, "Arial", WHLP_FONTFAM_SANS, 30, 0, 0, 0, 0); whlp_create_font(h, "Times New Roman", WHLP_FONTFAM_SERIF, 24, WHLP_FONT_STRIKEOUT, 0, 0, 0); whlp_create_font(h, "Times New Roman", WHLP_FONTFAM_SERIF, 24, WHLP_FONT_ITALIC, 0, 0, 0); whlp_create_font(h, "Courier New", WHLP_FONTFAM_FIXED, 24, 0, 0, 0, 0); t1 = whlp_register_topic(h, "foobar", &e); assert(t1 != NULL); t2 = whlp_register_topic(h, "M359HPEHGW", &e); assert(t2 != NULL); t3 = whlp_register_topic(h, "Y5VQEXZQVJ", &e); assert(t3 == NULL && !strcmp(e, "M359HPEHGW")); t3 = whlp_register_topic(h, NULL, NULL); assert(t3 != NULL); whlp_primary_topic(h, t2); whlp_prepare(h); whlp_begin_topic(h, t1, "First Topic", "DB(\"btn_up\")", NULL); whlp_begin_para(h, WHLP_PARA_NONSCROLL); whlp_set_font(h, 0); whlp_text(h, "Foobar"); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "This is a silly paragraph with "); whlp_set_font(h, 3); whlp_text(h, "code"); whlp_set_font(h, 1); whlp_text(h, " in it."); whlp_end_para(h); whlp_para_attr(h, WHLP_PARA_SPACEABOVE, 12); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "This second, equally silly, paragraph has "); whlp_set_font(h, 2); whlp_text(h, "emphasis"); whlp_set_font(h, 1); whlp_text(h, " just to prove we can do it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Now I'm going to waffle on indefinitely, in a vague attempt" " to make some wrapping happen, and also to make the topicblock" " go across its boundaries. This is going to take a fair amount" " of text, so I'll just have to cheat and c'n'p a lot of it."); whlp_end_para(h); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Have a "); whlp_start_hyperlink(h, t2); whlp_text(h, "hyperlink"); whlp_end_hyperlink(h); whlp_text(h, " to another topic."); whlp_end_para(h); sprintf(mymacro, "CBB(\"btn_up\",\"JI(`',`%s')\");EB(\"btn_up\")", whlp_topic_id(t3)); whlp_begin_topic(h, t2, "Second Topic", mymacro, NULL); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "This topic contains no non-scrolling region. I would" " illustrate this with a ludicrously long paragraph, but that" " would get very tedious very quickly. Instead I'll just waffle" " on pointlessly for a little bit and then shut up."); whlp_end_para(h); whlp_set_tabstop(h, 36, WHLP_ALIGN_LEFT); whlp_para_attr(h, WHLP_PARA_LEFTINDENT, 36); whlp_para_attr(h, WHLP_PARA_FIRSTLINEINDENT, -36); whlp_para_attr(h, WHLP_PARA_SPACEABOVE, 12); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "\225"); /* bullet */ whlp_tab(h); whlp_text(h, "This is a paragraph with a bullet. With any luck it should" " work exactly like it used to in the old NASM help file."); whlp_end_para(h); whlp_set_tabstop(h, 128, WHLP_ALIGN_RIGHT); whlp_set_tabstop(h, 256, WHLP_ALIGN_CENTRE); whlp_set_tabstop(h, 384, WHLP_ALIGN_LEFT); whlp_para_attr(h, WHLP_PARA_SPACEABOVE, 12); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Ooh:"); whlp_tab(h); whlp_text(h, "Right?"); whlp_tab(h); whlp_text(h, "Centre?"); whlp_tab(h); whlp_text(h, "Left?"); whlp_end_para(h); whlp_set_tabstop(h, 128, WHLP_ALIGN_RIGHT); whlp_set_tabstop(h, 256, WHLP_ALIGN_CENTRE); whlp_set_tabstop(h, 384, WHLP_ALIGN_LEFT); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "Aah:"); whlp_tab(h); whlp_text(h, "R?"); whlp_tab(h); whlp_text(h, "C?"); whlp_tab(h); whlp_text(h, "L?"); whlp_end_para(h); sprintf(mymacro, "CBB(\"btn_up\",\"JI(`',`%s')\");EB(\"btn_up\")", whlp_topic_id(t1)); whlp_begin_topic(h, t3, "Third Topic", mymacro, NULL); whlp_begin_para(h, WHLP_PARA_SCROLL); whlp_set_font(h, 1); whlp_text(h, "This third topic is not nearly as boring as the first, " "because it has a picture: "); { #ifndef PICTURE_FROM_CMDLINE const unsigned long palette[] = { 0xFF0000, 0xFFFF00, 0x00FF00, 0x00FFFF, 0x0000FF, }; const unsigned char picture[] = { 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 1, 2, 3, 4, 4, 0, 0, 0, 1, 2, 3, 4, 4, 0, 0, 0, 1, 2, 3, 4, 4, 0, 0, 1, 2, 3, 4, 4, 4, 0, 0, 1, 2, 3, 4, 4, 4, 0, 0, 1, 2, 3, 4, 4, 4, 0, 1, 2, 3, 4, 4, 4, 4, 0, 1, 2, 3, 4, 4, 4, 4, 0, 1, 2, 3, 4, 4, 4, 4, }; int wid = 8, ht = 12; #else png_pixel ppalette[256]; unsigned long palette[256]; unsigned char *picture; png *png; colquant *cq; int plen, i, err, wid, ht; if (argc < 2) { fprintf(stderr, "in this mode I need a .png file on the" " command line\n"); return 1; } png = png_decode_file(argv[1], &err); if (!png) { fprintf(stderr, "%s: PNG read error: %s\n", argv[1], png_error_msg[err]); return 1; } cq = colquant_new(256, 8); colquant_data(cq, png->pixels, png->width * png->height); plen = colquant_get_palette(cq, ppalette); colquant_free(cq); assert(plen <= 256); for (i = 0; i < plen; i++) { palette[i] = ppalette[i].r >> 8; palette[i] <<= 8; palette[i] |= ppalette[i].g >> 8; palette[i] <<= 8; palette[i] |= ppalette[i].b >> 8; } picture = malloc(png->width * png->height); dither_image(png->width, png->height, png->pixels, ppalette, plen, picture); wid = png->width; ht = png->height; png_free(png); #endif whlp_ref_picture(h, whlp_add_picture(h, wid, ht, picture, palette)); } whlp_end_para(h); /* * Browse sequence. */ whlp_browse_link(h, t1, t2); whlp_browse_link(h, t2, t3); /* * Index terms. */ whlp_index_term(h, "foobarbaz", t1); whlp_index_term(h, "foobarbaz", t2); whlp_index_term(h, "foobarbaz", t3); whlp_index_term(h, "foobar", t1); whlp_index_term(h, "foobar", t2); whlp_index_term(h, "foobaz", t1); whlp_index_term(h, "foobaz", t3); whlp_index_term(h, "barbaz", t2); whlp_index_term(h, "barbaz", t3); whlp_index_term(h, "foo", t1); whlp_index_term(h, "bar", t2); whlp_index_term(h, "baz", t3); whlp_close(h, "test.hlp"); return 0; } #endif ������������������������������������������������������������������������������������������������������������������������������halibut-1.1/winhelp.h�������������������������������������������������������������������������������0000644�0001753�0001753�00000015355�12444773746�011604� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * winhelp.h header file for winhelp.c */ typedef struct WHLP_tag *WHLP; typedef struct WHLP_TOPIC_tag *WHLP_TOPIC; /* * Initialise a new WHlp context and begin accumulating data in it. */ WHLP whlp_new(void); /* * Close a WHlp context and write out the help file it has created. */ void whlp_close(WHLP h, char *filename); /* * Abandon and free a WHlp context without writing out anything. */ void whlp_abandon(WHLP h); /* * Specify the title and copyright notice of a help file. Also * specify Help macros to be run on loading. */ void whlp_title(WHLP h, char *title); void whlp_copyright(WHLP h, char *copyright); void whlp_start_macro(WHLP h, char *macro); /* * Register a help topic. Irritatingly, due to weird phase-order * issues with the whole file format, you have to register all your * topics _before_ actually outputting your text. This seems likely * to require two passes over the source document. * * If you want to specify a particular context string (for * reference from other programs, to provide context-sensitive * help), you can supply it here. Otherwise, just pass NULL and a * nondescript one will be allocated automatically. * * If you specify two context strings which clash under the Windows * help file hash algorithm, this function will return NULL and * provide a pointer to the other context string that this one * clashed with, and you must tell your user to fix the clash. * Sadly this is the only way to do it; despite HLP files having a * perfectly good method of mapping arbitrary strings to things, * they didn't see fit to use that method for help contexts, so * instead they hash the context names and expect the hashes to be * unique. Sigh. * * On success (i.e. in any circumstance other than a hash clash), a * valid WHLP_TOPIC is returned for later use. */ WHLP_TOPIC whlp_register_topic(WHLP h, char *context_name, char **clash); /* * Link two topics together in a browse sequence. Automatically * takes care of the forward and reverse links. */ void whlp_browse_link(WHLP h, WHLP_TOPIC before, WHLP_TOPIC after); /* * After calling whlp_register_topic for all topics, you should * call this, which will sort out all loose ends and allocate * context names for all anonymous topics. Then you can start * writing actual text. */ void whlp_prepare(WHLP h); /* * Create a link from an index term to a topic. */ void whlp_index_term(WHLP h, char *index, WHLP_TOPIC topic); /* * Call this if you need the id of a topic and you don't already * know it (for example, if whlp_prepare has allocated it * anonymously for you). You might need this, for example, in * creating macros for button-bar bindings. * * The string returned will be freed when the WHLP context is * closed. You should not free it yourself. * * Do not call this before calling whlp_prepare(). */ char *whlp_topic_id(WHLP_TOPIC topic); /* * Call this to specify which help topic will be the first one * displayed when the help file is loaded. */ void whlp_primary_topic(WHLP h, WHLP_TOPIC topic); /* * Call this when about to begin writing out the text for a topic. * * Any additional arguments are Help macros, terminated with a * NULL. So the minimum call sequence is * * whlp_begin_topic(helpfile, mytopic, "Title", NULL); */ void whlp_begin_topic(WHLP h, WHLP_TOPIC topic, char *title, ...); /* * Call this to set up a font descriptor. You supply the font name, * the font size (in half-points), the graphic rendition flags * (bold, italic etc), and the general font family (for Windows to * select a fallback font if yours is unavailable). You can also * specify a foreground colour for the text (but unfortunately not * a background). * * Font descriptors are identified in whlp_set_font() by small * integers, which are allocated from 0 upwards in the order you * call whlp_create_font(). For your convenience, * whlp_create_font() returns the integer allocated to each font * descriptor you create, but you could work this out just as * easily yourself by counting. */ enum { WHLP_FONT_BOLD = 1, WHLP_FONT_ITALIC = 2, WHLP_FONT_UNDERLINE = 4, WHLP_FONT_STRIKEOUT = 8, WHLP_FONT_DOUBLEUND = 16, WHLP_FONT_SMALLCAPS = 32 }; enum { WHLP_FONTFAM_FIXED = 1, WHLP_FONTFAM_SERIF = 2, WHLP_FONTFAM_SANS = 3, WHLP_FONTFAM_SCRIPT = 4, WHLP_FONTFAM_DECOR = 5 }; int whlp_create_font(WHLP h, char *font, int family, int halfpoints, int rendition, int r, int g, int b); /* * Routines to output paragraphs and actual text (at last). * * You should start by calling whlp_para_attr() to set any * paragraph attributes that differ from the standard settings. * Next call whlp_begin_para() to start the paragraph. Then call * the various in-paragraph functions until you have output the * whole paragraph, and finally call whlp_end_para() to finish it * off. */ enum { WHLP_PARA_SPACEABOVE=1, WHLP_PARA_SPACEBELOW, WHLP_PARA_SPACELINES, WHLP_PARA_LEFTINDENT, WHLP_PARA_RIGHTINDENT, WHLP_PARA_FIRSTLINEINDENT, WHLP_PARA_ALIGNMENT }; enum { WHLP_ALIGN_LEFT, WHLP_ALIGN_RIGHT, WHLP_ALIGN_CENTRE }; enum { WHLP_PARA_SCROLL, WHLP_PARA_NONSCROLL }; void whlp_para_attr(WHLP h, int attr_id, int attr_param); void whlp_set_tabstop(WHLP h, int tabstop, int alignment); void whlp_begin_para(WHLP h, int para_type); void whlp_end_para(WHLP h); void whlp_set_font(WHLP h, int font_id); void whlp_text(WHLP h, char *text); void whlp_start_hyperlink(WHLP h, WHLP_TOPIC target); void whlp_end_hyperlink(WHLP h); void whlp_tab(WHLP h); /* * Routines to add images to a help file. * * First call whlp_add_picture() to load some actual image data * into a help file. This will return a numeric index which * identifies the picture. Then you can call whlp_ref_picture() to * indicate that that picture should be displayed inline in the * current paragraph (i.e. it occurs between a call to * whlp_begin_para() and whlp_end_para()). */ /* * The parameters to this function are: * * - wd and ht give the width and height of the image in pixels. * - picdata is a pointer to the actual bitmap data. This _must_ * be formatted as one byte per pixel, with each byte being an * index into the `palette' array. Ordering is the normal one * (top to bottom, left to right), not the Windows BMP one. * - palettelen is an array of up to 256 unsigned longs. Each * unsigned long represents an RGB value, in the form * 0x00RRGGBB. Thus 0x00FF0000 is red, 0x00FF00 is green, * 0x000000FF is blue, 0x00FFFFFF is white, zero is black, and * so on. You may supply fewer than 256 entries if the image * data does not refer to all possible values. */ int whlp_add_picture(WHLP h, int wd, int ht, const void *picdata, const unsigned long *palette); void whlp_ref_picture(WHLP h, int index); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������