texlive[41526] Master: olsak-misc (21jun16)
commits+karl at tug.org
commits+karl at tug.org
Thu Jun 23 00:28:57 CEST 2016
Revision: 41526
http://tug.org/svn/texlive?view=revision&revision=41526
Author: karl
Date: 2016-06-23 00:28:57 +0200 (Thu, 23 Jun 2016)
Log Message:
-----------
olsak-misc (21jun16)
Modified Paths:
--------------
trunk/Master/tlpkg/libexec/ctan2tds
trunk/Master/tlpkg/tlpsrc/collection-genericextra.tlpsrc
Added Paths:
-----------
trunk/Master/texmf-dist/doc/generic/olsak-misc/
trunk/Master/texmf-dist/doc/generic/olsak-misc/README
trunk/Master/texmf-dist/doc/generic/olsak-misc/booklet.tex
trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv-pu.tex
trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv-word.tex
trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv.tex
trunk/Master/texmf-dist/doc/generic/olsak-misc/eparam.tex
trunk/Master/texmf-dist/doc/generic/olsak-misc/fun-coffee.tex
trunk/Master/texmf-dist/doc/generic/olsak-misc/openclose.tex
trunk/Master/texmf-dist/doc/generic/olsak-misc/seplist.tex
trunk/Master/texmf-dist/tex/generic/olsak-misc/
trunk/Master/texmf-dist/tex/generic/olsak-misc/qrcode.tex
trunk/Master/texmf-dist/tex/generic/olsak-misc/scanbase.tex
trunk/Master/texmf-dist/tex/generic/olsak-misc/scancsv.tex
trunk/Master/texmf-dist/tex/generic/olsak-misc/xmlparser.tex
trunk/Master/tlpkg/tlpsrc/olsak-misc.tlpsrc
Added: trunk/Master/texmf-dist/doc/generic/olsak-misc/README
===================================================================
--- trunk/Master/texmf-dist/doc/generic/olsak-misc/README (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/olsak-misc/README 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,29 @@
+This is a collection with various single-file plain TeX macros
+written by Petr Olsak
+
+The documentation is included in each file separately.
+
+README ... this file
+booklet.tex ... re-orders PDF pages and collects them for booklet printing
+cnv.tex ... conversion of texts
+cnv-pu.tex ... example of usage of cnv.tex --- pdf outlines in Unicode
+cnv-word.tex ... example of usage of cnv.tex --- word to word conversion
+eparam.tex ... Full expansion during parameter scanning
+fun-coffee.tex . generates splotches in the document
+openclose.tex .. repairs balanced text between \Open ...\Close pair
+qrcode.tex ... QR code generated at TeX level
+scanbase.tex ... parser of text-style mysql outputs
+scancsv.tex ... parser of CSV format
+seplist.tex ... macros with alternative separators of a parameter
+xmlparser.tex .. parser of XML language
+
+History:
+-------
+1996--2016 ... files are created and released at
+ http://petr.olsak.net/ftp/olsak/makra/
+<Jun. 2016> ver.1 ... files contributed to CTAN as one "bundle" olsak-misc
+
+License:
+-------
+All files mentioned here are in Public domain.
+
Property changes on: trunk/Master/texmf-dist/doc/generic/olsak-misc/README
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/olsak-misc/booklet.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/olsak-misc/booklet.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/olsak-misc/booklet.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,38 @@
+% booklet.tex ... re-orders PDF pages and collets them for booklet printing
+
+% This macro is used as an example in the book
+% Petr Olsak: Typograficky system TeX, pages 102, 103.
+
+% Usage: change the first definition \def\document{your-document}
+% without PDF extension and process: pdftex booklet.
+% Then use duplex printing over the short side.
+
+\ifx\document\undefined
+ \def\document {navrh-rozpoctu} % Name of processed document without suffix
+\fi
+\nopagenumbers % we need no pagenumbers
+\pdfpagewidth=297mm \pdfpageheight=210mm % sheet = format A4 landscape
+\pdfhorigin=0pt \pdfvorigin=0pt % Knuth's origin-point shifted
+\def\pageswidth{width.5\pdfpagewidth} % page width = 1/2 of sheet width
+
+\pdfximage \pageswidth {\document.pdf} % First page is read in order to
+\mathchardef\firstpage=\pdflastximage % detect \pdflastximagepages
+
+\def\putpage#1{% put the page number #1 into sheet
+ \ifnum#1>\pdflastximagepages \hbox{\vrule\pageswidth}\else % empty page
+ \ifnum#1=1 \pdfrefximage\firstpage % first page
+ \else \pdfximage \pageswidth page#1 {\document.pdf}% % normal page
+ \pdfrefximage\pdflastximage
+ \fi\fi}
+
+\newcount\aL \newcount\aR \newcount\bL \newcount\bR
+\aL=\pdflastximagepages
+\advance\aL by3 \divide\aL by4 \multiply\aL by4 % rounding to 4N up
+\aR=1 \bL=2 \bR=\aL \advance\bR by-1 % little calculations
+\loop
+ \hbox{\putpage\aL \putpage\aR}\vfil\break % faceside of the sheet
+ \hbox{\putpage\bL \putpage\bR}\vfil\break % underside of the sheet
+ \advance\aR by2 \advance\aL by-2
+ \advance\bR by-2 \advance\bL by2
+ \ifnum \aL>\aR \repeat
+\end
Property changes on: trunk/Master/texmf-dist/doc/generic/olsak-misc/booklet.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv-pu.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv-pu.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv-pu.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,266 @@
+
+% cnv-pu.tex -- The conversion table for UNICODE output for PFD outlines
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% April 2005 Petr Olsak
+
+% You can use cnv.tex + this table with your macros in plain if you
+% need to save the PDF outlines in UNICODE octal strings.
+
+% You can use cnv.tex + this table with hyperref in LaTeX if you don't
+% want to use the inputenc package. Eight-bit tokens are used as single
+% non-active accented characters from the alphabet of your language.
+% In such a case you can type:
+%
+% \usepackage{czech} % IL2 font encoding is declared here
+% % You can use another package which defines
+% % \encodingdefault.
+% \input cnv-pu.tex % font encoding declared before is used here
+% \usepackage{hyperref}
+% \def\pdfstringdef #1#2{% \pdfstringdef re-definition
+% \bgroup \escapechar=`\\%
+% \def\cnvtable{pu}\cnvin{#2}%
+% \xdef #1{\string\376\string\377\cnvout}\egroup }
+
+% Sorry, the following conversion table is not considered to be definite.
+% If you add some usual conversion rules, please, send the result to
+% the author <petr at olsak.net>. I'll be very pleased to add your additions
+% to my cnv.tex distribution.
+
+\ifx\cnvin\undefined \input cnv \fi
+
+\bgroup
+
+\let\predefmethod=\gdef
+\let\findefmethod=\xdef
+\let\cnvaccentmethod=\gdef
+
+\def\declchar #1#2#3 {\findef {#1} {#2#3}}
+\def\declaccent #1#2#3#4 {\cnvaccent #1#2{#3#4}}
+
+\def\0{\string\0} \def\1{\string\1} \def\2{\string\2} \def\3{\string\3}
+
+\gdef\cnvdefault #1{} % undeclared tokens will be removed
+\xdef\cnvadefault {\000\077} % undeclared accents are converted to "?"
+
+\def\cnvtable{pu} % PdfUnicode conversion table
+
+\declchar { } \000\040
+\declchar ! \000\041
+\declchar " \000\042
+\declchar # \000\043
+\declchar \# \000\043
+%\declchar $ \000\044
+\declchar \$ \000\044
+\declchar \% \000\045
+\declchar & \000\046
+\declchar \& \000\046
+\declchar ' \000\047
+\declchar ( \000\050
+\declchar ) \000\051
+\declchar * \000\052
+\declchar + \000\053
+\declchar , \000\054
+\declchar - \000\055
+\declchar . \000\056
+\declchar / \000\057
+\declchar 0 \000\060
+\declchar 1 \000\061
+\declchar 2 \000\062
+\declchar 3 \000\063
+\declchar 4 \000\064
+\declchar 5 \000\065
+\declchar 6 \000\066
+\declchar 7 \000\067
+\declchar 8 \000\070
+\declchar 9 \000\071
+\declchar : \000\072
+\declchar ; \000\073
+\declchar < \000\074
+\declchar = \000\075
+\declchar > \000\076
+\declchar ? \000\077
+\declchar @ \000@
+\declchar A \000A
+\declchar B \000B
+\declchar C \000C
+\declchar D \000D
+\declchar E \000E
+\declchar F \000F
+\declchar G \000G
+\declchar H \000H
+\declchar I \000I
+\declchar J \000J
+\declchar K \000K
+\declchar L \000L
+\declchar M \000M
+\declchar N \000N
+\declchar O \000O
+\declchar P \000P
+\declchar Q \000Q
+\declchar R \000R
+\declchar S \000S
+\declchar T \000T
+\declchar U \000U
+\declchar V \000V
+\declchar W \000W
+\declchar X \000X
+\declchar Y \000Y
+\declchar Z \000Z
+\declchar [ \000\133
+\declchar \\ \000\134
+\declchar ] \000\135
+\declchar ^ \000\136
+\declchar _ \000\137
+\declchar ` \000\140
+\declchar a \000a
+\declchar b \000b
+\declchar c \000c
+\declchar d \000d
+\declchar e \000e
+\declchar f \000f
+\declchar g \000g
+\declchar h \000h
+\declchar i \000i
+\declchar j \000j
+\declchar k \000k
+\declchar l \000l
+\declchar m \000m
+\declchar n \000n
+\declchar o \000o
+\declchar p \000p
+\declchar q \000q
+\declchar r \000r
+\declchar s \000s
+\declchar t \000t
+\declchar u \000u
+\declchar v \000v
+\declchar w \000w
+\declchar x \000x
+\declchar y \000y
+\declchar z \000z
+\declchar \{ \000\173
+\declchar | \000\174
+\declchar \} \000\175
+\declchar \~ \000\176
+\declchar ~ \000\040
+
+\declchar \O \000\330
+\declchar \o \000\370
+\declchar \AA \000\305
+\declchar \aa \000\345
+\declchar \AE \000\306
+\declchar \ae \000\346
+\declchar \OE \001\122
+\declchar \oe \001\123
+\declchar \ss \000\337
+\declchar \L \001\101
+\declchar \l \001\102
+
+% etc...
+
+\predef \TeX {TeX}
+\predef \LaTeX {La\TeX}
+\predef \LaTeXe {\LaTeX2e}
+\predef \eTeX {e-\TeX}
+\predef \MF {Metafont}
+\predef \MP {Metapost}
+
+\predef \uv #1{\clqq #1\crqq}
+
+\declchar \clqq \000\214
+\declchar \crqq \000\215
+
+% etc...
+
+% The \declaccent macro depends on the expansion of \'a etc.
+% If these sequences expand to a single token then this token is stored
+% to the conversion table too: it means that \'a and a native a-acute
+% are both converted to \000\341.
+% In order to prepare the \'a (etc) expansion we need to test if we are
+% in LaTeX (\fontencoding is defined) or not. In non-LaTeX case, we run the
+% \csaccents macro (or \relax if not defined). This macro redefines \'
+% (etc.) macros as expandable in csplain format.
+
+\ifx\fontencoding\undefined
+ \csname csaccents\endcsname
+\else
+ \fontencoding{\encodingdefault}\selectfont
+\fi
+
+\declaccent \' A \000\301
+\declaccent \' a \000\341
+\declaccent \` A \000\300
+\declaccent \` a \000\340
+\declaccent \" A \000\304
+\declaccent \" a \000\344
+\declaccent \v C \001\014
+\declaccent \v c \001\015
+\declaccent \v D \001\016
+\declaccent \v d \001\017
+\declaccent \' E \000\311
+\declaccent \' e \000\351
+\declaccent \v E \001\032
+\declaccent \v e \001\033
+\declaccent \" E \000\313
+\declaccent \" e \000\353
+\declaccent \' I \000\315
+\declaccent \' i \000\355
+\declaccent \' L \001\071
+\declaccent \' l \001\072
+\declaccent \v L \001\075
+\declaccent \v l \001\076
+\declaccent \v N \001\107
+\declaccent \v n \001\110
+\declaccent \^ O \000\324
+\declaccent \^ o \000\364
+\declaccent \' O \000\323
+\declaccent \' o \000\363
+\declaccent \" O \000\326
+\declaccent \" o \000\366
+\declaccent \' R \001\124
+\declaccent \' r \001\125
+\declaccent \v R \001\130
+\declaccent \v r \001\131
+\declaccent \v S \001\140
+\declaccent \v s \001\141
+\declaccent \v T \001\144
+\declaccent \v t \001\145
+\declaccent \r U \001\156
+\declaccent \r u \001\157
+\declaccent \' U \000\332
+\declaccent \' u \000\372
+\declaccent \" U \000\334
+\declaccent \" u \000\374
+\declaccent \' Y \000\335
+\declaccent \' y \000\375
+\declaccent \v Z \001\175
+\declaccent \v z \001\176
+
+% dirty trick: LaTeX has a bad conception in \@sect macro: this macro
+% mixes the \ifnum calculation with the real text of the section
+% in one parameter of \addtocontentsline. We need to expand the \ifnum
+% but not expand the other text:
+
+\predef \ifnum #1\fi {\cnvexpandtext{\ifnum#1\fi}}
+
+% -- and --- ligatures:
+
+\predef -{\cnvexec \futurelet \nextchar \testtwodash}
+\gdef\testtwodash {\ifx-\nextchar \expandafter \twodash
+ \else \expandafter \cnvnext \expandafter \onedash \fi}
+\gdef\twodash #1{\futurelet \nextchar \testthreedash}
+\gdef\testthreedash {\ifx-\nextchar \expandafter \threedash
+ \else \expandafter \cnvnext \expandafter \twodash \fi}
+\gdef\threedash #1{\cnvnext \threedash}
+\findef\onedash {\000\055} % normal minus
+\findef\twodash {\000\205} % endash
+\findef\threedash {\000\204} % emdash
+
+\egroup
+
+
+
+
+
+
+
Property changes on: trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv-pu.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv-word.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv-word.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv-word.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,154 @@
+% cnv-word.tex --- an example of the usage of cnv.tex: word to word converting
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% April 2005 Petr Olsak
+
+\input cnv
+
+% This file is a complex example of the usage of cnv.tex macro.
+% The macros presented here give the possibility to declare word to word
+% conversion a of given string. Each occurence of declared words will be
+% converted to the declared outputs.
+
+% Double percent: "%%" is a prefix of technical comments.
+% Please, read the "user" comments (prefixed by one "%") first.
+
+%% \wtest is an internal macro which tests if the given {pattern} matches
+%% the begin of the input stream. If it is true then other \wtests
+%% are ignored and a given {output} is stored to \cnvout. The input
+%% stream is reduced by the pattern. Else input stream is restored
+%% and the next \wtest is run. We suppose the following parameters:
+%% \wtest{pattern}{output}\wtest{pattern}{output}...\endwtest{letter}input stream\END
+
+%% The main idea of \wtest is to declare the macro \trywtest by:
+%% \def\trywtest #1pattern#2\end and run it by:
+%% \trywtest input-stream\END pattern\end. If #1 is empty then pattern
+%% matches.
+
+\gdef\wtest #1#2#3\endwtest#4#5\END {\def\wout{#2}\def\otherwtests{#3}%
+ \def\inputstream{#5}%
+ \def\trywtest ##1#1##2\end {\def\tmp{##1}%
+ \def\tmpa{#1}\ifx\tmpa\empty \def\tmp{}\fi % empty pattern
+ \ifx\tmp\empty % found!
+ \def\next{\cnvstoree{\expandafter \cnvout \wout}%
+ \expandafter \cnvcontinue \inputstream\END}%
+ \else % not found!
+ \def\next{\expandafter\otherwtests\expandafter\endwtest
+ \expandafter{\expandafter#4\expandafter}%
+ \inputstream \END}%
+ \fi \next}
+ \def\cnvcontinue #1{\cnvnext}%
+ \expandafter\trywtest \inputstream \END#1\end
+}
+
+%% \stringdef {<letter><pattern>} {<output>}
+%% adds to the internal cnv macro \E:<letter>:<table> the next part of
+%% the type "\wtest{pattern}{output}" The \E:<letter>:<table> looks like:
+%% \cnvexec \wtest{pattern1}{output1}\wtest{pattern2}{output2}...\endwtest{<letter>}
+%% The new "\wtest{pattern}{output}" is added at the end of \wtests
+%% string before \endwtest{letter}.
+
+\def\wstringdef #1#2 #3{%
+ \expandafter\ifx \csname E:\string#1:\cnvtable\endcsname \relax
+ \def\tmp{}%
+ \else
+ \expandafter\expandafter\expandafter
+ \wstoretmp \csname E:\string#1:\cnvtable\endcsname
+ \fi
+ \expandafter \def
+ \csname E:\string#1:\cnvtable \expandafter\endcsname \expandafter
+ {\expandafter \cnvexec \tmp \wtest{#2}{#3}\endwtest{#1}}
+}
+\def\wstoretmp \cnvexec #1\endwtest#2{\def\tmp{#1}}
+\def\stringdef #1#2{\wstringdef #1 {#2}}
+
+%% If all wtests fail then \endwtest{<letter>} is processed. It adds
+%% the <letter> itself to the \cnvout.
+
+\def\endwtest#1{\def\tmp{#1}%
+ \ifx\tmp\inSPACE \cnvstoree{\expandafter \cnvout \space}%
+ \else \cnvstore{\cnvout #1}
+ \fi\cnvnext}
+\def\inSPACE{\SPACE}
+
+%% The \wconvert{<input token list>} does the main conversion. It runs
+%% \cnvin twice (with different tables). First conversion converts the
+%% spaces to \SPACE tokens and braces to \BGROUP and \EGROUP tokens. The
+%% reason is that now we can read \SPACE and converted braces to #1 parameter
+%% without changes. This is needed in \wtest macro. No matter that
+%% \SPACE is undefined. We never process it by normal \TeX{} expansion.
+
+%% The second conversion (with table 2) does the real word to word conversion and
+%% returns the \SPACE \BGROUP and \EGROUP to the desired output.
+
+\def\wconvert #1{%
+ \def\cnvtable{1}\cnvin{#1}
+ \def\cnvtable{2}%
+ \expandafter \cnvin \expandafter {\cnvout \END}}
+
+%% Table 1: only converts spaces and braces
+
+\def\cnvtable{1}
+\findef { } {\SPACE}
+
+%% Table 2: the \END mark is ignored and \SPACE is converted back to space
+
+\def\cnvtable{2}
+\findef \END {}
+\findef \SPACE { }
+
+%% We have to keep the \BGROUP and \EGROUP unchanged. Unfortunately,
+%% the declaration:
+%%
+%% \let\findefmethod=\edef
+%% \findef \BGROUP {{\iffalse}\fi}
+%% \findef \EGROUP {\iffalse{\fi}}
+%%
+%% does not work because the cnv macro fails: the \output macro needs
+%% to be balanced text everytime during conversion process. It means
+%% that there is impossible to return the input tokens of catcode 1
+%% and 2 to their original maening. We can return them to their original
+%% meaning only if the \cnvout can be normally expanded. In such a case,
+%% we can write after \wconvert is done:
+%%
+%% \bgroup \def\BGROUP {{\iffalse}\fi} \def\EGROUP {\iffalse{\fi}}
+%% \xdef \cnvout{\cnvout} \egroup
+
+% Users can declare the "word to word" conversion here. Each string declared at
+% the left hand side will be converted to the output at the right hand side.
+% If there are more left side strings with the same initial letter then
+% the table is read in this order during the conversion. It means
+% that the last declaration in the following example is irrelevant:
+% if the string begins by "th" then the result of conversion is "TH"
+% and the last declaration of "the" is ignored.
+
+\stringdef {input} {output}
+\stringdef {this} {THIS}
+\stringdef {test} {TEST}
+\stringdef {th} {TH}
+\stringdef {the} {THE}
+
+% Now, we can try this declaration.
+
+\wconvert {this is a test of the motherboard input}
+\message {"\cnvout"}
+
+% The result is: "THIS is a TEST of THe moTHerboard output".
+
+% Users have to use the \SPACE or \BGROUP or \EGROUP instead of real tokens
+% of catcode 10, 1 and 2 at the left hand side of the declaration:
+
+\stringdef {\SPACE the} { !THE!}
+
+\wconvert {this is a test of the motherboard input}
+\message {output: "\meaning\cnvout"}
+
+\end
+
+
+
+
+
+
+
+
+
Property changes on: trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv-word.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,541 @@
+
+% cnv.tex -- macro for string conversion
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% April 2005 Petr Olsak
+
+
+% \cnvin {<input text>} converts <input text> to <output text>.
+% This output is stored in \cnvout macro.
+
+% For more information see the end of this file.
+% The comments after %% (double percent sign) are intended for macro
+% programmers. See "simple" documentation at the end of this file first.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% we cannot read this macro twice:
+
+\ifx\cnvin\undefined \else \endinput \fi
+
+%% \predef <token> defines macro \E:<token>:<table>
+%% \findef <token> defines macro \T:<token>:<table>
+
+\def\predef #1{\expandafter \predefmethod \csname E:\string#1:\cnvtable\endcsname}
+\def\findef #1#2{\expandafter \findefmethod \csname T:\string#1:\cnvtable\endcsname {#2}}
+
+%% \cnvaccent <command> <char> {<output>} does following:
+%% 1. it defines \E:<command>:<table> #1 as {\runcnvaccent \A:<command>:#1:<table>}
+%% (\runcnvaccent implements the test if accented letter is undeclared, see below)
+%% 2. it defines \A:<command>:<char>:<table> as {<output>}
+%% 3. if "<command> <char>" is one <token> after expansion, then
+%% it defines \T:<token>:<table> as {<output>}
+
+\def\cnvaccent #1#2#3{\expandafter \cnvaccentmethod \csname E:\string#1:\cnvtable\endcsname ##1%
+ {\cnvexpand \expandafter \runcnvaccent \csname A:\string#1:\string##1:\cnvtable\endcsname}%
+ \expandafter \findefmethod \csname A:\string#1:\string#2:\cnvtable\endcsname {#3}%
+ \edef \tmp{#1{#2}}%
+ \expandafter \cnvtestaccent \tmp \cnvtestaccent
+ \ifx\nextchar\empty \expandafter \findefmethod \csname T:\tmp:\cnvtable\endcsname {#3}\fi
+}
+\def\cnvtestaccent {\futurelet \nextchar \docnvtestaccent}
+\def\docnvtestaccent #1#2\cnvtestaccent{\ifx\nextchar \bgroup
+ \else \def\nextchar{#2}\fi}
+
+%% main macro:
+
+\long\def\cnvin #1{\def\cnvout{}\cnvnext #1\cnvend}
+
+%% \cnvnext: we test the next token by \futurelet because it may be a space
+%% or a brace:
+
+\def\cnvnext {\futurelet \nextchar \docnvnext}
+\def\docnvnext {\let\next=\cnvtoken
+ \ifx \nextchar\cnvend \let\next=\relax \fi
+ \ifx \nextchar\spacetoken \let\next=\cnvspace \fi
+ \ifx \nextchar\cnvbgroup \let\next=\cnvopenbrace \fi
+ \ifx \nextchar\cnvegroup \let\next=\cnvclosebrace \fi
+ \ifx \nextchar\runcnvaccent \let\next=\relax \fi
+ \ifx \nextchar\cnvexec \let\next=\relax \fi
+ \ifx \nextchar\cnvexpand \let\next=\relax \fi
+ \ifx \nextchar\cnvexpandtext \let\next=\relax \fi
+ \next}
+
+%% \cnvend: end of conversion. We define it as \outer because
+%% the parameter of user macros cannot scan this token.
+
+\outer\def\cnvend{\let\nextchar=\relax}
+
+%% \cnvbgroup, \cnvegroup: We suppose that these sequences will have
+%% the constant meaning (user may change the \bgroup, \egroup meaning).
+
+\let\cnvbgroup={ \let\BGROUP={ \let\EGROUP=} \let\cnvegroup=}
+
+%% \spacetoken is the control sequence equal to space token (catcode 10):
+
+{\def\\{\global\let\spacetoken= }\\ }
+
+%% \cnvtoken: next <token> is scannable in #1 parameter
+%% It expands to \E:<token>:<table> (if defined) else
+%% it stores contents of \T:<token>:<table> to \cnvout (if defined) else
+%% it stores <token> to \cnvout using \cnvdefault macro.
+
+\def\cnvtoken #1{\def\tmpc{#1}\docnvtoken}
+\def\docnvtoken{%
+ \expandafter \ifx \csname E:\expandafter\string\tmpc:\cnvtable\endcsname \relax
+ \expandafter \ifx \csname T:\expandafter\string\tmpc:\cnvtable\endcsname \relax
+ \ifx\tmpc\space \cnvstoree{\expandafter \cnvout \tmpc}%
+ \else \cnvstoreee {\expandafter \expandafter \expandafter \cnvout
+ \expandafter \cnvdefault \tmpc}%
+ \fi
+ \else
+ \cnvstoreee {\expandafter \expandafter \expandafter
+ \cnvout \csname T:\expandafter\string\tmpc:\cnvtable\endcsname}%
+ \fi
+ \expandafter \cnvnext
+ \else
+ \expandafter \expandafter \expandafter \cnvnext
+ \csname E:\expandafter\string\tmpc:\cnvtable\expandafter \endcsname
+ \fi}
+
+%% \cnvspace, \cnvopenbrace, \cnvclosebrace: the next token is unreadable
+%% by #1 macro parameter. We define \tmpc, remove the next token
+%% and run \docnvtoken macro.
+
+\def\cnvspace {\def\tmpc{ }\afterassignment \docnvtoken \let\next= }
+\def\cnvopenbrace {\def\tmpc{\BGROUP}\afterassignment \docnvtoken \let\next= }
+\def\cnvclosebrace {\def\tmpc{\EGROUP}\afterassignment \docnvtoken \let\next= }
+
+%% \runcnvaccent: next token #1 is \A:<command>:<char>:<table>.
+%% It stores the contents of \A:<command>:<char>:<table> to \cnvout
+%% (if defined) else it stores \cnvadefault to \cnvout.
+
+\def\runcnvaccent #1{\ifx #1\relax
+ \cnvstoree {\expandafter \cnvout \cnvadefault}%
+ \else
+ \cnvstoree {\expandafter \cnvout #1}%
+ \fi \cnvnext}
+
+%% \cnvexec: we switch off the conversion until \cnvnext
+%% The contents of this macro means: do nothing, but we need
+%% somewhat special contents in order to distinguish it by \ifx.
+
+\long\def\cnvexec {\empty\relax\relax}
+
+%% \cnvexpand, \cnvexpandtext: see the documentation at the end of this file
+
+\def\cnvexpand {\expandafter \cnvnext}
+\def\cnvexpandtext #1{\edef\tmp{#1}\expandafter \cnvnext \tmp}
+
+%% \cnvstoreee: macro appends the desired contens to \cnvout.
+%% We cannot expand the \cnvout by \edef because the expandable tokens can be
+%% included here. So we need to do some \expandafter gymnastics.
+
+\def\cnvstore {\expandafter \def \expandafter \cnvout \expandafter}
+\def\cnvstoree {\expandafter \cnvstore \expandafter}
+\def\cnvstoreee {\expandafter \cnvstoree \expandafter}
+
+%% Implicit values:
+
+\def\cnvcopy{}
+\let\cnvdefault=\cnvcopy
+\def\cnvadefault{?}
+\def\cnvtable{}
+
+\let\predefmethod=\gdef
+\let\findefmethod=\gdef
+\let\cnvaccentmethod=\gdef
+
+\endinput
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+---> english documentation: see the end of this file
+
+Po provedení příkazu \cnvin {<seznam tokenů>}
+je v makru \cnvout ukryt konvertovaný seznam tokenů.
+
+Konverze se provádí bez obvyklé expanze <seznamu tokenů> a je jedno, jaké
+kategorie jednotlivé tokeny mají. Konverze probíhá ve dvou průchodech:
+
+1. Kontrolovaná částečná expanze jednotlivých tokenů. Po jejím
+ provedení se konverze vrací k výsledku expanze a konvertuje jej
+ znovu. Tokeny, které takto expandují, se v konverzní tabulce
+ deklarují pomocí \predef. Tokeny, které nejsou takto deklarovány,
+ při konverzi neexpandují (ačkoli při běžné expanzi třeba expandují).
+2. Finální konverze tokenu: token je konvertován podle deklarace
+ makrem \findef na výstupní posloupnost tokenů, ke kterým se už
+ konverze nevrací.
+
+Tokeny, které podléhají konverzi, mohou mít libovolnou kategorii. Není
+tedy nutné, aby se jednalo o kontrolní sekvence.
+
+Deklarace tokenů pomocí \predef a \findef jsou zcela nezávislé na
+"skutečném významu" tokenu. Jedná-li se o kontrolní sekvenci, bude
+se tato kontrolní sekvence při běžném zpracování \TeX{}em chovat
+běžným způsobem ačkoli má pro konverzi deklarován pomocí \predef nebo
+\findef odlišný význam.
+
+Deklarace pomocí \predef může mít běžné parametry a separátory (#1#2 atd.)
+
+Každý token může mít jen jeden význam deklarovaný pomocí \predef nebo
+\findef. Je-li token deklarován obojím způsobem, má při konverzi přednost
+\predef. Je-li token deklarován opakovaně stejným deklarátorem, platí
+poslední deklarace.
+
+Pokud se má konvertovat token, který nemá žádnou deklaraci, pak je
+výsledek závislý na hodnotě makra s jedním parametrem \cnvdefault.
+Implicitně je \cnvdefault definováno tak, že se nedeklarovaný token
+kopíruje beze změny do výstupu. Uživatel má tyto další možnosti:
+
+\def\cnvdefault #1{<out>} % každý nedeklarovaný token se konvertuje
+ % na společný <out>
+\def\cnvdefault #1{} % nedeklarovaný token tiše zmizí
+
+Příklad hypotetické konverzní tabulky:
+
+\predef \TeX {TeX}
+\predef \uv #1{\leva #1\prava}
+\predef X{AB}
+\findef A {:XX:\TeX:}
+\cnvin{Tady je \uv{\TeX}}
+
+V \cnvout máme text: "Tady je \leva Te:XX:\TeX:B\prava". Obsah \cnvout
+můžeme zkontrolovat pomocí \message{\meaning\cnvout}.
+
+Jak probíhala konverze:
+
+\uv{\TeX} => \leva \TeX \prava
+\TeX => TeX
+ TeX => TeAB
+ TeAB => Te:XX:\TeX:B ... a toto už se nekonvertuje.
+
+Protože při \predef je možné deklarovat parametry makra, nesmí za
+deklarovaným tokenem být mezera (viz \predef X{AB} v ukázce).
+Na druhé straně při deklaraci pomocí \findef je možné mezi tokenem a
+tělem makra vložit nepovinnou mezeru.
+
+Při konverzi tokenu deklarovaného pomocí \predef provede \TeX{}
+expanzi tokenu jako by to bylo makro. Provede ale jen první úrovneň
+expanze (tj. jako při \expandafter, nikoli jako při \edef).
+
+Tokeny kategorie 10, 1 a 2 (mezera a svorky) se zpracovávají mírně
+odlišným způsobem, než ostatní tokeny. To znamená, že jsem trochu
+kecal, když jsem dříve ujistil čtenáře, že konverze je na kategoriích
+zcela nezávislá. Pokud je konverze mezery nedeklarovaná, pak se mezera
+nemění bez závislosti na hodnotě makra \cnvdefault. Konverzi mezery
+můžeme deklarovat například takto:
+
+\findef { } {<výstup pro mezeru>}
+nebo
+\predef { }{<makro pro mezeru>}
+
+Otevírací svorka, která ma kategorii 1, se interně promění v sekvenci
+\BGROUP a pokud není pro ní deklarována konverze, je zpracována pomocí
+\cnvdefault jako každý jiný nedeklarovaný token. Podobně zavírací
+svorka, která má kategorii 2, se promění v \EGROUP. Konverzi pro tyto
+tokeny můžeme deklarovat jednoduše například:
+
+\findef \BGROUP {<výstup pro otevírací svorku>}
+\findef \EGROUP {<výstup pro zavírací svorku>}
+nebo
+\predef \BGROUP {<makro pro otevírací svorku>}
+\predef \EGROUP {<makro pro zavírací svorku>}
+
+Bohužel, makro \cnvin není implicitně schopno rozlišit mezi skutečnou
+svorkou (kategorie 1 nebo 2) a zástupnou kontrolní sekvencí \bgroup,
+\egroup. Obé je interně převedeno na \BGROUP, \EGROUP a následně
+zpracováno. Chceme-li mezi svorkami a zástupnými kontrolními
+sekvencemi rozlišovat, musíme před konverzí změnit (aspoň přechodně)
+význam \bgroup, \egroup:
+
+{\let\bgroup=\relax \let\egroup=\relax \cnvin{...} ...}
+
+Pro možnost deklarace konverze akcentovaných znaků zapsaných
+v \TeX{}ové notaci je k dispozici ještě další deklarační makro:
+
+\cnvaccent <sekvence> <znak> {<výstup>}.
+
+Toto makro zařídí, aby se akcentované řídicí sekvence ve tvaru
+<sekvence> <znak> i ve tvaru <sekvence> {<znak>} konvertovaly na
+odpovídající <výstup>. Navíc se makro \cnvaccent při ukládání
+informací do konverzní tabulky pokusí expandovat "<sekvence> <znak>" a
+je-li výsledkem jediný <token>, provede ještě \findef <token> {<výstup>}.
+Tím je zaručeno, že na stejný <výstup> se konvertuje i akcentovaný
+znak, pokud je zapsán na vstupu "přímo" bez použití \TeX{}ové notace.
+
+Jakmile \cnvaccent deklaruje <sekvenci> jako sekvenci pro akcent, pak
+je sledován i výskyt neexistujícího akcentu vytvořeného touto
+<sekvencí>. Takový výskyt se konvertuje na obsah makra bez parametru
+\cnvadefault. Nechť například:
+
+\cnvaccent \v c {<výstup pro č>}
+
+a nechť chybí deklarace \v u. V takovém případě se \v c konvertuje na
+odpovídající výstyp zatímco \v u se konvertuje na obsah makra
+\cnvadefault. Implicitně je \def\cnvadefault{?}.
+
+Příkazy \predef, \findef a \cnvaccent interně definují výsledek
+konverze pomocí \gdef. Pokud chceme použít jinou metodu, můžeme před
+jejich použitím psát například \let\findefmethod=\xdef.
+Tím dosáhneme, že makra ve \findef se před zapamatováním expandují.
+Nebo třeba \let\predefmethod=\def způsobí, že deklarace \predef
+budou lokální vrámci skupiny.
+
+Existují tři příkazy, které mají při konverzi speciální význam:
+\cnvexec, \cnvexpandtext a \cnvexpand.
+
+Příkaz \cnvexec způsobí provedení následujících příkazů expand procesorem i
+hlavním procesorem \TeX{}u. Zbytek vstupu pro konverzi je připraven ve
+vstupní frontě. Konverze pokračuje až v okamžiku, kdy je
+zpracován příkaz \cnvnext. Následující token za tímto příkazem podléhá
+konverzi.
+
+Příkaz \cnvexpand <token> způsobí, že <token> bude expandován běžným
+způsobem do první úrovně expanze a výsledek této expanze bude dále
+konvertován. Příkaz je implementován jako \cnvexec\expandafter\cnvnext.
+
+Příkaz \cnvexpandtext {<text>} způsobí, že se <text> zcela expanduje běžným
+způsobem (jako při \edef) a pak se na takto expandovaný <text> provede
+konverze.
+
+Při načítání konverzní tabulky musí být obsah makra \cnvtable stejný
+jako při jejím použití v době konverze příkazem \cnvin. Změnou makra
+\cnvtable můžeme deklarovat více nezávislých tabulek a pak mezi nimi
+v době konverze přepínat. Implicitní hodnota makra \cnvtable je prázdné
+makro.
+
+
+PŘÍKLADY
+--------
+
+V souboru cnv-pu.tex je deklarována konverzní tabulka, pomocí níž je
+možné konvertovat texty do PDF záložek v UNICODE. Výhodou tohoto
+řešení je, že nedochází k expanzi textu a že je možno nastavit pro
+konverzi jakýkoli znak, ačkoli tyto znaky nejsou aktivní.
+
+V rámci konverzí zdrojového textu TeXu můžeme narazit na problém
+obvyklé TeXové ligatury -- a ---, kterou bychom chtěli konvertovat na
+odpovídající výstup. Toto můžeme provést následujícím makrem:
+
+\predef -{\cnvexec \futurelet \nextchar \testtwodash}
+\def\testtwodash {\ifx-\nextchar \expandafter \twodash
+ \else \expandafter \cnvnext \expandafter \onedash \fi}
+\def\twodash #1{\futurelet \nextchar \testthreedash}
+\def\testthreedash {\ifx-\nextchar \expandafter \threedash
+ \else \expandafter \cnvnext \expandafter \twodash \fi}
+\def\threedash #1{\cnvnext \threedash}
+\findef\onedash {<simple minus>}
+\findef\twodash {<en-dash>}
+\findef\threedash {<em-dash>}
+
+Sofistikovanější příklad na konverzi celých úseků slov na jiný výstup
+(tj. nejen jednotlivých znaků) je uveden v souboru cnv-word.tex.
+Za použití maker z tohoto příkladu pak problém ligatur -- a ---
+lze deklarovat jednoduše:
+
+\stringdef {---} {<em-dash>}
+\stringdef {--} {<en-dash>}
+\stringdef {-} {<simple minus>}
+
+=======================================================================
+English documentation:
+
+
+After applying \cnvin{<list of tokens>} the converted list of tokens is
+saved in \cnvout macro.
+
+The conversion is done without the standard expansion of <list of tokens>
+and is independet of catcodes of converted tokens.
+The conversion process is done in two steps:
+
+1. Controlled partial expansion of tokens. The conversion process is
+ returned back to the result of this expansion and converts it once
+ more. Only tokens declared by \predef in the conversion table are
+ expanded this way, other tokens not defined this way are not
+ expanded (even if these tokens are expandable in the normal \TeX{}
+ meaning).
+2. Final conversion of token: token is converted to the output string
+ of tokens following to the declaration by \findef macro. The
+ conversion process does not return to this output anymore.
+
+The tokens subject to conversion can have an arbitrary catcode. Not only control
+sequences can be converted.
+
+The declarations of tokens by \predef and \findef are quite
+independent of the normal meaning of these tokens. It means that in case of
+control sequences these sequences will behave during the usual processing
+by \TeX{} in a usual way although for the purpose of conversion their meaning
+can be changed using \predef or \findef.
+
+You can use normal parameters and separators (#1#2 etc.) when \predef
+is used.
+
+Each token can have only one meaning declared by \predef or \postdef.
+It the token is declared by boths declarators, then \predef is
+preferred. If the token is declared by the same declarator twice (or
+more times), then the last declaration is valid.
+
+If a token is to be converted which is not declared (by \predef nor
+\findef), then the conversion process does the default conversion
+which is determined by \cnvdefault macro (with one parameter: it is
+the coverted token). By default the token is simply copied to the
+oputput but you can redefine the \cnvdefault macro in the following
+way:
+
+\def\cnvdefault #1{<out>} % each undeclared token is converted to the
+ % common <out>
+\def\cnvdefault #1{} % undeclared token is silently ignored
+
+Now, the simple hypothetic example follows:
+
+\predef \TeX {TeX}
+\predef \uv #1{\leva #1\prava}
+\predef X{AB}
+\findef A {:XX:\TeX:}
+\cnvin{This is \uv{\TeX}}
+
+The text "This is \leva Te:XX:\TeX:B\prava" is stored in \cnvout after
+\cnvin command is processed. The contents of \cnvout can be checked
+with \message{\meaning\cnvout}.
+
+The explanation of the conversion in this example:
+
+\uv{\TeX} => \leva \TeX \prava
+\TeX => TeX
+ TeX => TeAB
+ TeAB => Te:XX:\TeX:B ... and this is kept untouched.
+
+As parameters can be used with \predef declaration you must not
+write redundant space after the declared token (see \predef X{AB}).
+On the other hand, the optional space is allowed between the token
+and the body of the macro in \findef declaration.
+
+During conversion process \TeX{} treats the token declared with
+\predef as a real macro. Only first level of expansion is done before
+conversion process returns back to expanded material (similar to
+\expandafter primitive, not \edef).
+
+The tokens of catcode 10, 1 and 2 (space and braces) are processed in
+a slightly different way. It means that a small lie was told when the
+catcode independency of the conversion process mentioned above had
+been declared. If space conversion is not declared, then it is copied
+without conversion and without dependency on \cnvdefault macro. You
+can declare the conversion of the space e.g. as follows:
+
+\findef { } {<output for space>}
+or
+\predef { }{<macro for space>}
+
+Opening brace with catcode 1 is changed to a control sequence \BGROUP
+internally. If this control sequence is not declared, then it is
+processed by \cnvdefault as any other undeclared token. Similarly,
+closing brace with catcode 2 is changed by \EGROUP during conversion
+process. We can declare the conversion rules for these tokens by:
+
+\findef \BGROUP {<output for open brace>}
+\findef \EGROUP {<output for close brace>}
+or
+\predef \BGROUP {<macro for open brace>}
+\predef \EGROUP {<makcro for close brace>}
+
+Unfortunately, macro \cnvin cannot implicitely distinguish between a
+real brace of catcode 1 or 2 and an alternate control sequence \bgroup
+or \egroup. Both are converted internally to \BGROUP, \EGROUP and
+processed in the same way. If you need to distinguish between them,
+then you need to set (locally) another meaning to \bgroup, \egroup
+before \cnvin is invoked:
+
+{\let\bgroup=\relax \let\egroup=\relax \cnvin{...} ...}
+
+You can declare the conversion of accented letters written by standard
+\TeX{} sequences. To do this, you can use the declaration macro:
+
+\cnvaccent <sequence> <char> {<output>}.
+
+This macro arranges that the accented control sequences in the form
+<sequence> <char> or <sequence> {<char>} will be converted to
+<output>. Moreover, when storing an information to a conversion table
+the \cnvaccent macro tries to expand the "<sequence> <char>" by normal
+\TeX{} rules. If the output of this expansion is one <token>, then
+\cnvaccent does internally more work: \findef <token> {<output>}.
+This guarantees that even an accented character will be converted
+to the same <output> if it is written in the input "directly" without
+\TeX{} notation.
+
+When \cnvaccent declares <sequence> as a sequnce for an accent, then the
+occurence of a non-existing accent created with this <sequence> is watched.
+Such an occurence is converted to the contents of the macro \cnvadefault
+without parameters.
+For example:
+
+\cnvaccent \v c {<output for ccaron>}
+
+and suppose that \v u is not declared. In such a case the \v c is
+converted to the corresponding output, but \v u is converted to the contents of
+\cnvadefault macro. By default there is \def\cnvadefault{?}.
+
+The commands \predef, \findef and \cnvaccent define internally the result
+of the conversion using \gdef primitive If we want to use another method,
+we can put e.g. \let\findefmethod=\xdef before the use of macros.
+This causes that all bodies of \predef will be expanded before saving them
+to the conversion table. Similarly \let\predefmethod=\def results in \predef
+will work only locally.
+
+There are three commands with special meaning in conversion process:
+\cnvexec, \cnvexpandtext and \cnvexpand.
+
+The \cnvexec command causes the following command is processed both by
+\TeX{} expand processor and main processor.
+The rest of an unconverted input is ready in the input stream.
+The conversion process continues at the moment the \cnvnext command is processed.
+The following token behind this command is submitted to conversion.
+
+The \cnvexpand <token> command expands <token> at first level of
+expansion and the expanded result is converted again. The \cnvexpand
+is implemented by \cnvexec\expandafter\cnvnext.
+
+The \cnvexpandtext {<text>} expands <text> totally in a usual way
+(like by \edef) and the result of this expansion is converted again.
+
+The contents of \cnvtable macro has to be the same both during the declaration
+of the conversion table (by \predef, etc.) and during the conversion process
+itself (by \cnvin). You can change the contents of \cnvtable macro if
+you need to declare more independent conversion tables. Then you can
+switch among these tables before using \cnvin command.
+By default there is \def\cnvtable{}.
+
+
+EXAMPLES
+--------
+
+There is an example in cnv-pu.tex file. The conversion table which
+declares the conversion from TeX text to UNICODE text used in PDF
+outlines is declared here. The advantage of this solution is that we
+need not to expand the converted text and we can declare the
+conversion for each character, not only for active characters.
+
+There is a common problem with the conversion of TeX ligatures -- and
+--- to the desired output. This task can be solved by the following
+macro:
+
+\predef -{\cnvexec \futurelet \nextchar \testtwodash}
+\def\testtwodash {\ifx-\nextchar \expandafter \twodash
+ \else \expandafter \cnvnext \expandafter \onedash \fi}
+\def\twodash #1{\futurelet \nextchar \testthreedash}
+\def\testthreedash {\ifx-\nextchar \expandafter \threedash
+ \else \expandafter \cnvnext \expandafter \twodash \fi}
+\def\threedash #1{\cnvnext \threedash}
+\findef\onedash {<simple minus>}
+\findef\twodash {<en-dash>}
+\findef\threedash {<em-dash>}
+
+A more sophisticated example of word to word conversion (not only
+single letters) is presented in cnv-word.tex file. If you use macros
+from this example, then you can solve the problem of -- and ---
+ligatures simply:
+
+\stringdef {---} {<em-dash>}
+\stringdef {--} {<en-dash>}
+\stringdef {-} {<simple minus>}
+
+=======================================================
Property changes on: trunk/Master/texmf-dist/doc/generic/olsak-misc/cnv.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/olsak-misc/eparam.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/olsak-misc/eparam.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/olsak-misc/eparam.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,177 @@
+% eparam.tex
+%%%%%%%%%%%%%%%%%%%%
+% Petr Olsak 2014
+
+% This macro enables full expansion during parameter scanning.
+% The usage:
+% \def\macro#1{macro with #1}
+% \eparam\macro prameter-text
+%
+% The delimiters for the parameter are {...} or \start...\stop or
+% combination {...\stop, \start...}, where \start is declared by \eparamopen
+% and \stop is declared by \eparamclose. See more information at the end of
+% this file or at
+% http://tex.stackexchange.com/questions/196776/arguments-possibly-delimited-by-bgroup-and-egroup
+
+
+\def\tmp{% all expandable primitives (only from classical TeX, you can add others):
+ \botmark \csname \else \endcsname \endinput \expandafter \fi \firstmark \fontname
+ \if \ifcase \ifcat \ifdim \ifeof \iffalse \ifhbox \ifhmode \ifinner
+ \ifmmode \ifnum \ifodd \iftrue \ifvbox \ifvmode \ifvoid \ifx
+ \input \jobname \meaning \noexpand \number \or \romannumeral
+ \splitbotmark \splitfirstmark \string \the \topmark
+}
+\def\skipmm#1->{} \def\showmm#1->{#1}
+\edef\textmm{\expandafter\showmm\meaning\empty}
+\edef\expandprimitives{\expandafter\skipmm\meaning\tmp}
+
+\def\isinlist#1#2#3{% from opmac.tex
+ \def\tmp##1#2##2\end{\def\tmp{##2}%
+ \ifx\tmp\empty \csname iffalse\expandafter\endcsname \else
+ \csname iftrue\expandafter\endcsname \fi}% end of \def\tmp
+ \expandafter\tmp#1\endlistsep#2\end
+}
+\def\isexpanded#1#2{% \isexpanded X\iftrue the X is expandable primitive or macro\fi
+ \edef\tmpb{\meaning#1\space}%
+ \expandafter\isinlist\expandafter\tmpb\expandafter{\textmm}%
+ \iftrue \csname iftrue\expandafter\endcsname\else
+ \def\nexxt{\expandafter\isinlist\expandafter\expandprimitives\expandafter{\tmpb}.}%
+ \expandafter\nexxt\fi
+}
+\def\eparamopen#1{\def\eparamopenA{\let#1=\eparamopenA}}
+\def\eparamclose#1{\def\eparamcloseA{\let#1=\eparamcloseA}}
+
+\newtoks\eparamT
+\def\eparam#1{\begingroup
+ \toks0={#1}\let\bgroup=\relax \let\egroup=\relax
+ \let\ifIamInGroup=\iffalse
+ \ifx\eparamopenA\undefined \def\eparamopenA{^\eparam^}\else \eparamopenA\fi
+ \ifx\eparamcloseA\undefined \def\eparamcloseA{^\eparam^}\else \eparamcloseA\fi
+ \eparamT={}\eparamA
+}
+\def\eparamA{\futurelet\tmpc\eparamB}
+\def\eparamB{\let\next=\eparamD
+ \isexpanded\tmpc\iftrue \def\next{\expandafter\eparamA}\fi
+ \ifx\tmpc\bgroupOri \let\next=\eparamC \let\nexxt=\eparamD \fi
+ \ifx\tmpc\eparamopenA \let\next=\eparamC \let\nexxt=\eparamD \fi
+ \next
+}
+\def\eparamC{\afterassignment\nexxt \let\next= }
+\def\eparamD{\futurelet\tmpc\eparamE}
+\def\eparamE{\let\next=\eparamN
+ \isexpanded\tmpc\iftrue \def\next{\expandafter\eparamD}\fi
+ \ifx\tmpc\spacetoken \let\next=\eparamC \let\nexxt=\eparamD \eparamX{ }\fi
+ \ifx\tmpc\eparamcloseA \ifIamInGroup \let\next=\eparamN
+ \else \let\next=\eparamC \let\nexxt=\eparamF \fi\fi
+ \ifx\tmpc\egroupOri \let\next=\eparamC \let\nexxt=\eparamF \fi
+ \ifx\tmpc\bgroupOri \let\next=\eparamC \let\nexxt=\eparamG \fi
+ \next
+}
+\def\eparamN#1{\eparamX#1\eparamD}
+\def\eparamG{\begingroup \let\ifIamInGroup=\iftrue \eparamT={}\eparamD}
+\def\eparamF{\ifIamInGroup \let\next=\eparamY \else \let\next=\eparamZ \fi \next}
+\long\def\eparamX#1{\eparamT\expandafter{\the\eparamT#1}}
+\def\eparamY{\expandafter\endgroup
+ \expandafter\eparamT\expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\eparamT\expandafter{\the\eparamT}}%
+ \eparamD
+}
+\def\eparamZ{\expandafter\endgroup\the\toks0\expandafter{\the\eparamT}}
+
+\let\bgroupOri=\bgroup
+\let\egroupOri=\egroup
+\def\tmp/{\let\spacetoken= }\tmp/ %
+
+\endinput
+
+tests:
+
+\def\macro#1{\toks0={#1}\message{the parameter is "\the\toks0"}}
+
+\eparam\macro {abc} % the parameter is "abc"
+
+\def\x{ww}
+\eparam\macro {ab\x c} % the parameter is "abwwc"
+\eparam\macro {a b\the\pageno c} % the parameter is "ab1c"
+\eparam\macro {ab\ifx\x\x true\else false\fi c} % the parameter is "abtruec"
+\eparam\macro {ab\ifnum\folio=1 true\else false\fi c} % the parameter is "abtruec"
+\eparam\macro {ab\ifcase\pageno oo\or one\or two\fi c} % the parameter is "abonec"
+
+\eparamopen\start \eparamclose\stop
+
+\eparam\macro {abc\stop % the parameter is "abc"
+\eparam\macro \start abc\stop % the parameter is "abc"
+\eparam\macro \start abc} % the parameter is "abc"
+
+\eparam\macro abc} % the parameter is "abc"
+\eparam\macro abc\stop % the parameter is "abc"
+
+\eparam\macro \start abc{uf\stop fu}ee\stop % the parameter is "abc{uf\stop fu}ee"
+
+\def\y{end\stop}
+
+\eparam\macro {a\x\y % the parameter is "awwend"
+
+\eparam {\def\aha#1#2}\start params: #1 and #2\stop
+
+\eparamopen\bgroup \eparamclose\egroup
+\eparam {\def\foo#1#2}\bgroup Something with #1 and #2\egroup
+
+\message{\meaning\foo}
+
+\end
+
+The question gives me a sense if it is read from its end: *give
+the possibility of creating a macro which expands its parameter during
+parameter scanning*. Then the variants `}` or `\egroup` as a delimiter of the
+parameter is serviceable.
+
+I've created the `\eparam` macro with this syntax:
+
+ \def\mymacro #1{the #1 parameter is declared as undelimited}
+ ...
+ \eparam\mymacro parameter-text
+
+The `parameter-text` is equal to `real-parameter-text` enclosed by braces or
+by another control sequences declared by `\eparamopen` and \eparamclose`.
+Example:
+
+ \eparamopen\start \eparamclose\stop
+ \eparam\mymacro {real-parameter-text}
+ \eparam\mymacro \start real-parameter-text\stop
+ \eparam\mymacro \start real-parameter-text}
+ \eparam\mymacro {real-parameter-text\stop
+
+The main point of the `\eparam` is that this is **Expanded Parameter**.
+The `real-parameter-text` is expanded during parameter scanning like
+by `\edef`. This means that all expandable primitives and macros are
+expanded during the parameter is read. Unexpandable primitives does nothing
+in this time (like `\edef`) so you can do reassigmnent of registers/macros
+inside this parameter but without any effect for parameter scaninng.
+This is main difference between this case and the `\hbox {...}` primitive
+syntax.
+
+There is one difference between `\edef` and parameter scanning:
+undefined control sequences do nothing (like unexpandable primitives)
+during parameter scanning. The error can be occur only when the parameter is
+used (no during parameter scanning).
+
+The separator declared by `\eparamclose` can be hidden in a macro. Example:
+
+ \def\x{-text\stop}
+ \eparam\mymacro {real-parameter\x
+
+The first open brace or delimiter given by `\eparamopen` is optional. I.e.
+you can omit it:
+
+ \eparam\mymacro real-parameter-text\stop
+
+The parameter is always balanced. This means that the delimiter declared by
+`\eparamclose` does no effect inside inner braces pair (like normal
+parameter scanning):
+
+ \eparam \start text{inside \stop braces}text\stop
+ % the parameter is: "text{inside \stop braces}text"
+
+The implementation (or wipet's sorcery :) and little tests follow.
+
\ No newline at end of file
Property changes on: trunk/Master/texmf-dist/doc/generic/olsak-misc/eparam.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/olsak-misc/fun-coffee.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/olsak-misc/fun-coffee.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/olsak-misc/fun-coffee.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,4941 @@
+%%% fun-coffee.tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Source from Hanno Rein converted by Petr Olsak for direct \pdfliteral
+% April 2015
+
+% This macro file provides an essential feature to TeX that has been missing
+% for too long. It adds a coffee stain to your documents. A lot of time can
+% be saved by printing stains directly on the page rather than adding it
+% manually.
+
+% See more information at http://hanno-rein.de/archives/349
+
+% Usage. After \input fun-coffee you can put the image by
+% \coffeeA or \coffeeB or \coffeeC or \coffeeD.
+
+% You can set the size of images by \def\coffeescale{factor}, for example:
+% \def\coffeescale{.5}\coffeeA. The default factor is 1.
+
+% Technical note: direct \pdfliteral works in pdfTeX with PDF output or in
+% LuaTeX. If you need to use it in XeTeX then you can \input opmac or you
+% can define: \def\pdfliteral#1{\special{pdf:literal #1}}. No special
+% packages are needed. No PSTricks, no TikZ, etc.
+
+\def\coffeescale{1}
+
+\def\coffeeA{\pdfliteral{%
+ q \coffeescale\space 0 0 \coffeescale\space 0 0 cm
+ .5 0 0 .5 0 -440 cm
+ 0.80 0.68 0.60 rg
+ 375 410 m
+ 373 411 368 413 364 415 c
+ 350 421 356 424 385 426 c
+ 408 427 410 428 420 434 c
+ 425 438 432 442 435 443 c
+ 438 444 445 447 450 451 c
+ 456 454 463 457 466 458 c
+ 474 460 495 476 516 497 c
+ 526 507 533 517 538 527 c
+ 542 535 547 544 549 546 c
+ 559 557 563 567 563 581 c
+ 563 593 564 596 570 601 c
+ 578 610 583 611 588 606 c
+ 594 601 593 589 586 562 c
+ 574 521 559 496 525 461 c
+ 499 434 478 422 443 413 c
+ 427 409 379 407 375 410 c
+ h f
+ 142 605 m
+ 138 609 138 614 139 642 c
+ 140 674 142 686 152 707 c
+ 154 712 158 722 160 728 c
+ 165 746 174 762 179 763 c
+ 181 764 183 768 184 771 c
+ 186 778 213 807 230 818 c
+ 261 838 278 848 297 853 c
+ 332 864 364 866 401 860 c
+ 424 857 438 852 462 841 c
+ 496 824 518 810 530 796 c
+ 533 792 541 783 549 776 c
+ 564 760 572 747 575 730 c
+ 577 724 580 714 583 708 c
+ 591 692 594 677 594 658 c
+ 594 643 593 640 588 631 c
+ 581 619 577 618 577 627 c
+ 577 632 576 639 574 644 c
+ 573 650 569 662 566 671 c
+ 564 681 561 690 560 692 c
+ 559 694 558 698 558 700 c
+ 558 702 553 710 547 716 c
+ 540 724 535 732 533 739 c
+ 531 746 527 754 523 757 c
+ 520 761 517 764 517 766 c
+ 517 769 490 795 478 803 c
+ 450 822 415 832 368 835 c
+ 336 836 330 836 302 828 c
+ 286 823 251 806 243 799 c
+ 239 796 231 789 225 784 c
+ 219 779 212 772 208 769 c
+ 204 765 199 762 196 762 c
+ 189 761 189 761 193 756 c
+ 196 753 196 752 190 744 c
+ 175 724 167 699 164 664 c
+ 163 649 161 635 160 632 c
+ 158 628 158 622 159 616 c
+ 162 604 159 599 151 599 c
+ 147 599 144 601 142 605 c
+ h f
+ 533 839 m
+ 532 841 532 843 534 845 c
+ 537 848 543 845 542 841 c
+ 541 836 534 834 533 839 c
+ h f
+ 599 856 m
+ 600 861 604 861 605 857 c
+ 605 854 604 853 602 853 c
+ 600 853 599 854 599 856 c
+ h f
+ 0.77 0.58 0.43 rg
+ 387 409 m
+ 378 410 366 416 365 419 c
+ 365 421 379 424 401 426 c
+ 408 426 413 428 419 433 c
+ 424 437 432 441 437 443 c
+ 442 445 448 448 450 449 c
+ 452 451 459 454 465 456 c
+ 486 464 528 502 538 525 c
+ 542 532 549 544 554 552 c
+ 563 566 564 568 564 580 c
+ 564 592 565 594 572 600 c
+ 580 609 584 609 589 603 c
+ 593 599 593 598 590 584 c
+ 580 533 560 496 522 459 c
+ 499 437 480 425 453 417 c
+ 434 412 403 408 387 409 c
+ h f
+ 141 609 m
+ 138 613 138 617 139 632 c
+ 140 642 141 655 141 662 c
+ 142 677 145 688 156 711 c
+ 161 721 164 730 164 733 c
+ 164 736 165 739 166 740 c
+ 167 741 169 746 170 750 c
+ 174 761 177 764 185 759 c
+ 189 758 192 755 193 754 c
+ 194 753 190 746 185 739 c
+ 179 732 175 724 175 722 c
+ 175 720 173 715 172 712 c
+ 167 704 165 689 162 660 c
+ 161 647 159 634 158 630 c
+ 157 627 157 620 158 615 c
+ 160 605 159 603 151 603 c
+ 147 603 144 605 141 609 c
+ h f
+ 580 638 m
+ 577 641 573 653 568 671 c
+ 565 678 562 688 561 693 c
+ 559 697 558 703 558 704 c
+ 558 706 553 711 548 716 c
+ 541 723 538 729 535 738 c
+ 527 765 486 805 449 820 c
+ 415 834 352 841 323 835 c
+ 300 829 285 824 268 815 c
+ 260 811 252 808 251 808 c
+ 249 808 247 806 246 804 c
+ 244 802 237 795 229 789 c
+ 221 783 212 775 208 772 c
+ 201 764 194 763 189 769 c
+ 186 773 186 773 196 786 c
+ 207 798 227 816 231 816 c
+ 232 816 236 820 241 823 c
+ 246 827 253 832 257 834 c
+ 261 835 267 839 271 841 c
+ 288 853 327 861 362 862 c
+ 406 862 429 856 472 834 c
+ 505 817 517 808 543 781 c
+ 562 760 575 739 575 728 c
+ 575 725 578 716 582 707 c
+ 590 690 594 672 593 660 c
+ 593 656 593 650 592 648 c
+ 592 642 587 636 584 636 c
+ 583 636 581 637 580 638 c
+ h f
+ 534 841 m
+ 534 843 536 844 537 844 c
+ 539 844 541 843 541 841 c
+ 541 839 539 838 537 838 c
+ 536 838 534 839 534 841 c
+ h f
+ 0.71 0.54 0.40 rg
+ 384 411 m
+ 381 412 376 414 373 416 c
+ 367 420 l
+ 373 420 l
+ 375 420 380 419 382 417 c
+ 385 414 386 414 386 418 c
+ 386 422 393 425 404 425 c
+ 407 425 414 428 419 432 c
+ 425 436 433 441 437 442 c
+ 441 444 448 447 452 450 c
+ 456 453 461 455 463 455 c
+ 467 455 479 461 490 471 c
+ 495 476 505 483 510 488 c
+ 523 499 533 512 539 527 c
+ 542 533 547 541 550 544 c
+ 559 556 564 567 565 582 c
+ 566 593 566 596 572 600 c
+ 575 603 580 605 583 605 c
+ 592 605 593 599 588 578 c
+ 577 529 560 500 522 460 c
+ 491 429 457 413 410 411 c
+ 399 411 386 411 384 411 c
+ h f
+ 142 609 m
+ 139 613 139 642 143 649 c
+ 145 652 145 654 143 658 c
+ 141 662 141 664 142 667 c
+ 144 670 145 674 145 677 c
+ 145 680 146 683 147 684 c
+ 148 685 149 689 149 692 c
+ 150 696 151 697 157 698 c
+ 164 698 164 698 164 691 c
+ 164 677 159 639 156 631 c
+ 155 626 154 622 156 620 c
+ 157 619 158 615 158 611 c
+ 158 606 157 605 151 605 c
+ 148 605 144 607 142 609 c
+ h f
+ 579 645 m
+ 575 649 573 654 573 655 c
+ 573 658 571 666 561 697 c
+ 559 703 554 711 549 716 c
+ 540 726 534 736 534 743 c
+ 534 745 531 751 527 756 c
+ 522 760 519 765 519 766 c
+ 519 771 492 797 478 805 c
+ 443 827 410 836 358 836 c
+ 318 837 305 834 275 820 c
+ 267 815 256 811 252 809 c
+ 247 807 244 805 244 804 c
+ 244 801 218 781 212 779 c
+ 210 778 206 775 204 772 c
+ 200 766 194 765 190 770 c
+ 187 773 190 780 194 782 c
+ 195 783 198 786 201 790 c
+ 209 799 229 816 233 816 c
+ 234 816 238 819 241 822 c
+ 244 825 251 830 257 833 c
+ 263 836 271 840 274 842 c
+ 288 852 334 861 364 861 c
+ 400 861 428 855 463 838 c
+ 498 821 514 810 539 783 c
+ 562 758 575 738 575 726 c
+ 575 723 578 716 581 710 c
+ 593 686 596 652 588 642 c
+ 584 637 l
+ 579 645 l
+ h f
+ 166 733 m
+ 166 738 167 739 171 739 c
+ 178 739 180 737 176 732 c
+ 171 726 166 727 166 733 c
+ h f
+ 176 744 m
+ 171 747 171 749 173 754 c
+ 175 761 180 762 187 757 c
+ 193 753 193 749 188 745 c
+ 183 740 182 740 176 744 c
+ h f
+ 534 841 m
+ 534 843 536 844 537 844 c
+ 539 844 541 843 541 841 c
+ 541 839 539 838 537 838 c
+ 536 838 534 839 534 841 c
+ h f
+ 0.67 0.44 0.30 rg
+ 391 411 m
+ 386 413 387 420 392 420 c
+ 394 420 397 421 397 423 c
+ 398 424 402 425 406 425 c
+ 410 425 414 426 417 429 c
+ 420 433 452 450 470 457 c
+ 480 460 518 493 527 505 c
+ 532 511 538 521 540 527 c
+ 543 532 548 540 551 545 c
+ 563 560 567 569 566 578 c
+ 564 589 568 598 576 602 c
+ 593 612 594 593 579 547 c
+ 570 519 549 488 521 459 c
+ 498 436 471 421 438 414 c
+ 426 412 394 410 391 411 c
+ h f
+ 142 610 m
+ 139 614 141 643 144 648 c
+ 147 652 147 654 144 658 c
+ 141 663 141 664 143 667 c
+ 144 669 145 672 145 675 c
+ 145 677 146 681 148 683 c
+ 150 686 151 690 151 692 c
+ 151 695 153 696 157 695 c
+ 163 695 163 694 163 685 c
+ 162 661 160 642 157 633 c
+ 155 628 154 623 154 621 c
+ 155 619 156 615 156 612 c
+ 158 608 157 608 150 608 c
+ 146 608 142 609 142 610 c
+ h f
+ 578 649 m
+ 574 653 571 662 566 683 c
+ 565 688 563 694 562 695 c
+ 561 696 560 699 560 702 c
+ 560 705 556 711 549 717 c
+ 542 725 538 730 536 739 c
+ 534 745 530 753 526 758 c
+ 522 763 519 767 519 768 c
+ 519 773 497 793 481 804 c
+ 463 816 443 825 423 830 c
+ 398 837 340 841 324 837 c
+ 298 830 281 824 265 815 c
+ 262 813 257 812 254 812 c
+ 249 812 247 810 243 804 c
+ 241 800 238 797 236 797 c
+ 235 797 230 793 226 789 c
+ 221 784 218 782 214 783 c
+ 211 783 207 782 203 777 c
+ 199 774 196 771 194 771 c
+ 189 771 190 776 196 783 c
+ 199 786 206 793 210 798 c
+ 215 803 223 810 230 813 c
+ 236 816 243 821 244 823 c
+ 246 826 251 829 256 831 c
+ 260 833 267 836 271 839 c
+ 284 849 335 861 362 861 c
+ 399 861 435 852 471 833 c
+ 504 816 517 806 541 781 c
+ 562 758 573 741 573 729 c
+ 573 727 576 719 579 711 c
+ 587 694 592 676 592 663 c
+ 592 645 586 640 578 649 c
+ h f
+ 167 732 m
+ 167 734 167 735 169 736 c
+ 174 737 176 736 174 733 c
+ 172 730 169 730 167 732 c
+ h f
+ 176 746 m
+ 172 750 172 752 176 757 c
+ 178 761 179 761 185 757 c
+ 193 753 194 752 188 747 c
+ 183 742 181 742 176 746 c
+ h f
+ 535 840 m
+ 534 841 535 842 537 842 c
+ 539 842 540 841 540 840 c
+ 539 839 538 838 537 838 c
+ 537 838 536 839 535 840 c
+ h f
+ 0.63 0.33 0.10 rg
+ 391 414 m
+ 390 415 391 416 393 416 c
+ 395 416 397 418 398 419 c
+ 399 421 402 423 406 423 c
+ 411 423 415 424 419 429 c
+ 422 433 430 437 435 439 c
+ 440 441 447 444 450 447 c
+ 453 449 461 452 468 455 c
+ 475 457 481 461 483 462 c
+ 484 464 493 472 503 479 c
+ 522 495 534 509 541 526 c
+ 544 533 549 541 552 544 c
+ 563 558 566 566 566 580 c
+ 566 591 567 593 572 598 c
+ 579 604 584 605 588 600 c
+ 591 597 590 592 584 569 c
+ 573 526 556 497 520 460 c
+ 501 441 484 430 459 421 c
+ 436 413 394 409 391 414 c
+ h f
+ 142 619 m
+ 141 624 141 629 142 631 c
+ 143 633 144 637 143 640 c
+ 142 644 143 647 147 649 c
+ 152 653 l
+ 147 658 l
+ 141 665 143 668 153 668 c
+ 160 668 l
+ 159 654 l
+ 158 647 156 636 154 631 c
+ 151 623 151 620 153 618 c
+ 157 613 156 610 149 610 c
+ 144 610 143 611 142 619 c
+ h f
+ 578 651 m
+ 577 653 575 656 574 659 c
+ 571 674 565 693 563 697 c
+ 561 700 560 704 560 706 c
+ 560 708 556 713 552 717 c
+ 544 723 538 734 535 745 c
+ 535 748 532 753 529 756 c
+ 527 759 522 766 518 772 c
+ 515 777 511 783 509 784 c
+ 507 786 504 789 504 791 c
+ 503 793 499 796 494 798 c
+ 489 801 480 806 474 810 c
+ 458 820 442 826 421 832 c
+ 386 841 329 843 311 836 c
+ 309 835 304 833 301 832 c
+ 298 830 293 829 290 829 c
+ 287 829 284 828 283 827 c
+ 282 825 279 825 276 826 c
+ 271 827 269 826 269 823 c
+ 269 817 262 814 254 815 c
+ 248 815 247 816 247 821 c
+ 247 825 249 827 257 830 c
+ 263 832 269 835 272 838 c
+ 274 840 279 843 282 844 c
+ 285 845 291 847 295 848 c
+ 333 862 390 863 429 850 c
+ 447 845 486 825 503 814 c
+ 522 801 559 761 567 745 c
+ 570 737 573 729 573 727 c
+ 573 724 576 714 581 704 c
+ 588 688 589 684 589 668 c
+ 589 651 589 650 584 649 c
+ 582 649 579 650 578 651 c
+ h f
+ 151 674 m
+ 146 675 146 679 150 683 c
+ 152 684 153 687 153 690 c
+ 153 695 159 695 161 688 c
+ 164 676 160 671 151 674 c
+ h f
+ 179 748 m
+ 175 750 174 755 177 757 c
+ 179 758 190 754 190 752 c
+ 190 750 185 745 184 745 c
+ 183 745 181 746 179 748 c
+ h f
+ 212 787 m
+ 205 790 206 793 214 800 c
+ 224 810 231 813 231 809 c
+ 231 807 233 805 235 804 c
+ 241 803 240 800 233 798 c
+ 229 798 226 795 225 793 c
+ 223 787 218 784 212 787 c
+ h f
+ 237 813 m
+ 238 814 240 814 241 813 c
+ 242 813 240 812 238 812 c
+ 236 812 235 813 237 813 c
+ h f
+ 0.57 0.16 0.01 rg
+ 403 416 m
+ 404 420 411 420 412 417 c
+ 412 416 410 415 407 414 c
+ 404 414 403 414 403 416 c
+ h f
+ 429 418 m
+ 435 422 434 425 427 423 c
+ 422 422 420 423 420 425 c
+ 420 429 433 438 438 438 c
+ 441 438 446 440 450 443 c
+ 454 446 460 450 464 451 c
+ 468 452 478 458 485 464 c
+ 492 469 500 474 503 474 c
+ 507 474 508 475 508 478 c
+ 508 480 511 484 513 486 c
+ 518 489 519 489 521 486 c
+ 524 483 523 482 520 480 c
+ 515 476 517 473 524 472 c
+ 528 471 527 469 516 458 c
+ 499 441 478 429 454 422 c
+ 435 416 422 414 429 418 c
+ h f
+ 523 493 m
+ 523 494 525 496 526 498 c
+ 530 501 533 497 531 494 c
+ 529 491 523 491 523 493 c
+ h f
+ 550 505 m
+ 550 507 548 510 546 512 c
+ 543 514 542 513 539 509 c
+ 537 507 535 504 534 504 c
+ 532 504 533 506 535 508 c
+ 537 510 539 516 540 521 c
+ 542 526 546 534 550 539 c
+ 563 556 568 568 568 581 c
+ 568 594 570 598 580 600 c
+ 589 602 589 597 582 567 c
+ 575 541 567 522 557 507 c
+ 552 499 550 498 550 505 c
+ h f
+ 144 625 m
+ 142 628 144 631 148 631 c
+ 152 631 152 628 148 625 c
+ 146 623 145 623 144 625 c
+ h f
+ 147 643 m
+ 147 646 152 649 154 647 c
+ 157 644 155 640 151 640 c
+ 149 640 147 641 147 643 c
+ h f
+ 581 653 m
+ 579 654 577 657 577 659 c
+ 577 661 576 666 574 669 c
+ 572 673 571 680 572 687 c
+ 572 695 572 698 570 696 c
+ 566 693 562 697 562 703 c
+ 562 705 558 711 553 716 c
+ 544 725 536 739 536 746 c
+ 536 748 533 753 530 757 c
+ 527 760 522 767 520 772 c
+ 512 792 500 804 489 804 c
+ 487 804 486 806 486 808 c
+ 486 813 483 815 479 812 c
+ 477 810 475 811 470 816 c
+ 466 820 462 822 460 821 c
+ 458 821 453 822 448 825 c
+ 437 831 406 838 384 839 c
+ 371 840 369 841 368 844 c
+ 366 850 360 852 358 848 c
+ 356 846 344 844 329 845 c
+ 326 845 319 845 313 845 c
+ 305 844 302 845 302 847 c
+ 303 848 306 850 309 850 c
+ 313 851 321 852 327 854 c
+ 342 858 385 858 406 854 c
+ 436 849 461 838 465 830 c
+ 467 826 468 825 471 827 c
+ 476 829 476 829 498 816 c
+ 514 806 560 759 565 746 c
+ 567 741 570 732 572 725 c
+ 574 719 577 708 580 703 c
+ 587 690 591 670 589 660 c
+ 587 651 586 650 581 653 c
+ h f
+ 148 659 m
+ 146 662 149 666 153 666 c
+ 156 666 158 664 158 661 c
+ 158 657 150 655 148 659 c
+ h f
+ 155 678 m
+ 157 679 158 678 159 678 c
+ 160 677 159 677 156 677 c
+ 154 677 153 677 155 678 c
+ h f
+ 212 791 m
+ 208 794 208 795 212 796 c
+ 217 798 222 794 219 790 c
+ 217 789 215 789 212 791 c
+ h f
+ 251 819 m
+ 249 822 251 824 256 822 c
+ 257 821 258 820 258 818 c
+ 256 816 253 816 251 819 c
+ h f
+ 275 831 m
+ 273 833 274 836 277 836 c
+ 279 836 280 834 280 832 c
+ 280 829 278 828 275 831 c
+ h f
+ 286 836 m
+ 283 840 282 841 285 842 c
+ 291 846 295 845 295 838 c
+ 295 830 292 830 286 836 c
+ h f
+ 0.34 0.05 0.01 rg
+ 491 455 m
+ 482 460 492 471 503 469 c
+ 516 466 519 459 508 455 c
+ 500 452 495 452 491 455 c
+ h f
+ 548 517 m
+ 541 520 541 522 548 534 c
+ 554 543 561 547 567 544 c
+ 570 542 567 526 562 520 c
+ 557 515 555 514 548 517 c
+ h f
+ 568 564 m
+ 571 570 578 570 577 565 c
+ 576 563 574 561 571 561 c
+ 567 560 566 560 568 564 c
+ h f
+ 575 584 m
+ 575 588 578 593 581 593 c
+ 584 593 584 590 582 585 c
+ 581 582 575 580 575 584 c
+ h f
+ 581 669 m
+ 576 674 575 676 576 683 c
+ 578 694 579 696 581 696 c
+ 584 696 589 674 588 668 c
+ 587 664 587 664 581 669 c
+ h f
+ 554 716 m
+ 544 726 542 730 537 744 c
+ 534 754 530 762 528 764 c
+ 526 765 526 767 526 769 c
+ 529 773 534 772 535 767 c
+ 537 762 545 761 545 765 c
+ 545 772 558 760 565 746 c
+ 569 739 575 714 575 707 c
+ 575 701 565 706 554 716 c
+ h f
+ 514 792 m
+ 513 793 513 796 513 799 c
+ 513 804 513 804 517 800 c
+ 519 798 521 795 521 793 c
+ 521 790 517 789 514 792 c
+ h f
+ 495 811 m
+ 493 814 491 816 492 816 c
+ 495 816 506 809 506 807 c
+ 506 804 500 806 495 811 c
+ h f
+ 476 824 m
+ 476 826 477 827 479 827 c
+ 483 825 483 821 479 821 c
+ 478 821 476 822 476 824 c
+ h f
+ 445 836 m
+ 441 841 443 841 449 837 c
+ 451 835 452 834 451 833 c
+ 450 832 447 833 445 836 c
+ h f
+ 409 845 m
+ 409 847 411 849 413 849 c
+ 414 849 416 848 416 847 c
+ 416 846 414 844 413 843 c
+ 411 843 409 843 409 845 c
+ h f
+ Q
+}}
+
+\def\coffeeB{\pdfliteral{%
+ q \coffeescale\space 0 0 \coffeescale\space 0 0 cm
+ .5 0 0 .5 0 -500 cm
+ 0.86 0.77 0.70 rg
+ 119 537 m
+ 108 544 101 556 96.79 573 c
+ 94.66 582 93.17 589 93.48 589 c
+ 94.91 591 121 563 127 554 c
+ 134 543 134 541 130 536 c
+ 128 532 127 532 119 537 c
+ h f
+ 62.17 668 m
+ 57.50 672 55.08 705 58.27 720 c
+ 59.63 727 61.08 736 61.49 741 c
+ 63.32 762 67.92 791 71.71 806 c
+ 79.42 836 111 887 134 909 c
+ 160 932 214 959 214 949 c
+ 214 945 207 930 202 924 c
+ 200 921 194 917 188 915 c
+ 175 909 173 907 165 892 c
+ 161 885 152 874 145 867 c
+ 139 860 131 850 128 844 c
+ 125 839 120 827 115 819 c
+ 111 810 104 798 101 792 c
+ 94.41 781 91.12 771 88.69 753 c
+ 87.87 747 85.95 741 84.42 739 c
+ 82.86 737 82.39 734 83.35 733 c
+ 86.09 728 84.33 673 81.37 670 c
+ 76.77 665 65.75 664 62.17 668 c
+ h f
+ 587 815 m
+ 587 819 585 824 584 827 c
+ 581 833 585 833 589 826 c
+ 592 822 592 819 591 815 c
+ 589 809 l
+ 587 815 l
+ h f
+ 0.80 0.68 0.59 rg
+ 112 545 m
+ 110 549 103 561 103 563 c
+ 103 564 106 564 109 564 c
+ 114 564 117 562 121 557 c
+ 127 549 128 545 123 545 c
+ 122 545 119 544 117 544 c
+ 116 543 113 544 112 545 c
+ h f
+ 60.54 678 m
+ 57.41 689 58.92 725 62.73 730 c
+ 64.21 732 64.87 735 64.21 738 c
+ 63.54 740 64.09 744 65.43 747 c
+ 67.85 751 68.37 755 70.06 782 c
+ 71.69 808 75.87 820 96.71 857 c
+ 107 876 118 891 131 903 c
+ 142 914 169 931 179 933 c
+ 182 934 188 936 190 939 c
+ 200 946 206 942 201 932 c
+ 197 923 192 919 188 919 c
+ 186 919 180 917 176 914 c
+ 169 910 167 906 163 896 c
+ 158 883 149 870 138 861 c
+ 135 858 130 851 126 845 c
+ 110 813 104 802 100 794 c
+ 90.36 778 85.66 765 85.42 753 c
+ 85.31 748 83.94 743 82.36 741 c
+ 80.21 738 80.03 736 81.61 730 c
+ 84.21 722 83.31 676 80.49 673 c
+ 79.36 672 74.99 670 70.76 670 c
+ 63.19 668 63.04 669 60.54 678 c
+ h f
+ 0.76 0.58 0.42 rg
+ 63.74 675 m
+ 58.40 680 60.11 724 65.91 731 c
+ 70.74 736 73.92 736 78.29 731 c
+ 80.97 728 81.61 722 81.49 701 c
+ 81.34 676 81.23 675 76.20 673 c
+ 69.17 670 67.91 671 63.74 675 c
+ h f
+ 72.81 746 m
+ 75.68 749 78.74 750 81.02 749 c
+ 86.31 747 80.99 742 73.80 742 c
+ 68.24 742 l
+ 72.81 746 l
+ h f
+ 72.89 755 m
+ 68.05 757 68.20 763 73.34 772 c
+ 77.15 778 77.22 779 74.25 785 c
+ 71.56 790 71.42 793 73.43 802 c
+ 76.24 815 83.19 832 89.46 841 c
+ 91.85 845 97.16 854 101 862 c
+ 106 872 115 883 126 896 c
+ 145 915 l
+ 156 915 l
+ 167 914 l
+ 164 909 l
+ 162 906 161 902 161 900 c
+ 161 889 155 879 141 865 c
+ 133 857 126 848 125 845 c
+ 125 842 122 836 119 833 c
+ 116 829 112 821 109 814 c
+ 107 808 103 801 102 799 c
+ 100 797 99.13 795 99.13 794 c
+ 99.13 793 96.72 789 93.78 787 c
+ 90.77 784 88.43 779 88.43 776 c
+ 88.42 773 85.76 766 82.50 762 c
+ 77.69 754 75.90 753 72.89 755 c
+ h f
+ 171 918 m
+ 169 920 173 926 176 926 c
+ 177 926 181 928 184 930 c
+ 189 934 191 934 193 933 c
+ 196 929 194 923 189 923 c
+ 187 923 183 922 181 920 c
+ 176 917 173 916 171 918 c
+ h f
+ 0.71 0.55 0.40 rg
+ 66.28 676 m
+ 60.78 680 60.69 723 66.16 729 c
+ 70.88 734 73.97 734 78.88 729 c
+ 82.36 725 82.56 723 80.65 711 c
+ 79.22 703 79.20 695 80.59 689 c
+ 83.70 675 76.26 669 66.28 676 c
+ h f
+ 71.33 763 m
+ 71.33 765 73.88 769 77.00 771 c
+ 82.66 775 l
+ 77.94 784 l
+ 73.69 791 73.43 793 75.35 805 c
+ 76.52 812 80.18 823 83.49 829 c
+ 86.80 835 94.07 848 99.66 859 c
+ 110 878 133 906 144 912 c
+ 148 914 151 914 155 912 c
+ 160 910 160 909 159 901 c
+ 157 885 154 880 139 864 c
+ 129 854 124 847 124 844 c
+ 124 841 122 837 120 835 c
+ 118 833 114 826 111 819 c
+ 109 812 105 805 103 803 c
+ 102 801 99.51 797 98.20 795 c
+ 96.82 792 93.45 789 90.14 789 c
+ 84.78 788 84.51 788 85.35 779 c
+ 86.00 772 85.40 769 83.28 768 c
+ 81.64 768 79.82 765 79.22 763 c
+ 77.82 757 71.33 757 71.33 763 c
+ h f
+ 173 921 m
+ 173 922 175 923 176 923 c
+ 177 923 177 922 177 921 c
+ 176 920 175 919 174 919 c
+ 174 919 173 920 173 921 c
+ h f
+ 183 925 m
+ 182 928 189 932 191 930 c
+ 193 929 189 923 186 923 c
+ 185 923 184 924 183 925 c
+ h f
+ 0.67 0.44 0.30 rg
+ 67.59 675 m
+ 63.24 677 62.77 679 62.77 692 c
+ 62.77 701 63.64 707 64.70 707 c
+ 65.76 707 66.23 712 65.75 717 c
+ 64.77 727 68.34 732 75.31 730 c
+ 81.24 728 82.09 724 79.80 710 c
+ 78.51 702 78.55 695 79.91 690 c
+ 82.64 681 82.62 681 78.66 677 c
+ 74.87 673 74.29 673 67.59 675 c
+ h f
+ 74.62 791 m
+ 71.17 796 81.37 828 89.85 838 c
+ 91.41 840 96.15 848 100 857 c
+ 108 874 123 894 137 905 c
+ 147 913 149 914 155 910 c
+ 158 908 159 906 157 903 c
+ 155 900 155 895 156 891 c
+ 157 884 156 882 141 867 c
+ 131 857 124 848 124 846 c
+ 124 843 122 838 119 835 c
+ 116 831 112 822 109 816 c
+ 107 810 103 803 101 800 c
+ 98.84 798 96.99 795 96.99 793 c
+ 96.99 792 96.27 791 95.39 791 c
+ 94.51 791 89.70 790 84.71 790 c
+ 79.72 789 75.18 790 74.62 791 c
+ h f
+ 0.62 0.35 0.13 rg
+ 66.51 679 m
+ 62.59 683 63.58 686 71.08 690 c
+ 77.21 693 80.26 690 79.37 682 c
+ 78.68 675 71.47 674 66.51 679 c
+ h f
+ 65.79 700 m
+ 65.17 701 67.61 706 71.20 710 c
+ 77.74 717 l
+ 77.74 711 l
+ 77.74 700 68.94 691 65.79 700 c
+ h f
+ 76.78 793 m
+ 74.90 796 79.53 817 83.85 826 c
+ 86.17 830 90.56 837 93.60 841 c
+ 96.64 845 99.13 849 99.13 851 c
+ 99.13 855 108 871 117 883 c
+ 130 900 145 911 150 909 c
+ 153 908 154 907 153 905 c
+ 151 900 151 897 153 889 c
+ 155 883 153 881 138 866 c
+ 129 856 122 848 122 845 c
+ 122 842 120 838 117 834 c
+ 114 831 110 823 108 818 c
+ 103 803 95.60 794 85.80 792 c
+ 81.41 792 77.35 792 76.78 793 c
+ h f
+ 0.54 0.18 0.03 rg
+ 69.41 680 m
+ 67.48 683 67.96 684 71.73 685 c
+ 77.43 686 78.70 685 77.01 681 c
+ 75.44 677 72.62 677 69.41 680 c
+ h f
+ 82.02 797 m
+ 82.02 798 82.98 799 84.16 799 c
+ 85.34 799 86.30 798 86.30 797 c
+ 86.30 796 85.34 795 84.16 795 c
+ 82.98 795 82.02 796 82.02 797 c
+ h f
+ 87.37 803 m
+ 79.15 805 77.31 814 84.03 820 c
+ 86.45 822 88.44 825 88.44 828 c
+ 88.44 832 101 846 106 846 c
+ 110 846 110 847 106 851 c
+ 103 855 103 855 106 864 c
+ 108 869 114 877 118 883 c
+ 133 900 144 903 151 892 c
+ 154 886 154 885 150 879 c
+ 148 876 140 868 133 862 c
+ 123 853 120 849 120 845 c
+ 120 842 118 837 115 834 c
+ 112 831 109 824 107 818 c
+ 104 807 100 801 96.30 802 c
+ 94.92 802 90.90 803 87.37 803 c
+ h f
+ 0.40 0.05 0.00 rg
+ 89.00 807 m
+ 84.54 809 82.48 811 83.23 813 c
+ 85.02 818 93.83 821 99.00 820 c
+ 102 819 103 817 102 812 c
+ 102 804 98.82 803 89.00 807 c
+ h f
+ 97.95 834 m
+ 95.97 837 98.92 839 107 841 c
+ 112 842 114 841 114 839 c
+ 114 833 100 829 97.95 834 c
+ h f
+ 114 864 m
+ 107 866 108 869 120 881 c
+ 127 888 131 891 134 890 c
+ 136 889 139 890 140 891 c
+ 143 893 144 893 147 891 c
+ 152 887 150 881 143 873 c
+ 131 862 125 859 114 864 c
+ h f
+ Q
+}}
+
+\def\coffeeC{\pdfliteral{%
+ q \coffeescale\space 0 0 \coffeescale\space 0 0 cm
+ .5 0 0 .5 0 -220 cm
+ 0.98 0.85 0.77 rg
+ 240 148 m
+ 236 151 220 154 220 150 c
+ 220 149 219 148 217 148 c
+ 215 148 214 149 214 150 c
+ 214 154 198 157 192 154 c
+ 185 151 184 152 183 158 c
+ 181 166 178 168 171 168 c
+ 168 168 166 169 166 171 c
+ 166 175 160 180 155 181 c
+ 152 181 150 184 149 189 c
+ 149 195 148 196 139 197 c
+ 130 198 l
+ 136 201 l
+ 143 206 143 211 136 217 c
+ 132 220 131 222 133 228 c
+ 134 234 133 236 127 241 c
+ 121 246 121 247 123 253 c
+ 125 256 127 259 128 260 c
+ 133 262 136 276 134 281 c
+ 132 284 132 285 135 287 c
+ 141 290 141 299 135 305 c
+ 130 311 132 314 141 314 c
+ 152 314 156 320 150 328 c
+ 145 334 l
+ 154 333 l
+ 163 331 163 331 165 337 c
+ 166 340 165 343 163 345 c
+ 159 349 158 354 161 354 c
+ 162 354 165 352 168 349 c
+ 170 346 174 344 175 344 c
+ 180 344 190 354 190 359 c
+ 190 364 195 369 198 367 c
+ 199 366 200 364 200 362 c
+ 200 356 209 355 218 359 c
+ 222 361 228 363 232 363 c
+ 236 364 241 364 243 364 c
+ 245 365 248 363 249 361 c
+ 251 357 252 357 258 358 c
+ 263 359 265 359 266 357 c
+ 266 355 269 354 274 354 c
+ 277 354 282 354 283 352 c
+ 284 351 287 350 290 350 c
+ 292 350 295 348 295 347 c
+ 296 345 297 344 299 344 c
+ 300 344 304 341 307 339 c
+ 310 336 314 334 316 334 c
+ 317 334 320 330 323 326 c
+ 325 321 329 317 331 317 c
+ 333 316 335 313 335 310 c
+ 336 307 338 304 340 302 c
+ 343 301 345 299 345 297 c
+ 345 292 351 279 355 277 c
+ 357 275 357 269 353 251 c
+ 351 242 351 241 354 237 c
+ 358 233 358 232 354 229 c
+ 348 225 345 218 345 213 c
+ 345 210 343 208 341 207 c
+ 339 207 337 205 337 204 c
+ 337 199 320 185 307 178 c
+ 300 175 294 170 293 169 c
+ 293 168 291 166 289 166 c
+ 288 166 284 164 282 162 c
+ 278 158 276 157 267 158 c
+ 257 159 256 158 256 154 c
+ 256 151 254 148 251 147 c
+ 244 144 244 144 240 148 c
+ h f
+ 542 301 m
+ 533 304 522 314 516 325 c
+ 511 335 509 339 509 349 c
+ 509 356 511 363 512 365 c
+ 513 366 514 369 513 371 c
+ 512 376 529 393 540 398 c
+ 544 400 555 402 563 403 c
+ 579 405 579 405 589 394 c
+ 591 393 594 390 596 388 c
+ 599 385 601 381 601 379 c
+ 601 376 603 371 606 367 c
+ 611 360 611 358 609 352 c
+ 607 348 606 341 607 336 c
+ 607 330 606 327 603 326 c
+ 601 325 599 322 598 320 c
+ 597 317 595 316 594 316 c
+ 593 316 589 313 585 309 c
+ 580 304 577 302 573 303 c
+ 570 303 566 303 566 302 c
+ 564 299 550 299 542 301 c
+ h f
+ 590 363 m
+ 585 366 583 367 583 364 c
+ 583 363 585 362 587 361 c
+ 590 361 592 360 593 360 c
+ 593 360 592 361 590 363 c
+ h f
+ 0.97 0.80 0.68 rg
+ 216 163 m
+ 215 165 212 166 211 166 c
+ 209 165 208 165 208 166 c
+ 208 168 214 169 221 169 c
+ 226 168 230 165 229 161 c
+ 227 157 218 158 216 163 c
+ h f
+ 191 164 m
+ 191 165 193 166 194 166 c
+ 195 166 196 165 196 164 c
+ 196 163 194 162 193 162 c
+ 191 162 190 163 191 164 c
+ h f
+ 260 166 m
+ 260 168 267 172 271 172 c
+ 273 172 274 171 274 170 c
+ 273 169 271 167 269 167 c
+ 267 167 264 167 263 166 c
+ 261 165 260 165 260 166 c
+ h f
+ 198 179 m
+ 200 183 204 183 204 180 c
+ 204 178 202 176 201 176 c
+ 199 176 198 178 198 179 c
+ h f
+ 181 180 m
+ 177 183 180 190 186 193 c
+ 192 195 193 197 190 200 c
+ 188 201 186 200 185 198 c
+ 183 193 176 194 175 199 c
+ 174 201 172 203 169 203 c
+ 166 203 163 204 163 205 c
+ 162 206 159 206 156 206 c
+ 151 205 150 206 145 213 c
+ 142 218 139 226 138 230 c
+ 137 236 136 239 131 241 c
+ 124 245 124 251 129 256 c
+ 134 261 138 272 137 278 c
+ 137 280 138 284 140 287 c
+ 142 290 143 293 141 299 c
+ 139 309 139 309 144 309 c
+ 147 309 152 314 159 321 c
+ 171 332 177 334 184 328 c
+ 187 326 188 326 195 333 c
+ 203 341 207 342 210 335 c
+ 212 329 214 329 220 333 c
+ 223 335 225 336 230 334 c
+ 239 331 245 331 248 335 c
+ 250 336 253 338 256 338 c
+ 260 338 264 339 267 340 c
+ 273 343 274 342 276 333 c
+ 278 326 282 323 282 329 c
+ 282 335 292 339 296 336 c
+ 298 335 302 333 305 331 c
+ 308 330 311 328 311 326 c
+ 312 325 314 324 315 324 c
+ 318 324 333 311 333 308 c
+ 333 307 335 303 338 301 c
+ 341 299 343 296 343 295 c
+ 343 294 345 289 348 283 c
+ 353 271 354 263 351 250 c
+ 349 244 349 240 351 237 c
+ 353 233 352 232 348 227 c
+ 345 223 343 219 343 216 c
+ 343 214 341 210 338 208 c
+ 336 205 333 203 333 202 c
+ 332 200 329 197 326 194 c
+ 320 189 317 188 301 187 c
+ 289 187 282 187 282 188 c
+ 280 191 268 189 258 184 c
+ 248 179 245 179 241 187 c
+ 237 198 225 203 224 194 c
+ 223 190 211 185 201 184 c
+ 198 184 193 183 190 182 c
+ 184 178 183 178 181 180 c
+ h f
+ 226 182 m
+ 226 184 227 185 227 183 c
+ 228 181 228 180 227 179 c
+ 227 178 226 180 226 182 c
+ h f
+ 542 303 m
+ 534 306 525 314 519 323 c
+ 513 333 512 336 511 347 c
+ 511 358 512 360 519 370 c
+ 523 377 528 383 529 384 c
+ 531 385 532 388 532 389 c
+ 532 391 536 394 541 396 c
+ 549 400 551 400 554 398 c
+ 558 396 560 396 568 398 c
+ 576 401 577 401 578 399 c
+ 579 397 581 396 583 396 c
+ 588 396 591 390 591 379 c
+ 592 372 591 371 586 369 c
+ 574 365 575 361 588 356 c
+ 595 353 596 354 599 358 c
+ 603 363 610 362 608 356 c
+ 607 354 606 348 606 341 c
+ 605 330 605 330 592 317 c
+ 580 305 577 304 568 303 c
+ 556 301 547 301 542 303 c
+ h f
+ 576 378 m
+ 575 379 573 380 571 380 c
+ 570 380 569 379 570 378 c
+ 570 377 572 376 574 376 c
+ 576 376 576 377 576 378 c
+ h f
+ 551 390 m
+ 552 391 551 392 550 392 c
+ 548 392 546 391 546 390 c
+ 546 389 547 388 548 388 c
+ 549 388 551 389 551 390 c
+ h f
+ Q
+}}
+
+\def\coffeeD{\pdfliteral{%
+ q \coffeescale\space 0 0 \coffeescale\space 0 0 cm
+ .5 0 0 .5 0 -530 cm
+ 0.98 0.90 0.81 rg
+ 495 591 m
+ 492 593 492 593 496 596 c
+ 498 597 499 599 498 600 c
+ 497 601 485 599 479 596 c
+ 473 593 471 594 470 601 c
+ 470 606 468 608 462 611 c
+ 458 614 453 619 451 622 c
+ 449 625 445 629 442 630 c
+ 439 632 436 635 436 637 c
+ 435 639 432 641 429 643 c
+ 425 645 422 646 417 644 c
+ 413 643 410 641 410 640 c
+ 410 637 386 610 382 609 c
+ 373 606 358 614 353 622 c
+ 351 626 348 628 343 630 c
+ 339 631 335 632 334 633 c
+ 331 636 318 635 313 632 c
+ 309 630 308 629 310 624 c
+ 311 621 311 620 308 620 c
+ 306 620 302 619 299 618 c
+ 297 616 292 615 288 615 c
+ 283 615 l
+ 283 628 l
+ 283 638 282 642 279 647 c
+ 276 652 275 652 258 654 c
+ 231 656 228 656 223 651 c
+ 212 643 198 649 198 662 c
+ 198 667 201 678 204 683 c
+ 205 685 205 690 205 694 c
+ 205 702 205 703 200 704 c
+ 197 705 195 707 195 709 c
+ 195 714 185 720 175 722 c
+ 161 723 157 726 157 735 c
+ 157 741 158 743 162 745 c
+ 164 747 166 750 166 752 c
+ 166 756 159 764 154 764 c
+ 151 764 146 771 146 776 c
+ 146 778 149 783 154 787 c
+ 160 792 161 794 161 800 c
+ 161 814 159 820 153 824 c
+ 148 828 147 832 153 833 c
+ 155 834 157 835 158 836 c
+ 159 839 157 882 155 885 c
+ 155 887 154 890 154 893 c
+ 154 895 154 902 154 909 c
+ 154 916 154 921 156 922 c
+ 157 922 164 923 172 923 c
+ 185 922 186 922 192 928 c
+ 198 934 198 935 191 951 c
+ 189 956 189 957 192 961 c
+ 195 966 197 966 203 965 c
+ 225 962 225 962 233 966 c
+ 243 971 247 975 248 981 c
+ 249 989 249 999 246 1003 c
+ 244 1009 246 1013 253 1014 c
+ 258 1015 268 1007 270 1000 c
+ 271 993 275 992 285 995 c
+ 292 998 296 1002 297 1013 c
+ 300 1028 307 1029 316 1016 c
+ 320 1011 324 1007 326 1006 c
+ 331 1003 338 1005 345 1012 c
+ 351 1018 356 1020 357 1016 c
+ 358 1014 360 1012 363 1012 c
+ 366 1011 369 1009 369 1007 c
+ 370 1005 373 1003 377 1001 c
+ 381 999 387 997 390 995 c
+ 396 992 417 991 420 993 c
+ 420 994 421 999 421 1004 c
+ 421 1012 422 1014 425 1014 c
+ 433 1015 437 1012 437 1004 c
+ 437 1000 436 996 435 996 c
+ 432 994 433 984 437 981 c
+ 441 976 442 976 451 979 c
+ 456 980 458 982 459 985 c
+ 459 988 461 989 466 989 c
+ 475 990 477 987 474 972 c
+ 472 959 l
+ 482 950 l
+ 490 942 492 941 496 942 c
+ 498 943 505 944 511 944 c
+ 521 945 523 945 525 941 c
+ 529 935 529 933 521 924 c
+ 514 917 514 916 515 908 c
+ 516 903 518 897 522 892 c
+ 529 883 530 883 544 888 c
+ 550 890 553 891 559 889 c
+ 565 887 566 887 566 880 c
+ 566 872 559 866 551 866 c
+ 544 866 537 861 537 857 c
+ 537 855 536 853 535 852 c
+ 534 851 534 849 535 846 c
+ 536 844 537 841 536 838 c
+ 535 836 536 832 537 831 c
+ 538 830 539 826 539 823 c
+ 538 818 539 817 541 816 c
+ 551 814 552 808 544 800 c
+ 541 797 539 794 539 790 c
+ 539 786 540 785 547 782 c
+ 563 775 561 762 544 764 c
+ 533 766 522 760 522 752 c
+ 522 748 523 746 529 743 c
+ 535 741 537 738 540 732 c
+ 546 721 545 717 539 715 c
+ 537 714 533 714 531 714 c
+ 530 715 527 714 526 714 c
+ 525 713 528 710 535 705 c
+ 550 694 551 693 551 686 c
+ 551 683 554 677 557 672 c
+ 567 657 567 653 558 640 c
+ 556 638 555 633 555 629 c
+ 555 624 554 622 552 621 c
+ 550 621 547 618 546 615 c
+ 544 612 540 610 535 608 c
+ 530 607 524 604 521 601 c
+ 516 596 515 596 513 597 c
+ 509 600 505 598 505 594 c
+ 505 590 499 588 495 591 c
+ h f
+ 383 665 m
+ 383 666 382 667 381 667 c
+ 380 667 380 666 380 665 c
+ 381 664 382 663 382 663 c
+ 383 663 383 664 383 665 c
+ h f
+ 409 673 m
+ 417 678 416 680 406 680 c
+ 397 681 392 676 396 671 c
+ 399 668 402 668 409 673 c
+ h f
+ 387 680 m
+ 387 681 385 683 383 684 c
+ 381 685 379 686 379 687 c
+ 379 691 355 693 348 689 c
+ 346 688 343 688 340 690 c
+ 336 692 334 693 331 691 c
+ 328 689 327 684 330 684 c
+ 332 685 338 684 346 683 c
+ 356 682 360 682 363 684 c
+ 369 688 372 687 378 681 c
+ 384 674 387 674 387 680 c
+ h f
+ 437 679 m
+ 437 684 432 684 432 678 c
+ 431 675 432 674 434 674 c
+ 436 674 437 676 437 679 c
+ h f
+ 295 697 m
+ 295 701 295 701 293 700 c
+ 292 699 292 696 292 695 c
+ 294 691 295 692 295 697 c
+ h f
+ 430 941 m
+ 430 944 426 945 424 942 c
+ 422 940 423 939 426 939 c
+ 428 939 430 940 430 941 c
+ h f
+ 393 945 m
+ 393 949 386 948 385 944 c
+ 385 942 385 941 389 941 c
+ 391 942 393 943 393 945 c
+ h f
+ 359 944 m
+ 362 945 362 951 360 953 c
+ 359 953 355 954 351 955 c
+ 344 956 344 956 344 952 c
+ 344 950 345 947 348 946 c
+ 354 943 355 943 359 944 c
+ h f
+ 374 598 m
+ 375 599 376 600 378 600 c
+ 379 600 380 599 381 598 c
+ 381 596 380 595 378 595 c
+ 375 595 374 596 374 598 c
+ h f
+ 36.00 1005 m
+ 36.09 1007 36.51 1007 37.08 1006 c
+ 37.60 1005 37.54 1003 36.94 1003 c
+ 36.35 1002 35.92 1003 36.00 1005 c
+ h f
+ 0.92 0.83 0.80 rg
+ 482 602 m
+ 480 602 478 604 477 605 c
+ 476 606 471 609 467 611 c
+ 462 614 457 617 456 619 c
+ 454 621 448 628 442 634 c
+ 436 641 431 646 431 647 c
+ 431 652 408 647 407 642 c
+ 406 640 402 635 398 631 c
+ 394 626 390 621 390 620 c
+ 390 616 383 611 378 611 c
+ 370 611 358 619 355 625 c
+ 353 630 351 631 342 634 c
+ 325 638 304 637 304 630 c
+ 304 626 297 619 292 619 c
+ 287 619 286 621 285 633 c
+ 285 642 284 645 280 649 c
+ 277 652 273 654 271 654 c
+ 269 654 260 656 251 658 c
+ 236 661 233 661 228 659 c
+ 225 658 222 656 221 655 c
+ 219 651 209 650 205 654 c
+ 201 658 201 664 206 677 c
+ 212 693 210 700 197 713 c
+ 187 723 181 726 170 726 c
+ 166 726 164 727 162 730 c
+ 158 735 159 739 166 746 c
+ 175 754 173 759 162 764 c
+ 153 769 149 775 152 780 c
+ 153 782 156 786 158 787 c
+ 161 790 162 793 163 799 c
+ 165 814 163 820 156 825 c
+ 149 830 149 831 154 832 c
+ 158 833 158 834 159 847 c
+ 160 855 160 868 159 877 c
+ 158 885 157 897 156 903 c
+ 155 918 157 920 174 920 c
+ 186 920 188 921 192 925 c
+ 200 932 201 935 197 945 c
+ 192 959 197 967 208 962 c
+ 211 960 216 959 221 960 c
+ 230 961 250 971 252 977 c
+ 254 982 255 1001 252 1003 c
+ 251 1004 250 1006 250 1008 c
+ 250 1015 262 1009 266 998 c
+ 270 989 275 988 288 994 c
+ 298 999 298 999 299 1007 c
+ 301 1019 304 1021 311 1016 c
+ 318 1011 319 1008 314 1005 c
+ 309 1001 312 998 319 1000 c
+ 322 1001 327 1001 330 1001 c
+ 335 1000 337 1001 343 1006 c
+ 350 1013 350 1013 358 1011 c
+ 362 1009 366 1007 367 1005 c
+ 368 1003 374 999 381 996 c
+ 394 989 406 988 418 990 c
+ 423 991 424 991 424 989 c
+ 424 987 425 986 427 987 c
+ 428 988 430 986 430 984 c
+ 433 978 437 975 446 975 c
+ 453 975 456 976 460 981 c
+ 466 986 471 988 471 983 c
+ 471 982 470 981 469 981 c
+ 468 982 467 982 467 981 c
+ 467 980 468 979 469 979 c
+ 471 979 471 976 470 969 c
+ 469 958 l
+ 480 948 l
+ 490 937 l
+ 504 940 l
+ 517 942 518 942 521 939 c
+ 526 936 525 931 517 926 c
+ 508 920 507 916 512 903 c
+ 517 891 528 879 533 881 c
+ 535 881 539 883 543 884 c
+ 552 888 558 887 559 882 c
+ 561 876 558 873 549 870 c
+ 544 869 538 866 537 865 c
+ 532 860 531 850 534 839 c
+ 535 834 536 826 536 823 c
+ 537 819 539 816 541 815 c
+ 547 812 547 807 541 800 c
+ 532 792 534 786 545 780 c
+ 557 774 558 766 546 768 c
+ 537 769 522 762 519 755 c
+ 517 750 520 738 523 740 c
+ 529 743 541 730 540 722 c
+ 540 718 539 718 528 719 c
+ 514 719 512 717 520 712 c
+ 532 704 546 693 548 690 c
+ 549 688 550 685 550 683 c
+ 550 681 552 675 555 669 c
+ 561 657 562 654 556 644 c
+ 553 639 549 632 547 627 c
+ 542 617 540 614 533 612 c
+ 531 612 526 609 522 607 c
+ 516 603 514 602 506 603 c
+ 501 604 494 604 491 603 c
+ 488 602 484 602 482 602 c
+ h f
+ 367 660 m
+ 367 661 366 662 364 662 c
+ 363 662 361 661 361 660 c
+ 361 659 363 658 364 658 c
+ 366 658 367 659 367 660 c
+ h f
+ 385 665 m
+ 385 669 381 670 379 668 c
+ 377 666 381 662 383 662 c
+ 384 662 385 663 385 665 c
+ h f
+ 409 672 m
+ 418 677 418 677 414 682 c
+ 412 685 411 685 410 684 c
+ 408 682 405 681 403 681 c
+ 400 681 396 680 394 678 c
+ 391 674 391 674 395 670 c
+ 400 666 400 666 409 672 c
+ h f
+ 460 675 m
+ 458 677 454 674 456 672 c
+ 456 671 457 671 459 672 c
+ 460 673 460 675 460 675 c
+ h f
+ 438 680 m
+ 437 683 431 684 430 681 c
+ 430 679 430 676 431 675 c
+ 434 672 434 672 436 675 c
+ 437 677 438 679 438 680 c
+ h f
+ 387 680 m
+ 387 686 371 695 365 692 c
+ 362 691 358 691 355 692 c
+ 351 692 349 691 347 690 c
+ 345 687 344 687 340 690 c
+ 335 695 332 695 328 690 c
+ 324 686 326 682 332 684 c
+ 335 685 338 684 339 683 c
+ 342 681 358 680 363 682 c
+ 368 685 375 683 380 678 c
+ 384 674 387 675 387 680 c
+ h f
+ 297 698 m
+ 297 701 296 703 294 703 c
+ 291 703 291 697 293 691 c
+ 294 687 297 691 297 698 c
+ h f
+ 498 927 m
+ 498 927 496 929 495 930 c
+ 492 933 492 932 493 928 c
+ 494 925 498 924 498 927 c
+ h f
+ 430 942 m
+ 430 945 429 946 425 946 c
+ 418 947 417 944 421 940 c
+ 424 936 430 938 430 942 c
+ h f
+ 394 944 m
+ 394 946 392 948 390 950 c
+ 387 952 386 951 384 947 c
+ 383 944 383 942 385 941 c
+ 388 939 394 941 394 944 c
+ h f
+ 374 951 m
+ 372 953 369 951 368 945 c
+ 366 940 l
+ 371 945 l
+ 374 948 375 950 374 951 c
+ h f
+ 359 944 m
+ 360 945 365 954 365 956 c
+ 365 956 360 956 353 957 c
+ 342 957 342 957 342 952 c
+ 343 946 354 941 359 944 c
+ h f
+ 313 956 m
+ 313 959 308 961 307 959 c
+ 306 958 307 956 308 955 c
+ 311 953 313 953 313 956 c
+ h f
+ 361 998 m
+ 362 1001 352 1004 350 1002 c
+ 349 1001 349 1000 350 999 c
+ 351 996 359 996 361 998 c
+ h f
+ 425 992 m
+ 423 993 422 995 422 997 c
+ 422 1002 428 1001 429 996 c
+ 430 992 427 989 425 992 c
+ h f
+ 425 1007 m
+ 424 1008 424 1010 425 1011 c
+ 426 1013 431 1011 431 1008 c
+ 431 1005 427 1005 425 1007 c
+ h f
+ 0.96 0.80 0.66 rg
+ 479 605 m
+ 478 605 474 608 470 610 c
+ 462 614 443 633 435 643 c
+ 432 648 430 649 425 649 c
+ 417 649 407 645 405 640 c
+ 404 638 400 633 397 630 c
+ 393 626 390 621 389 619 c
+ 386 607 365 610 356 624 c
+ 351 633 335 639 322 637 c
+ 317 637 309 636 305 636 c
+ 300 636 298 635 298 633 c
+ 299 632 300 631 301 631 c
+ 304 631 301 623 297 621 c
+ 289 616 286 619 286 632 c
+ 286 642 286 644 281 649 c
+ 277 654 274 655 264 656 c
+ 257 657 248 659 245 660 c
+ 235 663 232 662 225 657 c
+ 215 651 210 650 205 654 c
+ 204 655 202 658 202 660 c
+ 202 665 206 678 208 680 c
+ 208 681 209 686 209 691 c
+ 209 700 209 701 199 712 c
+ 188 723 181 726 170 726 c
+ 159 726 157 736 166 745 c
+ 174 754 173 759 162 764 c
+ 156 767 150 773 150 777 c
+ 150 777 153 782 157 786 c
+ 165 795 165 798 163 815 c
+ 163 819 161 823 160 823 c
+ 159 823 157 824 155 826 c
+ 153 828 153 829 157 832 c
+ 161 834 161 836 161 852 c
+ 161 862 160 878 158 888 c
+ 156 901 156 908 157 913 c
+ 158 919 l
+ 171 919 l
+ 184 919 190 921 196 928 c
+ 201 934 201 936 197 946 c
+ 196 950 195 955 196 958 c
+ 197 963 197 963 203 962 c
+ 216 959 230 960 234 963 c
+ 235 965 240 967 244 969 c
+ 248 970 251 973 252 976 c
+ 255 982 254 1000 252 1003 c
+ 250 1005 250 1011 253 1011 c
+ 257 1011 264 1004 266 998 c
+ 268 989 276 987 290 994 c
+ 297 998 299 998 305 997 c
+ 313 995 324 996 324 999 c
+ 324 1000 327 1000 330 1000 c
+ 335 1000 338 1002 344 1007 c
+ 350 1013 351 1013 354 1011 c
+ 356 1010 359 1009 361 1009 c
+ 364 1009 366 1008 367 1005 c
+ 368 1002 372 999 378 997 c
+ 383 995 389 992 391 991 c
+ 393 990 400 989 406 989 c
+ 413 989 420 987 421 986 c
+ 423 985 425 984 427 985 c
+ 428 985 430 985 430 984 c
+ 430 979 437 975 446 975 c
+ 451 975 455 974 455 973 c
+ 455 972 456 973 459 976 c
+ 462 979 464 980 467 979 c
+ 471 978 471 978 470 968 c
+ 469 958 l
+ 480 948 l
+ 490 937 l
+ 504 940 l
+ 517 942 518 942 521 939 c
+ 526 936 525 931 517 926 c
+ 509 920 508 916 511 905 c
+ 514 895 524 883 530 881 c
+ 532 880 536 881 539 883 c
+ 546 887 556 887 559 884 c
+ 563 877 558 872 548 870 c
+ 544 870 539 867 537 865 c
+ 533 860 530 850 531 846 c
+ 534 842 536 829 535 821 c
+ 535 815 536 814 538 814 c
+ 542 814 546 811 546 808 c
+ 546 807 544 804 540 801 c
+ 533 792 534 786 543 780 c
+ 558 772 559 768 544 768 c
+ 533 768 522 762 519 755 c
+ 517 750 520 738 523 740 c
+ 529 743 541 730 540 722 c
+ 540 718 539 718 528 719 c
+ 514 719 512 717 520 712 c
+ 532 704 546 693 548 690 c
+ 549 688 550 685 550 683 c
+ 550 681 552 675 555 669 c
+ 561 657 562 654 556 644 c
+ 553 639 549 632 547 627 c
+ 542 617 540 614 533 612 c
+ 531 612 526 609 523 607 c
+ 517 603 514 603 498 603 c
+ 488 603 479 604 479 605 c
+ h f
+ 370 627 m
+ 370 628 370 629 369 628 c
+ 368 628 367 627 367 626 c
+ 367 625 368 624 369 624 c
+ 370 624 370 625 370 627 c
+ h f
+ 375 633 m
+ 376 635 365 641 362 639 c
+ 358 638 359 635 364 636 c
+ 367 637 369 636 370 634 c
+ 371 631 373 630 375 633 c
+ h f
+ 378 654 m
+ 379 655 379 656 378 656 c
+ 377 656 376 655 376 654 c
+ 376 653 376 653 377 653 c
+ 377 653 378 653 378 654 c
+ h f
+ 369 658 m
+ 371 662 372 662 376 660 c
+ 378 659 381 658 384 658 c
+ 388 658 388 659 388 663 c
+ 388 669 390 670 397 666 c
+ 401 664 402 664 409 668 c
+ 415 672 418 672 424 671 c
+ 429 671 434 669 437 668 c
+ 441 666 443 666 447 667 c
+ 449 668 454 669 457 669 c
+ 463 669 464 669 464 675 c
+ 464 683 461 684 457 679 c
+ 452 674 444 675 442 681 c
+ 440 685 440 685 429 684 c
+ 420 684 417 684 414 686 c
+ 412 689 411 689 408 687 c
+ 403 684 402 684 404 688 c
+ 404 691 404 692 400 694 c
+ 393 696 391 696 393 694 c
+ 396 691 396 684 394 682 c
+ 393 682 391 682 391 684 c
+ 390 685 388 687 386 688 c
+ 384 688 379 691 375 693 c
+ 370 697 368 697 366 696 c
+ 365 695 357 694 347 694 c
+ 338 694 328 694 326 693 c
+ 323 692 322 693 322 694 c
+ 322 696 321 697 320 698 c
+ 317 699 313 696 313 693 c
+ 313 691 312 690 310 689 c
+ 306 687 307 685 314 684 c
+ 323 682 333 676 333 672 c
+ 333 671 335 668 338 667 c
+ 341 666 345 663 347 660 c
+ 349 657 351 656 354 657 c
+ 357 657 360 657 362 656 c
+ 365 654 366 654 369 658 c
+ h f
+ 355 665 m
+ 352 665 351 667 350 669 c
+ 350 672 348 673 345 674 c
+ 339 675 336 678 342 678 c
+ 349 678 351 678 354 675 c
+ 356 673 359 671 361 670 c
+ 364 668 363 663 360 664 c
+ 359 664 357 664 355 665 c
+ h f
+ 362 678 m
+ 363 679 365 680 366 680 c
+ 367 680 369 679 369 678 c
+ 369 677 367 676 365 676 c
+ 363 676 362 677 362 678 c
+ h f
+ 308 659 m
+ 308 659 307 660 306 661 c
+ 305 661 304 661 304 660 c
+ 304 659 305 658 306 658 c
+ 307 658 308 658 308 659 c
+ h f
+ 323 663 m
+ 319 668 317 668 317 664 c
+ 317 662 319 660 324 660 c
+ 326 660 325 661 323 663 c
+ h f
+ 298 688 m
+ 303 701 300 708 291 703 c
+ 289 702 286 701 284 702 c
+ 279 702 278 696 282 694 c
+ 285 694 286 692 286 689 c
+ 286 683 289 679 293 680 c
+ 294 680 297 684 298 688 c
+ h f
+ 498 929 m
+ 494 933 490 933 492 929 c
+ 493 925 496 923 498 925 c
+ 499 926 499 928 498 929 c
+ h f
+ 424 930 m
+ 425 935 431 935 432 930 c
+ 433 926 433 926 436 929 c
+ 439 932 439 932 436 935 c
+ 431 938 433 943 439 943 c
+ 446 943 446 946 441 950 c
+ 435 955 431 955 432 950 c
+ 433 946 433 946 431 948 c
+ 428 951 420 951 416 947 c
+ 413 943 413 943 416 939 c
+ 418 936 419 933 418 932 c
+ 417 931 417 930 418 929 c
+ 420 926 423 927 424 930 c
+ h f
+ 406 934 m
+ 411 940 407 941 401 936 c
+ 397 932 397 932 400 932 c
+ 402 932 405 933 406 934 c
+ h f
+ 372 941 m
+ 375 946 379 946 381 941 c
+ 383 937 391 936 394 940 c
+ 398 944 398 945 392 951 c
+ 387 956 386 957 381 956 c
+ 378 955 375 956 374 957 c
+ 370 960 361 961 359 959 c
+ 357 957 355 957 350 959 c
+ 345 961 343 961 339 958 c
+ 337 956 333 956 330 956 c
+ 327 957 326 957 324 952 c
+ 320 945 317 945 317 952 c
+ 317 955 315 958 313 960 c
+ 307 964 302 963 302 958 c
+ 302 955 304 953 309 952 c
+ 314 950 315 949 314 945 c
+ 313 939 317 936 321 939 c
+ 323 941 330 941 344 941 c
+ 352 942 360 939 362 936 c
+ 364 933 369 936 372 941 c
+ h f
+ 329 947 m
+ 329 949 331 951 333 952 c
+ 336 953 337 953 337 951 c
+ 338 950 338 948 337 947 c
+ 336 944 329 944 329 947 c
+ h f
+ 256 943 m
+ 256 945 255 946 252 946 c
+ 248 946 248 945 251 941 c
+ 254 938 256 939 256 943 c
+ h f
+ 295 953 m
+ 295 954 294 955 292 955 c
+ 288 955 287 953 290 951 c
+ 294 950 295 950 295 953 c
+ h f
+ 308 976 m
+ 308 980 306 979 301 974 c
+ 298 972 297 969 298 967 c
+ 299 964 300 964 304 969 c
+ 306 971 308 975 308 976 c
+ h f
+ 318 973 m
+ 318 974 317 975 316 975 c
+ 314 975 313 974 313 973 c
+ 313 972 314 972 315 972 c
+ 316 972 317 972 318 973 c
+ h f
+ 381 974 m
+ 379 976 377 977 375 976 c
+ 371 974 373 972 379 972 c
+ 383 972 383 972 381 974 c
+ h f
+ 397 974 m
+ 397 976 396 977 395 976 c
+ 394 975 394 974 394 973 c
+ 394 972 394 972 395 972 c
+ 396 972 397 973 397 974 c
+ h f
+ 408 982 m
+ 408 985 405 986 403 983 c
+ 401 981 401 981 404 981 c
+ 406 981 408 981 408 982 c
+ h f
+ 352 991 m
+ 354 993 356 995 357 995 c
+ 358 995 360 996 361 997 c
+ 364 1000 360 1004 353 1004 c
+ 347 1004 347 1003 348 999 c
+ 348 995 346 992 342 995 c
+ 338 998 335 997 336 994 c
+ 337 991 342 988 347 988 c
+ 348 988 350 989 352 991 c
+ h f
+ 467 982 m
+ 462 983 463 986 467 986 c
+ 469 986 471 985 471 983 c
+ 471 982 471 981 470 981 c
+ 470 981 468 981 467 982 c
+ h f
+ 425 995 m
+ 424 996 424 997 425 998 c
+ 426 999 430 997 430 995 c
+ 430 992 426 993 425 995 c
+ h f
+ 300 1009 m
+ 301 1019 304 1021 311 1016 c
+ 318 1011 319 1005 312 1006 c
+ 309 1007 308 1007 308 1005 c
+ 308 1003 306 1002 303 1002 c
+ 299 1002 298 1002 300 1009 c
+ h f
+ 424 1009 m
+ 424 1010 426 1011 428 1011 c
+ 430 1011 431 1010 431 1009 c
+ 431 1008 430 1007 428 1007 c
+ 426 1007 424 1008 424 1009 c
+ h f
+ 0.88 0.67 0.59 rg
+ 476 609 m
+ 465 615 436 642 434 649 c
+ 433 653 432 653 424 652 c
+ 412 650 403 646 403 643 c
+ 403 642 399 637 394 633 c
+ 387 628 385 624 386 622 c
+ 386 620 385 618 384 617 c
+ 382 615 380 615 373 617 c
+ 362 620 358 624 358 629 c
+ 358 632 359 634 363 635 c
+ 369 637 372 635 368 631 c
+ 364 627 364 622 369 622 c
+ 371 622 372 623 372 625 c
+ 372 627 373 630 374 631 c
+ 376 633 376 634 373 636 c
+ 367 640 362 641 358 638 c
+ 354 634 346 634 339 638 c
+ 335 640 330 640 317 639 c
+ 307 639 300 639 300 640 c
+ 299 641 295 644 290 646 c
+ 285 649 280 652 279 653 c
+ 278 655 273 656 268 657 c
+ 263 658 257 660 254 661 c
+ 252 662 245 664 239 665 c
+ 228 666 227 666 223 662 c
+ 219 658 211 655 209 658 c
+ 206 661 207 672 210 678 c
+ 212 682 213 686 212 694 c
+ 211 704 210 705 201 714 c
+ 189 726 184 730 178 730 c
+ 174 730 170 731 168 733 c
+ 164 736 l
+ 169 744 l
+ 173 748 175 754 175 756 c
+ 175 759 167 769 164 769 c
+ 162 769 157 775 157 778 c
+ 157 780 159 785 162 788 c
+ 166 793 167 794 166 807 c
+ 165 820 164 822 160 825 c
+ 157 827 157 828 159 830 c
+ 160 832 161 837 161 842 c
+ 161 847 162 853 162 855 c
+ 164 858 161 887 158 902 c
+ 156 910 164 916 175 916 c
+ 186 916 195 921 201 930 c
+ 205 936 207 937 213 938 c
+ 217 939 220 941 221 943 c
+ 222 947 221 950 217 950 c
+ 216 950 215 951 215 952 c
+ 215 954 221 954 222 951 c
+ 223 950 224 950 227 953 c
+ 232 960 240 964 247 964 c
+ 258 964 261 966 261 973 c
+ 261 976 262 981 264 983 c
+ 266 987 267 988 273 987 c
+ 279 986 281 986 287 990 c
+ 294 995 295 995 313 994 c
+ 327 993 332 993 335 990 c
+ 339 986 350 986 354 990 c
+ 357 993 359 993 368 992 c
+ 383 990 385 990 383 987 c
+ 380 984 382 981 387 981 c
+ 390 981 390 981 390 984 c
+ 389 987 389 988 391 987 c
+ 393 986 394 986 395 986 c
+ 395 986 394 983 392 979 c
+ 388 968 391 966 399 973 c
+ 404 977 406 979 409 978 c
+ 412 977 413 978 414 982 c
+ 414 984 415 987 416 987 c
+ 417 987 422 984 428 979 c
+ 436 971 438 970 442 970 c
+ 445 971 449 971 451 970 c
+ 454 968 455 969 458 972 c
+ 459 974 462 975 464 975 c
+ 467 975 467 974 467 966 c
+ 467 959 468 956 473 950 c
+ 477 947 481 940 484 935 c
+ 489 925 493 922 500 921 c
+ 504 921 505 921 505 916 c
+ 505 913 506 909 507 906 c
+ 509 903 511 898 513 894 c
+ 515 889 520 884 534 876 c
+ 538 874 537 873 534 868 c
+ 529 861 528 850 532 836 c
+ 533 831 534 825 534 822 c
+ 535 819 535 816 535 815 c
+ 535 815 537 814 539 813 c
+ 544 811 543 807 538 801 c
+ 535 798 533 794 533 791 c
+ 533 784 534 782 543 778 c
+ 546 776 550 774 550 773 c
+ 550 772 546 771 541 771 c
+ 523 769 513 757 517 743 c
+ 518 739 519 738 524 738 c
+ 531 738 533 736 535 729 c
+ 538 720 536 719 525 721 c
+ 519 723 517 723 515 721 c
+ 511 717 511 712 516 710 c
+ 523 708 542 694 545 690 c
+ 547 688 548 684 548 682 c
+ 548 680 550 674 552 669 c
+ 555 663 557 657 557 655 c
+ 557 650 551 637 548 636 c
+ 547 635 544 631 542 627 c
+ 540 620 537 618 528 613 c
+ 518 608 514 607 504 607 c
+ 497 607 490 606 489 606 c
+ 487 605 481 607 476 609 c
+ h f
+ 379 654 m
+ 379 655 381 656 383 657 c
+ 386 657 388 658 388 663 c
+ 389 669 390 670 397 666 c
+ 401 664 402 664 409 668 c
+ 415 672 418 672 424 671 c
+ 429 671 434 669 437 668 c
+ 441 666 443 666 447 667 c
+ 449 668 454 669 457 669 c
+ 463 669 464 669 464 675 c
+ 464 683 462 684 457 679 c
+ 450 674 444 675 442 681 c
+ 440 685 440 685 429 684 c
+ 420 684 417 684 414 686 c
+ 412 689 411 689 408 687 c
+ 403 684 402 684 404 688 c
+ 404 691 403 692 398 695 c
+ 391 698 388 697 393 692 c
+ 396 689 396 684 394 682 c
+ 393 682 391 682 391 684 c
+ 388 688 368 698 366 695 c
+ 364 694 357 694 345 695 c
+ 335 695 327 695 326 694 c
+ 325 691 323 692 322 696 c
+ 320 702 314 698 308 686 c
+ 308 686 310 685 314 684 c
+ 322 682 333 676 333 672 c
+ 333 671 336 668 339 666 c
+ 343 665 346 661 347 659 c
+ 350 654 350 654 354 656 c
+ 356 657 358 657 361 656 c
+ 365 655 366 655 369 658 c
+ 372 663 378 662 377 656 c
+ 376 654 376 653 377 653 c
+ 378 653 379 653 379 654 c
+ h f
+ 350 669 m
+ 350 672 348 673 345 674 c
+ 339 675 336 678 342 678 c
+ 348 678 352 678 352 676 c
+ 353 675 355 673 358 671 c
+ 365 668 365 665 357 665 c
+ 352 665 351 666 350 669 c
+ h f
+ 309 659 m
+ 307 660 305 661 304 661 c
+ 303 659 308 656 310 656 c
+ 311 656 311 658 309 659 c
+ h f
+ 323 663 m
+ 320 667 313 669 313 667 c
+ 313 664 319 660 322 660 c
+ 326 660 326 660 323 663 c
+ h f
+ 298 688 m
+ 301 696 301 701 299 705 c
+ 297 707 296 707 292 705 c
+ 289 703 285 702 284 702 c
+ 281 702 280 701 280 697 c
+ 280 694 281 693 283 693 c
+ 286 694 286 693 286 688 c
+ 286 677 294 677 298 688 c
+ h f
+ 243 708 m
+ 243 709 242 710 241 710 c
+ 240 710 240 709 240 707 c
+ 240 706 240 705 241 706 c
+ 242 706 243 707 243 708 c
+ h f
+ 424 930 m
+ 425 935 431 935 432 930 c
+ 433 926 433 926 436 929 c
+ 439 932 439 932 436 935 c
+ 431 938 433 943 439 943 c
+ 446 943 446 946 440 951 c
+ 434 956 430 957 429 954 c
+ 428 953 425 952 423 951 c
+ 420 951 416 949 414 947 c
+ 412 944 412 944 415 941 c
+ 417 939 418 935 417 931 c
+ 417 926 417 925 420 925 c
+ 422 926 424 928 424 930 c
+ h f
+ 406 934 m
+ 411 940 407 941 401 936 c
+ 397 932 397 932 400 932 c
+ 402 932 405 933 406 934 c
+ h f
+ 253 937 m
+ 256 937 257 938 257 943 c
+ 258 946 259 950 260 951 c
+ 261 953 261 954 260 954 c
+ 258 954 258 953 258 952 c
+ 258 950 255 950 251 951 c
+ 244 952 243 951 246 945 c
+ 247 942 248 938 247 936 c
+ 247 934 247 934 248 935 c
+ 249 936 251 937 253 937 c
+ h f
+ 372 941 m
+ 375 946 379 946 381 941 c
+ 383 937 391 936 394 940 c
+ 398 944 398 945 392 952 c
+ 388 957 386 957 381 956 c
+ 376 955 374 956 372 958 c
+ 370 961 359 962 357 959 c
+ 357 958 353 959 349 960 c
+ 343 961 341 961 338 958 c
+ 336 956 334 956 330 956 c
+ 327 957 325 957 323 953 c
+ 319 947 317 947 317 953 c
+ 317 959 320 963 324 963 c
+ 328 963 328 966 325 967 c
+ 323 968 321 970 320 972 c
+ 318 978 305 980 300 975 c
+ 298 973 296 972 295 972 c
+ 294 972 295 969 296 967 c
+ 297 964 299 960 300 957 c
+ 302 954 304 952 307 952 c
+ 311 951 312 950 312 946 c
+ 312 939 316 936 320 939 c
+ 323 941 326 941 331 939 c
+ 338 938 339 938 341 941 c
+ 343 943 344 943 349 942 c
+ 353 940 357 939 358 939 c
+ 360 939 362 938 362 937 c
+ 363 933 369 936 372 941 c
+ h f
+ 329 947 m
+ 329 949 331 951 333 952 c
+ 336 953 337 953 337 951 c
+ 338 950 338 948 337 947 c
+ 336 944 329 944 329 947 c
+ h f
+ 307 966 m
+ 305 967 308 970 311 970 c
+ 313 970 315 969 315 967 c
+ 315 964 309 963 307 966 c
+ h f
+ 268 939 m
+ 268 940 267 941 265 941 c
+ 263 941 261 940 261 939 c
+ 261 938 263 938 265 938 c
+ 267 938 268 938 268 939 c
+ h f
+ 241 944 m
+ 241 949 240 949 235 947 c
+ 228 943 228 943 230 941 c
+ 230 940 233 939 236 939 c
+ 240 939 241 940 241 944 c
+ h f
+ 275 948 m
+ 275 949 275 950 274 950 c
+ 273 950 272 949 272 948 c
+ 272 947 272 946 273 946 c
+ 273 946 274 947 275 948 c
+ h f
+ 297 952 m
+ 296 955 290 958 289 957 c
+ 288 956 288 954 289 953 c
+ 290 950 298 949 297 952 c
+ h f
+ 355 966 m
+ 355 967 353 968 352 968 c
+ 351 968 351 967 352 966 c
+ 352 965 353 964 354 964 c
+ 355 964 356 965 355 966 c
+ h f
+ 383 972 m
+ 383 976 380 977 375 976 c
+ 372 975 372 975 375 972 c
+ 379 969 383 969 383 972 c
+ h f
+ 333 979 m
+ 332 981 330 982 328 982 c
+ 326 982 326 981 329 978 c
+ 334 973 336 973 333 979 c
+ h f
+ 349 981 m
+ 349 982 348 982 347 982 c
+ 346 982 345 982 345 981 c
+ 345 980 346 979 347 979 c
+ 348 979 349 980 349 981 c
+ h f
+ 512 933 m
+ 513 935 514 937 516 937 c
+ 519 937 519 931 515 931 c
+ 513 930 512 931 512 933 c
+ h f
+ 204 948 m
+ 204 949 205 950 205 950 c
+ 206 950 208 949 208 948 c
+ 209 947 208 946 207 946 c
+ 205 946 204 947 204 948 c
+ h f
+ 0.96 0.67 0.44 rg
+ 474 611 m
+ 464 616 444 635 438 646 c
+ 433 653 431 654 419 651 c
+ 414 650 404 648 396 647 c
+ 385 646 380 645 379 643 c
+ 377 641 374 641 368 641 c
+ 362 642 359 641 355 639 c
+ 353 638 350 637 348 637 c
+ 346 638 346 639 350 645 c
+ 352 649 356 652 357 653 c
+ 358 654 363 653 369 651 c
+ 378 647 378 647 381 650 c
+ 383 652 386 655 389 657 c
+ 393 659 394 659 397 658 c
+ 400 656 402 656 408 662 c
+ 415 670 421 671 425 665 c
+ 427 662 428 662 430 663 c
+ 431 664 435 664 439 665 c
+ 443 665 450 665 455 666 c
+ 460 666 464 667 465 668 c
+ 466 669 466 673 466 677 c
+ 465 685 461 688 456 682 c
+ 453 678 448 679 445 683 c
+ 443 686 441 687 430 687 c
+ 421 688 415 689 408 692 c
+ 393 700 391 700 388 696 c
+ 386 691 383 691 376 697 c
+ 370 702 368 702 365 698 c
+ 363 696 359 696 344 697 c
+ 333 697 324 698 323 699 c
+ 322 700 320 701 317 701 c
+ 315 701 313 702 312 703 c
+ 312 704 309 705 306 705 c
+ 303 705 300 706 299 707 c
+ 298 708 296 708 293 707 c
+ 291 706 286 705 284 704 c
+ 276 704 276 697 281 687 c
+ 286 679 295 673 296 677 c
+ 298 682 302 686 304 684 c
+ 306 683 310 681 314 680 c
+ 318 679 323 677 324 675 c
+ 327 671 321 670 313 673 c
+ 305 676 300 675 305 671 c
+ 309 667 308 665 300 665 c
+ 293 664 292 664 292 660 c
+ 291 654 296 649 299 653 c
+ 300 655 301 655 305 653 c
+ 309 651 310 648 310 645 c
+ 310 637 305 637 299 644 c
+ 296 647 292 649 290 649 c
+ 288 649 284 651 281 654 c
+ 277 656 272 658 268 658 c
+ 265 658 260 659 257 661 c
+ 254 663 246 664 239 665 c
+ 227 667 226 666 223 662 c
+ 221 660 217 658 214 658 c
+ 209 657 208 658 208 664 c
+ 207 668 208 673 211 678 c
+ 214 684 214 686 212 695 c
+ 211 703 209 707 201 714 c
+ 189 726 184 730 178 730 c
+ 174 730 170 731 168 733 c
+ 164 736 l
+ 169 744 l
+ 173 748 175 754 175 756 c
+ 175 759 167 769 164 769 c
+ 162 769 157 775 157 778 c
+ 157 780 159 785 162 788 c
+ 166 793 167 794 166 807 c
+ 165 820 164 822 161 825 c
+ 157 828 157 828 159 831 c
+ 161 833 163 839 163 845 c
+ 165 860 165 856 160 899 c
+ 159 908 159 908 164 911 c
+ 167 913 172 914 175 914 c
+ 183 914 195 921 201 929 c
+ 204 933 207 936 211 937 c
+ 215 937 218 939 219 940 c
+ 223 943 222 948 218 950 c
+ 216 950 215 951 215 952 c
+ 215 954 221 954 222 951 c
+ 223 950 226 952 229 956 c
+ 237 963 238 964 255 965 c
+ 265 966 267 965 268 963 c
+ 271 957 270 955 267 958 c
+ 264 959 262 959 258 955 c
+ 254 951 252 950 246 952 c
+ 241 953 239 953 236 950 c
+ 234 948 231 946 229 946 c
+ 228 946 227 945 227 943 c
+ 227 941 229 939 235 938 c
+ 239 937 244 935 245 933 c
+ 247 931 248 931 250 932 c
+ 251 934 257 935 262 935 c
+ 270 936 277 936 283 937 c
+ 286 938 282 941 279 941 c
+ 276 941 276 942 277 945 c
+ 279 948 279 950 276 955 c
+ 272 962 l
+ 276 965 l
+ 282 969 280 972 273 971 c
+ 265 969 262 973 264 980 c
+ 265 986 265 986 275 985 c
+ 284 984 285 984 290 989 c
+ 295 993 296 993 303 992 c
+ 309 991 311 989 311 986 c
+ 312 981 317 981 317 987 c
+ 317 991 317 991 324 991 c
+ 329 991 333 990 334 989 c
+ 336 987 338 986 341 986 c
+ 343 985 344 984 344 981 c
+ 344 978 344 976 346 976 c
+ 349 975 353 978 351 981 c
+ 350 984 362 993 365 992 c
+ 367 991 372 991 376 990 c
+ 380 990 384 989 384 989 c
+ 385 988 370 977 368 977 c
+ 366 977 364 975 363 973 c
+ 362 970 362 970 375 969 c
+ 383 969 391 968 393 967 c
+ 397 966 398 967 400 971 c
+ 403 977 404 977 411 976 c
+ 419 975 420 975 417 981 c
+ 416 983 415 984 416 984 c
+ 418 984 426 980 426 979 c
+ 426 975 439 969 443 971 c
+ 446 971 449 971 451 970 c
+ 454 968 456 968 459 971 c
+ 466 975 467 974 467 965 c
+ 467 959 468 956 473 951 c
+ 479 944 487 932 487 930 c
+ 487 929 485 929 483 928 c
+ 481 928 479 927 478 925 c
+ 478 923 479 923 484 924 c
+ 488 925 491 924 491 923 c
+ 492 922 495 921 499 921 c
+ 504 921 505 921 505 915 c
+ 505 912 506 909 506 908 c
+ 507 907 509 903 511 898 c
+ 514 889 522 881 530 878 c
+ 536 876 536 874 532 865 c
+ 528 859 528 856 529 845 c
+ 530 838 531 832 532 830 c
+ 533 829 533 825 533 822 c
+ 532 817 533 815 536 813 c
+ 541 809 542 805 538 801 c
+ 529 794 531 784 542 778 c
+ 546 776 550 774 550 773 c
+ 550 771 543 770 533 770 c
+ 533 770 531 771 529 772 c
+ 525 773 524 772 524 769 c
+ 524 766 523 764 521 762 c
+ 517 760 515 751 517 743 c
+ 518 739 519 738 524 738 c
+ 531 738 533 736 535 729 c
+ 538 720 536 719 525 721 c
+ 519 723 517 723 515 721 c
+ 511 717 511 712 516 710 c
+ 523 708 542 694 545 690 c
+ 547 688 548 684 548 682 c
+ 548 680 550 674 552 669 c
+ 555 663 557 657 557 655 c
+ 557 650 551 637 548 636 c
+ 547 635 544 631 542 627 c
+ 540 620 537 618 528 613 c
+ 518 608 515 607 499 607 c
+ 484 607 481 607 474 611 c
+ h f
+ 482 670 m
+ 482 671 481 672 479 672 c
+ 477 672 476 672 476 670 c
+ 476 667 481 667 482 670 c
+ h f
+ 244 704 m
+ 248 709 247 712 242 712 c
+ 238 712 235 708 237 704 c
+ 239 700 241 700 244 704 c
+ h f
+ 234 728 m
+ 234 729 233 730 231 729 c
+ 230 729 228 728 227 726 c
+ 227 725 228 724 230 725 c
+ 232 725 233 726 234 728 c
+ h f
+ 198 730 m
+ 198 731 198 731 197 731 c
+ 196 731 195 730 195 729 c
+ 195 727 196 726 197 727 c
+ 198 728 198 729 198 730 c
+ h f
+ 425 923 m
+ 426 924 428 925 431 925 c
+ 434 925 438 927 439 928 c
+ 441 930 444 932 446 932 c
+ 450 933 450 934 451 942 c
+ 451 951 451 952 447 952 c
+ 445 952 441 953 439 955 c
+ 435 957 434 957 425 954 c
+ 414 950 l
+ 412 955 l
+ 410 959 406 961 406 957 c
+ 406 956 407 954 408 952 c
+ 410 949 410 948 406 945 c
+ 402 941 402 941 400 945 c
+ 399 948 396 952 392 954 c
+ 388 958 385 959 381 958 c
+ 378 958 376 958 375 959 c
+ 374 960 372 961 369 962 c
+ 366 962 363 964 361 965 c
+ 358 969 349 971 349 968 c
+ 349 967 346 965 342 964 c
+ 334 960 335 960 334 964 c
+ 334 966 331 968 328 968 c
+ 325 969 323 970 323 972 c
+ 323 974 325 975 332 972 c
+ 335 971 336 972 336 974 c
+ 336 981 333 984 326 984 c
+ 322 984 318 983 318 982 c
+ 318 981 316 981 313 981 c
+ 309 982 305 981 302 980 c
+ 300 978 296 976 294 975 c
+ 292 974 289 972 288 971 c
+ 286 968 286 968 291 966 c
+ 296 964 296 960 290 959 c
+ 286 959 282 955 284 952 c
+ 286 950 296 945 299 945 c
+ 301 945 303 946 304 947 c
+ 307 951 309 949 309 944 c
+ 309 941 310 939 312 938 c
+ 315 936 344 936 344 938 c
+ 344 940 356 938 360 935 c
+ 364 931 367 932 372 937 c
+ 377 941 378 941 379 939 c
+ 379 937 382 936 385 936 c
+ 387 936 391 934 393 932 c
+ 397 928 400 928 408 932 c
+ 412 935 413 935 413 933 c
+ 413 925 422 918 425 923 c
+ h f
+ 468 931 m
+ 470 933 465 936 463 934 c
+ 461 932 463 929 465 929 c
+ 466 929 467 929 468 931 c
+ h f
+ 424 963 m
+ 424 965 421 967 419 966 c
+ 418 964 420 961 422 961 c
+ 423 961 424 962 424 963 c
+ h f
+ 376 618 m
+ 374 619 374 620 376 621 c
+ 377 621 378 624 378 626 c
+ 378 629 380 630 382 631 c
+ 384 631 385 630 384 625 c
+ 382 614 380 613 376 618 c
+ h f
+ 390 635 m
+ 390 639 395 642 397 641 c
+ 399 640 398 639 396 636 c
+ 393 632 390 632 390 635 c
+ h f
+ 337 647 m
+ 336 648 332 650 330 650 c
+ 322 650 323 654 332 657 c
+ 340 660 341 660 343 657 c
+ 345 654 344 644 342 644 c
+ 341 644 339 645 337 647 c
+ h f
+ 304 694 m
+ 304 695 305 696 307 696 c
+ 308 696 309 695 309 694 c
+ 308 693 307 692 306 692 c
+ 305 692 304 693 304 694 c
+ h f
+ 512 933 m
+ 513 935 514 937 516 937 c
+ 519 937 519 931 515 931 c
+ 513 930 512 931 512 933 c
+ h f
+ 386 975 m
+ 384 977 385 978 388 979 c
+ 391 980 392 979 392 977 c
+ 391 974 388 973 386 975 c
+ h f
+ 389 985 m
+ 389 987 389 988 391 987 c
+ 393 986 394 986 395 986 c
+ 395 986 395 985 395 984 c
+ 393 981 391 982 389 985 c
+ h f
+ 0.92 0.57 0.30 rg
+ 476 612 m
+ 472 614 465 618 462 622 c
+ 458 625 452 632 448 636 c
+ 443 639 439 645 437 648 c
+ 434 655 431 657 428 655 c
+ 423 654 408 651 401 650 c
+ 387 649 379 647 378 644 c
+ 378 641 376 641 368 641 c
+ 362 642 357 642 355 640 c
+ 348 637 347 640 351 646 c
+ 356 654 358 655 369 651 c
+ 378 647 l
+ 385 653 l
+ 392 659 393 659 396 657 c
+ 399 654 399 654 404 658 c
+ 406 660 410 663 411 665 c
+ 414 670 421 670 425 665 c
+ 426 662 428 661 430 663 c
+ 431 664 435 664 439 665 c
+ 443 665 450 665 455 666 c
+ 460 666 464 667 465 668 c
+ 467 671 465 685 463 685 c
+ 461 685 458 683 455 682 c
+ 449 679 449 679 446 683 c
+ 443 687 441 688 430 688 c
+ 420 688 416 689 407 693 c
+ 394 700 388 701 387 696 c
+ 386 691 383 691 376 697 c
+ 370 702 368 702 365 698 c
+ 361 694 320 698 313 704 c
+ 311 705 308 706 306 706 c
+ 303 706 300 707 299 709 c
+ 298 710 296 710 292 708 c
+ 290 707 285 706 283 706 c
+ 276 706 274 697 279 690 c
+ 281 687 283 684 283 682 c
+ 283 681 284 679 286 678 c
+ 290 676 297 675 297 677 c
+ 297 678 298 680 299 682 c
+ 301 685 303 685 304 684 c
+ 306 683 310 681 314 680 c
+ 318 679 323 677 324 675 c
+ 327 671 321 670 313 673 c
+ 307 675 305 675 303 674 c
+ 302 673 302 672 305 670 c
+ 310 667 308 665 300 665 c
+ 293 664 292 664 292 658 c
+ 292 650 288 649 282 654 c
+ 279 657 274 659 269 659 c
+ 263 660 258 662 256 664 c
+ 254 666 251 667 244 667 c
+ 234 667 230 669 228 676 c
+ 227 680 l
+ 223 676 l
+ 221 674 220 671 220 669 c
+ 220 665 215 661 213 662 c
+ 209 665 211 673 219 685 c
+ 228 698 229 703 222 704 c
+ 219 705 213 708 208 712 c
+ 200 719 199 721 200 727 c
+ 200 733 200 733 194 734 c
+ 190 735 183 735 179 735 c
+ 173 735 172 735 172 739 c
+ 172 741 173 744 174 746 c
+ 179 755 179 760 173 766 c
+ 170 770 167 773 165 773 c
+ 161 773 160 779 164 786 c
+ 168 794 169 808 166 820 c
+ 163 831 162 846 164 852 c
+ 166 858 166 861 162 896 c
+ 160 906 l
+ 167 909 l
+ 171 911 175 912 178 912 c
+ 185 912 198 919 202 926 c
+ 204 930 208 933 212 934 c
+ 219 936 237 935 243 931 c
+ 248 928 249 928 253 931 c
+ 257 933 261 934 276 933 c
+ 294 932 295 932 296 936 c
+ 298 941 306 950 308 949 c
+ 309 948 309 946 309 944 c
+ 309 938 314 935 320 936 c
+ 324 937 329 936 333 936 c
+ 338 935 341 935 343 937 c
+ 346 940 357 939 360 935 c
+ 363 931 367 932 372 937 c
+ 377 941 378 941 379 939 c
+ 379 937 382 936 384 936 c
+ 386 936 390 934 391 932 c
+ 395 928 400 928 407 932 c
+ 413 935 l
+ 414 929 l
+ 416 922 419 920 424 923 c
+ 426 924 430 925 432 925 c
+ 434 925 438 927 439 929 c
+ 441 931 445 932 448 932 c
+ 453 932 453 933 452 936 c
+ 452 938 451 943 451 946 c
+ 451 951 450 952 447 952 c
+ 445 952 441 953 439 954 c
+ 437 956 434 957 431 957 c
+ 427 957 426 958 426 962 c
+ 425 966 424 967 421 968 c
+ 419 968 417 967 417 966 c
+ 417 963 419 959 422 959 c
+ 425 959 425 956 420 954 c
+ 417 952 416 952 412 957 c
+ 409 961 408 961 406 960 c
+ 404 958 404 956 406 953 c
+ 408 948 408 947 405 944 c
+ 401 941 401 941 400 945 c
+ 399 947 396 952 393 955 c
+ 388 960 386 961 381 960 c
+ 376 959 374 959 372 962 c
+ 371 963 369 964 367 964 c
+ 365 964 364 967 367 969 c
+ 368 969 375 969 383 968 c
+ 398 966 398 966 401 970 c
+ 404 973 406 974 410 973 c
+ 414 972 416 973 418 975 c
+ 421 978 421 978 428 972 c
+ 433 968 436 966 442 966 c
+ 445 966 449 965 451 964 c
+ 452 962 454 963 457 966 c
+ 463 971 465 971 465 965 c
+ 465 957 468 950 474 945 c
+ 476 943 478 940 477 940 c
+ 477 940 473 939 469 938 c
+ 459 936 458 932 466 927 c
+ 470 924 474 922 480 922 c
+ 488 922 498 918 498 915 c
+ 498 914 500 911 503 907 c
+ 506 904 508 899 508 898 c
+ 508 892 511 888 522 880 c
+ 531 873 532 873 529 868 c
+ 525 860 524 852 526 848 c
+ 528 844 532 828 532 820 c
+ 533 816 534 813 536 812 c
+ 540 810 540 807 534 799 c
+ 529 793 529 788 535 779 c
+ 540 773 539 772 531 772 c
+ 526 773 524 772 523 770 c
+ 523 768 520 764 518 761 c
+ 514 757 514 754 514 748 c
+ 515 739 518 735 525 735 c
+ 528 735 530 734 532 731 c
+ 535 725 533 723 523 724 c
+ 515 725 514 724 511 721 c
+ 507 715 510 712 524 703 c
+ 539 694 544 689 546 681 c
+ 547 678 549 670 551 665 c
+ 555 653 554 646 546 637 c
+ 543 634 541 631 541 630 c
+ 541 626 533 618 524 614 c
+ 516 610 512 609 500 609 c
+ 489 609 482 610 476 612 c
+ h f
+ 483 670 m
+ 483 671 482 672 480 672 c
+ 478 672 476 671 476 670 c
+ 476 666 482 667 483 670 c
+ h f
+ 494 674 m
+ 494 676 493 678 492 678 c
+ 491 678 490 676 490 674 c
+ 490 672 491 671 492 671 c
+ 493 671 494 672 494 674 c
+ h f
+ 444 696 m
+ 444 697 443 697 442 697 c
+ 441 697 440 697 440 696 c
+ 440 695 441 694 442 694 c
+ 443 694 444 695 444 696 c
+ h f
+ 246 706 m
+ 249 713 248 718 243 715 c
+ 238 712 235 705 238 702 c
+ 241 699 242 700 246 706 c
+ h f
+ 235 725 m
+ 238 726 240 728 240 729 c
+ 240 732 231 732 226 729 c
+ 218 723 226 720 235 725 c
+ h f
+ 203 760 m
+ 203 763 200 764 197 762 c
+ 194 760 196 757 200 757 c
+ 203 757 204 758 203 760 c
+ h f
+ 495 909 m
+ 496 910 495 911 494 911 c
+ 493 911 492 910 492 909 c
+ 492 908 493 907 493 907 c
+ 493 907 494 908 495 909 c
+ h f
+ 301 643 m
+ 298 646 298 654 301 654 c
+ 304 654 309 649 309 645 c
+ 309 641 305 640 301 643 c
+ h f
+ 338 647 m
+ 336 649 332 650 330 650 c
+ 322 650 323 654 332 657 c
+ 337 658 341 659 342 659 c
+ 344 658 344 644 342 644 c
+ 341 644 339 645 338 647 c
+ h f
+ 304 694 m
+ 304 695 305 696 307 696 c
+ 308 696 309 695 309 694 c
+ 308 693 307 692 306 692 c
+ 305 692 304 693 304 694 c
+ h f
+ 278 947 m
+ 279 950 279 954 278 957 c
+ 276 961 276 963 279 965 c
+ 284 970 284 971 277 972 c
+ 272 974 272 974 275 978 c
+ 276 980 280 982 284 983 c
+ 287 984 291 986 292 988 c
+ 295 992 299 992 305 989 c
+ 313 984 311 982 297 980 c
+ 296 980 292 977 290 974 c
+ 285 969 l
+ 289 967 l
+ 294 963 295 961 290 961 c
+ 288 961 285 959 284 956 c
+ 281 952 281 952 287 948 c
+ 291 946 293 944 293 944 c
+ 293 943 290 943 285 943 c
+ 278 943 277 943 278 947 c
+ h f
+ 335 963 m
+ 335 965 335 966 336 967 c
+ 337 968 338 971 338 975 c
+ 338 983 l
+ 343 977 l
+ 348 971 348 968 340 964 c
+ 335 961 335 961 335 963 c
+ h f
+ 353 972 m
+ 350 975 352 983 357 987 c
+ 363 991 375 989 373 985 c
+ 373 983 372 981 372 980 c
+ 372 979 371 979 370 979 c
+ 369 979 366 977 363 974 c
+ 359 969 356 969 353 972 c
+ h f
+ 319 988 m
+ 319 989 320 990 321 990 c
+ 321 990 324 989 326 989 c
+ 328 989 329 989 329 988 c
+ 329 987 327 986 324 986 c
+ 321 986 318 987 319 988 c
+ h f
+ 0.95 0.56 0.14 rg
+ 476 614 m
+ 470 616 466 619 465 622 c
+ 464 624 460 628 457 630 c
+ 449 634 438 646 436 652 c
+ 434 657 431 658 422 656 c
+ 418 655 415 654 414 655 c
+ 411 660 410 665 412 667 c
+ 415 670 422 669 422 666 c
+ 422 663 427 661 430 663 c
+ 431 664 435 664 439 665 c
+ 443 665 450 665 455 666 c
+ 460 666 464 667 465 668 c
+ 466 669 466 673 466 678 c
+ 464 687 460 689 453 683 c
+ 449 679 l
+ 446 683 l
+ 443 687 441 688 430 688 c
+ 418 688 413 689 400 697 c
+ 393 702 387 701 387 696 c
+ 387 691 382 691 376 697 c
+ 370 702 368 702 365 698 c
+ 362 695 337 696 330 700 c
+ 326 702 322 703 319 703 c
+ 316 703 313 704 311 706 c
+ 310 707 308 708 307 708 c
+ 305 708 302 709 300 710 c
+ 297 712 296 712 292 710 c
+ 289 708 285 707 283 708 c
+ 280 708 278 708 277 706 c
+ 274 702 275 693 279 689 c
+ 281 688 283 684 283 681 c
+ 283 676 283 676 290 676 c
+ 294 676 297 677 297 677 c
+ 297 678 298 680 299 682 c
+ 301 685 303 685 304 684 c
+ 306 683 310 681 314 680 c
+ 318 679 323 677 324 675 c
+ 327 671 321 670 313 673 c
+ 307 675 305 675 303 674 c
+ 302 673 302 672 305 670 c
+ 310 667 308 665 300 665 c
+ 293 664 292 664 292 658 c
+ 292 654 292 653 289 653 c
+ 287 653 283 654 281 656 c
+ 278 658 273 660 269 660 c
+ 263 661 259 663 256 666 c
+ 253 670 251 671 246 670 c
+ 239 669 232 671 232 675 c
+ 232 676 234 679 237 681 c
+ 243 687 243 688 235 688 c
+ 230 688 229 689 229 692 c
+ 229 696 237 702 239 699 c
+ 241 696 243 697 244 702 c
+ 245 704 247 707 249 708 c
+ 252 710 252 710 249 715 c
+ 247 721 247 721 242 718 c
+ 240 716 238 713 238 712 c
+ 238 711 236 708 235 705 c
+ 232 701 232 701 229 703 c
+ 227 705 224 707 222 707 c
+ 216 709 203 718 201 721 c
+ 201 722 201 725 202 726 c
+ 206 733 200 737 183 737 c
+ 179 738 175 738 174 739 c
+ 174 740 175 743 177 747 c
+ 180 752 180 756 179 759 c
+ 178 764 171 773 169 773 c
+ 168 773 166 774 164 776 c
+ 162 778 162 779 165 784 c
+ 167 787 168 794 169 800 c
+ 170 811 167 835 164 839 c
+ 163 840 163 843 163 847 c
+ 165 855 165 870 164 888 c
+ 162 904 l
+ 169 908 l
+ 172 909 177 911 179 911 c
+ 186 911 202 919 203 923 c
+ 205 930 213 933 226 931 c
+ 232 931 239 929 243 928 c
+ 247 927 249 927 255 930 c
+ 263 934 l
+ 268 929 l
+ 274 924 l
+ 286 927 l
+ 293 929 300 930 300 929 c
+ 303 928 304 931 302 938 c
+ 301 942 301 944 303 947 c
+ 307 951 309 949 309 943 c
+ 309 939 311 937 315 936 c
+ 317 935 321 935 322 936 c
+ 323 936 328 936 332 935 c
+ 339 933 341 934 343 936 c
+ 344 939 346 939 351 938 c
+ 355 938 359 936 360 935 c
+ 363 931 367 932 372 937 c
+ 377 941 378 941 379 939 c
+ 379 937 382 936 384 936 c
+ 386 936 389 934 390 932 c
+ 393 928 400 927 407 932 c
+ 413 936 l
+ 414 928 l
+ 415 923 416 921 420 921 c
+ 422 921 424 922 425 923 c
+ 426 924 428 925 431 925 c
+ 433 925 437 927 439 928 c
+ 445 934 456 932 465 924 c
+ 471 918 472 918 479 919 c
+ 489 921 493 919 491 911 c
+ 490 907 491 905 493 905 c
+ 494 905 496 906 497 907 c
+ 499 911 506 902 507 895 c
+ 508 890 510 887 518 881 c
+ 528 873 530 870 525 866 c
+ 522 863 522 853 526 844 c
+ 528 839 530 831 531 826 c
+ 532 821 533 815 535 812 c
+ 537 808 537 807 533 800 c
+ 528 793 528 788 533 778 c
+ 535 775 535 775 530 774 c
+ 525 772 516 764 514 757 c
+ 512 752 513 739 517 736 c
+ 518 734 521 733 523 733 c
+ 525 733 527 732 528 730 c
+ 530 726 529 726 522 726 c
+ 517 726 513 725 511 723 c
+ 507 719 508 711 513 709 c
+ 516 708 519 705 521 703 c
+ 524 701 528 698 531 697 c
+ 539 693 544 687 545 679 c
+ 546 675 548 669 550 665 c
+ 553 658 553 657 551 651 c
+ 550 647 547 641 544 637 c
+ 542 634 538 629 537 626 c
+ 535 623 530 619 522 615 c
+ 512 610 510 609 506 611 c
+ 503 613 501 613 489 611 c
+ 487 610 482 612 476 614 c
+ h f
+ 284 669 m
+ 284 670 284 671 283 671 c
+ 282 672 281 671 281 670 c
+ 281 668 282 667 283 667 c
+ 284 667 284 668 284 669 c
+ h f
+ 483 671 m
+ 483 674 483 674 480 674 c
+ 479 674 477 672 476 670 c
+ 476 668 477 667 479 667 c
+ 481 668 483 669 483 671 c
+ h f
+ 496 671 m
+ 496 674 493 678 491 678 c
+ 488 678 486 673 489 670 c
+ 491 667 496 668 496 671 c
+ h f
+ 444 697 m
+ 444 698 443 699 441 699 c
+ 440 699 438 698 438 697 c
+ 438 695 440 694 441 694 c
+ 443 694 444 695 444 697 c
+ h f
+ 329 712 m
+ 329 713 329 714 328 714 c
+ 328 714 327 713 327 712 c
+ 326 711 326 710 327 710 c
+ 328 710 329 711 329 712 c
+ h f
+ 284 714 m
+ 284 715 283 715 282 715 c
+ 280 715 279 715 279 714 c
+ 279 713 280 712 282 712 c
+ 283 712 284 713 284 714 c
+ h f
+ 223 717 m
+ 225 719 227 721 229 721 c
+ 234 721 243 726 243 729 c
+ 243 733 239 735 231 733 c
+ 222 731 219 727 218 719 c
+ 216 713 220 711 223 717 c
+ h f
+ 207 757 m
+ 207 764 203 767 197 764 c
+ 189 760 193 755 206 753 c
+ 207 753 207 755 207 757 c
+ h f
+ 185 771 m
+ 184 775 180 775 180 772 c
+ 180 770 182 769 183 769 c
+ 185 769 186 770 185 771 c
+ h f
+ 303 916 m
+ 303 917 301 918 300 918 c
+ 299 918 299 917 299 916 c
+ 299 915 300 914 302 914 c
+ 303 914 304 915 303 916 c
+ h f
+ 351 646 m
+ 356 654 358 655 368 651 c
+ 373 649 379 648 380 648 c
+ 382 648 383 648 382 648 c
+ 380 647 379 645 378 644 c
+ 377 641 376 640 371 641 c
+ 363 643 362 643 354 641 c
+ 347 640 l
+ 351 646 l
+ h f
+ 301 648 m
+ 298 654 298 654 301 654 c
+ 304 654 309 649 308 646 c
+ 307 642 303 643 301 648 c
+ h f
+ 338 647 m
+ 336 650 333 651 330 650 c
+ 322 650 323 654 332 657 c
+ 337 658 341 659 342 659 c
+ 344 657 344 644 342 644 c
+ 341 644 339 645 338 647 c
+ h f
+ 388 653 m
+ 392 655 394 655 393 653 c
+ 392 652 390 651 389 651 c
+ 386 651 386 651 388 653 c
+ h f
+ 400 652 m
+ 399 654 404 659 406 657 c
+ 406 657 406 655 404 653 c
+ 402 652 401 651 400 652 c
+ h f
+ 304 694 m
+ 304 695 305 696 307 696 c
+ 308 696 309 695 309 694 c
+ 308 693 307 692 306 692 c
+ 305 692 304 693 304 694 c
+ h f
+ 452 940 m
+ 452 942 451 945 451 948 c
+ 451 951 450 952 446 952 c
+ 444 952 440 954 438 956 c
+ 435 959 433 961 432 961 c
+ 430 961 430 962 430 964 c
+ 430 966 431 966 434 965 c
+ 437 964 441 964 443 964 c
+ 445 964 448 964 448 963 c
+ 450 960 457 960 460 963 c
+ 461 965 462 964 463 962 c
+ 469 944 469 944 465 941 c
+ 460 937 454 937 452 940 c
+ h f
+ 400 944 m
+ 398 949 399 952 402 952 c
+ 405 952 407 946 404 943 c
+ 402 941 401 941 400 944 c
+ h f
+ 278 944 m
+ 277 947 280 950 283 949 c
+ 286 948 286 947 284 945 c
+ 282 943 280 942 278 944 c
+ h f
+ 393 953 m
+ 392 954 392 956 392 957 c
+ 392 961 388 963 382 962 c
+ 377 960 370 964 371 966 c
+ 372 968 384 967 392 964 c
+ 394 963 397 963 398 965 c
+ 408 974 408 973 415 963 c
+ 418 956 419 955 416 958 c
+ 411 962 406 962 401 956 c
+ 396 952 395 951 393 953 c
+ h f
+ 279 960 m
+ 279 963 280 966 281 967 c
+ 284 969 283 973 280 973 c
+ 277 973 276 980 279 981 c
+ 280 982 283 982 285 981 c
+ 288 980 288 979 287 975 c
+ 287 971 287 968 289 966 c
+ 292 963 292 963 289 963 c
+ 287 963 285 962 284 959 c
+ 283 952 279 952 279 960 c
+ h f
+ 335 963 m
+ 335 965 335 966 336 966 c
+ 337 966 338 965 338 965 c
+ 338 964 337 962 336 962 c
+ 335 961 335 962 335 963 c
+ h f
+ 354 975 m
+ 351 977 353 982 357 985 c
+ 363 989 366 988 368 984 c
+ 372 978 358 970 354 975 c
+ h f
+ 296 984 m
+ 294 988 298 991 301 987 c
+ 303 985 304 983 303 982 c
+ 301 979 297 980 296 984 c
+ h f
+ 307 984 m
+ 306 985 306 986 307 986 c
+ 308 986 310 985 310 984 c
+ 311 983 311 982 310 982 c
+ 309 982 307 983 307 984 c
+ h f
+ 322 988 m
+ 322 989 323 989 324 989 c
+ 325 989 326 989 326 988 c
+ 326 987 325 986 324 986 c
+ 323 986 322 987 322 988 c
+ h f
+ 0.82 0.44 0.32 rg
+ 473 615 m
+ 471 616 468 619 467 621 c
+ 466 624 462 628 458 630 c
+ 450 634 438 646 436 652 c
+ 434 657 431 658 422 656 c
+ 418 655 415 654 414 655 c
+ 411 660 410 665 412 667 c
+ 415 670 422 669 422 666 c
+ 422 663 427 661 430 663 c
+ 431 664 435 664 439 665 c
+ 468 666 467 666 466 676 c
+ 465 686 461 689 455 686 c
+ 453 685 452 684 452 683 c
+ 452 682 452 681 451 680 c
+ 450 680 447 681 446 683 c
+ 443 687 441 688 430 688 c
+ 418 688 413 689 400 697 c
+ 393 702 387 701 387 696 c
+ 387 691 382 691 376 697 c
+ 370 702 368 702 365 698 c
+ 363 696 356 696 336 697 c
+ 334 697 332 699 330 700 c
+ 328 702 324 703 320 703 c
+ 317 703 313 704 311 705 c
+ 304 711 300 712 293 711 c
+ 286 710 l
+ 286 717 l
+ 285 723 285 723 280 724 c
+ 278 724 274 725 273 726 c
+ 272 727 267 728 262 728 c
+ 254 728 253 729 247 734 c
+ 240 742 238 742 230 736 c
+ 222 731 218 730 215 734 c
+ 214 735 209 736 204 736 c
+ 199 736 193 738 190 739 c
+ 188 741 185 742 183 742 c
+ 180 742 180 749 183 754 c
+ 185 757 186 757 189 755 c
+ 191 753 196 751 202 749 c
+ 211 747 211 747 216 752 c
+ 219 755 222 758 222 759 c
+ 222 762 206 769 200 769 c
+ 196 769 193 771 189 775 c
+ 185 780 182 782 178 782 c
+ 173 782 172 782 170 792 c
+ 169 798 169 803 170 806 c
+ 171 809 171 813 171 816 c
+ 170 819 169 824 169 827 c
+ 169 831 167 835 165 837 c
+ 162 841 162 846 165 852 c
+ 166 856 166 862 165 876 c
+ 164 887 163 897 164 899 c
+ 165 905 175 910 185 912 c
+ 197 913 206 917 206 920 c
+ 206 923 213 930 217 930 c
+ 218 930 220 929 222 928 c
+ 225 924 229 924 234 928 c
+ 237 930 239 930 241 929 c
+ 246 926 255 928 259 931 c
+ 262 935 266 933 268 928 c
+ 270 923 274 922 282 925 c
+ 290 928 295 926 295 918 c
+ 296 913 297 911 300 911 c
+ 305 910 309 915 306 921 c
+ 305 924 305 926 306 929 c
+ 308 931 308 933 304 938 c
+ 300 943 300 943 303 947 c
+ 307 951 309 950 309 943 c
+ 309 939 311 937 315 936 c
+ 317 935 321 935 322 936 c
+ 323 936 328 936 332 935 c
+ 339 933 341 934 343 936 c
+ 344 939 346 939 351 938 c
+ 355 938 359 936 360 935 c
+ 363 931 367 932 372 937 c
+ 377 941 378 941 379 939 c
+ 379 937 382 936 384 936 c
+ 386 936 389 934 390 932 c
+ 393 928 400 927 407 932 c
+ 413 936 l
+ 414 928 l
+ 415 923 416 921 420 921 c
+ 422 921 424 922 425 923 c
+ 426 924 428 925 431 925 c
+ 434 925 438 927 439 929 c
+ 443 932 449 934 447 930 c
+ 446 929 448 929 451 929 c
+ 455 929 458 927 462 923 c
+ 467 918 468 917 474 918 c
+ 482 920 487 917 486 912 c
+ 484 907 488 903 495 903 c
+ 502 903 505 901 505 894 c
+ 505 889 513 880 518 880 c
+ 522 880 526 874 524 870 c
+ 524 868 522 866 521 865 c
+ 518 863 519 854 523 847 c
+ 528 840 532 830 532 822 c
+ 532 819 533 815 535 812 c
+ 538 807 538 807 533 802 c
+ 529 798 528 796 529 792 c
+ 532 775 532 775 528 773 c
+ 519 769 512 759 511 751 c
+ 510 740 515 731 523 731 c
+ 526 731 528 731 527 730 c
+ 526 728 524 728 522 729 c
+ 518 730 508 724 506 720 c
+ 503 713 513 703 532 693 c
+ 539 690 540 688 544 677 c
+ 548 664 550 646 548 643 c
+ 547 642 545 640 543 639 c
+ 541 638 538 634 535 629 c
+ 528 617 522 614 498 614 c
+ 486 614 475 614 473 615 c
+ h f
+ 483 672 m
+ 484 676 482 677 478 674 c
+ 475 671 476 667 479 667 c
+ 481 668 483 670 483 672 c
+ h f
+ 495 669 m
+ 497 671 494 678 492 678 c
+ 490 678 488 677 487 676 c
+ 486 674 486 673 488 670 c
+ 491 667 493 666 495 669 c
+ h f
+ 444 697 m
+ 444 699 443 701 441 701 c
+ 438 701 437 699 438 696 c
+ 439 693 444 693 444 697 c
+ h f
+ 328 710 m
+ 330 713 328 714 326 711 c
+ 324 709 324 708 325 708 c
+ 326 708 328 709 328 710 c
+ h f
+ 351 646 m
+ 356 654 358 655 368 651 c
+ 373 649 379 648 380 648 c
+ 382 648 383 648 382 648 c
+ 380 647 379 645 378 644 c
+ 377 641 376 640 371 641 c
+ 363 643 362 643 354 641 c
+ 347 640 l
+ 351 646 l
+ h f
+ 301 648 m
+ 298 654 298 654 301 654 c
+ 304 654 309 649 308 646 c
+ 307 642 303 643 301 648 c
+ h f
+ 338 647 m
+ 336 650 333 651 330 650 c
+ 322 650 323 654 332 657 c
+ 337 658 341 659 342 659 c
+ 344 657 344 644 342 644 c
+ 341 644 339 645 338 647 c
+ h f
+ 400 652 m
+ 399 654 404 659 406 657 c
+ 406 657 406 655 404 653 c
+ 402 652 401 651 400 652 c
+ h f
+ 280 656 m
+ 278 658 274 660 271 660 c
+ 264 660 258 663 258 667 c
+ 258 668 256 670 254 670 c
+ 231 672 229 673 237 679 c
+ 239 680 241 682 241 683 c
+ 239 684 244 688 247 688 c
+ 251 688 251 691 248 693 c
+ 245 695 238 696 239 694 c
+ 239 693 238 692 236 692 c
+ 234 692 232 693 232 694 c
+ 232 695 233 696 234 696 c
+ 235 696 236 696 235 697 c
+ 235 698 235 699 236 700 c
+ 237 701 238 700 239 699 c
+ 241 696 243 697 244 702 c
+ 245 704 247 708 250 709 c
+ 252 711 254 713 253 714 c
+ 252 715 252 717 253 719 c
+ 254 722 256 723 260 723 c
+ 264 723 267 721 271 716 c
+ 275 710 276 708 276 701 c
+ 275 695 276 692 279 689 c
+ 281 688 283 684 283 681 c
+ 283 676 283 676 290 676 c
+ 294 676 297 677 297 677 c
+ 297 678 298 680 299 682 c
+ 301 685 303 685 304 684 c
+ 306 683 310 681 314 680 c
+ 318 679 323 677 324 675 c
+ 327 671 321 670 313 673 c
+ 307 675 305 675 303 674 c
+ 302 673 302 672 305 670 c
+ 310 667 308 665 300 665 c
+ 293 664 292 664 292 658 c
+ 292 654 292 653 289 653 c
+ 287 653 283 654 280 656 c
+ h f
+ 284 669 m
+ 284 670 284 671 283 671 c
+ 282 672 281 671 281 670 c
+ 281 668 282 667 283 667 c
+ 284 667 284 668 284 669 c
+ h f
+ 304 694 m
+ 304 695 305 696 307 696 c
+ 308 696 309 695 309 694 c
+ 308 693 307 692 306 692 c
+ 305 692 304 693 304 694 c
+ h f
+ 229 709 m
+ 228 714 230 718 234 719 c
+ 238 719 238 719 237 713 c
+ 237 707 231 704 229 709 c
+ h f
+ 209 723 m
+ 209 724 210 724 211 724 c
+ 212 724 213 724 213 723 c
+ 213 722 212 721 211 721 c
+ 210 721 209 722 209 723 c
+ h f
+ 452 940 m
+ 452 942 451 945 451 948 c
+ 451 951 450 952 447 952 c
+ 442 952 437 955 437 958 c
+ 437 961 438 961 448 960 c
+ 459 959 464 956 463 950 c
+ 463 949 461 947 459 946 c
+ 457 945 455 942 454 940 c
+ 454 937 454 937 452 940 c
+ h f
+ 400 944 m
+ 398 949 399 952 402 952 c
+ 405 952 407 946 404 943 c
+ 402 941 401 941 400 944 c
+ h f
+ 278 944 m
+ 277 947 280 950 283 949 c
+ 286 948 286 947 284 945 c
+ 282 943 280 942 278 944 c
+ h f
+ 393 954 m
+ 391 958 397 966 403 968 c
+ 407 969 408 969 410 966 c
+ 412 962 412 961 408 961 c
+ 407 961 403 959 400 956 c
+ 395 951 394 951 393 954 c
+ h f
+ 279 960 m
+ 279 963 280 966 281 967 c
+ 284 969 283 973 280 973 c
+ 276 973 276 980 280 982 c
+ 284 983 288 977 287 973 c
+ 286 971 287 968 289 966 c
+ 292 963 292 963 289 963 c
+ 287 963 285 962 284 959 c
+ 283 952 279 952 279 960 c
+ h f
+ 335 963 m
+ 335 965 335 966 336 966 c
+ 337 966 338 965 338 965 c
+ 338 964 337 962 336 962 c
+ 335 961 335 962 335 963 c
+ h f
+ 377 962 m
+ 375 964 376 966 380 966 c
+ 385 966 386 964 382 962 c
+ 378 961 378 961 377 962 c
+ h f
+ 356 975 m
+ 353 975 352 976 353 979 c
+ 354 984 364 988 368 984 c
+ 370 982 370 981 367 978 c
+ 364 975 362 973 362 974 c
+ 361 974 359 974 356 975 c
+ h f
+ 296 984 m
+ 294 988 298 991 301 987 c
+ 303 985 304 983 303 982 c
+ 301 979 297 980 296 984 c
+ h f
+ 307 984 m
+ 306 985 306 986 307 986 c
+ 308 986 310 985 310 984 c
+ 311 983 311 982 310 982 c
+ 309 982 307 983 307 984 c
+ h f
+ 322 988 m
+ 322 989 323 989 324 989 c
+ 325 989 326 989 326 988 c
+ 326 987 325 986 324 986 c
+ 323 986 322 987 322 988 c
+ h f
+ 0.93 0.42 0.05 rg
+ 475 616 m
+ 471 617 468 620 466 622 c
+ 465 624 462 627 461 628 c
+ 453 632 448 638 441 649 c
+ 436 655 433 660 433 661 c
+ 433 662 449 663 457 663 c
+ 461 663 465 664 467 665 c
+ 470 667 472 667 474 665 c
+ 477 664 480 664 485 665 c
+ 495 669 497 670 497 674 c
+ 497 679 489 682 488 677 c
+ 487 675 485 675 482 675 c
+ 479 676 477 675 474 673 c
+ 470 670 469 671 469 681 c
+ 468 687 468 688 463 687 c
+ 460 687 456 687 454 686 c
+ 451 686 450 687 448 692 c
+ 447 695 445 698 444 699 c
+ 441 703 437 700 437 695 c
+ 437 691 436 691 428 690 c
+ 421 689 418 690 411 695 c
+ 399 703 393 704 387 700 c
+ 382 697 379 697 375 701 c
+ 371 705 369 705 364 701 c
+ 361 699 357 698 349 699 c
+ 343 699 337 700 335 701 c
+ 333 702 328 703 323 704 c
+ 319 704 314 706 314 707 c
+ 313 707 311 708 309 708 c
+ 307 708 304 710 301 711 c
+ 298 714 296 714 293 712 c
+ 288 709 286 710 286 717 c
+ 285 723 285 723 280 724 c
+ 278 724 274 725 273 726 c
+ 272 727 267 728 262 728 c
+ 254 728 253 729 247 734 c
+ 240 742 238 742 230 736 c
+ 222 731 218 730 215 734 c
+ 214 735 209 736 204 736 c
+ 199 736 193 738 190 739 c
+ 188 741 185 742 183 742 c
+ 180 742 180 749 183 754 c
+ 185 757 186 757 189 755 c
+ 191 753 196 751 202 749 c
+ 211 747 211 747 216 752 c
+ 219 755 222 758 222 759 c
+ 222 762 206 769 200 769 c
+ 196 769 193 771 189 775 c
+ 185 780 182 782 178 782 c
+ 172 782 172 782 171 791 c
+ 170 796 170 804 170 809 c
+ 170 813 170 821 169 826 c
+ 168 830 167 845 167 858 c
+ 167 871 166 886 165 892 c
+ 164 903 l
+ 169 906 l
+ 172 908 176 909 178 909 c
+ 184 909 204 917 205 919 c
+ 207 924 213 930 216 930 c
+ 218 930 220 929 222 927 c
+ 225 925 226 925 231 926 c
+ 233 927 237 927 238 927 c
+ 242 924 251 925 255 928 c
+ 260 931 266 931 269 926 c
+ 271 923 272 922 280 925 c
+ 292 928 295 926 295 918 c
+ 296 913 297 911 300 911 c
+ 306 910 309 915 306 921 c
+ 305 924 305 926 306 928 c
+ 307 929 307 932 307 934 c
+ 305 938 l
+ 310 934 l
+ 314 931 316 931 321 932 c
+ 324 933 330 934 335 933 c
+ 340 932 344 933 344 934 c
+ 346 937 352 936 358 932 c
+ 363 928 363 928 369 931 c
+ 374 934 376 934 383 932 c
+ 387 931 390 929 390 928 c
+ 390 927 394 927 400 927 c
+ 410 928 411 927 411 924 c
+ 412 922 413 919 415 919 c
+ 419 917 436 922 441 926 c
+ 448 931 456 929 464 921 c
+ 471 914 476 913 479 916 c
+ 482 919 487 917 486 912 c
+ 484 907 488 903 495 903 c
+ 502 903 505 901 505 894 c
+ 505 890 509 885 518 880 c
+ 524 876 526 870 522 866 c
+ 518 862 518 856 522 848 c
+ 524 845 527 836 528 829 c
+ 529 822 531 814 533 812 c
+ 535 807 535 806 532 801 c
+ 528 796 528 791 531 780 c
+ 532 777 531 776 529 776 c
+ 525 776 519 771 519 768 c
+ 519 767 517 765 515 763 c
+ 507 753 511 731 522 731 c
+ 524 731 526 731 526 729 c
+ 526 728 525 728 522 729 c
+ 518 730 508 724 506 720 c
+ 503 713 513 703 532 693 c
+ 539 690 540 688 543 679 c
+ 548 665 550 650 548 646 c
+ 547 644 544 640 541 637 c
+ 538 634 535 629 533 626 c
+ 528 617 521 614 500 614 c
+ 490 614 479 615 475 616 c
+ h f
+ 332 712 m
+ 333 714 332 716 330 717 c
+ 327 718 321 713 323 710 c
+ 325 707 332 709 332 712 c
+ h f
+ 357 647 m
+ 356 648 357 651 360 651 c
+ 361 651 361 650 361 648 c
+ 361 645 359 645 357 647 c
+ h f
+ 280 660 m
+ 274 663 274 666 280 664 c
+ 287 663 289 660 287 658 c
+ 286 657 283 658 280 660 c
+ h f
+ 418 660 m
+ 417 661 418 662 419 662 c
+ 420 663 421 662 421 661 c
+ 421 658 419 657 418 660 c
+ h f
+ 260 667 m
+ 258 669 256 671 256 673 c
+ 256 674 253 674 246 673 c
+ 238 672 236 673 236 675 c
+ 236 678 244 687 247 687 c
+ 250 687 251 690 249 693 c
+ 246 696 248 705 252 705 c
+ 257 705 258 708 255 712 c
+ 250 717 253 723 260 722 c
+ 264 722 267 721 271 716 c
+ 275 711 276 708 275 706 c
+ 273 703 273 694 276 687 c
+ 278 682 277 681 275 678 c
+ 273 676 270 674 268 674 c
+ 266 674 265 673 264 668 c
+ 264 663 l
+ 260 667 l
+ h f
+ 291 671 m
+ 291 672 293 672 293 671 c
+ 296 670 296 669 292 669 c
+ 291 669 290 670 291 671 c
+ h f
+ 232 694 m
+ 232 695 234 696 235 696 c
+ 236 696 238 695 239 694 c
+ 239 693 238 692 236 692 c
+ 234 692 232 693 232 694 c
+ h f
+ 230 709 m
+ 228 714 230 718 234 719 c
+ 239 719 239 719 235 712 c
+ 232 706 231 705 230 709 c
+ h f
+ 209 723 m
+ 209 724 210 724 211 724 c
+ 212 724 213 724 213 723 c
+ 213 722 212 721 211 721 c
+ 210 721 209 722 209 723 c
+ h f
+ 455 951 m
+ 453 955 451 956 448 956 c
+ 446 955 442 956 440 958 c
+ 436 961 436 961 440 961 c
+ 452 961 460 958 462 954 c
+ 464 951 463 949 462 947 c
+ 459 944 458 944 455 951 c
+ h f
+ 395 957 m
+ 393 960 395 963 398 963 c
+ 401 963 401 962 400 958 c
+ 399 955 396 955 395 957 c
+ h f
+ 377 962 m
+ 375 964 376 966 380 966 c
+ 385 966 386 964 382 962 c
+ 378 961 378 961 377 962 c
+ h f
+ 405 966 m
+ 405 967 406 968 407 968 c
+ 408 968 409 967 409 966 c
+ 410 965 409 964 407 964 c
+ 405 964 404 965 405 966 c
+ h f
+ 283 977 m
+ 281 978 281 978 283 979 c
+ 285 980 286 979 286 978 c
+ 286 975 286 975 283 977 c
+ h f
+ 357 981 m
+ 360 985 365 988 367 985 c
+ 369 983 361 975 357 975 c
+ 354 975 354 976 357 981 c
+ h f
+ 0.91 0.31 0.05 rg
+ 473 617 m
+ 471 618 469 620 469 621 c
+ 469 623 464 627 459 631 c
+ 452 635 446 642 441 648 c
+ 437 654 433 659 433 660 c
+ 433 661 441 662 459 664 c
+ 468 665 471 665 478 665 c
+ 490 665 503 667 505 669 c
+ 511 674 526 669 526 661 c
+ 526 659 528 658 529 658 c
+ 531 658 534 657 536 655 c
+ 537 653 541 651 543 650 c
+ 548 648 548 643 543 642 c
+ 538 641 534 637 532 629 c
+ 529 619 524 616 504 617 c
+ 495 617 485 617 482 616 c
+ 479 616 475 616 473 617 c
+ h f
+ 357 647 m
+ 356 648 357 651 360 651 c
+ 361 651 361 650 361 648 c
+ 361 645 359 645 357 647 c
+ h f
+ 280 660 m
+ 274 663 274 666 280 664 c
+ 287 663 289 660 287 658 c
+ 286 657 283 658 280 660 c
+ h f
+ 531 662 m
+ 529 663 528 667 527 670 c
+ 526 674 525 677 525 678 c
+ 524 679 511 675 504 672 c
+ 500 670 498 670 498 674 c
+ 498 680 493 682 488 679 c
+ 485 677 483 676 482 677 c
+ 481 677 478 676 476 674 c
+ 470 670 469 671 469 680 c
+ 469 686 468 687 465 688 c
+ 462 689 459 692 457 693 c
+ 455 695 452 697 450 699 c
+ 447 700 447 701 449 703 c
+ 452 707 451 707 443 707 c
+ 435 707 434 707 434 703 c
+ 434 700 435 697 436 695 c
+ 437 691 436 691 428 690 c
+ 421 689 418 690 413 693 c
+ 406 697 406 698 409 700 c
+ 414 703 411 706 405 703 c
+ 403 702 399 702 396 702 c
+ 394 703 390 702 387 700 c
+ 382 697 379 697 375 701 c
+ 371 705 369 705 364 701 c
+ 361 699 357 698 349 699 c
+ 334 699 331 701 332 709 c
+ 333 717 329 719 324 715 c
+ 320 711 318 711 318 716 c
+ 318 719 317 721 316 721 c
+ 315 721 313 722 311 723 c
+ 308 726 308 726 302 722 c
+ 298 720 295 717 295 716 c
+ 295 710 292 714 291 721 c
+ 290 731 292 732 299 730 c
+ 304 728 305 728 307 731 c
+ 310 736 313 736 316 731 c
+ 321 724 336 729 336 738 c
+ 336 741 335 741 328 740 c
+ 319 739 313 741 308 747 c
+ 306 750 297 749 297 745 c
+ 297 744 296 742 295 741 c
+ 294 739 293 739 288 742 c
+ 285 745 282 749 281 751 c
+ 280 753 278 755 276 755 c
+ 273 755 270 747 271 742 c
+ 272 739 271 739 263 740 c
+ 257 740 250 741 247 742 c
+ 237 745 228 744 226 739 c
+ 224 734 221 734 219 739 c
+ 217 742 217 743 221 747 c
+ 224 749 229 752 232 752 c
+ 241 754 245 762 236 762 c
+ 234 762 231 764 228 766 c
+ 226 769 222 770 215 770 c
+ 204 771 202 772 190 781 c
+ 186 784 181 787 180 787 c
+ 178 787 176 789 174 791 c
+ 171 794 171 798 171 814 c
+ 171 825 170 834 168 837 c
+ 167 840 166 845 167 855 c
+ 168 862 167 875 166 882 c
+ 165 890 165 897 165 899 c
+ 168 905 177 909 190 910 c
+ 204 911 208 913 211 923 c
+ 213 928 216 931 216 927 c
+ 216 926 219 924 222 922 c
+ 228 919 236 920 236 924 c
+ 236 925 239 926 247 926 c
+ 253 926 258 927 260 928 c
+ 262 930 263 930 265 926 c
+ 268 920 278 918 283 922 c
+ 287 926 292 925 292 918 c
+ 292 916 293 911 295 909 c
+ 298 905 299 905 302 906 c
+ 306 909 313 920 312 922 c
+ 311 923 311 926 310 929 c
+ 310 933 310 934 313 932 c
+ 315 931 317 931 317 932 c
+ 317 932 318 931 319 929 c
+ 322 926 322 926 325 930 c
+ 327 933 329 933 331 932 c
+ 334 930 341 932 344 934 c
+ 347 937 352 936 358 932 c
+ 363 928 363 928 369 931 c
+ 376 934 383 934 389 929 c
+ 391 927 395 927 401 927 c
+ 410 928 411 927 411 924 c
+ 412 922 413 919 415 919 c
+ 419 918 433 921 440 925 c
+ 443 927 445 927 446 925 c
+ 447 924 450 923 453 923 c
+ 455 923 459 922 461 920 c
+ 465 915 475 913 479 916 c
+ 481 918 481 917 481 913 c
+ 481 906 486 902 493 902 c
+ 500 902 503 899 503 893 c
+ 503 887 507 883 516 879 c
+ 519 878 523 876 523 874 c
+ 524 873 521 869 518 865 c
+ 515 862 512 858 512 857 c
+ 512 857 515 853 519 849 c
+ 525 843 526 841 528 830 c
+ 529 822 531 814 533 811 c
+ 536 806 536 806 532 803 c
+ 528 800 528 799 529 789 c
+ 530 778 530 777 526 775 c
+ 524 774 521 772 520 770 c
+ 519 768 517 765 514 763 c
+ 512 762 509 756 507 752 c
+ 506 747 503 742 502 741 c
+ 500 738 504 735 509 735 c
+ 515 735 515 729 509 725 c
+ 506 722 503 719 503 717 c
+ 503 714 510 702 514 700 c
+ 516 698 517 696 517 695 c
+ 517 691 521 689 529 689 c
+ 535 689 536 689 538 685 c
+ 548 665 548 660 539 660 c
+ 536 661 532 661 531 662 c
+ h f
+ 483 691 m
+ 483 692 482 692 481 693 c
+ 480 694 480 693 480 692 c
+ 480 691 480 690 481 690 c
+ 482 690 483 691 483 691 c
+ h f
+ 423 703 m
+ 424 704 423 705 421 705 c
+ 418 705 417 704 418 703 c
+ 418 702 420 701 421 701 c
+ 421 701 423 702 423 703 c
+ h f
+ 485 709 m
+ 485 711 484 712 482 712 c
+ 478 712 479 713 488 722 c
+ 498 731 497 734 487 726 c
+ 480 720 l
+ 472 726 l
+ 463 732 463 732 461 729 c
+ 459 727 458 723 459 721 c
+ 459 717 460 716 468 715 c
+ 476 713 478 712 478 709 c
+ 478 707 478 705 479 704 c
+ 481 702 485 706 485 709 c
+ h f
+ 423 721 m
+ 422 722 420 726 417 730 c
+ 410 742 399 741 402 728 c
+ 403 720 405 719 416 719 c
+ 422 719 424 720 423 721 c
+ h f
+ 393 728 m
+ 397 730 395 736 392 736 c
+ 388 737 385 731 387 728 c
+ 389 726 390 726 393 728 c
+ h f
+ 335 897 m
+ 335 898 334 899 333 900 c
+ 332 900 331 899 331 897 c
+ 331 896 332 895 333 895 c
+ 334 895 335 896 335 897 c
+ h f
+ 336 924 m
+ 336 925 336 927 335 928 c
+ 334 928 333 928 333 928 c
+ 333 927 332 926 332 924 c
+ 331 922 332 921 333 921 c
+ 335 921 336 923 336 924 c
+ h f
+ 261 665 m
+ 259 666 259 667 261 669 c
+ 263 672 265 670 264 666 c
+ 264 664 263 664 261 665 c
+ h f
+ 291 671 m
+ 291 672 293 672 293 671 c
+ 296 670 296 669 292 669 c
+ 291 669 290 670 291 671 c
+ h f
+ 236 675 m
+ 236 676 238 677 241 678 c
+ 243 679 245 681 245 682 c
+ 245 683 247 685 249 685 c
+ 252 686 252 688 252 693 c
+ 251 698 252 700 255 702 c
+ 259 704 259 706 257 709 c
+ 255 714 256 719 259 719 c
+ 260 719 261 717 261 716 c
+ 261 714 263 711 266 709 c
+ 268 707 271 703 271 701 c
+ 271 699 273 694 275 690 c
+ 277 685 277 682 276 680 c
+ 274 676 264 675 258 678 c
+ 252 681 247 680 250 677 c
+ 252 675 251 674 244 675 c
+ 240 675 236 675 236 675 c
+ h f
+ 232 713 m
+ 232 714 233 715 234 715 c
+ 235 715 236 715 236 714 c
+ 236 713 235 711 234 711 c
+ 233 710 232 711 232 713 c
+ h f
+ 195 739 m
+ 192 741 194 746 198 745 c
+ 200 745 201 744 202 742 c
+ 202 739 198 737 195 739 c
+ h f
+ 453 954 m
+ 451 957 451 957 454 957 c
+ 456 957 458 955 458 953 c
+ 459 949 456 949 453 954 c
+ h f
+ 441 957 m
+ 441 958 442 959 445 959 c
+ 447 959 449 958 449 957 c
+ 449 956 448 955 446 955 c
+ 444 955 442 956 441 957 c
+ h f
+ 356 979 m
+ 357 982 363 985 364 984 c
+ 365 983 365 982 364 980 c
+ 363 977 355 976 356 979 c
+ h f
+ 0.82 0.30 0.07 rg
+ 474 616 m
+ 472 617 471 619 471 621 c
+ 471 625 469 627 462 630 c
+ 458 632 452 635 450 636 c
+ 447 639 433 659 433 661 c
+ 433 662 449 663 457 663 c
+ 461 663 465 664 467 665 c
+ 469 666 472 666 475 665 c
+ 478 664 480 664 483 665 c
+ 486 667 488 667 489 665 c
+ 492 663 504 663 506 665 c
+ 506 666 510 667 513 667 c
+ 518 667 520 666 521 663 c
+ 522 660 525 658 527 657 c
+ 529 656 535 653 539 651 c
+ 548 647 550 642 543 643 c
+ 540 643 537 642 534 641 c
+ 531 638 530 636 530 630 c
+ 530 619 528 618 507 620 c
+ 491 622 489 622 485 619 c
+ 480 615 479 615 474 616 c
+ h f
+ 357 647 m
+ 356 648 357 651 360 651 c
+ 361 651 361 650 361 648 c
+ 361 645 359 645 357 647 c
+ h f
+ 280 660 m
+ 274 663 274 666 280 664 c
+ 287 663 289 660 287 658 c
+ 286 657 283 658 280 660 c
+ h f
+ 261 665 m
+ 259 666 259 667 261 669 c
+ 263 672 265 670 264 666 c
+ 264 664 263 664 261 665 c
+ h f
+ 532 670 m
+ 529 675 529 680 532 683 c
+ 535 689 542 675 539 669 c
+ 536 664 534 664 532 670 c
+ h f
+ 291 671 m
+ 291 672 293 672 293 671 c
+ 296 670 296 669 292 669 c
+ 291 669 290 670 291 671 c
+ h f
+ 470 672 m
+ 469 672 469 676 469 680 c
+ 469 683 468 687 467 688 c
+ 466 689 466 689 467 690 c
+ 469 692 469 692 466 693 c
+ 457 696 453 698 453 699 c
+ 453 700 455 703 457 706 c
+ 460 710 462 710 467 709 c
+ 473 708 478 701 478 694 c
+ 478 689 481 688 484 690 c
+ 486 692 486 693 485 696 c
+ 483 698 483 700 486 703 c
+ 487 705 489 709 489 712 c
+ 489 717 502 731 507 731 c
+ 512 731 511 729 506 725 c
+ 503 724 501 721 501 719 c
+ 501 713 510 696 516 691 c
+ 520 688 523 685 523 684 c
+ 523 682 511 678 509 679 c
+ 507 679 504 678 502 675 c
+ 498 670 l
+ 497 674 l
+ 497 677 497 680 497 682 c
+ 497 685 495 686 490 684 c
+ 488 684 487 682 487 681 c
+ 487 679 485 678 483 678 c
+ 481 678 477 676 475 674 c
+ 473 672 471 671 470 672 c
+ h f
+ 236 675 m
+ 236 676 238 677 241 678 c
+ 243 679 245 681 245 682 c
+ 245 683 247 685 249 685 c
+ 252 686 252 688 252 693 c
+ 251 698 252 700 255 702 c
+ 258 704 259 706 257 708 c
+ 255 713 255 714 258 714 c
+ 261 714 272 702 272 700 c
+ 271 699 273 695 274 691 c
+ 277 685 277 682 276 680 c
+ 274 676 264 675 258 678 c
+ 252 681 247 680 250 677 c
+ 252 675 251 674 244 675 c
+ 240 675 236 675 236 675 c
+ h f
+ 413 693 m
+ 408 697 406 698 408 699 c
+ 410 699 412 701 413 703 c
+ 415 705 416 705 417 703 c
+ 418 701 420 701 422 702 c
+ 425 703 425 703 421 705 c
+ 416 708 413 708 407 704 c
+ 401 701 390 702 390 706 c
+ 390 709 386 709 385 705 c
+ 385 703 383 701 381 700 c
+ 379 698 377 698 375 701 c
+ 371 705 369 705 364 701 c
+ 360 698 345 697 336 700 c
+ 333 701 333 702 335 705 c
+ 337 708 337 709 335 709 c
+ 334 710 333 711 333 713 c
+ 333 717 328 718 324 714 c
+ 320 711 320 711 323 717 c
+ 325 723 326 723 332 723 c
+ 335 723 340 722 341 720 c
+ 343 718 345 717 346 717 c
+ 349 717 347 721 343 725 c
+ 339 729 338 730 340 734 c
+ 341 737 343 741 345 743 c
+ 347 745 347 746 346 748 c
+ 344 750 342 750 338 747 c
+ 334 745 332 745 328 746 c
+ 326 747 322 748 320 748 c
+ 318 748 314 749 311 751 c
+ 305 756 295 755 290 750 c
+ 286 747 285 747 285 752 c
+ 285 757 284 758 280 758 c
+ 276 759 275 760 275 763 c
+ 276 768 272 770 270 767 c
+ 268 766 268 765 270 762 c
+ 271 760 271 758 270 757 c
+ 269 757 268 755 268 753 c
+ 268 746 253 741 249 746 c
+ 248 748 247 753 246 758 c
+ 246 766 l
+ 239 766 l
+ 234 765 232 766 230 770 c
+ 227 774 226 774 217 773 c
+ 207 772 206 772 195 781 c
+ 189 785 183 789 182 789 c
+ 180 789 178 791 176 793 c
+ 173 796 173 799 173 812 c
+ 173 822 173 828 172 829 c
+ 171 830 170 832 170 835 c
+ 170 837 169 839 168 840 c
+ 167 841 166 846 167 855 c
+ 168 862 167 875 166 882 c
+ 164 898 164 900 172 905 c
+ 177 909 180 910 206 911 c
+ 207 911 210 918 212 925 c
+ 213 929 215 930 217 926 c
+ 219 920 236 918 236 924 c
+ 236 925 239 926 247 926 c
+ 253 926 258 927 260 928 c
+ 262 930 263 930 265 926 c
+ 266 924 269 921 272 921 c
+ 274 920 278 919 279 919 c
+ 281 918 283 919 283 922 c
+ 285 927 291 925 291 919 c
+ 292 916 293 911 295 909 c
+ 298 905 299 905 302 906 c
+ 306 909 313 920 312 922 c
+ 311 923 311 926 310 929 c
+ 310 933 310 934 313 932 c
+ 315 931 317 931 317 932 c
+ 317 932 318 931 320 929 c
+ 324 924 l
+ 325 929 l
+ 328 935 331 934 331 927 c
+ 331 922 332 921 334 922 c
+ 336 922 337 924 337 927 c
+ 337 931 337 932 340 932 c
+ 342 932 344 933 344 934 c
+ 346 937 352 936 358 932 c
+ 363 928 363 928 369 931 c
+ 376 934 383 934 389 929 c
+ 391 927 395 927 401 927 c
+ 410 928 411 927 411 924 c
+ 412 922 413 919 415 919 c
+ 419 918 433 921 440 925 c
+ 443 927 445 927 446 925 c
+ 447 924 450 923 453 923 c
+ 455 923 459 922 461 920 c
+ 465 915 475 913 479 916 c
+ 482 918 482 918 481 913 c
+ 480 908 480 907 484 905 c
+ 486 903 490 902 492 902 c
+ 498 902 501 900 501 895 c
+ 501 890 507 883 515 880 c
+ 525 876 526 873 516 863 c
+ 509 858 508 855 509 853 c
+ 510 852 512 852 513 852 c
+ 514 852 518 850 520 847 c
+ 525 844 526 840 528 830 c
+ 529 822 531 814 533 812 c
+ 534 809 535 806 535 806 c
+ 535 806 532 804 530 803 c
+ 527 801 526 800 527 795 c
+ 528 792 529 786 529 783 c
+ 530 778 530 776 528 776 c
+ 525 776 507 758 506 754 c
+ 504 747 496 742 488 741 c
+ 482 740 481 739 480 735 c
+ 479 729 474 728 468 732 c
+ 465 735 464 735 459 731 c
+ 456 729 452 728 450 729 c
+ 448 730 446 729 443 726 c
+ 439 721 l
+ 430 725 l
+ 425 728 420 732 419 734 c
+ 418 736 415 740 413 743 c
+ 409 747 408 748 405 746 c
+ 403 745 399 744 395 744 c
+ 392 744 387 742 384 740 c
+ 377 736 377 736 361 740 c
+ 358 741 356 740 355 736 c
+ 353 732 353 731 359 727 c
+ 364 724 368 723 371 723 c
+ 373 724 376 724 377 723 c
+ 377 722 380 721 382 722 c
+ 385 723 388 722 390 720 c
+ 393 717 397 716 409 716 c
+ 428 715 432 714 430 710 c
+ 430 709 429 705 428 702 c
+ 427 698 428 697 432 696 c
+ 439 695 438 690 431 690 c
+ 427 690 423 690 422 689 c
+ 421 689 416 691 413 693 c
+ h f
+ 349 703 m
+ 349 704 348 705 347 705 c
+ 346 705 345 704 344 703 c
+ 344 702 345 701 346 701 c
+ 348 701 349 702 349 703 c
+ h f
+ 338 897 m
+ 339 899 339 900 335 901 c
+ 331 903 331 903 331 899 c
+ 331 894 335 893 338 897 c
+ h f
+ 471 909 m
+ 468 913 465 913 464 908 c
+ 463 906 465 905 468 905 c
+ 472 905 472 906 471 909 c
+ h f
+ 232 712 m
+ 232 713 233 714 234 714 c
+ 235 714 236 713 235 712 c
+ 235 711 234 710 233 710 c
+ 233 710 232 711 232 712 c
+ h f
+ 292 726 m
+ 292 727 293 728 294 728 c
+ 295 728 296 727 297 726 c
+ 297 725 296 724 294 724 c
+ 293 724 292 725 292 726 c
+ h f
+ 453 954 m
+ 452 956 452 957 452 957 c
+ 453 957 455 956 456 954 c
+ 457 952 458 950 457 950 c
+ 456 950 454 952 453 954 c
+ h f
+ 441 957 m
+ 441 958 442 959 445 959 c
+ 447 959 449 958 449 957 c
+ 449 956 448 955 446 955 c
+ 444 955 442 956 441 957 c
+ h f
+ 357 979 m
+ 357 980 359 982 361 982 c
+ 364 982 365 982 364 980 c
+ 363 976 355 976 357 979 c
+ h f
+ 0.90 0.18 0.04 rg
+ 473 623 m
+ 471 627 467 630 457 635 c
+ 451 637 434 657 437 659 c
+ 444 662 453 664 468 664 c
+ 483 663 486 663 488 660 c
+ 490 658 491 658 492 659 c
+ 494 661 497 662 499 662 c
+ 502 662 506 663 508 664 c
+ 514 669 523 666 522 659 c
+ 522 658 525 656 529 654 c
+ 537 650 538 646 534 641 c
+ 532 639 530 634 529 631 c
+ 527 620 523 619 505 620 c
+ 496 621 489 621 487 620 c
+ 481 617 474 618 473 623 c
+ h f
+ 532 670 m
+ 529 675 529 680 532 683 c
+ 533 685 534 685 536 683 c
+ 538 681 539 679 538 674 c
+ 538 665 534 663 532 670 c
+ h f
+ 471 677 m
+ 472 678 473 682 473 685 c
+ 473 690 473 690 476 688 c
+ 480 686 487 688 487 690 c
+ 487 691 486 694 485 695 c
+ 483 698 483 700 486 703 c
+ 487 705 489 709 489 711 c
+ 489 716 503 731 507 731 c
+ 511 731 511 729 506 725 c
+ 503 724 501 721 501 719 c
+ 501 713 510 697 515 691 c
+ 518 688 521 685 521 684 c
+ 521 681 515 679 506 679 c
+ 501 679 499 680 498 683 c
+ 496 687 490 687 487 682 c
+ 486 681 483 680 481 680 c
+ 479 680 476 678 474 676 c
+ 470 673 470 673 471 677 c
+ h f
+ 415 694 m
+ 411 697 l
+ 418 697 l
+ 427 697 432 693 426 691 c
+ 420 690 420 690 415 694 c
+ h f
+ 459 697 m
+ 454 700 454 703 458 707 c
+ 463 712 472 709 474 703 c
+ 475 701 476 698 475 697 c
+ 472 694 463 694 459 697 c
+ h f
+ 376 702 m
+ 373 705 366 706 364 703 c
+ 362 699 354 701 352 706 c
+ 352 708 350 710 348 710 c
+ 345 710 341 705 343 703 c
+ 343 702 343 701 341 701 c
+ 340 701 338 703 337 706 c
+ 335 714 331 719 327 719 c
+ 325 719 324 720 324 721 c
+ 325 724 338 724 341 720 c
+ 343 718 345 717 346 717 c
+ 349 717 347 721 343 725 c
+ 339 729 338 730 340 734 c
+ 341 737 343 741 345 743 c
+ 347 745 347 746 346 748 c
+ 344 750 342 750 338 747 c
+ 334 745 332 745 328 746 c
+ 326 747 322 748 320 748 c
+ 318 748 314 749 312 751 c
+ 306 755 300 756 293 752 c
+ 286 749 287 749 286 753 c
+ 285 756 284 758 280 758 c
+ 276 759 275 760 275 763 c
+ 276 768 272 770 270 767 c
+ 268 766 268 765 270 762 c
+ 271 760 271 758 270 757 c
+ 269 757 268 755 268 753 c
+ 268 746 253 741 249 746 c
+ 248 748 247 753 246 758 c
+ 246 766 l
+ 239 766 l
+ 234 765 232 766 230 770 c
+ 227 774 226 774 217 773 c
+ 207 772 206 772 195 781 c
+ 189 785 183 789 182 789 c
+ 177 789 171 798 173 802 c
+ 175 809 173 830 169 838 c
+ 166 844 166 846 168 849 c
+ 170 852 170 858 169 873 c
+ 167 895 168 898 177 904 c
+ 184 908 199 908 202 904 c
+ 206 900 209 901 213 910 c
+ 217 918 l
+ 225 917 l
+ 235 915 239 913 241 909 c
+ 242 907 245 905 247 905 c
+ 250 905 254 913 253 918 c
+ 252 920 253 921 256 922 c
+ 261 924 264 921 261 917 c
+ 260 915 260 914 261 911 c
+ 265 906 269 906 266 911 c
+ 264 915 268 917 276 915 c
+ 280 915 283 915 284 916 c
+ 285 919 287 918 290 912 c
+ 293 903 299 899 304 902 c
+ 306 903 308 904 308 905 c
+ 308 906 310 909 313 912 c
+ 317 916 319 917 325 916 c
+ 332 916 333 916 329 913 c
+ 327 911 326 907 325 903 c
+ 325 896 325 895 330 893 c
+ 334 891 336 891 341 894 c
+ 346 896 348 898 348 902 c
+ 348 905 347 906 343 907 c
+ 337 907 337 909 342 913 c
+ 346 916 346 916 343 921 c
+ 341 924 340 927 340 928 c
+ 340 929 341 930 343 931 c
+ 345 932 347 933 348 933 c
+ 350 934 351 932 351 928 c
+ 352 922 356 919 356 925 c
+ 356 928 357 929 364 929 c
+ 368 929 372 930 374 931 c
+ 377 934 378 934 383 929 c
+ 388 925 389 925 399 926 c
+ 409 927 410 927 410 923 c
+ 411 916 415 916 439 923 c
+ 442 923 442 923 441 914 c
+ 440 905 l
+ 448 906 l
+ 452 907 456 908 458 909 c
+ 459 911 460 910 462 906 c
+ 464 900 468 899 474 903 c
+ 478 905 478 905 483 902 c
+ 486 901 490 899 493 898 c
+ 498 897 499 896 499 891 c
+ 500 887 499 886 495 885 c
+ 493 884 490 882 490 881 c
+ 490 879 492 878 494 879 c
+ 503 882 507 882 507 881 c
+ 508 873 507 860 506 859 c
+ 503 857 505 854 510 852 c
+ 520 847 525 840 528 824 c
+ 531 809 531 808 528 802 c
+ 525 797 525 795 526 788 c
+ 528 780 l
+ 518 770 l
+ 513 764 507 757 506 754 c
+ 502 746 497 742 488 741 c
+ 482 740 481 739 480 735 c
+ 479 729 474 728 468 732 c
+ 465 735 464 735 459 731 c
+ 456 729 452 728 450 729 c
+ 448 730 446 729 443 726 c
+ 439 721 l
+ 430 725 l
+ 425 728 420 732 419 734 c
+ 418 736 415 740 413 743 c
+ 409 747 408 748 405 746 c
+ 403 745 399 744 395 744 c
+ 392 744 387 742 384 740 c
+ 377 736 377 736 361 740 c
+ 358 741 356 740 355 736 c
+ 353 732 353 731 358 728 c
+ 364 724 367 723 382 722 c
+ 385 722 389 720 391 719 c
+ 393 717 396 716 399 716 c
+ 429 715 432 715 430 710 c
+ 430 707 427 707 419 707 c
+ 413 708 406 707 403 706 c
+ 399 704 396 704 393 706 c
+ 388 709 388 709 384 704 c
+ 380 698 379 698 376 702 c
+ h f
+ 483 878 m
+ 483 882 480 886 477 886 c
+ 474 886 474 880 476 877 c
+ 480 874 483 874 483 878 c
+ h f
+ 374 893 m
+ 374 894 374 895 373 895 c
+ 373 895 372 894 371 893 c
+ 371 892 371 891 372 891 c
+ 373 891 374 892 374 893 c
+ h f
+ 438 896 m
+ 438 897 438 898 437 898 c
+ 436 898 435 897 435 896 c
+ 435 895 436 895 437 895 c
+ 438 895 438 895 438 896 c
+ h f
+ 363 913 m
+ 364 915 359 920 356 920 c
+ 354 920 354 915 356 913 c
+ 359 910 361 910 363 913 c
+ h f
+ 514 873 m
+ 514 874 515 875 516 875 c
+ 518 875 519 874 519 873 c
+ 519 872 518 871 516 871 c
+ 515 871 514 872 514 873 c
+ h f
+ 473 911 m
+ 473 912 474 912 475 912 c
+ 477 912 478 912 478 911 c
+ 478 910 477 909 476 909 c
+ 475 909 474 910 473 911 c
+ h f
+ 0.81 0.17 0.06 rg
+ 473 623 m
+ 471 627 467 630 457 635 c
+ 451 637 434 657 437 659 c
+ 444 662 453 664 468 664 c
+ 483 663 486 663 488 660 c
+ 490 658 491 658 492 659 c
+ 494 661 496 662 498 662 c
+ 500 662 505 663 509 664 c
+ 517 667 519 667 521 661 c
+ 522 658 525 655 529 654 c
+ 535 651 539 647 536 644 c
+ 536 644 533 643 530 643 c
+ 528 643 526 642 526 641 c
+ 529 628 528 625 525 622 c
+ 520 618 510 619 501 623 c
+ 494 627 491 626 486 622 c
+ 479 617 475 618 473 623 c
+ h f
+ 533 673 m
+ 531 681 531 682 535 678 c
+ 538 676 539 673 538 672 c
+ 537 668 534 668 533 673 c
+ h f
+ 471 677 m
+ 472 678 473 682 473 685 c
+ 473 690 473 690 477 688 c
+ 486 684 488 680 481 680 c
+ 479 680 476 678 474 676 c
+ 470 673 470 673 471 677 c
+ h f
+ 500 680 m
+ 501 683 505 684 505 682 c
+ 505 681 503 679 502 679 c
+ 500 678 499 679 500 680 c
+ h f
+ 492 693 m
+ 494 696 495 697 497 695 c
+ 501 692 498 688 493 688 c
+ 489 688 489 689 492 693 c
+ h f
+ 415 694 m
+ 411 697 l
+ 418 697 l
+ 427 697 432 693 426 691 c
+ 420 690 420 690 415 694 c
+ h f
+ 459 698 m
+ 455 701 458 705 465 705 c
+ 472 705 474 704 474 699 c
+ 474 696 473 696 468 696 c
+ 465 696 461 697 459 698 c
+ h f
+ 376 702 m
+ 373 705 366 706 364 703 c
+ 362 699 354 701 352 706 c
+ 352 708 350 710 348 710 c
+ 345 710 341 705 343 703 c
+ 343 702 342 701 341 701 c
+ 339 701 338 702 338 703 c
+ 338 706 345 712 349 712 c
+ 352 712 355 713 357 714 c
+ 363 719 368 718 369 713 c
+ 370 710 372 708 375 707 c
+ 378 706 379 705 379 703 c
+ 379 699 379 698 376 702 c
+ h f
+ 493 703 m
+ 492 704 493 706 493 708 c
+ 494 710 493 713 492 714 c
+ 491 716 491 717 493 719 c
+ 495 721 496 720 498 717 c
+ 499 715 500 713 499 713 c
+ 499 713 499 711 500 708 c
+ 502 703 496 698 493 703 c
+ h f
+ 393 706 m
+ 391 709 401 715 404 714 c
+ 411 712 412 709 406 707 c
+ 400 704 394 704 393 706 c
+ h f
+ 379 714 m
+ 379 720 382 722 386 719 c
+ 388 717 388 716 386 713 c
+ 384 708 379 709 379 714 c
+ h f
+ 333 715 m
+ 332 717 330 719 328 719 c
+ 326 719 325 719 326 720 c
+ 328 722 340 717 339 715 c
+ 338 711 335 712 333 715 c
+ h f
+ 346 739 m
+ 347 742 351 743 351 740 c
+ 351 738 349 737 348 737 c
+ 346 737 345 738 346 739 c
+ h f
+ 422 749 m
+ 419 755 418 757 414 757 c
+ 409 757 400 753 399 751 c
+ 397 749 383 745 374 745 c
+ 363 746 357 748 354 753 c
+ 351 759 348 759 338 757 c
+ 335 756 328 756 322 756 c
+ 317 757 313 758 314 758 c
+ 317 758 315 767 312 767 c
+ 311 767 307 765 304 763 c
+ 296 758 293 757 293 762 c
+ 293 766 278 774 267 775 c
+ 261 776 259 776 259 774 c
+ 259 770 260 770 251 774 c
+ 244 776 243 776 240 772 c
+ 236 768 232 769 236 774 c
+ 239 777 239 777 232 780 c
+ 227 783 226 783 208 779 c
+ 200 777 197 780 197 791 c
+ 197 792 195 795 192 796 c
+ 188 798 187 798 183 795 c
+ 179 792 179 792 177 797 c
+ 176 800 175 808 174 816 c
+ 174 823 173 832 173 835 c
+ 172 837 172 840 172 841 c
+ 172 842 170 843 169 843 c
+ 166 843 165 847 168 849 c
+ 170 850 170 856 169 871 c
+ 168 895 168 898 177 904 c
+ 184 908 199 908 202 904 c
+ 206 900 209 901 213 910 c
+ 217 918 l
+ 225 917 l
+ 235 915 239 913 241 909 c
+ 242 907 245 905 247 905 c
+ 250 905 254 913 253 918 c
+ 252 920 253 921 256 922 c
+ 261 924 264 921 261 917 c
+ 260 915 260 914 261 911 c
+ 265 906 269 906 266 911 c
+ 264 915 268 917 276 915 c
+ 280 915 283 915 284 916 c
+ 285 919 287 918 290 912 c
+ 293 903 299 899 304 902 c
+ 306 903 308 904 308 905 c
+ 308 906 310 909 313 912 c
+ 317 916 319 917 325 916 c
+ 332 916 333 916 329 913 c
+ 327 911 326 907 325 903 c
+ 325 896 325 895 330 893 c
+ 334 891 336 891 341 894 c
+ 346 896 348 898 348 902 c
+ 348 905 347 906 343 907 c
+ 337 907 337 909 342 913 c
+ 346 916 346 916 343 921 c
+ 341 924 340 927 340 928 c
+ 340 929 341 930 343 931 c
+ 345 932 347 933 348 933 c
+ 350 934 351 932 351 928 c
+ 352 922 356 919 356 925 c
+ 356 928 357 929 364 929 c
+ 368 929 372 930 374 931 c
+ 377 934 378 934 383 929 c
+ 388 925 389 925 399 926 c
+ 409 927 410 927 410 923 c
+ 411 916 415 916 439 923 c
+ 442 923 442 923 441 914 c
+ 440 905 l
+ 448 906 l
+ 452 907 456 908 458 909 c
+ 459 911 460 910 462 906 c
+ 464 900 468 899 474 903 c
+ 478 905 478 905 483 902 c
+ 486 901 490 899 493 898 c
+ 498 897 499 896 499 891 c
+ 500 887 499 886 495 885 c
+ 493 884 490 882 490 881 c
+ 490 879 492 878 494 879 c
+ 503 882 507 882 507 881 c
+ 508 870 507 860 505 859 c
+ 502 858 505 854 510 852 c
+ 520 847 525 840 528 823 c
+ 532 808 l
+ 528 804 l
+ 524 801 524 801 526 790 c
+ 528 779 l
+ 521 773 l
+ 517 769 510 765 507 764 c
+ 500 762 500 762 501 756 c
+ 501 750 501 749 497 748 c
+ 493 747 491 748 490 750 c
+ 488 752 486 753 485 753 c
+ 482 753 471 747 471 745 c
+ 471 742 457 740 452 743 c
+ 450 744 445 746 441 747 c
+ 436 748 434 747 431 744 c
+ 426 739 425 739 422 749 c
+ h f
+ 483 878 m
+ 483 882 480 886 477 886 c
+ 474 886 474 880 476 877 c
+ 480 874 483 874 483 878 c
+ h f
+ 374 893 m
+ 374 894 374 895 373 895 c
+ 373 895 372 894 371 893 c
+ 371 892 371 891 372 891 c
+ 373 891 374 892 374 893 c
+ h f
+ 438 896 m
+ 438 897 438 898 437 898 c
+ 436 898 435 897 435 896 c
+ 435 895 436 895 437 895 c
+ 438 895 438 895 438 896 c
+ h f
+ 363 913 m
+ 364 915 359 920 356 920 c
+ 354 920 354 915 356 913 c
+ 359 910 361 910 363 913 c
+ h f
+ 514 873 m
+ 514 874 515 875 516 875 c
+ 518 875 519 874 519 873 c
+ 519 872 518 871 516 871 c
+ 515 871 514 872 514 873 c
+ h f
+ 473 911 m
+ 473 912 474 912 475 912 c
+ 477 912 478 912 478 911 c
+ 478 910 477 909 476 909 c
+ 475 909 474 910 473 911 c
+ h f
+ 0.80 0.09 0.02 rg
+ 474 627 m
+ 473 629 470 631 469 631 c
+ 467 631 465 632 464 634 c
+ 464 635 462 637 460 637 c
+ 458 638 456 640 456 642 c
+ 455 644 453 645 450 645 c
+ 447 645 445 647 443 651 c
+ 441 654 440 657 441 657 c
+ 441 657 444 659 447 660 c
+ 450 662 454 663 454 663 c
+ 455 662 462 662 469 661 c
+ 479 661 483 660 484 659 c
+ 485 656 491 656 497 658 c
+ 500 660 502 660 507 657 c
+ 511 656 515 655 516 656 c
+ 518 656 521 654 525 651 c
+ 530 646 530 645 528 644 c
+ 525 642 525 640 525 636 c
+ 526 633 526 631 524 631 c
+ 523 631 523 630 524 628 c
+ 525 623 520 621 513 624 c
+ 507 626 486 626 484 624 c
+ 482 621 477 622 474 627 c
+ h f
+ 462 703 m
+ 462 704 463 705 464 705 c
+ 465 705 465 704 464 703 c
+ 464 702 463 701 463 701 c
+ 462 701 462 702 462 703 c
+ h f
+ 357 708 m
+ 358 709 359 712 359 714 c
+ 360 716 361 717 362 717 c
+ 363 717 363 716 362 715 c
+ 362 714 363 713 366 712 c
+ 371 709 372 707 366 706 c
+ 359 704 356 704 357 708 c
+ h f
+ 495 709 m
+ 494 711 494 713 495 713 c
+ 496 715 499 712 499 709 c
+ 499 705 496 706 495 709 c
+ h f
+ 452 743 m
+ 450 744 445 746 441 747 c
+ 435 748 433 747 432 745 c
+ 431 742 426 741 424 743 c
+ 423 744 423 746 425 747 c
+ 426 750 426 750 425 749 c
+ 423 748 422 749 420 752 c
+ 419 755 417 757 414 757 c
+ 409 757 399 753 399 751 c
+ 399 750 398 750 396 750 c
+ 394 751 388 750 382 747 c
+ 374 744 371 744 367 746 c
+ 365 747 362 748 360 748 c
+ 358 748 356 750 355 752 c
+ 352 759 345 761 337 757 c
+ 330 754 323 755 325 759 c
+ 326 762 324 763 321 760 c
+ 318 757 315 759 315 764 c
+ 315 768 312 768 305 764 c
+ 300 760 293 760 293 764 c
+ 293 766 275 774 267 775 c
+ 261 776 259 776 259 774 c
+ 259 772 258 771 256 772 c
+ 255 772 253 773 252 773 c
+ 251 773 251 774 252 775 c
+ 253 779 247 779 244 776 c
+ 242 775 240 775 236 778 c
+ 230 782 215 785 215 782 c
+ 215 779 210 780 205 784 c
+ 202 786 199 788 198 787 c
+ 198 787 197 788 197 790 c
+ 197 791 197 794 199 794 c
+ 200 795 200 796 200 797 c
+ 199 798 198 797 197 796 c
+ 195 794 195 794 192 796 c
+ 191 797 188 798 186 797 c
+ 180 795 178 800 177 812 c
+ 177 828 176 834 172 840 c
+ 170 843 170 845 171 848 c
+ 174 852 174 872 172 874 c
+ 171 874 171 879 171 884 c
+ 171 893 171 894 176 894 c
+ 179 895 180 896 180 898 c
+ 180 900 181 902 183 903 c
+ 186 906 195 906 198 903 c
+ 203 899 212 896 215 898 c
+ 217 899 217 901 217 904 c
+ 216 907 217 909 220 911 c
+ 224 916 232 914 241 907 c
+ 248 901 252 902 255 908 c
+ 256 911 256 911 260 907 c
+ 265 903 270 902 271 907 c
+ 272 911 275 912 277 908 c
+ 277 906 279 906 282 906 c
+ 284 907 287 906 291 903 c
+ 299 896 305 897 310 905 c
+ 318 917 325 914 322 900 c
+ 319 891 322 889 336 890 c
+ 343 891 349 892 350 893 c
+ 351 894 351 898 352 902 c
+ 352 910 352 910 358 909 c
+ 361 909 364 910 365 911 c
+ 367 914 367 915 363 920 c
+ 358 926 359 927 367 926 c
+ 391 923 395 922 402 924 c
+ 406 925 407 924 408 920 c
+ 410 916 411 916 417 917 c
+ 436 920 438 920 438 917 c
+ 438 916 436 912 433 910 c
+ 428 905 427 905 428 895 c
+ 429 888 428 884 426 882 c
+ 423 879 424 877 428 877 c
+ 431 877 432 877 431 880 c
+ 430 883 431 885 437 889 c
+ 441 891 444 895 444 896 c
+ 444 901 450 906 455 905 c
+ 457 905 460 902 463 897 c
+ 465 893 467 889 468 887 c
+ 469 886 471 882 472 878 c
+ 474 872 475 872 482 871 c
+ 487 870 489 870 492 873 c
+ 496 877 503 878 503 874 c
+ 503 873 501 870 500 867 c
+ 494 861 498 853 510 848 c
+ 515 846 520 843 522 841 c
+ 523 839 526 831 527 823 c
+ 529 811 529 808 527 807 c
+ 523 804 521 792 523 790 c
+ 528 784 520 772 506 765 c
+ 502 763 500 760 500 759 c
+ 501 755 498 753 490 753 c
+ 483 753 474 749 469 745 c
+ 468 743 465 742 462 743 c
+ 460 744 458 743 458 742 c
+ 458 740 456 740 452 743 c
+ h f
+ 415 875 m
+ 418 879 414 882 407 883 c
+ 401 883 400 880 404 876 c
+ 407 872 412 872 415 875 c
+ h f
+ 377 890 m
+ 379 892 378 894 374 898 c
+ 368 904 l
+ 367 898 l
+ 367 895 367 891 368 890 c
+ 369 887 375 887 377 890 c
+ h f
+ 480 889 m
+ 474 892 473 896 476 899 c
+ 478 901 480 900 486 897 c
+ 497 891 498 891 496 889 c
+ 493 886 486 886 480 889 c
+ h f
+ 0.68 0.08 0.02 rg
+ 516 626 m
+ 512 628 515 631 519 631 c
+ 522 631 523 630 522 628 c
+ 522 625 519 624 516 626 c
+ h f
+ 473 633 m
+ 460 637 456 640 458 643 c
+ 459 644 459 647 459 649 c
+ 457 656 460 657 480 657 c
+ 494 657 501 656 503 654 c
+ 506 653 509 651 511 650 c
+ 514 649 515 647 511 644 c
+ 510 642 508 640 508 639 c
+ 508 635 500 633 493 634 c
+ 489 634 487 634 485 632 c
+ 482 629 483 629 473 633 c
+ h f
+ 448 659 m
+ 448 662 452 664 455 662 c
+ 458 661 457 658 452 658 c
+ 450 657 448 658 448 659 c
+ h f
+ 457 755 m
+ 457 756 455 757 453 757 c
+ 451 757 449 758 449 759 c
+ 449 762 442 763 417 765 c
+ 406 766 403 767 399 770 c
+ 396 773 394 774 393 773 c
+ 393 773 391 773 389 774 c
+ 386 776 385 775 382 773 c
+ 381 771 380 768 380 767 c
+ 381 765 379 766 373 770 c
+ 364 775 363 775 353 775 c
+ 347 774 340 774 338 775 c
+ 334 777 332 777 331 775 c
+ 330 772 329 772 328 775 c
+ 326 780 317 783 313 780 c
+ 310 778 308 778 305 782 c
+ 303 784 299 785 296 785 c
+ 290 785 284 788 284 792 c
+ 284 794 283 796 282 797 c
+ 280 800 274 800 274 798 c
+ 274 795 266 789 263 789 c
+ 262 789 261 791 260 793 c
+ 260 795 256 799 251 802 c
+ 242 808 234 816 234 820 c
+ 234 822 232 823 224 823 c
+ 216 822 213 821 210 818 c
+ 208 816 204 814 203 814 c
+ 199 814 198 819 201 822 c
+ 205 824 205 824 201 826 c
+ 199 826 193 829 188 831 c
+ 179 835 178 836 179 841 c
+ 180 845 178 855 174 860 c
+ 173 862 174 864 176 865 c
+ 186 872 186 875 177 877 c
+ 173 878 171 880 171 885 c
+ 169 892 171 896 174 893 c
+ 177 891 178 892 181 899 c
+ 184 906 191 907 199 902 c
+ 202 900 206 898 208 898 c
+ 209 898 213 895 216 892 c
+ 219 888 222 886 223 886 c
+ 227 886 227 888 224 893 c
+ 219 899 218 905 220 909 c
+ 222 913 235 912 241 906 c
+ 248 900 251 900 254 906 c
+ 256 911 l
+ 260 907 l
+ 265 903 270 902 271 907 c
+ 273 912 274 912 279 905 c
+ 283 900 283 900 285 902 c
+ 287 905 288 905 291 901 c
+ 299 896 305 897 310 905 c
+ 313 909 315 912 316 912 c
+ 316 912 318 911 320 909 c
+ 323 906 323 906 321 901 c
+ 318 896 317 884 320 884 c
+ 320 884 322 885 324 886 c
+ 325 888 331 889 336 890 c
+ 343 891 345 891 345 889 c
+ 345 886 349 884 354 884 c
+ 356 884 356 884 354 888 c
+ 352 890 351 895 352 901 c
+ 352 910 l
+ 358 909 l
+ 361 909 364 910 365 911 c
+ 367 914 365 922 362 925 c
+ 359 927 359 927 363 927 c
+ 365 927 368 926 371 925 c
+ 373 924 377 923 380 922 c
+ 382 922 387 919 390 916 c
+ 393 913 397 911 397 911 c
+ 400 911 401 918 399 920 c
+ 398 921 397 921 399 922 c
+ 400 923 401 922 401 921 c
+ 401 920 402 920 404 920 c
+ 406 921 408 920 409 918 c
+ 410 916 416 916 429 919 c
+ 432 920 433 919 433 916 c
+ 432 914 430 911 428 908 c
+ 425 905 424 903 425 896 c
+ 426 890 426 888 423 885 c
+ 419 882 418 882 413 884 c
+ 405 886 385 884 384 881 c
+ 383 879 385 878 388 876 c
+ 390 875 394 873 395 871 c
+ 397 868 399 868 405 868 c
+ 409 868 414 868 417 867 c
+ 420 866 423 867 427 869 c
+ 432 871 433 873 432 878 c
+ 432 884 433 885 438 886 c
+ 443 888 444 889 444 894 c
+ 444 904 455 909 461 901 c
+ 463 897 463 895 462 893 c
+ 459 888 460 887 466 886 c
+ 469 886 470 885 470 880 c
+ 471 875 472 873 476 871 c
+ 479 869 483 868 484 868 c
+ 486 868 489 864 492 861 c
+ 495 855 500 852 508 849 c
+ 522 842 525 839 525 828 c
+ 525 823 526 819 527 818 c
+ 530 815 528 810 519 806 c
+ 511 802 510 801 512 798 c
+ 513 796 515 794 516 794 c
+ 517 793 517 792 515 788 c
+ 513 786 512 782 513 781 c
+ 514 776 508 774 498 777 c
+ 493 778 488 780 487 781 c
+ 484 784 480 784 479 782 c
+ 478 780 477 775 477 770 c
+ 477 760 477 759 471 758 c
+ 468 757 465 756 464 755 c
+ 463 752 459 752 457 755 c
+ h f
+ 376 889 m
+ 380 892 381 900 378 900 c
+ 377 900 375 902 373 904 c
+ 371 907 370 908 369 905 c
+ 368 904 367 900 367 898 c
+ 367 895 365 891 363 888 c
+ 359 883 l
+ 366 885 l
+ 370 885 374 887 376 889 c
+ h f
+ 237 889 m
+ 236 890 235 891 234 891 c
+ 233 891 233 890 234 888 c
+ 237 885 239 886 237 889 c
+ h f
+ 363 899 m
+ 363 902 360 904 358 903 c
+ 357 901 359 896 361 896 c
+ 362 896 363 897 363 899 c
+ h f
+ 394 903 m
+ 394 905 388 911 386 911 c
+ 385 911 383 905 384 903 c
+ 385 901 394 901 394 903 c
+ h f
+ 493 868 m
+ 489 871 491 874 497 875 c
+ 502 876 502 876 500 870 c
+ 499 865 498 865 493 868 c
+ h f
+ 0.56 0.05 0.02 rg
+ 466 787 m
+ 465 791 468 791 427 788 c
+ 423 788 414 789 406 791 c
+ 399 793 391 794 388 794 c
+ 386 794 381 795 378 797 c
+ 376 798 373 799 372 799 c
+ 372 798 363 798 353 797 c
+ 338 796 336 796 333 799 c
+ 328 804 317 806 313 802 c
+ 310 799 309 799 303 806 c
+ 298 813 297 813 293 811 c
+ 287 807 282 809 281 814 c
+ 281 818 280 818 267 817 c
+ 250 815 245 817 245 826 c
+ 244 832 243 833 238 834 c
+ 232 836 231 838 234 840 c
+ 237 842 236 844 232 845 c
+ 225 847 218 855 220 858 c
+ 222 860 221 862 220 866 c
+ 216 876 217 878 225 877 c
+ 231 876 233 874 236 871 c
+ 238 866 238 866 234 863 c
+ 232 861 231 859 232 858 c
+ 233 857 236 859 239 861 c
+ 242 863 243 866 243 869 c
+ 242 874 245 875 253 872 c
+ 256 871 258 872 261 874 c
+ 265 877 265 878 263 882 c
+ 262 884 262 886 263 886 c
+ 266 888 265 892 262 893 c
+ 260 894 261 894 265 894 c
+ 273 895 284 890 287 886 c
+ 288 884 291 882 293 882 c
+ 297 882 297 881 296 877 c
+ 295 873 296 871 298 870 c
+ 300 869 300 868 299 863 c
+ 296 858 296 858 303 856 c
+ 307 855 308 856 311 862 c
+ 313 868 315 870 320 871 c
+ 325 873 327 874 328 877 c
+ 328 879 330 882 333 884 c
+ 337 886 338 886 341 883 c
+ 343 882 347 880 350 879 c
+ 353 879 357 876 359 874 c
+ 361 871 363 870 370 870 c
+ 377 870 380 869 384 866 c
+ 388 862 390 861 402 861 c
+ 410 861 419 860 423 860 c
+ 432 858 439 858 448 860 c
+ 453 861 455 862 457 866 c
+ 459 869 461 871 462 871 c
+ 463 871 465 867 466 862 c
+ 469 855 469 852 467 849 c
+ 466 845 466 843 467 841 c
+ 470 836 470 836 478 843 c
+ 484 848 484 848 481 851 c
+ 478 854 478 855 481 857 c
+ 484 860 489 856 489 851 c
+ 489 850 490 848 492 847 c
+ 496 846 498 839 496 836 c
+ 492 832 495 825 500 825 c
+ 503 825 505 824 506 823 c
+ 506 822 508 821 510 821 c
+ 515 821 515 817 511 816 c
+ 507 815 501 806 501 801 c
+ 501 797 498 797 495 800 c
+ 488 807 476 802 476 793 c
+ 476 790 471 783 468 783 c
+ 467 783 466 785 466 787 c
+ h f
+ 276 879 m
+ 276 882 275 883 272 883 c
+ 269 884 268 883 268 880 c
+ 268 877 271 875 275 876 c
+ 276 876 276 878 276 879 c
+ h f
+ 329 791 m
+ 329 792 330 793 332 793 c
+ 334 794 334 793 334 792 c
+ 333 791 329 790 329 791 c
+ h f
+ 503 836 m
+ 501 839 501 840 503 841 c
+ 507 843 507 843 511 840 c
+ 514 838 514 837 512 835 c
+ 508 833 506 833 503 836 c
+ h f
+ 197 861 m
+ 197 863 197 864 199 864 c
+ 200 863 200 862 200 861 c
+ 200 860 200 859 199 859 c
+ 197 859 197 860 197 861 c
+ h f
+ 197 871 m
+ 196 872 197 874 198 874 c
+ 202 876 200 878 197 877 c
+ 192 876 190 881 193 885 c
+ 196 888 205 887 210 882 c
+ 212 881 214 879 214 879 c
+ 215 879 215 871 214 870 c
+ 214 870 210 869 206 869 c
+ 200 868 198 869 197 871 c
+ h f
+ 235 901 m
+ 232 902 232 905 235 905 c
+ 238 905 240 902 238 901 c
+ 238 901 236 901 235 901 c
+ h f
+ 0.47 0.05 0.02 rg
+ 402 796 m
+ 394 797 386 799 383 801 c
+ 381 802 375 804 370 804 c
+ 365 804 360 805 358 807 c
+ 356 809 352 811 348 812 c
+ 345 813 341 816 340 818 c
+ 338 820 337 821 333 819 c
+ 328 817 316 819 310 822 c
+ 308 824 304 825 301 825 c
+ 299 825 295 826 293 829 c
+ 290 833 288 833 283 831 c
+ 279 830 276 830 273 832 c
+ 270 833 265 834 261 834 c
+ 253 834 247 838 250 841 c
+ 251 842 252 844 252 846 c
+ 252 847 254 850 256 853 c
+ 258 857 261 858 266 858 c
+ 271 859 272 858 276 852 c
+ 279 848 281 844 281 843 c
+ 281 842 283 840 285 838 c
+ 288 836 290 836 293 837 c
+ 295 838 300 839 305 840 c
+ 314 841 315 841 316 837 c
+ 317 835 318 834 320 834 c
+ 328 836 328 836 329 832 c
+ 330 827 337 822 341 824 c
+ 343 825 349 827 354 827 c
+ 362 828 362 828 366 822 c
+ 369 819 370 815 370 814 c
+ 370 813 372 811 375 809 c
+ 378 807 380 807 383 808 c
+ 384 809 390 811 395 811 c
+ 403 812 404 812 405 809 c
+ 406 806 408 805 410 805 c
+ 411 806 414 807 415 807 c
+ 416 807 418 806 419 802 c
+ 420 797 420 794 417 794 c
+ 417 795 410 795 402 796 c
+ h f
+ 442 798 m
+ 442 799 444 800 447 800 c
+ 449 800 451 799 451 798 c
+ 451 797 449 796 447 796 c
+ 444 796 442 797 442 798 c
+ h f
+ 455 809 m
+ 453 812 452 812 451 810 c
+ 450 809 450 810 450 813 c
+ 451 816 451 817 448 817 c
+ 447 817 446 818 446 820 c
+ 447 822 460 826 471 827 c
+ 478 827 478 827 475 814 c
+ 474 810 473 809 469 809 c
+ 467 808 463 808 461 807 c
+ 459 807 456 808 455 809 c
+ h f
+ 409 830 m
+ 405 836 398 838 382 837 c
+ 370 836 366 837 365 838 c
+ 363 840 362 841 361 839 c
+ 360 837 360 838 361 841 c
+ 362 845 361 846 359 846 c
+ 356 846 355 850 358 851 c
+ 360 851 365 852 370 854 c
+ 377 856 379 856 383 854 c
+ 385 852 387 852 390 853 c
+ 392 854 395 855 398 855 c
+ 400 855 403 856 404 857 c
+ 405 860 413 859 416 855 c
+ 418 853 421 851 424 850 c
+ 432 847 430 844 420 843 c
+ 415 843 411 843 410 842 c
+ 408 840 414 835 418 835 c
+ 421 835 422 835 422 832 c
+ 421 828 411 827 409 830 c
+ h f
+ 454 846 m
+ 454 847 456 848 457 848 c
+ 457 848 458 847 458 846 c
+ 458 845 457 844 455 844 c
+ 454 844 453 845 454 846 c
+ h f
+ 318 858 m
+ 315 861 317 862 325 862 c
+ 329 862 333 861 333 860 c
+ 333 860 333 859 332 859 c
+ 322 857 319 857 318 858 c
+ h f
+ 346 870 m
+ 344 872 344 873 346 875 c
+ 350 878 354 876 354 871 c
+ 354 867 349 866 346 870 c
+ h f
+ Q
+}}
Property changes on: trunk/Master/texmf-dist/doc/generic/olsak-misc/fun-coffee.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/olsak-misc/openclose.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/olsak-misc/openclose.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/olsak-misc/openclose.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,89 @@
+% openclose.tex
+%%%%%%%%%%%%%%%%%%%%%%
+% Petr Olsak 2014
+
+% see
+% http://tex.stackexchange.com/questions/196071/macro-to-close-all-open-environments-groups-and-argument-delimiters
+
+% This macro defines \Open ...\Close pair which reads the text between them
+% and repairs it to balanced text. The appropriated braces could be added at
+% the begin (open braces) or at the end (close braces) of the text.
+% After \Open ...\Close preprocessing is done the repaired text is
+% normally processed.
+
+% Examples:
+
+% \Open abc\Close ... does nothing -> abc
+% \Open a}b}c\Close ... adds braces -> {{a}b}c
+% \Open a{b{c\Close ... adds braces -> a{b{c}}
+% \Open a}b}c{d{e\Close ... adds braces -> {{a}b}c{d{e}}
+
+% The \Open...\Close pairs would be nested. The processing of repairing
+% braces is done from inner pairs to outer, like normal parentheses.
+
+% The \autobracelist macro is empty by default and it can include the list
+% of control sequences which have special feature between \Open ...\Close:
+% It such control sequence is followed by open brace then it behaves normally
+% else the open brace is added after it.
+
+% Examples:
+
+% \def\autobrcelist{\x\y}
+% \Open \x \y \z aha \x \Close -> \x{\y{\z aha \x{}}}
+% \Open \x{\y} aha\Close -> \x{\y{} aha}
+
+\newcount\openLnum
+\newtoks\currtext
+\def\Open{\begingroup\let\bgroup=\relax \let\egroup=\relax
+ \expandafter\checkbracesJ\autobracelist\end
+ \let\ifIamInGroup=\iffalse \currtext={}\checkbracesA
+}
+\def\checkbracesA{\futurelet\tmp\checkbracesB}
+\def\checkbracesB{%
+ \let\next=\checkbracesN
+ \ifx\tmp\spacetoken \let\next=\checkbracesC \let\nexxt=\checkbracesA \addtocurrtext{ }\fi
+ \ifx\tmp\bgroupOri \let\next=\checkbracesC \let\nexxt=\checkbracesD \fi
+ \ifx\tmp\egroupOri \let\next=\checkbracesC \let\nexxt=\checkbracesE \fi
+ \ifx\tmp\autobraced \let\next=\checkbracesH \fi
+ \ifx\tmp\Close \let\next=\checkbracesC \let\nexxt=\checkbracesF \fi
+ \ifx\tmp\Open \global\advance\openLnum by1 \let\next=\relax \fi
+ \next
+}
+\def\checkbracesC{\afterassignment\nexxt \let\next= }
+\long\def\checkbracesN#1{\addtocurrtext#1\checkbracesA}
+\def\checkbracesD{\begingroup \let\ifIamInGroup=\iftrue \currtext={}\checkbracesA}
+\def\checkbracesE{\ifIamInGroup \addtocurrtextclosebrace
+ \else \currtext\expandafter{\expandafter{\the\currtext}}%
+ \fi \checkbracesA
+}
+\def\checkbracesF{%
+ \ifIamInGroup \addtocurrtextclosebrace \expandafter\checkbracesF
+ \else \expandafter\checkbracesG \fi
+}
+\def\checkbracesG{%
+ \ifnum\openLnum>0 \global\advance\openLnum by-1
+ \def\next{\expandafter\endgroup \expandafter
+ \currtext \expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\currtext \the\currtext}\checkbracesA}%
+ \else \def\next{\expandafter\endgroup \the\currtext}%
+ \fi \next
+}
+\def\checkbracesH#1{\addtocurrtext#1\futurelet\tmp\checkbracesI}
+\def\checkbracesI{\ifx\tmp\bgroupOri \expandafter\checkbracesB
+ \else \expandafter\checkbracesD \fi
+}
+\def\checkbracesJ#1{\ifx#1\end \else \let#1=\autobraced \expandafter\checkbracesJ \fi}
+
+\def\addtocurrtextclosebrace{\expandafter\endgroup
+ \expandafter\currtext\expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\currtext\expandafter{\the\currtext}}%
+}
+\long\def\addtocurrtext#1{\currtext\expandafter{\the\currtext#1}}
+\let\bgroupOri=\bgroup
+\let\egroupOri=\egroup
+\def\tmp/{\let\spacetoken= }\tmp/ %
+\def\Close{^\Close^}
+\def\autobraced{^\autobraced^}
+\def\autobracelist{}
+
+\endiput
Property changes on: trunk/Master/texmf-dist/doc/generic/olsak-misc/openclose.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/olsak-misc/seplist.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/olsak-misc/seplist.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/olsak-misc/seplist.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,131 @@
+% seplist.tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Petr Olsak 2014
+
+% This macro enables to declare more than one separator for parameter
+% scanning of your macro. Usage:
+
+% \long\def\yourmacro#1{usage of #1parameter}
+% \seplist{list of separators}\yourmacro parameter-text separator
+% example:
+% \seplist{{sepA}{SepB}{SEPC}}\yourmacro text separated by sepA
+% \seplist{{sepA}{SepB}{SEPC}}\yourmacro text separated by SepB
+% \seplist{{sepA}{SepB}{SEPC}}\yourmacro text separated by SEPC
+% All lines of this example are expanded to "usage of text separated by parameter".
+
+% The actually used separator is stored globally to the \sepused macro.
+% The macro programmer can use this.
+
+% The input stream is read to the first instance of any of the listed
+% separator, no more. The separator list includes separators in braces.
+% If there are only one-token separators, braces can be omited. Example
+
+% \seplist{0123456789}\mymacro text to the first decimal digit 7
+
+% The parameter have to be balanced. Thus, the separator hidden in braces
+% is ignored. This behavior is similar like in normal separated parameters.
+
+% The \par or spaces or arbitrary control sequences can be a part of
+% separators. The # (of catcode 6) cannot be a part of the separator but
+% it can be included in the parameter text.
+
+% See implementation details at the end of this file
+
+\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
+\newtoks\seplistT
+
+\long\def\seplistD#1{%
+ \seplistS##2\seplistE{\def\tmpa{##1}\def\tmpb{##2}\seplistE}%
+ \def\tmpb{\tmpa #1}\expandafter\tmpb \tmp\seplistD\seplistE
+}
+\long\def\seplistE#1{%
+ \ifx\tmpa\empty
+ \seplistS\seplistD{\def\tmpb{##1}}\expandafter\tmpa\tmpb
+ \ifx\tmpb\empty \seplistQ{#1}%
+ \else \expandafter\addto\expandafter\seplistLx
+ \expandafter {\expandafter\seplistD\expandafter{\tmpb}{#1}}%
+ \fi\fi
+}
+\def\seplistS{\long\expandafter\def\expandafter\tmpa\expandafter##\expandafter1\tmp}
+\long\def\seplistQ#1#2\seplistA{\fi\fi\gdef\sepused{#1}\seplistZ}
+
+\long\def\seplist#1#2{\begingroup
+ \toks0={#2}\let\bgroup=\relax \let\egroup=\relax
+ \def\seplistL{}\def\seplistLx{}\seplistI#1{}\gdef\sepused{}%
+ \ifx\seplistL\empty \expandafter\endgroup \the\toks0\else
+ \seplistT={}\expandafter\seplistA\fi
+}
+\def\seplistA{\futurelet\tmp\seplistB}
+\def\seplistB{\let\next=\seplistP
+ \expandafter\ifx\space\tmp \let\next=\seplistC \let\nexxt=\seplistM \fi
+ \ifx##\tmp \let\next=\seplistC \let\nexxt=\seplistH \fi
+ \ifx{\tmp \let\next=\seplistG \fi
+ \ifx}\tmp \let\next=\seplistC \let\nexxt=\seplistF \fi
+ \next
+}
+\def\seplistC{\afterassignment\nexxt \let\next= }
+\long\def\seplistP#1{\seplistX#1\def\tmp{#1}\seplistN}
+\def\seplistM{\seplistX{ }\def\tmp{ }\seplistN}
+\def\seplistH{\seplistX{##}\def\seplistLx{}\seplistA}
+\def\seplistN{\edef\seplistLx{\expandafter}\seplistLx \seplistL \seplistA}
+\long\def\seplistG#1{\def\seplistLx{}\seplistX{{#1}}\seplistA}
+\def\seplistF{\seplistT\expandafter{\expandafter{\the\seplistT}}\seplistZ}
+\long\def\seplistX#1{\seplistT\expandafter{\the\seplistT#1}}
+\def\seplistZ{\let\tmp=\sepused
+ \expandafter\seplistS\expandafter{\the\toks0{##1}}%
+ \expandafter\expandafter\expandafter\endgroup\expandafter\tmpa\the\seplistT
+}
+\long\def\seplistI#1{\ifx\seplistI#1\seplistI\else
+ \addto\seplistL{\seplistD{#1}{#1}}\expandafter\seplistI \fi
+}
+
+\endinput
+
+\def\m#1{\toks0={#1}\message{param: "\the\toks0", separator: "\sepused"}}
+\seplist{ab{c a}{cb}0123456789}\m uv#wcd{6cb7}uffc a
+
+% You can define \sepdef \macro #1[{sepA}{sepB}{sepC}]{usage of the parameter #1...}
+
+\def\sepdef #1#2[#3]{\def#1{\seplist{#3}{\csname:\string#1\endcsname}}%
+ \long\expandafter\def\csname:\string#1\endcsname ##1}
+
+\sepdef\test #1[uvw]#2{\message{1="#1", 2="#2"}}
+
+\test ahawx \test bhavy
+
+\end
+
+Comments to the implementation.
+
+We read the parameter token-per-token similarly as in openbrace.tex or
+eparam.tex and store these tokens in \seplistT token list. The internal
+macro \seplistL includes the list of separators in the form:
+
+\seplistD{sepA}{sepA}\seplistD{sepB}{sepB}...
+
+We store the already read token to \tmp and run \seplistL. More exactly: at
+the start, the temporary \seplistLx is emty. For each read token, we expand
+\seplistLx and \seplistL to the input stream and before executing it we
+reset \def\seplistLx{}. Now, the input stream is executed, i.e. the
+\seplistD macro is processed for each separator. The task of
+\seplistD{sepA}{sepA} is the following: to test if the \tmp is equal to the
+first token of its first parameter ("s" in this example). If it is true,
+then \seplistD (using \seplistE) adds the text \seplistD{epA}{sepA} (the
+first token from the first parameter is removed) to the temporary list
+\seplistLx which will be executed for the next token. If \tmp isn't equal to
+the first token of the first parameter then \seplistD does nothing.
+
+For example, the next read token \tmp is "e". Then \seplistD{epA}{sepA}
+saves the \seplistD{pA}{sepA} to \seplistLx, because the first letter
+\tmp="e". If the next token \tmp is "p", then \seplistD{A}{sepA} is stored
+to the \seplistLx. And finally, if the next \tmp is "A", then
+\seplistD{A}{sepA} does not store \seplistD{}{sepA}, but it decides that
+separator is found because the first parameter is empty. It defines \sepused
+to its second parameter "sepA" and it does the end of this game by \seplistQ
+plus \seplistZ. If the last token \tmp isn't "A" then the \seplistD{A}{sepA}
+does nothing and the chain is broken because the \seplistLx is set to empty
+in each step. The new chain can be built because \seplistD{sepA}{sepA} is
+still included in \seplistL which isn't changed during calculation.
+
+Macro-programing in TeX is beautiful but it is different than the classical
+technique used by "normal" programming.
Property changes on: trunk/Master/texmf-dist/doc/generic/olsak-misc/seplist.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/generic/olsak-misc/qrcode.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/olsak-misc/qrcode.tex (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/olsak-misc/qrcode.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,2870 @@
+% qrcode.tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Petr Olsak <petr at olsak.net> Jul. 2015
+
+% This macro qrcode.tex is (roughly speaking) a copy of qrcode.sty
+% macro by Anders Hendrickson <ahendric at cord.edu>, see
+% http://www.ctan.org/tex-archive/macros/latex/contrib/qrcode
+
+% The main difference between qrcode.sty and qrcode.tex is, that
+% the LaTeX ballast was removed from qrcode.sty by Petr Olsak. The result:
+% The qrcode.tex macro can be used in plain TeX format too.
+
+% Usage: after \input qrcode
+% you can type \qrcode{encoded text}.
+
+% More information about options can be found at the end of this file.
+
+\edef\tmp{\catcode`@=\the\catcode`@\relax}\catcode`\@=11 % LaTeX special character :(
+
+\newcount\qr at i
+\newcount\qr at j
+\newcount\qr at a
+\newcount\qr at b
+\newcount\qr at c
+
+\def\theqr at i{\the\qr at i}
+\def\theqr at j{\the\qr at j}
+
+\def\@relax{\relax}%
+
+\def\preface at macro#1#2{%
+ % #1 = macro name
+ % #2 = text to add to front of macro
+ \def\tempb{#2}%
+ \xa\xa\xa\def\xa\xa\xa#1\xa\xa\xa{\xa\tempb #1}%
+}%
+
+\def\g at preface@macro#1#2{%
+ % #1 = macro to be appended to
+ % #2 = code to add
+ \edef\codeA{#2}%
+ \expandafter\expandafter\expandafter
+ \gdef\expandafter\expandafter\expandafter#1\expandafter\expandafter\expandafter
+ {\expandafter\codeA#1}%
+}
+
+\def\qr at getstringlength#1{%
+ \bgroup
+ \qr at a=0%
+ \xdef\thestring{#1}%
+ \expandafter\qr at stringlength@recursive\expandafter(\thestring\relax\relax)%
+ \xdef\qr at stringlength{\the\qr at a}%
+ \egroup
+}%
+
+\def\qr at stringlength@recursive(#1#2){%
+ \def\testi{#1}%
+ \ifx\testi\@relax
+ %we are done.
+ \let\qr at next=\relax%
+ \else
+ \advance\qr at a by 1%
+ \def\qr at next{\qr at stringlength@recursive(#2)}%
+ \fi
+ \qr at next
+}%
+
+\def\qr at for#1=#2to#3by#4#{\forA{#1}{#2}{#3}{#4}}
+\long\def\forA#1#2#3#4#5{\begingroup
+ {\escapechar=`\\ % allocation of #1 as counter:
+ \expandafter \ifx\csname for:\string#1\endcsname \relax
+ \csname newcount\expandafter\endcsname \csname for:\string#1\endcsname\fi
+ \expandafter}\expandafter\let\expandafter#1\csname for:\string#1\endcsname
+ #1=#2%
+ \def\forB{#5\advance#1by#4\relax \expandafter\forC}%
+ \ifnum#4>0 \def\forC{\ifnum#1>#3\relax\else\forB\fi}%
+ \else \def\forC{\ifnum#1<#3\relax\else\forB\fi}%
+ \fi
+ \ifnum#4=0 \let\forC=\relax \fi
+ \forC \endgroup
+}
+
+\def\qr at padatfront#1#2{%
+ % #1 = macro containing text to pad
+ % #2 = desired number of characters
+ % Pads a number with initial zeros.
+ \qr at getstringlength{#1}%
+ \qr at a=\qr at stringlength\relax%
+ \advance\qr at a by 1\relax%
+ \qr at for \i = \qr at a to #2 by 1
+ {\g at preface@macro{#1}{0}}%
+}
+
+\qr at a=-1\relax%
+\def\qr at savehexsymbols(#1#2){%
+ \advance\qr at a by 1\relax%
+ \expandafter\def\csname qr at hexchar@\the\qr at a\endcsname{#1}%
+ \expandafter\edef\csname qr at hextodecimal@#1\endcsname{\the\qr at a}%
+ \ifnum\qr at a=15\relax
+ %Done.
+ \let\qr at next=\relax%
+ \else
+ \def\qr at next{\qr at savehexsymbols(#2)}%
+ \fi%
+ \qr at next%
+}%
+\qr at savehexsymbols(0123456789abcdef\relax\relax)%
+
+\def\qr at decimaltobase#1#2#3{%
+ % #1 = macro to store result
+ % #2 = decimal representation of a positive integer
+ % #3 = new base
+ \bgroup
+ \edef\qr at newbase{#3}%
+ \gdef\qr at base@result{}%
+ \qr at a=#2\relax%
+ \qr at decimaltobase@recursive%
+ \xdef#1{\qr at base@result}%
+ \egroup
+}
+\def\qr at decimaltobase@recursive{%
+ \qr at b=\qr at a%
+ \divide\qr at b by \qr at newbase\relax
+ \multiply\qr at b by -\qr at newbase\relax
+ \advance\qr at b by \qr at a\relax%
+ \divide\qr at a by \qr at newbase\relax%
+ \ifnum\qr at b<10\relax
+ \edef\newdigit{\the\qr at b}%
+ \else
+ \edef\newdigit{\csname qr at hexchar@\the\qr at b\endcsname}%
+ \fi
+ \edef\qr at argument{{\noexpand\qr at base@result}{\newdigit}}%
+ \expandafter\g at preface@macro\qr at argument%
+ \ifnum\qr at a=0\relax
+ \relax
+ \else
+ \expandafter\qr at decimaltobase@recursive
+ \fi
+}
+
+
+\long\def\isnextchar#1#2#3{\def\tmpa{#2}\def\tmpb{#3}%
+ \let\tmp=#1\futurelet\next\isnextcharA
+}
+\def\isnextcharA{\ifx\tmp\next\expandafter\tmpa\else\expandafter\tmpb\fi}
+
+\long\def\xaddto#1#2{\expandafter\xdef\expandafter#1\expandafter{#1#2}}
+\let\g at addto@macro=\xaddto
+
+\def\qr at decimaltohex[#1]#2#3{%
+ % #1 (opt.) = number of hex digits to create
+ % #2 = macro to store result
+ % #3 = decimal digits to convert
+ \qr at decimaltobase{#2}{#3}{16}%
+ \qr at padatfront{#2}{#1}%
+}
+
+\def\qr at decimaltobinary[#1]#2#3{%
+ % #1 (opt.) = number of bits to create
+ % #2 = macro to store result
+ % #3 = decimal digits to convert
+ \qr at decimaltobase{#2}{#3}{2}%
+ \qr at padatfront{#2}{#1}%
+}
+
+\qr at for \i = 0 to 15 by 1%
+ {%
+ \qr at decimaltohex[1]{\qr at hexchar}{\the\i}%
+ \qr at decimaltobinary[4]{\qr at bits}{\the\i}%
+ \expandafter\xdef\csname qr at b2h@\qr at bits\endcsname{\qr at hexchar}%
+ \expandafter\xdef\csname qr at h2b@\qr at hexchar\endcsname{\qr at bits}%
+ }%
+
+\def\qr at binarytohex[#1]#2#3{%
+ % #1 (optional) = # digits desired
+ % #2 = macro to save to
+ % #3 = binary string (must be multiple of 4 bits)
+ \def\test at i{#1}%
+ \ifx\test at i\@relax%
+ %No argument specified
+ \def\qr at desireddigits{0}%
+ \else
+ \def\qr at desireddigits{#1}%
+ \fi
+ \gdef\qr at base@result{}%
+ \edef\qr at argument{(#3\relax\relax\relax\relax\relax)}%
+ \xa\qr at binarytohex@int\qr at argument%
+ \qr at padatfront{\qr at base@result}{\qr at desireddigits}%
+ \xdef#2{\qr at base@result}%
+}
+\def\qr at binarytohex@int(#1#2#3#4#5){%
+ % #1#2#3#4 = 4 bits
+ % #5 = remainder, including \relax\relax\relax\relax\relax terminator
+ \def\test at i{#1}%
+ \ifx\test at i\@relax%
+ %Done.
+ \def\qr at next{\relax}%
+ \else%
+ \xdef\qr at base@result{\qr at base@result\csname qr at b2h@#1#2#3#4\endcsname}%
+ \def\qr at next{\qr at binarytohex@int(#5)}%
+ \fi%
+ \qr at next%
+}
+
+\def\qr at hextobinary[#1]#2#3{%
+ % #1 (optional) = # bits desired
+ % #2 = macro to save to
+ % #3 = hexadecimal string
+ \bgroup
+ \def\test at i{#1}%
+ \ifx\test at i\@relax%
+ %No argument specified
+ \def\qr at desireddigits{0}%
+ \else
+ \def\qr at desireddigits{#1}%
+ \fi
+ \gdef\qr at base@result{}%
+ \edef\qr at argument{(#3\relax\relax)}%
+ \xa\qr at hextobinary@int\qr at argument%
+ \qr at padatfront{\qr at base@result}{\qr at desireddigits}%
+ \xdef#2{\qr at base@result}%
+ \egroup
+}
+\def\qr at hextobinary@int(#1#2){%
+ % #1 = hexadecimal character
+ % #2 = remainder, including \relax\relax terminator
+ \def\test@@i{#1}%
+ \ifx\test@@i\@relax%
+ %Done.
+ \def\qr at next{\relax}%
+ \else%
+ \xdef\qr at base@result{\qr at base@result\csname qr at h2b@#1\endcsname}%
+ \def\qr at next{\qr at hextobinary@int(#2)}%
+ \fi%
+ \qr at next%
+}
+
+\def\qr at hextodecimal#1#2{%
+ \edef\qr at argument{#2}%
+ \xa\qr at a\xa=\xa\number\xa"\qr at argument\relax%
+ \edef#1{\the\qr at a}%
+}
+
+\def\qr at hextodecimal#1#2{%
+ % #1 = macro to store result
+ % #2 = hexadecimal representation of a positive integer
+ \bgroup
+ \qr at a=0\relax%
+ \edef\qr at argument{(#2\relax)}%
+ \xa\qr at hextodecimal@recursive\qr at argument%
+ \xdef#1{\the\qr at a}%
+ \egroup
+}
+\def\qr at hextodecimal@recursive(#1#2){%
+ % #1 = first hex char
+ % #2 = remainder
+ \advance \qr at a by \csname qr at hextodecimal@#1\endcsname\relax%
+ \edef\testii{#2}%
+ \ifx\testii\@relax%
+ %Done.
+ \let\qr at next=\relax%
+ \else
+ %There's at least one more digit.
+ \multiply\qr at a by 16\relax
+ \edef\qr at next{\noexpand\qr at hextodecimal@recursive(#2)}%
+ \fi%
+ \qr at next%
+}
+
+\def\qrverbatim{\def\do##1{\catcode`##1=12}\dospecials
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2
+ \escapechar=-1 \def\do##1{\edef##1{\string##1}}\dospecials
+ \def\?{^^J}\let\ =\qr at letterspace
+ \catcode`\^^M=13 \qr at setMtoJ
+ \ifx\mubytein\undefined \else \mubytein=0 \fi
+}
+{\lccode`\?=`\ \lowercase{\gdef\qr at letterspace{?}}}
+{\catcode`\^^M=13 \gdef\qr at setMtoJ{\def^^M{^^J}}}
+
+\def\qr at creatematrix#1{%
+ \expandafter\gdef\csname #1\endcsname##1##2{%
+ \csname #1@##1@##2\endcsname
+ }%
+}%
+
+\def\qr at storetomatrix#1#2#3#4{%
+ % #1 = matrix name
+ % #2 = row number
+ % #3 = column number
+ % #4 = value of matrix entry
+ \xa\gdef\csname #1@#2@#3\endcsname{#4}%
+}%
+
+\def\qr at estoretomatrix#1#2#3#4{%
+ % This version performs exactly one expansion on #4.
+ % #1 = matrix name
+ % #2 = row number
+ % #3 = column number
+ % #4 = value of matrix
+ \expandafter\gdef\csname #1@#2@#3\expandafter\endcsname\expandafter{#4}%
+}%
+
+\def\qr at matrixentry#1#2#3{%
+ % #1 = matrix name
+ % #2 = row number
+ % #3 = column number
+ \csname #1@#2@#3\endcsname%
+}%
+
+\def\qr at createsquareblankmatrix#1#2{%
+ \qr at creatematrix{#1}%
+ \xa\gdef\csname #1 at numrows\endcsname{#2}%
+ \xa\gdef\csname #1 at numcols\endcsname{#2}%
+ \qr at for \i = 1 to #2 by 1%
+ {\qr at for \j = 1 to #2 by 1%
+ {\qr at storetomatrix{#1}{\the\i}{\the\j}{\@blank}}}%
+}%
+
+\def\qr at numberofrowsinmatrix#1{%
+ \csname #1 at numrows\endcsname%
+}%
+
+\def\qr at numberofcolsinmatrix#1{%
+ \csname #1 at numcols\endcsname%
+}%
+
+\def\qr at setnumberofrows#1#2{%
+ \xa\xdef\csname #1 at numrows\endcsname{#2}%
+}%
+
+\def\qr at setnumberofcols#1#2{%
+ \xa\xdef\csname #1 at numcols\endcsname{#2}%
+}%
+
+\newdimen\qrdesiredheight
+\newdimen\qrmodulesize
+
+\def\qr at link#1#2{\hbox{\pdfstartlink height\ht0 depth0pt \qr at border
+ user{/Subtype/Link/A <</Type/Action/S/URI/URI(#1)>>}\relax #2\pdfendlink}%
+}
+\def\qr at border{\expandafter\ifx \csname kv:qrborder\endcsname\relax \else
+ attr{/C[\kv{qrborder}] /Border[0 0 .6]}\fi
+}
+
+\def\qr at createliteralmatrix#1#2#3{%
+ % #1 = matrix name
+ % #2 = m, the number of rows and columns in the square matrix
+ % #3 = a string of m^2 tokens to be written into the matrix
+ \qr at creatematrix{#1}%
+ \expandafter\xdef\csname #1 at numrows\endcsname{#2}%
+ \expandafter\xdef\csname #1 at numcols\endcsname{#2}%
+ \gdef\qr at literalmatrix@tokens{#3}%
+ \qr at for \i = 1 to #2 by 1%
+ {\qr at for \j = 1 to #2 by 1%
+ {\expandafter\qr at createliteralmatrix@int\expandafter(\qr at literalmatrix@tokens)%
+ \qr at estoretomatrix{#1}{\the\i}{\the\j}{\qr at entrytext}%
+ }%
+ }%
+}
+\def\qr at createliteralmatrix@int(#1#2){%
+ \def\qr at entrytext{#1}%
+ \gdef\qr at literalmatrix@tokens{#2}%
+}
+
+\qr at createliteralmatrix{finderpattern}{8}{%
+ \qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at white@fixed%
+ \qr at black@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at black@fixed\qr at white@fixed%
+ \qr at black@fixed\qr at white@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at white@fixed\qr at black@fixed\qr at white@fixed%
+ \qr at black@fixed\qr at white@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at white@fixed\qr at black@fixed\qr at white@fixed%
+ \qr at black@fixed\qr at white@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at white@fixed\qr at black@fixed\qr at white@fixed%
+ \qr at black@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at black@fixed\qr at white@fixed%
+ \qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at white@fixed%
+ \qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed%
+}%
+
+\qr at createliteralmatrix{alignmentpattern}{5}{%
+ \qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed%
+ \qr at black@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at black@fixed%
+ \qr at black@fixed\qr at white@fixed\qr at black@fixed\qr at white@fixed\qr at black@fixed%
+ \qr at black@fixed\qr at white@fixed\qr at white@fixed\qr at white@fixed\qr at black@fixed%
+ \qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed\qr at black@fixed%
+}%
+
+\def\qr at copymatrixentry#1#2#3#4#5#6{%
+ % Copy the (#2,#3) entry of matrix #1
+ % to the (#5,#6) position of matrix #4.
+ \xa\xa\xa\global%
+ \xa\xa\xa\let\xa\xa\csname #4@#5@#6\endcsname%
+ \csname #1@#2@#3\endcsname%
+}%
+
+\def\qr at createduplicatematrix#1#2{%
+ % #1 = name of copy
+ % #2 = original matrix to be copied
+ \qr at creatematrix{#1}%
+ \qr at for \i = 1 to \qr at numberofrowsinmatrix{#2} by 1%
+ {\qr at for \j = 1 to \qr at numberofcolsinmatrix{#2} by 1%
+ {\qr at copymatrixentry{#2}{\the\i}{\the\j}{#1}{\the\i}{\the\j}%
+ }%
+ }%
+ \qr at setnumberofrows{#1}{\qr at numberofrowsinmatrix{#2}}%
+ \qr at setnumberofcols{#1}{\qr at numberofcolsinmatrix{#2}}%
+}%
+
+\def\qr at placefinderpattern@int#1#2#3#4#5{%
+ % Work on matrix #1.
+ % Start in position (#2, #3) -- should be a corner
+ % #4 indicates horizontal direction (1=right, -1=left)
+ % #5 indicates vertical direction (1=down, -1=up)
+ %
+ % In this code, \sourcei and \sourcej are TeX counts working through the finderpattern matrix,
+ % and i and j are LaTeX counters indicating positions in the big matrix.
+ \setcounter{qr at i}{#2}%
+ \qr at for \sourcei=1 to 8 by 1%
+ {\setcounter{qr at j}{#3}%
+ \qr at for \sourcej=1 to 8 by 1%
+ {\qr at copymatrixentry{finderpattern}{\the\sourcei}{\the\sourcej}%
+ {#1}{\theqr at i}{\theqr at j}%
+ \addtocounter{qr at j}{#5}%
+ }%
+ \addtocounter{qr at i}{#4}%
+ }%
+}%
+
+\def\qr at placefinderpatterns#1{%
+ % #1=matrix name
+ \qr at placefinderpattern@int{#1}{1}{1}{1}{1}%
+ \qr at placefinderpattern@int{#1}{\qr at numberofrowsinmatrix{#1}}{1}{-1}{1}%
+ \qr at placefinderpattern@int{#1}{1}{\qr at numberofcolsinmatrix{#1}}{1}{-1}%
+}%
+
+\def\qr at placetimingpatterns#1{%
+ %Set \endingcol to n-8.
+ \qr at a=\qr at size\relax%
+ \advance\qr at a by -8\relax%
+ \edef\endingcol{\the\qr at a}%
+ \qr at for \j = 9 to \endingcol by 1%
+ {\ifodd\j\relax%
+ \qr at storetomatrix{#1}{7}{\the\j}{\qr at black@fixed}%
+ \qr at storetomatrix{#1}{\the\j}{7}{\qr at black@fixed}%
+ \else%
+ \qr at storetomatrix{#1}{7}{\the\j}{\qr at white@fixed}%
+ \qr at storetomatrix{#1}{\the\j}{7}{\qr at white@fixed}%
+ \fi%
+ }%
+}%
+
+\def\qr at placealignmentpattern@int#1#2#3{%
+ % Work on matrix #1.
+ % Write an alignment pattern into the matrix, centered on (#2,#3).
+ \qr at a=#2\relax%
+ \advance\qr at a by -2\relax%
+ \qr at b=#3\relax%
+ \advance\qr at b by -2\relax%
+ \setcounter{qr at i}{\the\qr at a}%
+ \qr at for \i=1 to 5 by 1%
+ {\setcounter{qr at j}{\the\qr at b}%
+ \qr at for \j=1 to 5 by 1%
+ {\qr at copymatrixentry{alignmentpattern}{\the\i}{\the\j}%
+ {#1}{\theqr at i}{\theqr at j}%
+ \stepcounter{qr at j}%
+ }%
+ \stepcounter{qr at i}%
+ }%
+}%
+
+\newif\ifqr at incorner%
+\def\qr at placealignmentpatterns#1{%
+ %There are k^2-3 alignment patterns,
+ %arranged in a (k x k) grid within the matrix.
+ %They begin in row 7, column 7,
+ %except that the ones in the NW, NE, and SW corners
+ %are omitted because of the finder patterns.
+ %Recall that
+ % * \qr at k stores k,
+ % * \qr at alignment@firstskip stores how far between the 1st and 2nd row/col, &
+ % * \qr at alignment@generalskip stores how far between each subsequent row/col.
+ \xa\ifnum\qr at k>0\relax
+ %There will be at least one alignment pattern.
+ %N.B. k cannot equal 1.
+ \xa\ifnum\qr at k=2\relax
+ % 2*2-3 = exactly 1 alignment pattern.
+ \qr at a=7\relax
+ \advance\qr at a by \qr at alignment@firstskip\relax
+ \xdef\qr at target@ii{\the\qr at a}%
+ \qr at placealignmentpattern@int{#1}{\qr at target@ii}{\qr at target@ii}%
+ \else
+ % k is at least 3, so the following loops should be safe.
+ \xdef\qr at target@ii{7}%
+ \qr at for \ii = 1 to \qr at k by 1%
+ {\ifcase\ii\relax%
+ \relax% \ii should never equal 0.
+ \or
+ \xdef\qr at target@ii{7}% If \ii = 1, we start in row 7.
+ \or
+ %If \ii = 2, we add the firstskip.
+ \qr at a=\qr at target@ii\relax%
+ \advance\qr at a by \qr at alignment@firstskip\relax%
+ \xdef\qr at target@ii{\the\qr at a}%
+ \else
+ %If \ii>2, we add the generalskip.
+ \qr at a=\qr at target@ii\relax%
+ \advance\qr at a by \qr at alignment@generalskip\relax%
+ \xdef\qr at target@ii{\the\qr at a}%
+ \fi
+ \qr at for \jj = 1 to \qr at k by 1%
+ {\ifcase\jj\relax%
+ \relax% \jj should never equal 0.
+ \or
+ \xdef\qr at target@jj{7}% If \jj=1, we start in row 7.
+ \or
+ %If \jj=2, we add the firstskip.
+ \qr at a=\qr at target@jj\relax%
+ \advance\qr at a by \qr at alignment@firstskip%
+ \xdef\qr at target@jj{\the\qr at a}%
+ \else
+ %If \jj>2, we add the generalskip.
+ \qr at a=\qr at target@jj\relax%
+ \advance\qr at a by \qr at alignment@generalskip%
+ \xdef\qr at target@jj{\the\qr at a}%
+ \fi
+ \qr at incornerfalse%
+ \ifnum\ii=1\relax
+ \ifnum\jj=1\relax
+ \qr at incornertrue
+ \else
+ \ifnum\qr at k=\jj\relax
+ \qr at incornertrue
+ \fi
+ \fi
+ \else
+ \xa\ifnum\qr at k=\ii\relax
+ \ifnum\jj=1\relax
+ \qr at incornertrue
+ \fi
+ \fi
+ \fi
+ \ifqr at incorner
+ \relax
+ \else
+ \qr at placealignmentpattern@int{#1}{\qr at target@ii}{\qr at target@jj}%
+ \fi
+ }% ends \qr at for \jj
+ }% ends \qr at for \ii
+ \fi
+ \fi
+}%
+
+\def\qr at placedummyformatpatterns#1{%
+ \qr at for \j = 1 to 9 by 1%
+ {\ifnum\j=7\relax%
+ \else%
+ \qr at storetomatrix{#1}{9}{\the\j}{\qr at format@square}%
+ \qr at storetomatrix{#1}{\the\j}{9}{\qr at format@square}%
+ \fi%
+ }%
+ \setcounter{qr at j}{\qr at size}%
+ \qr at for \j = 1 to 8 by 1%
+ {\qr at storetomatrix{#1}{9}{\theqr at j}{\qr at format@square}%
+ \qr at storetomatrix{#1}{\theqr at j}{9}{\qr at format@square}%
+ \addtocounter{qr at j}{-1}%
+ }%
+ %Now go back and change the \qr at format@square in (n-8,9) to \qr at black@fixed.
+ \addtocounter{qr at j}{1}%
+ \qr at storetomatrix{#1}{\theqr at j}{9}{\qr at black@fixed}%
+}%
+
+\def\qr at placedummyversionpatterns#1{%
+ \xa\ifnum\qr at version>6\relax
+ %Must include version information.
+ \global\qr at i=\qr at size%
+ \global\advance\qr at i by -10\relax%
+ \qr at for \i = 1 to 3 by 1%
+ {\qr at for \j = 1 to 6 by 1%
+ {\qr at storetomatrix{#1}{\theqr at i}{\the\j}{\qr at format@square}%
+ \qr at storetomatrix{#1}{\the\j}{\theqr at i}{\qr at format@square}%
+ }%
+ \stepcounter{qr at i}%
+ }%
+ \fi
+}%
+
+\def\qr at writebit(#1#2)#3{%
+ % #3 = matrix name
+ % (qr at i,qr at j) = position to write in (LaTeX counters)
+ % #1 = bit to be written
+ % #2 = remaining bits plus '\relax' as an end-of-file marker
+ \edef\qr at datatowrite{#2}%
+ \ifnum#1=1
+ \qr at storetomatrix{#3}{\theqr at i}{\theqr at j}{\qr at black}%
+ \else
+ \qr at storetomatrix{#3}{\theqr at i}{\theqr at j}{\@white}%
+ \fi
+}%
+
+\newif\ifqr at rightcol
+\newif\ifqr at goingup
+
+\def\qr at writedata@hex#1#2{%
+ % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc.
+ % #2 = a string consisting of bytes to write into the matrix, in two-char hex format.
+ \setcounter{qr at i}{\qr at numberofrowsinmatrix{#1}}%
+ \setcounter{qr at j}{\qr at numberofcolsinmatrix{#1}}%
+ \qr at rightcoltrue%
+ \qr at goinguptrue%
+ \edef\qr at argument{{#1}(#2\relax\relax\relax)}%
+ \xa\qr at writedata@hex at recursive\qr at argument%
+}%
+
+\def\qr at writedata@hex at recursive#1(#2#3#4){%
+ % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc.
+ % (qr at i,qr at j) = position to write in LaTeX counters
+ % #2#3#4 contains the hex codes of the bytes to be written, plus \relax\relax\relax
+ % as an end-of-file marker
+ \edef\testii{#2}%
+ \ifx\testii\@relax%
+ % #2 is \relax, so there is nothing more to write.
+ \relax
+ \let\go=\relax
+ \else
+ % #2 is not \relax, so there is another byte to write.
+ \qr at hextobinary[8]{\bytetowrite}{#2#3}%
+ \xdef\qr at datatowrite{\bytetowrite\relax}% %Add terminating "\relax"
+ \qr at writedata@recursive{#1}% %This function actually writes the 8 bits.
+ \edef\qr at argument{{#1}(#4)}%
+ \xa\def\xa\go\xa{\xa\qr at writedata@hex at recursive\qr at argument}% %Call self to write the next bit.
+ \fi
+ \go
+}%
+
+\def\qr at writedata#1#2{%
+ % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc.
+ % #2 = a string consisting of 0's and 1's to write into the matrix.
+ \setcounter{qr at i}{\qr at numberofrowsinmatrix{#1}}%
+ \setcounter{qr at j}{\qr at numberofcolsinmatrix{#1}}%
+ \qr at rightcoltrue
+ \qr at goinguptrue
+ \edef\qr at datatowrite{#2\relax}%
+ \qr at writedata@recursive{#1}%
+}%
+
+\def\@@blank{\@blank}%
+
+\def\qr at writedata@recursive#1{%
+ % #1 = matrix name
+ % (qr at i,qr at j) = position to write in (LaTeX counters)
+ % \qr at datatowrite contains the bits to be written, plus '\relax' as an end-of-file marker
+ \xa\let\xa\squarevalue\csname #1@\theqr at i @\theqr at j\endcsname%
+ \ifx\squarevalue\@@blank
+ %Square is blank, so write data in it.
+ \xa\qr at writebit\xa(\qr at datatowrite){#1}%
+ %The \qr at writebit macro not only writes the first bit of \qr at datatowrite into the matrix,
+ %but also removes the bit from the 'bitstream' of \qr at datatowrite.
+ \fi
+ %Now adjust our position in the matrix.
+ \ifqr at rightcol
+ %From the right-hand half of the two-bit column, we always move left. Easy peasy.
+ \addtocounter{qr at j}{-1}%
+ \qr at rightcolfalse
+ \else
+ %If we're in the left-hand column, things are harder.
+ \ifqr at goingup
+ %First, suppose we're going upwards.
+ \ifnum\qr at i>1\relax%
+ %If we're not in the first row, things are easy.
+ %We move one to the right and one up.
+ \addtocounter{qr at j}{1}%
+ \addtocounter{qr at i}{-1}%
+ \qr at rightcoltrue
+ \else
+ %If we are in the first row, then we move to the left,
+ %and we are now in the right-hand column on a downward pass.
+ \addtocounter{qr at j}{-1}%
+ \qr at goingupfalse
+ \qr at rightcoltrue
+ \fi
+ \else
+ %Now, suppose we're going downwards.
+ \xa\ifnum\qr at size>\qr at i\relax%
+ %If we're not yet in the bottom row, things are easy.
+ %We move one to the right and one down.
+ \addtocounter{qr at j}{1}%
+ \addtocounter{qr at i}{1}%
+ \qr at rightcoltrue
+ \else
+ %If we are in the bottom row, then we move to the left,
+ %and we are now in the right-hand column on an upward pass.
+ \addtocounter{qr at j}{-1}%
+ \qr at rightcoltrue
+ \qr at goinguptrue
+ \fi
+ \fi
+ %One problem: what if we just moved into the 7th column?
+ %Das ist verboten.
+ %If we just moved (left) into the 7th column, we should move on into the 6th column.
+ \ifnum\qr at j=7\relax%
+ \setcounter{qr at j}{6}%
+ \fi
+ \fi
+ %Now check whether there are any more bits to write.
+ \ifx\qr at datatowrite\@relax
+ % \qr at datatowrite is just `\relax', so we're done.
+ \let\nexttoken=\relax
+ \relax
+ \else
+ % Write some more!
+ \def\nexttoken{\qr at writedata@recursive{#1}}%
+ \fi
+ \nexttoken
+}%
+
+\def\qr at writeremainderbits#1{%
+ % #1 = name of a matrix that has been prepared and partly filled.
+ % (qr at i,qr at j) = position to write in LaTeX counters
+ \xa\ifnum\qr at numremainderbits>0\relax
+ \def\qr at datatowrite{}%
+ \qr at for \i = 1 to \qr at numremainderbits by 1%
+ {\g at addto@macro{\qr at datatowrite}{0}}%
+ \g at addto@macro{\qr at datatowrite}{\relax}% terminator
+ \qr at writedata@recursive{#1}%
+ \fi
+}%
+
+\newif\ifqr at cellinmask
+
+\def\qr at setmaskingfunction#1{%
+ % #1 = 1 decimal digit for the mask. (I see no reason to use the 3-bit binary code.)
+ % The current position is (\themaski,\themaskj), with indexing starting at 0.
+ \edef\maskselection{#1}%
+ \xa\ifcase\maskselection\relax
+ %Case 0: checkerboard
+ \def\qr at parsemaskingfunction{%
+ % Compute mod(\themaski+\themaskj,2)%
+ \qr at a=\maski%
+ \advance\qr at a by \maskj%
+ \qr at b=\qr at a%
+ \divide\qr at b by 2%
+ \multiply\qr at b by 2%
+ \advance\qr at a by -\qr at b%
+ \edef\qr at maskfunctionresult{\the\qr at a}%
+ }%
+ \or
+ %Case 1: horizontal stripes
+ \def\qr at parsemaskingfunction{%
+ % Compute mod(\themaski,2)%
+ \ifodd\maski\relax%
+ \def\qr at maskfunctionresult{1}%
+ \else%
+ \def\qr at maskfunctionresult{0}%
+ \fi%
+ }%
+ \or
+ %Case 2: vertical stripes
+ \def\qr at parsemaskingfunction{%
+ % Compute mod(\themaskj,3)%
+ \qr at a=\maskj%
+ \divide\qr at a by 3%
+ \multiply\qr at a by 3%
+ \advance\qr at a by -\maskj%
+ \edef\qr at maskfunctionresult{\the\qr at a}%
+ }%
+ \or
+ %Case 3: diagonal stripes
+ \def\qr at parsemaskingfunction{%
+ % Compute mod(\themaski+\themaskj,3)%
+ \qr at a=\maski%
+ \advance\qr at a by \maskj%
+ \qr at b=\qr at a%
+ \divide\qr at b by 3%
+ \multiply\qr at b by 3%
+ \advance\qr at b by -\qr at a%
+ \edef\qr at maskfunctionresult{\the\qr at b}%
+ }%
+ \or
+ %Case 4: wide checkerboard
+ \def\qr at parsemaskingfunction{%
+ % Compute mod(floor(\themaski/2) + floor(\themaskj/3),2) %
+ \qr at a=\maski%
+ \divide\qr at a by 2%
+ \qr at b=\maskj%
+ \divide\qr at b by 3%
+ \advance\qr at a by \qr at b%
+ \qr at b=\qr at a%
+ \divide\qr at a by 2%
+ \multiply\qr at a by 2%
+ \advance\qr at a by -\qr at b%
+ \edef\qr at maskfunctionresult{\the\qr at a}%
+ }%
+ \or
+ %Case 5: quilt
+ \def\qr at parsemaskingfunction{%
+ % Compute mod(\themaski*\themaskj,2) + mod(\themaski*\themaskj,3) %
+ \qr at a=\maski%
+ \multiply\qr at a by \maskj%
+ \qr at b=\qr at a%
+ \qr at c=\qr at a%
+ \divide\qr at a by 2%
+ \multiply\qr at a by 2%
+ \advance\qr at a by -\qr at c% (result will be -mod(i*j,2), which is negative.)
+ \divide\qr at b by 3%
+ \multiply\qr at b by 3%
+ \advance\qr at b by -\qr at c% (result will be -mod(i*j,3), which is negative.)
+ \advance\qr at a by \qr at b% (result is negative of what's in the spec.)
+ \edef\qr at maskfunctionresult{\the\qr at a}%
+ }%
+ \or
+ %Case 6: arrows
+ \def\qr at parsemaskingfunction{%
+ % Compute mod( mod(\themaski*\themaskj,2) + mod(\themaski*\themaskj,3) , 2 ) %
+ \qr at a=\maski%
+ \multiply\qr at a by \maskj%
+ \qr at b=\qr at a%
+ \qr at c=\qr at a%
+ \multiply\qr at c by 2% % \qr at c equals 2*i*j.
+ \divide\qr at a by 2%
+ \multiply\qr at a by 2%
+ \advance\qr at c by -\qr at a% Now \qr at c equals i*j + mod(i*j,2).
+ \divide\qr at b by 3%
+ \multiply\qr at b by 3%
+ \advance\qr at c by -\qr at b% (Now \qr at c equals mod(i*j,2) + mod(i*j,3).
+ \qr at a=\qr at c%
+ \divide\qr at a by 2%
+ \multiply\qr at a by 2%
+ \advance\qr at c by-\qr at a%
+ \edef\qr at maskfunctionresult{\the\qr at c}%
+ }%
+ \or
+ %Case 7: shotgun
+ \def\qr at parsemaskingfunction{%
+ % Compute mod( mod(\themaski+\themaskj,2) + mod(\themaski*\themaskj,3) , 2 ) %
+ \qr at a=\maski%
+ \advance\qr at a by \maskj% %So \qr at a = i+j
+ \qr at b=\maski%
+ \multiply\qr at b by \maskj% %So \qr at b = i*j
+ \qr at c=\qr at a%
+ \advance\qr at c by \qr at b% So \qr at c = i+j+i*j
+ \divide\qr at a by 2%
+ \multiply\qr at a by 2%
+ \advance\qr at c by -\qr at a% So \qr at c = mod(i+j,2) + i*j
+ \divide\qr at b by 3%
+ \multiply\qr at b by 3%
+ \advance\qr at c by -\qr at b% So \qr at c = mod(i+j,2) + mod(i*j,3)
+ \qr at a=\qr at c%
+ \divide\qr at c by 2%
+ \multiply\qr at c by 2%
+ \advance\qr at a by -\qr at c%
+ \edef\qr at maskfunctionresult{\the\qr at a}%
+ }%
+ \fi
+}%
+
+\def\qr at checkifcellisinmask{%
+ % The current position is (\i,\j), in TeX counts,
+ % but the LaTeX counters (maski,maskj) should contain
+ % the current position with indexing starting at 0.
+ % That is, maski = \i-1 and maskj = \j-1.
+ %
+ % \qr at parsemaskingfunction must have been set by a call to \qr at setmaskingfunction
+ \qr at parsemaskingfunction
+ \xa\ifnum\qr at maskfunctionresult=0\relax
+ \qr at cellinmasktrue
+ \else
+ \qr at cellinmaskfalse
+ \fi
+}%
+
+\newcount\maski
+\newcount\maskj
+
+\def\qr at applymask#1#2#3{%
+ % #1 = name of a matrix that should be filled out completely
+ % except for the format and/or version information.
+ % #2 = name of a new matrix to contain the masked version
+ % #3 = 1 decimal digit naming the mask
+ \qr at createduplicatematrix{#2}{#1}%
+ \qr at setmaskingfunction{#3}%
+ \setcounter{maski}{-1}%
+ \qr at for \i = 1 to \qr at size by 1%
+ {\stepcounter{maski}%
+ \setcounter{maskj}{-1}%
+ \qr at for \j = 1 to \qr at size by 1%
+ {\stepcounter{maskj}%
+ \qr at checkifcellisinmask
+ \ifqr at cellinmask
+ \qr at checkifcurrentcellcontainsdata{#2}%
+ \ifqr at currentcellcontainsdata
+ \qr at flipcurrentcell{#2}%
+ \fi
+ \fi
+ }%
+ }%
+}%
+
+\newif\ifqr at currentcellcontainsdata
+\qr at currentcellcontainsdatafalse
+
+\def\@@white{\@white}%
+\def\@@black{\qr at black}%
+
+\def\qr at checkifcurrentcellcontainsdata#1{%
+ % #1 = name of matrix
+ \qr at currentcellcontainsdatafalse
+ \xa\ifx\csname #1@\the\i @\the\j\endcsname\@@white
+ \qr at currentcellcontainsdatatrue
+ \fi
+ \xa\ifx\csname #1@\the\i @\the\j\endcsname\@@black
+ \qr at currentcellcontainsdatatrue
+ \fi
+}%
+
+\def\qr at flipped@black{\qr at black}%
+\def\qr at flipped@white{\@white}%
+
+\def\qr at flipcurrentcell#1{%
+ % #1 = name of matrix
+ % (\i, \j) = current position, in TeX counts.
+ % This assumes the cell contains data, either black or white!
+ \xa\ifx\csname #1@\the\i @\the\j\endcsname\@@white
+ \qr at storetomatrix{#1}{\the\i}{\the\j}{\qr at flipped@black}%
+ \else
+ \qr at storetomatrix{#1}{\the\i}{\the\j}{\qr at flipped@white}%
+ \fi
+}%
+
+\def\qr at chooseandapplybestmask#1{%
+ % #1 = name of a matrix that should be filled out completely
+ % except for the format and/or version information.
+ % This function applies all eight masks in succession,
+ % calculates their penalties, and remembers the best.
+ % The number indicating which mask was used is saved in \qr at mask@selected.
+ \qr at createduplicatematrix{originalmatrix}{#1}%
+ \qrmessage{<Applying Mask 0...}%
+ \qr at applymask{originalmatrix}{#1}{0}%
+ \qrmessage{done. Calculating penalty...}%
+ \qr at evaluatemaskpenalty{#1}%
+ \xdef\currentbestpenalty{\qr at penalty}%
+ \qrmessage{penalty is \qr at penalty>^^J}%
+ \gdef\currentbestmask{0}%
+ \qr at for \i = 1 to 7 by 1%
+ {\qrmessage{<Applying Mask \the\i...}%
+ \qr at applymask{originalmatrix}{currentmasked}{\the\i}%
+ \qrmessage{done. Calculating penalty...}%
+ \qr at evaluatemaskpenalty{currentmasked}%
+ \qrmessage{penalty is \qr at penalty>^^J}%
+ \xa\xa\xa\ifnum\xa\qr at penalty\xa<\currentbestpenalty\relax
+ %We found a better mask.
+ \xdef\currentbestmask{\the\i}%
+ \qr at createduplicatematrix{#1}{currentmasked}%
+ \xdef\currentbestpenalty{\qr at penalty}%
+ \fi
+ }%
+ \xdef\qr at mask@selected{\currentbestmask}%
+ \qrmessage{<Selected Mask \qr at mask@selected>^^J}%
+}%
+
+\def\qr at Ni{3}%
+\def\qr at Nii{3}%
+\def\qr at Niii{40}%
+\def\qr at Niv{10}%
+\def\@fiveones{11111}%
+\def\@fivezeros{11111}%
+\def\@twoones{11}%
+\def\@twozeros{00}%
+\def\@finderA{00001011101}%
+\def\@finderB{10111010000}%
+\def\@finderB at three{1011101000}%
+\def\@finderB at two{101110100}%
+\def\@finderB at one{10111010}%
+\def\@finderB at zero{1011101}%
+\newif\ifstringoffive
+\def\addpenaltyiii{%
+ \addtocounter{penaltyiii}{\qr at Niii}%
+}%
+\newcount\totalones
+\newcount\penaltyi
+\newcount\penaltyii
+\newcount\penaltyiii
+\newcount\penaltyiv
+\def\qr at evaluatemaskpenalty#1{%
+ % #1 = name of a matrix that we will test for the penalty
+ % according to the specs.
+ \setcounter{penaltyi}{0}%
+ \setcounter{penaltyii}{0}%
+ \setcounter{penaltyiii}{0}%
+ \setcounter{penaltyiv}{0}%
+ \bgroup%localize the meanings we give to the symbols
+ \def\qr at black{1}\def\@white{0}%
+ \def\qr at black@fixed{1}\def\qr at white@fixed{0}%
+ \def\qr at format@square{0}% This is not stated in the specs, but seems
+ % to be the standard implementation.
+ \def\@blank{0}% These would be any bits at the end.
+ %
+ \setcounter{totalones}{0}%
+ \qr at for \i=1 to \qr at size by 1%
+ {\def\lastfive{z}% %The z is a dummy, that will be removed before any testing.
+ \stringoffivefalse
+ \def\lasttwo at thisrow{z}% %The z is a dummy.
+ \def\lasttwo at nextrow{z}% %The z is a dummy.
+ \def\lastnine{z0000}% %The 0000 stands for the white space to the left. The z is a dummy.
+ \def\ignore at finderB@at{0}%
+ \qr at for \j=1 to \qr at size by 1%
+ {\edef\newbit{\qr at matrixentry{#1}{\the\i}{\the\j}}%
+ %
+ % LASTFIVE CODE FOR PENALTY 1
+ % First, add the new bit to the end.
+ \xa\g at addto@macro\xa\lastfive\xa{\newbit}%
+ \ifnum\j<5\relax%
+ %Not yet on the 5th entry.
+ %Don't do any testing.
+ \else
+ % 5th entry or later.
+ % Remove the old one, and then test.
+ \removefirsttoken\lastfive%
+ \ifx\lastfive\@fiveones%
+ \ifstringoffive%
+ %This is a continuation of a previous block of five or more 1's.
+ \stepcounter{penaltyi}%
+ \else
+ %This is a new string of five 1's.
+ \addtocounter{penaltyi}{\qr at Ni}%
+ \global\stringoffivetrue
+ \fi
+ \else
+ \ifx\lastfive\@fivezeros%
+ \ifstringoffive
+ %This is a continuation of a previous block of five or more 0's.
+ \stepcounter{penaltyi}%
+ \else
+ %This is a new string of five 0's.
+ \addtocounter{penaltyi}{\qr at Ni}%
+ \global\stringoffivetrue
+ \fi
+ \else
+ %This is not a string of five 1's or five 0's.
+ \global\stringoffivefalse
+ \fi
+ \fi
+ \fi
+ %
+ % 2x2 BLOCKS FOR PENALTY 2
+ % Every 2x2 block of all 1's counts for \qr at Nii penalty points.
+ % We do not need to run this test in the last row.
+ \xa\ifnum\xa\i\xa<\qr at size\relax
+ \xa\g at addto@macro\xa\lasttwo at thisrow\xa{\newbit}%
+ %Compute \iplusone
+ \qr at a=\i\relax%
+ \advance\qr at a by 1%
+ \edef\iplusone{\the\qr at a}%
+ %
+ \edef\nextrowbit{\qr at matrixentry{#1}{\iplusone}{\the\j}}%
+ \xa\g at addto@macro\xa\lasttwo at nextrow\xa{\nextrowbit}%
+ \ifnum\j<2\relax%
+ %Still in the first column; no check.
+ \else
+ %Second column or later. Remove the old bits, and then test.
+ \removefirsttoken\lasttwo at thisrow
+ \removefirsttoken\lasttwo at nextrow
+ \ifx\lasttwo at thisrow\@twoones
+ \ifx\lasttwo at nextrow\@twoones
+ \addtocounter{penaltyii}{\qr at Nii}%
+ \fi
+ \else
+ \ifx\lasttwo at thisrow\@twozeros
+ \ifx\lasttwo at nextrow\@twozeros
+ \addtocounter{penaltyii}{\qr at Nii}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ %
+ % LASTNINE CODE FOR PENALTY 3
+ % First, add the new bit to the end.
+ \xa\g at addto@macro\xa\lastnine\xa{\newbit}%
+ \ifnum\j<7\relax%
+ %Not yet on the 7th entry.
+ %Don't do any testing.
+ \else
+ % 7th entry or later.
+ % Remove the old one, and then test.
+ \removefirsttoken\lastnine
+ \xa\ifnum\qr at size=\j\relax%
+ % Last column. Any of the following should count:
+ % 1011101 (\@finderB at zero)
+ % 10111010 (\@finderB at one)
+ % 101110100 (\@finderB at two)
+ % 1011101000 (\@finderB at three)
+ % 10111010000 (\@finderB)
+ \ifx\lastnine\@finderB
+ \addpenaltyiii
+ \else
+ \removefirsttoken\lastnine
+ \ifx\lastnine\@finderB at three
+ \addpenaltyiii
+ \else
+ \removefirsttoken\lastnine
+ \ifx\lastnine\@finderB at two
+ \addpenaltyiii
+ \else
+ \removefirsttoken\lastnine
+ \ifx\lastnine\@finderB at one
+ \addpenaltyiii
+ \else
+ \removefirsttoken\lastnine
+ \ifx\lastnine\@finderB at zero
+ \addpenaltyiii
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \else
+ \ifx\lastnine\@finderA% %Matches 0000 1011101
+ \addpenaltyiii
+ %Also, we record our discovery, so that we can't count this pattern again
+ %if it shows up four columns later as 1011101 0000.
+ %
+ %Set \ignore at finderB@at to \j+4.
+ \qr at a=\j\relax%
+ \advance\qr at a by 4%
+ \xdef\ignore at finderB@at{\the\qr at a}%
+ \else
+ \ifx\lastfive\@finderB% %Matches 1011101 0000.
+ \xa\ifnum\ignore at finderB@at=\j\relax
+ %This pattern was *not* counted already earlier.
+ \addpenaltyiii
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ %
+ %COUNT 1's FOR PENALTY 4
+ \xa\ifnum\newbit=1\relax%
+ \stepcounter{totalones}%
+ \fi
+ }% end of j-loop
+ }% end of i-loop
+ %
+ %NOW WE ALSO NEED TO RUN DOWN THE COLUMNS TO FINISH CALCULATING PENALTIES 1 AND 3.
+ \qr at for \j=1 to \qr at size by 1%
+ {\def\lastfive{z}% %The z is a dummy, that will be removed before any testing.
+ \stringoffivefalse
+ \def\lastnine{z0000}% %The 0000 stands for the white space to the left. The z is a dummy.
+ \def\ignore at finderB@at{0}%
+ \qr at for \i=1 to \qr at size by 1%
+ {\edef\newbit{\qr at matrixentry{#1}{\the\i}{\the\j}}%
+ %
+ % LASTFIVE CODE FOR PENALTY 1
+ % First, add the new bit to the end.
+ \xa\g at addto@macro\xa\lastfive\xa{\newbit}%
+ \ifnum\i<5\relax%
+ %Not yet on the 5th entry.
+ %Don't do any testing.
+ \else
+ % 5th entry or later.
+ % Remove the old one, and then test.
+ \removefirsttoken\lastfive%
+ \ifx\lastfive\@fiveones%
+ \ifstringoffive%
+ %This is a continuation of a previous block of five or more 1's.
+ \stepcounter{penaltyi}%
+ \else
+ %This is a new string of five 1's.
+ \addtocounter{penaltyi}{\qr at Ni}%
+ \global\stringoffivetrue
+ \fi
+ \else
+ \ifx\lastfive\@fivezeros%
+ \ifstringoffive
+ %This is a continuation of a previous block of five or more 0's.
+ \stepcounter{penaltyi}%
+ \else
+ %This is a new string of five 0's.
+ \addtocounter{penaltyi}{\qr at Ni}%
+ \global\stringoffivetrue
+ \fi
+ \else
+ %This is not a string of five 1's or five 0's.
+ \global\stringoffivefalse
+ \fi
+ \fi
+ \fi
+ %
+ % HAPPILY, WE DON'T NEED TO CALCULATE PENALTY 2 AGAIN.
+ %
+ % LASTNINE CODE FOR PENALTY 3
+ % First, add the new bit to the end.
+ \xa\g at addto@macro\xa\lastnine\xa{\newbit}%
+ \ifnum\i<7\relax%
+ %Not yet on the 7th entry.
+ %Don't do any testing.
+ \else
+ % 7th entry or later.
+ % Remove the old one, and then test.
+ \removefirsttoken\lastnine
+ \xa\ifnum\qr at size=\i\relax%
+ % Last column. Any of the following should count:
+ % 1011101 (\@finderB at zero)
+ % 10111010 (\@finderB at one)
+ % 101110100 (\@finderB at two)
+ % 1011101000 (\@finderB at three)
+ % 10111010000 (\@finderB)
+ \ifx\lastnine\@finderB
+ \addpenaltyiii
+ \else
+ \removefirsttoken\lastnine
+ \ifx\lastnine\@finderB at three
+ \addpenaltyiii
+ \else
+ \removefirsttoken\lastnine
+ \ifx\lastnine\@finderB at two
+ \addpenaltyiii
+ \else
+ \removefirsttoken\lastnine
+ \ifx\lastnine\@finderB at one
+ \addpenaltyiii
+ \else
+ \removefirsttoken\lastnine
+ \ifx\lastnine\@finderB at zero
+ \addpenaltyiii
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \else
+ \ifx\lastnine\@finderA% %Matches 0000 1011101
+ \addpenaltyiii
+ %Also, we record our discovery, so that we can't count this pattern again
+ %if it shows up four columns later as 1011101 0000.
+ %
+ %Set \ignore at finderB@at to \i+4.
+ \qr at a=\i\relax%
+ \advance\qr at a by 4%
+ \xdef\ignore at finderB@at{\the\qr at a}%
+ \else
+ \ifx\lastfive\@finderB% %Matches 1011101 0000.
+ \xa\ifnum\ignore at finderB@at=\i\relax
+ %This pattern was *not* counted already earlier.
+ \addpenaltyiii
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ %
+ }% end of i-loop
+ }% end of j-loop
+ \egroup%
+ %
+ %CALCULATE PENALTY 4
+ %According to the spec, penalty #4 is computed as
+ % floor( |(i/n^2)-0.5|/0.05 )
+ % where i is the total number of 1's in the matrix.
+ % This is equal to abs(20*i-10n^2) div n^2.
+ %
+ \qr at a=\totalones\relax
+ \multiply\qr at a by 20\relax
+ \qr at b=\qr at size\relax
+ \multiply\qr at b by \qr at size\relax
+ \qr at c=10\relax
+ \multiply\qr at c by \qr at b\relax
+ \advance\qr at a by -\qr at c\relax
+ \ifnum\qr at a<0\relax
+ \multiply\qr at a by -1\relax
+ \fi
+ \divide\qr at a by \qr at b\relax
+ \setcounter{penaltyiv}{\the\qr at a}%
+ %
+ %CALCULATE TOTAL PENALTY
+ \qr at a=\the\penaltyi\relax%
+ \advance\qr at a by \the\penaltyii\relax%
+ \advance\qr at a by \the\penaltyiii\relax%
+ \advance\qr at a by \the\penaltyiv\relax%
+ \edef\qr at penalty{\the\qr at a}%
+}%
+
+\def\removefirsttoken#1{%
+ %Removes the first token from the macro named in #1.
+ \edef\qr at argument{(#1)}%
+ \xa\removefirsttoken at int\qr at argument%
+ \xdef#1{\removefirsttoken at result}%
+}%
+\def\removefirsttoken at int(#1#2){%
+ \def\removefirsttoken at result{#2}%
+}%
+
+\def\qr at writeformatstring#1#2{%
+ % #1 = matrix name
+ % #2 = binary string representing the encoded and masked format information
+ \setcounter{qr at i}{9}%
+ \setcounter{qr at j}{1}%
+ \edef\qr at argument{{#1}(#2\relax)}%
+ \xa\qr at writeformatA@recursive\qr at argument
+ %
+ \setcounter{qr at i}{\qr at numberofrowsinmatrix{#1}}%
+ \setcounter{qr at j}{9}%
+ \xa\qr at writeformatB@recursive\qr at argument
+}%
+
+\def\qr at writeformatA@recursive#1(#2#3){%
+ % #1 = matrix name
+ % #2 = first bit of string
+ % #3 = rest of bitstream
+ % (qr at i,qr at j) = current (valid) position to write (in LaTeX counters)
+ \def\formattowrite{#3}%
+ \ifnum#2=1\relax
+ \qr at storetomatrix{#1}{\theqr at i}{\theqr at j}{\qr at black@format}%
+ \else
+ \qr at storetomatrix{#1}{\theqr at i}{\theqr at j}{\qr at white@format}%
+ \fi
+ % Now the tricky part--moving \i and \j to their next positions.
+ \ifnum\qr at j<9\relax
+ %If we're not yet in column 9, move right.
+ \stepcounter{qr at j}%
+ \ifnum\qr at j=7\relax
+ %But we skip column 7!
+ \stepcounter{qr at j}%
+ \fi
+ \else
+ %If we're in column 9, we move up.
+ \addtocounter{qr at i}{-1}%
+ \ifnum\qr at i=7\relax
+ %But we skip row 7!
+ \addtocounter{qr at i}{-1}%
+ \fi
+ \fi
+ %N.B. that at the end of time, this will leave us at invalid position (0,9).
+ %That makes for an easy test to know when we are done.
+ \ifnum\qr at i<1
+ \let\nexttoken=\relax
+ \else
+ \def\nexttoken{\qr at writeformatA@recursive{#1}(#3)}%
+ \fi
+ \nexttoken
+}%
+
+\def\qr at writeformatB@recursive#1(#2#3){%
+ % #1 = matrix name
+ % #2 = first bit of string
+ % #3 = rest of bitstream
+ % (qr at i,qr at j) = current (valid) position to write (in LaTeX counters)
+ \def\formattowrite{#3}%
+ \ifnum#2=1\relax
+ \qr at storetomatrix{#1}{\theqr at i}{\theqr at j}{\qr at black@format}%
+ \else
+ \qr at storetomatrix{#1}{\theqr at i}{\theqr at j}{\qr at white@format}%
+ \fi
+ % Now the tricky part--moving counters i and j to their next positions.
+ \qr at a=\qr at size%
+ \advance\qr at a by -6\relax%
+ \ifnum\qr at a<\qr at i\relax
+ %If we're not yet in row n-6, move up.
+ \addtocounter{qr at i}{-1}%
+ \else
+ \ifnum\qr at a=\qr at i\relax
+ %If we're actually in row n-6, we jump to position (9,n-7).
+ \setcounter{qr at i}{9}%
+ %Set counter j equal to \qr at size-7.
+ \global\qr at j=\qr at size\relax%
+ \global\advance\qr at j by -7\relax%
+ \else
+ %Otherwise, we must be in row 9.
+ %In this case, we move right.
+ \stepcounter{qr at j}%
+ \fi
+ \fi
+ %N.B. that at the end of time, this will leave us at invalid position (9,n+1).
+ %That makes for an easy test to know when we are done.
+ \xa\ifnum\qr at size<\qr at j\relax
+ \let\nexttoken=\relax
+ \else
+ \def\nexttoken{\qr at writeformatB@recursive{#1}(#3)}%
+ \fi
+ \nexttoken
+}%
+
+\def\qr at writeversionstring#1#2{%
+ % #1 = matrix name
+ % #2 = binary string representing the encoded version information
+ %
+ % Plot the encoded version string into the matrix.
+ % This is only done for versions 7 and higher.
+ \xa\ifnum\qr at version>6\relax
+ %Move to position (n-8,6).
+ \setcounter{qr at i}{\qr at size}\relax%
+ \addtocounter{qr at i}{-8}\relax%
+ \setcounter{qr at j}{6}%
+ \edef\qr at argument{{#1}(#2\relax)}%
+ \xa\qr at writeversion@recursive\qr at argument
+ \fi
+}%
+
+\def\qr at writeversion@recursive#1(#2#3){%
+ % #1 = matrix name
+ % #2 = first bit of string
+ % #3 = rest of bitstream
+ % (qr at i,qr at j) = current (valid) position to write (in LaTeX counters)
+ %
+ % The version information is stored symmetrically in the matrix
+ % In two transposed regions, so we can write both at the same time.
+ % In the comments, we describe what happens in the lower-left region,
+ % not the upper-right.
+ %
+ \def\versiontowrite{#3}%
+ %
+ %Set \topline equal to n-10.
+ \qr at a=\qr at size\relax%
+ \advance\qr at a by -10\relax%
+ \edef\topline{\the\qr at a}%
+ %
+ \ifnum#2=1\relax
+ \qr at storetomatrix{#1}{\theqr at i}{\theqr at j}{\qr at black@format}%
+ \qr at storetomatrix{#1}{\theqr at j}{\theqr at i}{\qr at black@format}%
+ \else
+ \qr at storetomatrix{#1}{\theqr at i}{\theqr at j}{\qr at white@format}%
+ \qr at storetomatrix{#1}{\theqr at j}{\theqr at i}{\qr at white@format}%
+ \fi
+ % Now the tricky part--moving counters i and j to their next positions.
+ \addtocounter{qr at i}{-1}%
+ \xa\ifnum\topline>\qr at i\relax
+ %We've overshot the top of the region.
+ %We need to move left one column and down three.
+ \addtocounter{qr at j}{-1}%
+ \addtocounter{qr at i}{3}%
+ \fi
+ %N.B. that at the end of time, this will leave us at invalid position (n-8,0).
+ %That makes for an easy test to know when we are done.
+ \ifnum\qr at j<1\relax
+ \let\nexttoken=\relax
+ \else
+ \def\nexttoken{\qr at writeversion@recursive{#1}(#3)}%
+ \fi
+ \nexttoken
+}%
+\newcount\qr at hexchars
+
+\def\qr at string@binarytohex#1{%
+ \qr at binarytohex{\qr at hex@result}{#1}%
+}%
+
+\def\qr at encode@binary#1{%
+ % #1 = string of ascii characters, to be converted into bitstream
+ %
+ % We do this one entirely in hex, rather than binary, because we can.
+ \edef\plaintext{#1}%
+ %
+ %First, the mode indicator.
+ \def\qr at codetext{4}% %This means `binary'
+ %
+ %Next, the character count.
+ \qr at getstringlength{\plaintext}%
+ %Set \charactercountlengthinhex to \qr at charactercountbits@byte/4%
+ \qr at a=\qr at charactercountbits@byte\relax%
+ \divide \qr at a by 4\relax%
+ \edef\charactercountlengthinhex{\the\qr at a}%
+ \qr at decimaltohex[\charactercountlengthinhex]{\charactercount}{\qr at stringlength}%
+ \xa\g at addto@macro\xa\qr at codetext\xa{\charactercount}%
+ %
+ %Now comes the actual data.
+ \edef\qr at argument{(,\plaintext\relax\relax\relax)}%
+ \xa\qr at encode@ascii at recursive\qr at argument%
+ %
+ %Now the terminator.
+ \g at addto@macro\qr at codetext{0}% %This is '0000' in binary.
+ %
+ %There is no need to pad bits to make a multiple of 8,
+ %because the data length is already 4 + 8 + 8n + 4.
+ %
+ %Now add padding codewords if needed.
+ \setcounter{qr at hexchars}{0}%
+ \qr at getstringlength{\qr at codetext}%
+ \setcounter{qr at hexchars}{\qr at stringlength}%
+ %Set \qr at numpaddingcodewords equal to \qr at totaldatacodewords - hexchars/2.
+ \qr at a=-\qr at hexchars\relax
+ \divide\qr at a by 2\relax
+ \advance\qr at a by \qr at totaldatacodewords\relax
+ \edef\qr at numpaddingcodewords{\the\qr at a}%
+ %
+ \xa\ifnum\qr at numpaddingcodewords<0%
+ \edef\ds{ERROR: Too much data! Over by \qr at numpaddingcodewords bytes.}\show\ds%
+ \fi%
+ \xa\ifnum\qr at numpaddingcodewords>0%
+ \qr at for \i = 2 to \qr at numpaddingcodewords by 2%
+ {\g at addto@macro{\qr at codetext}{ec11}}%
+ \xa\ifodd\qr at numpaddingcodewords\relax%
+ \g at addto@macro{\qr at codetext}{ec}%
+ \fi%
+ \fi%
+}%
+
+\def\qr at encode@ascii at recursive(#1,#2#3){%
+ % #1 = hex codes translated so far
+ % #2 = next plaintext character to translate
+ % #3 = remainder of plaintext
+ \edef\testii{#2}%
+ \ifx\testii\@relax%
+ % All done!
+ \g at addto@macro\qr at codetext{#1}%
+ \else%
+ % Another character to translate.
+ \edef\asciicode{\number`#2}%
+ \qr at decimaltohex[2]{\newhexcodes}{\asciicode}%
+ \edef\qr at argument{(#1\newhexcodes,#3)}%
+ %\show\qr at argument
+ \xa\qr at encode@ascii at recursive\qr at argument%
+ \fi%
+}%
+
+\def\qr at splitcodetextintoblocks{%
+ \setcounter{qr at i}{0}%
+ \qr at for \j = 1 to \qr at numshortblocks by 1%
+ {\stepcounter{qr at i}%
+ \qr at splitoffblock{\qr at codetext}{\theqr at i}{\qr at shortblock@size}%
+ }%
+ \xa\ifnum\qr at numlongblocks>0\relax%
+ \qr at for \j = 1 to \qr at numlongblocks by 1%
+ {\stepcounter{qr at i}%
+ \qr at splitoffblock{\qr at codetext}{\theqr at i}{\qr at longblock@size}%
+ }%
+ \fi%
+}%
+
+\def\qr at splitoffblock#1#2#3{%
+ % #1 = current codetext in hexadecimal
+ % #2 = number to use in csname "\datablock@#2".
+ % #3 = number of bytes to split off
+ \qrmessage{<Splitting off block #2>}%
+ \xa\gdef\csname datablock@#2\endcsname{}% %This line is important!
+ \qr at for \i = 1 to #3 by 1%
+ {\edef\qr at argument{{#2}(#1)}%
+ \xa\qr at splitoffblock@int\qr at argument%
+ }%
+}%
+
+\def\qr at splitoffblock@int#1(#2#3#4){%
+ % #1 = number to use in csname "\datablock@#1".
+ % #2#3 = next byte to split off
+ % #4 = remaining text
+ %
+ % We add the next byte to "\datablock@#1",
+ % and we remove it from the codetext.
+ \xa\xdef\csname datablock@#1\endcsname{\csname datablock@#1\endcsname#2#3}%
+ \xdef\qr at codetext{#4}%
+}%
+
+\def\qr at createerrorblocks{%
+ \qr at for \ii = 1 to \qr at numblocks by 1%
+ {\qrmessage{<Making error block \the\ii>}%
+ \FX at generate@errorbytes{\csname datablock@\the\ii\endcsname}{\qr at num@eccodewords}%
+ \xa\xdef\csname errorblock@\the\ii\endcsname{\FX at errorbytes}%
+ }%
+}%
+
+\def\qr at interleave{%
+ \setcounter{qr at i}{0}%
+ \def\qr at interleaved@text{}%
+ \qrmessage{<Interleaving datablocks of length \qr at shortblock@size\space and \qr at longblock@size: }%
+ \qr at for \ii = 1 to \qr at shortblock@size by 1%
+ {\qr at for \jj = 1 to \qr at numblocks by 1%
+ {\qr at writefromblock{datablock}{\the\jj}%
+ }%
+ \qrmessage{\the\ii,}%
+ }%
+ %The long blocks are numbered \qr at numshortblocks+1, \qr at numshortblocks+2, ..., \qr at numblocks.
+ \qr at a=\qr at numshortblocks\relax%
+ \advance\qr at a by 1\relax%
+ \qr at for \jj = \qr at a to \qr at numblocks by 1%
+ {\qr at writefromblock{datablock}{\the\jj}}%
+ \xa\ifnum\qr at numlongblocks>0\relax%
+ \qrmessage{\qr at longblock@size.>}%
+ \else
+ \qrmessage{.>}%
+ \fi
+ \qrmessage{<Interleaving errorblocks of length \qr at num@eccodewords: }%
+ \qr at for \ii = 1 to \qr at num@eccodewords by 1%
+ {\qrmessage{\the\ii,}%
+ \qr at for \jj = 1 to \qr at numblocks by 1%
+ {\qr at writefromblock{errorblock}{\the\jj}%
+ }%
+ }%
+ \qrmessage{.><Interleaving complete.>}%
+}%
+
+\def\qr at writefromblock#1#2{%
+ % #1 = either 'datablock' or 'errorblock'
+ % #2 = block number, in {1,...,\qr at numblocks}%
+ \edef\qr at argument{(\csname #1@#2\endcsname\relax\relax\relax)}%
+ \xa\qr at writefromblock@int\qr at argument
+ \xa\xdef\csname #1@#2\endcsname{\qr at writefromblock@remainder}%
+}%
+
+\def\qr at writefromblock@int(#1#2#3){%
+ % #1#2 = first byte (in hex) of text, which will be written to \qr at interleaved@text
+ % #3 = remainder, including \relax\relax\relax terminator.
+ \g at addto@macro{\qr at interleaved@text}{#1#2}%
+ \qr at writefromblock@intint(#3)%
+}%
+
+\def\qr at writefromblock@intint(#1\relax\relax\relax){%
+ \xdef\qr at writefromblock@remainder{#1}%
+}%
+\let\xa=\expandafter
+
+\def\preface at macro#1#2{%
+ % #1 = macro name
+ % #2 = text to add to front of macro
+ \def\tempb{#2}%
+ \xa\xa\xa\gdef\xa\xa\xa#1\xa\xa\xa{\xa\tempb #1}%
+}%
+
+\newif\ifqr at leadingcoeff
+\def\qr at testleadingcoeff(#1#2){%
+ % Tests whether the leading digit of #1#2 is 1.
+ \ifnum#1=1\relax
+ \qr at leadingcoefftrue
+ \else
+ \qr at leadingcoefffalse
+ \fi
+}%
+
+\def\qr at polynomialdivide#1#2{%
+ \edef\qr at numerator{#1}%
+ \edef\qr at denominator{#2}%
+ \qr at divisiondonefalse%
+ \xa\xa\xa\qr at oneroundofdivision\xa\xa\xa{\xa\qr at numerator\xa}\xa{\qr at denominator}%
+}%
+
+\def\@qr at empty{}%
+\def\qr at oneroundofdivision#1#2{%
+ % #1 = f(x), of degree n
+ % #2 = g(x), of degree m
+ % Obtains a new polynomial h(x), congruent to f(x) modulo g(x),
+ % but of degree at most n-1.
+ %
+ % If leading coefficient of f(x) is 1, subtracts off g(x) * x^(n-m).
+ % If leading coefficient of f(x) is 0, strips off that leading zero.
+ %
+ \qr at testleadingcoeff(#1)%
+ \ifqr at leadingcoeff
+ \qr at xorbitstrings{#1}{#2}%
+ \ifqr at xorfailed
+ %If xor failed, that means our #1 was already the remainder!
+ \qr at divisiondonetrue
+ \edef\theremainder{#1}%
+ \else
+ %xor succeeded. We need to recurse.
+ \xa\xa\xa\edef\xa\xa\xa\qr at numerator\xa\xa\xa{\xa\qr at stripleadingzero\xa(\xorresult)}%
+ \fi
+ \else
+ \xa\def\xa\qr at numerator\xa{\qr at stripleadingzero(#1)}%
+ \ifx\qr at numerator\@qr at empty
+ \qr at divisiondonetrue
+ \def\theremainder{0}%
+ \fi
+ \fi
+ \ifqr at divisiondone
+ \relax
+ \else
+ \xa\qr at oneroundofdivision\xa{\qr at numerator}{#2}%
+ \fi
+}%
+
+\def\qr at stripleadingzero(0#1){#1}%Strips off a leading zero.
+
+\newif\ifqr at xorfailed% This flag will trigger when #2 is longer than #1.
+
+\def\qr at xorbitstrings#1#2{%
+ % #1 = bitstring
+ % #2 = bitstring no longer than #1
+ \qr at xorfailedfalse
+ \edef\qr at argument{(,#1\relax\relax)(#2\relax\relax)}%
+ \xa\qr at xorbitstrings@recursive\qr at argument
+ %\qr at xorbitstrings@recursive(,#1\relax\relax)(#2\relax\relax)%
+}%
+
+\def\qr at xorbitstrings@recursive(#1,#2#3)(#4#5){%
+ % #1#2#3 is the first bitstring, xor'ed up through #1.
+ % #4#5 is the remaining portion of the second bitstring.
+ \def\testii{#2}%
+ \def\testiv{#4}%
+ \ifx\testii\@relax
+ % #1 contains the whole string.
+ % Now if #4 is also \relax, that means the two strings started off with equal lengths.
+ % If, however, #4 is not \relax, that means the second string was longer than the first, a problem.
+ \ifx\testiv\@relax
+ %No problem. We are done.
+ \qr at xorbit@saveresult(#1#2#3)%
+ \else
+ %Problem! The second string was longer than the first.
+ \qr at xorfailedtrue
+ \def\xorresult{}%
+ \fi
+ \else
+ % There is still a bit to manipulate in #2.
+ % Check whether #4 contains anything.
+ \ifx\testiv\@relax
+ % No, #4 is empty. We are done. "#2#3" contains the remainder of the first string,
+ % which we append untouched and then strip off the two \relax-es.
+ \qr at xorbit@saveresult(#1#2#3)%
+ \else
+ % Yes, #4 still has something to XOR. Do the task.
+ \ifnum#2=#4\relax
+ \qr at xorbitstrings@recursive(#1%
+ 0,#3)(#5)%
+ \else
+ \qr at xorbitstrings@recursive(#1%
+ 1,#3)(#5)%
+ \fi
+ \fi
+ \fi
+}%
+
+\def\qr at xorbit@saveresult(#1\relax\relax){%
+ %Strips off the extra '\relax'es at the end.
+ \def\xorresult{#1}%
+}%
+
+\newif\ifqr at divisiondone
+\def\dodivision#1#2{%
+ \qr at divisiondonefalse
+ \dodivision at recursive{#1}{#2}%
+}%
+
+\def\BCHcode#1{%
+ \edef\formatinfo{#1}%
+ \def\formatinfopadded{\formatinfo 0000000000}%
+ \def\qr at divisor{10100110111}%
+ \qr at divisiondonefalse
+ \qr at polynomialdivide{\formatinfopadded}{\qr at divisor}%
+ %
+ \qr at getstringlength{\theremainder}%
+ %Run loop from stringlength+1 to 10.
+ \qr at a=\qr at stringlength\relax%
+ \advance\qr at a by 1\relax%
+ \qr at for \i = \qr at a to 10 by 1%
+ {\preface at macro{\theremainder}{0}%
+ \xdef\theremainder{\theremainder}%
+ }%
+ \edef\BCHresult{\formatinfo\theremainder}%
+}%
+
+\def\qr at formatmask{101010000010010}%
+
+\def\qr at encodeandmaskformat#1{%
+ \BCHcode{#1}%
+ \qr at xorbitstrings{\BCHresult}{\qr at formatmask}%
+ \edef\qr at format@bitstring{\xorresult}%
+}%
+
+\def\qr at Golaycode#1{%
+ % #1 = 6-bit version number
+ \edef\qr at versioninfo{#1}%
+ \def\qr at versioninfopadded{\qr at versioninfo 000000000000}% %Append 12 zeros.
+ \def\qr at divisor{1111100100101}%
+ \qr at divisiondonefalse
+ \qr at polynomialdivide{\qr at versioninfopadded}{\qr at divisor}%
+ %
+ \qr at getstringlength{\theremainder}%
+ %Run loop from stringlength+1 to 12.
+ \qr at a=\qr at stringlength\relax%
+ \advance\qr at a by 1\relax%
+ \qr at for \i = \qr at a to 12 by 1%
+ {\preface at macro{\theremainder}{0}%
+ \xdef\theremainder{\theremainder}%
+ }%
+ \edef\Golayresult{\qr at versioninfo\theremainder}%
+}%
+\def\F at result{}%
+
+\def\qr at xorbitstring#1#2#3{%
+ % #1 = new macro to receive result
+ % #2, #3 = bitstrings to xor. The second can be shorter than the first.
+ \def\qr at xor@result{}%
+ \edef\qr at argument{(#2\relax\relax)(#3\relax\relax)}%
+ \xa\qr at xorbitstring@recursive\qr at argument%
+ \edef#1{\qr at xor@result}%
+}%
+\def\qr at xorbitstring@recursive(#1#2)(#3#4){%
+ \edef\testi{#1}%
+ \ifx\testi\@relax%
+ %Done.
+ \let\qr at next=\relax%
+ \else
+ \if#1#3\relax
+ \g at addto@macro{\qr at xor@result}{0}%
+ \else
+ \g at addto@macro{\qr at xor@result}{1}%
+ \fi
+ \edef\qr at next{\noexpand\qr at xorbitstring@recursive(#2)(#4)}%
+ \fi
+ \qr at next
+}
+
+\def\F at addchar@raw#1#2{%
+ %Add two hexadecimal digits using bitwise xor
+ \qr at hextobinary[4]{\summandA}{#1}%
+ \qr at hextobinary[4]{\summandB}{#2}%
+ \qr at xorbitstring{\F at result}{\summandA}{\summandB}%
+ \qr at binarytohex[1]{\F at result}{\F at result}%
+}%
+
+\def\canceltwos#1{%
+ \edef\qr at argument{(#1\relax\relax)}%
+ \xa\canceltwos at int\qr at argument%
+}%
+
+\def\canceltwos at int(#1#2){%
+ \xa\canceltwos at recursion(,#1#2)%
+}%
+
+\def\canceltwos at recursion(#1,#2#3){%
+ \def\testii{#2}%
+ \ifx\testii\@relax
+ %Cancelling complete.
+ \striptworelaxes(#1#2#3)%
+ %Now \F at result contains the answer.
+ \else
+ \relax
+ \ifnum#2=2\relax
+ \canceltwos at recursion(#10,#3)%
+ \else
+ \canceltwos at recursion(#1#2,#3)%
+ \fi
+ \fi
+}%
+
+\def\striptworelaxes(#1\relax\relax){%
+ \gdef\F at result{#1}%
+}%
+
+\qr at for \i = 0 to 15 by 1%
+ {\qr at decimaltohex[1]{\qr at tempa}{\the\i}%
+ \qr at for \j = 0 to 15 by 1%
+ {\qr at decimaltohex[1]{\qr at tempb}{\the\j}%
+ \F at addchar@raw\qr at tempa\qr at tempb
+ \xa\xdef\csname F at addchar@\qr at tempa\qr at tempb\endcsname{\F at result}%
+ }%
+ }%
+
+\def\F at addchar#1#2{%
+ \xa\def\xa\F at result\xa{\csname F at addchar@#1#2\endcsname}%
+}%
+
+\def\F at addstrings#1#2{%
+ \edef\qr at argument{(,#1\relax\relax)(#2\relax\relax)}%
+ \xa\F at addstrings@recursion\qr at argument%
+}%
+
+\def\F at addstrings@recursion(#1,#2#3)(#4#5){%
+ %Adds two hexadecimal strings, bitwise, from left to right.
+ %The second string is allowed to be shorter than the first.
+ \def\testii{#2}%
+ \def\testiv{#4}%
+ \ifx\testii\@relax
+ %The entire string has been processed.
+ \gdef\F at result{#1}%
+ \else
+ \ifx\testiv\@relax
+ %The second string is over.
+ \striptworelaxes(#1#2#3)%
+ %Now \F at result contains the answer.
+ \else
+ %We continue to add.
+ \F at addchar{#2}{#4}%
+ \edef\qr at argument{(#1\F at result,#3)(#5)}%
+ \xa\F at addstrings@recursion\qr at argument%
+ \fi
+ \fi
+}%
+\gdef\F at stripleadingzero(0#1){\edef\F at result{#1}}%
+
+\qr at i=0%
+\def\poweroftwo{1}%
+\qr at for \i = 1 to 254 by 1%
+ {\global\advance\qr at i by1%
+ \qr at a=\poweroftwo\relax
+ \multiply\qr at a by 2\relax
+ \edef\poweroftwo{\the\qr at a}%
+ %\show\poweroftwo
+ \qr at decimaltohex[2]{\poweroftwo at hex}{\poweroftwo}%
+ \xa\ifnum\poweroftwo>255\relax
+ %We need to bitwise add the polynomial represented by 100011101, i.e. 0x11d.
+ \F at addstrings{\poweroftwo at hex}{11d}% %Now it should start with 0.
+ \xa\F at stripleadingzero\xa(\F at result)% %Now it should be two hex digits.
+ \edef\poweroftwo at hex{\F at result}% %Save the hex version.
+ \qr at hextodecimal{\poweroftwo}{\F at result}%
+ \fi
+ \xdef\poweroftwo{\poweroftwo}%
+ \xa\xdef\csname F at twotothe@\theqr at i\endcsname{\poweroftwo at hex}%
+ \xa\xdef\csname F at logtwo@\poweroftwo at hex\endcsname{\theqr at i}%
+ }%
+\xa\xdef\csname F at twotothe@0\endcsname{01}%
+\xa\xdef\csname F at logtwo@01\endcsname{0}%
+
+\def\F at twotothe#1{%
+ \xa\xdef\xa\F at result\xa{\csname F at twotothe@#1\endcsname}%
+}%
+\def\F at logtwo#1{%
+ \xa\xdef\xa\F at result\xa{\csname F at logtwo@#1\endcsname}%
+}%
+
+\def\@zerozero{00}%
+
+\def\F at multiply#1#2{%
+ % #1 and #2 are two elements of F_256,
+ % given as two-character hexadecimal strings.
+ % Multiply them within F_256, and place the answer in \F at result
+ \edef\argA{#1}%
+ \edef\argB{#2}%
+ \ifx\argA\@zerozero
+ \def\F at result{00}%
+ \else
+ \ifx\argB\@zerozero
+ \def\F at result{00}%
+ \else
+ \xa\F at logtwo\xa{\argA}%
+ \edef\logA{\F at result}%
+ \xa\F at logtwo\xa{\argB}%
+ \edef\logB{\F at result}%
+ \xa\qr at a\xa=\logA\relax% \qr at a = \logA
+ \xa\advance\xa\qr at a\logB\relax% \advance \qr at a by \logB
+ \ifnum\qr at a>254\relax%
+ \advance\qr at a by -255\relax%
+ \fi%
+ \xa\F at twotothe\xa{\the\qr at a}%
+ % Now \F at result contains the product, as desired.
+ \fi
+ \fi
+}%
+
+\def\F at multiply#1#2{%
+ % #1 and #2 are two elements of F_256,
+ % given as two-character hexadecimal strings.
+ % Multiply them within F_256, and place the answer in \F at result
+ \edef\argA{#1}%
+ \edef\argB{#2}%
+ \ifx\argA\@zerozero
+ \def\F at result{00}%
+ \else
+ \ifx\argB\@zerozero
+ \def\F at result{00}%
+ \else
+ \xa\F at logtwo\xa{\argA}%
+ \edef\logA{\F at result}%
+ \xa\F at logtwo\xa{\argB}%
+ \edef\logB{\F at result}%
+ \xa\qr at a\xa=\logA\relax% \qr at a = \logA
+ \xa\advance\xa\qr at a\logB\relax% \advance \qr at a by \logB
+ \ifnum\qr at a>254\relax%
+ \advance\qr at a by -255\relax%
+ \fi%
+ \xa\F at twotothe\xa{\the\qr at a}%
+ % Now \F at result contains the product, as desired.
+ \fi
+ \fi
+}%
+
+\def\FX at getstringlength#1{%
+ %Count number of two-character coefficients
+ \setcounter{qr at i}{0}%
+ \xdef\qr at argument{(#1\relax\relax\relax)}%
+ \xa\FX at stringlength@recursive\qr at argument%
+ \xdef\stringresult{\arabic{qr at i}}%
+}%
+
+\def\FX at stringlength@recursive(#1#2#3){%
+ \def\testi{#1}%
+ \ifx\testi\@relax
+ %we are done.
+ \else
+ \stepcounter{qr at i}%
+ %\showthe\c at qr@i
+ \qr at stringlength@recursive(#3)%
+ \fi
+}%
+
+\newif\ifFX at leadingcoeff@zero
+\def\FX at testleadingcoeff(#1#2#3){%
+ % Tests whether the leading coefficient of the hex-string #1#2#3 is '00'.
+ \edef\FX at leadingcoefficient{#1#2}%
+ \FX at leadingcoeff@zerofalse
+ \ifx\FX at leadingcoefficient\@zerozero
+ \FX at leadingcoeff@zerotrue
+ \fi
+}%
+
+\newif\ifFX at divisiondone
+
+\newcount\qr at divisionsremaining %Keep track of how many divisions to go!
+\def\FX at polynomialdivide#1#2{%
+ \edef\FX at numerator{#1}%
+ \edef\denominator{#2}%
+ \qr at getstringlength\FX at numerator%
+ \setcounter{qr at divisionsremaining}{\qr at stringlength}%
+ \qr at getstringlength\denominator%
+ \addtocounter{qr at divisionsremaining}{-\qr at stringlength}%
+ \addtocounter{qr at divisionsremaining}{2}%
+ \divide\qr at divisionsremaining by 2\relax% %2 hex chars per number
+ \FX at divisiondonefalse%
+ \xa\xa\xa\FX at polynomialdivide@recursive\xa\xa\xa{\xa\FX at numerator\xa}\xa{\denominator}%
+}%
+
+\def\FX at polynomialdivide@recursive#1#2{%
+ % #1 = f(x), of degree n
+ % #2 = g(x), of degree m
+ % Obtains a new polynomial h(x), congruent to f(x) modulo g(x),
+ % but of degree at most n-1.
+ %
+ % If leading coefficient of f(x) is 0, strips off that leading zero.
+ % If leading coefficient of f(x) is a, subtracts off a * g(x) * x^(n-m).
+ % N.B. we assume g is monic.
+ %
+ \FX at testleadingcoeff(#1)%
+ \ifFX at leadingcoeff@zero%
+ %Leading coefficient is zero, so remove it.
+ \xa\def\xa\FX at numerator\xa{\FX at stripleadingzero(#1)}%
+ \else%
+ %Leading coefficient is nonzero, and contained in \FX at leadingcoefficient
+ \FX at subtractphase{#1}{#2}{\FX at leadingcoefficient}%
+ \ifFX at subtract@failed%
+ %If subtraction failed, that means our #1 was already the remainder!
+ \FX at divisiondonetrue%
+ \edef\theremainder{#1}%
+ \else%
+ %xor succeeded. We need to recurse.
+ \xa\xa\xa\edef\xa\xa\xa\FX at numerator\xa\xa\xa{\xa\FX at stripleadingzero\xa(\FX at subtraction@result)}%
+ \fi%
+ \fi%
+ \addtocounter{qr at divisionsremaining}{-1}%
+ \ifnum\qr at divisionsremaining=0\relax
+ %Division is done!
+ \FX at divisiondonetrue%
+ \edef\theremainder{\FX at numerator}%
+ \relax%
+ \else%
+ \xa\FX at polynomialdivide@recursive\xa{\FX at numerator}{#2}%
+ \fi%
+}%
+
+\def\FX at stripleadingzero(00#1){#1}%Strips off a single leading zero of F_256.
+
+\newif\ifFX at subtract@failed% This flag will trigger when #2 is longer than #1.
+
+\def\FX at subtractphase#1#2#3{%
+ % #1 = bitstring
+ % #2 = bitstring no longer than #1
+ % #3 = leading coefficient
+ \FX at subtract@failedfalse%
+ \edef\qr at argument{(,#1\relax\relax\relax)(#2\relax\relax\relax)(#3)}%
+ \xa\FX at subtract@recursive\qr at argument%
+}%
+
+\def\FX at subtract@recursive(#1,#2#3#4)(#5#6#7)(#8){%
+ % This is a recursive way to compute f(x) - a*g(x)*x^k.
+ % #1#2#3#4 is the first bitstring, subtracted up through #1.
+ % Thus #2#3 constitutes the next two-character coefficient.
+ % #5#6#7 is the remaining portion of the second bitstring.
+ % Thus #5#6 constitutes the next two-character coefficient
+ % #8 is the element a of F_256. It should contain two characters.
+ \def\testii{#2}%
+ \def\testv{#5}%
+ \ifx\testii\@relax
+ % #1 contains the whole string.
+ % Now if #5 is also \relax, that means the two strings started off with equal lengths.
+ % If, however, #5 is not \relax, that means the second string was longer than the first, a problem.
+ \ifx\testv\@relax
+ %No problem. We are done.
+ \FX at subtract@saveresult(#1#2#3#4)% %We keep the #2#3#4 to be sure we have all three relax-es to strip off.
+ \else
+ %Problem! The second string was longer than the first.
+ %This usually indicates the end of the long division process.
+ \FX at subtract@failedtrue
+ \def\FX at subtraction@result{}%
+ \fi
+ \else
+ % There is still a coefficient to manipulate in #2#3.
+ % Check whether #5 contains anything.
+ \ifx\testv\@relax
+ % No, #5 is empty. We are done. "#2#3#4" contains the remainder of the first string,
+ % which we append untouched and then strip off the three \relax-es.
+ \FX at subtract@saveresult(#1#2#3#4)%
+ \else
+ % Yes, #5#6 still has something to XOR. Do the task.
+ \F at multiply{#5#6}{#8}% Multiply by the factor 'a'.
+ \F at addstrings{#2#3}{\F at result}% Subtract. (We're in characteristic two, so adding works.)
+ \edef\qr at argument{(#1\F at result,#4)(#7)(#8)}%
+ \xa\FX at subtract@recursive\qr at argument%
+ \fi
+ \fi
+}%
+
+\def\FX at subtract@saveresult(#1\relax\relax\relax){%
+ %Strips off the three extra '\relax'es at the end.
+ \def\FX at subtraction@result{#1}%
+}%
+
+\def\FX at creategeneratorpolynomial#1{%
+ % #1 = n, the number of error codewords desired.
+ % We need to create \prod_{j=0}^{n-1} (x-2^j).
+ \edef\FX at generator@degree{#1}%
+ \def\FX at generatorpolynomial{01}% Initially, set it equal to 1.
+ \setcounter{qr at i}{0}%
+ \FX at creategenerator@recursive%
+ %The result is now stored in \FX at generatorpolynomial
+}%
+
+\def\FX at creategenerator@recursive{%
+ % \c at qr@i contains the current value of i.
+ % \FX at generatorpolynomial contains the current polynomial f(x),
+ % which should be a degree-i polynomial
+ % equal to \prod_{j=0}^{i-1} (x-2^j).
+ % (If i=0, then \FX at generatorpolynomial should be 01.)
+ % This recursion step should multiply the existing polynomial by (x-2^i),
+ % increment i by 1, and check whether we're done or not.
+ \edef\summandA{\FX at generatorpolynomial 00}% This is f(x) * x
+ \edef\summandB{00\FX at generatorpolynomial}% This is f(x), with a 0x^{i+1} in front.
+ \F at twotothe{\theqr at i}%
+ \edef\theconstant{\F at result}%
+ \FX at subtractphase{\summandA}{\summandB}{\theconstant}%
+ %This calculates \summandA + \theconstant * \summandB
+ %and stores the result in \FX at subtraction@result
+ \edef\FX at generatorpolynomial{\FX at subtraction@result}%
+ \stepcounter{qr at i}%
+ \xa\ifnum\FX at generator@degree=\qr at i\relax%
+ %We just multiplied by (x-2^{n-1}), so we're done.
+ \relax%
+ \else%
+ %We need to do this again!
+ \xa%
+ \FX at creategenerator@recursive%
+ \fi%
+}%
+
+\def\FX at generate@errorbytes#1#2{%
+ % #1 = datastream in hex
+ % #2 = number of error correction bytes requested
+ \edef\numerrorbytes{#2}%
+ \xa\FX at creategeneratorpolynomial\xa{\numerrorbytes}%
+ \edef\FX at numerator{#1}%
+ \qr at for \i = 1 to \numerrorbytes by 1%
+ {\g at addto@macro\FX at numerator{00}}% %One error byte means two hex codes.
+ \FX at polynomialdivide{\FX at numerator}{\FX at generatorpolynomial}%
+ \edef\FX at errorbytes{\theremainder}%
+}%
+\newif\ifqr at versionmodules
+
+\def\qr at level@char#1{%
+ \xa\ifcase#1
+ M\or L\or H\or Q\fi}%
+
+\newif\ifqr at versiongoodenough
+\def\qr at choose@best at version#1{%
+ % \qr at desiredversion = user-requested version
+ % \qr at desiredlevel = user-requested error-correction level
+ \edef\qr at plaintext{#1}%
+ \qr at getstringlength{\qr at plaintext}%
+ %
+ %Run double loop over levels and versions, looking for
+ %the smallest version that can contain our data,
+ %and then choosing the best error-correcting level at that version,
+ %subject to the level being at least as good as the user desires.
+ \global\qr at versiongoodenoughfalse%
+ \gdef\qr at bestversion{0}%
+ \gdef\qr at bestlevel{0}%
+ \ifnum\qr at desiredversion=0\relax
+ \qr at a=1\relax
+ \else
+ \qr at a=\qr at desiredversion\relax
+ \fi
+ \qr at for \i=\qr at a to 40 by 1
+ {\edef\qr at version{\the\i}%
+ \global\qr at versiongoodenoughfalse
+ \qr at for \j=0 to 3 by 1%
+ {%First, we map {0,1,2,3} to {1,0,4,3}, so that we loop through {M,L,H,Q}
+ %in order of increasing error-correction capabilities.
+ \qr at a = \j\relax
+ \divide \qr at a by 2\relax
+ \multiply \qr at a by 4\relax
+ \advance \qr at a by 1\relax
+ \advance \qr at a by -\j\relax
+ \edef\qr at level{\the\qr at a}%
+ \ifnum\qr at desiredlevel=\qr at a\relax
+ \global\qr at versiongoodenoughtrue
+ \fi
+ \ifqr at versiongoodenough
+ \qr at calculate@capacity{\qr at version}{\qr at level}%
+ \xa\xa\xa\ifnum\xa\qr at truecapacity\xa<\qr at stringlength\relax
+ %Too short
+ \relax
+ \else
+ %Long enough!
+ \xdef\qr at bestversion{\qr at version}%
+ \xdef\qr at bestlevel{\qr at level}%
+ \global\i=40%
+ \fi
+ \fi
+ }%
+ }%
+ \edef\qr at version{\qr at bestversion}%
+ \edef\qr at level{\qr at bestlevel}%
+ \xa\ifnum\qr at desiredversion>0\relax
+ \ifx\qr at bestversion\qr at desiredversion\relax
+ %No change from desired version.
+ \else
+ %Version was increased
+ \qrmessage{<Requested QR version '\qr at desiredversion' is too small for desired text.}%
+ \qrmessage{Version increased to '\qr at bestversion' to fit text.>^^J}%
+ \fi
+ \fi
+ \ifx\qr at bestlevel\qr at desiredlevel\relax
+ %No change in level.
+ \else
+ \qrmessage{<Error-correction level increased from \qr at level@char{\qr at desiredlevel}}%
+ \qrmessage{to \qr at level@char{\qr at bestlevel} at no cost.>^^J}%
+ \fi
+}%
+
+\def\qr at calculate@capacity#1#2{%
+ \edef\qr at version{#1}%
+ \edef\qr at level{#2}%
+ %Calculate \qr at size, the number of modules per side.
+ % The formula is 4\qr at version+17.
+ \qr at a=\qr at version\relax%
+ \multiply\qr at a by 4\relax%
+ \advance\qr at a by 17\relax%
+ \xdef\qr at size{\the\qr at a}%
+ %
+ % Calculate \qr at k, which governs the number of alignment patterns.
+ % The alignment patterns lie in a kxk square, except for 3 that are replaced by finding patterns.
+ % The formula is 2 + floor( \qr at version / 7 ), except that k=0 for version 1.
+ \xa\ifnum\qr at version=1\relax%
+ \def\qr at k{0}%
+ \else%
+ \qr at a=\qr at version\relax
+ \divide \qr at a by 7\relax
+ \advance\qr at a by 2\relax
+ \edef\qr at k{\the\qr at a}%
+ \fi%
+ %
+ %Calculate number of function pattern modules.
+ %This consists of the three 8x8 finder patterns, the two timing strips, and the (k^2-3) 5x5 alignment patterns.
+ %The formula is 160+2n+25(k^2-3)-10(k-2), unless k=0 in which case we just have 160+2n.
+ \qr at a=\qr at size\relax
+ \multiply\qr at a by 2\relax
+ \advance\qr at a by 160\relax
+ \xa\ifnum\qr at k=0\relax\else
+ %\qr at k is nonzero, hence at least 2, so we continue to add 25(k^2-3)-10(k-2).
+ \qr at b=\qr at k\relax
+ \multiply\qr at b by \qr at k\relax
+ \advance\qr at b by -3\relax
+ \multiply\qr at b by 25\relax
+ \advance\qr at a by \qr at b\relax
+ \qr at b=\qr at k\relax
+ \advance\qr at b by -2\relax
+ \multiply\qr at b by 10\relax
+ \advance\qr at a by -\qr at b\relax
+ \fi
+ \edef\qr at numfunctionpatternmodules{\the\qr at a}%
+ %
+ %Calculate the number of version modules, either 36 or 0.
+ \xa\ifnum\qr at version>6\relax
+ \qr at versionmodulestrue
+ \def\qr at numversionmodules{36}%
+ \else
+ \qr at versionmodulesfalse
+ \def\qr at numversionmodules{0}%
+ \fi
+ %
+ %Now calculate the codeword capacity and remainder bits.
+ %Take n^2 modules, subtract all those dedicated to finder patterns etc., format information, and version information,
+ %and what's left is the number of bits we can play with.
+ %The number of complete bytes is \qr at numdatacodewords;
+ %the leftover bits are \qr at numremainderbits.
+ \qr at a=\qr at size\relax
+ \multiply \qr at a by \qr at size\relax
+ \advance \qr at a by -\qr at numfunctionpatternmodules\relax
+ \advance \qr at a by -31\relax% % There are 31 format modules.
+ \advance \qr at a by -\qr at numversionmodules\relax
+ \qr at b=\qr at a\relax
+ \divide \qr at a by 8\relax
+ \edef\qr at numdatacodewords{\the\qr at a}%
+ \multiply\qr at a by 8\relax
+ \advance \qr at b by -\qr at a\relax
+ \edef\qr at numremainderbits{\the\qr at b}%
+ %
+ %The size of the character count indicator also varies by version.
+ %There are only two options, so hardcoding seems easier than expressing these functionally.
+ \xa\ifnum\qr at version<10\relax
+ \def\qr at charactercountbytes@byte{1}%
+ \def\qr at charactercountbits@byte{8}%
+ \else
+ \def\qr at charactercountbytes@byte{2}%
+ \def\qr at charactercountbits@byte{16}%
+ \fi
+ %
+ %Now we call on the table, from the QR specification,
+ %of how many blocks to divide the message into, and how many error bytes each block gets.
+ %This affects the true capacity for data, which we store into \qr at totaldatacodewords.
+ % The following macro sets \qr at numblocks and \qr at num@eccodewords
+ % based on Table 9 of the QR specification.
+ \qr at settableix
+ \qr at a = -\qr at numblocks\relax
+ \multiply \qr at a by \qr at num@eccodewords\relax
+ \advance\qr at a by \qr at numdatacodewords\relax
+ \edef\qr at totaldatacodewords{\the\qr at a}%
+ \advance\qr at a by -\qr at charactercountbytes@byte\relax%Subtract character count
+ \advance\qr at a by -1\relax% Subtract 1 byte for the 4-bit mode indicator and the 4-bit terminator at the end.
+ \edef\qr at truecapacity{\the\qr at a}%
+}
+
+\def\qr at setversion#1#2{%
+ % #1 = version number, an integer between 1 and 40 inclusive.
+ % #2 = error-correction level, as an integer between 0 and 3 inclusive.
+ % 0 = 00 = M
+ % 1 = 01 = L
+ % 2 = 10 = H
+ % 3 = 11 = Q
+ % This macro calculates and sets a variety of global macros and/or counters
+ % storing version information that is used later in construction the QR code.
+ % Thus \setversion should be called every time!
+ %
+ \edef\qr at version{#1}%
+ \edef\qr at level{#2}%
+ %
+ \qr at calculate@capacity{\qr at version}{\qr at level}%
+ %The capacity-check code sets the following:
+ % * \qr at size
+ % * \qr at k
+ % * \ifqr at versionmodules
+ % * \qr at numversionmodules
+ % * \qr at numdatacodewords
+ % * \qr at numremainderbits
+ % * \qr at charactercountbits@byte
+ % * \qr at charactercountbytes@byte
+ % * \qr at numblocks (via \qr at settableix)
+ % * \qr at num@eccodewords (via \qr at settableix)
+ % * \qr at totaldatacodewords
+ %
+ % The alignment patterns' square is 7 modules in from each edge.
+ % They are spaced "as evenly as possible" with an even number of modules between each row/column,
+ % unevenness in division being accommodated by making the first such gap smaller.
+ % The formula seems to be
+ % general distance = 2*round((n-13)/(k-1)/2+0.25)
+ % = 2*floor((n-13)/(k-1)/2+0.75)
+ % = 2*floor( (2*(n-13)/(k-1)+3) / 4 )
+ % = (((2*(n-13)) div (k-1) + 3 ) div 4 ) * 2
+ % first distance = leftovers
+ % The 0.25 is to accommodate version 32, which is the only time we round down.
+ % Otherwise a simple 2*ceiling((n-13)/(k-1)/2) would have sufficed.
+ %
+ \qr at a = \qr at size\relax
+ \advance\qr at a by -13\relax
+ \multiply\qr at a by 2\relax
+ \qr at b = \qr at k\relax
+ \advance \qr at b by -1\relax
+ \divide\qr at a by \qr at b\relax
+ \advance\qr at a by 3\relax
+ \divide\qr at a by 4\relax
+ \multiply\qr at a by 2\relax
+ \edef\qr at alignment@generalskip{\the\qr at a}%
+ %
+ %Now set \qr at alignment@firstskip to (\qr at size-13)-(\qr at k-2)*\qr at alignment@generalskip %
+ \qr at a = \qr at k\relax
+ \advance\qr at a by -2\relax
+ \multiply\qr at a by -\qr at alignment@generalskip\relax
+ \advance\qr at a by \qr at size\relax
+ \advance\qr at a by -13\relax
+ \edef\qr at alignment@firstskip{\the\qr at a}%
+ %
+ %
+ %
+ % Our \qr at totaldatacodewords bytes of data are broken up as evenly as possible
+ % into \qr at numblocks datablocks; some may be one byte longer than others.
+ % We set \qr at shortblock@size to floor(\qr at totaldatacodewords / \qr at numblocks)
+ % and \qr at numlongblocks to mod(\qr at totaldatacodewords , \qr at numblocks).
+ \qr at a=\qr at totaldatacodewords\relax
+ \divide\qr at a by \qr at numblocks\relax
+ \edef\qr at shortblock@size{\the\qr at a}%
+ \multiply\qr at a by -\qr at numblocks\relax
+ \advance\qr at a by \qr at totaldatacodewords\relax
+ \edef\qr at numlongblocks{\the\qr at a}%
+ %
+ %Set \qr at longblock@size to \qr at shortblock@size+1.
+ \qr at a=\qr at shortblock@size\relax
+ \advance\qr at a by 1\relax
+ \edef\qr at longblock@size{\the\qr at a}%
+ %
+ %Set \qr at numshortblocks to \qr at numblocks - \qr at numlongblocks
+ \qr at b=\qr at numblocks\relax
+ \advance\qr at b by -\qr at numlongblocks\relax
+ \edef\qr at numshortblocks{\the\qr at b}%
+}%
+
+\def\qr at settableix@int(#1,#2){%
+ \edef\qr at numblocks{#1}%
+ \edef\qr at num@eccodewords{#2}%
+}%
+
+\def\qr at settableix{%
+\xa\ifcase\qr at level\relax
+ %00: Level 'M', medium error correction
+ \edef\tempdata{(%
+ \ifcase\qr at version\relax
+ \relax %There is no version 0.
+ \or1,10%
+ \or1,16%
+ \or1,26%
+ \or2,18%
+ \or2,24%
+ \or4,16%
+ \or4,18%
+ \or4,22%
+ \or5,22%
+ \or5,26%
+ \or5,30%
+ \or8,22%
+ \or9,22%
+ \or9,24%
+ \or10,24%
+ \or10,28%
+ \or11,28%
+ \or13,26%
+ \or14,26%
+ \or16,26%
+ \or17,26%
+ \or17,28%
+ \or18,28%
+ \or20,28%
+ \or21,28%
+ \or23,28%
+ \or25,28%
+ \or26,28%
+ \or28,28%
+ \or29,28%
+ \or31,28%
+ \or33,28%
+ \or35,28%
+ \or37,28%
+ \or38,28%
+ \or40,28%
+ \or43,28%
+ \or45,28%
+ \or47,28%
+ \or49,28%
+ \fi)}%
+\or
+ %01: Level 'L', low error correction
+ \edef\tempdata{%
+ (\ifcase\qr at version\relax
+ \relax %There is no version 0.
+ \or 1,7%
+ \or 1,10%
+ \or 1,15%
+ \or 1,20%
+ \or 1,26%
+ \or 2,18%
+ \or 2,20%
+ \or 2,24%
+ \or 2,30%
+ \or 4,18%
+ \or 4,20%
+ \or 4,24%
+ \or 4,26%
+ \or 4,30%
+ \or 6,22%
+ \or 6,24%
+ \or 6,28%
+ \or 6,30%
+ \or 7,28%
+ \or 8,28%
+ \or 8,28%
+ \or 9,28%
+ \or 9,30%
+ \or 10,30%
+ \or 12,26%
+ \or 12,28%
+ \or 12,30%
+ \or 13,30%
+ \or 14,30%
+ \or 15,30%
+ \or 16,30%
+ \or 17,30%
+ \or 18,30%
+ \or 19,30%
+ \or 19,30%
+ \or 20,30%
+ \or 21,30%
+ \or 22,30%
+ \or 24,30%
+ \or 25,30%
+ \fi)}%
+\or
+ %10: Level 'H', high error correction
+ \edef\tempdata{(%
+ \ifcase\qr at version\relax
+ \relax %There is no version 0.
+ \or1,17%
+ \or1,28%
+ \or2,22%
+ \or4,16%
+ \or4,22%
+ \or4,28%
+ \or5,26%
+ \or6,26%
+ \or8,24%
+ \or8,28%
+ \or11,24%
+ \or11,28%
+ \or16,22%
+ \or16,24%
+ \or18,24%
+ \or16,30%
+ \or19,28%
+ \or21,28%
+ \or25,26%
+ \or25,28%
+ \or25,30%
+ \or34,24%
+ \or30,30%
+ \or32,30%
+ \or35,30%
+ \or37,30%
+ \or40,30%
+ \or42,30%
+ \or45,30%
+ \or48,30%
+ \or51,30%
+ \or54,30%
+ \or57,30%
+ \or60,30%
+ \or63,30%
+ \or66,30%
+ \or70,30%
+ \or74,30%
+ \or77,30%
+ \or81,30%
+ \fi)}%
+\or
+ %11: Level 'Q', quality error correction
+ \edef\tempdata{(%
+ \ifcase\qr at version\relax
+ \relax %There is no version 0.
+ \or1,13%
+ \or1,22%
+ \or2,18%
+ \or2,26%
+ \or4,18%
+ \or4,24%
+ \or6,18%
+ \or6,22%
+ \or8,20%
+ \or8,24%
+ \or8,28%
+ \or10,26%
+ \or12,24%
+ \or16,20%
+ \or12,30%
+ \or17,24%
+ \or16,28%
+ \or18,28%
+ \or21,26%
+ \or20,30%
+ \or23,28%
+ \or23,30%
+ \or25,30%
+ \or27,30%
+ \or29,30%
+ \or34,28%
+ \or34,30%
+ \or35,30%
+ \or38,30%
+ \or40,30%
+ \or43,30%
+ \or45,30%
+ \or48,30%
+ \or51,30%
+ \or53,30%
+ \or56,30%
+ \or59,30%
+ \or62,30%
+ \or65,30%
+ \or68,30%
+ \fi)}%
+\fi
+\xa\qr at settableix@int\tempdata
+}%
+
+\def\@qr at M{M}\def\@qr at z{0}%
+\def\@qr at L{L}\def\@qr at i{1}%
+\def\@qr at H{H}\def\@qr at ii{2}%
+\def\@qr at Q{Q}\def\@qr at iii{3}%
+\def\qr at setlevel#1{%
+ \edef\qr at level@selected{#1}%
+ \ifx\qr at level@selected\@qr at M
+ \edef\qr at desiredlevel{0}%
+ \fi
+ \ifx\qr at level@selected\@qr at L
+ \edef\qr at desiredlevel{1}%
+ \fi
+ \ifx\qr at level@selected\@qr at H
+ \edef\qr at desiredlevel{2}%
+ \fi
+ \ifx\qr at level@selected\@qr at Q
+ \edef\qr at desiredlevel{3}%
+ \fi
+ \ifx\qr at level@selected\@qr at z
+ \edef\qr at desiredlevel{0}%
+ \fi
+ \ifx\qr at level@selected\@qr at i
+ \edef\qr at desiredlevel{1}%
+ \fi
+ \ifx\qr at level@selected\@qr at ii
+ \edef\qr at desiredlevel{2}%
+ \fi
+ \ifx\qr at level@selected\@qr at iii
+ \edef\qr at desiredlevel{3}%
+ \fi
+}%
+
+% key-value pairs (OPmac trick 0069)
+\def\kv#1{\expandafter\ifx\csname kv:#1\endcsname \relax \expandafter\kvunknown
+ \else \csname kv:#1\expandafter\endcsname\fi
+}
+\def\kvunknown{???}
+\def\kvscan #1#2=#3,{\ifx#1,\else \sdef{kv:#1#2}{#3}\expandafter\kvscan\fi}
+
+\ifx\replacestrings\undefined
+\bgroup \catcode`!=3 \catcode`?=3
+\gdef\replacestrings#1#2{\long\def\replacestringsA##1#1##2!{%
+ \ifx!##2!\addto\tmpb{##1}\else\addto\tmpb{##1#2}\replacestringsA##2!\fi}%
+ \edef\tmpb{\expandafter}\expandafter\replacestringsA\tmpb?#1!%
+ \long\def\replacestringsA##1?{\def\tmpb{##1}}\expandafter\replacestringsA\tmpb
+}
+\egroup
+\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
+\def\sdef#1{\expandafter\def\csname#1\endcsname}
+\fi
+
+\def\qrset#1{\def\tmpb{#1,}%
+ \replacestrings{ =}{=}\replacestrings{= }{=}%
+ \replacestrings{tight,}{qr-border=0,}%
+ \replacestrings{padding,}{qr-border=1,}%
+ \replacestrings{verbose,}{qr-message=1,}%
+ \replacestrings{silent,}{qr-message=0,}%
+ \replacestrings{draft,}{qr-final=0,}%
+ \replacestrings{final,}{qr-final=1,}%
+ \replacestrings{nolink,}{qr-link=0,}%
+ \replacestrings{link,}{qr-link=1,}%
+ \expandafter\kvscan\tmpb,=,%
+ \qrdesiredheight=\kv{height}\relax
+ \qr at setlevel{\kv{level}}%
+ \edef\qr at desiredversion{\kv{version}}%
+}
+\qrset{height=2cm, version=0, level=M, tight, verbose, final, nolink}
+
+\def\qrcode{\begingroup
+ % LaTeX ballast:
+ \def\setcounter##1##2{\global\csname##1\endcsname=##2\relax}%
+ \def\stepcounter##1{\global\advance\csname##1\endcsname by1\relax}%
+ \def\addtocounter##1##2{\global\advance\csname##1\endcsname by##2\relax}%
+ \let\xa=\expandafter \newlinechar=`\^^J
+ \isnextchar[{\qrcodeA}{\qrcodeB}%
+}
+\def\qrcodeA[#1]{\qrset{#1}\expandafter\qrcodeB\romannumeral-`\.}
+\def\qrcodeB{%
+ \ifx\mubyteout\undefined \else \mubyteout=0 \mubytelog=0 \fi
+ \def\xprncodesave{}%
+ \ifx\xprncodes\undefined \else
+ \ifnum\xprncode255=0 \def\xprncodesave{\xprncodes=0 }\xprncodes=1 \fi\fi
+ \if1\kv{qr-message}\let\qrmessage=\message \else \def\qrmessage##1{}\fi
+ \if1\kv{qr-border}\def\padd{\kern4\qrmodulesize}\else\def\padd{}\fi
+ \bgroup \qrverbatim \qrcode at i
+}
+\def\qrcode at i#1{\xdef\qretext{#1}\gdef\qrtext{#1}\egroup
+ \qrcode at int
+ \xprncodesave
+ \endgroup
+}
+
+\def\qrcode at int{%
+ \qrmessage{<QR code requested for "\qretext" in version
+ \qr at desiredversion-\qr at level@char{\qr at desiredlevel}.>^^J}%
+ %First, choose the version and level.
+ %Recall that \qr at choose@best at version sets \qr at version and \qr at level.
+ \xa\qr at choose@best at version\xa{\qretext}%
+ \if1\kv{qr-final}%
+ \qr at setversion{\qr at version}{\qr at level}%
+ \qrcode at int@new
+ \else
+ \qrmodulesize=\qrdesiredheight%
+ \divide\qrmodulesize by \qr at size\relax%
+ \let\d=\qrdesiredheight
+ \vbox{\padd\hbox{\padd\vbox to\d{\hrule\vss
+ \hbox to\d{\vrule height.7\d depth.3\d \hss ...QR...\hss\vrule}%
+ \vss\hrule}\padd}\padd}%
+ \fi
+}%
+
+\def\qrcode at int@new{%
+ \qrbeginhook
+ \qr at createsquareblankmatrix{newqr}{\qr at size}%
+ \qr at placefinderpatterns{newqr}%
+ \qr at placetimingpatterns{newqr}%
+ \qr at placealignmentpatterns{newqr}%
+ \qr at placedummyformatpatterns{newqr}%
+ \qr at placedummyversionpatterns{newqr}%
+ \qrmessage{<Calculating QR code for "\qretext" in
+ version \qr at version-\qr at level@char{\qr at level}.>^^J}%
+ \xa\qr at encode@binary\xa{\qretext}%
+ \qr at splitcodetextintoblocks
+ \qr at createerrorblocks
+ \qr at interleave
+ \qrmessage{<Writing data...}%
+ \qr at writedata@hex{newqr}{\qr at interleaved@text}%
+ \qrmessage{done.>^^J}%
+ \qr at writeremainderbits{newqr}%
+ \qr at chooseandapplybestmask{newqr}%
+ \qr at decimaltobinary[2]{\level at binary}{\qr at level}%
+ \qr at decimaltobinary[3]{\mask at binary}{\qr at mask@selected}%
+ \edef\formatstring{\level at binary\mask at binary}%
+ \qrmessage{<Encoding and writing format string...}%
+ \xa\qr at encodeandmaskformat\xa{\formatstring}%
+ \qr at writeformatstring{newqr}{\qr at format@bitstring}%
+ \qrmessage{done.>^^J}%
+ \qrmessage{<Encoding and writing version information...}%
+ \qr at decimaltobinary[6]{\version at binary}{\qr at version}%
+ \qr at Golaycode{\version at binary}%
+ \qr at writeversionstring{newqr}{\Golayresult}%
+ \qrmessage{done.>^^J}%
+ \qrmessage{<Printing QR code...}%
+ \qrmatrixtobinary{newqr}%
+ \qrrestore\qrdata
+ \qrmessage{done.>^^J}%
+ \qrendhook
+}%
+
+\def\qrmatrixtobinary#1{%
+ \bgroup
+ \gdef\qrdata{}%
+ \def\qr at black{1}\let\qr at black@fixed=\qr at black \let\qr at black@format=\qr at black
+ \def\@white{0}\let\qr at white@fixed=\@white \let\qr at white@format=\@white
+ \qr at for \i = 1 to \qr at size by 1
+ {\qr at for \j = 1 to \qr at size by 1
+ {\xdef\qrdata{\qrdata\qr at matrixentry{#1}{\the\i}{\the\j}}}}%
+ \xdef\qrdata{{\qr at size}{\qrdata}}%
+ \egroup
+}
+
+\def\qrrestore#1{\expandafter\qrrestoreA#1}
+\def\qrrestoreA#1#2{%
+ \qrmodulesize=\qrdesiredheight \divide\qrmodulesize by#1
+ \if1\kv{qr-link}\setbox0=\fi
+ \vbox\bgroup\padd \offinterlineskip \baselineskip=\qrmodulesize
+ \qr at i=0 \qr at j=0 \let\next=\qrrestoreB
+ \hbox\bgroup\padd \qrrestoreB #2%
+ \if1\kv{qr-link}\qr at link{\qretext}{\box0}\fi
+}
+\def\qrrestoreB#1{\advance \qr at j by1
+ \ifx1#1\vrule height\qrmodulesize width\qrmodulesize\else \kern\qrmodulesize\fi
+ \ifnum\qr at size=\qr at j \padd\egroup \advance\qr at i by1
+ \ifnum\qr at size=\qr at i \padd\egroup \let\next=\relax \else \hbox\bgroup\padd \fi
+ \fi \next
+}
+
+\def\qrbeginhook{}
+\def\qrendhook{}
+
+\tmp % \catcode of @ is returned back.
+
+\endinput
+
+
+Options
+-------
+
+You can use \qrset{options} for global-like options and
+\qrcode[options]{encoded text} for local options for one QR code.
+The \qrset{options} is valid within a group (if exists) or in whole
+document.
+
+Options are separated by comma and they are in two types: single
+word or key=value format. Default options are:
+
+\qrset{height=2cm, version=0, level=M, tight, verbose, final, nolink}
+
+The options are the same as described in qrcode.pdf at
+http://www.ctan.org/tex-archive/macros/latex/contrib/qrcode.
+In short:
+
+height=dimen ... The height of the QRcode without padding.
+
+version=number ... Number 0 to 40 linearly depends on the density of QRcode.
+ The 0 means that the density is automatically selected.
+
+level=letter ... L, M, Q o H (low, medium, quality, hight) sets the amount
+ of redundancy in the code in order of error recovering.
+
+tight ... Code without margins.
+padding ... 4module blank margins around the code.
+
+verbose ... Information about calculating in terminal and in the log.
+silent ... No information about calculating.
+
+final ... The QR code is calculated and printed.
+draft ... Only empty rectangle in the same size as QR code is printed.
+
+nolink ... The QR code is not active hyperlink.
+link ... The QR code is active hyperlink to "encoded text".
+ Note that link option works in pdfTeX (luaTeX) only.
+
+qrborder={R G B} ... The color of the frame around active hypertext space
+ if link option is set. R G B (red green blue) are decimal
+ numbers from 0 to 1. The frame is visible only in
+ pdf viewers. Default: invisible frame.
+
+Example:
+
+\qrset{silent} % ... all codes will be silent in the log and terminal.
+\qrcode [height=3cm, link, padding, qrborder={1 0 0}] {http://petr.olsak.net}
+ % ... 3cm QRcode as hyperlink
+
+Note:
+
+The saving/restoring pre-calculated QRcodes isn't supported by default.
+If you are printing the same QR codes repeatedly, use \setbox/\copy
+technique. For example:
+
+\newbox\mybox
+\setbox\mybox=\hbox{\qrcode{encoded text}}
+\copy\mybox \copy\mybox \copy\mybox etc.
+
+If you have a huge amount of different QR codes, you can use draft/final options
+or you can use REF file from OPmac. See the OPmac trick
+
+ http://petr.olsak.net/opmac-tricks-e.html#qrcode
+
+The \qrdata macro is saved after each \qrcode calculation in the format
+{size}{111101011...001} where size is the number of columns or rows in QR
+square and second parameter includes size^2 ones or zeros which means black
+or white modules (scanned left to right, top to bottom). Another information
+can be retrieved from \qrtext macro (encoded text before expanding) and
+\qretext macro (encoded text where \{, \\ etc. are expanded to {, \ etc.).
+The macros \qrdata, \qrtext and \qretext are saved globally.
+
+
+Non-ASCII characters
+--------------------
+
+If you are using csplain with pdfTeX (no XeTeX, no LuaTeX) then UTF-8 input
+is correctly interpreted from \qrcode parameter.
+
+The technical background: the encTeX's \mubyte is set to zero during
+scanning the \qrcode parameter, so the parameter is rawly UTF-8 encoded and
+this is correct for QR codes.
+
+Problems:
+1. You cannot use \qrcode{parameter} inside another macro, bacause UTF-8
+ encoded parameter is reencoded already.
+2. You cannot use XeTeX or LuaTeX because UTF-8 encoded parameter is
+ reencoded to Unicode already. And the backward conversion from Unicode
+ to UTF-8 isn't implemented here at macro level.
+
+
+History
+-------
+
+Jun 2015 released
+Jul. 2015 \xprncodes=0space (bug fixed)
Property changes on: trunk/Master/texmf-dist/tex/generic/olsak-misc/qrcode.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/generic/olsak-misc/scanbase.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/olsak-misc/scanbase.tex (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/olsak-misc/scanbase.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,218 @@
+% scanbase. tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% 26. 10. 2002 Petr Olsak
+
+% This is a macro for processing the mysql outputs in plain TeX
+% The input is supposed in the format:
+%
+%
+% arbitrary text before table
+% it is ignored
+% +------------+------------+----------------------------+
+% | header1 | header2 | header3 ... |
+% +------------+------------+----------------------------+
+% | text 1,1 | text 1,2 | text 1,3 ... |
+% | text 2,1 | text 2,2 | text 2,3 ... |
+% | text 3,1 | text 3,2 | text 3,3 ... |
+% | ... | ... | ... |
+% +------------+------------+----------------------------+
+%
+% You can process such file by
+%
+% \input scanbase.tex
+% \def\lineaction{...}
+% \scanbase file
+%
+% The macro reads the headres first and then reads the lines
+% with the text. The contents of each item can be accessed
+% by full expanable macro \e after each line is read. More preciselly,
+% \e[header] expands to the body of the appropriate item.
+% The \lineaction macro is processed after each line is read.
+% It is supposed that \lineaction is defined by user.
+%
+% Next line of the table is read after \lineaction, the \e macros have
+% a new meaning (items from this next line) and the \lineaction is executed
+% again. This is repeated until last line of the input table is reached.
+% Moreower, the \linenum register is available, where the number of the
+% last scanned line is stored.
+%
+% Example:
+%
+% \input scanbase
+%
+% \newcount \mylines
+% \def\bb #1 #2/{\hbox to#1{#2\hss}}
+%
+% \def\printaction{\global\advance\mylines by1 %% \scanabase works
+% \hbox{% %% inside the TeX group
+% \bb 2em \the\numline./
+% \bb 26em \e[subject]/
+% \bb 10em \e[lastname] \e[firstname]/
+% \bb 3em \hfill\e[pay2002]/
+% \bb 3em \hfill\e[pay2001]/}
+% }
+% \def\lineaction{\if K\e[member_type]% Institutional members
+% \printaction
+% \else \if G\e[member_type]% High school
+% \printaction
+% \fi\fi % I am printing Institutional mambers and high schools only
+% }
+% \scanbase database1
+% \scanbase database2
+% {\it Number of printed lines: \the\mylines}.
+% \end
+%
+% If the \lineaction macro isn't defined by user then scanbase used
+% its own (default) macro which prints all items from one line
+% into the one paragraph in comprimend form (you can try this).
+%
+% The \scanbase macro opens the TeX group then runs \beginhook
+% then reads headers, then reads the lines ans processes \linecation
+% repeatedly, then runs \endhook and finally closes the group.
+% Default values for \beginhook and \endhook is \relax but user
+% can define something else.
+
+\newcount\colnum \newcount\numline
+\font\seventt=cstt10 at7pt
+
+\catcode`\^^X=13 \def^^X{}
+
+\def\scanfirstline #1-+^^X|{\scanheader}
+
+\def\scanheader #1 |{\advance\colnum by1
+ \expandafter \ifx \csname e:#1\endcsname \relax
+ \expandafter \def \csname c:\the\colnum\endcsname{#1}%
+ \expandafter \def \csname e:#1\endcsname {}%
+ \else
+ \expandafter \edef \csname c:\the\colnum\endcsname{#1:\the\colnum}%
+ \fi
+ \futurelet \nextchar \testnextchar
+}
+\def\testnextchar{\ifx\nextchar^^X\let\next=\ignorethirdline
+ \else \let\next=\scanheader
+ \fi \next
+}
+\def\ignorethirdline ^^X+-#1-+^^X{\edef\maxcolumn{\the\colnum}\runfirstitem}
+
+\def\runfirstitem|{\colnum=0 \runitem}
+
+\def\runitem #1 |{\advance\colnum by1
+ \def\tmp{#1}%
+ \ifx\tmp\empty \else
+ \expandafter \ignorefirstspace \tmp^^X%
+ \fi
+ \expandafter\edef\csname e:\csname c:\the\colnum\endcsname\endcsname{\tmp}%
+ \futurelet \nextchar \testnextitem
+}
+\expandafter \def \expandafter \ignorefirstspace \space#1^^X{\def\tmp{#1}}
+
+\def\testnextitem{\ifx\nextchar^^X\let\next=\runline
+ \else \let\next=\runitem
+ \fi \next
+}
+\def\runline ^^X{\advance\numline by1
+ \lineaction
+ \futurelet \nextchar \testnextline
+}
+\def\testnextline{\ifx\nextchar+\let\next=\endgame
+ \else \let\next=\runfirstitem
+ \fi \next
+}
+\def\endgame+-#1-+^^X{\endinput}
+
+\def\e [#1]{\expandafter\ifx \csname e: #1\endcsname \relax
+ \message{Warning: the #1 column is not defined in header.}%
+ \else \csname e: #1\endcsname \fi
+}
+
+\def\printall{\colnum = 0
+ \noindent \hangindent=\parindent \raggedright
+ \loop
+ \advance\colnum by1
+ {\seventt \ignorespaces \csname c:\the\colnum\endcsname:}\penalty0
+ \csname e:\csname c:\the\colnum\endcsname\endcsname
+ \ifnum\colnum < \maxcolumn , \repeat
+ .\par
+}
+\let\lineaction=\printall
+
+\def\scanbase #1 {\begingroup \endlinechar=`\^^X
+ \def\do##1{\catcode`##1=12 }\dospecials
+ \catcode`\ =10 \beginhook
+ \expandafter \scanfirstline \input #1 \endhook \endgroup}
+
+\let\beginhook=\relax \let\endhook=\relax
+
+\endinput
+
+
+% Makro na zpracovani databasovych vystupu z mysql pro plain
+% Nacitane soubory se predpokladaji ve tvaru:
+%
+%
+% libovolny text pred tabulkou,
+% ktery bude ignorovan
+% +------------+------------+----------------------------+
+% | zahlavi1 | zahlavi2 | zahlavi3 ... |
+% +------------+------------+----------------------------+
+% | text 1,1 | text 1,2 | text 1,3 ... |
+% | text 2,1 | text 2,2 | text 2,3 ... |
+% | text 3,1 | text 3,2 | text 3,3 ... |
+% | ... | ... | ... |
+% +------------+------------+----------------------------+
+%
+% Na takovy soubor je mozno po
+%
+% \input scanbase.tex
+%
+% aplikovat makro \scanbase takto:
+%
+% \scanbase soubor
+%
+% Makro nacte zahlavi a zacne cist jednotlive radky. Po precteni
+% kazdeho radku je obsah polozky pripraven v expanznim makru
+% \e. Presneji \e[zahlavi] expanduje na text odpovidajici polozky.
+% V teto situaci \scanbase spusti makro \lineaction, ktere si muze
+% uzivatel definovat jak chce.
+%
+% Po ukonceni makra \lineaction cte scanbase dalsi radek tabulky, naplni
+% znovu expanzni makra \e texty polozek z tohoto radku a spusti znovu
+% \lineaction. To se opakuje tak dlouho, dokud neni ukonceno cteni
+% tabulky. Navic je makru \lineaction k dispozici registr \numline
+% obsahujici cislo prave precteneho radku.
+%
+% Priklad pouziti:
+%
+% \input scanbase
+%
+% \newcount \mylines
+% \def\bb #1 #2/{\hbox to#1{#2\hss}}
+%
+% \def\printaction{\global\advance\mylines by1 %% \scanabase pracuje
+% \hbox{% %% uvnitr skupiny!
+% \bb 2em \the\numline./
+% \bb 26em \e[nazev]/
+% \bb 10em \e[prijmeni] \e[jmeno]/
+% \bb 3em \hfill\e[kc2002]/
+% \bb 3em \hfill\e[kc2001]/}
+% }
+% \def\lineaction{\if K\e[typ_clenstvi]% Kolektivni clenove
+% \printaction
+% \else \if G\e[typ_clenstvi]% Gymnazia
+% \printaction
+% \fi\fi % tisknu jen kolektivni cleny a gymnazia
+% }
+% \scanbase database1
+% \scanbase database2
+% {\it Number of printed lines: \the\mylines}.
+% \end
+%
+% Pokud neni uzivatelem definovano makro \lineaction, pouzije
+% scanbase sve vlastni (defaultni) makro, ktere vytiskne vsechny polozky
+% jednoho radku do odstavce ve velmi zhustenem tvaru (vyzkousejte si).
+%
+% Kazde \scanbase vstupuje do skupiny, pak spusti \beginhook,
+% pak cte hlavicku a jednotlive radky, jak bylo receno vyse,
+% pak spusti \endhook a nakonec vyleze ze skupiny.
+% Sekvence \beginhook a \endhook muze predefinovat uzivatel, defaltne maji
+% hodnotu \relax
Property changes on: trunk/Master/texmf-dist/tex/generic/olsak-misc/scanbase.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/generic/olsak-misc/scancsv.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/olsak-misc/scancsv.tex (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/olsak-misc/scancsv.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,242 @@
+% scancsv. tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% 26. 2. 2005 Petr Olsak
+
+% This is a macro for processing the CSV format in plain TeX.
+%
+% The input file is assumed in the form:
+%
+% "header1";"header2";"header3"; ... "header-n"
+% "text 1,1";"text 1,2";"text 1,3"; ... "text 1,n"
+% "text 2,1";"text 2,2";"text 2,3"; ... "text 2,n"
+% "text 3,1";"text 3,2";"text 3,3"; ... "text 3,n"
+% ...
+%
+% You can process such a file by
+%
+% \input scancsv.tex
+% \def\lineaction{...}
+% \scanbase soubor
+%
+% The separator " can be omited in a arbitrary header or item text.
+% I.e. the following format is scanned without problems:
+%
+% "firstname";"lastname";number;RC
+% "Ferdinand";"Mravenec";1;000111/2244
+% "Josef";"Vykutal";2;444333/2211
+%
+% The macro reads the headers and then reads next lines repeatedly.
+% The full expanable macro \e is ready after the line is read.
+% More exactly \e[header] expands to the appropriate item body.
+% The \lineaction macro is processed after each line is read.
+% It is supposed that \lineaction is defined by user.
+%
+% Next line of the table is read after \lineaction, the \e macros have
+% a new meaning (items from this next line) and the \lineaction is executed
+% again. This is repeated until last line of the input table is reached.
+% Moreower, the \linenum register is available, where the number of the
+% last scanned line is stored.
+
+% Example:
+%
+% \input scancsv
+%
+% \newcount \mylines
+% \def\bb #1 #2/{\hbox to#1{#2\hss}}
+%
+% \def\printaction{\global\advance\mylines by1 %% \scanabase works
+% \hbox{% %% in the TeX group
+% \bb 2em \the\numline./
+% \bb 26em \e[subject]/
+% \bb 10em \e[lastname] \e[firstname]/
+% \bb 3em \hfill\e[pay2002]/
+% \bb 3em \hfill\e[pay2001]/}
+% }
+% \def\lineaction{\if K\e[member_type]% Institutional members
+% \printaction
+% \else \if G\e[member_type]% High school
+% \printaction
+% \fi\fi % I am printing Institutional mambers and high schools only
+% }
+% \scanbase database1
+% \scanbase database2
+% {\it Number of printed lines: \the\mylines}.
+% \end
+%
+% If the \lineaction macro isn't defined by user then scanbase used
+% its own (default) macro which prints all items from one line
+% into the one paragraph in comprimend form (you can try this).
+%
+% The \scanbase macro opens the TeX group then runs \beginhook
+% then reads headers, then reads the lines ans processes \linecation
+% repeatedly, then runs \endhook and finally closes the group.
+% Default values for \beginhook and \endhook is \relax but user
+% can define something else.
+%
+% The user can redefine the \separator and \obklopeni (surrounding char)
+% after \input scanbase if there are used another characters than semicolon
+% and " in the input file.
+
+\def\separator{;} % separator mezi polozkami
+\def\obklopeni{"} % nepovinne "obklopeni" polozky
+
+\newcount\colnum \newcount\numline
+
+\catcode`\^^X=13 \def^^X{}
+
+\def\scanheader{\futurelet \nextchar \doheader}
+
+\def\doheader {\expandafter\ifx \obklopeni\nextchar \expandafter \maskheader
+ \else \expandafter \nomaskheader \fi}
+
+\def\runheader{\advance\colnum by1
+ \expandafter \ifx \csname e:\itemdata\endcsname \relax
+ \expandafter \edef \csname c:\the\colnum\endcsname{\itemdata}%
+ \expandafter \def \csname e:\itemdata\endcsname {}%
+ \else
+ \expandafter \edef \csname c:\the\colnum\endcsname{\itemdata:\the\colnum}%
+ \fi
+ \futurelet \nextchar \testnextchar
+}
+\def\testnextchar{\ifx\nextchar^^X\let\next=\ignorethirdline
+ \else \let\next=\scanheader
+ \fi \next
+}
+
+\def\ignorethirdline ^^X{\edef\maxcolumn{\the\colnum}\runfirstitem}
+
+\def\runfirstitem #1^^X{\def\tmp{#1}%
+ \ifx\tmp\empty \expandafter\endinput \fi
+ \ifx\tmp\stopmark
+ \else \colnum=0
+ \edef\tmp{\noexpand\scanitem #1\separator\noexpand^^X}\expandafter\tmp
+ \fi}
+\def\scanitem {\futurelet \nextchar \doitem}
+
+\def\doitem {\expandafter \ifx \obklopeni\nextchar \expandafter \maskitem
+ \else \expandafter \nomaskitem \fi}
+
+\def\runitem {\advance\colnum by1
+ \expandafter\edef\csname e:\csname c:\the\colnum\endcsname\endcsname{\itemdata}%
+ \futurelet \nextchar \testnextitem
+}
+\def\testnextitem{\ifx\nextchar^^X\let\next=\runline
+ \else \let\next=\scanitem
+ \fi \next
+}
+\def\runline ^^X{\advance\numline by1
+ \lineaction
+ \futurelet \nextchar \runfirstitem
+}
+\def\e [#1]{\expandafter\ifx \csname e:#1\endcsname \relax
+ \message{Warning: the #1 column is not defined in header.}%
+ \else \csname e:#1\endcsname \fi
+}
+
+\def\printall{\colnum = 0
+ \noindent \hangindent=\parindent \raggedright
+ \loop
+ \advance\colnum by1
+ {\seventt \ignorespaces \csname c:\the\colnum\endcsname:}\penalty0
+ \csname e:\csname c:\the\colnum\endcsname\endcsname
+ \ifnum\colnum < \maxcolumn , \repeat
+ .\par
+}
+\let\lineaction=\printall
+
+\def\scanbase #1 {\begingroup \endlinechar=`\^^X
+ \edef\maskauvo{\obklopeni####1\obklopeni\separator}
+ \edef\maskaneuvo{####1\separator}
+ \expandafter\def \expandafter\maskheader \maskauvo {\def\itemdata{##1}\runheader}
+ \expandafter\def \expandafter\nomaskheader \maskaneuvo {\def\itemdata{##1}\runheader}
+ \expandafter\def \expandafter\maskitem \maskauvo {\def\itemdata{##1}\runitem}
+ \expandafter\def \expandafter\nomaskitem \maskaneuvo {\def\itemdata{##1}\runitem}
+ \edef\scanfirstline ##1^^X{\noexpand\scanheader##1\separator\noexpand^^X}
+ \def\do##1{\catcode`##1=12 }\dospecials
+ \catcode`\ =10 \beginhook
+ \expandafter \scanfirstline \input #1 \relax^^X\endhook \endgroup}
+\def\stopmark{\relax}
+
+\let\beginhook=\relax \let\endhook=\relax
+
+\endinput
+
+% Makro na zpracovani databasovych vystupu ve formatu CSV pro plain.
+%
+% Srovnejte tez makro scanbase.tex
+%
+% Nacitane soubory se predpokladaji ve tvaru:
+%
+% "zahlavi1";"zahlavi2";"zahlavi3"; ... "zahlavi-n"
+% "text 1,1";"text 1,2";"text 1,3"; ... "text 1,n"
+% "text 2,1";"text 2,2";"text 2,3"; ... "text 2,n"
+% "text 3,1";"text 3,2";"text 3,3"; ... "text 3,n"
+% ...
+%
+% Na takovy soubor je mozno po
+%
+% \input scancsv.tex
+%
+% aplikovat makro \scanbase takto:
+%
+% \scanbase soubor
+%
+% Obklopujici znak " muze u libovolneho zahlavi nebo polozky
+% chybet. Tj. je korektni treba i takovy zapis dat:
+%
+% "jmeno";"prijmeni";cislo;RC
+% "Ferdinand";"Mravenec";1;000111/2244
+% "Josef";"Vykutal";2;444333/2211
+%
+% Makro nacte zahlavi a zacne cist jednotlive radky. Po precteni
+% kazdeho radku je obsah polozky pripraven v expanznim makru
+% \e. Presneji \e[zahlavi] expanduje na text odpovidajici polozky.
+% V teto situaci \scanbase spusti makro \lineaction, ktere si muze
+% uzivatel definovat jak chce.
+%
+% Po ukonceni makra \lineaction cte scanbase dalsi radek tabulky, naplni
+% znovu expanzni makra \e texty polozek z tohoto radku a spusti znovu
+% \lineaction. To se opakuje tak dlouho, dokud neni ukonceno cteni
+% tabulky. Navic je makru \lineaction k dispozici registr \numline
+% obsahujici cislo prave precteneho radku.
+%
+% Priklad pouziti:
+%
+% \input scancsv
+%
+% \newcount \mylines
+% \def\bb #1 #2/{\hbox to#1{#2\hss}}
+%
+% \def\printaction{\global\advance\mylines by1 %% \scanabase pracuje
+% \hbox{% %% uvnitr skupiny!
+% \bb 2em \the\numline./
+% \bb 26em \e[nazev]/
+% \bb 10em \e[prijmeni] \e[jmeno]/
+% \bb 3em \hfill\e[kc2002]/
+% \bb 3em \hfill\e[kc2001]/}
+% }
+% \def\lineaction{\if K\e[typ_clenstvi]% Kolektivni clenove
+% \printaction
+% \else \if G\e[typ_clenstvi]% Gymnazia
+% \printaction
+% \fi\fi % tisknu jen kolektivni cleny a gymnazia
+% }
+% \scanbase database1
+% \scanbase database2
+% {\it Number of printed lines: \the\mylines}.
+% \end
+%
+% Pokud neni uzivatelem definovano makro \lineaction, pouzije
+% scanbase sve vlastni (defaultni) makro, ktere vytiskne vsechny polozky
+% jednoho radku do odstavce ve velmi zhustenem tvaru (vyzkousejte si).
+%
+% Kazde \scanbase vstupuje do skupiny, pak spusti \beginhook,
+% pak cte hlavicku a jednotlive radky, jak bylo receno vyse,
+% pak spusti \endhook a nakonec vyleze ze skupiny.
+% Sekvence \beginhook a \endhook muze predefinovat uzivatel, defaltne maji
+% hodnotu \relax
+%
+% Uzivatel muze po nacteni \input scanbase predefinovat makra \separator
+% a \obklopeni (viz nize), pokud jsou v datech polozky a zahlavi
+% oddeleny jinymi znaky nez strednik a symbol palce.
+
Property changes on: trunk/Master/texmf-dist/tex/generic/olsak-misc/scancsv.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/generic/olsak-misc/xmlparser.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/olsak-misc/xmlparser.tex (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/olsak-misc/xmlparser.tex 2016-06-22 22:28:57 UTC (rev 41526)
@@ -0,0 +1,333 @@
+% xmlparser.tex
+%%%%%%%%%%%%%%%%%%
+% Petr Olsak 2016
+
+% After \input xmlparser you can do:
+
+% \xmlprep {domument.xml} {document.out}
+% You can define all tags used in the document.xml
+% in the form \def\XMLtag#1#2{...}. Then you can process:
+% \input document.out
+
+% The macro \xmlprep {input.xml} {output-file} converts XML document to a
+% TeX-friendly format. You can define used macros and do \input output-file.
+% More information is at the end of this document
+
+\newwrite\xmloutfile
+\def\xmlprep#1#2{% #1=input file, #2=output file
+ \ifx\relax#2\relax \chardef\xmloutfile=16 \else
+ \immediate\openout\xmloutfile=#2 \fi
+ \begingroup \everypar={\setbox0=\lastbox\par \xscan}\input#1 \endgroup
+ \immediate\closeout\xmloutfile
+}
+\long\def\xscan#1<{\ifx\xscan#1\xscan \else\toks0={#1}\xprint{\the\toks0\npercent}\fi\xtag}
+
+\def\npercent#1{}\edef\npercent{\expandafter\npercent\string\%} % normal %
+\def\xprint#1{\immediate\write\xmloutfile{\xindent#1}}
+\def\xindent{}
+
+\def\xtag#1{\ifx#1!\expandafter\xtagH \else\fihere\xtagA#1\fi}
+\def\xtagA#1#2>{\ifx#1?\xtagE#2>\else\ifx#1/\xtagG#2>\else\xtagB#1#2>/>\end\fi\fi}
+\def\xtagB#1/>#2\end{\ifx>#2>\let\tmp=n\xtagC#1 \end\else \let\tmp=/\xtagC#1> \end\fi}
+\def\xtagC#1 #2\end{\def\currargs{}\ifx>#2>\xtagD#1\else \xtagF#2\xtagD#1>\fi}
+\def\xtagD#1>{\bgroup\def\currtag{#1}%
+ \ifx\tmp/\xprint{\string\XML#1\space{\currargs}{}}\egroup\else
+ \xprint{\string\XML#1\space{\currargs}\iftrue\string{\else}\fi\npercent}%
+ \edef\xindent{\xindent\space\space}\fi
+}
+\def\xtagE#1?>{\xprint{\string\META\space{#1}}}
+\def\xtagF#1>{\def\currargs{#1}}
+\def\xtagG#1>{\def\tmp{#1}\ifx\tmp\currtag\else
+ \message{WARNING: <\currtag>...</#1> doesn't match}\fi
+ \egroup\xprint{\iffalse{\else\string}\fi\npercent}%
+}
+\def\xtagH#1{\ifx#1-\expandafter\xtagI \else \fihere\xtagJ#1\fi}
+\def\xtagI#1-->{} % comment in the format <!-- ... -->
+\def\xtagJ#1 #2>{\xprint{\string\SPEC#1\space{#2}}}
+\def\fihere#1\fi{\fi#1}
+
+\def\xarg#1{\xargA#1 ==}
+\def\xargA#1#2={\def\xargN{#1#2}\ifx#1=\else\expandafter\xargB\fi}
+\def\xargB#1{\ifx#1"\expandafter\xargC\else\fihere\xargE#1\fi}
+\def\xargC#1"{\xargD{#1}}
+\def\xargD#1{\expandafter\def\csname ARG\xargN\endcsname{#1}\xargA}
+\def\xargE#1{\ifx#1'\expandafter\xargF\else\fihere\xargG#1\fi}
+\def\xargF#1'{\xargD{#1}}
+\def\xargG#1 {\xargD{#1}}
+
+\def\META#1{} \def\SPECDOCTYPE#1{}
+
+\def\entity#1;{\csname ent:#1\endcsname}
+\def\declentity#1#2{\expandafter\def\csname ent:#1\endcsname{#2}}
+
+\endinput
+
+--------------------------------------------------------------------------
+
+Documentation
+=============
+
+Introduction example. Suppose the test.xml file:
+
+--------------------
+
+<?xml version="1.0" encoding="utf8"?>
+<pricelist>
+ <!-- This is price list of a virtual firm -->
+ <name>Computer components</name>
+ <validity from="1.1.2000" to="31.3.2000"/>
+ <firm>
+ <name>První hardwarová, s.r.o.</name>
+ <address>
+ <street>Průmyslová 12</street>
+ <city>Praha 10</city>
+ <postalcode>100 000</postalcode>
+ <email>info at prhv.cz</email>
+ </address>
+ </firm>
+ <offer>
+ <product category="polohovací zařízení" code="pxbd-21">
+ <name>Hyperoptická <em>digitální</em> myš</name>
+ <price currency="CZK">368.30</price>
+ </product>
+ <product category="pevné disky" code="sbhd-99">
+ <name>Soft-slow disc < 19,3 GB</name>
+ <price currency="CZK">8500</price>
+ </product>
+ <product category="polohovací zařízení" code="pxbd-13">
+ <name>Special touchpad</name>
+ <price currency="CZK">5635.20</price>
+ </product>
+ </offer>
+</pricelist>
+
+--------------------
+
+When you process it by \xmlprep {test.xml} {test.out} you get:
+
+--------------------
+
+\META {xml version="1.0" encoding="utf8"}
+\XMLpricelist {}{%
+ \XMLname {}{%
+ Computer components%
+ }%
+ \XMLvalidity {from="1.1.2000" to="31.3.2000"}{}
+ \XMLfirm {}{%
+ \XMLname {}{%
+ První hardwarová, s.r.o.%
+ }%
+ \XMLadddress {}{%
+ \XMLstreet {}{%
+ Průmyslová 12%
+ }%
+ \XMLcity {}{%
+ Praha 10%
+ }%
+ \XMLpostalcode {}{%
+ 100 000%
+ }%
+ \XMLemail {}{%
+ info at prhv.cz%
+ }%
+ }%
+ }%
+ \XMLoffer {}{%
+ \XMLproduct{category="polohovací zařízení" code="pxbd-21"}{%
+ \XMLname {}{%
+ Hyperoptická %
+ \XMLem {}{%
+ digitální%
+ }%
+ myš%
+ }%
+ \XMLprice {currency="CZK"}{%
+ 368.30%
+ }%
+ }%
+ \XMLproduct {category="pevné disky" code="sbhd-99"}{%
+ \XMLname {}{%
+ Soft-slow disc < 19,3 GB%
+ }%
+ \XMLprice {currency="CZK"}{%
+ 8500%
+ }%
+ }%
+ \XMLproduct {category="polohovací zařízení" code="pxbd-13"}{%
+ \XMLname {}{%
+ Special touchpad%
+ }%
+ \XMLprice {currency="CZK"}{%
+ 5635.20%
+ }%
+ }%
+ }%
+}%
+
+--------------------------
+
+This format is more comfortable for further TeX processing.
+You can define appropriate macros, for example:
+
+--------------------------
+
+\newtoks\street \newtoks\city \newtoks\postalcode \newtoks\email
+
+\def\XMLpricelist#1{} % only process second argument ...
+\def\XMLname#1#2{{\bf#2}\medskip}
+\def\XMLvalidity#1#2{}
+\def\XMLfirm#1#2{\bgroup
+ \def\XMLname##1##2{{\it##2}\par}%
+ \def\XMLaddress##1##2{##2\printaddress}%
+ \def\XMLstreet##1##2{\street{##2}}%
+ \def\XMLcity##1##2{\city{##2}}%
+ \def\XMLpostalcode##1##2{\postalcode{##2}}%
+ \def\XMLemail##1##2{\email{##2}}%
+ \def\printaddress{ulice: \the\street,
+ mesto: \the\postalcode\space\the\city, email: {\tt\the\email}}
+ Dodavatel: #2\par
+ \egroup
+}
+\def\XMLoffer#1{}
+\def\XMLproduct#1#2{\bgroup
+ \xarg{#1}%
+ \def\XMLname##1##2{\def\name{##2}}%
+ \def\XMLprice##1##2{\xarg{currency=?}\xarg{##1}\def\price{##2}}
+ #2%
+ \centerline{\name\space(\ARGcode)\dotfill\price\space\ARGcurrency}
+ \egroup
+}
+\def\XMLem#1#2{{\it#2} \ignorespaces}
+
+\catcode`&=13 \let&=\entity
+\declentity{lt}{$<$}
+
+\input test.out
+
+----------------------------
+
+After \input test.out, you get the desired document.
+
+
+Features of the \xmlprep conversion
+===================================
+
+The <tag arguments>text</tag> is converted to:
+
+ \XMLtag {arguments}{%
+ text%
+ }%
+
+The <tag arguments/> or <tag/> are converted to
+
+ \XMLtag {arguments}{} or \XMLtag {}{}
+
+The <!-- text --> is ignored.
+
+The <?text?> is converted to:
+
+ \META {text}
+
+The <!TEXT text> is converted to:
+
+ \SPECTEXT {text}
+
+The closings </tags> are checked to the opening <tag>.
+The nested tags are indented in the output.
+
+
+Scanning of the arguments
+=========================
+
+The <tag arguments> are converted to \XMLtag{arguments}{%, so the arguments
+are saved as first parameter of the \XMLtag macro. Arguments are typically
+in the form
+
+ argA="valueA" argB="valueB" argC="valueC"
+
+You can define
+
+ \def\XMLtag#1#2{\bgroup \xarg{#1}...process #2\egroup}
+
+The \xarg{arguments} scans the arguments given in the parameter. The result of
+\xarg{"valueA" argB="valueB" argC="valueC"} is equivalent to
+\def\ARGargA{valueA}\def\ARGargB{valueB}\def\ARGargC{valueC}, so you can use
+these macros in further processing.
+
+There are alternatives of the format of arguments:
+
+ argA='valueA' or argA=valueA (separated by space or end of arguments).
+
+The \xarg macro is able to treat these alternatives properly.
+
+Recommendation: If you assume default values of arguments then do something
+similar to this:
+
+ \xarg{argA="defaultA" argB="defaultB"}\xarg{#1}.
+
+
+XML entities
+============
+
+The XML text includes sometimes the entity in the form &name; If it is true
+in your XML document, then you can set & as active with the meaning \entity
+and declare the used entities by \declentity{name}{what to do}. If the document
+includes the entities &l; > & (for example) then you can do:
+
+ \catcode`&=13 \let&=\entity
+ \declentity{lt}{$<$}
+ \declentity{gt}{$>$}
+ \declentity{amp}{\&}
+
+
+Various approaches for \XMLtag definitions
+==========================================
+
+Classical approach is
+
+ \def\XMLtag#1#2{\bgroup process arguments #1, process body #2\egroup}
+
+You can define \XMLtag with only one parameter. Then the second parameter is
+normally processed in the group. This is usable if you need to keep the
+possibility of catcode changing in the document. If you need to process
+arguments in the same group as body then do something like this:
+
+ \def\XMLtag#1{\bgroup \xarg{#1}\let\next=}
+
+If you read body in #2 then you can decide what to do before and what to do
+after:
+
+ \def\XMLtag#1#2{what to do before #2 what to do after}
+
+If the body of <tag> includes data declared in <tagA>, <tabB>, then you can
+save the data first and then print the result in the part "what to do after".
+Example:
+
+ <tag> <tagA>somethingA</tagA> <tagB>somethingB</tagB> </tag>
+
+ \newtoks\dataA \newtoks\dataB
+ \def\XMLtag#1#2{\bgroup
+ \def\XMLtagA##1{\dataA=}\def\XMLtagB##1{\dataB=}%
+ #2% process the body, dataA and dataB are set.
+ print \the\dataB and \the\dataA.
+ \egroup}
+
+The meaning of the tag can depends on the outer tag used. See the "name" tag
+in the introduction example. Then you must to define various meaning of such
+tag inside another \XMLtag macro.
+
+ <tagA> <name>My name</name> </tagA> <tagB> <name>City name</name> </tagB>
+
+ \def\XMLtagA#1#2{\bgroup
+ \def\XMLname##1##2{...}%
+ ...
+ \egroup
+ }
+ \def\XMLtagB#1#2{\bgroup
+ \def\XMLname##1##2{...something different}%
+ ...
+ \egroup
+ }
+
+-------------------------------------------------------
+
Property changes on: trunk/Master/texmf-dist/tex/generic/olsak-misc/xmlparser.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds 2016-06-22 22:07:08 UTC (rev 41525)
+++ trunk/Master/tlpkg/libexec/ctan2tds 2016-06-22 22:28:57 UTC (rev 41526)
@@ -1657,6 +1657,7 @@
'ocgx', 'tikz.*\.code\.tex|' . $standardtex,
'odsfile', '\.lua|' . $standardtex,
'ofs', '^ofs\.tex|ofsdef\.tex|ofs-.*\.tex|\.sty|a.*\.tex|.*fn\.tex',
+ 'olsak-misc', '(qrcode|scanbase|scancsv|xmlparser)\.tex',
'pageslts', '\.sty|[^c]\.cfg', # not ltxdoc.cfg
'papermas', '\.sty|[^c]\.cfg', # not ltxdoc.cfg, would be system-wide
'passivetex', '\.xmt|' . $standardtex,
Modified: trunk/Master/tlpkg/tlpsrc/collection-genericextra.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-genericextra.tlpsrc 2016-06-22 22:07:08 UTC (rev 41525)
+++ trunk/Master/tlpkg/tlpsrc/collection-genericextra.tlpsrc 2016-06-22 22:28:57 UTC (rev 41526)
@@ -39,6 +39,7 @@
depend midnight
depend navigator
depend ofs
+depend olsak-misc
depend pdf-trans
depend plainpkg
depend schemata
Added: trunk/Master/tlpkg/tlpsrc/olsak-misc.tlpsrc
===================================================================
More information about the tex-live-commits
mailing list