summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorThomas Deutschmann <whissi@gentoo.org>2019-10-15 12:24:12 +0200
committerThomas Deutschmann <whissi@gentoo.org>2020-08-13 11:26:55 +0200
commite088156d5b620e5e639580dacf85c6dc13823c74 (patch)
tree57f5c025e203279944da512166c20bc0521d8ccd /lib
downloadghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.tar.gz
ghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.tar.bz2
ghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.zip
Import Ghostscript 9.50ghostscript-9.50
Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/FAPIconfig-FCO13
-rw-r--r--lib/FCOfontmap-PCLPS3197
-rw-r--r--lib/FCOfontmap-PS3158
-rw-r--r--lib/Fontmap.ATB167
-rw-r--r--lib/Fontmap.ATM184
-rw-r--r--lib/Fontmap.OS2213
-rw-r--r--lib/Fontmap.OSF163
-rw-r--r--lib/Fontmap.SGI404
-rw-r--r--lib/Fontmap.Sol485
-rw-r--r--lib/Fontmap.URW-136.T1580
-rw-r--r--lib/Fontmap.URW-136.TT574
-rw-r--r--lib/Fontmap.Ult145
-rw-r--r--lib/Fontmap.VMS438
-rw-r--r--lib/Info-macos.plist14
-rw-r--r--lib/PDFA_def.ps79
-rw-r--r--lib/PDFX_def.ps104
-rw-r--r--lib/acctest.ps99
-rwxr-xr-xlib/afmdiff.awk151
-rw-r--r--lib/align.ps72
-rw-r--r--lib/bj8.rpd17
-rw-r--r--lib/bj8gc12f.upp44
-rw-r--r--lib/bj8hg12f.upp44
-rw-r--r--lib/bj8oh06n.upp44
-rw-r--r--lib/bj8pa06n.upp44
-rw-r--r--lib/bj8pp12f.upp44
-rw-r--r--lib/bj8ts06n.upp44
-rw-r--r--lib/bjc610a0.upp44
-rw-r--r--lib/bjc610a1.upp44
-rw-r--r--lib/bjc610a2.upp44
-rw-r--r--lib/bjc610a3.upp44
-rw-r--r--lib/bjc610a4.upp45
-rw-r--r--lib/bjc610a5.upp44
-rw-r--r--lib/bjc610a6.upp44
-rw-r--r--lib/bjc610a7.upp44
-rw-r--r--lib/bjc610a8.upp44
-rw-r--r--lib/bjc610b1.upp44
-rw-r--r--lib/bjc610b2.upp44
-rw-r--r--lib/bjc610b3.upp44
-rw-r--r--lib/bjc610b4.upp45
-rw-r--r--lib/bjc610b6.upp44
-rw-r--r--lib/bjc610b7.upp44
-rw-r--r--lib/bjc610b8.upp44
-rw-r--r--lib/caption.ps58
-rw-r--r--lib/cat.ps74
-rw-r--r--lib/cbjc600.ppd408
-rw-r--r--lib/cbjc800.ppd393
-rw-r--r--lib/cdj550.upp48
-rw-r--r--lib/cdj690.upp52
-rw-r--r--lib/cdj690ec.upp54
-rw-r--r--lib/cid2code.ps159
-rw-r--r--lib/dnj750c.upp47
-rw-r--r--lib/dnj750m.upp59
-rw-r--r--lib/docie.ps219
-rwxr-xr-xlib/dvipdf46
-rwxr-xr-xlib/eps2eps28
-rwxr-xr-xlib/eps2eps.bat25
-rwxr-xr-xlib/eps2eps.cmd35
-rw-r--r--lib/font2pcl.ps604
-rw-r--r--lib/ghostpdf.README12
-rw-r--r--lib/ghostpdf.catbin0 -> 7290 bytes
-rw-r--r--lib/ghostpdf.inf52
-rw-r--r--lib/ghostpdf.ppd522
-rw-r--r--lib/gs_ce_e.ps46
-rw-r--r--lib/gs_il2_e.ps62
-rw-r--r--lib/gs_kanji.ps157
-rw-r--r--lib/gs_ksb_e.ps63
-rw-r--r--lib/gs_l.xbm29
-rw-r--r--lib/gs_l.xpm58
-rw-r--r--lib/gs_l_m.xbm29
-rw-r--r--lib/gs_lgo_e.ps90
-rw-r--r--lib/gs_lgx_e.ps59
-rw-r--r--lib/gs_m.xbm16
-rw-r--r--lib/gs_m.xpm44
-rw-r--r--lib/gs_m_m.xbm16
-rw-r--r--lib/gs_s.xbm11
-rw-r--r--lib/gs_s.xpm36
-rw-r--r--lib/gs_s_m.xbm11
-rw-r--r--lib/gs_t.xbm8
-rw-r--r--lib/gs_t.xpm28
-rw-r--r--lib/gs_t_m.xbm8
-rw-r--r--lib/gs_wl1_e.ps65
-rw-r--r--lib/gs_wl2_e.ps65
-rw-r--r--lib/gs_wl5_e.ps65
-rwxr-xr-xlib/gsbj12
-rwxr-xr-xlib/gsbj.bat4
-rwxr-xr-xlib/gsdj12
-rwxr-xr-xlib/gsdj.bat4
-rwxr-xr-xlib/gsdj50012
-rwxr-xr-xlib/gsdj500.bat4
-rwxr-xr-xlib/gslj12
-rwxr-xr-xlib/gslj.bat4
-rwxr-xr-xlib/gslp12
-rwxr-xr-xlib/gslp.bat4
-rw-r--r--lib/gslp.ps719
-rwxr-xr-xlib/gsnd12
-rwxr-xr-xlib/gsnd.bat4
-rwxr-xr-xlib/gsndt.bat4
-rw-r--r--lib/gsnup.ps92
-rw-r--r--lib/gssetgs.bat14
-rw-r--r--lib/gssetgs32.bat14
-rw-r--r--lib/gssetgs64.bat14
-rwxr-xr-xlib/gst.bat4
-rwxr-xr-xlib/gstt.bat4
-rw-r--r--lib/ht_ccsto.ps3552
-rw-r--r--lib/image-qa.ps1817
-rw-r--r--lib/jispaper.ps26
-rw-r--r--lib/jobseparator.ps3
-rw-r--r--lib/landscap.ps30
-rw-r--r--lib/lines.ps164
-rwxr-xr-xlib/lp386.bat1
-rwxr-xr-xlib/lp386r2.bat1
-rwxr-xr-xlib/lpgs.bat4
-rwxr-xr-xlib/lpr2.bat4
-rwxr-xr-xlib/lprsetup.sh223
-rw-r--r--lib/mkcidfm.ps771
-rw-r--r--lib/necp2x.upp35
-rw-r--r--lib/necp2x6.upp35
-rwxr-xr-xlib/pdf2dsc34
-rwxr-xr-xlib/pdf2dsc.bat17
-rw-r--r--lib/pdf2dsc.ps246
-rwxr-xr-xlib/pdf2ps37
-rwxr-xr-xlib/pdf2ps.bat23
-rwxr-xr-xlib/pdf2ps.cmd40
-rwxr-xr-xlib/pf2afm16
-rwxr-xr-xlib/pf2afm.bat16
-rwxr-xr-xlib/pf2afm.cmd6
-rw-r--r--lib/pf2afm.ps535
-rwxr-xr-xlib/pfbtopfa24
-rwxr-xr-xlib/pfbtopfa.bat15
-rw-r--r--lib/pfbtopfa.ps33
-rw-r--r--lib/ppath.ps53
-rwxr-xr-xlib/pphs15
-rw-r--r--lib/pphs.ps220
-rw-r--r--lib/prfont.ps261
-rwxr-xr-xlib/printafm15
-rw-r--r--lib/printafm.ps173
-rw-r--r--lib/ps2ai.ps550
-rwxr-xr-xlib/ps2ascii21
-rwxr-xr-xlib/ps2ascii.bat14
-rwxr-xr-xlib/ps2ascii.cmd17
-rwxr-xr-xlib/ps2epsi118
-rwxr-xr-xlib/ps2epsi.bat37
-rwxr-xr-xlib/ps2epsi.cmd38
-rw-r--r--lib/ps2epsi.ps244
-rwxr-xr-xlib/ps2pdf12
-rwxr-xr-xlib/ps2pdf.bat23
-rwxr-xr-xlib/ps2pdf.cmd42
-rwxr-xr-xlib/ps2pdf127
-rwxr-xr-xlib/ps2pdf12.bat20
-rwxr-xr-xlib/ps2pdf12.cmd10
-rwxr-xr-xlib/ps2pdf137
-rwxr-xr-xlib/ps2pdf13.bat20
-rwxr-xr-xlib/ps2pdf13.cmd10
-rwxr-xr-xlib/ps2pdf147
-rw-r--r--lib/ps2pdf14.bat20
-rw-r--r--lib/ps2pdf14.cmd10
-rwxr-xr-xlib/ps2pdfwr44
-rw-r--r--lib/ps2pdfxx.bat64
-rwxr-xr-xlib/ps2ps29
-rwxr-xr-xlib/ps2ps.bat24
-rwxr-xr-xlib/ps2ps.cmd35
-rwxr-xr-xlib/ps2ps226
-rwxr-xr-xlib/ps2ps2.bat24
-rwxr-xr-xlib/ps2ps2.cmd35
-rw-r--r--lib/ras1.upp8
-rw-r--r--lib/ras24.upp8
-rw-r--r--lib/ras3.upp8
-rw-r--r--lib/ras32.upp8
-rw-r--r--lib/ras4.upp8
-rw-r--r--lib/ras8m.upp8
-rw-r--r--lib/rinkj-2200-setup222
-rw-r--r--lib/rollconv.ps383
-rw-r--r--lib/st640ih.upp60
-rw-r--r--lib/st640ihg.upp45
-rw-r--r--lib/st640p.upp52
-rw-r--r--lib/st640pg.upp37
-rw-r--r--lib/st640pl.upp52
-rw-r--r--lib/st640plg.upp37
-rw-r--r--lib/stc.upp56
-rw-r--r--lib/stc1520h.upp61
-rw-r--r--lib/stc2.upp56
-rw-r--r--lib/stc200_h.upp54
-rw-r--r--lib/stc2_h.upp56
-rw-r--r--lib/stc2s_h.upp60
-rw-r--r--lib/stc300.upp63
-rw-r--r--lib/stc300bl.upp43
-rw-r--r--lib/stc300bm.upp46
-rw-r--r--lib/stc500p.upp51
-rw-r--r--lib/stc500ph.upp51
-rw-r--r--lib/stc600ih.upp61
-rw-r--r--lib/stc600p.upp37
-rw-r--r--lib/stc600pl.upp37
-rw-r--r--lib/stc640p.upp36
-rw-r--r--lib/stc800ih.upp61
-rw-r--r--lib/stc800p.upp37
-rw-r--r--lib/stc800pl.upp37
-rw-r--r--lib/stc_h.upp56
-rw-r--r--lib/stc_l.upp29
-rw-r--r--lib/stcany.upp27
-rw-r--r--lib/stcany_h.upp27
-rw-r--r--lib/stcinfo.ps794
-rw-r--r--lib/stcolor.ps169
-rw-r--r--lib/stocht.ps61
-rw-r--r--lib/traceimg.ps41
-rw-r--r--lib/traceop.ps82
-rw-r--r--lib/uninfo.ps219
-rwxr-xr-xlib/unix-lpr.sh165
-rw-r--r--lib/viewcmyk.ps62
-rw-r--r--lib/viewgif.ps178
-rw-r--r--lib/viewjpeg.ps173
-rw-r--r--lib/viewmiff.ps137
-rw-r--r--lib/viewpbm.ps335
-rw-r--r--lib/viewpcx.ps191
-rw-r--r--lib/viewps2a.ps31
-rw-r--r--lib/viewpwg.ps251
-rw-r--r--lib/viewraw.ps187
-rw-r--r--lib/viewrgb.ps149
-rw-r--r--lib/winmaps.ps105
-rwxr-xr-xlib/wmakebat.bat3
-rw-r--r--lib/zeroline.ps99
220 files changed, 25412 insertions, 0 deletions
diff --git a/lib/FAPIconfig-FCO b/lib/FAPIconfig-FCO
new file mode 100644
index 00000000..6df21e3d
--- /dev/null
+++ b/lib/FAPIconfig-FCO
@@ -0,0 +1,13 @@
+%!
+% This is configuration file for FAPI client.
+
+/FontPath () % A default directory for FAPI-handled font files path in FAPIfontmap.
+/CIDFontPath () % A default directory for FAPI-handled CID font files path in FAPIcidfmap.
+/HookDiskFonts [] % FontType values for disk PS fonts to be redirected to FAPI.
+/HookEmbeddedFonts [] % FontType values for embedded PS fonts to be redirected to FAPI.
+
+% Values allowed for HookDiskFonts and HookEmbeddedFonts are 1, 2, 9, 11, 42.
+% "Disk fonts" are fonts being installed to Ghostscript with 'lib/Fontmap' or with GS_FONTPATH,
+% and CID font resource files.
+% "Embedded fonts" are fonts and CID fonts being embedded into a document.
+
diff --git a/lib/FCOfontmap-PCLPS3 b/lib/FCOfontmap-PCLPS3
new file mode 100644
index 00000000..1dd130e0
--- /dev/null
+++ b/lib/FCOfontmap-PCLPS3
@@ -0,0 +1,197 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+
+% May add general FAPIfontmap records here like this :
+/Wingdings-Regular << /Path FCOfontfile2 /FontType 1 /FAPI /UFST /SubfontId 0 /Encoding /Wingdings /Decoding /FCO_Wingdings>> ;
+
+% Mapping Postscript fonts to pclp2_xj.fco FCO members :
+FCOfontfile ReadFCOfontmap:
+0 Albertus-Medium
+1 Albertus-ExtraBold
+2 AntiqueOlive
+3 AntiqueOlive-Italic
+4 AntiqueOlive-Bold
+5 Arial
+6 Arial-Italic
+7 Arial-Bold
+8 Arial-BoldItalic
+9 Clarendon-Condensed-Bold
+10 Coronet
+11 CourierHP
+12 CourierHP-Italic
+13 CourierHP-Bold
+14 CourierHP-BoldItalic
+15 Garamond-Antiqua
+16 Garamond-Kursiv
+17 Garamond-Halbfett
+18 Garamond-KursivHalbfett
+19 LetterGothic
+20 LetterGothic-Italic
+21 LetterGothic-Bold
+22 Marigold
+23 CGOmega
+24 CGOmega-Italic
+25 CGOmega-Bold
+26 CGOmega-BoldItalic
+27 SymbolMT SymbolEncoding FCO_Symbol
+28 CGTimes
+29 CGTimes-Italic
+30 CGTimes-Bold
+31 CGTimes-BoldItalic
+32 TimesNewRoman
+33 TimesNewRoman-Italic
+34 TimesNewRoman-Bold
+35 TimesNewRoman-BoldItalic
+36 Univers-Medium
+37 Univers-MediumItalic
+38 Univers-Bold
+39 Univers-BoldItalic
+40 Univers-Condensed-Medium
+41 Univers-Condensed-MediumItalic
+42 Univers-Condensed-Bold
+43 Univers-Condensed-BoldItalic
+44 Courier
+45 Courier-Italic
+46 Courier-Bold
+47 Courier-BoldItalic
+48 AlbertusMT-Light
+49 AlbertusMT
+50 AlbertusMT-Italic
+51 AntiqueOlive-Roman
+52 AntiqueOlive-Italic
+53 AntiqueOlive-Bold
+54 AntiqueOlive-Compact
+55 AvantGarde-Book
+56 AvantGarde-BookOblique
+57 AvantGarde-Demi
+58 AvantGarde-DemiOblique
+59 Bodoni
+60 Bodoni-Italic
+61 Bodoni-Bold
+62 Bodoni-BoldItalic
+63 Bodoni-Poster
+64 Bodoni-PosterCompressed
+65 Bookman-Light
+66 Bookman-LightItalic
+67 Bookman-Demi
+68 Bookman-DemiItalic
+69 Candid
+70 Apple-Chancery
+71 Chicago
+72 Clarendon-Light
+73 Clarendon
+74 Clarendon-Bold
+75 CooperBlack
+76 CooperBlack-Italic
+77 Copperplate-ThirtyTwoBC
+78 Copperplate-ThirtyThreeBC
+79 Coronet-Regular
+80 Courier
+81 Courier-Oblique
+82 Courier-Bold
+83 Courier-BoldOblique
+84 Eurostile
+85 Eurostile-Bold
+86 Eurostile-ExtendedTwo
+87 Eurostile-BoldExtendedTwo
+88 StempelGaramond-Roman
+89 StempelGaramond-Italic
+90 StempelGaramond-Bold
+91 StempelGaramond-BoldItalic
+92 Geneva
+93 GillSans-Light
+94 GillSans-LightItalic
+95 GillSans
+96 GillSans-Italic
+97 GillSans-Bold
+98 GillSans-BoldItalic
+99 GillSans-ExtraBold
+100 GillSans-Condensed
+101 GillSans-BoldCondensed
+102 Goudy
+103 Goudy-Italic
+104 Goudy-Bold
+105 Goudy-BoldItalic
+106 Goudy-ExtraBold
+107 Helvetica-Condensed
+108 Helvetica-Condensed-Oblique
+109 Helvetica-Condensed-Bold
+110 Helvetica-Condensed-BoldObl
+111 Helvetica
+112 Helvetica-Oblique
+113 Helvetica-Bold
+114 Helvetica-BoldOblique
+115 Helvetica-Narrow
+116 Helvetica-Narrow-Oblique
+117 Helvetica-Narrow-Bold
+118 Helvetica-Narrow-BoldOblique
+119 HoeflerText-Regular
+120 HoeflerText-Italic
+121 HoeflerText-Black
+122 HoeflerText-BlackItalic
+123 HoeflerText-Ornaments
+124 JoannaMT
+125 JoannaMT-Italic
+126 JoannaMT-Bold
+127 JoannaMT-BoldItalic
+128 LetterGothic
+129 LetterGothic-Slanted
+130 LetterGothic-Bold
+131 LetterGothic-BoldSlanted
+132 LubalinGraph-Book
+133 LubalinGraph-BookOblique
+134 LubalinGraph-Demi
+135 LubalinGraph-DemiOblique
+136 Monaco
+137 MonaLisa-Recut
+138 NewYork
+139 NewCenturySchlbk-Roman
+140 NewCenturySchlbk-Italic
+141 NewCenturySchlbk-Bold
+142 NewCenturySchlbk-BoldItalic
+143 Optima
+144 Optima-Italic
+145 Optima-Bold
+146 Optima-BoldItalic
+147 Oxford
+148 Palatino-Roman
+149 Palatino-Italic
+150 Palatino-Bold
+151 Palatino-BoldItalic
+152 Symbol SymbolEncoding FCO_Symbol
+153 Taffy
+154 Times-Roman
+155 Times-Italic
+156 Times-Bold
+157 Times-BoldItalic
+158 Univers
+159 Univers-Oblique
+160 Univers-Bold
+161 Univers-BoldOblique
+162 Univers-Condensed
+163 Univers-CondensedOblique
+164 Univers-CondensedBold
+165 Univers-CondensedBoldOblique
+166 Univers-Light
+167 Univers-LightOblique
+168 Univers-Extended
+169 Univers-ExtendedObl
+170 Univers-BoldExt
+171 Univers-BoldExtObl
+172 ZapfChancery-MediumItalic
+173 ZapfDingbats DingbatsEncoding FCO_Dingbats
+EndFCOfontmap
+%EOF
diff --git a/lib/FCOfontmap-PS3 b/lib/FCOfontmap-PS3
new file mode 100644
index 00000000..58e66a80
--- /dev/null
+++ b/lib/FCOfontmap-PS3
@@ -0,0 +1,158 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+
+% May add general FAPIfontmap records here like this :
+/Wingdings-Regular << /Path FCOfontfile2 /FontType 1 /FAPI /UFST /SubfontId 0 /Encoding /Wingdings /Decoding /FCO_Wingdings>> ;
+
+% Mapping Postscript fonts to ps3___xh.fco FCO members :
+FCOfontfile ReadFCOfontmap:
+0 AlbertusMT-Light
+1 AlbertusMT
+2 AlbertusMT-Italic
+3 AntiqueOlive-Roman
+4 AntiqueOlive-Italic
+5 AntiqueOlive-Bold
+6 AntiqueOlive-Compact
+7 ArialMT
+8 Arial-ItalicMT
+9 Arial-BoldMT
+10 Arial-BoldItalicMT
+11 AvantGarde-Book
+12 AvantGarde-BookOblique
+13 AvantGarde-Demi
+14 AvantGarde-DemiOblique
+15 Bodoni
+16 Bodoni-Italic
+17 Bodoni-Bold
+18 Bodoni-BoldItalic
+19 Bodoni-Poster
+20 Bodoni-PosterCompressed
+21 Bookman-Light
+22 Bookman-LightItalic
+23 Bookman-Demi
+24 Bookman-DemiItalic
+% 25 Candid % Disabled due to unknown glyph names.
+26 Apple-Chancery
+27 Chicago
+28 Clarendon-Light
+29 Clarendon
+30 Clarendon-Bold
+31 CooperBlack
+32 CooperBlack-Italic
+33 Copperplate-ThirtyTwoBC
+34 Copperplate-ThirtyThreeBC
+35 Coronet-Regular
+36 Courier
+37 Courier-Oblique
+38 Courier-Bold
+39 Courier-BoldOblique
+40 Eurostile
+41 Eurostile-Bold
+42 Eurostile-ExtendedTwo
+43 Eurostile-BoldExtendedTwo
+44 StempelGaramond-Roman
+45 StempelGaramond-Italic
+46 StempelGaramond-Bold
+47 StempelGaramond-BoldItalic
+48 Geneva
+49 GillSans-Light
+50 GillSans-LightItalic
+51 GillSans
+52 GillSans-Italic
+53 GillSans-Bold
+54 GillSans-BoldItalic
+55 GillSans-ExtraBold
+56 GillSans-Condensed
+57 GillSans-BoldCondensed
+58 Goudy
+59 Goudy-Italic
+60 Goudy-Bold
+61 Goudy-BoldItalic
+62 Goudy-ExtraBold
+63 Helvetica-Condensed
+64 Helvetica-Condensed-Oblique
+65 Helvetica-Condensed-Bold
+66 Helvetica-Condensed-BoldObl
+67 Helvetica
+68 Helvetica-Oblique
+69 Helvetica-Bold
+70 Helvetica-BoldOblique
+71 Helvetica-Narrow
+72 Helvetica-Narrow-Oblique
+73 Helvetica-Narrow-Bold
+74 Helvetica-Narrow-BdOblique
+75 HoeflerText-Regular
+76 HoeflerText-Italic
+77 HoeflerText-Black
+78 HoeflerText-BlackItalic
+79 HoeflerText-Ornaments
+80 JoannaMT
+81 JoannaMT-Italic
+82 JoannaMT-Bold
+83 JoannaMT-BoldItalic
+84 LetterGothic
+85 LetterGothic-Slanted
+86 LetterGothic-Bold
+87 LetterGothic-BoldSlanted
+88 LubalinGraph-Book
+89 LubalinGraph-BookOblique
+90 LubalinGraph-Demi
+91 LubalinGraph-DemiOblique
+92 Marigold
+93 Monaco
+94 MonaLisa-Recut
+95 NewYork
+96 NewCenturySchlbk-Roman
+97 NewCenturySchlbk-Italic
+98 NewCenturySchlbk-Bold
+99 NewCenturySchlbk-BoldItalic
+100 Optima
+101 Optima-Italic
+102 Optima-Bold
+103 Optima-BoldItalic
+104 Oxford
+105 Palatino-Roman
+106 Palatino-Italic
+107 Palatino-Bold
+108 Palatino-BoldItalic
+109 Symbol SymbolEncoding FCO_Symbol
+110 Taffy
+111 Times-Roman
+112 Times-Italic
+113 Times-Bold
+114 Times-BoldItalic
+115 TimesNewRomanPSMT
+116 TimesNewRomanPS-ItalicMT
+117 TimesNewRomanPS-BoldMT
+118 TimesNewRomanPS-BdItMT
+119 Univers
+120 Univers-Oblique
+121 Univers-Bold
+122 Univers-BoldOblique
+123 Univers-Condensed
+124 Univers-CondensedOblique
+125 Univers-CondensedBold
+126 Univers-CondensedBdOblique
+127 Univers-Light
+128 Univers-LightOblique
+129 Univers-Extended
+130 Univers-ExtendedObl
+131 Univers-BoldExt
+132 Univers-BoldExtObl
+133 ZapfChancery-MediumItalic
+134 ZapfDingbats DingbatsEncoding FCO_Dingbats
+EndFCOfontmap
+%EOF
diff --git a/lib/Fontmap.ATB b/lib/Fontmap.ATB
new file mode 100644
index 00000000..ffd754e1
--- /dev/null
+++ b/lib/Fontmap.ATB
@@ -0,0 +1,167 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Fontmap.ATB - an alternative Fontmap for Ghostscript,
+% suitable for use with the 65 Adobe Type Manager fonts
+% supplied with Adobe Type Basics.
+
+% Before you use ATM fonts with Ghostscript, please read carefully
+% the license that accompanies the ATM fonts; neither Artifex Software Inc
+% nor any other distributor of Ghostscript takes any responsibility for
+% any possible violations of such licenses.
+
+% The 65 Adobe Type Basics ATM fonts
+
+%disk 1
+/Bookman-Light (bkl_____.pfb) ;
+/Bookman-Demi (bkd_____.pfb) ;
+/Bookman-DemiItalic (bkdi____.pfb) ;
+/Bookman-LightItalic (bkli____.pfb) ;
+/Courier (com_____.pfb) ;
+/Courier-Bold (cob_____.pfb) ;
+/Courier-BoldOblique (cobo____.pfb) ;
+/Courier-Oblique (coo_____.pfb) ;
+/Helvetica (hv______.pfb) ;
+/Helvetica-Bold (hvb_____.pfb) ;
+/Helvetica-BoldOblique (hvbo____.pfb) ;
+/Helvetica-Oblique (hvo_____.pfb) ;
+/Helvetica-Narrow (hvn_____.pfb) ;
+/Helvetica-Narrow-Bold (hvnb____.pfb) ;
+/Helvetica-Narrow-BoldOblique (hvnbo___.pfb) ;
+/Helvetica-Narrow-Oblique (hvno____.pfb) ;
+/Palatino-Roman (por_____.pfb) ;
+/Palatino-Bold (pob_____.pfb) ;
+/Palatino-BoldItalic (pobi____.pfb) ;
+/Palatino-Italic (poi_____.pfb) ;
+/Symbol (sy______.pfb) ;
+/Times-Roman (tir_____.pfb) ;
+/Times-Bold (tib_____.pfb) ;
+/Times-BoldItalic (tibi____.pfb) ;
+/Times-Italic (tii_____.pfb) ;
+
+% disk2
+/AGaramond-Regular (gdrg____.pfb) ;
+/AGaramond-Italic (gdi_____.pfb) ;
+/AGaramond-Bold (gdb_____.pfb) ;
+/AGaramond-BoldItalic (gdbi____.pfb) ;
+/Americana (am______.pfb) ;
+/Americana-ExtraBold (ameb____.pfb) ;
+/AvantGarde-Book (agw_____.pfb) ;
+/AvantGarde-Demi (agd_____.pfb) ;
+/AvantGarde-DemiOblique (agdo____.pfb) ;
+/AvantGarde-BookOblique (agwo____.pfb) ;
+/Carta (cr______.pfb) ;
+/Kaufmann (kf______.pfb) ;
+/Lithos-Regular (lorg____.pfb) ;
+/Lithos-Black (lobl____.pfb) ;
+/NewCenturySchlbk-Roman (ncr_____.pfb) ;
+/NewCenturySchlbk-Bold (ncb_____.pfb) ;
+/NewCenturySchlbk-BoldItalic (ncbi____.pfb) ;
+/NewCenturySchlbk-Italic (nci_____.pfb) ;
+/Parisian (pn______.pfb) ;
+/ParkAvenue (pa______.pfb) ;
+/Tekton (tkrg____.pfb) ;
+/Tekton-Bold (tkb_____.pfb) ;
+/Trajan-Bold (tjb_____.pfb) ;
+/ZapfChancery-MediumItalic (zcmi____.pfb) ;
+/ZapfDingbats (zd______.pfb) ;
+
+%disk 3
+/ACaslon-Regular (awrg____.pfb) ;
+/ACaslon-Semibold (awsb____.pfb) ;
+/ACaslon-SemiboldItalic (awsbi___.pfb) ;
+/ACaslon-Italic (awi_____.pfb) ;
+/Barmeno-Regular (bfrg____.pfb) ;
+/Barmeno-Medium (bfm_____.pfb) ;
+/Barmeno-Bold (bfb_____.pfb) ;
+/Barmeno-ExtraBold (bfeb____.pfb) ;
+/Blackoak (bo______.pfb) ;
+/Formata-Regular (fmrg____.pfb) ;
+/Formata-Medium (fmm_____.pfb) ;
+/Formata-MediumItalic (fmmi____.pfb) ;
+/Formata-Italic (fmi_____.pfb) ;
+/Poetica-SuppOrnaments (pvor____.pfb) ;
+/WoodtypeOrnaments-Two (woor2___.pfb) ;
+
+
+% Fonts converted from bitmaps.
+
+/Charter-Roman (bchr.gsf) ;
+/Charter-Italic (bchri.gsf) ;
+/Charter-Bold (bchb.gsf) ;
+/Charter-BoldItalic (bchbi.gsf) ;
+
+/ZapfChancery (zcr.gsf) ;
+/ZapfChancery-Oblique (zcro.gsf) ;
+/ZapfChancery-Bold (zcb.gsf) ;
+
+% Fonts from the X11R5 distribution.
+
+/Utopia-Regular (putr.gsf) ;
+/Utopia-Italic (putri.gsf) ;
+/Utopia-Bold (putb.gsf) ;
+/Utopia-BoldItalic (putbi.gsf) ;
+
+% Shareware fonts. See FONTMAP.GS for the copyright statements.
+
+/Shareware-Cyrillic-Regular (fcyr.gsf) ;
+/Shareware-Cyrillic-Italic (fcyri.gsf) ;
+% Aliases
+/Cyrillic /Cyrillic-Regular ;
+/Cyrillic-Regular /Shareware-Cyrillic-Regular ;
+/Cyrillic-Italic /Shareware-Cyrillic-Italic ;
+
+/Calligraphic-Hiragana (fhirw.gsf) ;
+/Calligraphic-Katakana (fkarw.gsf) ;
+
+% Fonts converted from Hershey outlines.
+
+/Hershey-Gothic-English (hrge_r.gsf) 4290000 ;
+/Hershey-Gothic-English-Bold (hrge_rb.gsf) 4290030 ;
+/Hershey-Gothic-English-Oblique (hrge_ro.gsf) 4290010 ;
+
+/Hershey-Gothic-German (hrgr_r.gsf) 4291000 ;
+/Hershey-Gothic-German-Bold (hrgr_rb.gsf) 4291030 ;
+/Hershey-Gothic-German-Oblique (hrgr_ro.gsf) 4291010 ;
+
+/Hershey-Gothic-Italian (hrit_r.gsf) 4292000 ;
+/Hershey-Gothic-Italian-Bold (hrit_rb.gsf) 4292030 ;
+/Hershey-Gothic-Italian-Oblique (hrit_ro.gsf) 4292010 ;
+
+/Hershey-Greek-Complex (hrgk_c.gsf) 4293200 ;
+/Hershey-Greek-Simplex (hrgk_s.gsf) 4293100 ;
+
+/Hershey-Plain (hrpl_r.gsf) 4294000 ;
+/Hershey-Plain-Bold (hrpl_rb.gsf) 4294030 ;
+/Hershey-Plain-Oblique (hrpl_ro.gsf) 4294010 ;
+/Hershey-Plain-Simplex (hrpl_s.gsf) 4294100 ;
+/Hershey-Plain-Simplex-Bold (hrpl_sb.gsf) 4294130 ;
+/Hershey-Plain-Simplex-Bold-Oblique (hrpl_sbo.gsf) 4294140 ;
+/Hershey-Plain-Simplex-Oblique (hrpl_so.gsf) 4294110 ;
+/Hershey-Plain-Triplex (hrpl_t.gsf) 4294300 ;
+/Hershey-Plain-Triplex-Italic (hrpl_ti.gsf) 4294320 ;
+/Hershey-Plain-Triplex-Bold (hrpl_tb.gsf) 4294330 ;
+/Hershey-Plain-Triplex-Bold-Italic (hrpl_tbi.gsf) 4294350 ;
+
+/Hershey-Script-Complex (hrsc_c.gsf) 4295200 ;
+/Hershey-Script-Complex-Bold (hrsc_cb.gsf) 4295230 ;
+/Hershey-Script-Complex-Oblique (hrsc_co.gsf) 4295210 ;
+/Hershey-Script-Simplex (hrsc_s.gsf) 4295100 ;
+/Hershey-Script-Simplex-Bold (hrsc_sb.gsf) 4295130 ;
+/Hershey-Script-Simplex-Oblique (hrsc_so.gsf) 4295110 ;
+
+% This font, and only this font among the Hershey fonts, uses
+% the SymbolEncoding.
+/Hershey-Symbol (hrsy_r.gsf) 4296000 ;
diff --git a/lib/Fontmap.ATM b/lib/Fontmap.ATM
new file mode 100644
index 00000000..06bec7b8
--- /dev/null
+++ b/lib/Fontmap.ATM
@@ -0,0 +1,184 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Fontmap.ATM - an alternative Fontmap for Ghostscript,
+% suitable for use with Adobe Type Manager fonts.
+
+% Before you use ATM fonts with Ghostscript, please read carefully
+% the license that accompanies the ATM fonts; neither Artifex Software Inc.
+% nor any other distributor of Ghostscript takes any responsibility for
+% any possible violations of such licenses.
+
+%
+%
+% Fonts contributed by:
+% URW++ Design and Development Incorporated
+% Poppenbuetteler Bogen 29A
+% D-22399 Hamburg
+% Germany
+% tel. +49 (40) 60 60 50
+% fax +49 (40) 60 60 51 11
+% http://www.urwpp.de
+% for distribution under the GNU License and Aladdin Free Public License.
+% See the notice at the head of this Fontmap file for licensing terms.
+% Each of these fonts is individually covered by the license:
+% for licensing purposes, they are not "part of" any larger entity.
+% The following notice applies to these fonts:
+%
+% Copyright URW Software, Copyright 1994 by URW.
+%
+
+% Actual fonts
+
+/URWBookmanL-DemiBold (b018015l.pfb) ;
+/URWBookmanL-DemiBoldItal (b018035l.pfb) ;
+/URWBookmanL-Ligh (b018012l.pfb) ;
+/URWBookmanL-LighItal (b018032l.pfb) ;
+
+/NimbusMonL-Regu (n022003l.pfb) ;
+/NimbusMonL-ReguObli (n022023l.pfb) ;
+/NimbusMonL-Bold (n022004l.pfb) ;
+/NimbusMonL-BoldObli (n022024l.pfb) ;
+
+/URWGothicL-Book (a010013l.pfb) ;
+/URWGothicL-BookObli (a010033l.pfb) ;
+/URWGothicL-Demi (a010015l.pfb) ;
+/URWGothicL-DemiObli (a010035l.pfb) ;
+
+/NimbusSanL-Regu (n019003l.pfb) ;
+/NimbusSanL-ReguItal (n019023l.pfb) ;
+/NimbusSanL-Bold (n019004l.pfb) ;
+/NimbusSanL-BoldItal (n019024l.pfb) ;
+
+/NimbusSanL-ReguCond (n019043l.pfb) ;
+/NimbusSanL-ReguCondItal (n019063l.pfb) ;
+/NimbusSanL-BoldCond (n019044l.pfb) ;
+/NimbusSanL-BoldCondItal (n019064l.pfb) ;
+
+/URWPalladioL-Roma (p052003l.pfb) ;
+/URWPalladioL-Ital (p052023l.pfb) ;
+/URWPalladioL-Bold (p052004l.pfb) ;
+/URWPalladioL-BoldItal (p052024l.pfb) ;
+
+/CenturySchL-Roma (c059013l.pfb) ;
+/CenturySchL-Ital (c059033l.pfb) ;
+/CenturySchL-Bold (c059016l.pfb) ;
+/CenturySchL-BoldItal (c059036l.pfb) ;
+
+/NimbusRomNo9L-Regu (n021003l.pfb) ;
+/NimbusRomNo9L-ReguItal (n021023l.pfb) ;
+/NimbusRomNo9L-Medi (n021004l.pfb) ;
+/NimbusRomNo9L-MediItal (n021024l.pfb) ;
+
+/StandardSymL (s050000l.pfb) ;
+
+/URWChanceryL-MediItal (z003034l.pfb) ;
+
+/Dingbats (d050000l.pfb) ;
+
+% Aliases
+
+/Bookman-Demi /URWBookmanL-DemiBold ;
+/Bookman-DemiItalic /URWBookmanL-DemiBoldItal ;
+/Bookman-Light /URWBookmanL-Ligh ;
+/Bookman-LightItalic /URWBookmanL-LighItal ;
+
+/Courier /NimbusMonL-Regu ;
+/Courier-Oblique /NimbusMonL-ReguObli ;
+/Courier-Bold /NimbusMonL-Bold ;
+/Courier-BoldOblique /NimbusMonL-BoldObli ;
+
+/AvantGarde-Book /URWGothicL-Book ;
+/AvantGarde-BookOblique /URWGothicL-BookObli ;
+/AvantGarde-Demi /URWGothicL-Demi ;
+/AvantGarde-DemiOblique /URWGothicL-DemiObli ;
+
+/Helvetica /NimbusSanL-Regu ;
+/Helvetica-Oblique /NimbusSanL-ReguItal ;
+/Helvetica-Bold /NimbusSanL-Bold ;
+/Helvetica-BoldOblique /NimbusSanL-BoldItal ;
+
+/Helvetica-Narrow /NimbusSanL-ReguCond ;
+/Helvetica-Narrow-Oblique /NimbusSanL-ReguCondItal ;
+/Helvetica-Narrow-Bold /NimbusSanL-BoldCond ;
+/Helvetica-Narrow-BoldOblique /NimbusSanL-BoldCondItal ;
+
+/Palatino-Roman /URWPalladioL-Roma ;
+/Palatino-Italic /URWPalladioL-Ital ;
+/Palatino-Bold /URWPalladioL-Bold ;
+/Palatino-BoldItalic /URWPalladioL-BoldItal ;
+
+/NewCenturySchlbk-Roman /CenturySchL-Roma ;
+/NewCenturySchlbk-Italic /CenturySchL-Ital ;
+/NewCenturySchlbk-Bold /CenturySchL-Bold ;
+/NewCenturySchlbk-BoldItalic /CenturySchL-BoldItal ;
+
+/Times-Roman /NimbusRomNo9L-Regu ;
+/Times-Italic /NimbusRomNo9L-ReguItal ;
+/Times-Bold /NimbusRomNo9L-Medi ;
+/Times-BoldItalic /NimbusRomNo9L-MediItal ;
+
+/Symbol /StandardSymL ;
+
+/ZapfChancery-MediumItalic /URWChanceryL-MediItal ;
+
+/ZapfDingbats /Dingbats ;
+
+
+% ATM fonts.
+
+/Courier (com_____.pfb) ;
+/Courier-Oblique (coo_____.pfb) ;
+/Courier-Bold (cob_____.pfb) ;
+/Courier-BoldOblique (cobo____.pfb) ;
+
+/Helvetica (hv______.pfb) ;
+/Helvetica-Oblique (hvo_____.pfb) ;
+/Helvetica-Bold (hvb_____.pfb) ;
+/Helvetica-BoldOblique (hvbo____.pfb) ;
+
+/Symbol (sy______.pfb) ;
+
+/Times-Roman (tir_____.pfb) ;
+/Times-Italic (tii_____.pfb) ;
+/Times-Bold (tib_____.pfb) ;
+/Times-BoldItalic (tibi____.pfb) ;
+
+
+% More fonts from Adobe Type Manager for MS Windows.
+
+/TektonMM (zjrg____.pfb) ;
+
+/Boulevard (qtrg____.pfb) ;
+/Anna (iarg____.pfb) ;
+
+/PopplLaudatio-Regular (pyrg____.pfb) ;
+/PopplLaudatio-Medium (pym_____.pfb) ;
+/PopplLaudatio-Italic (pyi_____.pfb) ;
+/PopplLaudatio-MediumItalic (pymi____.pfb) ;
+
+/Boton-Regular (tnr_____.pfb) ;
+/Boton-Medium (tnm_____.pfb) ;
+/Boton-Italic (tni_____.pfb) ;
+/Boton-MediumItalic (tnmi____.pfb) ;
+
+/BaskervilleBE-Regular (virg____.pfb) ;
+/BaskervilleBE-Medium (vim_____.pfb) ;
+/BaskervilleBE-Italic (vii_____.pfb) ;
+/BaskervilleBE-MediumItalic (vimi____.pfb) ;
+
+/Giddyup (wg______.pfb) ;
+/Giddyup-Thangs (wgtha___.pfb) ;
+
diff --git a/lib/Fontmap.OS2 b/lib/Fontmap.OS2
new file mode 100644
index 00000000..ec425235
--- /dev/null
+++ b/lib/Fontmap.OS2
@@ -0,0 +1,213 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% fontmap.os2 aka Fontmap.OS2 - OS/2 font catalog for Ghostscript.
+
+% ----------------------------------------------------------------
+
+% This file is a catalog of fonts known to Ghostscript. Any font
+% that is to be loaded automatically when named must be in this catalog,
+% except for fonts that Ghostscript finds automatically in directories
+% named in the GS_FONTPATH environment variable.
+
+% Each font has an entry consisting of three items:
+%
+% - The name by which the font is known inside Ghostscript
+% (a Ghostscript name preceded by a `/', or a string enclosed
+% in parentheses). This is used to find the file from which
+% a font of a given name should be loaded.
+%
+% - Information depending on whether this is a real font or a
+% font alias:
+%
+% - For real fonts, the name of the Ghostscript font
+% file (a Ghostscript string, enclosed in parentheses).
+% The filename should include the extension, which (by
+% convention) is `.gsf'. `.pfa' and `.pfb' files are
+% also usable as fonts for Ghostscript.
+%
+% - For font aliases, the name of the font which should
+% be used when this one is requested, preceded by a
+% `/'. See the entry for Charter below for an example.
+%
+% - A terminating semicolon.
+
+% Because of limitations in the MS-DOS environment, Ghostscript font
+% file names must be no more than 8 characters long, must consist only
+% of LOWER CASE letters, digits, and underscores, and must start with a
+% letter. Font names, on the other hand, need only obey the syntax of
+% names in the Ghostscript language, which is much more liberal.
+
+% Most of the Ghostscript fonts were created automatically from freely
+% available bitmaps. There is a makefile (fonts.mak) that specifies
+% how this conversion was done. fonts.mak also specifies, for each such
+% converted font, its uniqueID (an integer used to identify distinct fonts
+% within the Ghostscript font machinery), and its encoding (the mapping
+% from character codes in a string to character names). For more detailed
+% information, read fonts.mak.
+
+% The following table is actually a Ghostscript data structure.
+% If you add new entries, be sure to copy the punctuation accurately;
+% in particular, you must leave at least one space or tab between each
+% field in the entry. Also, please read fonts.doc for important information
+% about font names.
+
+
+%
+%
+% Fonts contributed by:
+% URW++ Design and Development Incorporated
+% Poppenbuetteler Bogen 29A
+% D-22399 Hamburg
+% Germany
+% tel. +49 (40) 60 60 50
+% fax +49 (40) 60 60 51 11
+% http://www.urwpp.de
+% for distribution under the GNU License and Aladdin Free Public License.
+% See the notice at the head of this Fontmap file for licensing terms.
+% Each of these fonts is individually covered by the license:
+% for licensing purposes, they are not "part of" any larger entity.
+% The following notice applies to these fonts:
+%
+% Copyright URW Software, Copyright 1994 by URW.
+%
+
+% Actual fonts
+
+/URWBookmanL-DemiBold (b018015l.pfb) ;
+/URWBookmanL-DemiBoldItal (b018035l.pfb) ;
+/URWBookmanL-Ligh (b018012l.pfb) ;
+/URWBookmanL-LighItal (b018032l.pfb) ;
+
+/NimbusMonL-Regu (n022003l.pfb) ;
+/NimbusMonL-ReguObli (n022023l.pfb) ;
+/NimbusMonL-Bold (n022004l.pfb) ;
+/NimbusMonL-BoldObli (n022024l.pfb) ;
+
+/URWGothicL-Book (a010013l.pfb) ;
+/URWGothicL-BookObli (a010033l.pfb) ;
+/URWGothicL-Demi (a010015l.pfb) ;
+/URWGothicL-DemiObli (a010035l.pfb) ;
+
+/NimbusSanL-Regu (n019003l.pfb) ;
+/NimbusSanL-ReguItal (n019023l.pfb) ;
+/NimbusSanL-Bold (n019004l.pfb) ;
+/NimbusSanL-BoldItal (n019024l.pfb) ;
+
+/NimbusSanL-ReguCond (n019043l.pfb) ;
+/NimbusSanL-ReguCondItal (n019063l.pfb) ;
+/NimbusSanL-BoldCond (n019044l.pfb) ;
+/NimbusSanL-BoldCondItal (n019064l.pfb) ;
+
+/URWPalladioL-Roma (p052003l.pfb) ;
+/URWPalladioL-Ital (p052023l.pfb) ;
+/URWPalladioL-Bold (p052004l.pfb) ;
+/URWPalladioL-BoldItal (p052024l.pfb) ;
+
+/CenturySchL-Roma (c059013l.pfb) ;
+/CenturySchL-Ital (c059033l.pfb) ;
+/CenturySchL-Bold (c059016l.pfb) ;
+/CenturySchL-BoldItal (c059036l.pfb) ;
+
+/NimbusRomNo9L-Regu (n021003l.pfb) ;
+/NimbusRomNo9L-ReguItal (n021023l.pfb) ;
+/NimbusRomNo9L-Medi (n021004l.pfb) ;
+/NimbusRomNo9L-MediItal (n021024l.pfb) ;
+
+/StandardSymL (s050000l.pfb) ;
+
+/URWChanceryL-MediItal (z003034l.pfb) ;
+
+/Dingbats (d050000l.pfb) ;
+
+% Aliases
+
+/Bookman-Demi /URWBookmanL-DemiBold ;
+/Bookman-DemiItalic /URWBookmanL-DemiBoldItal ;
+/Bookman-Light /URWBookmanL-Ligh ;
+/Bookman-LightItalic /URWBookmanL-LighItal ;
+
+/Courier /NimbusMonL-Regu ;
+/Courier-Oblique /NimbusMonL-ReguObli ;
+/Courier-Bold /NimbusMonL-Bold ;
+/Courier-BoldOblique /NimbusMonL-BoldObli ;
+
+/AvantGarde-Book /URWGothicL-Book ;
+/AvantGarde-BookOblique /URWGothicL-BookObli ;
+/AvantGarde-Demi /URWGothicL-Demi ;
+/AvantGarde-DemiOblique /URWGothicL-DemiObli ;
+
+/Helvetica /NimbusSanL-Regu ;
+/Helvetica-Oblique /NimbusSanL-ReguItal ;
+/Helvetica-Bold /NimbusSanL-Bold ;
+/Helvetica-BoldOblique /NimbusSanL-BoldItal ;
+
+/Helvetica-Narrow /NimbusSanL-ReguCond ;
+/Helvetica-Narrow-Oblique /NimbusSanL-ReguCondItal ;
+/Helvetica-Narrow-Bold /NimbusSanL-BoldCond ;
+/Helvetica-Narrow-BoldOblique /NimbusSanL-BoldCondItal ;
+
+/Palatino-Roman /URWPalladioL-Roma ;
+/Palatino-Italic /URWPalladioL-Ital ;
+/Palatino-Bold /URWPalladioL-Bold ;
+/Palatino-BoldItalic /URWPalladioL-BoldItal ;
+
+/NewCenturySchlbk-Roman /CenturySchL-Roma ;
+/NewCenturySchlbk-Italic /CenturySchL-Ital ;
+/NewCenturySchlbk-Bold /CenturySchL-Bold ;
+/NewCenturySchlbk-BoldItalic /CenturySchL-BoldItal ;
+
+/Times-Roman /NimbusRomNo9L-Regu ;
+/Times-Italic /NimbusRomNo9L-ReguItal ;
+/Times-Bold /NimbusRomNo9L-Medi ;
+/Times-BoldItalic /NimbusRomNo9L-MediItal ;
+
+/Symbol /StandardSymL ;
+
+/ZapfChancery-MediumItalic /URWChanceryL-MediItal ;
+
+/ZapfDingbats /Dingbats ;
+
+
+%
+% ATM fonts that come with OS/2.
+
+/Courier (cour.pfb) ;
+/Courier-Oblique /Courier-Italic ;
+/Courier-Italic (couri.pfb) ;
+/Courier-Bold (courb.pfb) ;
+/Courier-BoldOblique /Courier-BoldItalic ;
+/Courier-BoldItalic (courbi.pfb) ;
+
+/Helvetica (helv.pfb) ;
+/Helvetica-Oblique /Helvetica-Italic ;
+/Helvetica-Italic (helvi.pfb) ;
+/Helvetica-Bold (helvb.pfb) ;
+/Helvetica-BoldOblique /Helvetica-BoldItalic ;
+/Helvetica-BoldItalic (helvbi.pfb) ;
+
+/Symbol /SymbolSet ;
+/SymbolSet (symb.pfb) ;
+
+/Times-Roman /TimesNewRoman ;
+/TimesNewRoman (tnr.pfb) ;
+/Times-Italic /TimesNewRoman-Italic ;
+/TimesNewRoman-Italic (tnri.pfb) ;
+/Times-Bold /TimesNewRoman-Bold ;
+/TimesNewRoman-Bold (tnrb.pfb) ;
+/Times-BoldItalic /TimesNewRoman-BoldItalic ;
+/TimesNewRoman-BoldItalic (tnrbi.pfb) ;
+
+
diff --git a/lib/Fontmap.OSF b/lib/Fontmap.OSF
new file mode 100644
index 00000000..563f14a9
--- /dev/null
+++ b/lib/Fontmap.OSF
@@ -0,0 +1,163 @@
+% fontmap.osf aka Fontmap.OSF1 - Ghostscript fontmap for DEC OSF/1 systems.
+%
+% UNIX systems from Digital Equipment Corporation are bundled with a license
+% for Display PostScript, including certain fonts. Using their font outlines
+% (which on OSF/1 systems are found in /usr/lib/X11/fonts/Type1Adobe)
+% improves the visual quality of documents displayed on screen. To do that,
+% use this file as your Fontmap file and add /usr/lib/X11/fonts/Type1Adobe
+% as the second argument to GS_LIB_DEFAULT in your makefile
+% in your makefile.
+%
+% This file is Pete Kaiser's original Ultrix file as modified by
+% Bjorn S. Nilsson (nilsson@nbi.dk) first for Ultrix 4.3 and then
+% for OSF/1 version 1.3.
+%
+
+%/AvantGarde-Book (AvantGarde-Book) ;
+%/AvantGarde-BookOblique (AvantGarde-BookOblique);
+%/AvantGarde-Demi (AvantGarde-Demi) ;
+%/AvantGarde-DemiOblique (AvantGarde-DemiOblique);
+
+%/Courier-BoldItalic /Courier-BoldOblique ;
+%/Courier-Italic /Courier-Oblique ;
+
+%/Courier (Courier) ;
+%/Courier-Bold (Courier-Bold) ;
+%/Courier-BoldOblique (Courier-BoldOblique) ;
+%/Courier-Oblique (Courier-Oblique) ;
+
+%/Helvetica (Helvetica) ;
+%/Helvetica-Bold (Helvetica-Bold) ;
+%/Helvetica-BoldOblique (Helvetica-BoldOblique) ;
+%/Helvetica-Oblique (Helvetica-Oblique) ;
+
+%/LubalinGraph-Book (LubalinGraph-Book) ;
+%/LubalinGraph-BookOblique (LubalinGraph-BookOblique);
+%/LubalinGraph-Demi (LubalinGraph-Demi) ;
+%/LubalinGraph-DemiOblique (LubalinGraph-DemiOblique);
+
+%/NewCenturySchlbk-Bold (NewCenturySchlbk-Bold) ;
+%/NewCenturySchlbk-BoldItalic (NewCenturySchlbk-BoldItalic);
+%/NewCenturySchlbk-Italic (NewCenturySchlbk-Italic);
+%/NewCenturySchlbk-Roman (NewCenturySchlbk-Roman);
+
+%/Souvenir-Demi (Souvenir-Demi) ;
+%/Souvenir-DemiItalic (Souvenir-DemiItalic) ;
+%/Souvenir-Light (Souvenir-Light) ;
+%/Souvenir-LightItalic (Souvenir-LightItalic) ;
+
+%/Symbol (Symbol) ;
+
+%/Times-Bold (Times-Bold) ;
+%/Times-BoldItalic (Times-BoldItalic) ;
+%/Times-Italic (Times-Italic) ;
+%/Times-Roman (Times-Roman) ;
+
+%/ZapfDingbats (ZapfDingbats) ;
+
+/AvantGarde-Book (AvantGarde-Book.pfa) ;
+/AvantGarde-BookOblique (AvantGarde-BookOblique.pfa) ;
+/AvantGarde-Demi (AvantGarde-Demi.pfa) ;
+/AvantGarde-DemiOblique (AvantGarde-DemiOblique.pfa) ;
+/Bookman-Demi (pbkd.gsf) ;
+/Bookman-DemiItalic (pbkdi.gsf) ;
+/Bookman-Light (pbkl.gsf) ;
+/Bookman-LightItalic (pbkli.gsf) ;
+/Calligraphic-Hiragana (fhirw.gsf) ;
+/Calligraphic-Katakana (fkarw.gsf) ;
+/CharterBT-Bold (bchb.gsf) ;
+/CharterBT-BoldItalic (bchbi.gsf) ;
+/CharterBT-Italic (bchri.gsf) ;
+/CharterBT-Roman (bchr.gsf) ;
+/Courier (Courier.pfa) ;
+/Courier-Bold (Courier-Bold.pfa) ;
+/Courier-BoldOblique (Courier-BoldOblique.pfa) ;
+/Courier-Oblique (Courier-Oblique.pfa) ;
+/Helvetica (Helvetica.pfa) ;
+/Helvetica-Bold (Helvetica-Bold.pfa) ;
+/Helvetica-BoldOblique (Helvetica-BoldOblique.pfa) ;
+/Helvetica-Oblique (Helvetica-Oblique.pfa) ;
+/Hershey-Gothic-English (hrger.gsf) ;
+/Hershey-Gothic-German (hrgrr.gsf) ;
+/Hershey-Gothic-Italian (hritr.gsf) ;
+/Hershey-Plain-Duplex (hrpld.gsf) ;
+/Hershey-Plain-Duplex-Italic (hrpldi.gsf) ;
+/Hershey-Plain-Triplex (hrplt.gsf) ;
+/Hershey-Plain-Triplex-Italic (hrplti.gsf) ;
+/Hershey-Script-Complex (hrscc.gsf) ;
+/Hershey-Script-Simplex (hrscs.gsf) ;
+/Hershey-Gothic-English-Bold (hrgerb.gsf) ;
+/Hershey-Gothic-English-Oblique (hrgero.gsf) ;
+/Hershey-Gothic-English-Semibold (hrgerd.gsf) ;
+/Hershey-Gothic-German-Bold (hrgrrb.gsf) ;
+/Hershey-Gothic-German-Oblique (hrgrro.gsf) ;
+/Hershey-Gothic-Italian-Bold (hritrb.gsf) ;
+/Hershey-Gothic-Italian-Oblique (hritro.gsf) ;
+/Hershey-Plain-Duplex-Bold (hrpldb.gsf) ;
+/Hershey-Plain-Duplex-Bold-Italic (hrpldbi.gsf) ;
+/Hershey-Plain-Triplex-Bold (hrpltb.gsf) ;
+/Hershey-Plain-Triplex-Bold-Italic (hrpltbi.gsf) ;
+/Hershey-Script-Complex-Bold (hrsccb.gsf) ;
+/Hershey-Script-Complex-Oblique (hrscco.gsf) ;
+/Hershey-Script-Simplex-Bold (hrscsb.gsf) ;
+/Hershey-Script-Simplex-Oblique (hrscso.gsf) ;
+/Hershey-Greek-Complex (hrgkc.gsf) ;
+/Hershey-Greek-Simplex (hrgks.gsf) ;
+/Hershey-Plain (hrplr.gsf) ;
+/Hershey-Plain-Simplex (hrpls.gsf) ;
+/Hershey-Plain-Bold (hrplrb.gsf) ;
+/Hershey-Plain-Bold-Oblique (hrplrbo.gsf) ;
+/Hershey-Plain-Oblique (hrplro.gsf) ;
+/Hershey-Plain-Simplex-Bold (hrplsb.gsf) ;
+/Hershey-Plain-Simplex-Bold-Oblique (hrplsbo.gsf) ;
+/Hershey-Plain-Simplex-Oblique (hrplso.gsf) ;
+/Hershey-Symbol (hrsy_r.gsf) ;
+/LubalinGraph-Book (LubalinGraph-Book.pfa) ;
+/LubalinGraph-BookOblique (LubalinGraph-BookOblique.pfa) ;
+/LubalinGraph-Demi (LubalinGraph-Demi.pfa) ;
+/LubalinGraph-DemiOblique (LubalinGraph-DemiOblique.pfa) ;
+/NewCenturySchlbk-Bold (NewCenturySchlbk-Bold.pfa) ;
+/NewCenturySchlbk-BoldItalic (NewCenturySchlbk-BoldItalic.pfa) ;
+/NewCenturySchlbk-Italic (NewCenturySchlbk-Italic.pfa) ;
+/NewCenturySchlbk-Roman (NewCenturySchlbk-Roman.pfa) ;
+/NimbusRomanNo9L-Regular (n021003l.gsf) ;
+/NimbusSansL-Regular (n019003l.gsf) ;
+/Palatino-Bold (pplb.gsf) ;
+/Palatino-BoldItalic (pplbi.gsf) ;
+/Palatino-Italic (pplri.gsf) ;
+/Palatino-Roman (pplr.gsf) ;
+/Shareware-Cyrillic-Regular (fcyr.gsf) ;
+/Shareware-Cyrillic-Italic (fcyri.gsf) ;
+/Souvenir-Demi (Souvenir-Demi.pfa) ;
+/Souvenir-DemiItalic (Souvenir-DemiItalic.pfa) ;
+/Souvenir-Light (Souvenir-Light.pfa) ;
+/Souvenir-LightItalic (Souvenir-LightItalic.pfa) ;
+/Symbol (Symbol.pfa) ;
+/Times-Bold (Times-Bold.pfa) ;
+/Times-BoldItalic (Times-BoldItalic.pfa) ;
+/Times-Italic (Times-Italic.pfa) ;
+/Times-Roman (Times-Roman.pfa) ;
+/URWAntiquaT-RegularCondensed (u003043t.gsf) ;
+/URWGroteskT-Bold (u004006t.gsf) ;
+/Utopia-Bold (putb.gsf) ;
+/Utopia-BoldItalic (putbi.gsf) ;
+/Utopia-Italic (putri.gsf) ;
+/Utopia-Regular (putr.gsf) ;
+/ZapfChancery (zcr.gsf) ;
+/ZapfChancery-Bold (zcb.gsf) ;
+/ZapfChancery-Oblique (zcro.gsf) ;
+/ZapfDingbats (ZapfDingbats.pfa) ;
+/Cyrillic /Cyrillic-Regular ;
+/Cyrillic-Regular /Shareware-Cyrillic-Regular ;
+/Cyrillic-Italic /Shareware-Cyrillic-Italic ;
+
+% BSN additions from original Fontmap file and some more aliases
+
+/Helvetica-Narrow-Bold /Helvetica-Narrow ;
+/ZapfChancery-MediumItalic /ZapfChancery-Oblique ;
+/Charter-Roman /CharterBT-Roman ;
+/Charter-Italic /CharterBT-Italic ;
+/Charter-Bold /CharterBT-Bold ;
+/Charter-BoldItalic /CharterBT-BoldItalic ;
+/Courier-Italic /Courier-Oblique ;
+/Courier-BoldItalic /Courier-BoldOblique ;
diff --git a/lib/Fontmap.SGI b/lib/Fontmap.SGI
new file mode 100644
index 00000000..353ea833
--- /dev/null
+++ b/lib/Fontmap.SGI
@@ -0,0 +1,404 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+%
+% Fontmap.SGI - standard font catalog for Ghostscript, modified for IRIX 5.3
+% with the DPS fonts installed (dps_eoe.sw.dpsfonts).
+% by H. Gohel, gohel@acm.org. 1999-09-10
+
+% ----------------------------------------------------------------
+
+% This file is a catalog of fonts known to Ghostscript. Any font
+% that is to be loaded automatically when named must be in this catalog,
+% except for fonts that Ghostscript finds automatically in directories
+% named in the GS_FONTPATH environment variable.
+
+% Each font has an entry consisting of three items:
+%
+% - The name by which the font is known inside Ghostscript
+% (a Ghostscript name preceded by a `/', or a string enclosed
+% in parentheses). This is used to find the file from which
+% a font of a given name should be loaded.
+%
+% - Information depending on whether this is a real font or a
+% font alias:
+%
+% - For real fonts, the name of the Ghostscript font
+% file (a Ghostscript string, enclosed in parentheses).
+% The filename should include the extension, which (by
+% convention) is `.gsf'. `.pfa' and `.pfb' files are
+% also usable as fonts for Ghostscript.
+%
+% - For font aliases, the name of the font which should
+% be used when this one is requested, preceded by a
+% `/'. See the entry for Charter below for an example.
+% Note that an alias name cannot be enclosed in parentheses.
+%
+% - At least one space or tab, and a terminating semicolon.
+
+% Because of limitations in the MS-DOS environment, Ghostscript font
+% file names must be no more than 8 characters long, must consist only
+% of LOWER CASE letters, digits, and underscores, and must start with a
+% letter. Font names, on the other hand, need only obey the syntax of
+% names in the Ghostscript language, which is much more liberal.
+
+% The following table is actually a Ghostscript data structure.
+% If you add new entries, be sure to copy the punctuation accurately;
+% in particular, you must leave at least one space or tab between each
+% field in the entry. Also, please read fonts.doc for important information
+% about font names.
+
+% Note that .pfa and .pfb fonts are compatible with Adobe Type Manager
+% and other programs that don't include full PostScript interpreters,
+% as well as with PostScript interpreters; .gsf fonts are compatible with
+% PostScript interpreters, but not with ATM or similar programs.
+
+%
+%
+% Fonts contributed by:
+% URW++ Design and Development Incorporated
+% Poppenbuetteler Bogen 29A
+% D-22399 Hamburg
+% Germany
+% tel. +49 (40) 60 60 50
+% fax +49 (40) 60 60 51 11
+% http://www.urwpp.de
+% for distribution under the GNU License and Aladdin Free Public License.
+% See the notice at the head of this Fontmap file for licensing terms.
+% Each of these fonts is individually covered by the license:
+% for licensing purposes, they are not "part of" any larger entity.
+% The following notice applies to these fonts:
+%
+% Copyright URW Software, Copyright 1994 by URW.
+%
+
+% Actual fonts
+
+/URWBookmanL-DemiBold (b018015l.pfb) ;
+/URWBookmanL-DemiBoldItal (b018035l.pfb) ;
+/URWBookmanL-Ligh (b018012l.pfb) ;
+/URWBookmanL-LighItal (b018032l.pfb) ;
+
+/NimbusMonL-Regu (n022003l.pfb) ;
+/NimbusMonL-ReguObli (n022023l.pfb) ;
+/NimbusMonL-Bold (n022004l.pfb) ;
+/NimbusMonL-BoldObli (n022024l.pfb) ;
+
+/URWGothicL-Book (a010013l.pfb) ;
+/URWGothicL-BookObli (a010033l.pfb) ;
+/URWGothicL-Demi (a010015l.pfb) ;
+/URWGothicL-DemiObli (a010035l.pfb) ;
+
+/NimbusSanL-Regu (n019003l.pfb) ;
+/NimbusSanL-ReguItal (n019023l.pfb) ;
+/NimbusSanL-Bold (n019004l.pfb) ;
+/NimbusSanL-BoldItal (n019024l.pfb) ;
+
+/NimbusSanL-ReguCond (n019043l.pfb) ;
+/NimbusSanL-ReguCondItal (n019063l.pfb) ;
+/NimbusSanL-BoldCond (n019044l.pfb) ;
+/NimbusSanL-BoldCondItal (n019064l.pfb) ;
+
+/URWPalladioL-Roma (p052003l.pfb) ;
+/URWPalladioL-Ital (p052023l.pfb) ;
+/URWPalladioL-Bold (p052004l.pfb) ;
+/URWPalladioL-BoldItal (p052024l.pfb) ;
+
+/CenturySchL-Roma (c059013l.pfb) ;
+/CenturySchL-Ital (c059033l.pfb) ;
+/CenturySchL-Bold (c059016l.pfb) ;
+/CenturySchL-BoldItal (c059036l.pfb) ;
+
+/NimbusRomNo9L-Regu (n021003l.pfb) ;
+/NimbusRomNo9L-ReguItal (n021023l.pfb) ;
+/NimbusRomNo9L-Medi (n021004l.pfb) ;
+/NimbusRomNo9L-MediItal (n021024l.pfb) ;
+
+/StandardSymL (s050000l.pfb) ;
+
+/URWChanceryL-MediItal (z003034l.pfb) ;
+
+/Dingbats (d050000l.pfb) ;
+
+% Aliases
+% These Adobe fonts are available with DPS on IRIX, so they commented out:
+
+%/Bookman-Demi /URWBookmanL-DemiBold ;
+%/Bookman-DemiItalic /URWBookmanL-DemiBoldItal ;
+%/Bookman-Light /URWBookmanL-Ligh ;
+%/Bookman-LightItalic /URWBookmanL-LighItal ;
+
+%/Courier /NimbusMonL-Regu ;
+%/Courier-Oblique /NimbusMonL-ReguObli ;
+%/Courier-Bold /NimbusMonL-Bold ;
+%/Courier-BoldOblique /NimbusMonL-BoldObli ;
+
+%/AvantGarde-Book /URWGothicL-Book ;
+%/AvantGarde-BookOblique /URWGothicL-BookObli ;
+%/AvantGarde-Demi /URWGothicL-Demi ;
+%/AvantGarde-DemiOblique /URWGothicL-DemiObli ;
+
+%/Helvetica /NimbusSanL-Regu ;
+%/Helvetica-Oblique /NimbusSanL-ReguItal ;
+%/Helvetica-Bold /NimbusSanL-Bold ;
+%/Helvetica-BoldOblique /NimbusSanL-BoldItal ;
+
+%/Helvetica-Narrow /NimbusSanL-ReguCond ;
+%/Helvetica-Narrow-Oblique /NimbusSanL-ReguCondItal ;
+%/Helvetica-Narrow-Bold /NimbusSanL-BoldCond ;
+%/Helvetica-Narrow-BoldOblique /NimbusSanL-BoldCondItal ;
+
+%/Palatino-Roman /URWPalladioL-Roma ;
+%/Palatino-Italic /URWPalladioL-Ital ;
+%/Palatino-Bold /URWPalladioL-Bold ;
+%/Palatino-BoldItalic /URWPalladioL-BoldItal ;
+
+%/NewCenturySchlbk-Roman /CenturySchL-Roma ;
+%/NewCenturySchlbk-Italic /CenturySchL-Ital ;
+%/NewCenturySchlbk-Bold /CenturySchL-Bold ;
+%/NewCenturySchlbk-BoldItalic /CenturySchL-BoldItal ;
+
+%/Times-Roman /NimbusRomNo9L-Regu ;
+%/Times-Italic /NimbusRomNo9L-ReguItal ;
+%/Times-Bold /NimbusRomNo9L-Medi ;
+%/Times-BoldItalic /NimbusRomNo9L-MediItal ;
+
+%/Symbol /StandardSymL ;
+
+%/ZapfChancery-MediumItalic /URWChanceryL-MediItal ;
+
+%/ZapfDingbats /Dingbats ;
+
+%
+%
+% Type 1 fonts contributed to the X11R5 distribution.
+%
+
+% The following notice accompanied the Charter fonts.
+%
+% (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA.
+%
+% You are hereby granted permission under all Bitstream propriety rights
+% to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream
+% Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts
+% for any purpose and without restriction; provided, that this notice is
+% left intact on all copies of such fonts and that Bitstream's trademark
+% is acknowledged as shown below on all unmodified copies of the 4 Charter
+% Type 1 fonts.
+%
+% BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
+
+% The Bitstream Charter fonts have different names (CharterBT-
+% instead of Charter-), but Ghostscript doesn't care.
+/Charter-Roman (bchr.pfa) ;
+/Charter-Italic (bchri.pfa) ;
+/Charter-Bold (bchb.pfa) ;
+/Charter-BoldItalic (bchbi.pfa) ;
+
+% The following notice accompanied the Utopia font:
+%
+% Permission to use, reproduce, display and distribute the listed
+% typefaces is hereby granted, provided that the Adobe Copyright notice
+% appears in all whole and partial copies of the software and that the
+% following trademark symbol and attribution appear in all unmodified
+% copies of the software:
+%
+% Copyright (c) 1989 Adobe Systems Incorporated
+% Utopia (R)
+% Utopia is a registered trademark of Adobe Systems Incorporated
+%
+% The Adobe typefaces (Type 1 font program, bitmaps and Adobe Font
+% Metric files) donated are:
+%
+% Utopia Regular
+% Utopia Italic
+% Utopia Bold
+% Utopia Bold Italic
+
+% The original Utopia files are available with IRIX and DPS so need
+% for aliases, HJG.
+
+%/Utopia-Regular (putr.pfa) ;
+%/Utopia-Italic (putri.pfa) ;
+%/Utopia-Bold (putb.pfa) ;
+%/Utopia-BoldItalic (putbi.pfa) ;
+
+%
+%
+% Fonts contributed by URW GmbH for distribution under the GNU License.
+% The following notice accompanied these fonts:
+%
+% U004006T URW Grotesk 2031 Bold PostScript Type 1 Font Program
+% U003043T URW Antiqua 2051 Regular Condensed PostScript Type 1 Font Program
+%
+% Copyright (c) 1992 URW GmbH, Hamburg, Germany
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; wihtout even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+% See the GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%
+% Address:
+% URW GmbH
+% PC Support
+% Harksheider Strasse 102
+% 2000 Hamburg 65
+% Germany
+% Phone: +49 40 60 60 50 (Reception)
+% Phone: +49 40 60 60 52 30 (PC Support)
+% Fax : +49 40 60 60 52 52
+%
+
+/URWAntiquaT-RegularCondensed (u003043t.gsf) ;
+/URWGroteskT-Bold (u004006t.gsf) ;
+
+%
+%
+% Shareware Kana fonts. These are subject to the following notice:
+%
+% These copyrighted fonts were developed by Kevin Hartig. Permission is
+% granted to freely distribute them in entirety along with this statement.
+% This is shareware. If you decide to use these fonts please contribute
+% $10 US to help support further freeware and shareware software development.
+% Questions and comments may be sent to:
+%
+% hartig@fsl.noaa.gov
+% khartig@nyx.cs.du.edu
+%
+% Kevin Hartig
+% 1126 Collyer Street
+% Longmont, CO 80501 USA
+%
+% copyright 1993.
+
+% Hiragana and Katakana fonts. The character names are inappropriate,
+% and the encoding is probably not related to any known standard.
+
+/Calligraphic-Hiragana (fhirw.gsf) ;
+/Calligraphic-Katakana (fkarw.gsf) ;
+
+%
+%
+% Public-domain fonts. These have no copyright, and are of unknown quality.
+
+% Cyrillic fonts. The character names are inappropriate,
+% and the encoding is probably not related to any known standard.
+
+/Shareware-Cyrillic-Regular (fcyr.gsf) ;
+/Shareware-Cyrillic-Italic (fcyri.gsf) ;
+
+% Aliases
+/Cyrillic /Cyrillic-Regular ;
+/Cyrillic-Regular /Shareware-Cyrillic-Regular ;
+/Cyrillic-Italic /Shareware-Cyrillic-Italic ;
+
+%
+%
+% Fonts converted from Hershey outlines. These are constructed and
+% maintained manually. These are also in the public domain.
+%
+% The suggested UniqueID's and filenames are constructed differently for
+% these than for the ones above, because of the strange way that the Hershey
+% fonts were constructed. The scheme for these looks like:
+%
+% 42TTXY0
+%
+% TT = typeface, X = ``class'', Y = variation
+%
+% The typeface names and numbers are listed in fonts.mak.
+%
+% class:
+% 0 = normal = r
+% 1 = simplex = s
+% 2 = complex = c
+% 3 = triplex = t
+% 4 = duplex = d
+%
+% variation:
+% 0 = normal (omitted)
+% 1 = oblique = o
+% 2 = italic = i
+% 3 = bold = b
+% 4 = bold oblique = bo
+% 5 = bold italic = bi
+%
+
+% Fonts created by Thomas Wolff <wolff@inf.fu-berlin.de>, by adding
+% accents, accented characters, and various other non-alphabetics
+% to the original Hershey fonts. These are "freeware", not to be sold.
+
+/Hershey-Gothic-English (hrger.pfa) ; % 5066533
+/Hershey-Gothic-German (hrgrr.pfa) ;
+/Hershey-Gothic-Italian (hritr.pfa) ;
+
+/Hershey-Plain-Duplex (hrpld.pfa) ;
+/Hershey-Plain-Duplex-Italic (hrpldi.pfa) ;
+/Hershey-Plain-Triplex (hrplt.pfa) ;
+/Hershey-Plain-Triplex-Italic (hrplti.pfa) ;
+
+/Hershey-Script-Complex (hrscc.pfa) ;
+/Hershey-Script-Simplex (hrscs.pfa) ; % 5066541
+
+% Fonts created algorithmically from the above.
+
+/Hershey-Gothic-English-Bold (hrgerb.gsf) ; % 5066542
+/Hershey-Gothic-English-Oblique (hrgero.gsf) ;
+/Hershey-Gothic-English-SemiBold (hrgerd.gsf) ;
+/Hershey-Gothic-German-Bold (hrgrrb.gsf) ;
+/Hershey-Gothic-German-Oblique (hrgrro.gsf) ;
+/Hershey-Gothic-Italian-Bold (hritrb.gsf) ;
+/Hershey-Gothic-Italian-Oblique (hritro.gsf) ;
+
+/Hershey-Plain-Duplex-Bold (hrpldb.gsf) ;
+/Hershey-Plain-Duplex-Bold-Italic (hrpldbi.gsf) ;
+/Hershey-Plain-Triplex-Bold (hrpltb.gsf) ;
+/Hershey-Plain-Triplex-Bold-Italic (hrpltbi.gsf) ;
+
+/Hershey-Script-Complex-Bold (hrsccb.gsf) ;
+/Hershey-Script-Complex-Oblique (hrscco.gsf) ;
+/Hershey-Script-Simplex-Bold (hrscsb.gsf) ;
+/Hershey-Script-Simplex-Oblique (hrscso.gsf) ; % 5066556
+
+% Fonts consisting only of characters from the original Hershey
+% distribution. These are Type 3 fonts.
+
+/Hershey-Greek-Complex (hrgkc.gsf) ; % 5066557
+/Hershey-Greek-Simplex (hrgks.gsf) ;
+
+/Hershey-Plain (hrplr.gsf) ;
+/Hershey-Plain-Simplex (hrpls.gsf) ; % 5066560
+
+% Fonts created algorithmically from the above.
+
+/Hershey-Plain-Bold (hrplrb.gsf) ; % 5066561
+/Hershey-Plain-Bold-Oblique (hrplrbo.gsf) ;
+/Hershey-Plain-Oblique (hrplro.gsf) ;
+/Hershey-Plain-Simplex-Bold (hrplsb.gsf) ;
+/Hershey-Plain-Simplex-Bold-Oblique (hrplsbo.gsf) ;
+/Hershey-Plain-Simplex-Oblique (hrplso.gsf) ; % 5066566
+
+% This font, and only this font among the Hershey fonts, uses
+% the SymbolEncoding.
+
+/Hershey-Symbol (hrsyr.gsf) ; % 5066567
diff --git a/lib/Fontmap.Sol b/lib/Fontmap.Sol
new file mode 100644
index 00000000..453031a6
--- /dev/null
+++ b/lib/Fontmap.Sol
@@ -0,0 +1,485 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Fontmap.Solaris - Ghostscript Fontmap for Solaris 2.3 and above
+% ===============================================================
+%
+% The Solaris 2.3 (and above) operating system from Sun Microsystems comes with
+% Display Postscript (DPS), including certain Type1 and Type3 PostScript fonts.
+% Using these fonts instead of the default Ghostscript fonts greatly improves
+% the visual quality of Ghostscript rendered documents, especially at larger
+% font sizes. You should definately use these fonts if you have Solaris 2.3 or
+% above.
+%
+% To use the Solaris 2 DPS fonts, simply copy this file (Fontmap.Solaris) to
+%
+% /usr/local/lib/Ghostscript/VERSION/Fontmap
+% (where VERSION is the version number of Ghostscript, eg: 3.33)
+%
+% and set the environment variable GS_LIB as follows:
+%
+% GS_LIB=/usr/openwin/lib/X11/fonts/Type1:/usr/openwin/lib/X11/fonts/Type3
+% export GS_LIB
+%
+% You can use /usr/openwin/lib/fonts/Type1/outline instead if you like, it
+% makes no difference (the files in /usr/openwin/lib/fonts/Type1 are symlinks
+% into /usr/openwin/lib/fonts/Type1/outline).
+%
+% Instead of setting GS_LIB, you could add the above directories to
+% GS_LIB_DEFAULT in your makefile before building Ghostscript.
+%
+%
+% IMPORTANT NOTE
+% ==============
+%
+% Note that simply setting GS_FONTPATH may not work, because for some reason
+% some versions of gs can't seem to find any fonts in
+% /usr/openwin/lib/X11/fonts/Type1/outline.
+% It says: "15 files, 15 scanned, 0 new fonts".
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% ----------------------------------------------------------------
+
+% This file is a catalog of fonts known to Ghostscript. Any font
+% that is to be loaded automatically when named must be in this catalog,
+% except for fonts that Ghostscript finds automatically in directories
+% named in the GS_FONTPATH environment variable.
+
+% Each font has an entry consisting of three items:
+%
+% - The name by which the font is known inside Ghostscript
+% (a Ghostscript name preceded by a `/', or a string enclosed
+% in parentheses). This is used to find the file from which
+% a font of a given name should be loaded.
+%
+% - Information depending on whether this is a real font or a
+% font alias:
+%
+% - For real fonts, the name of the Ghostscript font
+% file (a Ghostscript string, enclosed in parentheses).
+% The filename should include the extension, which (by
+% convention) is `.gsf'. `.pfa' and `.pfb' files are
+% also usable as fonts for Ghostscript.
+%
+% - For font aliases, the name of the font which should
+% be used when this one is requested, preceded by a
+% `/'. See the entry for Charter below for an example.
+% Note that an alias name cannot be enclosed in parentheses.
+%
+% - At least one space or tab, and a terminating semicolon.
+
+% Because of limitations in the MS-DOS environment, Ghostscript font
+% file names must be no more than 8 characters long, must consist only
+% of LOWER CASE letters, digits, and underscores, and must start with a
+% letter. Font names, on the other hand, need only obey the syntax of
+% names in the Ghostscript language, which is much more liberal.
+
+% The following table is actually a Ghostscript data structure.
+% If you add new entries, be sure to copy the punctuation accurately;
+% in particular, you must leave at least one space or tab between each
+% field in the entry. Also, please read fonts.doc for important information
+% about font names.
+
+% Note that .pfa and .pfb fonts are compatible with Adobe Type Manager
+% and other programs that don't include full PostScript interpreters,
+% as well as with PostScript interpreters; .gsf fonts are compatible with
+% PostScript interpreters, but not with ATM or similar programs.
+
+%
+%
+% Fonts contributed by:
+% URW++ Design and Development Incorporated
+% Poppenbuetteler Bogen 29A
+% D-22399 Hamburg
+% Germany
+% tel. +49 (40) 60 60 50
+% fax +49 (40) 60 60 51 11
+% http://www.urwpp.de
+% for distribution under the GNU License and Aladdin Free Public License.
+% See the notice at the head of this Fontmap file for licensing terms.
+% Each of these fonts is individually covered by the license:
+% for licensing purposes, they are not "part of" any larger entity.
+% The following notice applies to these fonts:
+%
+% Copyright URW Software, Copyright 1994 by URW.
+%
+
+% Actual fonts
+
+/URWBookmanL-DemiBold (b018015l.pfb) ;
+/URWBookmanL-DemiBoldItal (b018035l.pfb) ;
+/URWBookmanL-Ligh (b018012l.pfb) ;
+/URWBookmanL-LighItal (b018032l.pfb) ;
+
+/NimbusMonL-Regu (n022003l.pfb) ;
+/NimbusMonL-ReguObli (n022023l.pfb) ;
+/NimbusMonL-Bold (n022004l.pfb) ;
+/NimbusMonL-BoldObli (n022024l.pfb) ;
+
+/URWGothicL-Book (a010013l.pfb) ;
+/URWGothicL-BookObli (a010033l.pfb) ;
+/URWGothicL-Demi (a010015l.pfb) ;
+/URWGothicL-DemiObli (a010035l.pfb) ;
+
+/NimbusSanL-Regu (n019003l.pfb) ;
+/NimbusSanL-ReguItal (n019023l.pfb) ;
+/NimbusSanL-Bold (n019004l.pfb) ;
+/NimbusSanL-BoldItal (n019024l.pfb) ;
+
+/NimbusSanL-ReguCond (n019043l.pfb) ;
+/NimbusSanL-ReguCondItal (n019063l.pfb) ;
+/NimbusSanL-BoldCond (n019044l.pfb) ;
+/NimbusSanL-BoldCondItal (n019064l.pfb) ;
+
+/URWPalladioL-Roma (p052003l.pfb) ;
+/URWPalladioL-Ital (p052023l.pfb) ;
+/URWPalladioL-Bold (p052004l.pfb) ;
+/URWPalladioL-BoldItal (p052024l.pfb) ;
+
+/CenturySchL-Roma (c059013l.pfb) ;
+/CenturySchL-Ital (c059033l.pfb) ;
+/CenturySchL-Bold (c059016l.pfb) ;
+/CenturySchL-BoldItal (c059036l.pfb) ;
+
+/NimbusRomNo9L-Regu (n021003l.pfb) ;
+/NimbusRomNo9L-ReguItal (n021023l.pfb) ;
+/NimbusRomNo9L-Medi (n021004l.pfb) ;
+/NimbusRomNo9L-MediItal (n021024l.pfb) ;
+
+/StandardSymL (s050000l.pfb) ;
+
+/URWChanceryL-MediItal (z003034l.pfb) ;
+
+/Dingbats (d050000l.pfb) ;
+
+% Aliases
+
+/Bookman-Demi /URWBookmanL-DemiBold ;
+/Bookman-DemiItalic /URWBookmanL-DemiBoldItal ;
+/Bookman-Light /URWBookmanL-Ligh ;
+/Bookman-LightItalic /URWBookmanL-LighItal ;
+
+/Courier /NimbusMonL-Regu ;
+/Courier-Oblique /NimbusMonL-ReguObli ;
+/Courier-Bold /NimbusMonL-Bold ;
+/Courier-BoldOblique /NimbusMonL-BoldObli ;
+
+/AvantGarde-Book /URWGothicL-Book ;
+/AvantGarde-BookOblique /URWGothicL-BookObli ;
+/AvantGarde-Demi /URWGothicL-Demi ;
+/AvantGarde-DemiOblique /URWGothicL-DemiObli ;
+
+% Solaris 2 DPS has Helvetica as a Type1 font.
+%/Helvetica /NimbusSanL-Regu ;
+%/Helvetica-Oblique /NimbusSanL-ReguItal ;
+%/Helvetica-Bold /NimbusSanL-Bold ;
+%/Helvetica-BoldOblique /NimbusSanL-BoldItal ;
+
+/Helvetica-Narrow /NimbusSanL-ReguCond ;
+/Helvetica-Narrow-Oblique /NimbusSanL-ReguCondItal ;
+/Helvetica-Narrow-Bold /NimbusSanL-BoldCond ;
+/Helvetica-Narrow-BoldOblique /NimbusSanL-BoldCondItal ;
+
+/Palatino-Roman /URWPalladioL-Roma ;
+/Palatino-Italic /URWPalladioL-Ital ;
+/Palatino-Bold /URWPalladioL-Bold ;
+/Palatino-BoldItalic /URWPalladioL-BoldItal ;
+
+/NewCenturySchlbk-Roman /CenturySchL-Roma ;
+/NewCenturySchlbk-Italic /CenturySchL-Ital ;
+/NewCenturySchlbk-Bold /CenturySchL-Bold ;
+/NewCenturySchlbk-BoldItalic /CenturySchL-BoldItal ;
+
+% Solaris 2 DPS has Times as a Type1 font.
+%/Times-Roman /NimbusRomNo9L-Regu ;
+%/Times-Italic /NimbusRomNo9L-ReguItal ;
+%/Times-Bold /NimbusRomNo9L-Medi ;
+%/Times-BoldItalic /NimbusRomNo9L-MediItal ;
+
+% Solaris 2 DPS has Symbol as a Type1 font.
+%/Symbol /StandardSymL ;
+
+/ZapfChancery-MediumItalic /URWChanceryL-MediItal ;
+
+/ZapfDingbats /Dingbats ;
+
+%
+%
+% Type 1 fonts contributed to the X11R5 distribution.
+%
+
+% The following notice accompanied the Charter fonts.
+%
+% (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA.
+%
+% You are hereby granted permission under all Bitstream propriety rights
+% to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream
+% Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts
+% for any purpose and without restriction; provided, that this notice is
+% left intact on all copies of such fonts and that Bitstream's trademark
+% is acknowledged as shown below on all unmodified copies of the 4 Charter
+% Type 1 fonts.
+%
+% BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
+
+/CharterBT-Roman (bchr.pfa) ;
+/CharterBT-Italic (bchri.pfa) ;
+/CharterBT-Bold (bchb.pfa) ;
+/CharterBT-BoldItalic (bchbi.pfa) ;
+
+% Aliases
+
+/Charter-Roman /CharterBT-Roman ;
+/Charter-Italic /CharterBT-Italic ;
+/Charter-Bold /CharterBT-Bold ;
+/Charter-BoldItalic /CharterBT-BoldItalic ;
+
+% The following notice accompanied the Utopia font:
+%
+% Permission to use, reproduce, display and distribute the listed
+% typefaces is hereby granted, provided that the Adobe Copyright notice
+% appears in all whole and partial copies of the software and that the
+% following trademark symbol and attribution appear in all unmodified
+% copies of the software:
+%
+% Copyright (c) 1989 Adobe Systems Incorporated
+% Utopia (R)
+% Utopia is a registered trademark of Adobe Systems Incorporated
+%
+% The Adobe typefaces (Type 1 font program, bitmaps and Adobe Font
+% Metric files) donated are:
+%
+% Utopia Regular
+% Utopia Italic
+% Utopia Bold
+% Utopia Bold Italic
+
+/Utopia-Regular (putr.pfa) ;
+/Utopia-Italic (putri.pfa) ;
+/Utopia-Bold (putb.pfa) ;
+/Utopia-BoldItalic (putbi.pfa) ;
+
+%
+%
+% Fonts contributed by URW GmbH for distribution under the GNU License.
+% The following notice accompanied these fonts:
+%
+% U004006T URW Grotesk 2031 Bold PostScript Type 1 Font Program
+% U003043T URW Antiqua 2051 Regular Condensed PostScript Type 1 Font Program
+%
+% Copyright (c) 1992 URW GmbH, Hamburg, Germany
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; wihtout even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+% See the GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 U.S.A.
+%
+% Address:
+% URW GmbH
+% PC Support
+% Harksheider Strasse 102
+% 2000 Hamburg 65
+% Germany
+% Phone: +49 40 60 60 50 (Reception)
+% Phone: +49 40 60 60 52 30 (PC Support)
+% Fax : +49 40 60 60 52 52
+%
+
+/URWAntiquaT-RegularCondensed (u003043t.gsf) ;
+/URWGroteskT-Bold (u004006t.gsf) ;
+
+%
+%
+% Shareware Kana fonts. These are subject to the following notice:
+%
+% These copyrighted fonts were developed by Kevin Hartig. Permission is
+% granted to freely distribute them in entirety along with this statement.
+% This is shareware. If you decide to use these fonts please contribute
+% $10 US to help support further freeware and shareware software development.
+% Questions and comments may be sent to:
+%
+% hartig@fsl.noaa.gov
+% khartig@nyx.cs.du.edu
+%
+% Kevin Hartig
+% 1126 Collyer Street
+% Longmont, CO 80501 USA
+%
+% copyright 1993.
+
+% Hiragana and Katakana fonts. The character names are inappropriate,
+% and the encoding is probably not related to any known standard.
+
+/Calligraphic-Hiragana (fhirw.gsf) ;
+/Calligraphic-Katakana (fkarw.gsf) ;
+
+%
+%
+% Public-domain fonts. These have no copyright, and are of unknown quality.
+
+% Cyrillic fonts. The character names are inappropriate,
+% and the encoding is probably not related to any known standard.
+
+/Shareware-Cyrillic-Regular (fcyr.gsf) ;
+/Shareware-Cyrillic-Italic (fcyri.gsf) ;
+
+% Aliases
+/Cyrillic /Cyrillic-Regular ;
+/Cyrillic-Regular /Shareware-Cyrillic-Regular ;
+/Cyrillic-Italic /Shareware-Cyrillic-Italic ;
+
+%
+%
+% Fonts converted from Hershey outlines. These are constructed and
+% maintained manually. These are also in the public domain.
+%
+% The suggested UniqueID's and filenames are constructed differently for
+% these than for the ones above, because of the strange way that the Hershey
+% fonts were constructed. The scheme for these looks like:
+%
+% 42TTXY0
+%
+% TT = typeface, X = ``class'', Y = variation
+%
+% The typeface names and numbers are listed in fonts.mak.
+%
+% class:
+% 0 = normal = r
+% 1 = simplex = s
+% 2 = complex = c
+% 3 = triplex = t
+% 4 = duplex = d
+%
+% variation:
+% 0 = normal (omitted)
+% 1 = oblique = o
+% 2 = italic = i
+% 3 = bold = b
+% 4 = bold oblique = bo
+% 5 = bold italic = bi
+%
+
+% Fonts created by Thomas Wolff <wolff@inf.fu-berlin.de>, by adding
+% accents, accented characters, and various other non-alphabetics
+% to the original Hershey fonts. These are "freeware", not to be sold.
+
+/Hershey-Gothic-English (hrger.pfa) ; % 5066533
+/Hershey-Gothic-German (hrgrr.pfa) ;
+/Hershey-Gothic-Italian (hritr.pfa) ;
+
+/Hershey-Plain-Duplex (hrpld.pfa) ;
+/Hershey-Plain-Duplex-Italic (hrpldi.pfa) ;
+/Hershey-Plain-Triplex (hrplt.pfa) ;
+/Hershey-Plain-Triplex-Italic (hrplti.pfa) ;
+
+/Hershey-Script-Complex (hrscc.pfa) ;
+/Hershey-Script-Simplex (hrscs.pfa) ; % 5066541
+
+% Fonts created algorithmically from the above.
+
+/Hershey-Gothic-English-Bold (hrgerb.gsf) ; % 5066542
+/Hershey-Gothic-English-Oblique (hrgero.gsf) ;
+/Hershey-Gothic-English-SemiBold (hrgerd.gsf) ;
+/Hershey-Gothic-German-Bold (hrgrrb.gsf) ;
+/Hershey-Gothic-German-Oblique (hrgrro.gsf) ;
+/Hershey-Gothic-Italian-Bold (hritrb.gsf) ;
+/Hershey-Gothic-Italian-Oblique (hritro.gsf) ;
+
+/Hershey-Plain-Duplex-Bold (hrpldb.gsf) ;
+/Hershey-Plain-Duplex-Bold-Italic (hrpldbi.gsf) ;
+/Hershey-Plain-Triplex-Bold (hrpltb.gsf) ;
+/Hershey-Plain-Triplex-Bold-Italic (hrpltbi.gsf) ;
+
+/Hershey-Script-Complex-Bold (hrsccb.gsf) ;
+/Hershey-Script-Complex-Oblique (hrscco.gsf) ;
+/Hershey-Script-Simplex-Bold (hrscsb.gsf) ;
+/Hershey-Script-Simplex-Oblique (hrscso.gsf) ; % 5066556
+
+% Fonts consisting only of characters from the original Hershey
+% distribution. These are Type 3 fonts.
+
+/Hershey-Greek-Complex (hrgkc.gsf) ; % 5066557
+/Hershey-Greek-Simplex (hrgks.gsf) ;
+
+/Hershey-Plain (hrplr.gsf) ;
+/Hershey-Plain-Simplex (hrpls.gsf) ; % 5066560
+
+% Fonts created algorithmically from the above.
+
+/Hershey-Plain-Bold (hrplrb.gsf) ; % 5066561
+/Hershey-Plain-Bold-Oblique (hrplrbo.gsf) ;
+/Hershey-Plain-Oblique (hrplro.gsf) ;
+/Hershey-Plain-Simplex-Bold (hrplsb.gsf) ;
+/Hershey-Plain-Simplex-Bold-Oblique (hrplsbo.gsf) ;
+/Hershey-Plain-Simplex-Oblique (hrplso.gsf) ; % 5066566
+
+% This font, and only this font among the Hershey fonts, uses
+% the SymbolEncoding.
+
+/Hershey-Symbol (hrsyr.gsf) ; % 5066567
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Solaris 2 Display PostScript Type1 and Type3 fonts...
+%
+
+/Helvetica (Helvetica.pfa) ;
+/Helvetica-Bold (Helvetica-Bold.pfa) ;
+/Helvetica-BoldOblique (Helvetica-BoldOblique.pfa) ;
+/Helvetica-Oblique (Helvetica-Oblique.pfa) ;
+
+/Symbol (Symbol.pfa) ;
+/SymbolSet /Symbol ;
+
+/Times-Bold (Times-Bold.pfa) ;
+/Times-BoldItalic (Times-BoldItalic.pfa) ;
+/Times-Italic (Times-Italic.pfa) ;
+/Times-Roman (Times-Roman.pfa) ;
+/TimesNewRoman /Times-Roman ;
+/TimesNewRoman-Bold /Times-Bold ;
+/TimesNewRoman-BoldItalic /Times-BoldItalic ;
+/TimesNewRoman-Italic /Times-Italic ;
+
+/Dijkstra (Dijkstra.ps) ;
+
+/Hershey-Cyrillic (HrshCyr.ps) ;
+
+/Hershey-Gothic (HrshGoth.ps) ;
+
+/Hershey-Greek (HrshGrk.ps) ;
+/Hershey-Greek-Narrow (HrshGrkN.ps) ;
+/Hershey-Greekp (HrshGrkp.ps) ;
+
+/Hershey-Italic (HrshI.ps) ;
+/Hershey-Italic-Narrow (HrshIN.ps) ;
+/Hershey-Italic-Wide (HrshIW.ps) ;
+/Hershey-Roman (HrshRom.ps) ;
+/Hershey-Roman-Narrow (HrshRomN.ps) ;
+/Hershey-Roman-Wide (HrshRomW.ps) ;
+/Hershey-Romand (HrshRomd.ps) ;
+/Hershey-Romanp (HrshRomp.ps) ;
+
+/Hershey-Script (HrshScr.ps) ;
+/Hershey-Script-Narrow (HrshScrN.ps) ;
diff --git a/lib/Fontmap.URW-136.T1 b/lib/Fontmap.URW-136.T1
new file mode 100644
index 00000000..0d35cf28
--- /dev/null
+++ b/lib/Fontmap.URW-136.T1
@@ -0,0 +1,580 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% $Id: Fontmap.GS 8978 2008-08-12 23:44:53Z ray $
+% Fontmap - standard font catalog for Ghostscript.
+
+% ----------------------------------------------------------------
+
+% This file is a catalog of fonts known to Ghostscript. Any font
+% that is to be loaded automatically when named must be in this catalog,
+% except for fonts that Ghostscript finds automatically in directories
+% named in the GS_FONTPATH environment variable.
+
+% Each font has an entry consisting of three items:
+%
+% - The name by which the font is known inside Ghostscript
+% (a Ghostscript name preceded by a `/', or a string enclosed
+% in parentheses). This is used to find the file from which
+% a font of a given name should be loaded.
+%
+% - Information depending on whether this is a real font or a
+% font alias:
+%
+% - For real fonts, the name of the Ghostscript font
+% file (a Ghostscript string, enclosed in parentheses).
+% The filename should include the extension, which (by
+% convention) is `.gsf'. `.pfa' and `.pfb' files are
+% also usable as fonts for Ghostscript.
+%
+% - For font aliases, the name of the font which should
+% be used when this one is requested, preceded by a
+% `/'. See the entry for Charter below for an example.
+% Note that an alias name cannot be enclosed in parentheses.
+%
+% - At least one space or tab, and a terminating semicolon.
+
+% The following table is executed as a PostScript file.
+% If you add new entries, be sure to copy the punctuation accurately;
+% in particular, you must leave at least one space or tab between each
+% field in the entry. Also, please read fonts.doc for important information
+% about font names.
+
+% PDF interpreter evaluates hexadecimal escapes in PDF font names before
+% looking up the font. When the resulting name cannot be represented using
+% PostScript name syntax, the string can be used instead of the name.
+
+% Note that .pfa and .pfb fonts are compatible with Adobe Type Manager
+% and other programs that don't include full PostScript interpreters,
+% as well as with PostScript interpreters; .gsf fonts are compatible with
+% PostScript interpreters, but not with ATM or similar programs.
+
+%
+
+%
+% The 136 font set from URW in .PFB (Printer Font Binary) format
+%
+
+/AntiqueOli-Reg (a008003i.pfb) ;
+/AntiqueOli-Bol (a008006i.pfb) ;
+/AntiqueOli-Com (a008007i.pfb) ;
+/AntiqueOli-RegIta (a008023i.pfb) ;
+/URWGothic-Boo (a010013l.pfb) ;
+/URWGothic-Dem (a010015l.pfb) ;
+/URWGothic-BooObl (a010033l.pfb) ;
+/URWGothic-DemObl (a010035l.pfb) ;
+/A028-Lig (a028012i.pfb) ;
+/A028-Med (a028014i.pfb) ;
+/A028-MedIta (a028034i.pfb) ;
+/AtramentURW (a096003i.pfb) ;
+/AlonURW (a097003i.pfb) ;
+/AfficheURW (a098003i.pfb) ;
+/BaskervilleOrnaments (b004000i.pfb) ;
+/BaskervilleURW-Reg (b004003i.pfb) ;
+/BaskervilleURW-Bla (b004006i.pfb) ;
+/BaskervilleURW-Ita (b004023i.pfb) ;
+/BaskervilleURW-BlaIta (b004026i.pfb) ;
+/BookmanURW-Lig (b018012l.pfb) ;
+/BookmanURW-DemBol (b018015l.pfb) ;
+/BookmanURW-LigIta (b018032l.pfb) ;
+/BookmanURW-DemBolIta (b018035l.pfb) ;
+/BodoniAnt-Reg (b044003i.pfb) ;
+/BodoniAnt-Bol (b044004i.pfb) ;
+/BodoniAnt-Ita (b044023i.pfb) ;
+/BodoniAnt-BolIta (b044024i.pfb) ;
+/Bodoni-Ult (b049020i.pfb) ;
+/Bodoni-Com (b049132i.pfb) ;
+/Clarendon-Lig (c011002i.pfb) ;
+/Clarendon-Med (c011004i.pfb) ;
+/Clarendon-Bol (c011007i.pfb) ;
+/Cooper-Bla (c018016i.pfb) ;
+/Cooper-BlaIta (c018036i.pfb) ;
+/Copperplate-Med (c041014i.pfb) ;
+/Copperplate-Bol (c041018i.pfb) ;
+/CenturySchURW-Rom (c059013l.pfb) ;
+/CenturySchURW-Bol (c059016l.pfb) ;
+/CenturySchURW-Ita (c059033l.pfb) ;
+/CenturySchURW-BolIta (c059036l.pfb) ;
+/CoronetURW (c093000i.pfb) ;
+/Dingbats (d050000l.pfb) ;
+/Eurostile-Reg (e004003i.pfb) ;
+/Eurostile-Bol (e004006i.pfb) ;
+/Eurostile-Ext (e004083i.pfb) ;
+/Eurostile-BolExt (e004086i.pfb) ;
+/G032-Lig (g032012i.pfb) ;
+/G032-Reg (g032013i.pfb) ;
+/G032-Bol (g032016i.pfb) ;
+/G032-ExtBol (g032017i.pfb) ;
+/G032-LigIta (g032032i.pfb) ;
+/G032-Ita (g032033i.pfb) ;
+/G032-BolIta (g032036i.pfb) ;
+/G032Con-Reg (g032053i.pfb) ;
+/G032Con-Bol (g032056i.pfb) ;
+/GaramondURW-Reg (g043003i.pfb) ;
+/GaramondURW-Dem (g043004i.pfb) ;
+/GaramondURW-Ita (g043023i.pfb) ;
+/GaramondURW-DemIta (g043024i.pfb) ;
+/Goudy-Reg (g047013i.pfb) ;
+/Goudy-Med (g047014i.pfb) ;
+/Goudy-Bol (g047016i.pfb) ;
+/Goudy-Ita (g047033i.pfb) ;
+/Goudy-MedIta (g047034i.pfb) ;
+/Joanna-Reg (j011013i.pfb) ;
+/Joanna-Bol (j011016i.pfb) ;
+/Joanna-Ita (j011033i.pfb) ;
+/Joanna-BolIta (j011036i.pfb) ;
+/Lubalin-Boo (l005013i.pfb) ;
+/Lubalin-Dem (l005015i.pfb) ;
+/Lubalin-BooObl (l005033i.pfb) ;
+/Lubalin-DemObl (l005035i.pfb) ;
+/LetterGot-Reg (l021003i.pfb) ;
+/LetterGot-Bol (l021004i.pfb) ;
+/LetterGot-Ita (l021023i.pfb) ;
+/LetterGot-BolIta (l021024i.pfb) ;
+/MonaLis (m034000i.pfb) ;
+/Mauritius (m048000i.pfb) ;
+/NimbusSanNo2-Reg (n019003i.pfb) ;
+/NimbusSan-Reg (n019003l.pfb) ;
+/NimbusSan-Bol (n019004l.pfb) ;
+/NimbusSanNo2-Bol (n019004i.pfb) ;
+/NimbusSanNo2-BolIta (n019023i.pfb) ;
+/NimbusSan-Ita (n019023l.pfb) ;
+/NimbusSanNo2-Ita (n019024i.pfb) ;
+/NimbusSan-BolIta (n019024l.pfb) ;
+/NimbusSanCon-Reg (n019043i.pfb) ;
+/NimbusSanNar-Reg (n019043l.pfb) ;
+/NimbusSanNar-Bol (n019044l.pfb) ;
+/NimbusSanCon-Bol (n019045i.pfb) ;
+/NimbusSanCon-Ita (n019063i.pfb) ;
+/NimbusSanNar-Ita (n019063l.pfb) ;
+/NimbusSanNar-BolIta (n019064l.pfb) ;
+%
+% This PFB font is not legal as it does not contain a /.notdef glyph
+%/NimbusSanCon-BolIta (n019065i.pfb) ;
+%
+/NimbusRomNo9-Reg (n021003i.pfb) ;
+/NimbusRom-Reg (n021003l.pfb) ;
+/NimbusRomNo9-Bol (n021004i.pfb) ;
+/NimbusRom-Med (n021004l.pfb) ;
+/NimbusRomNo9-Ita (n021023i.pfb) ;
+/NimbusRom-Ita (n021023l.pfb) ;
+/NimbusRomNo9-BolIta (n021024i.pfb) ;
+/NimbusRom-MedIta (n021024l.pfb) ;
+/NimbusMon-Reg (n022003l.pfb) ;
+/NimbusMon-Bol (n022004l.pfb) ;
+/NimbusMon-Obl (n022023l.pfb) ;
+/NimbusMon-BolObl (n022024l.pfb) ;
+/NimbusTypewriter-Regular (n056003m.pfb) ;
+/NimbusRomanScreen-Regular (n057003i.pfb) ;
+/NimbusGUI-Regular (n058003i.pfb) ;
+/NimbusSansScreen-Regular (n059003i.pfb) ;
+/ClassicoURW-Reg (o004003i.pfb) ;
+/ClassicoURW-Bol (o004004i.pfb) ;
+/ClassicoURW-Ita (o004023i.pfb) ;
+/ClassicoURW-BolIta (o004024i.pfb) ;
+/PalladioURW-Rom (p052003l.pfb) ;
+/PalladioURW-Bol (p052004l.pfb) ;
+/PalladioURW-Ita (p052023l.pfb) ;
+/PalladioURW-BolIta (p052024l.pfb) ;
+/StandardSymL (s050000l.pfb) ;
+/URWSignsAndSymD (s052000d.pfb) ;
+/URWClassicSan-Lig (u001002i.pfb) ;
+/URWClassicSan-Reg (u001003i.pfb) ;
+/URWClassicSan-Bol (u001004i.pfb) ;
+/URWClassicSan-LigIta (u001022i.pfb) ;
+/URWClassicSan-Ita (u001023i.pfb) ;
+/URWClassicSan-BolIta (u001024i.pfb) ;
+/URWClassicSanCon-Reg (u001043i.pfb) ;
+/URWClassicSanCon-Bol (u001044i.pfb) ;
+/URWClassicSanCon-RegIta (u001063i.pfb) ;
+/URWClassicSanCon-BolIta (u001064i.pfb) ;
+/URWClassicSanExt-Reg (u001083i.pfb) ;
+/URWClassicSanExt-Bol (u001085i.pfb) ;
+/URWClassicSanExt-Ita (u001103i.pfb) ;
+/URWClassicSanExt-BolIta (u001105i.pfb) ;
+/UngerCha (u022003i.pfb) ;
+/ChanceryURW-MedIta (z003034l.pfb) ;
+
+% Aliases
+% These map the Adobe font names to the closest match in the URW font set
+%
+/AlbertusMT-Light /A028-Lig ;
+/AlbertusMT /A028-Med ;
+/AlbertusMT-Italic /A028-MedIta ;
+/AntiqueOlive-Roman /AntiqueOli-Reg ;
+/AntiqueOlive-Bold /AntiqueOli-Bol ;
+/AntiqueOlive-Compact /AntiqueOli-Com ;
+/AntiqueOlive-Italic /AntiqueOli-RegIta ;
+/Apple-Chancery /UngerCha ;
+/ArialMT /NimbusSanNo2-Reg ;
+%
+% The FontName entries for the next two fonts are reversed
+%
+/Arial-ItalicMT /NimbusSanNo2-BolIta ;
+/Arial-BoldItalicMT /NimbusSanNo2-Ita ;
+/Arial-BoldMT /NimbusSanNo2-Bol ;
+/AvantGarde-Book /URWGothic-Boo ;
+/AvantGarde-Demi /URWGothic-Dem ;
+/AvantGarde-BookOblique /URWGothic-BooObl ;
+/AvantGarde-DemiOblique /URWGothic-DemObl ;
+/Bodoni /BodoniAnt-Reg ;
+/Bodoni-Bold /BodoniAnt-Bol ;
+/Bodoni-Italic /BodoniAnt-Ita ;
+/Bodoni-BoldItalic /BodoniAnt-BolIta ;
+/Bodoni-Poster /Bodoni-Ult ;
+/Bodoni-PosterCompressed /Bodoni-Com ;
+/Bookman-Light /BookmanURW-Lig ;
+/Bookman-Demi /BookmanURW-DemBol ;
+/Bookman-LightItalic /BookmanURW-LigIta ;
+/Bookman-DemiItalic /BookmanURW-DemBolIta ;
+/Carta /URWSignsAndSymD ;
+/Chicago /NimbusGUI-Regular ;
+/Clarendon-Light /Clarendon-Lig ;
+/Clarendon /Clarendon-Med ;
+/Clarendon-Bold /Clarendon-Bol ;
+/CooperBlack /Cooper-Bla ;
+/CooperBlack-Italic /Cooper-BlaIta ;
+/Copperplate-ThirtyTwoBC /Copperplate-Med ;
+/Copperplate-ThirtyThreeBC /Copperplate-Bol ;
+/Coronet-Regular /CoronetURW ;
+/Courier /NimbusMon-Reg ;
+/Courier-BoldOblique /NimbusMon-BolObl ;
+/Courier-Oblique /NimbusMon-Obl ;
+/Courier-Bold /NimbusMon-Bol ;
+/Eurostile /Eurostile-Reg ;
+/Eurostile-Bold /Eurostile-Bol ;
+/Eurostile-ExtendedTwo /Eurostile-Ext ;
+/Eurostile-BoldExtendedTwo /Eurostile-BolExt ;
+/Geneva /NimbusSansScreen-Regular ;
+/GillSans-Light /G032-Lig ;
+/GillSans /G032-Reg ;
+/GillSans-Bold /G032-Bol ;
+/GillSans-ExtraBold /G032-ExtBol ;
+/GillSans-LightItalic /G032-LigIta ;
+/GillSans-Italic /G032-Ita ;
+/GillSans-BoldItalic /G032-BolIta ;
+/GillSans-Condensed /G032Con-Reg ;
+/GillSans-BoldCondensed /G032Con-Bol ;
+/Goudy /Goudy-Reg ;
+/Goudy-Bold /Goudy-Med ;
+/Goudy-ExtraBold /Goudy-Bol ;
+/Goudy-Italic /Goudy-Ita ;
+/Goudy-BoldItalic /Goudy-MedIta ;
+/Helvetica /NimbusSan-Reg ;
+/Helvetica-Bold /NimbusSan-Bol ;
+/Helvetica-Oblique /NimbusSan-Ita ;
+/Helvetica-BoldOblique /NimbusSan-BolIta ;
+/Helvetica-Condensed /NimbusSanCon-Reg ;
+/Helvetica-Narrow /NimbusSanNar-Reg ;
+/Helvetica-Narrow-Bold /NimbusSanNar-Bol ;
+/Helvetica-Condensed-Bold /NimbusSanCon-Bol ;
+/Helvetica-Condensed-Oblique /NimbusSanCon-Ita ;
+/Helvetica-Narrow-Oblique /NimbusSanNar-Ita ;
+/Helvetica-Narrow-BoldOblique /NimbusSanNar-BolIta ;
+/Helvetica-Condensed-BoldObl /NimbusSanCon-BolIta ;
+/HoeflerText-Ornaments /BaskervilleOrnaments ;
+/HoeflerText-Regular /BaskervilleURW-Reg ;
+/HoeflerText-Black /BaskervilleURW-Bla ;
+/HoeflerText-Italic /BaskervilleURW-Ita ;
+/HoeflerText-BlackItalic /BaskervilleURW-BlaIta ;
+/JoannaMT /Joanna-Reg ;
+/JoannaMT-Bold /Joanna-Bol ;
+/JoannaMT-Italic /Joanna-Ita ;
+/JoannaMT-BoldItalic /Joanna-BolIta ;
+/LetterGothic /LetterGot-Reg ;
+/LetterGothic-Bold /LetterGot-Bol ;
+/LetterGothic-Slanted /LetterGot-Ita ;
+/LetterGothic-BoldSlanted /LetterGot-BolIta ;
+/LubalinGraph-Book /Lubalin-Boo ;
+/LubalinGraph-Demi /Lubalin-Dem ;
+/LubalinGraph-BookOblique /Lubalin-BooObl ;
+/LubalinGraph-DemiOblique /Lubalin-DemObl ;
+/Marigold /Mauritius ;
+/Monaco /NimbusTypewriter-Regular ;
+/MonaLisa-Recut /MonaLis ;
+/NewCenturySchlbk-Roman /CenturySchURW-Rom ;
+/NewCenturySchlbk-Bold /CenturySchURW-Bol ;
+/NewCenturySchlbk-Italic /CenturySchURW-Ita ;
+/NewCenturySchlbk-BoldItalic /CenturySchURW-BolIta ;
+/NewYork /NimbusRomanScreen-Regular ;
+/Optima /ClassicoURW-Reg ;
+/Optima-Bold /ClassicoURW-Bol ;
+/Optima-Italic /ClassicoURW-Ita ;
+/Optima-BoldItalic /ClassicoURW-BolIta ;
+/Oxford /AlonURW ;
+/Palatino-Roman /PalladioURW-Rom ;
+/Palatino-Bold /PalladioURW-Bol ;
+/Palatino-Italic /PalladioURW-Ita ;
+/Palatino-BoldItalic /PalladioURW-BolIta ;
+/StempelGaramond-Roman /GaramondURW-Reg ;
+/StempelGaramond-Bold /GaramondURW-Dem ;
+/StempelGaramond-Italic /GaramondURW-Ita ;
+/StempelGaramond-BoldItalic /GaramondURW-DemIta ;
+/Symbol /StandardSymL ;
+/Tekton /AfficheURW ;
+/Times-Roman /NimbusRom-Reg ;
+/Times-Bold /NimbusRom-Med ;
+/Times-Italic /NimbusRom-Ita ;
+/Times-BoldItalic /NimbusRom-MedIta ;
+/TimesNewRomanPSMT /NimbusRomNo9-Reg ;
+/TimesNewRomanPS-BoldMT /NimbusRomNo9-Bol ;
+/TimesNewRomanPS-ItalicMT /NimbusRomNo9-Ita ;
+/TimesNewRomanPS-BoldItalicMT /NimbusRomNo9-BolIta ;
+/Univers-Light /URWClassicSan-Lig ;
+/Univers /URWClassicSan-Reg ;
+/Univers-Bold /URWClassicSan-Bol ;
+/Univers-LightOblique /URWClassicSan-LigIta ;
+/Univers-Oblique /URWClassicSan-Ita ;
+/Univers-BoldOblique /URWClassicSan-BolIta ;
+/Univers-Condensed /URWClassicSanCon-Reg ;
+/Univers-CondensedBold /URWClassicSanCon-Bol ;
+/Univers-CondensedOblique /URWClassicSanCon-RegIta ;
+/Univers-CondensedBoldOblique /URWClassicSanCon-BolIta ;
+/Univers-Extended /URWClassicSanExt-Reg ;
+/Univers-BoldExt /URWClassicSanExt-Bol ;
+/Univers-ExtendedObl /URWClassicSanExt-Ita ;
+/Univers-BoldExtObl /URWClassicSanExt-BolIta ;
+/ZapfChancery-MediumItalic /ChanceryURW-MedIta ;
+/ZapfDingbats /Dingbats ;
+
+/Taffy /AtramentURW
+
+% Note that for legal reasons ther is no equivalen to Wingdings
+%
+
+
+%
+% Type 1 fonts contributed to the X11R5 distribution.
+%
+
+% The following notice accompanied the Charter fonts.
+%
+% (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA.
+%
+% You are hereby granted permission under all Bitstream propriety rights
+% to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream
+% Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts
+% for any purpose and without restriction; provided, that this notice is
+% left intact on all copies of such fonts and that Bitstream's trademark
+% is acknowledged as shown below on all unmodified copies of the 4 Charter
+% Type 1 fonts.
+%
+% BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
+
+/CharterBT-Roman (bchr.pfa) ;
+/CharterBT-Italic (bchri.pfa) ;
+/CharterBT-Bold (bchb.pfa) ;
+/CharterBT-BoldItalic (bchbi.pfa) ;
+
+% Aliases
+
+/Charter-Roman /CharterBT-Roman ;
+/Charter-Italic /CharterBT-Italic ;
+/Charter-Bold /CharterBT-Bold ;
+/Charter-BoldItalic /CharterBT-BoldItalic ;
+
+% The following notice accompanied the Utopia font:
+%
+% Permission to use, reproduce, display and distribute the listed
+% typefaces is hereby granted, provided that the Adobe Copyright notice
+% appears in all whole and partial copies of the software and that the
+% following trademark symbol and attribution appear in all unmodified
+% copies of the software:
+%
+% Copyright (c) 1989 Adobe Systems Incorporated
+% Utopia (R)
+% Utopia is a registered trademark of Adobe Systems Incorporated
+%
+% The Adobe typefaces (Type 1 font program, bitmaps and Adobe Font
+% Metric files) donated are:
+%
+% Utopia Regular
+% Utopia Italic
+% Utopia Bold
+% Utopia Bold Italic
+
+/Utopia-Regular (putr.pfa) ;
+/Utopia-Italic (putri.pfa) ;
+/Utopia-Bold (putb.pfa) ;
+/Utopia-BoldItalic (putbi.pfa) ;
+
+%
+%
+% Fonts contributed by URW GmbH for distribution under the GNU License.
+% The following notice accompanied these fonts:
+%
+% U004006T URW Grotesk 2031 Bold PostScript Type 1 Font Program
+% U003043T URW Antiqua 2051 Regular Condensed PostScript Type 1 Font Program
+%
+% Copyright (c) 1992 URW GmbH, Hamburg, Germany
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; wihtout even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+% See the GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 U.S.A.
+%
+% Address:
+% URW GmbH
+% PC Support
+% Harksheider Strasse 102
+% 2000 Hamburg 65
+% Germany
+% Phone: +49 40 60 60 50 (Reception)
+% Phone: +49 40 60 60 52 30 (PC Support)
+% Fax : +49 40 60 60 52 52
+%
+
+/URWAntiquaT-RegularCondensed (u003043t.gsf) ;
+/URWGroteskT-Bold (u004006t.gsf) ;
+
+%
+%
+% Calligraphic Kana fonts. These are distributed under the OFL 1.1:
+%
+% Copyright (c) 1993, Kevin Hartig (kevin.hartig@gmail.com),
+% with Reserved Font Name Calligraphic-Hiragana and Calligraphic-Katakana.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is available with an FAQ at: http://scripts.sil.org/OFL
+
+% Hiragana and Katakana fonts. The character names are inappropriate,
+% and the encoding is probably not related to any known standard.
+
+/Calligraphic-Hiragana (fhirw.gsf) ;
+/Calligraphic-Katakana (fkarw.gsf) ;
+
+%
+%
+% Public-domain fonts. These have no copyright, and are of unknown quality.
+
+% Cyrillic fonts. The character names are inappropriate,
+% and the encoding is probably not related to any known standard.
+
+/Shareware-Cyrillic-Regular (fcyr.gsf) ;
+/Shareware-Cyrillic-Italic (fcyri.gsf) ;
+
+% Aliases
+/Cyrillic /Cyrillic-Regular ;
+/Cyrillic-Regular /Shareware-Cyrillic-Regular ;
+/Cyrillic-Italic /Shareware-Cyrillic-Italic ;
+
+%
+%
+% Fonts converted from Hershey outlines. These are constructed and
+% maintained manually. These are also in the public domain.
+%
+% The suggested UniqueID's and filenames are constructed differently for
+% these than for the ones above, because of the strange way that the Hershey
+% fonts were constructed. The scheme for these looks like:
+%
+% 42TTXY0
+%
+% TT = typeface, X = ``class'', Y = variation
+%
+% The typeface names and numbers are listed in fonts.mak.
+%
+% class:
+% 0 = normal = r
+% 1 = simplex = s
+% 2 = complex = c
+% 3 = triplex = t
+% 4 = duplex = d
+%
+% variation:
+% 0 = normal (omitted)
+% 1 = oblique = o
+% 2 = italic = i
+% 3 = bold = b
+% 4 = bold oblique = bo
+% 5 = bold italic = bi
+%
+
+% Fonts created by Thomas Wolff <wolff@inf.fu-berlin.de>, by adding
+% accents, accented characters, and various other non-alphabetics
+% to the original Hershey fonts. These are "freeware", not to be sold.
+
+/Hershey-Gothic-English (hrger.pfa) ; % 5066533
+/Hershey-Gothic-German (hrgrr.pfa) ;
+/Hershey-Gothic-Italian (hritr.pfa) ;
+
+/Hershey-Plain-Duplex (hrpld.pfa) ;
+/Hershey-Plain-Duplex-Italic (hrpldi.pfa) ;
+/Hershey-Plain-Triplex (hrplt.pfa) ;
+/Hershey-Plain-Triplex-Italic (hrplti.pfa) ;
+
+/Hershey-Script-Complex (hrscc.pfa) ;
+/Hershey-Script-Simplex (hrscs.pfa) ; % 5066541
+
+% Fonts created algorithmically from the above.
+
+/Hershey-Gothic-English-Bold (hrgerb.gsf) ; % 5066542
+/Hershey-Gothic-English-Oblique (hrgero.gsf) ;
+/Hershey-Gothic-English-SemiBold (hrgerd.gsf) ;
+/Hershey-Gothic-German-Bold (hrgrrb.gsf) ;
+/Hershey-Gothic-German-Oblique (hrgrro.gsf) ;
+/Hershey-Gothic-Italian-Bold (hritrb.gsf) ;
+/Hershey-Gothic-Italian-Oblique (hritro.gsf) ;
+
+/Hershey-Plain-Duplex-Bold (hrpldb.gsf) ;
+/Hershey-Plain-Duplex-Bold-Italic (hrpldbi.gsf) ;
+/Hershey-Plain-Triplex-Bold (hrpltb.gsf) ;
+/Hershey-Plain-Triplex-Bold-Italic (hrpltbi.gsf) ;
+
+/Hershey-Script-Complex-Bold (hrsccb.gsf) ;
+/Hershey-Script-Complex-Oblique (hrscco.gsf) ;
+/Hershey-Script-Simplex-Bold (hrscsb.gsf) ;
+/Hershey-Script-Simplex-Oblique (hrscso.gsf) ; % 5066556
+
+% Fonts consisting only of characters from the original Hershey
+% distribution. These are Type 3 fonts.
+
+/Hershey-Greek-Complex (hrgkc.gsf) ; % 5066557
+/Hershey-Greek-Simplex (hrgks.gsf) ;
+
+/Hershey-Plain (hrplr.gsf) ;
+/Hershey-Plain-Simplex (hrpls.gsf) ; % 5066560
+
+% Fonts created algorithmically from the above.
+
+/Hershey-Plain-Bold (hrplrb.gsf) ; % 5066561
+/Hershey-Plain-Bold-Oblique (hrplrbo.gsf) ;
+/Hershey-Plain-Oblique (hrplro.gsf) ;
+/Hershey-Plain-Simplex-Bold (hrplsb.gsf) ;
+/Hershey-Plain-Simplex-Bold-Oblique (hrplsbo.gsf) ;
+/Hershey-Plain-Simplex-Oblique (hrplso.gsf) ; % 5066566
+
+% This font, and only this font among the Hershey fonts, uses
+% the SymbolEncoding.
+
+/Hershey-Symbol (hrsyr.gsf) ; % 5066567
+
+/Arial /ArialMT ;
+/Arial,Bold /Arial-BoldMT ;
+/Arial,Italic /Arial-ItalicMT ;
+/Arial,BoldItalic /Arial-BoldItalicMT ;
+
+/TimesNewRoman /TimesNewRomanPSMT ;
+/TimesNewRoman,Bold /TimesNewRomanPS-BoldMT ;
+/TimesNewRoman,Italic /TimesNewRomanPS-ItalicMT ;
+/TimesNewRoman,BoldItalic /TimesNewRomanPS-BoldItalicMT ;
+
diff --git a/lib/Fontmap.URW-136.TT b/lib/Fontmap.URW-136.TT
new file mode 100644
index 00000000..2768d69a
--- /dev/null
+++ b/lib/Fontmap.URW-136.TT
@@ -0,0 +1,574 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% $Id: Fontmap.GS 8978 2008-08-12 23:44:53Z ray $
+% Fontmap - standard font catalog for Ghostscript.
+
+% ----------------------------------------------------------------
+
+% This file is a catalog of fonts known to Ghostscript. Any font
+% that is to be loaded automatically when named must be in this catalog,
+% except for fonts that Ghostscript finds automatically in directories
+% named in the GS_FONTPATH environment variable.
+
+% Each font has an entry consisting of three items:
+%
+% - The name by which the font is known inside Ghostscript
+% (a Ghostscript name preceded by a `/', or a string enclosed
+% in parentheses). This is used to find the file from which
+% a font of a given name should be loaded.
+%
+% - Information depending on whether this is a real font or a
+% font alias:
+%
+% - For real fonts, the name of the Ghostscript font
+% file (a Ghostscript string, enclosed in parentheses).
+% The filename should include the extension, which (by
+% convention) is `.gsf'. `.pfa' and `.ttf' files are
+% also usable as fonts for Ghostscript.
+%
+% - For font aliases, the name of the font which should
+% be used when this one is requested, preceded by a
+% `/'. See the entry for Charter below for an example.
+% Note that an alias name cannot be enclosed in parentheses.
+%
+% - At least one space or tab, and a terminating semicolon.
+
+% The following table is executed as a PostScript file.
+% If you add new entries, be sure to copy the punctuation accurately;
+% in particular, you must leave at least one space or tab between each
+% field in the entry. Also, please read fonts.doc for important information
+% about font names.
+
+% PDF interpreter evaluates hexadecimal escapes in PDF font names before
+% looking up the font. When the resulting name cannot be represented using
+% PostScript name syntax, the string can be used instead of the name.
+
+% Note that .pfa and .ttf fonts are compatible with Adobe Type Manager
+% and other programs that don't include full PostScript interpreters,
+% as well as with PostScript interpreters; .gsf fonts are compatible with
+% PostScript interpreters, but not with ATM or similar programs.
+
+%
+
+%
+% The 136 font set from URW in .ttf (Printer Font Binary) format
+%
+
+/AntiqueOli-Reg (a008003i.ttf) ;
+/AntiqueOli-Bol (a008006i.ttf) ;
+/AntiqueOli-Com (a008007i.ttf) ;
+/AntiqueOli-RegIta (a008023i.ttf) ;
+/URWGothic-Boo (a010013l.ttf) ;
+/URWGothic-Dem (a010015l.ttf) ;
+/URWGothic-BooObl (a010033l.ttf) ;
+/URWGothic-DemObl (a010035l.ttf) ;
+/A028-Lig (a028012i.ttf) ;
+/A028-Med (a028014i.ttf) ;
+/A028-MedIta (a028034i.ttf) ;
+/AtramentURW (a096003i.ttf) ;
+/AlonURW (a097003i.ttf) ;
+/AfficheURW (a098003i.ttf) ;
+/BaskervilleOrnaments (b004000i.ttf) ;
+/BaskervilleURW-Reg (b004003i.ttf) ;
+/BaskervilleURW-Bla (b004006i.ttf) ;
+/BaskervilleURW-Ita (b004023i.ttf) ;
+/BaskervilleURW-BlaIta (b004026i.ttf) ;
+/BookmanURW-Lig (b018012l.ttf) ;
+/BookmanURW-DemBol (b018015l.ttf) ;
+/BookmanURW-LigIta (b018032l.ttf) ;
+/BookmanURW-DemBolIta (b018035l.ttf) ;
+/BodoniAnt-Reg (b044003i.ttf) ;
+/BodoniAnt-Bol (b044004i.ttf) ;
+/BodoniAnt-Ita (b044023i.ttf) ;
+/BodoniAnt-BolIta (b044024i.ttf) ;
+/Bodoni-Ult (b049020i.ttf) ;
+/Bodoni-Com (b049132i.ttf) ;
+/Clarendon-Lig (c011002i.ttf) ;
+/Clarendon-Med (c011004i.ttf) ;
+/Clarendon-Bol (c011007i.ttf) ;
+/Cooper-Bla (c018016i.ttf) ;
+/Cooper-BlaIta (c018036i.ttf) ;
+/Copperplate-Med (c041014i.ttf) ;
+/Copperplate-Bol (c041018i.ttf) ;
+/CenturySchURW-Rom (c059013l.ttf) ;
+/CenturySchURW-Bol (c059016l.ttf) ;
+/CenturySchURW-Ita (c059033l.ttf) ;
+/CenturySchURW-BolIta (c059036l.ttf) ;
+/CoronetURW (c093000i.ttf) ;
+/Dingbats (d050000l.ttf) ;
+/Eurostile-Reg (e004003i.ttf) ;
+/Eurostile-Bol (e004006i.ttf) ;
+/Eurostile-Ext (e004083i.ttf) ;
+/Eurostile-BolExt (e004086i.ttf) ;
+/G032-Lig (g032012i.ttf) ;
+/G032-Reg (g032013i.ttf) ;
+/G032-Bol (g032016i.ttf) ;
+/G032-ExtBol (g032017i.ttf) ;
+/G032-LigIta (g032032i.ttf) ;
+/G032-Ita (g032033i.ttf) ;
+/G032-BolIta (g032036i.ttf) ;
+/G032Con-Reg (g032053i.ttf) ;
+/G032Con-Bol (g032056i.ttf) ;
+/GaramondURW-Reg (g043003i.ttf) ;
+/GaramondURW-Dem (g043004i.ttf) ;
+/GaramondURW-Ita (g043023i.ttf) ;
+/GaramondURW-DemIta (g043024i.ttf) ;
+/Goudy-Reg (g047013i.ttf) ;
+/Goudy-Med (g047014i.ttf) ;
+/Goudy-Bol (g047016i.ttf) ;
+/Goudy-Ita (g047033i.ttf) ;
+/Goudy-MedIta (g047034i.ttf) ;
+/Joanna-Reg (j011013i.ttf) ;
+/Joanna-Bol (j011016i.ttf) ;
+/Joanna-Ita (j011033i.ttf) ;
+/Joanna-BolIta (j011036i.ttf) ;
+/Lubalin-Boo (l005013i.ttf) ;
+/Lubalin-Dem (l005015i.ttf) ;
+/Lubalin-BooObl (l005033i.ttf) ;
+/Lubalin-DemObl (l005035i.ttf) ;
+/LetterGot-Reg (l021003i.ttf) ;
+/LetterGot-Bol (l021004i.ttf) ;
+/LetterGot-Ita (l021023i.ttf) ;
+/LetterGot-BolIta (l021024i.ttf) ;
+/MonaLis (m034000i.ttf) ;
+/Mauritius (m048000i.ttf) ;
+/NimbusSan-Reg (n019003l.ttf) ;
+/NimbusSan-Bol (n019004l.ttf) ;
+/NimbusSan-Ita (n019023l.ttf) ;
+/NimbusSan-BolIta (n019024l.ttf) ;
+/NimbusSanNo2-Reg (n019003i.ttf) ;
+/NimbusSanNo2-Bol (n019004i.ttf) ;
+/NimbusSanNo2-Ita (n019023i.ttf) ;
+/NimbusSanNo2-BolIta (n019024i.ttf) ;
+/NimbusSanCon-Reg (n019043i.ttf) ;
+/NimbusSanNar-Reg (n019043l.ttf) ;
+/NimbusSanNar-Bol (n019044l.ttf) ;
+/NimbusSanCon-Bol (n019045i.ttf) ;
+/NimbusSanCon-Ita (n019063i.ttf) ;
+/NimbusSanCon-BolIta (n019065i.ttf) ;
+/NimbusSanNar-Ita (n019063l.ttf) ;
+/NimbusSanNar-BolIta (n019064l.ttf) ;
+/NimbusRomNo9-Reg (n021003i.ttf) ;
+/NimbusRom-Reg (n021003l.ttf) ;
+/NimbusRomNo9-Bol (n021004i.ttf) ;
+/NimbusRom-Med (n021004l.ttf) ;
+/NimbusRomNo9-Ita (n021023i.ttf) ;
+/NimbusRom-Ita (n021023l.ttf) ;
+/NimbusRomNo9-BolIta (n021024i.ttf) ;
+/NimbusRom-MedIta (n021024l.ttf) ;
+/NimbusMon-Reg (n022003l.ttf) ;
+/NimbusMon-Bol (n022004l.ttf) ;
+/NimbusMon-Obl (n022023l.ttf) ;
+/NimbusMon-BolObl (n022024l.ttf) ;
+/NimbusTypewriter-Regular (n056003m.ttf) ;
+/NimbusRomanScreen-Regular (n057003i.ttf) ;
+/NimbusGUI-Regular (n058003i.ttf) ;
+/NimbusSansScreen-Regular (n059003i.ttf) ;
+/ClassicoURW-Reg (o004003i.ttf) ;
+/ClassicoURW-Bol (o004004i.ttf) ;
+/ClassicoURW-Ita (o004023i.ttf) ;
+/ClassicoURW-BolIta (o004024i.ttf) ;
+/PalladioURW-Rom (p052003l.ttf) ;
+/PalladioURW-Bol (p052004l.ttf) ;
+/PalladioURW-Ita (p052023l.ttf) ;
+/PalladioURW-BolIta (p052024l.ttf) ;
+/StandardSymL (s050000l.ttf) ;
+/URWSignsAndSymD (s052000d.ttf) ;
+/URWClassicSan-Lig (u001002i.ttf) ;
+/URWClassicSan-Reg (u001003i.ttf) ;
+/URWClassicSan-Bol (u001004i.ttf) ;
+/URWClassicSan-LigIta (u001022i.ttf) ;
+/URWClassicSan-Ita (u001023i.ttf) ;
+/URWClassicSan-BolIta (u001024i.ttf) ;
+/URWClassicSanCon-Reg (u001043i.ttf) ;
+/URWClassicSanCon-Bol (u001044i.ttf) ;
+/URWClassicSanCon-RegIta (u001063i.ttf) ;
+/URWClassicSanCon-BolIta (u001064i.ttf) ;
+/URWClassicSanExt-Reg (u001083i.ttf) ;
+/URWClassicSanExt-Bol (u001085i.ttf) ;
+/URWClassicSanExt-Ita (u001103i.ttf) ;
+/URWClassicSanExt-BolIta (u001105i.ttf) ;
+/UngerCha (u022003i.ttf) ;
+/ChanceryURW-MedIta (z003034l.ttf) ;
+
+% Aliases
+% These map the Adobe font names to the closest match in the URW font set
+%
+/AlbertusMT-Light /A028-Lig ;
+/AlbertusMT /A028-Med ;
+/AlbertusMT-Italic /A028-MedIta ;
+/AntiqueOlive-Roman /AntiqueOli-Reg ;
+/AntiqueOlive-Bold /AntiqueOli-Bol ;
+/AntiqueOlive-Compact /AntiqueOli-Com ;
+/AntiqueOlive-Italic /AntiqueOli-RegIta ;
+/Apple-Chancery /UngerCha ;
+/ArialMT /NimbusSanNo2-Reg ;
+/Arial-BoldMT /NimbusSanNo2-Bol ;
+/Arial-BoldItalicMT /NimbusSanNo2-Ita ;
+/Arial-ItalicMT /NimbusSanNo2-BolIta ;
+/AvantGarde-Book /URWGothic-Boo ;
+/AvantGarde-Demi /URWGothic-Dem ;
+/AvantGarde-BookOblique /URWGothic-BooObl ;
+/AvantGarde-DemiOblique /URWGothic-DemObl ;
+/Bodoni /BodoniAnt-Reg ;
+/Bodoni-Bold /BodoniAnt-Bol ;
+/Bodoni-Italic /BodoniAnt-Ita ;
+/Bodoni-BoldItalic /BodoniAnt-BolIta ;
+/Bodoni-Poster /Bodoni-Ult ;
+/Bodoni-PosterCompressed /Bodoni-Com ;
+/Bookman-Light /BookmanURW-Lig ;
+/Bookman-Demi /BookmanURW-DemBol ;
+/Bookman-LightItalic /BookmanURW-LigIta ;
+/Bookman-DemiItalic /BookmanURW-DemBolIta ;
+/Carta /URWSignsAndSymD ;
+/Chicago /NimbusGUI-Regular ;
+/Clarendon-Light /Clarendon-Lig ;
+/Clarendon /Clarendon-Med ;
+/Clarendon-Bold /Clarendon-Bol ;
+/CooperBlack /Cooper-Bla ;
+/CooperBlack-Italic /Cooper-BlaIta ;
+/Copperplate-ThirtyTwoBC /Copperplate-Med ;
+/Copperplate-ThirtyThreeBC /Copperplate-Bol ;
+/Coronet-Regular /CoronetURW ;
+/Courier /NimbusMon-Reg ;
+/Courier-BoldOblique /NimbusMon-BolObl ;
+/Courier-Oblique /NimbusMon-Obl ;
+/Courier-Bold /NimbusMon-Bol ;
+/Eurostile /Eurostile-Reg ;
+/Eurostile-Bold /Eurostile-Bol ;
+/Eurostile-ExtendedTwo /Eurostile-Ext ;
+/Eurostile-BoldExtendedTwo /Eurostile-BolExt ;
+/Geneva /NimbusSansScreen-Regular ;
+/GillSans-Light /G032-Lig ;
+/GillSans /G032-Reg ;
+/GillSans-Bold /G032-Bol ;
+/GillSans-ExtraBold /G032-ExtBol ;
+/GillSans-LightItalic /G032-LigIta ;
+/GillSans-Italic /G032-Ita ;
+/GillSans-BoldItalic /G032-BolIta ;
+/GillSans-Condensed /G032Con-Reg ;
+/GillSans-BoldCondensed /G032Con-Bol ;
+/Goudy /Goudy-Reg ;
+/Goudy-Bold /Goudy-Med ;
+/Goudy-ExtraBold /Goudy-Bol ;
+/Goudy-Italic /Goudy-Ita ;
+/Goudy-BoldItalic /Goudy-MedIta ;
+/Helvetica /NimbusSan-Reg ;
+/Helvetica-Bold /NimbusSan-Bol ;
+/Helvetica-Oblique /NimbusSan-Ita ;
+/Helvetica-BoldOblique /NimbusSan-BolIta ;
+/Helvetica-Condensed /NimbusSanCon-Reg ;
+/Helvetica-Narrow /NimbusSanNar-Reg ;
+/Helvetica-Narrow-Bold /NimbusSanNar-Bol ;
+/Helvetica-Condensed-Bold /NimbusSanCon-Bol ;
+/Helvetica-Condensed-Oblique /NimbusSanCon-Ita ;
+/Helvetica-Narrow-Oblique /NimbusSanNar-Ita ;
+/Helvetica-Narrow-BoldOblique /NimbusSanNar-BolIta ;
+/Helvetica-Condensed-BoldObl /NimbusSanCon-BolIta ;
+/HoeflerText-Ornaments /BaskervilleOrnaments ;
+/HoeflerText-Regular /BaskervilleURW-Reg ;
+/HoeflerText-Black /BaskervilleURW-Bla ;
+/HoeflerText-Italic /BaskervilleURW-Ita ;
+/HoeflerText-BlackItalic /BaskervilleURW-BlaIta ;
+/JoannaMT /Joanna-Reg ;
+/JoannaMT-Bold /Joanna-Bol ;
+/JoannaMT-Italic /Joanna-Ita ;
+/JoannaMT-BoldItalic /Joanna-BolIta ;
+/LetterGothic /LetterGot-Reg ;
+/LetterGothic-Bold /LetterGot-Bol ;
+/LetterGothic-Slanted /LetterGot-Ita ;
+/LetterGothic-BoldSlanted /LetterGot-BolIta ;
+/LubalinGraph-Book /Lubalin-Boo ;
+/LubalinGraph-Demi /Lubalin-Dem ;
+/LubalinGraph-BookOblique /Lubalin-BooObl ;
+/LubalinGraph-DemiOblique /Lubalin-DemObl ;
+/Marigold /Mauritius ;
+/Monaco /NimbusTypewriter-Regular ;
+/MonaLisa-Recut /MonaLis ;
+/NewCenturySchlbk-Roman /CenturySchURW-Rom ;
+/NewCenturySchlbk-Bold /CenturySchURW-Bol ;
+/NewCenturySchlbk-Italic /CenturySchURW-Ita ;
+/NewCenturySchlbk-BoldItalic /CenturySchURW-BolIta ;
+/NewYork /NimbusRomanScreen-Regular ;
+/Optima /ClassicoURW-Reg ;
+/Optima-Bold /ClassicoURW-Bol ;
+/Optima-Italic /ClassicoURW-Ita ;
+/Optima-BoldItalic /ClassicoURW-BolIta ;
+/Oxford /AlonURW ;
+/Palatino-Roman /PalladioURW-Rom ;
+/Palatino-Bold /PalladioURW-Bol ;
+/Palatino-Italic /PalladioURW-Ita ;
+/Palatino-BoldItalic /PalladioURW-BolIta ;
+/StempelGaramond-Roman /GaramondURW-Reg ;
+/StempelGaramond-Bold /GaramondURW-Dem ;
+/StempelGaramond-Italic /GaramondURW-Ita ;
+/StempelGaramond-BoldItalic /GaramondURW-DemIta ;
+/Symbol /StandardSymL ;
+/Tekton /AfficheURW ;
+/Times-Roman /NimbusRom-Reg ;
+/Times-Bold /NimbusRom-Med ;
+/Times-Italic /NimbusRom-Ita ;
+/Times-BoldItalic /NimbusRom-MedIta ;
+/TimesNewRomanPSMT /NimbusRomNo9-Reg ;
+/TimesNewRomanPS-BoldMT /NimbusRomNo9-Bol ;
+/TimesNewRomanPS-ItalicMT /NimbusRomNo9-Ita ;
+/TimesNewRomanPS-BoldItalicMT /NimbusRomNo9-BolIta ;
+/Univers-Light /URWClassicSan-Lig ;
+/Univers /URWClassicSan-Reg ;
+/Univers-Bold /URWClassicSan-Bol ;
+/Univers-LightOblique /URWClassicSan-LigIta ;
+/Univers-Oblique /URWClassicSan-Ita ;
+/Univers-BoldOblique /URWClassicSan-BolIta ;
+/Univers-Condensed /URWClassicSanCon-Reg ;
+/Univers-CondensedBold /URWClassicSanCon-Bol ;
+/Univers-CondensedOblique /URWClassicSanCon-RegIta ;
+/Univers-CondensedBoldOblique /URWClassicSanCon-BolIta ;
+/Univers-Extended /URWClassicSanExt-Reg ;
+/Univers-BoldExt /URWClassicSanExt-Bol ;
+/Univers-ExtendedObl /URWClassicSanExt-Ita ;
+/Univers-BoldExtObl /URWClassicSanExt-BolIta ;
+/ZapfChancery-MediumItalic /ChanceryURW-MedIta ;
+/ZapfDingbats /Dingbats ;
+
+/Taffy /AtramentURW
+
+% Note that for legal reasons ther is no equivalen to Wingdings
+%
+
+
+%
+% Type 1 fonts contributed to the X11R5 distribution.
+%
+
+% The following notice accompanied the Charter fonts.
+%
+% (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA.
+%
+% You are hereby granted permission under all Bitstream propriety rights
+% to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream
+% Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts
+% for any purpose and without restriction; provided, that this notice is
+% left intact on all copies of such fonts and that Bitstream's trademark
+% is acknowledged as shown below on all unmodified copies of the 4 Charter
+% Type 1 fonts.
+%
+% BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
+
+/CharterBT-Roman (bchr.pfa) ;
+/CharterBT-Italic (bchri.pfa) ;
+/CharterBT-Bold (bchb.pfa) ;
+/CharterBT-BoldItalic (bchbi.pfa) ;
+
+% Aliases
+
+/Charter-Roman /CharterBT-Roman ;
+/Charter-Italic /CharterBT-Italic ;
+/Charter-Bold /CharterBT-Bold ;
+/Charter-BoldItalic /CharterBT-BoldItalic ;
+
+% The following notice accompanied the Utopia font:
+%
+% Permission to use, reproduce, display and distribute the listed
+% typefaces is hereby granted, provided that the Adobe Copyright notice
+% appears in all whole and partial copies of the software and that the
+% following trademark symbol and attribution appear in all unmodified
+% copies of the software:
+%
+% Copyright (c) 1989 Adobe Systems Incorporated
+% Utopia (R)
+% Utopia is a registered trademark of Adobe Systems Incorporated
+%
+% The Adobe typefaces (Type 1 font program, bitmaps and Adobe Font
+% Metric files) donated are:
+%
+% Utopia Regular
+% Utopia Italic
+% Utopia Bold
+% Utopia Bold Italic
+
+/Utopia-Regular (putr.pfa) ;
+/Utopia-Italic (putri.pfa) ;
+/Utopia-Bold (putb.pfa) ;
+/Utopia-BoldItalic (putbi.pfa) ;
+
+%
+%
+% Fonts contributed by URW GmbH for distribution under the GNU License.
+% The following notice accompanied these fonts:
+%
+% U004006T URW Grotesk 2031 Bold PostScript Type 1 Font Program
+% U003043T URW Antiqua 2051 Regular Condensed PostScript Type 1 Font Program
+%
+% Copyright (c) 1992 URW GmbH, Hamburg, Germany
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; wihtout even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+% See the GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 U.S.A.
+%
+% Address:
+% URW GmbH
+% PC Support
+% Harksheider Strasse 102
+% 2000 Hamburg 65
+% Germany
+% Phone: +49 40 60 60 50 (Reception)
+% Phone: +49 40 60 60 52 30 (PC Support)
+% Fax : +49 40 60 60 52 52
+%
+
+/URWAntiquaT-RegularCondensed (u003043t.gsf) ;
+/URWGroteskT-Bold (u004006t.gsf) ;
+
+%
+%
+% Calligraphic Kana fonts. These are distributed under the OFL 1.1:
+%
+% Copyright (c) 1993, Kevin Hartig (kevin.hartig@gmail.com),
+% with Reserved Font Name Calligraphic-Hiragana and Calligraphic-Katakana.
+% This Font Software is licensed under the SIL Open Font License, Version 1.1.
+% This license is available with an FAQ at: http://scripts.sil.org/OFL
+
+% Hiragana and Katakana fonts. The character names are inappropriate,
+% and the encoding is probably not related to any known standard.
+
+/Calligraphic-Hiragana (fhirw.gsf) ;
+/Calligraphic-Katakana (fkarw.gsf) ;
+
+%
+%
+% Public-domain fonts. These have no copyright, and are of unknown quality.
+
+% Cyrillic fonts. The character names are inappropriate,
+% and the encoding is probably not related to any known standard.
+
+/Shareware-Cyrillic-Regular (fcyr.gsf) ;
+/Shareware-Cyrillic-Italic (fcyri.gsf) ;
+
+% Aliases
+/Cyrillic /Cyrillic-Regular ;
+/Cyrillic-Regular /Shareware-Cyrillic-Regular ;
+/Cyrillic-Italic /Shareware-Cyrillic-Italic ;
+
+%
+%
+% Fonts converted from Hershey outlines. These are constructed and
+% maintained manually. These are also in the public domain.
+%
+% The suggested UniqueID's and filenames are constructed differently for
+% these than for the ones above, because of the strange way that the Hershey
+% fonts were constructed. The scheme for these looks like:
+%
+% 42TTXY0
+%
+% TT = typeface, X = ``class'', Y = variation
+%
+% The typeface names and numbers are listed in fonts.mak.
+%
+% class:
+% 0 = normal = r
+% 1 = simplex = s
+% 2 = complex = c
+% 3 = triplex = t
+% 4 = duplex = d
+%
+% variation:
+% 0 = normal (omitted)
+% 1 = oblique = o
+% 2 = italic = i
+% 3 = bold = b
+% 4 = bold oblique = bo
+% 5 = bold italic = bi
+%
+
+% Fonts created by Thomas Wolff <wolff@inf.fu-berlin.de>, by adding
+% accents, accented characters, and various other non-alphabetics
+% to the original Hershey fonts. These are "freeware", not to be sold.
+
+/Hershey-Gothic-English (hrger.pfa) ; % 5066533
+/Hershey-Gothic-German (hrgrr.pfa) ;
+/Hershey-Gothic-Italian (hritr.pfa) ;
+
+/Hershey-Plain-Duplex (hrpld.pfa) ;
+/Hershey-Plain-Duplex-Italic (hrpldi.pfa) ;
+/Hershey-Plain-Triplex (hrplt.pfa) ;
+/Hershey-Plain-Triplex-Italic (hrplti.pfa) ;
+
+/Hershey-Script-Complex (hrscc.pfa) ;
+/Hershey-Script-Simplex (hrscs.pfa) ; % 5066541
+
+% Fonts created algorithmically from the above.
+
+/Hershey-Gothic-English-Bold (hrgerb.gsf) ; % 5066542
+/Hershey-Gothic-English-Oblique (hrgero.gsf) ;
+/Hershey-Gothic-English-SemiBold (hrgerd.gsf) ;
+/Hershey-Gothic-German-Bold (hrgrrb.gsf) ;
+/Hershey-Gothic-German-Oblique (hrgrro.gsf) ;
+/Hershey-Gothic-Italian-Bold (hritrb.gsf) ;
+/Hershey-Gothic-Italian-Oblique (hritro.gsf) ;
+
+/Hershey-Plain-Duplex-Bold (hrpldb.gsf) ;
+/Hershey-Plain-Duplex-Bold-Italic (hrpldbi.gsf) ;
+/Hershey-Plain-Triplex-Bold (hrpltb.gsf) ;
+/Hershey-Plain-Triplex-Bold-Italic (hrpltbi.gsf) ;
+
+/Hershey-Script-Complex-Bold (hrsccb.gsf) ;
+/Hershey-Script-Complex-Oblique (hrscco.gsf) ;
+/Hershey-Script-Simplex-Bold (hrscsb.gsf) ;
+/Hershey-Script-Simplex-Oblique (hrscso.gsf) ; % 5066556
+
+% Fonts consisting only of characters from the original Hershey
+% distribution. These are Type 3 fonts.
+
+/Hershey-Greek-Complex (hrgkc.gsf) ; % 5066557
+/Hershey-Greek-Simplex (hrgks.gsf) ;
+
+/Hershey-Plain (hrplr.gsf) ;
+/Hershey-Plain-Simplex (hrpls.gsf) ; % 5066560
+
+% Fonts created algorithmically from the above.
+
+/Hershey-Plain-Bold (hrplrb.gsf) ; % 5066561
+/Hershey-Plain-Bold-Oblique (hrplrbo.gsf) ;
+/Hershey-Plain-Oblique (hrplro.gsf) ;
+/Hershey-Plain-Simplex-Bold (hrplsb.gsf) ;
+/Hershey-Plain-Simplex-Bold-Oblique (hrplsbo.gsf) ;
+/Hershey-Plain-Simplex-Oblique (hrplso.gsf) ; % 5066566
+
+% This font, and only this font among the Hershey fonts, uses
+% the SymbolEncoding.
+
+/Hershey-Symbol (hrsyr.gsf) ; % 5066567
+
+/Arial /ArialMT ;
+/Arial,Bold /Arial-BoldMT ;
+/Arial,Italic /Arial-ItalicMT ;
+/Arial,BoldItalic /Arial-BoldItalicMT ;
+
+/TimesNewRoman /TimesNewRomanPSMT ;
+/TimesNewRoman,Bold /TimesNewRomanPS-BoldMT ;
+/TimesNewRoman,Italic /TimesNewRomanPS-ItalicMT ;
+/TimesNewRoman,BoldItalic /TimesNewRomanPS-BoldItalicMT ;
+
diff --git a/lib/Fontmap.Ult b/lib/Fontmap.Ult
new file mode 100644
index 00000000..85e3006c
--- /dev/null
+++ b/lib/Fontmap.Ult
@@ -0,0 +1,145 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Fontmap.Ult is derived from the standard Fontmap file distributed with
+% ghostscript; for credits and sources see that file. The modifications here
+% are valid for ULTRIX 4.3, and consist of defining some fonts and font
+% aliases as the licensed fontfiles included in ULTRIX for use on ULTRIX
+% workstations, which give better quality than the free fontfiles available
+% for ghostscript. Under ULTRIX 4.3 the licensed fontfiles are found in
+%
+% /usr/lib/DPS/outline/decwin
+%
+% so that directory must either be built into ghostscript by redefining
+% GS_LIB_DEFAULT when ghostscript is compiled, or else by defining an
+% environmental variable GS_LIB_DEFAULT, which contains it as an element of
+% the path, when running ghostscript. For instance, under the KornShell
+%
+% GS_LIB_DEFAULT=/usr/gs:/usr/lib/DPS/outline/decwin:/usr/gs/fonts
+% export GS_LIB_DEFAULT
+%
+% Peter Kaiser (kaiser@acm.org) 27 January 1995
+% Updated by L. Peter Deutsch (ghost@aladdin.com) 5 January 1999
+% to include correct aliasing for the Bitstream Charter fonts
+
+/AvantGarde-Book (AvantGarde-Book) ;
+/AvantGarde-BookOblique (AvantGarde-BookOblique) ;
+/AvantGarde-Demi (AvantGarde-Demi) ;
+/AvantGarde-DemiOblique (AvantGarde-DemiOblique) ;
+/Courier (Courier) ;
+/Courier-Bold (Courier-Bold) ;
+/Courier-BoldOblique (Courier-BoldOblique) ;
+/Courier-Oblique (Courier-Oblique) ;
+/Helvetica (Helvetica) ;
+/Helvetica-Bold (Helvetica-Bold) ;
+/Helvetica-BoldOblique (Helvetica-BoldOblique) ;
+/Helvetica-Oblique (Helvetica-Oblique) ;
+/LubalinGraph-Book (LubalinGraph-Book) ;
+/LubalinGraph-BookOblique (LubalinGraph-BookOblique) ;
+/LubalinGraph-Demi (LubalinGraph-Demi) ;
+/LubalinGraph-DemiOblique (LubalinGraph-DemiOblique) ;
+/NewCenturySchlbk-Bold (NewCenturySchlbk-Bold) ;
+/NewCenturySchlbk-BoldItalic (NewCenturySchlbk-BoldItalic) ;
+/NewCenturySchlbk-Italic (NewCenturySchlbk-Italic) ;
+/NewCenturySchlbk-Roman (NewCenturySchlbk-Roman) ;
+/Souvenir-Demi (Souvenir-Demi) ;
+/Souvenir-DemiItalic (Souvenir-DemiItalic) ;
+/Souvenir-Light (Souvenir-Light) ;
+/Souvenir-LightItalic (Souvenir-LightItalic) ;
+/Symbol (Symbol) ;
+/Times-Bold (Times-Bold) ;
+/Times-BoldItalic (Times-BoldItalic) ;
+/Times-Italic (Times-Italic) ;
+/Times-Roman (Times-Roman) ;
+
+% Fonts distributed as part of ghostscript
+
+/Bookman-Demi (pbkd.gsf) ;
+/Bookman-DemiItalic (pbkdi.gsf) ;
+/Bookman-Light (pbkl.gsf) ;
+/Bookman-LightItalic (pbkli.gsf) ;
+/Calligraphic-Hiragana (fhirw.gsf) ;
+/Calligraphic-Katakana (fkarw.gsf) ;
+/CharterBT-Bold (bchb.pfa) ;
+/CharterBT-BoldItalic (bchbi.pfa) ;
+/CharterBT-Italic (bchri.pfa) ;
+/CharterBT-Roman (bchr.pfa) ;
+/Hershey-Gothic-English (hrger.pfa) ;
+/Hershey-Gothic-English-Bold (hrgerb.gsf) ;
+/Hershey-Gothic-English-Oblique (hrgero.gsf) ;
+/Hershey-Gothic-English-SemiBold (hrgerd.gsf) ;
+/Hershey-Gothic-German (hrgrr.pfa) ;
+/Hershey-Gothic-German-Bold (hrgrrb.gsf) ;
+/Hershey-Gothic-German-Oblique (hrgrro.gsf) ;
+/Hershey-Gothic-Italian (hritr.pfa) ;
+/Hershey-Gothic-Italian-Bold (hritrb.gsf) ;
+/Hershey-Gothic-Italian-Oblique (hritro.gsf) ;
+/Hershey-Greek-Complex (hrgkc.gsf) ;
+/Hershey-Greek-Simplex (hrgks.gsf) ;
+/Hershey-Plain (hrplr.gsf) ;
+/Hershey-Plain-Bold (hrplrb.gsf) ;
+/Hershey-Plain-Bold-Oblique (hrplrbo.gsf) ;
+/Hershey-Plain-Duplex (hrpld.pfa) ;
+/Hershey-Plain-Duplex-Bold (hrpldb.gsf) ;
+/Hershey-Plain-Duplex-Bold-Italic (hrpldbi.gsf) ;
+/Hershey-Plain-Duplex-Italic (hrpldi.pfa) ;
+/Hershey-Plain-Oblique (hrplro.gsf) ;
+/Hershey-Plain-Simplex (hrpls.gsf) ;
+/Hershey-Plain-Simplex-Bold (hrplsb.gsf) ;
+/Hershey-Plain-Simplex-Bold-Oblique (hrplsbo.gsf) ;
+/Hershey-Plain-Simplex-Oblique (hrplso.gsf) ;
+/Hershey-Plain-Triplex (hrplt.pfa) ;
+/Hershey-Plain-Triplex-Bold (hrpltb.gsf) ;
+/Hershey-Plain-Triplex-Bold-Italic (hrpltbi.gsf) ;
+/Hershey-Plain-Triplex-Italic (hrplti.pfa) ;
+/Hershey-Script-Complex (hrscc.pfa) ;
+/Hershey-Script-Complex-Bold (hrsccb.gsf) ;
+/Hershey-Script-Complex-Oblique (hrscco.gsf) ;
+/Hershey-Script-Simplex (hrscs.pfa) ;
+/Hershey-Script-Simplex-Bold (hrscsb.gsf) ;
+/Hershey-Script-Simplex-Oblique (hrscso.gsf) ;
+/Hershey-Symbol (hrsyr.gsf) ;
+/NimbusRomanNo9L-Regular (n021003l.gsf) ;
+/NimbusSansL-Regular (n019003l.gsf) ;
+/Palatino-Bold (pplb.gsf) ;
+/Palatino-BoldItalic (pplbi.gsf) ;
+/Palatino-Italic (pplri.gsf) ;
+/Palatino-Roman (pplr.gsf) ;
+/Shareware-Cyrillic-Italic (fcyri.gsf) ;
+/Shareware-Cyrillic-Regular (fcyr.gsf) ;
+/URWAntiquaT-RegularCondensed (u003043t.gsf) ;
+/URWGroteskT-Bold (u004006t.gsf) ;
+/Utopia-Bold (putb.pfa) ;
+/Utopia-BoldItalic (putbi.pfa) ;
+/Utopia-Italic (putri.pfa) ;
+/Utopia-Regular (putr.pfa) ;
+/ZapfChancery (zcr.gsf) ;
+/ZapfChancery-Bold (zcb.gsf) ;
+/ZapfChancery-Oblique (zcro.gsf) ;
+/ZapfDingbats (pzdr.gsf) ;
+
+% Font aliases
+
+/Charter-Roman /CharterBT-Roman ;
+/Charter-Italic /CharterBT-Italic ;
+/Charter-Bold /CharterBT-Bold ;
+/Charter-BoldItalic /CharterBT-BoldItalic ;
+/Courier-BoldItalic /Courier-BoldOblique ;
+/Courier-Italic /Courier-Oblique ;
+/Cyrillic /Shareware-Cyrillic-Regular ;
+/Cyrillic-Italic /Shareware-Cyrillic-Italic ;
+/Cyrillic-Regular /Shareware-Cyrillic-Regular ;
+/Helvetica-Narrow-Bold /Helvetica-Narrow ;
+/ZapfChancery-MediumItalic /ZapfChancery-Oblique ;
diff --git a/lib/Fontmap.VMS b/lib/Fontmap.VMS
new file mode 100644
index 00000000..210dd736
--- /dev/null
+++ b/lib/Fontmap.VMS
@@ -0,0 +1,438 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+% fontmap.vms - Ghostscript fontmap for VAX/VMS systems with DECwindows/Motif.
+%
+% Mathog, 14-SEP-2000. Modified slightly from that provided by 6.01.
+% Changed to use Courier font from Decwindows instead of Ghostscript
+% The hershey fonts are listed, but they are not constructed during a regular
+% build of the package.
+%
+% **************************
+%Uses all the XDPS Outline fonts (Type 1 fonts) provided with Motif.
+%
+%XDPS on VAX/VMS does not have Bookman, Palatino and ZapfChancery fonts, so
+%we still have to use the Ghostscript fonts for those. Helvetica-Narrow is also
+%missing. But then you get the LubalinGraph and Souvenir fonts which are just
+%beautiful!
+
+/AvantGarde-Book
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]AVANTGARDE-BOOK.XDPS$OUTLINE) ;
+/AvantGarde-BookOblique
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]AVANTGARDE-BOOKOBLIQUE.XDPS$OUTLINE) ;
+/AvantGarde-Demi
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]AVANTGARDE-DEMI.XDPS$OUTLINE) ;
+/AvantGarde-DemiOblique
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]AVANTGARDE-DEMIOBLIQUE.XDPS$OUTLINE) ;
+/Courier-Bold
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]COURIER-BOLD.XDPS$OUTLINE) ;
+/Courier-BoldOblique
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]COURIER-BOLDOBLIQUE.XDPS$OUTLINE) ;
+/Courier-Oblique
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]COURIER-OBLIQUE.XDPS$OUTLINE) ;
+/Courier
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]COURIER.XDPS$OUTLINE) ;
+/Helvetica-Bold
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]HELVETICA-BOLD.XDPS$OUTLINE) ;
+/Helvetica-BoldOblique
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]HELVETICA-BOLDOBLIQUE.XDPS$OUTLINE) ;
+/Helvetica-Oblique
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]HELVETICA-OBLIQUE.XDPS$OUTLINE) ;
+/Helvetica
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]HELVETICA.XDPS$OUTLINE) ;
+/LubalinGraph-Book
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]LUBALINGRAPH-BOOK.XDPS$OUTLINE) ;
+/LubalinGraph-BookOblique
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]LUBALINGRAPH-BOOKOBLIQUE.XDPS$OUTLINE) ;
+/LubalinGraph-Demi
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]LUBALINGRAPH-DEMI.XDPS$OUTLINE) ;
+/LubalinGraph-DemiOblique
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]LUBALINGRAPH-DEMIOBLIQUE.XDPS$OUTLINE) ;
+/NewCenturySchlbk-Roman
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]NEWCENTURYSCHLBK-ROMAN.XDPS$OUTLINE) ;
+/NewCenturySchlbk-Italic
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]NEWCENTURYSCHLBK-ITALIC.XDPS$OUTLINE) ;
+/NewCenturySchlbk-Bold
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]NEWCENTURYSCHLBK-BOLD.XDPS$OUTLINE) ;
+/NewCenturySchlbk-BoldItalic
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]NEWCENTURYSCHLBK-BOLDITALIC.XDPS$OUTLINE) ;
+/Souvenir-Light
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]SOUVENIR-LIGHT.XDPS$OUTLINE) ;
+/Souvenir-LightItalic
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]SOUVENIR-LIGHTITALIC.XDPS$OUTLINE) ;
+/Souvenir-Demi
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]SOUVENIR-DEMI.XDPS$OUTLINE) ;
+/Souvenir-DemiItalic
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]SOUVENIR-DEMIITALIC.XDPS$OUTLINE) ;
+%If you want the Apple symbol (SIC!) then remove the comment (%)
+%in front of character 240 in the following file (he he he)
+/Symbol
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]SYMBOL.XDPS$OUTLINE) ;
+/Times-Roman
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]TIMES-ROMAN.XDPS$OUTLINE) ;
+/Times-Italic
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]TIMES-ITALIC.XDPS$OUTLINE) ;
+/Times-Bold
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]TIMES-BOLD.XDPS$OUTLINE) ;
+/Times-BoldItalic
+ (SYS$COMMON:[SYSFONT.XDPS.OUTLINE]TIMES-BOLDITALIC.XDPS$OUTLINE) ;
+
+%
+%
+% Fonts contributed by:
+% URW++ Design and Development Incorporated
+% Poppenbuetteler Bogen 29A
+% D-22399 Hamburg
+% Germany
+% tel. +49 (40) 60 60 50
+% fax +49 (40) 60 60 51 11
+% http://www.urwpp.de
+% for distribution under the GNU License and Aladdin Free Public License.
+% See the notice at the head of this Fontmap file for licensing terms.
+% Each of these fonts is individually covered by the license:
+% for licensing purposes, they are not "part of" any larger entity.
+% The following notice applies to these fonts:
+%
+% Copyright URW Software, Copyright 1994 by URW.
+%
+
+% Actual fonts
+
+/URWBookmanL-DemiBold (b018015l.pfb) ;
+/URWBookmanL-DemiBoldItal (b018035l.pfb) ;
+/URWBookmanL-Ligh (b018012l.pfb) ;
+/URWBookmanL-LighItal (b018032l.pfb) ;
+
+/NimbusMonL-Regu (n022003l.pfb) ;
+/NimbusMonL-ReguObli (n022023l.pfb) ;
+/NimbusMonL-Bold (n022004l.pfb) ;
+/NimbusMonL-BoldObli (n022024l.pfb) ;
+
+/URWGothicL-Book (a010013l.pfb) ;
+/URWGothicL-BookObli (a010033l.pfb) ;
+/URWGothicL-Demi (a010015l.pfb) ;
+/URWGothicL-DemiObli (a010035l.pfb) ;
+
+/NimbusSanL-Regu (n019003l.pfb) ;
+/NimbusSanL-ReguItal (n019023l.pfb) ;
+/NimbusSanL-Bold (n019004l.pfb) ;
+/NimbusSanL-BoldItal (n019024l.pfb) ;
+
+/NimbusSanL-ReguCond (n019043l.pfb) ;
+/NimbusSanL-ReguCondItal (n019063l.pfb) ;
+/NimbusSanL-BoldCond (n019044l.pfb) ;
+/NimbusSanL-BoldCondItal (n019064l.pfb) ;
+
+/URWPalladioL-Roma (p052003l.pfb) ;
+/URWPalladioL-Ital (p052023l.pfb) ;
+/URWPalladioL-Bold (p052004l.pfb) ;
+/URWPalladioL-BoldItal (p052024l.pfb) ;
+
+/CenturySchL-Roma (c059013l.pfb) ;
+/CenturySchL-Ital (c059033l.pfb) ;
+/CenturySchL-Bold (c059016l.pfb) ;
+/CenturySchL-BoldItal (c059036l.pfb) ;
+
+/NimbusRomNo9L-Regu (n021003l.pfb) ;
+/NimbusRomNo9L-ReguItal (n021023l.pfb) ;
+/NimbusRomNo9L-Medi (n021004l.pfb) ;
+/NimbusRomNo9L-MediItal (n021024l.pfb) ;
+
+/StandardSymL (s050000l.pfb) ;
+
+/URWChanceryL-MediItal (z003034l.pfb) ;
+
+/Dingbats (d050000l.pfb) ;
+
+
+% Aliases
+
+/Bookman-Demi /URWBookmanL-DemiBold ;
+/Bookman-DemiItalic /URWBookmanL-DemiBoldItal ;
+/Bookman-Light /URWBookmanL-Ligh ;
+/Bookman-LightItalic /URWBookmanL-LighItal ;
+
+%/Courier /NimbusMonL-Regu ;
+%/Courier-Oblique /NimbusMonL-ReguObli ;
+%/Courier-Bold /NimbusMonL-Bold ;
+%/Courier-BoldOblique /NimbusMonL-BoldObli ;
+
+%/AvantGarde-Book /URWGothicL-Book ;
+%/AvantGarde-BookOblique /URWGothicL-BookObli ;
+%/AvantGarde-Demi /URWGothicL-Demi ;
+%/AvantGarde-DemiOblique /URWGothicL-DemiObli ;
+
+%/Helvetica /NimbusSanL-Regu ;
+%/Helvetica-Oblique /NimbusSanL-ReguItal ;
+%/Helvetica-Bold /NimbusSanL-Bold ;
+%/Helvetica-BoldOblique /NimbusSanL-BoldItal ;
+
+/Helvetica-Narrow /NimbusSanL-ReguCond ;
+/Helvetica-Narrow-Oblique /NimbusSanL-ReguCondItal ;
+/Helvetica-Narrow-Bold /NimbusSanL-BoldCond ;
+/Helvetica-Narrow-BoldOblique /NimbusSanL-BoldCondItal ;
+
+/Palatino-Roman /URWPalladioL-Roma ;
+/Palatino-Italic /URWPalladioL-Ital ;
+/Palatino-Bold /URWPalladioL-Bold ;
+/Palatino-BoldItalic /URWPalladioL-BoldItal ;
+
+%/NewCenturySchlbk-Roman /CenturySchL-Roma ;
+%/NewCenturySchlbk-Italic /CenturySchL-Ital ;
+%/NewCenturySchlbk-Bold /CenturySchL-Bold ;
+%/NewCenturySchlbk-BoldItalic /CenturySchL-BoldItal ;
+
+%/Times-Roman /NimbusRomNo9L-Regu ;
+%/Times-Italic /NimbusRomNo9L-ReguItal ;
+%/Times-Bold /NimbusRomNo9L-Medi ;
+%/Times-BoldItalic /NimbusRomNo9L-MediItal ;
+
+%/Symbol /StandardSymL ;
+
+/ZapfChancery-MediumItalic /URWChanceryL-MediItal ;
+
+/ZapfDingbats /Dingbats ;
+
+
+%
+%
+% Type 1 fonts contributed to the X11R5 distribution.
+%
+
+% The following notice accompanied the Charter fonts.
+%
+% (c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA.
+%
+% You are hereby granted permission under all Bitstream propriety rights
+% to use, copy, modify, sublicense, sell, and redistribute the 4 Bitstream
+% Charter (r) Type 1 outline fonts and the 4 Courier Type 1 outline fonts
+% for any purpose and without restriction; provided, that this notice is
+% left intact on all copies of such fonts and that Bitstream's trademark
+% is acknowledged as shown below on all unmodified copies of the 4 Charter
+% Type 1 fonts.
+%
+% BITSTREAM CHARTER is a registered trademark of Bitstream Inc.
+/CharterBT-Roman (bchr.pfa) ;
+/CharterBT-Italic (bchri.pfa) ;
+/CharterBT-Bold (bchb.pfa) ;
+/CharterBT-BoldItalic (bchbi.pfa) ;
+%Charter to CharterBT aliasing
+/Charter-Roman /CharterBT-Roman ;
+/Charter-Italic /CharterBT-Italic ;
+/Charter-Bold /CharterBT-Bold ;
+/Charter-BoldItalic /CharterBT-BoldItalic ;
+
+% IBM Courier - Copyright (c) IBM Corporation 1990, 1991
+%/Courier (ncrr.pfa) ;
+%/Courier-Italic (ncrri.pfa) ;
+%/Courier-Bold (ncrb.pfa) ;
+%/Courier-BoldItalic (ncrbi.pfa) ;
+%Oblique to Italic aliasing
+%/Courier-Oblique /Courier-Italic ;
+%/Courier-BoldOblique /Courier-BoldItalic ;
+/Courier-Italic /Courier-Oblique ;
+/Courier-BoldItalic /Courier-BoldOblique ;
+
+% The following notice accompanied the Utopia font:
+%
+% Permission to use, reproduce, display and distribute the listed
+% typefaces is hereby granted, provided that the Adobe Copyright notice
+% appears in all whole and partial copies of the software and that the
+% following trademark symbol and attribution appear in all unmodified
+% copies of the software:
+%
+% Copyright (c) 1989 Adobe Systems Incorporated
+% Utopia (R)
+% Utopia is a registered trademark of Adobe Systems Incorporated
+%
+% The Adobe typefaces (Type 1 font program, bitmaps and Adobe Font
+% Metric files) donated are:
+%
+% Utopia Regular
+% Utopia Italic
+% Utopia Bold
+% Utopia Bold Italic
+
+/Utopia-Regular (putr.gsf) ;
+/Utopia-Italic (putri.gsf) ;
+/Utopia-Bold (putb.gsf) ;
+/Utopia-BoldItalic (putbi.gsf) ;
+
+%
+%
+% Fonts contributed by URW GmbH for distribution under the GNU License.
+% The following notice accompanied these fonts:
+%
+% U004006T URW Grotesk 2031 Bold PostScript Type 1 Font Program
+% U003043T URW Antiqua 2051 Regular Condensed PostScript Type 1 Font Program
+%
+% Copyright (c) 1992 URW GmbH, Hamburg, Germany
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; wihtout even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+% See the GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 U.S.A.
+%
+% Address:
+% URW GmbH
+% PC Support
+% Harksheider Strasse 102
+% 2000 Hamburg 65
+% Germany
+% Phone: +49 40 60 60 50 (Reception)
+% Phone: +49 40 60 60 52 30 (PC Support)
+% Fax : +49 40 60 60 52 52
+%
+
+/URWAntiquaT-RegularCondensed (u003043t.gsf) ;
+/URWGroteskT-Bold (u004006t.gsf) ;
+
+%
+%
+% Shareware Kana fonts. These are subject to the following notice:
+%
+% These copyrighted fonts were developed by Kevin Hartig. Permission is
+% granted to freely distribute them in entirety along with this statement.
+% This is shareware. If you decide to use these fonts please contribute
+% $10 US to help support further freeware and shareware software development.
+% Questions and comments may be sent to:
+%
+% hartig@fsl.noaa.gov
+% khartig@nyx.cs.du.edu
+%
+% Kevin Hartig
+% 1126 Collyer Street
+% Longmont, CO 80501 USA
+%
+% copyright 1993.
+
+% Hiragana and Katakana fonts. The character names are inappropriate,
+% and the encoding is probably not related to any known standard.
+
+/Calligraphic-Hiragana (fhirw.gsf) ;
+/Calligraphic-Katakana (fkarw.gsf) ;
+
+%
+%
+% Public-domain fonts. These have no copyright, and are of unknown quality.
+
+% Cyrillic fonts. The character names are inappropriate,
+% and the encoding is probably not related to any known standard.
+
+/Shareware-Cyrillic-Regular (fcyr.gsf) ;
+/Shareware-Cyrillic-Italic (fcyri.gsf) ;
+
+% Aliases
+/Cyrillic /Cyrillic-Regular ;
+/Cyrillic-Regular /Shareware-Cyrillic-Regular ;
+/Cyrillic-Italic /Shareware-Cyrillic-Italic ;
+
+%
+%
+% Fonts converted from Hershey outlines. These are constructed and
+% maintained manually. These are also in the public domain.
+%
+% The suggested UniqueID's and filenames are constructed differently for
+% these than for the ones above, because of the strange way that the Hershey
+% fonts were constructed. The scheme for these looks like:
+%
+% 42TTXY0
+%
+% TT = typeface, X = ``class'', Y = variation
+%
+% The typeface names and numbers are listed in fonts.mak.
+%
+% class:
+% 0 = normal = r
+% 1 = simplex = s
+% 2 = complex = c
+% 3 = triplex = t
+% 4 = duplex = d
+%
+% variation:
+% 0 = normal (omitted)
+% 1 = oblique = o
+% 2 = italic = i
+% 3 = bold = b
+% 4 = bold oblique = bo
+% 5 = bold italic = bi
+%
+
+% Fonts created by Thomas Wolff <wolff@inf.fu-berlin.de>, by adding
+% accents, accented characters, and various other non-alphabetics
+% to the original Hershey fonts. These are "freeware", not to be sold.
+
+/Hershey-Gothic-English (hrger.pfa) ; % 5066533
+/Hershey-Gothic-German (hrgrr.pfa) ;
+/Hershey-Gothic-Italian (hritr.pfa) ;
+
+/Hershey-Plain-Duplex (hrpld.pfa) ;
+/Hershey-Plain-Duplex-Italic (hrpldi.pfa) ;
+/Hershey-Plain-Triplex (hrplt.pfa) ;
+/Hershey-Plain-Triplex-Italic (hrplti.pfa) ;
+
+/Hershey-Script-Complex (hrscc.pfa) ;
+/Hershey-Script-Simplex (hrscs.pfa) ; % 5066541
+
+% Fonts created algorithmically from the above.
+
+/Hershey-Gothic-English-Bold (hrgerb.gsf) ; % 5066542
+/Hershey-Gothic-English-Oblique (hrgero.gsf) ;
+/Hershey-Gothic-English-SemiBold (hrgerd.gsf) ;
+/Hershey-Gothic-German-Bold (hrgrrb.gsf) ;
+/Hershey-Gothic-German-Oblique (hrgrro.gsf) ;
+/Hershey-Gothic-Italian-Bold (hritrb.gsf) ;
+/Hershey-Gothic-Italian-Oblique (hritro.gsf) ;
+
+/Hershey-Plain-Duplex-Bold (hrpldb.gsf) ;
+/Hershey-Plain-Duplex-Bold-Italic (hrpldbi.gsf) ;
+/Hershey-Plain-Triplex-Bold (hrpltb.gsf) ;
+/Hershey-Plain-Triplex-Bold-Italic (hrpltbi.gsf) ;
+
+/Hershey-Script-Complex-Bold (hrsccb.gsf) ;
+/Hershey-Script-Complex-Oblique (hrscco.gsf) ;
+/Hershey-Script-Simplex-Bold (hrscsb.gsf) ;
+/Hershey-Script-Simplex-Oblique (hrscso.gsf) ; % 5066556
+
+% Fonts consisting only of characters from the original Hershey
+% distribution. These are Type 3 fonts.
+
+/Hershey-Greek-Complex (hrgkc.gsf) ; % 5066557
+/Hershey-Greek-Simplex (hrgks.gsf) ;
+
+/Hershey-Plain (hrplr.gsf) ;
+/Hershey-Plain-Simplex (hrpls.gsf) ; % 5066560
+
+% Fonts created algorithmically from the above.
+
+/Hershey-Plain-Bold (hrplrb.gsf) ; % 5066561
+/Hershey-Plain-Bold-Oblique (hrplrbo.gsf) ;
+/Hershey-Plain-Oblique (hrplro.gsf) ;
+/Hershey-Plain-Simplex-Bold (hrplsb.gsf) ;
+/Hershey-Plain-Simplex-Bold-Oblique (hrplsbo.gsf) ;
+/Hershey-Plain-Simplex-Oblique (hrplso.gsf) ; % 5066566
+
+% This font, and only this font among the Hershey fonts, uses
+% the SymbolEncoding.
+
+/Hershey-Symbol (hrsyr.gsf) ; % 5066567
diff --git a/lib/Info-macos.plist b/lib/Info-macos.plist
new file mode 100644
index 00000000..9ece6edc
--- /dev/null
+++ b/lib/Info-macos.plist
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+ <key>CFBundleIdentifier</key>
+ <string>com.ghostscript.Ghostscript</string>
+ <key>CFBundleName</key>
+ <string>Ghostscript</string>
+ <key>CFBundleShortVersionString</key>
+ <string>703</string>
+ <key>NSExecutable</key>
+ <string>Ghostscript</string>
+</dict>
+</plist>
diff --git a/lib/PDFA_def.ps b/lib/PDFA_def.ps
new file mode 100644
index 00000000..f77c90ef
--- /dev/null
+++ b/lib/PDFA_def.ps
@@ -0,0 +1,79 @@
+%!
+% This is a sample prefix file for creating a PDF/A document.
+% Users should modify entries marked with "Customize".
+% This assumes an ICC profile resides in the file (srgb.icc),
+% in the current directory unless the user modifies the corresponding line below.
+
+% Define entries in the document Info dictionary :
+[ /Title (Title) % Customise
+ /DOCINFO pdfmark
+
+% Define an ICC profile :
+/ICCProfile (srgb.icc) % Customise
+def
+
+[/_objdef {icc_PDFA} /type /stream /OBJ pdfmark
+
+%% This code attempts to set the /N (number of components) key for the ICC colour space.
+%% To do this it checks the ColorConversionStrategy or the device ProcessColorModel if
+%% ColorConversionStrategy is not set.
+%% This is not 100% reliable. A better solution is for the user to edit this and replace
+%% the code between the ---8<--- lines with a simple declaration like:
+%% /N 3
+%% where the value of N is the number of components from the profile defined in /ICCProfile above.
+%%
+[{icc_PDFA}
+<<
+%% ----------8<--------------8<-------------8<--------------8<----------
+ systemdict /ColorConversionStrategy known {
+ systemdict /ColorConversionStrategy get cvn dup /Gray eq {
+ pop /N 1 false
+ }{
+ dup /RGB eq {
+ pop /N 3 false
+ }{
+ /CMYK eq {
+ /N 4 false
+ }{
+ (ColorConversionStrategy not a device space, falling back to ProcessColorModel, output may not be valid PDF/A.)=
+ true
+ } ifelse
+ } ifelse
+ } ifelse
+ } {
+ (ColorConversionStrategy not set, falling back to ProcessColorModel, output may not be valid PDF/A.)=
+ true
+ } ifelse
+
+ {
+ currentpagedevice /ProcessColorModel get
+ dup /DeviceGray eq {
+ pop /N 1
+ }{
+ dup /DeviceRGB eq {
+ pop /N 3
+ }{
+ dup /DeviceCMYK eq {
+ pop /N 4
+ } {
+ (ProcessColorModel not a device space.)=
+ /ProcessColorModel cvx /rangecheck signalerror
+ } ifelse
+ } ifelse
+ } ifelse
+ } if
+%% ----------8<--------------8<-------------8<--------------8<----------
+
+>> /PUT pdfmark
+[{icc_PDFA} ICCProfile (r) file /PUT pdfmark
+
+% Define the output intent dictionary :
+
+[/_objdef {OutputIntent_PDFA} /type /dict /OBJ pdfmark
+[{OutputIntent_PDFA} <<
+ /Type /OutputIntent % Must be so (the standard requires).
+ /S /GTS_PDFA1 % Must be so (the standard requires).
+ /DestOutputProfile {icc_PDFA} % Must be so (see above).
+ /OutputConditionIdentifier (sRGB) % Customize
+>> /PUT pdfmark
+[{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark
diff --git a/lib/PDFX_def.ps b/lib/PDFX_def.ps
new file mode 100644
index 00000000..7dfadce2
--- /dev/null
+++ b/lib/PDFX_def.ps
@@ -0,0 +1,104 @@
+%!
+% This is a sample prefix file for creating a PDF/X-3 document.
+% Users should modify entries marked with "Customize".
+% This assumes an ICC profile resides in the file (ISO Coated sb.icc)
+% in the current directory unless the user modifies the corresponding line below.
+
+% First up, attempt to ensure the user has set ColorConversionStrategy correctly.
+% PDF/X-3 only permits Gray or CMYK in the output.
+%
+systemdict /ColorConversionStrategy known {
+ systemdict /ColorConversionStrategy get cvn dup /Gray ne exch /CMYK ne and
+} {
+ (\nERROR: ColorConversionStrategy not set.)=
+ true
+} ifelse
+{ (ERROR: ColorConversionStrategy must be /DeviceGray or /DeviceCMYK.)=
+ /ColorConversionStrategy cvx /rangecheck signalerror
+} if
+
+
+% Define entries in the document Info dictionary :
+%
+[ /GTS_PDFXVersion (PDF/X-3:2002) % Must be so (the standard requires).
+ /Title (Title) % Customize.
+ /Trapped /False % Must be so (Ghostscript doesn't provide other).
+/DOCINFO pdfmark
+
+
+/ICCProfile (ISO Coated sb.icc) def % Customize or remove.
+
+% Define an ICC profile in the output, if the user specified one.
+%
+currentdict /ICCProfile known {
+ [/_objdef {icc_PDFX} /type /stream /OBJ pdfmark
+
+% This code attempts to set the /N (number of components) key for the ICC colour space.
+% To do this it checks the ColorConversionStrategy or the device ProcessColorModel if
+% ColorConversionStrategy is not set.
+% This is not 100% reliable. A better solution is for the user to edit this and replace
+% the code between the ---8<--- lines with a simple declaration like:
+% /N 3
+% where the value of N is the number of components from the profile defined in /ICCProfile above.
+% Note, if you don't set ColorConversionStrategy, the output will likely be invalid anyway.
+ [{icc_PDFX} <<
+% ----------8<--------------8<-------------8<--------------8<----------
+ systemdict /ColorConversionStrategy known {
+ systemdict /ColorConversionStrategy get cvn dup /Gray eq {
+ pop /N 1 false
+ }{
+ dup /RGB eq {
+ (RGB is not a valid ColorConversionStrategy for PDF/X output)=
+ /ColorConversionStrategycvx /rangecheck signalerror
+ }{
+ /CMYK eq {
+ /N 4 false
+ }{
+ (ColorConversionStrategy not a device space, falling back to ProcessColorModel, output may not be valid PDF/X.)=
+ true
+ } ifelse
+ } ifelse
+ } ifelse
+ } {
+ (ColorConversionStrategy not set, falling back to ProcessColorModel, output may not be valid PDF/X.)=
+ true
+ } ifelse
+
+ {
+ currentpagedevice /ProcessColorModel get
+ dup /DeviceGray eq {
+ pop /N 1
+ }{
+ dup /DeviceRGB eq {
+ (RGB is not a valid ProcessColorModel for PDF/X output)=
+ /ColorConversionStrategycvx /rangecheck signalerror
+ }{
+ dup /DeviceCMYK eq {
+ pop /N 4
+ } {
+ (ProcessColorModel not a device space.)=
+ /ProcessColorModel cvx /rangecheck signalerror
+ } ifelse
+ } ifelse
+ } ifelse
+ } if
+% ----------8<--------------8<-------------8<--------------8<----------
+ >> /PUT pdfmark
+ [{icc_PDFX} ICCProfile (r) file /PUT pdfmark
+} if
+
+% Define the output intent dictionary :
+
+[/_objdef {OutputIntent_PDFX} /type /dict /OBJ pdfmark
+[{OutputIntent_PDFX} <<
+ /Type /OutputIntent % Must be so (the standard requires).
+ /S /GTS_PDFX % Must be so (the standard requires).
+ /OutputCondition (Commercial and specialty printing) % Customize
+ /Info (none) % Customize
+ /OutputConditionIdentifier (CGATS TR001) % Customize
+ /RegistryName (http://www.color.org) % Must be so (the standard requires).
+ currentdict /ICCProfile known {
+ /DestOutputProfile {icc_PDFX} % Must be so (see above).
+ } if
+>> /PUT pdfmark
+[{Catalog} <</OutputIntents [ {OutputIntent_PDFX} ]>> /PUT pdfmark
diff --git a/lib/acctest.ps b/lib/acctest.ps
new file mode 100644
index 00000000..2af46bef
--- /dev/null
+++ b/lib/acctest.ps
@@ -0,0 +1,99 @@
+%!
+% Check that operators do their access tests correctly.
+
+% proc dotest => .
+/dotest
+ {
+ dup
+ mark
+ exch
+ stopped not % False if error, true if no error.
+ { (Allowed access: ) print cleartomark == }
+ if
+ clear
+ }
+def
+
+0 0 moveto % So the show commands don't bomb because of nocurrentpoint.
+
+{ [1 2] executeonly aload } dotest
+{ (string) executeonly (seek) anchorsearch } dotest
+{ (string) (seek) executeonly anchorsearch } dotest
+{ 100 101 (string) noaccess ashow} dotest
+{ 100 1 array readonly astore } dotest
+{ 100 101 102 103 104 (string) noaccess awidthshow } dotest
+{ 1 dict noacess begin } dotest
+{ 1 array executeonly 1 array copy } dotest
+{ 1 array 1 array readonly copy } dotest
+{ 1 dict noaccess 1 dict copy } dotest
+{ 1 dict 1 dict readonly copy } dotest
+{ 1 string executeonly 1 string copy } dotest
+{ 1 string 1 string readonly copy } dotest
+{ (100) executeonly cvi } dotest
+{ (string) executeonly cvn } dotest
+{ (100.001) executeonly cvr } dotest
+{ 1 10 1 string readonly cvrs } dotest
+{ true 5 string readonly cvs } dotest
+{ 1 dict readonly begin /foo true def } dotest
+{ 10 array readonly dictstack } dotest
+{ 1 string executeonly 1 string eq } dotest
+{ 1 string 1 string executeonly eq } dotest
+{ 10 array readonly execstack } dotest
+{ 1 string noaccess executeonly } dotest
+{ 1 array noaccess executeonly } dotest
+{ 1 array executeonly { pop } forall } dotest
+{ 1 dict noaccess { pop pop } forall } dotest
+{ 1 string executeonly { pop } forall } dotest
+{ (string1) executeonly (string2) ge } dotest
+{ (string1) (string2) executeonly ge } dotest
+{ 1 array executeonly 0 get } dotest
+{ 1 dict noaccess /key get } dotest
+{ 1 string executeonly 0 get } dotest
+{ 1 array executeonly 0 1 getinterval } dotest
+{ 1 string executeonly 0 1 getinterval } dotest
+{ (string1) executeonly (string2) gt } dotest
+{ (string1) (string2) executeonly gt } dotest
+{ 1 dict noaccess /key known } dotest
+{ {} (string) executeonly kshow } dotest
+{ (string1) executeonly (string2) le } dotest
+{ (string1) (string2) executeonly le } dotest
+{ 1 array executeonly length } dotest
+{ 1 dict noaccess length } dotest
+{ 1 string executeonly length } dotest
+%%{ /foo 1 dict def foo begin /bar foo def bar noaccess pop /key load } dotest
+{ (string1) executeonly (string2) lt } dotest
+{ (string1) (string2) executeonly lt } dotest
+{ 1 dict noaccess maxlength } dotest
+{ 1 string executeonly 1 string ne } dotest
+{ 1 string 1 string executeonly ne } dotest
+%{ newpath 0 0 moveto (a) false charpath
+% {} {} {} {} pathforall closepath } dotest
+{ 1 array executeonly 0 put } dotest
+{ 1 dict noaccess /key put } dotest
+{ 1 string executeonly 0 put } dotest
+{ 1 array executeonly 0 1 putinterval } dotest
+{ 1 string executeonly 0 1 putinterval } dotest
+{ (access.ps) (r) file executeonly read } dotest
+{ (access.ps) (r) file executeonly 10 string readhexstring } dotest
+{ (access.ps) (r) file 10 string readonly readhexstring } dotest
+{ (access.ps) (r) file executeonly 100 string readline } dotest
+{ (access.ps) (r) file 100 string readonly readline } dotest
+{ (access.ps) (r) file executeonly 10 string readstring } dotest
+{ (access.ps) (r) file 10 string readonly readstring } dotest
+% run does not check for no read access?
+{ (string) executeonly (seek) search } dotest
+{ (string) (seek) executeonly search } dotest
+{ (string) executeonly show }
+%% some test for store.
+{ (string) executeonly stringwidth } dotest
+{ (access.ps) (r) file executeonly token } dotest
+{ (10) executeonly token } dotest
+{ /foo 1 dict def foo begin /bar foo def bar noaccess pop /key where } dotest
+{ 100 101 102 (string) noaccess widthshow } dotest
+{ (/tmp/_.ps) noaccess (w) file closefile } dotest
+{ (/tmp/_.ps) (w) noaccess file closefile } dotest
+{ (/tmp/_.ps) (w) file executeonly 100 write } dotest
+{ (/tmp/_.ps) (w) file executeonly 10 string writehexstring } dotest
+{ (/tmp/_.ps) (w) file 10 string executeonly writehexstring } dotest
+{ (/tmp/_.ps) (w) file executeonly 10 string writestring } dotest
+{ (/tmp/_.ps) (w) file 10 string executeonly writestring } dotest
diff --git a/lib/afmdiff.awk b/lib/afmdiff.awk
new file mode 100755
index 00000000..e9c237b4
--- /dev/null
+++ b/lib/afmdiff.awk
@@ -0,0 +1,151 @@
+#!/usr/bin/awk -f
+###=====================================================================
+### Read two Adobe Font Metric files, and compute tables of the
+### differences in character repertoire, declared widths (WX), and
+### bounding boxes.
+###
+### Usage:
+### awk -f afmdiff.awk file1.afm file2.afm
+###
+### Author:
+### Nelson H. F. Beebe
+### Center for Scientific Computing
+### University of Utah
+### Department of Mathematics, 322 INSCC
+### 155 S 1400 E RM 233
+### Salt Lake City, UT 84112-0090
+### USA
+### Email: beebe@math.utah.edu, beebe@acm.org, beebe@computer.org,
+### beebe@ieee.org (Internet)
+### WWW URL: http://www.math.utah.edu/~beebe
+### Telephone: +1 801 581 5254
+### FAX: +1 801 585 1640, +1 801 581 4148
+###
+########################################################################
+########################################################################
+########################################################################
+### ###
+### awkdiff.awk: compare two Adobe Font Metric files ###
+### ###
+### Copyright (C) 2000 Nelson H. F. Beebe ###
+### ###
+### This program is covered by the GNU General Public License (GPL), ###
+### version 2 or later, available as the file COPYING in the program ###
+### source distribution, and on the Internet at ###
+### ###
+### ftp://ftp.gnu.org/gnu/GPL ###
+### ###
+### http://www.gnu.org/copyleft/gpl.html ###
+### ###
+### This program is free software; you can redistribute it and/or ###
+### modify it under the terms of the GNU General Public License as ###
+### published by the Free Software Foundation; either version 2 of ###
+### the License, or (at your option) any later version. ###
+### ###
+### This program is distributed in the hope that it will be useful, ###
+### but WITHOUT ANY WARRANTY; without even the implied warranty of ###
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ###
+### GNU General Public License for more details. ###
+### ###
+### You should have received a copy of the GNU General Public ###
+### License along with this program; if not, write to the Free ###
+### Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, ###
+### MA 02111-1307 USA ###
+### ###
+### This program may also be distributed as part of AFPL ###
+### Ghostscript, under the terms of the Aladdin Free Public License ###
+### (the "License"). ###
+### ###
+### Every copy of AFPL Ghostscript must include a copy of the ###
+### License, normally in a plain ASCII text file named PUBLIC. The ###
+### License grants you the right to copy, modify and redistribute ###
+### AFPL Ghostscript, but only under certain conditions ###
+### described in the License. Among other things, the License ###
+### requires that the copyright notice and this notice be preserved ###
+### on all copies. ###
+### ###
+########################################################################
+########################################################################
+########################################################################
+#
+# [29-Apr-2000]
+#=======================================================================
+
+/^FontName/ { FontName[++NFontName] = $2 }
+
+
+/^C / {
+ if (NFontName == 1)
+ CharName1[$8]++
+ if (NFontName == 2)
+ CharName2[$8]++
+ }
+
+
+/^C / {
+ name = $8
+ if (name in WX)
+ {
+ if (WX[name] != $5)
+ WXDIFF[name] = WX[name] - $5
+ }
+ else
+ WX[name] = $5
+ }
+
+
+/^C / {
+ name = $8
+ bx = $13 - $11
+ if (name in BX)
+ {
+ if (BX[name] != bx)
+ BXDIFF[name] = BX[name] - bx
+ }
+ else
+ BX[name] = bx
+ }
+
+
+/^C / {
+ name = $8
+ by = $14 - $12
+ if (name in BY)
+ {
+ if (BY[name] != by)
+ BYDIFF[name] = BY[name] - by
+ }
+ else
+ BY[name] = by
+ }
+
+
+END {
+ Sortpipe = "sort -f | pr -3 -w80 -l1 -t"
+ print "Comparison of AFM metrics in files:", ARGV[1], ARGV[2]
+ print "Font names:", FontName[1], FontName[2]
+ show_name_diffs(FontName[2],CharName2, FontName[1],CharName1)
+ show_name_diffs(FontName[1],CharName1, FontName[2],CharName2)
+ show_num_diffs("WX width differences", WXDIFF)
+ show_num_diffs("Bounding box width differences", BXDIFF)
+ show_num_diffs("Bounding box height differences",BYDIFF)
+ }
+
+function show_name_diffs(font1,array1,font2,array2, name)
+{
+ print "\nChars from", font2, "missing from", font1 ":"
+ for (name in array2)
+ {
+ if (!(name in array1))
+ printf("%s\n", name) | Sortpipe
+ }
+ close(Sortpipe)
+}
+
+function show_num_diffs(title,array, name)
+{
+ printf("\n%s:\n", title)
+ for (name in array)
+ printf("%-15s\t%4d\n", name, array[name]) | Sortpipe
+ close(Sortpipe)
+}
diff --git a/lib/align.ps b/lib/align.ps
new file mode 100644
index 00000000..e73c2718
--- /dev/null
+++ b/lib/align.ps
@@ -0,0 +1,72 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Print a page that indicates the proper settings of Margins and HWMargins
+% for a given device. Requires a Level 2 system.
+
+% Reset the offset and margins.
+
+<<
+ /PageOffset [0 0]
+ /Margins [0 0]
+ /.HWMargins [0 0 0 0]
+>>
+setpagedevice
+<<
+ /ImagingBBox null
+>>
+setpagedevice
+
+% Determine the actual page size.
+
+clippath pathbbox newpath
+/y1 exch def /x1 exch def pop pop
+
+% Draw lines that should be exactly 1" in from each edge,
+% and should extend precisely to the edge of the paper.
+
+1 setlinewidth
+0 setgray
+72 0 moveto 0 y1 rlineto stroke
+0 72 moveto x1 0 rlineto stroke
+
+% Print the text in the middle of the page.
+
+/S 80 string def
+108 480 moveto
+/Helvetica 12 selectfont
+ { currentfile S readline pop dup (%END) eq { pop exit } if
+ gsave show grestore 0 -15 rmoveto
+ } loop
+Let the distance in inches from the left edge of the page to
+the vertical line be H, and from the bottom edge to the
+horizontal line be V; let the lengths of the gaps at the top
+and bottom of the vertical line be T and B respectively, and
+the gaps at the left and right of the horizontal line be L
+and R. For correct alignment of pages, put the following line
+in a file named (for example) margins.ps, and then mention
+margins.ps on the gs command line when printing any of your
+own files:
+
+ << /.HWMargins [ml mb mr mt] /Margins [x y] >> setpagedevice
+
+where
+ ml = L * 72, mb = B * 72, mr = R * 72, mt = T * 72,
+%END
+/res currentpagedevice /HWResolution get def
+( x = (1 - H) * ) show res 0 get =string cvs show
+(, y = (V - 1) * ) show res 1 get =string cvs show
+
+showpage
diff --git a/lib/bj8.rpd b/lib/bj8.rpd
new file mode 100644
index 00000000..fce6c2d4
--- /dev/null
+++ b/lib/bj8.rpd
@@ -0,0 +1,17 @@
+
+StartEntry: U_CanonBJC8200
+GSDriver: uniprint
+Description: {Canon BJC-8200 (UP)}
+About: { \
+ Canon BJC-8200 uniprint driver settings.\
+ }
+Resolution: {NA} {NA} {}
+ BitsPerPixel: {bj8pp12f} {1200x1200DpI, photo paper pro, color, rendered}
+ BitsPerPixel: {bj8hg12f} {1200x1200DpI, high gloss photo film, color, rendered}
+ BitsPerPixel: {bj8gc12f} {1200x1200DpI, glossy photo cards, color, rendered}
+ BitsPerPixel: {bj8oh06n} {600x600DpI, transparencies, color, rendered}
+ BitsPerPixel: {bj8ts06n} {600x600DpI, t-shirt transfer, color, rendered}
+ BitsPerPixel: {bj8pa06n} {600x600DpI, plain paper, color, rendered}
+
+EndEntry
+#
diff --git a/lib/bj8gc12f.upp b/lib/bj8gc12f.upp
new file mode 100644
index 00000000..005b2925
--- /dev/null
+++ b/lib/bj8gc12f.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (1200DpI)^2, glossy photo card, high quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/FSCMYK32
+-dupOutputFormat=/Canon
+-r1200x1200
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b 4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 71 0100 01
+ 1b28 64 0400 04b0 04b0
+ 1b28 63 0300 3005 04
+ 1b28 6c 0200 340d
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bj8hg12f.upp b/lib/bj8hg12f.upp
new file mode 100644
index 00000000..b176ee11
--- /dev/null
+++ b/lib/bj8hg12f.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (1200DpI)^2, high gloss photo, high quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/FSCMYK32
+-dupOutputFormat=/Canon
+-r1200x1200
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b 4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 71 0100 01
+ 1b28 64 0400 04b0 04b0
+ 1b28 63 0300 3006 04
+ 1b28 6c 0200 3406
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bj8oh06n.upp b/lib/bj8oh06n.upp
new file mode 100644
index 00000000..9bbf17e8
--- /dev/null
+++ b/lib/bj8oh06n.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (600DpI)^2, OHP, normal quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/FSCMYK32
+-dupOutputFormat=/Canon
+-r600x600
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b 4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 71 0100 01
+ 1b28 64 0400 0258 0258
+ 1b28 63 0300 3002 03
+ 1b28 6c 0200 3402
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bj8pa06n.upp b/lib/bj8pa06n.upp
new file mode 100644
index 00000000..1f2a26c5
--- /dev/null
+++ b/lib/bj8pa06n.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (600DpI)^2, plain paper, normal quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/FSCMYK32
+-dupOutputFormat=/Canon
+-r600x600
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b 4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 71 0100 01
+ 1b28 64 0400 0258 0258
+ 1b28 63 0300 3000 03
+ 1b28 6c 0200 3400
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bj8pp12f.upp b/lib/bj8pp12f.upp
new file mode 100644
index 00000000..c11c0192
--- /dev/null
+++ b/lib/bj8pp12f.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (1200DpI)^2, professional photo paper, highest quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/FSCMYK32
+-dupOutputFormat=/Canon
+-r1200x1200
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b 4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 71 0100 01
+ 1b28 64 0400 04b0 04b0
+ 1b28 63 0300 3009 04
+ 1b28 6c 0200 340d
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bj8ts06n.upp b/lib/bj8ts06n.upp
new file mode 100644
index 00000000..e74b809c
--- /dev/null
+++ b/lib/bj8ts06n.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 8200, (600DpI)^2, t-shirt transfer, normal quality"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/FSCMYK32
+-dupOutputFormat=/Canon
+-r600x600
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b 4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 71 0100 01
+ 1b28 64 0400 0258 0258
+ 1b28 63 0300 3003 03
+ 1b28 6c 0200 3403
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610a0.upp b/lib/bjc610a0.upp
new file mode 100644
index 00000000..5c388879
--- /dev/null
+++ b/lib/bjc610a0.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, plain paper high speed, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r360x360
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0058 0.0164 0.0301 0.0463 0.0648 0.0851 0.1073
+0.1311 0.1564 0.1832 0.2114 0.2408 0.2716 0.3035 0.3366
+0.3708 0.4061 0.4425 0.4798 0.5182 0.5576 0.5978 0.6391
+0.6812 0.7242 0.7681 0.8128 0.8584 0.9048 0.9520 1.0000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 100200
+ 1b28 64 0200 0168
+ 1b28 6c 0200 1400
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610a1.upp b/lib/bjc610a1.upp
new file mode 100644
index 00000000..e63c495c
--- /dev/null
+++ b/lib/bjc610a1.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, plain paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r360x360
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0058 0.0164 0.0301 0.0463 0.0648 0.0851 0.1073
+0.1311 0.1564 0.1832 0.2114 0.2408 0.2716 0.3035 0.3366
+0.3708 0.4061 0.4425 0.4798 0.5182 0.5576 0.5978 0.6391
+0.6812 0.7242 0.7681 0.8128 0.8584 0.9048 0.9520 1.0000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 100110
+ 1b28 64 0200 0168
+ 1b28 6c 0200 1400
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610a2.upp b/lib/bjc610a2.upp
new file mode 100644
index 00000000..6e0c7cff
--- /dev/null
+++ b/lib/bjc610a2.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, coated paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r360x360
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0058 0.0164 0.0301 0.0463 0.0648 0.0851 0.1073
+0.1311 0.1564 0.1832 0.2114 0.2408 0.2716 0.3035 0.3366
+0.3708 0.4061 0.4425 0.4798 0.5182 0.5576 0.5978 0.6391
+0.6812 0.7242 0.7681 0.8128 0.8584 0.9048 0.9520 1.0000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 101110
+ 1b28 64 0200 0168
+ 1b28 6c 0200 1410
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610a3.upp b/lib/bjc610a3.upp
new file mode 100644
index 00000000..58458e23
--- /dev/null
+++ b/lib/bjc610a3.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, transparency film, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r360x360
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 102110
+ 1b28 64 0200 0168
+ 1b28 6c 0200 1420
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610a4.upp b/lib/bjc610a4.upp
new file mode 100644
index 00000000..46e742b2
--- /dev/null
+++ b/lib/bjc610a4.upp
@@ -0,0 +1,45 @@
+-supModel="Canon BJC 610, 360x360DpI, back print film, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r360x360
+-dupYFlip
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0058 0.0164 0.0301 0.0463 0.0648 0.0851 0.1073
+0.1311 0.1564 0.1832 0.2114 0.2408 0.2716 0.3035 0.3366
+0.3708 0.4061 0.4425 0.4798 0.5182 0.5576 0.5978 0.6391
+0.6812 0.7242 0.7681 0.8128 0.8584 0.9048 0.9520 1.0000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 103110
+ 1b28 64 0200 0168
+ 1b28 6c 0200 1430
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610a5.upp b/lib/bjc610a5.upp
new file mode 100644
index 00000000..3fe187a9
--- /dev/null
+++ b/lib/bjc610a5.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, fabric sheet, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r360x360
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0058 0.0164 0.0301 0.0463 0.0648 0.0851 0.1073
+0.1311 0.1564 0.1832 0.2114 0.2408 0.2716 0.3035 0.3366
+0.3708 0.4061 0.4425 0.4798 0.5182 0.5576 0.5978 0.6391
+0.6812 0.7242 0.7681 0.8128 0.8584 0.9048 0.9520 1.0000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 104110
+ 1b28 64 0200 0168
+ 1b28 6c 0200 1850
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610a6.upp b/lib/bjc610a6.upp
new file mode 100644
index 00000000..4940871c
--- /dev/null
+++ b/lib/bjc610a6.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, glossy paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r360x360
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0058 0.0164 0.0301 0.0463 0.0648 0.0851 0.1073
+0.1311 0.1564 0.1832 0.2114 0.2408 0.2716 0.3035 0.3366
+0.3708 0.4061 0.4425 0.4798 0.5182 0.5576 0.5978 0.6391
+0.6812 0.7242 0.7681 0.8128 0.8584 0.9048 0.9520 1.0000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 105110
+ 1b28 64 0200 0168
+ 1b28 6c 0200 1460
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610a7.upp b/lib/bjc610a7.upp
new file mode 100644
index 00000000..90415239
--- /dev/null
+++ b/lib/bjc610a7.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, high gloss film, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r360x360
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 106110
+ 1b28 64 0200 0168
+ 1b28 6c 0200 1470
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610a8.upp b/lib/bjc610a8.upp
new file mode 100644
index 00000000..c173cfc5
--- /dev/null
+++ b/lib/bjc610a8.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 360x360DpI, high resolution paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r360x360
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0058 0.0164 0.0301 0.0463 0.0648 0.0851 0.1073
+0.1311 0.1564 0.1832 0.2114 0.2408 0.2716 0.3035 0.3366
+0.3708 0.4061 0.4425 0.4798 0.5182 0.5576 0.5978 0.6391
+0.6812 0.7242 0.7681 0.8128 0.8584 0.9048 0.9520 1.0000
+}"
+-dupCyanTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupYellowTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 107110
+ 1b28 64 0200 0168
+ 1b28 6c 0200 14a0
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610b1.upp b/lib/bjc610b1.upp
new file mode 100644
index 00000000..aa0d9442
--- /dev/null
+++ b/lib/bjc610b1.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, plain paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r720x720
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0029 0.0082 0.0151 0.0232 0.0324 0.0426 0.0537
+0.0655 0.0782 0.0916 0.1057 0.1204 0.1358 0.1517 0.1683
+0.1854 0.2030 0.2212 0.2399 0.2591 0.2788 0.2989 0.3195
+0.3406 0.3621 0.3840 0.4064 0.4292 0.4524 0.4760 0.5000
+}"
+-dupCyanTransfer="{
+0.0000 0.0004 0.0017 0.0037 0.0067 0.0104 0.0150 0.0204
+0.0266 0.0337 0.0416 0.0504 0.0599 0.0703 0.0816 0.0937
+0.1066 0.1203 0.1349 0.1503 0.1665 0.1836 0.2015 0.2202
+0.2398 0.2601 0.2814 0.3034 0.3263 0.3501 0.3746 0.4000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0004 0.0017 0.0037 0.0067 0.0104 0.0150 0.0204
+0.0266 0.0337 0.0416 0.0504 0.0599 0.0703 0.0816 0.0937
+0.1066 0.1203 0.1349 0.1503 0.1665 0.1836 0.2015 0.2202
+0.2398 0.2601 0.2814 0.3034 0.3263 0.3501 0.3746 0.4000
+}"
+-dupYellowTransfer="{
+0.0000 0.0004 0.0017 0.0037 0.0067 0.0104 0.0150 0.0204
+0.0266 0.0337 0.0416 0.0504 0.0599 0.0703 0.0816 0.0937
+0.1066 0.1203 0.1349 0.1503 0.1665 0.1836 0.2015 0.2202
+0.2398 0.2601 0.2814 0.3034 0.3263 0.3501 0.3746 0.4000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 101110
+ 1b28 64 0200 02d0
+ 1b28 6c 0200 1410
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610b2.upp b/lib/bjc610b2.upp
new file mode 100644
index 00000000..66b28b6f
--- /dev/null
+++ b/lib/bjc610b2.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, coated paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r720x720
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0029 0.0082 0.0151 0.0232 0.0324 0.0426 0.0537
+0.0655 0.0782 0.0916 0.1057 0.1204 0.1358 0.1517 0.1683
+0.1854 0.2030 0.2212 0.2399 0.2591 0.2788 0.2989 0.3195
+0.3406 0.3621 0.3840 0.4064 0.4292 0.4524 0.4760 0.5000
+}"
+-dupCyanTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupYellowTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 101110
+ 1b28 64 0200 02d0
+ 1b28 6c 0200 1410
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610b3.upp b/lib/bjc610b3.upp
new file mode 100644
index 00000000..f9a0a109
--- /dev/null
+++ b/lib/bjc610b3.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, transparency film, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r720x720
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupYellowTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 102110
+ 1b28 64 0200 02d0
+ 1b28 6c 0200 1420
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610b4.upp b/lib/bjc610b4.upp
new file mode 100644
index 00000000..22c5226e
--- /dev/null
+++ b/lib/bjc610b4.upp
@@ -0,0 +1,45 @@
+-supModel="Canon BJC 610, 720x720DpI, back print film, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r720x720
+-dupYFlip
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0005 0.0019 0.0042 0.0075 0.0117 0.0169 0.0229
+0.0300 0.0379 0.0468 0.0567 0.0674 0.0791 0.0918 0.1054
+0.1199 0.1353 0.1517 0.1690 0.1873 0.2065 0.2266 0.2477
+0.2697 0.2927 0.3165 0.3414 0.3671 0.3938 0.4214 0.4500
+}"
+-dupMagentaTransfer="{
+0.0000 0.0005 0.0019 0.0042 0.0075 0.0117 0.0169 0.0229
+0.0300 0.0379 0.0468 0.0567 0.0674 0.0791 0.0918 0.1054
+0.1199 0.1353 0.1517 0.1690 0.1873 0.2065 0.2266 0.2477
+0.2697 0.2927 0.3165 0.3414 0.3671 0.3938 0.4214 0.4500
+}"
+-dupYellowTransfer="{
+0.0000 0.0005 0.0019 0.0042 0.0075 0.0117 0.0169 0.0229
+0.0300 0.0379 0.0468 0.0567 0.0674 0.0791 0.0918 0.1054
+0.1199 0.1353 0.1517 0.1690 0.1873 0.2065 0.2266 0.2477
+0.2697 0.2927 0.3165 0.3414 0.3671 0.3938 0.4214 0.4500
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 103110
+ 1b28 64 0200 02d0
+ 1b28 6c 0200 1430
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610b6.upp b/lib/bjc610b6.upp
new file mode 100644
index 00000000..bc839eb2
--- /dev/null
+++ b/lib/bjc610b6.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, glossy paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r720x720
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0029 0.0082 0.0151 0.0232 0.0324 0.0426 0.0537
+0.0655 0.0782 0.0916 0.1057 0.1204 0.1358 0.1517 0.1683
+0.1854 0.2030 0.2212 0.2399 0.2591 0.2788 0.2989 0.3195
+0.3406 0.3621 0.3840 0.4064 0.4292 0.4524 0.4760 0.5000
+}"
+-dupCyanTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupYellowTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 105110
+ 1b28 64 0200 02d0
+ 1b28 6c 0200 1460
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610b7.upp b/lib/bjc610b7.upp
new file mode 100644
index 00000000..76fb46fd
--- /dev/null
+++ b/lib/bjc610b7.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, high gloss paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r720x720
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupYellowTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 106110
+ 1b28 64 0200 02d0
+ 1b28 6c 0200 1470
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/bjc610b8.upp b/lib/bjc610b8.upp
new file mode 100644
index 00000000..5bea920f
--- /dev/null
+++ b/lib/bjc610b8.upp
@@ -0,0 +1,44 @@
+-supModel="Canon BJC 610, 720x720DpI, high resolution paper, color, rendered"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Canon
+-r720x720
+-dupMargins="{ 8.23 20.44 11.05 7.9 }"
+-dupOutputComponentOrder="{ 3 2 1 0 }"
+-dupBlackTransfer="{
+0.0000 0.0008 0.0033 0.0075 0.0133 0.0208 0.0300 0.0408
+0.0533 0.0674 0.0832 0.1007 0.1199 0.1407 0.1632 0.1873
+0.2131 0.2406 0.2697 0.3005 0.3330 0.3671 0.4029 0.4404
+0.4795 0.5203 0.5627 0.6069 0.6527 0.7001 0.7492 0.8000
+}"
+-dupCyanTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupMagentaTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupYellowTransfer="{
+0.0000 0.0005 0.0021 0.0047 0.0083 0.0130 0.0187 0.0255
+0.0333 0.0421 0.0520 0.0630 0.0749 0.0879 0.1020 0.1171
+0.1332 0.1504 0.1686 0.1878 0.2081 0.2294 0.2518 0.2752
+0.2997 0.3252 0.3517 0.3793 0.4079 0.4376 0.4683 0.5000
+}"
+-dupBeginPageCommand="<
+ 1b5b4b 0200 000f
+ 1b28 62 0100 01
+ 1b28 63 0300 107110
+ 1b28 64 0200 02d0
+ 1b28 6c 0200 14a0
+ 1b28 67 0100 E5
+>"
+-dupEndJobCommand="(\033\050b\001\000\000\033@)"
+-dupEndPageCommand="(\014)"
diff --git a/lib/caption.ps b/lib/caption.ps
new file mode 100644
index 00000000..5d7806af
--- /dev/null
+++ b/lib/caption.ps
@@ -0,0 +1,58 @@
+%!
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Add a "caption" to the bottom of each page.
+/captionsize 20 def
+/caption
+ { /Helvetica //captionsize selectfont
+ (Printed by Artifex's XXYYZZ) show
+ /Symbol //captionsize selectfont
+ (\324) show % trademarkserif
+ /Helvetica //captionsize selectfont
+ ( product) show
+ } bind def
+
+10 dict begin
+gsave
+ initgraphics
+ clippath pathbbox
+ pop exch 36 add /by exch def
+ % We can't use stringwidth, so we have to show and measure.
+ gsave
+ 0 0 0 0 rectclip
+ 0 0 moveto caption currentpoint pop /bw exch def
+ grestore
+ add bw sub 2 div /bx exch def
+ % We don't have the font bbox available, so we guess.
+ /bh captionsize 1.05 mul def
+grestore
+/showcaption
+ { gsave
+ initgraphics
+ //bx 9 sub //by 9 sub //bw 18 add //bh 18 add
+ 1 setgray 4 copy rectfill 0 setgray 1.5 setlinewidth rectstroke
+ //bx //by moveto //caption exec
+ grestore
+ } bind def
+<< /EndPage [
+ %%
+ %% Only print the caption if 'reason' is not 2 (device deactivation)
+ %%
+ /dup load /exec load 2 /ne load /exec load [ /showcaption load /exec load ] cvx /if load /exec load
+ currentpagedevice /EndPage get /exec load
+ ] cvx
+>> setpagedevice
+end
diff --git a/lib/cat.ps b/lib/cat.ps
new file mode 100644
index 00000000..3b65f3b4
--- /dev/null
+++ b/lib/cat.ps
@@ -0,0 +1,74 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+%
+% $Id: cat.ps 8331 2008-02-05 11:07:00Z kens $
+%
+% Appends one file to another. Primarily used to overcome the
+% 'copy' limitation of Windows command shell for ps2epsi
+%
+% the files to be appended are given by the environament
+% variables %infile% and %outfile%. %infile% is appended to
+% %outfile%
+%
+
+/datastring 1024 string def
+
+{
+ (outfile) getenv
+ {
+ /outfilename exch def
+ (infile) getenv
+ {
+ /infilename exch def
+
+ infilename status
+ {
+ pop pop pop pop outfilename status
+ {
+ pop pop pop pop
+ infilename (r) file /infile exch def
+ outfilename (a+) file /outfile exch def
+ {
+ infile datastring readstring
+ {
+ outfile exch writestring
+ }
+ {
+ dup length 0 gt
+ {outfile exch writestring} {pop} ifelse
+ exit
+ } ifelse
+ } loop
+ infile closefile
+ outfile closefile
+ }
+ {
+ (Failed to find file ) print outfilename ==
+ } ifelse
+ }
+ {
+ (Failed to find file ) print infilename ==
+ } ifelse
+ }
+ {
+ (Couldn't find %infile% environment variable) ==
+ } ifelse
+ }
+ {
+ (Couldn't find %outfile% environment variable) ==
+ }
+ ifelse
+} bind
+exec
diff --git a/lib/cbjc600.ppd b/lib/cbjc600.ppd
new file mode 100644
index 00000000..5db65422
--- /dev/null
+++ b/lib/cbjc600.ppd
@@ -0,0 +1,408 @@
+*PPD-Adobe: "4.1"
+*% Adobe Systems PostScript(R) Printer Description File
+*% Copyright 1995 Yves Arrouye for AFPL Ghostscript with Level 2 PS.
+*% All Rights Reserved.
+*% This file may be distributed as part of GNU Ghostscript and/or AFPL
+*% Ghostscript, under the same terms and conditions as Ghostscript.
+*% End of Copyright statement
+*FormatVersion: "4.1"
+*FileVersion: "1.0"
+*LanguageEncoding: ISOLatin1
+*LanguageVersion: English
+*PCFileName: "CBJC600.PPD"
+*Product: "(Canon Bubble Jet Color 600)"
+*PSVersion: "(2010.351) 0"
+*ModelName: "Canon Bubble Jet Color 600"
+*NickName: "BJC-600"
+*ShortNickName: "BJC-600"
+*Manufacturer: "Canon"
+
+*% This file is not complete, and may lack some useful information...
+
+*% Note: the default transfer function should be set to Null if Ghostscript
+*% exhibit a bug making magenta appear while printing in gray levels...
+*% Note: if you print on A4 paper by default, change *Default values (the
+*% default is Letter here).
+
+*% ==============Constraints =================
+
+*UIConstraints: *BitsPerPixel None *ColorModel DeviceCMYK
+*UIConstraints: *BitsPerPixel None *ColorModel DeviceRGB
+*UIConstraints: *BitsPerPixel 16 *ColorModel DeviceRGB
+*UIConstraints: *BitsPerPixel 16 *ColorModel DeviceGray
+*UIConstraints: *BitsPerPixel 24 *ColorModel DeviceGray
+*UIConstraints: *BitsPerPixel 32 *ColorModel DeviceRGB
+*UIConstraints: *BitsPerPixel 32 *ColorModel DeviceGray
+
+*UIConstraints: *ColorModel DeviceCMYK *BitsPerPixel None
+*UIConstraints: *ColorModel DeviceRGB *BitsPerPixel None
+*UIConstraints: *ColorModel DeviceRGB *BitsPerPixel 16
+*UIConstraints: *ColorModel DeviceRGB *BitsPerPixel 32
+*UIConstraints: *ColorModel DeviceGray *BitsPerPixel 16
+*UIConstraints: *ColorModel DeviceGray *BitsPerPixel 24
+*UIConstraints: *ColorModel DeviceGray *BitsPerPixel 32
+
+*% =========== Device Capabilities ===============
+
+*LanguageLevel: "2"
+*Protocols: TBCP
+*FreeVM: "2124600"
+*ColorDevice: True
+*DefaultColorSpace: CMYK
+*FileSystem: True
+*Throughput: "1"
+
+*Password: "()"
+
+*% ============Paper Size Information ==============
+
+*OpenUI *PageSize: PickOne
+*OrderDependency: 30 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize A4: "1 dict dup /PageSize [595 842] put setpagedevice"
+*PageSize A5: "1 dict dup /PageSize [421 595] put setpagedevice"
+*PageSize A6: "1 dict dup /PageSize [297 421] put setpagedevice"
+*PageSize A7: "1 dict dup /PageSize [210 297] put setpagedevice"
+*PageSize A8: "1 dict dup /PageSize [148 210] put setpagedevice"
+*PageSize A9: "1 dict dup /PageSize [105 148] put setpagedevice"
+*PageSize A10: "1 dict dup /PageSize [74 105] put setpagedevice"
+*PageSize B5: "1 dict dup /PageSize [501 709] put setpagedevice"
+*PageSize Letter/US Letter: "1 dict dup /PageSize [612 792] put setpagedevice"
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 40 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion A4: "1 dict dup /PageSize [595 842] put setpagedevice"
+*PageRegion A5: "1 dict dup /PageSize [421 595] put setpagedevice"
+*PageRegion A6: "1 dict dup /PageSize [297 421] put setpagedevice"
+*PageRegion A7: "1 dict dup /PageSize [210 297] put setpagedevice"
+*PageRegion A8: "1 dict dup /PageSize [148 210] put setpagedevice"
+*PageRegion A9: "1 dict dup /PageSize [105 148] put setpagedevice"
+*PageRegion A10: "1 dict dup /PageSize [74 105] put setpagedevice"
+*PageRegion B5: "1 dict dup /PageSize [501 709] put setpagedevice"
+*PageRegion Letter/US Letter: "1 dict dup /PageSize [612 792] put setpagedevice"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea A4: "18.425196 27.096094 576.625183 833.496094"
+*ImageableArea A5: "18.425196 27.096045 402.625183 586.496033"
+*ImageableArea A6: "18.425196 27.096045 278.625183 412.496033"
+*ImageableArea A7: "18.425196 27.096045 191.625198 288.496033"
+*ImageableArea A8: "18.425196 27.096045 129.625198 201.496048"
+*ImageableArea A9: "18.425196 27.096045 86.625198 139.496048"
+*ImageableArea A10: "18.425196 27.096045 55.625195 96.496048"
+*ImageableArea B5: "18.425196 27.096045 482.625183 700.496033"
+*ImageableArea Letter/US Letter: "18.425196 27.096045 593.625183 783.496033"
+
+*?ImageableArea: "
+save
+ /cvp {( ) cvs print ( ) print } bind def
+ /upperright {10000 mul floor 10000 div} bind def
+ /lowerleft {10000 mul ceiling 10000 div} bind def
+ newpath clippath pathbbox
+ 4 -2 roll exch 2 {lowerleft cvp} repeat
+ exch 2 {upperright cvp} repeat flush
+ restore
+"
+*End
+
+*DefaultPaperDimension: Letter
+*PaperDimension A4: "595 842"
+*PaperDimension A5: "421 595"
+*PaperDimension A6: "297 421"
+*PaperDimension A7: "210 297"
+*PaperDimension A8: "148 210"
+*PaperDimension A9: "105 148"
+*PaperDimension A10: "74 105"
+*PaperDimension B5: "501 709"
+*PaperDimension Letter/US Letter: "612 792"
+
+*HWMargins: "9.637794495 27.042521 9.637794495 8.503937"
+
+*% =============Halftone Information ===============
+
+*ScreenFreq: "60.0"
+*ScreenAngle: "45.0"
+
+*DefaultScreenProc: Dot
+*ScreenProc Dot: "
+{dup mul exch dup mul add 1.0 exch sub }
+"
+*End
+*ScreenProc Line: "{ pop }"
+*ScreenProc Ellipse: "{ dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub }"
+
+*DefaultTransfer: Normalized
+*Transfer Normalized: "{mark
+1.0 1.000 0.955 0.915 0.847 0.765 0.683 0.602 0.500 0.311 0.030 0.0
+counttomark dup 3 add -1 roll exch
+2 sub mul dup floor cvi dup 3 1 roll sub exch dup
+3 add index exch 2 add index dup 4 1 roll sub mul add
+counttomark 1 add 1 roll cleartomark
+} bind"
+*End
+*Transfer Null: "{ }"
+*Transfer Null.Inverse: "{ 1 exch sub }"
+*End
+
+*%==================Input Slot====================
+
+*OpenUI *InputSlot/Media Source: PickOne
+*OrderDependency: 20 AnySetup *InputSlot
+*DefaultInputSlot: Feeder
+*InputSlot Feeder/Paper Tray: ""
+*CloseUI: *InputSlot
+
+*%=================Manual Feed====================
+
+*OpenUI *ManualFeed/Manual Feed: Boolean
+*OrderDependency: 20 AnySetup *ManualFeed
+*DefaultManualFeed: False
+*ManualFeed True/True: "1 dict dup /ManualFeed true put setpagedevice"
+*ManualFeed False/False: "1 dict dup /ManualFeed false put setpagedevice"
+*?ManualFeed: "
+ save
+ currentpagedevice /ManualFeed get
+ {(True)}{(False)}ifelse = flush
+ restore"
+*End
+
+*CloseUI: *ManualFeed
+
+*%===================Resolution====================
+
+*OpenUI *Resolution/Resolution: PickOne
+*OrderDependency: 10 AnySetup *Resolution
+*DefaultResolution: 360x360dpi
+*Resolution 90x90dpi/90dpi: "
+ 1 dict dup /HWResolution [ 90 90 ]
+ put setpagedevice"
+*End
+
+*Resolution 180x180dpi/180dpi: "
+ 1 dict dup /HWResolution [ 180 180 ]
+ put setpagedevice"
+*End
+
+*Resolution 360x360dpi/360dpi: "
+ 1 dict dup /HWResolution [ 360 360 ]
+ put setpagedevice"
+*End
+
+*?Resolution: "
+ save
+ currentpagedevice /HWResolution get dup
+ 0 get cvi 10 string cvs print
+ (x) print
+ 0 get cvi 10 string print
+ (dpi) = flush
+ restore"
+*End
+
+*CloseUI: *Resolution
+
+*%===================Output Depth====================
+
+*OpenUI *BitsPerPixel/Print Depth: PickOne
+*OrderDependency: 30 AnySetup *BitsPerPixel
+*DefaultBitsPerPixel: 24
+*BitsPerPixel None/1bpp: "
+ 1 dict dup /BitsPerPixel 1 put
+ setpagedevice"
+*End
+
+*BitsPerPixel 8/8bpp: "
+ 1 dict dup /BitsPerPixel 8 put
+ setpagedevice"
+*End
+
+*BitsPerPixel 16/16bpp: "
+ 1 dict dup /BitsPerPixel 16 put
+ setpagedevice"
+*End
+
+*BitsPerPixel 24/24bpp: "
+ 1 dict dup /BitsPerPixel 24 put
+ setpagedevice"
+*End
+
+*BitsPerPixel 32/32bpp: "
+ 1 dict dup /BitsPerPixel 32 put
+ setpagedevice"
+*End
+
+*?BitsPerPixel: "
+ save
+ currentpagedevice /BitsPerPixel get dup 1 eq { pop (None) } if = flush
+ restore"
+*End
+
+*CloseUI: *BitsPerPixel
+
+*%=================Media Type============================
+
+*OpenUI *MediaType/Media Type: PickOne
+*OrderDependency: 50 AnySetup *MediaType
+*DefaultMediaType: PlainPaper
+*MediaType PlainPaper/Plain Paper: "
+ 1 dict dup /MediaType (PlainPaper) put setpagedevice"
+*End
+
+*MediaType CoatedPaper/Coated Paper: "
+ 1 dict dup /MediaType (CoatedPaper) put setpagedevice"
+*End
+
+*MediaType TransparencyFilm/Transparency Film: "
+ 1 dict dup /MediaType (TransparencyFilm) put setpagedevice"
+*End
+
+*MediaType Envelope/Envelope: "
+ 1 dict dup /MediaType (Envelope) put setpagedevice"
+*End
+
+*MediaType Card/Card: "
+ 1 dict dup /MediaType (Card) put setpagedevice"
+*End
+
+*MediaType Other/Other: "
+ 1 dict dup /MediaType (Other) put setpagedevice"
+*End
+
+*?MediaType: "
+ save
+ currentpagedevice /MediaType get
+ dup null eq {pop (Unknown)} if = flush
+ restore "
+*End
+
+*CloseUI: *MediaType
+
+*%===================Printing Quality====================
+
+*OpenUI *OutputMode/Print Quality: PickOne
+*OrderDependency: 50 AnySetup *OuputMode
+*DefaultOutputMode: Normal
+*OutputMode Draft/Draft: "
+ 1 dict dup /PrintQuality (Draft) put setpagedevice"
+*End
+
+*OutputMode Normal/Normal: "
+ 1 dict dup /PrintQuality (Normal) put setpagedevice"
+*End
+
+*OutputMode High/High: "
+ 1 dict dup /PrintQuality (High) put setpagedevice"
+*End
+
+*?OutputMode: "
+ save
+ currentpagedevice /PrintQuality get
+ dup null eq {pop (Unknown)} if = flush
+ restore "
+*End
+
+*CloseUI: *OutputMode
+
+*%===================Color/Gray Printing====================
+
+*OpenUI *ColorModel/Color Processing: PickOne
+*OrderDependency: 20 AnySetup *ColorModel
+*DefaultColorModel: DeviceCMYK
+*ColorModel DeviceGray/Gray: "
+ 1 dict dup /ProcessColorModel /DeviceGray
+ put setpagedevice"
+*End
+
+*ColorModel DeviceRGB/RGB: "
+ 1 dict dup /ProcessColorModel /DeviceRGB
+ put setpagedevice"
+*End
+
+*ColorModel DeviceCMYK/CMYK: "
+ 1 dict dup /ProcessColorModel /DeviceCMYK
+ put setpagedevice"
+*End
+
+*?ColorModel: "
+ save
+ currentpagedevice /ProcessColorModel get = flush
+ restore "
+*End
+
+*CloseUI: *ColorModel
+
+*%===================Media Weight/Thick Media====================
+
+*OpenUI *ThickMedia/Thick Media: PickOne
+*OrderDependency: 30 AnySetup *ThickMedia
+*DefaultThickMedia: Thin
+*ThickMedia Thin/No: "
+ 1 dict dup /MediaWeight 80
+ put setpagedevice"
+*End
+
+*ThickMedia Thick/Yes: "
+ 1 dict dup /ThickMedia 120
+ put setpagedevice"
+*End
+
+*?ThickMedia: "
+ save
+ currentpagedevice /MediaWeight get 105 gt { (Thick) } { (Thin) } ifelse
+ = flush
+ restore "
+*End
+
+*CloseUI: *ThickMedia
+
+*%===================PrintColors====================
+
+*OpenUI *PrintColors/Print Colors: PickOne
+*OrderDependency: 20 AnySetup *PrintColors
+*DefaultPrintColors: "15"
+*PrintColors 0/None: "1 dict dup /PrintColors 0 put setpagedevice"
+*End
+
+*PrintColors 1/Cyan: "1 dict dup /PrintColors 1 put setpagedevice"
+*End
+
+*PrintColors 2/Magenta: "1 dict dup /PrintColors 2 put setpagedevice"
+*End
+
+*PrintColors 4/Yellow: "1 dict dup /PrintColors 4 put setpagedevice"
+*End
+
+*PrintColors 8/Black: "1 dict dup /PrintColors 8 put setpagedevice"
+*End
+
+*PrintColors 15/All: "1 dict dup /PrintColors 15 put setpagedevice"
+*End
+
+
+*CloseUI *PrintColors
+
+*%===================Monochrome Printing====================
+
+*OpenUI *MonochromePrint/Monochrome Print: Boolean
+*OrderDependency: 50 AnySetup *MonochromePrint
+*DefaultMonochromePrint: False
+*MonochromePrint True/Yes: "
+ 1 dict dup /MonochromePrint true
+ put setpagedevice"
+*End
+
+*MonochromePrint False/No: "
+ 1 dict dup /MonochromePrint false
+ put setpagedevice"
+*End
+
+*?MonochromePrint: "
+ save
+ currentpagedevice /MonochromePrint get
+ {(True)}{(False)}ifelse = flush
+ restore"
+*End
+
+*CloseUI: *MonochromePrint
+
diff --git a/lib/cbjc800.ppd b/lib/cbjc800.ppd
new file mode 100644
index 00000000..aaf8c891
--- /dev/null
+++ b/lib/cbjc800.ppd
@@ -0,0 +1,393 @@
+*PPD-Adobe: "4.1"
+*% Adobe Systems PostScript(R) Printer Description File
+*% Copyright 1995 Yves Arrouye for AFPL Ghostscript with Level 2 PS.
+*% All Rights Reserved.
+*% This file may be distributed as part of GNU Ghostscript and/or AFPL
+*% Ghostscript, under the same terms and conditions as Ghostscript.
+*% End of Copyright statement
+*FormatVersion: "4.1"
+*FileVersion: "1.0"
+*LanguageEncoding: ISOLatin1
+*LanguageVersion: English
+*PCFileName: "CBJC800.PPD"
+*Product: "(Canon Bubble Jet Color 800)"
+*PSVersion: "(2010.351) 0"
+*ModelName: "Canon Bubble Jet Color 800"
+*NickName: "BJC-800"
+*ShortNickName: "BJC-800"
+*Manufacturer: "Canon"
+
+*% This file is not complete, and may lack some useful information...
+
+*% Note: the default transfer function should be set to Null if Ghostscript
+*% exhibit a bug making magenta appear while printing in gray levels...
+*% Note: if you print on A4 paper by default, change *Default values (the
+*% default is Letter here).
+
+*% ==============Constraints =================
+
+*UIConstraints: *BitsPerPixel None *ColorModel DeviceCMYK
+*UIConstraints: *BitsPerPixel None *ColorModel DeviceRGB
+*UIConstraints: *BitsPerPixel 16 *ColorModel DeviceRGB
+*UIConstraints: *BitsPerPixel 16 *ColorModel DeviceGray
+*UIConstraints: *BitsPerPixel 24 *ColorModel DeviceGray
+*UIConstraints: *BitsPerPixel 32 *ColorModel DeviceRGB
+*UIConstraints: *BitsPerPixel 32 *ColorModel DeviceGray
+
+*UIConstraints: *ColorModel DeviceCMYK *BitsPerPixel None
+*UIConstraints: *ColorModel DeviceRGB *BitsPerPixel None
+*UIConstraints: *ColorModel DeviceRGB *BitsPerPixel 16
+*UIConstraints: *ColorModel DeviceRGB *BitsPerPixel 32
+*UIConstraints: *ColorModel DeviceGray *BitsPerPixel 16
+*UIConstraints: *ColorModel DeviceGray *BitsPerPixel 24
+*UIConstraints: *ColorModel DeviceGray *BitsPerPixel 32
+
+*% =========== Device Capabilities ===============
+
+*LanguageLevel: "2"
+*Protocols: TBCP
+*FreeVM: "2124600"
+*ColorDevice: True
+*DefaultColorSpace: CMYK
+*FileSystem: True
+*Throughput: "1"
+
+*Password: "()"
+
+*% ============Paper Size Information ==============
+
+*OpenUI *PageSize: PickOne
+*OrderDependency: 30 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize A4: "1 dict dup /PageSize [595 842] put setpagedevice"
+*PageSize A5: "1 dict dup /PageSize [421 595] put setpagedevice"
+*PageSize A6: "1 dict dup /PageSize [297 421] put setpagedevice"
+*PageSize A7: "1 dict dup /PageSize [210 297] put setpagedevice"
+*PageSize A8: "1 dict dup /PageSize [148 210] put setpagedevice"
+*PageSize A9: "1 dict dup /PageSize [105 148] put setpagedevice"
+*PageSize A10: "1 dict dup /PageSize [74 105] put setpagedevice"
+*PageSize B5: "1 dict dup /PageSize [501 709] put setpagedevice"
+*PageSize Letter/US Letter: "1 dict dup /PageSize [612 792] put setpagedevice"
+*PageSize 11x17/US 11x17: "1 dict dup /PageSize [792 1224] put setpagedevice"
+*PageSize Ledger/US Ledger: "1 dict dup /PageSize [1224 792] put setpagedevice"
+*PageSize Legal/US Legal: "1 dict dup /PageSize [612 1008] put setpagedevice"
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 40 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion A4: "1 dict dup /PageSize [595 842] put setpagedevice"
+*PageRegion A5: "1 dict dup /PageSize [421 595] put setpagedevice"
+*PageRegion A6: "1 dict dup /PageSize [297 421] put setpagedevice"
+*PageRegion A7: "1 dict dup /PageSize [210 297] put setpagedevice"
+*PageRegion A8: "1 dict dup /PageSize [148 210] put setpagedevice"
+*PageRegion A9: "1 dict dup /PageSize [105 148] put setpagedevice"
+*PageRegion A10: "1 dict dup /PageSize [74 105] put setpagedevice"
+*PageRegion B5: "1 dict dup /PageSize [501 709] put setpagedevice"
+*PageRegion Letter/US Letter: "1 dict dup /PageSize [612 792] put setpagedevice"
+*PageRegion 11x17/US 11x17: "1 dict dup /PageSize [792 1224] put setpagedevice"
+*PageRegion Ledger/US Ledger: "1 dict dup /PageSize [1224 792] put setpagedevice"
+*PageRegion Legal/US Legal: "1 dict dup /PageSize [612 1008] put setpagedevice"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea A3: "9.637793 27.096094 832.437805 1181.496094"
+*ImageableArea A4: "18.425196 27.096094 576.625183 833.496094"
+*ImageableArea A5: "18.425196 27.096045 402.625183 586.496033"
+*ImageableArea A6: "18.425196 27.096045 278.625183 412.496033"
+*ImageableArea A7: "18.425196 27.096045 191.625198 288.496033"
+*ImageableArea A8: "18.425196 27.096045 129.625198 201.496048"
+*ImageableArea A9: "18.425196 27.096045 86.625198 139.496048"
+*ImageableArea A10: "18.425196 27.096045 55.625195 96.496048"
+*ImageableArea B5: "18.425196 27.096045 482.625183 700.496033"
+*ImageableArea Letter/US Letter: "18.425196 27.096045 593.625183 783.496033"
+*ImageableArea 11x17/US 11x17: "9.637793 27.096094 782.437805 1215.496094"
+*ImageableArea Ledger/US Ledger: "9.637793 27.096045 1214.437744 783.496033"
+*ImageableArea Legal/US Legal: "9.637793 27.096094 602.437805 999.496094"
+
+*?ImageableArea: "
+save
+ /cvp {( ) cvs print ( ) print } bind def
+ /upperright {10000 mul floor 10000 div} bind def
+ /lowerleft {10000 mul ceiling 10000 div} bind def
+ newpath clippath pathbbox
+ 4 -2 roll exch 2 {lowerleft cvp} repeat
+ exch 2 {upperright cvp} repeat flush
+ restore
+"
+*End
+
+*DefaultPaperDimension: Letter
+*PaperDimension A4: "595 842"
+*PaperDimension A5: "421 595"
+*PaperDimension A6: "297 421"
+*PaperDimension A7: "210 297"
+*PaperDimension A8: "148 210"
+*PaperDimension A9: "105 148"
+*PaperDimension A10: "74 105"
+*PaperDimension B5: "501 709"
+*PaperDimension Letter/US Letter: "612 792"
+*PaperDimension 11x17/US 11x17: "792 1224"
+*PaperDimension Ledger/US Ledger: "1224 792"
+*PaperDimension Legal/US Legal: "612 1008"
+
+*HWMargins: "9.637794495 19.842518 9.637794495 8.503937"
+
+*% =============Halftone Information ===============
+
+*ScreenFreq: "60.0"
+*ScreenAngle: "45.0"
+
+*DefaultScreenProc: Dot
+*ScreenProc Dot: "
+{dup mul exch dup mul add 1.0 exch sub }
+"
+*End
+*ScreenProc Line: "{ pop }"
+*ScreenProc Ellipse: "{ dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub }"
+
+*DefaultTransfer: Normalized
+*Transfer Normalized: "{mark
+1.0 1.000 0.955 0.915 0.847 0.765 0.683 0.602 0.500 0.311 0.030 0.0
+counttomark dup 3 add -1 roll exch
+2 sub mul dup floor cvi dup 3 1 roll sub exch dup
+3 add index exch 2 add index dup 4 1 roll sub mul add
+counttomark 1 add 1 roll cleartomark
+} bind"
+*End
+*Transfer Null: "{ }"
+*Transfer Null.Inverse: "{ 1 exch sub }"
+*End
+
+*%==================Input Slot====================
+
+*OpenUI *InputSlot/Media Source: PickOne
+*OrderDependency: 20 AnySetup *InputSlot
+*DefaultInputSlot: Feeder
+*InputSlot Feeder/Paper Tray: ""
+*CloseUI: *InputSlot
+
+*%=================Manual Feed====================
+
+*OpenUI *ManualFeed/Manual Feed: Boolean
+*OrderDependency: 20 AnySetup *ManualFeed
+*DefaultManualFeed: False
+*ManualFeed True/True: "1 dict dup /ManualFeed true put setpagedevice"
+*ManualFeed False/False: "1 dict dup /ManualFeed false put setpagedevice"
+*?ManualFeed: "
+ save
+ currentpagedevice /ManualFeed get
+ {(True)}{(False)}ifelse = flush
+ restore"
+*End
+
+*CloseUI: *ManualFeed
+
+*%===================Resolution====================
+
+*OpenUI *Resolution/Resolution: PickOne
+*OrderDependency: 10 AnySetup *Resolution
+*DefaultResolution: 360x360dpi
+*Resolution 90x90dpi/90dpi: "
+ 1 dict dup /HWResolution [ 90 90 ]
+ put setpagedevice"
+*End
+
+*Resolution 180x180dpi/180dpi: "
+ 1 dict dup /HWResolution [ 180 180 ]
+ put setpagedevice"
+*End
+
+*Resolution 360x360dpi/360dpi: "
+ 1 dict dup /HWResolution [ 360 360 ]
+ put setpagedevice"
+*End
+
+*?Resolution: "
+ save
+ currentpagedevice /HWResolution get dup
+ 0 get cvi 10 string cvs print
+ (x) print
+ 0 get cvi 10 string print
+ (dpi) = flush
+ restore"
+*End
+
+*CloseUI: *Resolution
+
+*%===================Output Depth====================
+
+*OpenUI *BitsPerPixel/Print Depth: PickOne
+*OrderDependency: 30 AnySetup *BitsPerPixel
+*DefaultBitsPerPixel: 24
+*BitsPerPixel None/1bpp: "
+ 1 dict dup /BitsPerPixel 1 put
+ setpagedevice"
+*End
+
+*BitsPerPixel 8/8bpp: "
+ 1 dict dup /BitsPerPixel 8 put
+ setpagedevice"
+*End
+
+*BitsPerPixel 16/16bpp: "
+ 1 dict dup /BitsPerPixel 16 put
+ setpagedevice"
+*End
+
+*BitsPerPixel 24/24bpp: "
+ 1 dict dup /BitsPerPixel 24 put
+ setpagedevice"
+*End
+
+*BitsPerPixel 32/32bpp: "
+ 1 dict dup /BitsPerPixel 32 put
+ setpagedevice"
+*End
+
+*?BitsPerPixel: "
+ save
+ currentpagedevice /BitsPerPixel get dup 1 eq { pop (None) } if = flush
+ restore"
+*End
+
+*CloseUI: *BitsPerPixel
+
+*%=================Media Type============================
+
+*OpenUI *MediaType/Media Type: PickOne
+*OrderDependency: 50 AnySetup *MediaType
+*DefaultMediaType: PlainPaper
+*MediaType PlainPaper/Plain Paper: "
+ 1 dict dup /MediaType (PlainPaper) put setpagedevice"
+*End
+
+*MediaType CoatedPaper/Coated Paper: "
+ 1 dict dup /MediaType (CoatedPaper) put setpagedevice"
+*End
+
+*MediaType TransparencyFilm/Transparency Film: "
+ 1 dict dup /MediaType (TransparencyFilm) put setpagedevice"
+*End
+
+*MediaType Envelope/Envelope: "
+ 1 dict dup /MediaType (Envelope) put setpagedevice"
+*End
+
+*MediaType Card/Card: "
+ 1 dict dup /MediaType (Card) put setpagedevice"
+*End
+
+*MediaType Other/Other: "
+ 1 dict dup /MediaType (Other) put setpagedevice"
+*End
+
+*?MediaType: "
+ save
+ currentpagedevice /MediaType get
+ dup null eq {pop (Unknown)} if = flush
+ restore "
+*End
+
+*CloseUI: *MediaType
+
+*%===================Printing Quality====================
+
+*OpenUI *OutputMode/Print Quality: PickOne
+*OrderDependency: 10 AnySetup *OuputMode
+*DefaultOutputMode: Normal
+*OutputMode Draft/Draft: "
+ 1 dict dup /PrintQuality (Draft) put setpagedevice"
+*End
+
+*OutputMode Low/Low: "
+ 1 dict dup /PrintQuality (Low) put setpagedevice"
+*End
+
+*OutputMode Normal/Normal: "
+ 1 dict dup /PrintQuality (Normal) put setpagedevice"
+*End
+
+*OutputMode High/High: "
+ 1 dict dup /PrintQuality (High) put setpagedevice"
+*End
+
+*CloseUI: *OutputMode
+
+*%===================Color/Gray Printing====================
+
+*OpenUI *ColorModel/Color Processing: PickOne
+*OrderDependency: 20 AnySetup *ColorModel
+*DefaultColorModel: DeviceCMYK
+*ColorModel DeviceGray/Gray: "
+ 1 dict dup /ProcessColorModel /DeviceGray
+ put setpagedevice"
+*End
+
+*ColorModel DeviceRGB/RGB: "
+ 1 dict dup /ProcessColorModel /DeviceRGB
+ put setpagedevice"
+*End
+
+*ColorModel DeviceCMYK/CMYK: "
+ 1 dict dup /ProcessColorModel /DeviceCMYK
+ put setpagedevice"
+*End
+
+*?ColorModel: "
+ save
+ currentpagedevice /ProcessColorModel get = flush
+ restore "
+*End
+
+*CloseUI: *ColorModel
+
+*%===================Media Weight/Thick Media====================
+
+*OpenUI *ThickMedia/Thick Media: PickOne
+*OrderDependency: 30 AnySetup *ThickMedia
+*DefaultThickMedia: Thin
+*ThickMedia Thin/No: "
+ 1 dict dup /MediaWeight 80
+ put setpagedevice"
+*End
+
+*ThickMedia Thick/Yes: "
+ 1 dict dup /ThickMedia 120
+ put setpagedevice"
+*End
+
+*?ThickMedia: "
+ save
+ currentpagedevice /MediaWeight get 105 gt { (Thick) } { (Thin) } ifelse
+ = flush
+ restore "
+*End
+
+*CloseUI: *ThickMedia
+
+*%===================PrintColors====================
+
+*OpenUI *PrintColors/Print Colors: PickOne
+*OrderDependency: 20 AnySetup *PrintColors
+*DefaultPrintColors: "15"
+*PrintColors 0/None: "1 dict dup /PrintColors 0 put setpagedevice"
+*End
+
+*PrintColors 1/Cyan: "1 dict dup /PrintColors 1 put setpagedevice"
+*End
+
+*PrintColors 2/Magenta: "1 dict dup /PrintColors 2 put setpagedevice"
+*End
+
+*PrintColors 4/Yellow: "1 dict dup /PrintColors 4 put setpagedevice"
+*End
+
+*PrintColors 8/Black: "1 dict dup /PrintColors 8 put setpagedevice"
+*End
+
+*PrintColors 15/All: "1 dict dup /PrintColors 15 put setpagedevice"
+*End
+
+
+*CloseUI *PrintColors
diff --git a/lib/cdj550.upp b/lib/cdj550.upp
new file mode 100644
index 00000000..4f91a2ed
--- /dev/null
+++ b/lib/cdj550.upp
@@ -0,0 +1,48 @@
+-supModel="HP Deskjet 550c, 300x300DpI, Gamma=2"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Pcl
+-r300x300
+-dupMargins="{ 12.0 36.0 12.0 12.0}"
+-dupBlackTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupBeginPageCommand="<
+ 1b2a726243
+ 1b2a7433303052
+ 1b266c33616f6c45
+ 1b2a6f31643251
+ 1b2a703059
+ 1b2a72732d34753041
+ 1b2a62326d
+>"
+-dupAdjustPageWidthCommand
+-dupEndPageCommand="(0M\033*rbC\033E\033&l0H)"
+-dupAbortCommand="(0M\033*rbC\033E\15\12\12\12\12 Printout-Aborted\15\033&l0H)"
+-dupYMoveCommand="(%dy\0)"
+-dupWriteComponentCommands="{ (%dv\0) (%dv\0) (%dv\0) (%dw\0) }"
+
diff --git a/lib/cdj690.upp b/lib/cdj690.upp
new file mode 100644
index 00000000..b8b1aa0d
--- /dev/null
+++ b/lib/cdj690.upp
@@ -0,0 +1,52 @@
+-supModel="HP Deskjet 690 Normal Gamma 2.0"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Pcl
+-r600x300
+-dupMargins="{ 12.0 36.0 12.0 12.0}"
+-dupBlackTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupBeginPageCommand="<
+1b25 2d31 3233 3435 5840
+504a 4c20 454e 5445 5220 4c41 4e47 5541
+4745 3d50 434c 534c 4545 4b0a 1b45 1b2a
+6232 421b 2a6f 3557 040c 0000 001b 2a6f
+3144 1b26 6c31 481b 266c 3236 6130 4c1b
+2a6f 3557 0103 0000 011b 266c 304d 1b26
+6c30 6f30 451b 2a6f 304d 1b26 7533 3030
+441b 2a70 3058 1b2a 7030 591b 2a67 3857
+0201 0258 012c 0002 1b2a 7234 3830 3053
+1b2a 7231 411b 2a62 324d 1b2a 6233 3034
+591b 2a62 326d
+>"
+-dupAdjustPageWidthCommand
+-dupEndPageCommand="(0M\033*rbC\033E\033&l0H)"
+-dupAbortCommand="(0M\033*rbC\033E\15\12\12\12\12 Printout-Aborted\15\033&l0H)"
+-dupYMoveCommand="(%dy\0)"
+-dupWriteComponentCommands="{ (%dv\0) (%dv\0) (%dv\0) (%dw\0) }"
+-dupOutputYOffset=10000
diff --git a/lib/cdj690ec.upp b/lib/cdj690ec.upp
new file mode 100644
index 00000000..fd3d5a94
--- /dev/null
+++ b/lib/cdj690ec.upp
@@ -0,0 +1,54 @@
+-supModel="HP Deskjet 690 Econo-Fast Gamma 2.0"
+-sDEVICE=uniprint
+-sPAPERSIZE=a4
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Pcl
+-r300x300
+
+-dupOutputYOffset=300
+-dupMargins="{ 0.0 36.0 12.0 12.0}"
+-dupBlackTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0010 0.0042 0.0094 0.0166 0.0260 0.0375 0.0510
+ 0.0666 0.0843 0.1041 0.1259 0.1498 0.1758 0.2039 0.2341
+ 0.2663 0.3007 0.3371 0.3756 0.4162 0.4589 0.5036 0.5505
+ 0.5994 0.6504 0.7034 0.7586 0.8158 0.8751 0.9365 1.0000
+}"
+-dupBeginPageCommand="<
+1b25 2d31 3233 3435 5840
+504a 4c20 454e 5445 5220 4c41 4e47 5541
+4745 3d50 434c 534c 4545 4b0a 1b45 1b2a
+6232 421b 2a6f 3557 040c 0000 001b 2a6f
+3144 1b26 6c31 481b 266c 3236 6130 4c1b
+2a6f 3557 0103 0000 011b 266c 304d 1b26
+6c30 6f30 451b 2a6f 2d31 4d1b 2675 3330
+3044 1b2a 7030 581b 2a70 3059 1b2a 6732
+3657 0204 012c 012c 0002 012c 012c 0002
+012c 012c 0002 012c 012c 0002 1b2a 7232
+3430 3053 1b2a 7231 411b 2a62 324d 1b2a
+6231 591b 2a62 326d>"
+-dupAdjustPageWidthCommand
+-dupEndPageCommand="(0M\033*rbC\033E\033&l0H)"
+-dupAbortCommand="(0M\033*rbC\033E\15\12\12\12\12 Printout-Aborted\15\033&l0H)"
+-dupYMoveCommand="(%dy\0)"
+-dupWriteComponentCommands="{ (%dv\0) (%dv\0) (%dv\0) (%dw\0) }"
diff --git a/lib/cid2code.ps b/lib/cid2code.ps
new file mode 100644
index 00000000..46bd1d29
--- /dev/null
+++ b/lib/cid2code.ps
@@ -0,0 +1,159 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Construct an inverse map from CIDs to codes.
+
+% Create an inverse map from CIDs to code values.
+% We only use this for 16-bit Unicode, so it has some limitations.
+% After invoking .cmap2code, loading a CMap file prints out the map
+% instead of doing what it usually does. For example:
+%
+% gs -dNODISPLAY -dBATCH lib/cid2code.ps -c .cmap2code\
+% -f Resource/CMap/UniJIS-UCS2-H > mapfile
+
+/.cmap2codedict 10 dict begin
+
+/begincmap {
+ mark
+} def
+/endcmap {
+ % Stack: mark code_lo1 code_hi1 cid1 ...
+ 20 dict begin
+ /depth counttomark 3 sub def
+ % Do a first pass to determine the maximum CID.
+ 0 0 3 depth {
+ 1 add /d exch def
+ d index d 2 add index 1 get add d 3 add index 1 get sub .max
+ } for
+ 1 add /ncid exch def
+ /map ncid 2 mul string def
+ % Now fill in the map.
+ 0 3 depth {
+ /d exch def
+ d index 2 mul /cid2 exch def
+ d 1 add index /hi exch def
+ d 2 add index 2 string copy /lo exch def
+ lo 1 get 1 hi 1 get {
+ map cid2 lo 0 get put
+ map cid2 1 add 3 -1 roll put
+ /cid2 cid2 2 add def
+ } for
+ } for
+ % Print the map.
+ (%stdout) (w) file
+ dup (<) print
+ dup /ASCIIHexEncode filter
+ dup map writestring
+ closefile
+ () = flush
+ closefile
+ end
+} def
+%/begincodespacerange
+/endcodespacerange {cleartomark} def
+%/usecmap
+
+%/beginbfchar
+/endbfchar {cleartomark} def
+%/beginbfrange
+/endbfrange {cleartomark} def
+
+%/begincidchar
+/endcidchar {
+ counttomark 2 idiv { dup counttomark 1 add 3 roll } repeat pop
+} def
+%/begincidrange
+/endcidrange {
+ counttomark 1 add -1 roll pop
+} def
+
+%/beginnotdefchar
+/endnotdefchar {cleartomark} def
+%/beginnotdefrange
+/endnotdefrange {cleartomark} def
+
+currentdict end readonly def
+
+/.cmap2code { % - .cmap2code -
+ /CIDInit /ProcSet findresource dup length dict copy
+ .cmap2codedict { 3 copy put pop pop } forall
+ /CIDInit exch /ProcSet defineresource pop
+} def
+
+% Extract and print reverse mapping information from a cid2code.txt file.
+/.printhex2 { % <int16> .printhex2 -
+ (<) print
+ 16#10000 add 16 =string cvrs 1 4 getinterval print
+ (>) print
+} def
+/.cid2code { % <cmaptemplate> <file> <column> .cid2code -
+ 30 dict begin
+ /column exch def
+ (r) file /f exch def
+ (%!) =
+ (/CIDInit /ProcSet findresource begin 12 dict begin begincmap) =
+ % Print the information from the template.
+ {
+ exch ==only ( ) print
+ dup type /dicttype eq {
+ dup length =only ( dict dup begin) = {
+ ( ) print exch ===only ( ) print ===only ( def) =
+ } forall (end def) =
+ } {
+ ===only
+ } ifelse ( def) =
+ } forall
+ % Read the data from the cid2code.txt file.
+ {
+ f =string readline pop (CID\t) anchorsearch { pop pop exit } if pop
+ } loop
+ /map [ {
+ f =string readline not { pop exit } if
+ column { (\t) search pop pop pop } repeat
+ (\t) search { exch pop exch pop } if
+ (,) search { exch pop exch pop } if
+ dup length 4 ne { pop (*) } if
+ dup (*) eq { pop (0000) } if
+ (16#) exch concatstrings cvi
+ } loop ] def
+ % Print the code space range(s).
+ /maxcid map length 1 sub def
+ mark maxcid
+ dup 255 and 255 eq {
+ 0 exch
+ } {
+ dup 16#ff00 and exch 0 2 index 1 sub
+ } ifelse
+ counttomark 2 idiv dup =only ( begincodespacerange) = {
+ exch .printhex2 .printhex2 () =
+ } repeat (endcodespacerange) =
+ % Print the map data.
+ 0 1 100 maxcid {
+ /lo exch def
+ /hi lo 99 add maxcid .min def
+ 0 lo 1 hi { map exch get 0 ne { 1 add } if } for
+ dup 0 eq {
+ pop
+ } {
+ =only ( begincidchar) = lo 1 hi {
+ map 1 index get dup 0 eq { pop pop } { exch .printhex2 = } ifelse
+ } for (endcidchar) =
+ } ifelse
+ } for
+ % Wrap up.
+ (endcmap CMapName currentdict /CMap defineresource pop end end) =
+ f closefile
+ end
+} bind def
diff --git a/lib/dnj750c.upp b/lib/dnj750c.upp
new file mode 100644
index 00000000..cfb4d913
--- /dev/null
+++ b/lib/dnj750c.upp
@@ -0,0 +1,47 @@
+-supModel="HP Designjet 750c, 300x300DpI, Gamma=2.5, CMY"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceRGB
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Pcl
+-r300x300
+-dupMargins="{0.0 0.0 0.0 0.0}"
+-dupRedTransfer="{1.0 0.921295345 0.846429467 0.775337517 0.707954228
+0.644212425 0.584044278 0.527380228 0.474149585 0.424279869 0.377697408
+0.334326446 0.294089675 0.256907612 0.222698912 0.191379622 0.162863538
+0.137061611 0.113881744 0.0932285339 0.0750028 0.0591011234 0.0454152822
+0.0338314585 0.0242292974 0.0164806321 0.0104477014 0.00598061318 0.00291339168
+0.00105723308 0.000186894162 0.0}"
+-dupGreenTransfer="{1.0 0.921295345 0.846429467 0.775337517 0.707954228
+0.644212425 0.584044278 0.527380228 0.474149585 0.424279869 0.377697408
+0.334326446 0.294089675 0.256907612 0.222698912 0.191379622 0.162863538
+0.137061611 0.113881744 0.0932285339 0.0750028 0.0591011234 0.0454152822
+0.0338314585 0.0242292974 0.0164806321 0.0104477014 0.00598061318 0.00291339168
+0.00105723308 0.000186894162 0.0}"
+-dupBlueTransfer="{1.0 0.921295345 0.846429467 0.775337517 0.707954228
+0.644212425 0.584044278 0.527380228 0.474149585 0.424279869 0.377697408
+0.334326446 0.294089675 0.256907612 0.222698912 0.191379622 0.162863538
+0.137061611 0.113881744 0.0932285339 0.0750028 0.0591011234 0.0454152822
+0.0338314585 0.0242292974 0.0164806321 0.0104477014 0.00598061318 0.00291339168
+0.00105723308 0.000186894162 0.0}"
+-dupBeginPageCommand="<1b252d31323334355840504a4c204a4f42204e414d45203d20226773
+220d0a40504a4c20534554204d4952524f52203d204f4646200a40504a4c205345542050414c4554
+5445534f55524345203d20534f465457415245200a40504a4c205345542052454e4445524d4f4445
+203d20434f4c4f52200a40504a4c20534554205245534f4c5554494f4e203d2030200a40504a4c20
+534554205052494e5441524541203d2046554c4c53495a45200a40504a4c20534554205041504552
+4c454e475448203d2030200a40504a4c205345542050415045525749445448203d2030200a40504a
+4c20534554204f5249454e544154494f4e203d20504f525452414954200a40504a4c20534554204d
+415247494e53203d204e4f524d414c200a40504a4c20454e544552204c414e4755414745203d2048
+50474c32200d0a1b2531424250352c31494e5755304e50384543514c3130301b2531411b2661314e
+1b2a7631385700000308080800ff00ff00ff0000000000001b2a7632353561323535623235356330
+491b2a763061323535623235356331491b2a763235356130623235356332491b2a76306130623235
+356333491b2a763235356132353562306334491b2a76306132353562306335491b2a763235356130
+62306336491b2a7630613062306337491b2a74521b2a72531b2a72541b2a7231411b2a62324d>"
+-dupAdjustPageWidthCommand
+-dupAdjustPageLengthCommand
+-dupAdjustResolutionCommand
+-dupEndPageCommand="<1b2a72431b451b25314250473b1b252d313233343558>"
+-dupAbortCommand="
+(\033*rC\033E\15\12\12\12\12 Printout-Aborted\033%1BPG;\033%-12345X)"
+-dupWriteComponentCommands="{(\033*b%dV\0) (\033*b%dV\0) (\033*b%dW\0)}"
diff --git a/lib/dnj750m.upp b/lib/dnj750m.upp
new file mode 100644
index 00000000..5a14cfc1
--- /dev/null
+++ b/lib/dnj750m.upp
@@ -0,0 +1,59 @@
+-supModel="HP Designjet 750m, 600x600DpI, Gamma=2.5, CMY"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Pcl
+-r600x600
+-dupMargins="{0.0 0.0 0.0 0.0}"
+-dupWhiteTransfer="{
+1.0 0.921295345 0.846429467 0.775337517 0.707954228
+0.644212425 0.584044278 0.527380228 0.474149585 0.424279869
+0.377697408 0.334326446 0.294089675 0.256907612 0.222698912
+0.191379622 0.162863538 0.137061611 0.113881744 0.0932285339
+0.0750028 0.0591011234 0.0454152822 0.0338314585 0.0242292974
+0.0164806321 0.0104477014 0.00598061318 0.00291339168 0.00105723308
+0.000186894162 0.0
+}"
+-dupBeginPageCommand="<
+ 1b252d313233343558
+ 40504a4c204a4f42204e414d45203d20226773220d0a
+ 40504a4c20534554204d4952524f52203d204f4646200a
+ 40504a4c205345542050414c45545445534f55524345203d20534f465457415245200a
+ 40504a4c205345542052454e4445524d4f4445203d20475241595343414c45200a
+ 40504a4c20534554205245534f4c5554494f4e203d2030200a
+ 40504a4c20534554205052494e5441524541203d2046554c4c53495a45200a
+ 40504a4c205345542050415045524c454e475448203d2030200a
+ 40504a4c205345542050415045525749445448203d2030200a
+ 40504a4c20534554204f5249454e544154494f4e203d20504f525452414954200a
+ 40504a4c20534554204d415247494e53203d204e4f524d414c200a
+ 40504a4c20454e544552204c414e4755414745203d204850474c32200d0a
+ 1b253142
+ 4250352c31
+ 494e
+ 575530
+ 4e5032
+ 4543
+ 514c313030
+ 1b253141
+ 1b2661314e
+ 1b2a763657
+ 00
+ 00
+ 01
+ 080808
+ 1b2a76 32353561 32353562 32353563 3049
+ 1b2a76 3061 3062 3063 3149
+ 1b2a74 33323152
+ 1b2a72 33323153
+ 1b2a72 54
+ 1b2a72 3141
+ 1b2a62 324d
+>"
+-dupAdjustPageWidthCommand
+-dupAdjustPageLengthCommand
+-dupAdjustResolutionCommand
+-dupEndPageCommand="(\033*rC\033E\033%1BPG;\033%-12345X)"
+-dupAbortCommand="(\033*rC\033E\15\12\12\12\12 Printout-Aborted\033%1BPG;\033%-12345X)"
+-dupWriteComponentCommands="{ (\033*b%dW\0) }"
diff --git a/lib/docie.ps b/lib/docie.ps
new file mode 100644
index 00000000..286ef2cb
--- /dev/null
+++ b/lib/docie.ps
@@ -0,0 +1,219 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% docie.ps
+% Emulate CIE algorithms in PostScript.
+
+% ---------------- Auxiliary procedures ---------------- %
+
+/r1default [0 1] def
+/r3default [0 1 0 1 0 1] def
+
+/apply3 % <u> <v> <w> [<pu> <pv> <pw>] apply3 <u'> <v'> <w'>
+ { { 4 -1 roll exch exec } forall
+ } bind def
+
+/restrict % <u> <min> <max> restrict <u'>
+ { 3 1 roll .max .min
+ } bind def
+
+/restrict3 % <u> <v> <w> [<minu> ... <maxw>] restrict3 <u'> <v'> <w'>
+ { aload pop
+ 7 -1 roll 3 1 roll restrict 7 1 roll
+ 5 -1 roll 3 1 roll restrict 5 1 roll
+ restrict 3 1 roll
+ } bind def
+
+/rescale % <u> <min> <max> rescale <u'>
+ { 1 index sub 3 1 roll sub exch div 0 .max 1 .min
+ } bind def
+
+/rescale3 % <u> <v> <w> [<minu> ... <maxw>] rescale3 <u'> <v'> <w'>
+ { aload pop
+ 7 -1 roll 3 1 roll rescale 7 1 roll
+ 5 -1 roll 3 1 roll rescale 5 1 roll
+ rescale 3 1 roll
+ } bind def
+
+/mmult3 % <u> <v> <w> [<uu> <uv> ... <wv> <ww>] mmult3
+ % <u'> <v'> <w'>
+ { 4 -1 roll dup dup 6 -1 roll dup dup 8 -1 roll dup dup
+ 10 -1 roll { 10 -1 roll mul } forall
+ % Stack: u1 v1 w1 u2 v2 w2 u3 v3 w3
+ 4 -1 roll add 6 -1 roll add
+ % Stack: u1 v1 u2 v2 u3 v3 w'
+ 7 1 roll 3 -1 roll add 4 -1 roll add
+ % Stack: w' u1 u2 u3 v'
+ 5 1 roll add add 3 1 roll
+ } bind def
+
+/minvert3 % [<uu> <uv> ... <wv> <ww>] minvert3
+ % [<uu'> <uv'> ... <wv'> <ww'>]
+ { 16 dict begin
+ aload pop { I H G F E D C B A } { exch def } forall
+ /coa E I mul F H mul sub def
+ /cob F G mul D I mul sub def
+ /coc D H mul E G mul sub def
+ /det A coa mul B cob mul add C coc mul add def
+ [ coa det div
+ C H mul B I mul sub det div
+ B F mul C E mul sub det div
+ cob det div
+ A I mul C G mul sub det div
+ C D mul A F mul sub det div
+ coc det div
+ B G mul A H mul sub det div
+ A E mul B D mul sub det div
+ ]
+ end
+ } bind def
+
+/print1
+ { print dup ==
+ } bind def
+
+/print3
+ { print 3 array astore dup == aload pop
+ } bind def
+
+% ---------------- Mapping to XYZ ---------------- %
+
+/csmap % <csdict> <l> <m> <n> csmap <csdict> <x> <y> <z>
+ { 3 index /RangeLMN .knownget not { r3default } if restrict3
+DOCIEDEBUG { (After RangeLMN Decode: ) print3 } if
+ 3 index /DecodeLMN .knownget { apply3 } if
+DOCIEDEBUG { (After DecodeLMN Decode: ) print3 } if
+ 3 index /MatrixLMN .knownget { mmult3 } if
+DOCIEDEBUG { (After MatrixLMN Decode: ) print3 } if
+ } bind def
+
+/csciea % <csdict> <a> csciea <csdict> <x> <y> <z>
+ { 1 index /RangeA .knownget not { r1default aload pop } if restrict
+DOCIEDEBUG { (After RangeA Decode: ) print1 } if
+ 1 index /DecodeA .knownget { exec } if
+DOCIEDEBUG { (After DecodeA Decode: ) print1 } if
+ 1 index /MatrixA .knownget
+ { { 1 index mul exch } forall pop }
+ { dup dup }
+ ifelse
+DOCIEDEBUG { (After MatrixA Decode: ) print3 } if
+ csmap
+ } bind def
+
+/cscieabc % <csdict> <a> <b> <c> cscieabc <csdict> <x> <y> <z>
+ { 3 index /RangeABC .knownget not { r3default } if restrict3
+DOCIEDEBUG { (After RangeABC Decode: ) print3 } if
+ 3 index /DecodeABC .knownget { apply3 } if
+DOCIEDEBUG { (After DecodeABC Decode: ) print3 } if
+ 3 index /MatrixABC .knownget { mmult3 } if
+DOCIEDEBUG { (After MatrixABC Decode: ) print3 } if
+ csmap
+ } bind def
+
+% ---------------- Rendering from XYZ ---------------- %
+
+/lookup3 % <rtable> <a[0..1]> <b[0..1]> <c[0..1]> lookup3
+ % <rtable> <bytes>
+ { 3 -1 roll 3 index 0 get 1 sub mul
+ 3 -1 roll 3 index 1 get 1 sub mul
+ 3 -1 roll 3 index 2 get 1 sub mul
+ % Stack: rtable ia ib ic
+DOCIEDEBUG { (RenderTable indices: ) print3 mark 5 1 roll } if
+ 3 -1 roll round cvi 3 index 3 get exch get
+ % Stack: rtable ib ic string
+ 3 -1 roll round cvi 3 index 2 get mul
+ % Stack: rtable ic string ib*nc
+ 3 -1 roll round cvi add 2 index 4 get mul
+ % Stack: rtable string index
+ 2 index 4 get getinterval
+ % Stack: rtable bytes
+DOCIEDEBUG { (RenderTable values: ) print (<) print (%stdout) (w) file 1 index writehexstring (>) = } if
+ } bind def
+
+/bpdefault [0 0 0] def
+
+/crmap % <csdict> <crdict> <x> <y> <z> crmap <v1> ...
+ {
+DOCIEDEBUG { (CIE XYZ = ) print3 } if
+ 3 index /MatrixPQR .knownget { mmult3 } if
+DOCIEDEBUG { (After MatrixPQR: ) print3 } if
+ 4 index /WhitePoint get
+ 5 index /BlackPoint .knownget not { bpdefault } if
+ 5 index /WhitePoint get
+ 6 index /BlackPoint .knownget not { bpdefault } if
+ 4
+ { 4 -1 roll aload pop
+ % Stack: csdict crdict x y z pt pt pt px py pz
+ 3 copy 12 index /MatrixPQR .knownget { mmult3 } if 6 array astore
+ }
+ repeat
+ % Stack: csdict crdict x y z wps+ bps+ wpd+ bpd+
+ 9 -1 roll pop % get rid of csdict
+ 7 4 roll
+ 7 index /TransformPQR get
+ { % Stack: crdict wps+ bps+ wpd+ bpd+ u v w proc
+ 8 copy exch pop exch pop
+ exec exch pop 4 -1 roll pop
+ }
+ forall
+ 7 3 roll pop pop pop pop % get rid of White/BlackPoints
+DOCIEDEBUG { (After TransformPQR: ) print3 } if
+ 3 index /MatrixPQR .knownget { minvert3 mmult3 } if
+DOCIEDEBUG { (After MatrixPQR': ) print3 } if
+ 3 index /MatrixLMN .knownget { mmult3 } if
+DOCIEDEBUG { (After MatrixLMN Encode: ) print3 } if
+ 3 index /EncodeLMN .knownget { apply3 } if
+DOCIEDEBUG { (After EncodeLMN Encode: ) print3 } if
+ 3 index /RangeLMN .knownget not { r3default } if restrict3
+DOCIEDEBUG { (After RangeLMN Encode: ) print3 } if
+ 3 index /MatrixABC .knownget { mmult3 } if
+DOCIEDEBUG { (After MatrixABC Encode: ) print3 } if
+ 3 index /EncodeABC .knownget { apply3 } if
+DOCIEDEBUG { (After EncodeABC Encode: ) print3 } if
+ 3 index /RangeABC .knownget not { r3default } if
+ 5 -1 roll /RenderTable .knownget
+ { % Stack: u v w ranges rtable
+ 5 1 roll rescale3
+DOCIEDEBUG { (Rescaled ABC: ) print3 } if
+ % Stack: rtable a b c
+ lookup3
+ % Stack: rtable bytes
+ 0 1 3 index 4 get 1 sub
+ { % Stack: values rtable bytes c
+ 2 copy get 255 div
+ % Stack: values rtable bytes c v
+ 3 index 3 -1 roll 5 add get exec 3 1 roll
+ }
+ for pop pop
+DOCIEDEBUG { (After RenderTableT: ) print ] dup == aload pop } if
+ }
+ { restrict3
+DOCIEDEBUG { (After RangeABC Encode: ) print3 } if
+ }
+ ifelse
+ } bind def
+
+% ---------------- Top level control ---------------- %
+
+/mapdict mark
+ /CIEBasedA { 1 get exch csciea currentcolorrendering 4 1 roll crmap } bind
+ /DeviceGray { pop /DefaultGray /ColorSpace findresource 1 get exch csciea currentcolorrendering 4 1 roll crmap } bind
+ /CIEBasedABC { 1 get 4 1 roll cscieabc currentcolorrendering 4 1 roll crmap } bind
+ /DeviceRGB { pop /DefaultRGB /ColorSpace findresource 1 get 4 1 roll cscieabc currentcolorrendering 4 1 roll crmap } bind
+.dicttomark def
+/mapcie % <a> mapcie <v1> ...
+ % <a> <b> <c> mapcie <v1> ...
+ { currentcolorspace dup 0 get //mapdict exch get exec
+ } bind def
diff --git a/lib/dvipdf b/lib/dvipdf
new file mode 100755
index 00000000..f643087f
--- /dev/null
+++ b/lib/dvipdf
@@ -0,0 +1,46 @@
+#!/bin/sh
+# Convert DVI to PDF.
+#
+# Please contact Andrew Ford <A.Ford@ford-mason.co.uk> with any questions
+# about this file.
+#
+# Based on ps2pdf
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+
+
+OPTIONS=""
+DVIPSOPTIONS=""
+while true
+do
+ case "$1" in
+ -R*) DVIPSOPTIONS="$DVIPSOPTIONS $1";;
+ -?*) OPTIONS="$OPTIONS $1" ;;
+ *) break ;;
+ esac
+ shift
+done
+
+if [ $# -lt 1 -o $# -gt 2 ]; then
+ echo "Usage: `basename \"$0\"` [options...] input.dvi [output.pdf]" 1>&2
+ exit 1
+fi
+
+infile=$1;
+
+if [ $# -eq 1 ]
+then
+ case "${infile}" in
+ *.dvi) base=`basename "${infile}" .dvi` ;;
+ *) base=`basename "${infile}"` ;;
+ esac
+ outfile="${base}".pdf
+else
+ outfile=$2
+fi
+
+# We have to include the options twice because -I only takes effect if it
+# appears before other options.
+exec dvips -Ppdf $DVIPSOPTIONS -q -f "$infile" | $GS_EXECUTABLE $OPTIONS -q -P- -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sstdout=%stderr -sOutputFile="$outfile" $OPTIONS
diff --git a/lib/eps2eps b/lib/eps2eps
new file mode 100755
index 00000000..e50f18e9
--- /dev/null
+++ b/lib/eps2eps
@@ -0,0 +1,28 @@
+#!/bin/sh
+# "Distill" Encapsulated PostScript.
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+OPTIONS="-dDEVICEWIDTH=250000 -dDEVICEHEIGHT=250000"
+while true
+do
+ case "$1" in
+ -?*) OPTIONS="$OPTIONS $1" ;;
+ *) break ;;
+ esac
+ shift
+done
+
+if [ $# -ne 2 ]; then
+ echo "Usage: `basename \"$0\"` ...switches... input.eps output.eps" 1>&2
+ exit 1
+fi
+
+exec "$GS_EXECUTABLE" -q -sDEVICE=eps2write -sstdout=%stderr "-sOutputFile=$2" -dNOPAUSE -dBATCH -P- -dSAFER $OPTIONS "$1"
diff --git a/lib/eps2eps.bat b/lib/eps2eps.bat
new file mode 100755
index 00000000..f7c17536
--- /dev/null
+++ b/lib/eps2eps.bat
@@ -0,0 +1,25 @@
+@echo off
+@rem "Distill" Encapsulated PostScript.
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+call "%~dp0gssetgs.bat"
+echo -dNOPAUSE -dBATCH -P- -dSAFER >"%TEMP%\_.at"
+rem Watcom C deletes = signs, so use # instead.
+echo -dDEVICEWIDTH#250000 -dDEVICEHEIGHT#250000 >>"%TEMP%\_.at"
+:cp
+if %3/==/ goto doit
+echo %1 >>"%TEMP%\_.at"
+shift
+goto cp
+
+:doit
+rem Watcom C deletes = signs, so use # instead.
+%GSC% -q -sDEVICE#eps2write -sOutputFile#%2 @"%TEMP%\_.at" %1
+if exist "%TEMP%\_.at" erase "%TEMP%\_.at"
+goto end
+
+:usage
+echo "Usage: eps2eps ...switches... input.eps output.eps"
+
+:end
diff --git a/lib/eps2eps.cmd b/lib/eps2eps.cmd
new file mode 100755
index 00000000..51b51bc0
--- /dev/null
+++ b/lib/eps2eps.cmd
@@ -0,0 +1,35 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+/* "Distill" Encapsulated PostScript. */
+
+parse arg params
+
+gs='@gsos2'
+
+if params='' then call usage
+
+options='-dNOPAUSE -dBATCH -P- -dSAFER'
+
+/* extract options from command line */
+i=1
+param=word(params,i)
+do while substr(param,1,1)='-'
+ options=options param
+ i=i+1
+ param=word(params,i)
+end
+
+infile=param
+if infile='' then call usage
+outfile=word(params,i+1)
+if outfile='' then call usage
+
+gs '-q -sDEVICE=eps2write -sOutputFile='outfile options infile
+exit
+
+usage:
+say 'Usage: eps2eps ...switches... input.eps output.eps'
+exit
diff --git a/lib/font2pcl.ps b/lib/font2pcl.ps
new file mode 100644
index 00000000..db0131a2
--- /dev/null
+++ b/lib/font2pcl.ps
@@ -0,0 +1,604 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% font2pcl.ps
+% Write out a font as a PCL bitmap font.
+
+/pcldict 60 dict def
+
+% Write out the current font as a PCL bitmap font.
+% The current transformation matrix defines the font size and orientation.
+
+/WriteResolution? false def % true=use "resolution bound font" format,
+ % false=use older format
+
+/LJ4 false def % true=use LJ4 Typeface code
+ % false=use LJIIP/IID/IIIx Typeface code
+
+pcldict begin % internal procedures
+
+/findstring % <string> <substring> findstring <bool>
+ { search { pop pop pop true } { pop false } ifelse
+ } def
+
+ % Determine which set of keywords is present in a string.
+ % The last keyword set must be empty.
+
+/keysearch % <string> <array of arrays of keywords> keysearch <index>
+ { 0 1 2 index length 1 sub
+ { 2 copy get true exch
+ { % Stack: <string> <a.a.k.> <index> <bool> <keyword>
+ 4 index exch findstring and
+ }
+ forall
+ { 0 exch getinterval exit
+ }
+ if pop
+ }
+ for
+ exch pop length % invalid index if missing
+ } def
+
+ % Determine the device height of a string in quarter-dots.
+
+/charheight % <string> charheight <int>
+ { gsave newpath 0 0 moveto false charpath
+ pathbbox exch pop exch sub exch pop 0 exch grestore
+ dtransform add abs 4 mul cvi
+ } def
+
+ % Compute an integer version of the transformed FontBBox.
+
+/inflate % <num> inflate <num>
+ { dup 0 gt { ceiling } { floor } ifelse
+ } def
+/ixbbox % - ixbbox <llx> <lly> <urx> <ury>
+ { /FontBBox load aload pop % might be executable or literal
+ 4 2 roll transform exch truncate cvi exch truncate cvi
+ 4 2 roll transform exch inflate cvi exch inflate cvi
+ } def
+
+ % Determine the original font of a possibly transformed font.
+ % Since some badly behaved PostScript files construct transformed
+ % fonts "by hand", we can't just rely on the OrigFont pointers.
+ % Instead, if a font with the given name exists, and if its
+ % entries for FontType and UniqueID match those of the font we
+ % obtain by following the OrigFont chain, we use that font.
+
+/origfont
+ { { dup /OrigFont known not { exit } if /OrigFont get } loop
+ FontDirectory 1 index /FontName get .knownget
+ { % Stack: origfont namedfont
+ 1 index /FontType get 1 index /FontType get eq
+ { 1 index /UniqueID .knownget
+ { 1 index /UniqueID .knownget
+ { eq { exch } if }
+ { pop }
+ ifelse
+ }
+ if
+ }
+ if pop
+ }
+ if
+ } def
+
+ % Determine the bounding box of the current device's image.
+ % Free variables: row, zerow.
+
+/devbbox % <rw> <rh> devbbox <ymin> <ymax1> <xmin> <xmax1>
+ { % Find top and bottom whitespace.
+ dup
+ { dup 0 eq { exit } if 1 sub
+ dup currentdevice exch row copyscanlines
+ zerow ne { 1 add exit } if
+ }
+ loop % ymax1
+ 0
+ { 2 copy eq { exit } if
+ dup currentdevice exch row copyscanlines
+ zerow ne { exit } if
+ 1 add
+ }
+ loop % ymin
+ exch
+ % Find left and right whitespace.
+ 3 index 0
+ % Stack: rw rh ymin ymax1 xmin xmax1
+ 3 index 1 4 index 1 sub
+ { currentdevice exch row copyscanlines .findzeros
+ exch 4 1 roll .max 3 1 roll .min exch
+ }
+ for % xmin xmax1
+ % Special check: xmin > xmax1 if height = 0
+ 2 copy gt { exch pop dup } if
+ 6 -2 roll pop pop
+
+ } def
+
+ % Write values on outfile.
+
+ /w1 { 255 and outfile exch write } def
+ /w2 { dup -8 bitshift w1 w1 } def
+ /wbyte % <byte> <label> wbyte
+ { VDEBUG { print ( =byte= ) print dup == flush } { pop } ifelse w1
+ } def
+ /wword % <word16> <label> wword
+ { VDEBUG { print ( =word= ) print dup == flush } { pop } ifelse w2
+ } def
+ /wdword % <word32> <label> wdword
+ { VDEBUG { print ( =dword= ) print dup == flush } { pop } ifelse
+ dup -16 bitshift w2 w2
+ } def
+
+/style.posture.keys
+ [ { (Italic) } { (Oblique) }
+ { }
+ ] def
+/style.posture.values <010100> def
+
+/style.appearance.width.keys
+ [ { (Ultra) (Compressed) }
+ { (Extra) (Compressed) }
+ { (Extra) (Condensed) }
+ { (Extra) (Extended) }
+ { (Extra) (Expanded) }
+ { (Compressed) }
+ { (Condensed) }
+ { (Extended) }
+ { (Expanded) }
+ { }
+ ] def
+/style.appearance.width.values <04030207070201060600> def
+
+/width.type.keys
+ [ { (Ultra) (Compressed) }
+ { (Extra) (Compressed) }
+ { (Extra) (Condensed) }
+ { (Extra) (Expanded) }
+ { (Compressed) }
+ { (Condensed) }
+ { (Expanded) }
+ { }
+ ] def
+/width.type.values <fbfcfd03fdfe0200> def
+
+/stroke.weight.keys
+ [ { (Ultra) (Thin) }
+ { (Ultra) (Black) }
+ { (Extra) (Thin) }
+ { (Extra) (Light) }
+ { (Extra) (Bold) }
+ { (Extra) (Black) }
+ { (Demi) (Light) }
+ { (Demi) (Bold) }
+ { (Semi) (Light) }
+ { (Semi) (Bold) }
+ { (Thin) }
+ { (Light) }
+ { (Bold) }
+ { (Black) }
+ { }
+ ] def
+/stroke.weight.values <f907fafc0406fe02ff01fbfd030500> def
+
+/vendor.keys
+ [ { (Agfa) }
+ { (Bitstream) }
+ { (Linotype) }
+ { (Monotype) }
+ { (Adobe) }
+ { }
+ ] def
+/vendor.default.index 4 def % might as well be Adobe
+/old.vendor.values <020406080a00> def
+/new.vendor.values <010203040500> def
+/vendor.initials (CBLMA\000) def
+
+currentdict readonly end pop % pcldict
+
+% Convert and write a PCL font for the current font and transformation.
+
+% Write the font header. We split this off only to avoid overflowing
+% the limit on the maximum size of a procedure.
+% Free variables: outfile uury u0y rw rh orientation uh ully
+/writefontheader
+ { outfile (\033\)s) writestring
+ outfile 64 WriteResolution? { 4 add } if
+ Copyright length add write==only
+ outfile (W) writestring
+ WriteResolution? { 20 68 } { 0 64 } ifelse
+ (Font Descriptor Size) wword
+ (Header Format) wbyte
+ 1 (Font Type) wbyte
+ FullName style.posture.keys keysearch style.posture.values exch get
+ FullName style.appearance.width.keys keysearch
+ style.appearance.width.values exch get 4 mul add
+ PaintType 2 eq { 32 add } if
+ /style exch def
+ style -8 bitshift (Style MSB) wbyte
+ 0 (Reserved) wbyte
+ /baseline uury 1 sub u0y sub def
+ baseline (Baseline Position) wword
+ rw (Cell Width) wword
+ rh (Cell Height) wword
+ orientation (Orientation) wbyte
+ FontInfo /isFixedPitch .knownget not { false } if
+ { 0 } { 1 } ifelse (Spacing) wbyte
+ % Use loop/exit to fake a multiple-exit block.
+ { Encoding StandardEncoding eq { 10 (J) exit } if
+ Encoding ISOLatin1Encoding eq { 11 (J) exit } if
+ Encoding SymbolEncoding eq { 19 (M) exit } if
+ Encoding DingbatsEncoding eq { 10 (L) exit } if
+% (Warning: unknown Encoding, using ISOLatin1.\n) print flush
+ 11 (J) exit
+ }
+ loop
+ 0 get 64 sub exch 32 mul add (Symbol Set) wword
+ ( ) stringwidth pop 0 dtransform add abs 4 mul
+ /pitch exch def
+ pitch cvi (Pitch) wword
+ uh 4 mul (Height) wword % Height
+ (x) charheight (x-Height) wword
+ FullName width.type.keys keysearch
+ width.type.values exch get (Width Type) wbyte
+ style 255 and (Style LSB) wbyte
+ FullName stroke.weight.keys keysearch
+ stroke.weight.values exch get (Stroke Weight) wbyte
+ FullName vendor.keys keysearch
+ dup vendor.initials exch get 0 eq
+ { % No vendor in FullName, try Notice
+ pop Copyright vendor.keys keysearch
+ dup vendor.initials exch get 0 eq { pop vendor.default.index } if
+ }
+ if
+ /vendor.index exch def
+ 0 (Typeface LSB) wbyte % punt
+ 0 (Typeface MSB) wbyte % punt
+ 0 (Serif Style) wbyte % punt
+ 2 (Quality) wbyte
+ 0 (Placement) wbyte
+ gsave FontMatrix concat rot neg rotate
+ /ulwidth
+ FontInfo /UnderlineThickness .knownget
+ { 0 exch dtransform exch pop abs }
+ { resolution 100 div }
+ ifelse def
+ FontInfo /UnderlinePosition .knownget
+ { 0 exch transform exch pop negY ulwidth 2 div add }
+ { ully ulwidth add }
+ ifelse u0y sub
+ round cvi 1 .max 255 .min (Underline Position) wbyte
+ ulwidth round cvi 1 .max 255 .min (Underline Thickness) wbyte
+ grestore
+ uh 1.2 mul 4 mul cvi (Text Height) wword
+ (average lowercase character) dup stringwidth
+ pop 0 dtransform add abs
+ exch length div 4 mul cvi (Text Width) wword
+ 0
+ { dup Encoding exch get /.notdef ne { exit } if
+ 1 add
+ }
+ loop (First Code) wword
+ 255
+ { dup Encoding exch get /.notdef ne { exit } if
+ 1 sub
+ }
+ loop (Last Code) wword
+ pitch dup cvi sub 256 mul cvi (Pitch Extended) wbyte
+ 0 (Height Extended) wbyte
+ 0 (Cap Height) wword % (default)
+ currentfont /UniqueID known { UniqueID } { 0 } ifelse
+ 16#c1000000 add (Font Number (Adobe UniqueID)) wdword
+ FontName length 16 .max string
+ dup FontName exch cvs pop
+ outfile exch 0 16 getinterval writestring % Font Name
+ WriteResolution?
+ { resolution dup (X Resolution) wword (Y Resolution) wword
+ }
+ if
+ outfile Copyright writestring % Copyright
+ } def
+
+/writePCL % <fontfile> <resolution> writePCL -
+ {
+ save
+ currentfont begin
+ pcldict begin
+ 80 dict begin % allow for recursion
+ /saved exch def
+ /resolution exch def
+ /outfile exch def
+ matrix currentmatrix dup 4 0 put dup 5 0 put setmatrix
+
+ % Supply some default values so we don't have to check later.
+
+ currentfont /FontInfo known not { /FontInfo 1 dict def } if
+ currentfont /FontName known not { /FontName () def } if
+ /Copyright FontInfo /Notice .knownget not { () } if def
+ /FullName
+ FontInfo /FullName .knownget not
+ { FontName dup length string cvs }
+ if def
+
+ % Determine the original font, and its relationship to this one.
+
+ /OrigFont currentfont origfont def
+ /OrigMatrix OrigFont /FontMatrix get def
+ /OrigMatrixInverse OrigMatrix matrix invertmatrix def
+ /ScaleMatrix matrix currentfont OrigFont ne
+ { FontMatrix exch OrigMatrixInverse exch concatmatrix
+ } if
+ def
+ /CurrentScaleMatrix
+ matrix currentmatrix
+ matrix defaultmatrix
+ dup 0 get 1 index 3 get mul 0 lt
+ 1 index dup 1 get exch 2 get mul 0 gt or
+ /flipY exch def
+ dup invertmatrix
+ dup concatmatrix
+ def
+ /negY flipY { {neg} } { {} } ifelse def
+
+ % Print debugging information.
+
+ /CDEBUG where { pop } { /CDEBUG false def } ifelse
+ /VDEBUG where { pop } { /VDEBUG false def } ifelse
+ CDEBUG { /VDEBUG true def } if
+ DEBUG
+ { (currentmatrix: ) print matrix currentmatrix ==
+ (defaultmatrix: ) print matrix defaultmatrix ==
+ (flipY: ) print flipY ==
+ (scaling matrix: ) print CurrentScaleMatrix ==
+ (FontMatrix: ) print FontMatrix ==
+ (FontBBox: ) print /FontBBox load ==
+ currentfont OrigFont ne
+ { OrigFont /FontName .knownget { (orig FontName: ) print == } if
+ (orig FontMatrix: ) print OrigMatrix ==
+ } if
+ currentfont /ScaleMatrix .knownget { (ScaleMatrix: ) print == } if
+ gsave
+ FontMatrix concat
+ (combined matrix: ) print matrix currentmatrix ==
+ grestore
+ flush
+ } if
+
+ % Determine the orientation.
+
+ ScaleMatrix matrix currentmatrix dup concatmatrix
+ 0 1 3
+ { 1 index 1 get 0 eq 2 index 2 get 0 eq and 2 index 0 get 0 gt and
+ { exit } if
+ pop -90 matrix rotate exch dup concatmatrix
+ }
+ for
+ dup type /integertype ne
+ { (Only rotations by multiples of 90 degrees are supported:\n) print
+ == flush
+ saved end end end restore stop
+ }
+ if
+ /orientation exch def
+ /rot orientation 90 mul def
+ DEBUG { (orientation: ) print orientation == flush } if
+
+ dup dup 0 get exch 3 get negY sub abs 0.5 ge
+ { (Only identical scaling in X and Y is supported:\n) print
+ exch flipY 3 array astore ==
+%
+% .devicename has been deprecated
+% currentdevice .devicename ==
+%
+ currentpagedevice /Name get ==
+ matrix defaultmatrix == flush
+ saved end end end restore stop
+ }
+ if pop
+
+ % Determine the font metrics, in the PCL character coordinate system,
+ % which has +Y going towards the top of the page.
+
+ gsave
+ FontMatrix concat
+ 0 0 transform
+ negY round cvi /r0y exch def
+ round cvi /r0x exch def
+ ixbbox
+ negY /rury exch def /rurx exch def
+ negY /rlly exch def /rllx exch def
+ /rminx rllx rurx .min def
+ /rminy rlly negY rury negY .min def
+ /rw rurx rllx sub abs def
+ /rh rury rlly sub abs def
+ gsave rot neg rotate
+ 0 0 transform
+ negY round cvi /u0y exch def
+ round cvi /u0x exch def
+ ixbbox
+ negY /uury exch def /uurx exch def
+ negY /ully exch def /ullx exch def
+ /uw uurx ullx sub def
+ /uh uury ully sub def
+ grestore
+ DEBUG
+ { (rmatrix: ) print matrix currentmatrix ==
+ (rFontBBox: ) print [rllx rlly rurx rury] ==
+ (uFontBBox: ) print [ullx ully uurx uury] ==
+ flush
+ } if
+ grestore
+
+ % Disable the character cache, to avoid excessive allocation
+ % and memory sandbars.
+
+ mark cachestatus /upper exch def
+ cleartomark 0 setcachelimit
+
+ % Write the font header.
+
+ writefontheader
+
+ % Establish an image device for rasterizing characters.
+
+ matrix currentmatrix
+ dup 4 rminx neg put
+ dup 5 rminy neg put
+ % Round the width up to a multiple of 8
+ % so we don't get garbage bits in the last byte of each row.
+ rw 7 add -8 and rh <ff 00> makeimagedevice
+ /cdevice exch def
+ nulldevice % prevent page device switching
+ cdevice setdevice
+
+ % Rasterize each character in turn.
+
+ /raster rw 7 add 8 idiv def
+ /row raster string def
+ /zerow row length string def
+ 0 1 Encoding length 1 sub
+ { /cindex exch def
+ Encoding cindex get /.notdef ne
+ { VDEBUG { Encoding cindex get == flush } if
+ erasepage initgraphics
+ 0 0 moveto currentpoint transform add
+ ( ) dup 0 cindex put show
+ currentpoint transform add exch sub round cvi
+ /cwidth exch abs def
+ rw rh devbbox
+ VDEBUG
+ { (image bbox: ) print 4 copy 4 2 roll 4 array astore == flush
+ } if
+ % Save the device bounding box.
+ % Note that this is in current device coordinates,
+ % not PCL (right-handed) coordinates.
+ /bqx exch def /bpx exch def /bqy exch def /bpy exch def
+ % Re-render with the character justified to (0,0).
+ % This may be either the lower left or the upper left corner.
+ bpx neg bpy neg idtransform moveto
+ erasepage
+ VDEBUG { (show point: ) print [ currentpoint transform ] == flush } if
+ ( ) dup 0 cindex put show
+ % Find the bounding box. Note that xmin and ymin are now 0,
+ % xmax1 = xw, and ymax1 = yh.
+ rw rh devbbox
+ /xw exch def
+ % xmin or ymin can be non-zero only if the character is blank.
+ xw 0 eq
+ { pop }
+ { dup 0 ne { (Non-zero xmin! ) print = } { pop } ifelse }
+ ifelse
+ /yh exch def
+ yh 0 eq
+ { pop }
+ { dup 0 ne { (Non-zero ymin! ) print = } { pop } ifelse }
+ ifelse
+
+ /xbw xw 7 add 8 idiv def
+ /xright raster 8 mul xw sub def
+ % Write the Character Code command.
+ outfile (\033*c) writestring
+ outfile cindex write==only
+ outfile (E) writestring
+ % Write the Character Definition command.
+ outfile (\033\(s) writestring
+ yh xbw mul 16 add
+ outfile exch write=only
+ % Record the character position for the .PCM file.
+ /cfpos outfile fileposition 1 add def
+ outfile (W\004\000\016\001) writestring
+ orientation (Orientation) wbyte 0 (Reserved) wbyte
+ rminx bpx add r0x sub (Left Offset) wword
+ flipY { rminy bpy add neg } { rminy bqy add } ifelse r0y sub
+ (Top Offset) wword
+ xw (Character Width) wword
+ yh (Character Height) wword
+ cwidth orientation 2 ge { neg } if 4 mul (Delta X) wword
+ % Write the character data.
+ flipY { 0 1 yh 1 sub } { yh 1 sub -1 0 } ifelse
+ { cdevice exch row copyscanlines
+ 0 xbw getinterval
+ CDEBUG
+ { dup
+ { 8
+ { dup 128 ge { (+) } { (.) } ifelse print
+ 127 and 1 bitshift
+ }
+ repeat pop
+ }
+ forall (\n) print
+ }
+ if
+ outfile exch writestring
+ }
+ for
+ }
+ { /bpx 0 def /bpy 0 def /bqx 0 def /bqy 0 def
+ /cwidth 0 def
+ /cfpos 0 def
+ }
+ ifelse
+
+ }
+ for
+
+ % Wrap up.
+
+ upper setcachelimit
+ outfile closefile
+
+ nulldevice % prevent page device switching
+ saved end end end restore
+
+ } def
+
+% Provide definitions for testing with older or non-custom interpreters.
+
+/.findzeros where { pop (%END) .skipeof } if
+/.findzeros
+ { userdict begin /zs exch def /zl zs length def
+ 0 { dup zl ge { exit } if dup zs exch get 0 ne { exit } if 1 add } loop
+ zl { dup 0 eq { exit } if dup 1 sub zs exch get 0 ne { exit } if 1 sub } loop
+ exch 3 bitshift exch 3 bitshift
+ 2 copy lt
+ { exch zs 1 index -3 bitshift get
+ { dup 16#80 and 0 ne { exit } if exch 1 add exch 1 bitshift } loop pop
+ exch zs 1 index -3 bitshift 1 sub get
+ { dup 1 and 0 ne { exit } if exch 1 sub exch -1 bitshift } loop pop
+ }
+ if end
+ } bind def
+%END
+
+/write=only where { pop (%END) .skipeof } if
+/w=s 128 string def
+/write=only
+ { w=s cvs writestring
+ } bind def
+%END
+
+%**************** Test
+/PCLTEST where {
+ pop
+ /DEBUG true def
+ /CDEBUG true def
+ /VDEBUG true def
+ /Times-Roman findfont 10 scalefont setfont
+ (t.pcf) (w) file
+ 300 72 div dup scale
+ 300 writePCL
+ flush quit
+} if
diff --git a/lib/ghostpdf.README b/lib/ghostpdf.README
new file mode 100644
index 00000000..346223ef
--- /dev/null
+++ b/lib/ghostpdf.README
@@ -0,0 +1,12 @@
+GHOSTPDF.INF
+
+This .inf file is intended to be used with the ghostpdf.cat file which should
+have been supplied with it and must be present in the same directory for installaion.
+
+The ghostpdf.cat file provides the driver signature necessary for installation
+on recent versions of Windows, however it also means that this .inf file cannot
+be installed using right-click->Install (or double-click on the .inf file).
+
+On all versions of Windows you must install this device from the Control Panel
+using Add Printer.
+
diff --git a/lib/ghostpdf.cat b/lib/ghostpdf.cat
new file mode 100644
index 00000000..4c6fc304
--- /dev/null
+++ b/lib/ghostpdf.cat
Binary files differ
diff --git a/lib/ghostpdf.inf b/lib/ghostpdf.inf
new file mode 100644
index 00000000..65a82302
--- /dev/null
+++ b/lib/ghostpdf.inf
@@ -0,0 +1,52 @@
+;
+; This .inf file is intended to be used with the ghostpdf.cat
+; file which should have been supplied with it. The ghostpdf.cat
+; file provides the driver signature necessary for installation
+; on recent versions of Windows without the alarming warnings about
+; unsigned drivers, however it also means that this .inf file cannot
+; be installed using right-click->Install (or double-click on the .inf
+; file). You must install this from the Control Panel using Add Printer.
+;
+
+[Version]
+Signature="$Windows NT$"
+Provider=Artifex Software Inc.
+ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318}
+Class=Printer
+CatalogFile=ghostpdf.cat
+
+DriverVer=01/01/2013,1.0.0.1
+
+; Manufacturer section
+[Manufacturer]
+"Ghostscript"=Ghostscript,NTamd64,NTia64
+
+; Model sections
+[Ghostscript]
+"Ghostscript PDF" = GHOSTPDF.PPD, Ghostscript_PDF, Ghostscript_PDF_Writer
+
+[Ghostscript.NTamd64]
+"Ghostscript PDF" = GHOSTPDF.PPD, Ghostscript_PDF, Ghostscript_PDF_Writer
+
+[Ghostscript.NTia64]
+"Ghostscript PDF" = GHOSTPDF.PPD, Ghostscript_PDF, Ghostscript_PDF_Writer
+
+; Installer section
+[GHOSTPDF.PPD]
+CopyFiles=@GHOSTPDF.PPD
+DataSection=PSCRIPT_DATA
+Include=NTPRINT.INF
+Needs=PSCRIPT.OEM
+
+[DestinationDirs]
+DefaultDestDir=66000
+
+[SourceDisksNames]
+1=%Disk1%,,,""
+
+[SourceDisksFiles]
+GHOSTPDF.PPD =1
+
+[Strings]
+Disk1="Ghostscript PPD Setup Disk 1"
+; end of ghostpdf.inf
diff --git a/lib/ghostpdf.ppd b/lib/ghostpdf.ppd
new file mode 100644
index 00000000..f46afb91
--- /dev/null
+++ b/lib/ghostpdf.ppd
@@ -0,0 +1,522 @@
+*PPD-Adobe: "4.3"
+*FileVersion: "1.1"
+*FormatVersion: "4.3"
+*LanguageEncoding: ISOLatin1
+*LanguageVersion: English
+*Manufacturer: "Ghostscript"
+*ModelName: "Ghostscript PDF Writer"
+*ShortNickName: "Ghostscript"
+*NickName: "Ghostscript"
+*% PCFileName should be of the form XXNNNNNN.PPD where XX is an assigned
+*% manufacturer code.
+*PCFileName: "GHOSTPDF.PPD"
+*Product: "(Ghostscript)"
+*Product: "(AFPL Ghostscript)"
+*Product: "(GNU Ghostscript)"
+*Product: "(GPL Ghostscript)"
+*PSVersion: "(3010) 815"
+
+*% *DefaultImageableArea:
+*% *DefaultPageRegion:
+*% *PageRegion:
+*% *ImageableArea:
+*% *DefaultPageSize:
+*% *PageSize:
+*% *DefaultPaperDimension:
+*% *PaperDimension:
+
+*% == Above are required
+
+*Copyright: "2004-2006 Ghostgum Software Pty Ltd"
+*%
+*% Copyright (C) 2004-2006, Ghostgum Software Pty Ltd. All rights reserved.
+*%
+*% Permission is hereby granted, free of charge, to any person obtaining
+*% a copy of this file ("Software"), to deal in the Software without
+*% restriction, including without limitation the rights to use, copy,
+*% modify, merge, publish, distribute, sublicense, and/or sell copies of
+*% this Software, and to permit persons to whom this file is furnished to
+*% do so, subject to the following conditions:
+*%
+*% This Software is distributed with NO WARRANTY OF ANY KIND. No author
+*% or distributor accepts any responsibility for the consequences of using it,
+*% or for whether it serves any particular purpose or works at all, unless he
+*% or she says so in writing.
+*%
+*% The above copyright notice and this permission notice shall be included
+*% in all copies or substantial portions of the Software.
+
+*% There is an accompanying file ghostpdf.inf that is used to
+*% install this PPD on Windows 2k/XP.
+*% This PPD includes configuration items specific to generating
+*% PDF files with ghostscript.
+*% If you are not using the ghostscript pdfwrite device,
+*% all items in the PDF group should be left as "Default".
+
+
+*% == Basic Capabilities
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: True
+*Extensions: CMYK FileSystem Composite
+*TTRasterizer: Type42
+*FreeVM: "10000000"
+*PrintPSErrors: True
+*ContoneOnly: True
+*% AccurateScreensSupport: True
+
+*% order dependency
+*% 10 HWResolution
+*% 20 PageSize and other page device parameters
+*% 30 PDFSETTINGS
+*% 40 distiller parameters
+
+*% == Resolution
+*OpenUI *Resolution: PickOne
+*DefaultResolution: 600dpi
+*OrderDependency: 10 AnySetup *Resolution
+*Resolution 72dpi: "<< /HWResolution [72 72] >> setpagedevice"
+*Resolution 96dpi: "<< /HWResolution [96 96] >> setpagedevice"
+*Resolution 144dpi: "<< /HWResolution [144 144] >> setpagedevice"
+*Resolution 150dpi: "<< /HWResolution [150 150] >> setpagedevice"
+*Resolution 300dpi: "<< /HWResolution [300 300] >> setpagedevice"
+*Resolution 600dpi: "<< /HWResolution [600 600] >> setpagedevice"
+*Resolution 720dpi: "<< /HWResolution [720 720] >> setpagedevice"
+*Resolution 1200dpi: "<< /HWResolution [1200 1200] >> setpagedevice"
+*Resolution 2400dpi: "<< /HWResolution [2400 2400] >> setpagedevice"
+*Resolution 3600dpi: "<< /HWResolution [3600 3600] >> setpagedevice"
+*Resolution 4000dpi: "<< /HWResolution [4000 4000] >> setpagedevice"
+*CloseUI: *Resolution
+
+
+*% == Paper stuff
+*% Page sizes taken from ghostscript gs_statd.ps.
+*% Ghostscript pdfwrite ignores Orientation, so set the
+*% custom page width/height and then use an Install procedure
+*% to rotate the image.
+
+*HWMargins: 0 0 0 0
+*ParamCustomPageSize Width: 1 points 1 5670
+*ParamCustomPageSize Height: 2 points 1 5670
+*ParamCustomPageSize WidthOffset/Width Margin: 3 points 0 5670
+*ParamCustomPageSize HeightOffset/Height Margin: 4 points 0 5670
+*ParamCustomPageSize Orientation: 5 int 0 3
+*NonUIOrderDependency: 20 AnySetup *CustomPageSize
+*CustomPageSize True: "
+ 5 -2 roll exch 5 2 roll
+ 3 -2 roll exch 3 2 roll
+ [ {}
+ {90 rotate 0 currentpagedevice /PageSize get 0 get neg translate}
+ {180 rotate currentpagedevice /PageSize get
+ dup 0 get neg exch 1 get neg translate}
+ {270 rotate currentpagedevice /PageSize get 1 get neg 0 translate}
+ ] exch get
+ 4 dict dup begin 6 1 roll
+ /Install exch def
+ 2 array astore /PageOffset exch def
+ 2 array astore /PageSize exch def
+ /ImagingBBox null def
+ end setpagedevice"
+*End
+*MaxMediaWidth: "5670"
+*MaxMediaHeight: "5670"
+
+*LandscapeOrientation: Any
+
+*OpenUI *PageSize: PickOne
+*DefaultPageSize: Letter
+*OrderDependency: 20 AnySetup *PageSize
+*PageSize Tabloid: "<< /PageSize [792 1224] /ImagingBBox null >> setpagedevice"
+*PageSize Ledger: "<< /PageSize [1224 792] /ImagingBBox null >> setpagedevice"
+*PageSize Legal: "<< /PageSize [612 1008] /ImagingBBox null >> setpagedevice"
+*PageSize Letter: "<< /PageSize [612 792] /ImagingBBox null >> setpagedevice"
+*PageSize LetterSmall: "<< /PageSize [612 792] /ImagingBBox [25 25 587 767] >> setpagedevice"
+*PageSize Statement: "<< /PageSize [396 612] /ImagingBBox null >> setpagedevice"
+*PageSize Note: "<< /PageSize [612 792] /ImagingBBox [25 25 587 767] >> setpagedevice"
+*PageSize A0: "<< /PageSize [2384 3370] /ImagingBBox null >> setpagedevice"
+*PageSize A1: "<< /PageSize [1684 2384] /ImagingBBox null >> setpagedevice"
+*PageSize A2: "<< /PageSize [1191 1684] /ImagingBBox null >> setpagedevice"
+*PageSize A3: "<< /PageSize [842 1191] /ImagingBBox null >> setpagedevice"
+*PageSize A4: "<< /PageSize [595 842] /ImagingBBox null >> setpagedevice"
+*PageSize A4Small: "<< /PageSize [595 842] /ImagingBBox [25 25 570 817] >> setpagedevice"
+*PageSize A5: "<< /PageSize [420 595] /ImagingBBox null >> setpagedevice"
+*PageSize A6: "<< /PageSize [297 420] /ImagingBBox null >> setpagedevice"
+*PageSize A7: "<< /PageSize [210 297] /ImagingBBox null >> setpagedevice"
+*PageSize A8: "<< /PageSize [148 210] /ImagingBBox null >> setpagedevice"
+*PageSize A9: "<< /PageSize [105 148] /ImagingBBox null >> setpagedevice"
+*PageSize A10: "<< /PageSize [73 105] /ImagingBBox null >> setpagedevice"
+*PageSize ISOB0/ISO B0: "<< /PageSize [2835 4008] /ImagingBBox null >> setpagedevice"
+*PageSize ISOB1/ISO B1: "<< /PageSize [2004 2835] /ImagingBBox null >> setpagedevice"
+*PageSize ISOB2/ISO B2: "<< /PageSize [1417 2004] /ImagingBBox null >> setpagedevice"
+*PageSize ISOB3/ISO B3: "<< /PageSize [1001 1417] /ImagingBBox null >> setpagedevice"
+*PageSize ISOB4/ISO B4: "<< /PageSize [709 1001] /ImagingBBox null >> setpagedevice"
+*PageSize ISOB5/ISO B5: "<< /PageSize [499 709] /ImagingBBox null >> setpagedevice"
+*PageSize ISOB6/ISO B6: "<< /PageSize [354 499] /ImagingBBox null >> setpagedevice"
+*PageSize B0/JIS B0: "<< /PageSize [2920 4127] /ImagingBBox null >> setpagedevice"
+*PageSize B1/JIS B1: "<< /PageSize [2064 2920] /ImagingBBox null >> setpagedevice"
+*PageSize B2/JIS B2: "<< /PageSize [1460 2064] /ImagingBBox null >> setpagedevice"
+*PageSize B3/JIS B3: "<< /PageSize [1032 1460] /ImagingBBox null >> setpagedevice"
+*PageSize B4/JIS B4: "<< /PageSize [729 1032] /ImagingBBox null >> setpagedevice"
+*PageSize B5/JIS B5: "<< /PageSize [516 729] /ImagingBBox null >> setpagedevice"
+*PageSize B6/JIS B6: "<< /PageSize [363 516] /ImagingBBox null >> setpagedevice"
+*PageSize EnvC0/Envelope C0: "<< /PageSize [2599 3677] /ImagingBBox null >> setpagedevice"
+*PageSize EnvC1/Envelope C1: "<< /PageSize [1837 2599] /ImagingBBox null >> setpagedevice"
+*PageSize EnvC2/Envelope C2: "<< /PageSize [1296 1837] /ImagingBBox null >> setpagedevice"
+*PageSize EnvC3/Envelope C3: "<< /PageSize [918 1296] /ImagingBBox null >> setpagedevice"
+*PageSize EnvC4/Envelope C4: "<< /PageSize [649 918] /ImagingBBox null >> setpagedevice"
+*PageSize EnvC5/Envelope C5: "<< /PageSize [459 649] /ImagingBBox null >> setpagedevice"
+*PageSize EnvC6/Envelope C6: "<< /PageSize [323 459] /ImagingBBox null >> setpagedevice"
+*PageSize ARCHE: "<< /PageSize [2592 3456] /ImagingBBox null >> setpagedevice"
+*PageSize ARCHD: "<< /PageSize [1728 2592] /ImagingBBox null >> setpagedevice"
+*PageSize ARCHC: "<< /PageSize [1296 1728] /ImagingBBox null >> setpagedevice"
+*PageSize ARCHB: "<< /PageSize [864 1296] /ImagingBBox null >> setpagedevice"
+*PageSize ARCHA: "<< /PageSize [648 864] /ImagingBBox null >> setpagedevice"
+*PageSize FLSA: "<< /PageSize [612 936] /ImagingBBox null >> setpagedevice"
+*PageSize FLSE: "<< /PageSize [612 936] /ImagingBBox null >> setpagedevice"
+*PageSize PA4: "<< /PageSize [595 792] /ImagingBBox null >> setpagedevice"
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*DefaultPageRegion: Letter
+*OrderDependency: 20 AnySetup *PageRegion
+*PageRegion Tabloid: "<< /PageSize [792 1224] /ImagingBBox null >> setpagedevice"
+*PageRegion Ledger: "<< /PageSize [1224 792] /ImagingBBox null >> setpagedevice"
+*PageRegion Legal: "<< /PageSize [612 1008] /ImagingBBox null >> setpagedevice"
+*PageRegion Letter: "<< /PageSize [612 792] /ImagingBBox null >> setpagedevice"
+*PageRegion LetterSmall: "<< /PageSize [612 792] /ImagingBBox [25 25 587 767] >> setpagedevice"
+*PageRegion Note: "<< /PageSize [612 792] /ImagingBBox [25 25 587 767] >> setpagedevice"
+*PageRegion Statement: "<< /PageSize [396 612] /ImagingBBox null >> setpagedevice"
+*PageRegion A0: "<< /PageSize [2384 3370] /ImagingBBox null >> setpagedevice"
+*PageRegion A1: "<< /PageSize [1684 2384] /ImagingBBox null >> setpagedevice"
+*PageRegion A2: "<< /PageSize [1191 1684] /ImagingBBox null >> setpagedevice"
+*PageRegion A3: "<< /PageSize [842 1191] /ImagingBBox null >> setpagedevice"
+*PageRegion A4: "<< /PageSize [595 842] /ImagingBBox null >> setpagedevice"
+*PageRegion A4Small: "<< /PageSize [595 842] /ImagingBBox [25 25 570 817] >> setpagedevice"
+*PageRegion A5: "<< /PageSize [420 595] /ImagingBBox null >> setpagedevice"
+*PageRegion A6: "<< /PageSize [297 420] /ImagingBBox null >> setpagedevice"
+*PageRegion A7: "<< /PageSize [210 297] /ImagingBBox null >> setpagedevice"
+*PageRegion A8: "<< /PageSize [148 210] /ImagingBBox null >> setpagedevice"
+*PageRegion A9: "<< /PageSize [105 148] /ImagingBBox null >> setpagedevice"
+*PageRegion A10: "<< /PageSize [73 105] /ImagingBBox null >> setpagedevice"
+*PageRegion ISOB0/ISO B0: "<< /PageSize [2835 4008] /ImagingBBox null >> setpagedevice"
+*PageRegion ISOB1/ISO B1: "<< /PageSize [2004 2835] /ImagingBBox null >> setpagedevice"
+*PageRegion ISOB2/ISO B2: "<< /PageSize [1417 2004] /ImagingBBox null >> setpagedevice"
+*PageRegion ISOB3/ISO B3: "<< /PageSize [1001 1417] /ImagingBBox null >> setpagedevice"
+*PageRegion ISOB4/ISO B4: "<< /PageSize [709 1001] /ImagingBBox null >> setpagedevice"
+*PageRegion ISOB5/ISO B5: "<< /PageSize [499 709] /ImagingBBox null >> setpagedevice"
+*PageRegion ISOB6/ISO B6: "<< /PageSize [354 499] /ImagingBBox null >> setpagedevice"
+*PageRegion B0/JIS B0: "<< /PageSize [2920 4127] /ImagingBBox null >> setpagedevice"
+*PageRegion B1/JIS B1: "<< /PageSize [2064 2920] /ImagingBBox null >> setpagedevice"
+*PageRegion B2/JIS B2: "<< /PageSize [1460 2064] /ImagingBBox null >> setpagedevice"
+*PageRegion B3/JIS B3: "<< /PageSize [1032 1460] /ImagingBBox null >> setpagedevice"
+*PageRegion B4/JIS B4: "<< /PageSize [729 1032] /ImagingBBox null >> setpagedevice"
+*PageRegion B5/JIS B5: "<< /PageSize [516 729] /ImagingBBox null >> setpagedevice"
+*PageRegion B6/JIS B6: "<< /PageSize [363 516] /ImagingBBox null >> setpagedevice"
+*PageRegion EnvC0/Envelope C0: "<< /PageSize [2599 3677] /ImagingBBox null >> setpagedevice"
+*PageRegion EnvC1/Envelope C1: "<< /PageSize [1837 2599] /ImagingBBox null >> setpagedevice"
+*PageRegion EnvC2/Envelope C2: "<< /PageSize [1296 1837] /ImagingBBox null >> setpagedevice"
+*PageRegion EnvC3/Envelope C3: "<< /PageSize [918 1296] /ImagingBBox null >> setpagedevice"
+*PageRegion EnvC4/Envelope C4: "<< /PageSize [649 918] /ImagingBBox null >> setpagedevice"
+*PageRegion EnvC5/Envelope C5: "<< /PageSize [459 649] /ImagingBBox null >> setpagedevice"
+*PageRegion EnvC6/Envelope C6: "<< /PageSize [323 459] /ImagingBBox null >> setpagedevice"
+*PageRegion ARCHE: "<< /PageSize [2592 3456] /ImagingBBox null >> setpagedevice"
+*PageRegion ARCHD: "<< /PageSize [1728 2592] /ImagingBBox null >> setpagedevice"
+*PageRegion ARCHC: "<< /PageSize [1296 1728] /ImagingBBox null >> setpagedevice"
+*PageRegion ARCHB: "<< /PageSize [864 1296] /ImagingBBox null >> setpagedevice"
+*PageRegion ARCHA: "<< /PageSize [648 864] /ImagingBBox null >> setpagedevice"
+*PageRegion FLSA: "<< /PageSize [612 936] /ImagingBBox null >> setpagedevice"
+*PageRegion FLSE: "<< /PageSize [612 936] /ImagingBBox null >> setpagedevice"
+*PageRegion PA4: "<< /PageSize [595 792] /ImagingBBox null >> setpagedevice"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Tabloid: "0 0 792 1224"
+*ImageableArea Ledger: "0 0 1224 792"
+*ImageableArea Legal: "0 0 612 1008"
+*ImageableArea Letter: "0 0 612 792"
+*ImageableArea LetterSmall: "25 25 587 767"
+*ImageableArea Note: "25 25 587 767"
+*ImageableArea Statement: "0 0 396 612"
+*ImageableArea A0: "0 0 2384 3370"
+*ImageableArea A1: "0 0 1684 2384"
+*ImageableArea A2: "0 0 1191 1684"
+*ImageableArea A3: "0 0 842 1191"
+*ImageableArea A4: "0 0 595 842"
+*ImageableArea A4Small: "25 25 570 817"
+*ImageableArea A5: "0 0 420 595"
+*ImageableArea A6: "0 0 297 420"
+*ImageableArea A7: "0 0 210 297"
+*ImageableArea A8: "0 0 148 210"
+*ImageableArea A9: "0 0 105 148"
+*ImageableArea A10: "0 0 73 105"
+*ImageableArea ISOB0/ISO B0: "0 0 2835 4008"
+*ImageableArea ISOB1/ISO B1: "0 0 2004 2835"
+*ImageableArea ISOB2/ISO B2: "0 0 1417 2004"
+*ImageableArea ISOB3/ISO B3: "0 0 1001 1417"
+*ImageableArea ISOB4/ISO B4: "0 0 709 1001"
+*ImageableArea ISOB5/ISO B5: "0 0 499 709"
+*ImageableArea ISOB6/ISO B6: "0 0 354 499"
+*ImageableArea B0/JIS B0: "0 0 2920 4127"
+*ImageableArea B1/JIS B1: "0 0 2064 2920"
+*ImageableArea B2/JIS B2: "0 0 1460 2064"
+*ImageableArea B3/JIS B3: "0 0 1032 1460"
+*ImageableArea B4/JIS B4: "0 0 729 1032"
+*ImageableArea B5/JIS B5: "0 0 516 729"
+*ImageableArea B6/JIS B6: "0 0 363 516"
+*ImageableArea EnvC0/Envelope C0: "0 0 2599 3677"
+*ImageableArea EnvC1/Envelope C1: "0 0 1837 2599"
+*ImageableArea EnvC2/Envelope C2: "0 0 1296 1837"
+*ImageableArea EnvC3/Envelope C3: "0 0 918 1296"
+*ImageableArea EnvC4/Envelope C4: "0 0 649 918"
+*ImageableArea EnvC5/Envelope C5: "0 0 459 649"
+*ImageableArea EnvC6/Envelope C6: "0 0 323 459"
+*ImageableArea ARCHE: "0 0 2592 3456"
+*ImageableArea ARCHD: "0 0 1728 2592"
+*ImageableArea ARCHC: "0 0 1296 1728"
+*ImageableArea ARCHB: "0 0 864 1296"
+*ImageableArea ARCHA: "0 0 648 864"
+*ImageableArea FLSA: "0 0 612 936"
+*ImageableArea FLSE: "0 0 612 936"
+*ImageableArea PA4: "0 0 595 792"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Tabloid: "792 1224"
+*PaperDimension Ledger: "1224 792"
+*PaperDimension Legal: "612 1008"
+*PaperDimension Letter: "612 792"
+*PaperDimension LetterSmall: "612 792"
+*PaperDimension Note: "612 792"
+*PaperDimension Statement: "396 612"
+*PaperDimension A0: "2384 3370"
+*PaperDimension A1: "1684 2384"
+*PaperDimension A2: "1191 1684"
+*PaperDimension A3: "842 1191"
+*PaperDimension A4: "595 842"
+*PaperDimension A4Small: "595 842"
+*PaperDimension A5: "420 595"
+*PaperDimension A6: "297 420"
+*PaperDimension A7: "210 297"
+*PaperDimension A8: "148 210"
+*PaperDimension A9: "105 148"
+*PaperDimension A10: "73 105"
+*PaperDimension ISOB0/ISO B0: "2835 4008"
+*PaperDimension ISOB1/ISO B1: "2004 2835"
+*PaperDimension ISOB2/ISO B2: "1417 2004"
+*PaperDimension ISOB3/ISO B3: "1001 1417"
+*PaperDimension ISOB4/ISO B4: "709 1001"
+*PaperDimension ISOB5/ISO B5: "499 709"
+*PaperDimension ISOB6/ISO B6: "354 499"
+*PaperDimension B0/JIS B0: "2920 4127"
+*PaperDimension B1/JIS B1: "2064 2920"
+*PaperDimension B2/JIS B2: "1460 2064"
+*PaperDimension B3/JIS B3: "1032 1460"
+*PaperDimension B4/JIS B4: "729 1032"
+*PaperDimension B5/JIS B5: "516 729"
+*PaperDimension B6/JIS B6: "363 516"
+*PaperDimension EnvC0/Envelope C0: "2599 3677"
+*PaperDimension EnvC1/Envelope C1: "1837 2599"
+*PaperDimension EnvC2/Envelope C2: "1296 1837"
+*PaperDimension EnvC3/Envelope C3: "918 1296"
+*PaperDimension EnvC4/Envelope C4: "649 918"
+*PaperDimension EnvC5/Envelope C5: "459 649"
+*PaperDimension EnvC6/Envelope C6: "323 459"
+*PaperDimension ARCHE: "2592 3456"
+*PaperDimension ARCHD: "1728 2592"
+*PaperDimension ARCHC: "1296 1728"
+*PaperDimension ARCHB: "864 1296"
+*PaperDimension ARCHA: "648 864"
+*PaperDimension FLSA: "612 936"
+*PaperDimension FLSE: "612 936"
+*PaperDimension PA4: "595 792"
+
+
+*% == Fonts
+*DefaultFont: Courier
+*% First the standard 35 aliases with the actual fonts commented out.
+*Font Bookman-Demi: Standard "(1.10)" Standard ROM
+*% *Font URWBookmanL-DemiBold: Standard "(1.10)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(1.10)" Standard ROM
+*% *Font URWBookmanL-DemiBoldItal: Standard "(1.10)" Standard ROM
+*Font Bookman-Light: Standard "(1.10)" Standard ROM
+*% *Font URWBookmanL-Ligh: Standard "(1.10)" Standard ROM
+*Font Bookman-LightItalic: Standard "(1.10)" Standard ROM
+*% *Font URWBookmanL-LighItal: Standard "(1.10)" Standard ROM
+*Font Courier: Standard "(1.10)" Standard ROM
+*% *Font NimbusMonL-Regu: Standard "(1.10)" Standard ROM
+*Font Courier-Oblique: Standard "(1.10)" Standard ROM
+*% *Font NimbusMonL-ReguObli: Standard "(1.10)" Standard ROM
+*Font Courier-Bold: Standard "(1.10)" Standard ROM
+*% *Font NimbusMonL-Bold: Standard "(1.10)" Standard ROM
+*Font Courier-BoldOblique: Standard "(1.10)" Standard ROM
+*% *Font NimbusMonL-BoldObli: Standard "(1.10)" Standard ROM
+*Font AvantGarde-Book: Standard "(1.10)" Standard ROM
+*% *Font URWGothicL-Book: Standard "(1.10)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(1.10)" Standard ROM
+*% *Font URWGothicL-BookObli: Standard "(1.10)" Standard ROM
+*Font AvantGarde-Demi: Standard "(1.10)" Standard ROM
+*% *Font URWGothicL-Demi: Standard "(1.10)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(1.10)" Standard ROM
+*% *Font URWGothicL-DemiObli: Standard "(1.10)" Standard ROM
+*Font Helvetica: Standard "(1.10)" Standard ROM
+*% *Font NimbusSanL-Regu: Standard "(1.10)" Standard ROM
+*Font Helvetica-Oblique: Standard "(1.10)" Standard ROM
+*% *Font NimbusSanL-ReguItal: Standard "(1.10)" Standard ROM
+*Font Helvetica-Bold: Standard "(1.10)" Standard ROM
+*% *Font NimbusSanL-Bold: Standard "(1.10)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(1.10)" Standard ROM
+*% *Font NimbusSanL-BoldItal: Standard "(1.10)" Standard ROM
+*Font Helvetica-Narrow: Standard "(1.10)" Standard ROM
+*% *Font NimbusSanL-ReguCond: Standard "(1.10)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(1.10)" Standard ROM
+*% *Font NimbusSanL-ReguCondItal: Standard "(1.10)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(1.10)" Standard ROM
+*% *Font NimbusSanL-BoldCond: Standard "(1.10)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(1.10)" Standard ROM
+*% *Font NimbusSanL-BoldCondItal: Standard "(1.10)" Standard ROM
+*Font Palatino-Roman: Standard "(1.10)" Standard ROM
+*% *Font URWPalladioL-Roma: Standard "(1.10)" Standard ROM
+*Font Palatino-Italic: Standard "(1.10)" Standard ROM
+*% *Font URWPalladioL-Ital: Standard "(1.10)" Standard ROM
+*Font Palatino-Bold: Standard "(1.10)" Standard ROM
+*% *Font URWPalladioL-Bold: Standard "(1.10)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(1.10)" Standard ROM
+*% *Font URWPalladioL-BoldItal: Standard "(1.10)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(1.10)" Standard ROM
+*% *Font CenturySchL-Roma: Standard "(1.10)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(1.10)" Standard ROM
+*% *Font CenturySchL-Ital: Standard "(1.10)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(1.10)" Standard ROM
+*% *Font CenturySchL-Bold: Standard "(1.10)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(1.10)" Standard ROM
+*% *Font CenturySchL-BoldItal: Standard "(1.10)" Standard ROM
+*Font Times-Roman: Standard "(1.10)" Standard ROM
+*% *Font NimbusRomNo9L-Regu: Standard "(1.10)" Standard ROM
+*Font Times-Italic: Standard "(1.10)" Standard ROM
+*% *Font NimbusRomNo9L-ReguItal: Standard "(1.10)" Standard ROM
+*Font Times-Bold: Standard "(1.10)" Standard ROM
+*% *Font NimbusRomNo9L-Medi: Standard "(1.10)" Standard ROM
+*Font Times-BoldItalic: Standard "(1.10)" Standard ROM
+*% *Font NimbusRomNo9L-MediItal: Standard "(1.10)" Standard ROM
+*Font Symbol: Special "(001.005)" Special ROM
+*% *Font StandardSymL: Special (001.005)" Special ROM
+*Font ZapfChancery-MediumItalic: Standard "(1.10)" Standard ROM
+*% *Font URWChanceryL-MediItal: Standard "(1.10)" Standard ROM
+*Font ZapfDingbats: Special (001.005)" Special ROM
+*% *Font Dingbats: Special (001.005)" Special ROM
+*% Then a few ghostscript extras
+*Font Charter-Roman: Standard "(2.0-1.0)" Standard ROM
+*Font CharterBT-Roman: Standard "(2.0-1.0)" Standard ROM
+*Font Charter-Italic: Standard "(2.0-1.0)" Standard ROM
+*Font CharterBT-Italic: Standard "(2.0-1.0)" Standard ROM
+*Font Charter-Bold: Standard "(2.0-1.0)" Standard ROM
+*Font CharterBT-Bold: Standard "(2.0-1.0)" Standard ROM
+*Font Charter-BoldItalic: Standard "(2.0-1.0)" Standard ROM
+*Font CharterBT-BoldItalic: Standard "(2.0-1.0)" Standard ROM
+*Font Utopia-Regular: Standard "(001.001)" Standard ROM
+*Font Utopia-Italic: Standard "(001.001)" Standard ROM
+*Font Utopia-Bold: Standard "(001.001)" Standard ROM
+*Font Utopia-BoldItalic: Standard "(001.001)" Standard ROM
+
+*% == Most of these set distiller parameters
+*% If the target device is not the Ghostscript pdfwrite device,
+*% then these should all be left at "Default"
+*OpenGroup: PDF
+
+*% == The pdfwrite device can select different color spaces
+*OpenUI *ColorModel/PDF Colour Model: PickOne
+*DefaultColorModel: Default
+*OrderDependency: 20 AnySetup *ColorModel
+*ColorModel Default: ""
+*ColorModel Grey: "<< /ProcessColorModel /DeviceGray >> setpagedevice"
+*ColorModel RGB: "<< /ProcessColorModel /DeviceRGB >> setpagedevice"
+*ColorModel CMYK: "<< /ProcessColorModel /DeviceCMYK >> setpagedevice"
+*CloseUI: *ColorModel
+
+*OpenUI *PDFSettings/PDF Settings: PickOne
+*DefaultPDFSettings: Default
+*OrderDependency: 30 AnySetup *PDFSettings
+*PDFSettings Default: ""
+*PDFSettings Screen: ".distillersettings /screen get setdistillerparams"
+*PDFSettings Ebook: ".distillersettings /ebook get setdistillerparams"
+*PDFSettings Printer: ".distillersettings /printer get setdistillerparams"
+*PDFSettings Prepress: ".distillersettings /prepress get setdistillerparams"
+*CloseUI: *PDFSettings
+
+*OpenUI *ColorImageFilter/PDF Colour Image Compression: PickOne
+*DefaultColorImageFilter: Default
+*OrderDependency: 40 AnySetup *ColorImageFilter
+*ColorImageFilter Default: ""
+*ColorImageFilter JPEG: "<< /AutoFilterColorImages false /ColorImageFilter /DCTEncode >> setdistillerparams"
+*ColorImageFilter Flate: "<< /AutoFilterColorImages false /ColorImageFilter /FlateEncode >> setdistillerparams"
+*CloseUI: *ColorImageFilter
+
+*OpenUI *GrayImageFilter/PDF Grey Image Compression: PickOne
+*DefaultGrayImageFilter: Default
+*OrderDependency: 40 AnySetup *GrayImageFilter
+*GrayImageFilter Default: ""
+*GrayImageFilter JPEG: "<< /AutoFilterGrayImages false /GrayImageFilter /DCTEncode >> setdistillerparams"
+*GrayImageFilter Flate: "<< /AutoFilterGrayImages false /GrayImageFilter /FlateEncode >> setdistillerparams"
+*CloseUI: *GrayImageFilter
+
+*OpenUI *MonoImageFilter/PDF Monochrome Image Compression: PickOne
+*DefaultMonoImageFilter: Default
+*OrderDependency: 40 AnySetup *MonoImageFilter
+*MonoImageFilter Default: ""
+*MonoImageFilter FaxG3/Fax G3: "<< /AutoFilterMonoImages false /MonoImageFilter /CCITTFaxEncode >> setdistillerparams"
+*MonoImageFilter Flate: "<< /AutoFilterMonoImages false /MonoImageFilter /FlateEncode >> setdistillerparams"
+*CloseUI: *MonoImageFilter
+
+*OpenUI *CompatibilityLevel/PDF Compatibility: PickOne
+*DefaultCompatibilityLevel: Default
+*OrderDependency: 40 AnySetup *CompatibilityLevel
+*CompatibilityLevel Default: ""
+*CompatibilityLevel 1.2: "<< /CompatibilityLevel 1.2 >> setdistillerparams"
+*CompatibilityLevel 1.3: "<< /CompatibilityLevel 1.3 >> setdistillerparams"
+*CompatibilityLevel 1.4: "<< /CompatibilityLevel 1.4 >> setdistillerparams"
+*CloseUI: *CompatibilityLevel
+
+*OpenUI *AutoRotatePages/PDF AutoRotatePages: PickOne
+*DefaultAutoRotatePages: Default
+*OrderDependency: 40 AnySetup *AutoRotatePages
+*AutoRotatePages Default: ""
+*AutoRotatePages None: "<< /AutoRotatePages /None >> setdistillerparams"
+*AutoRotatePages PageByPage: "<< /AutoRotatePages /PageByPage >> setdistillerparams"
+*AutoRotatePages All: "<< /AutoRotatePages /All >> setdistillerparams"
+*CloseUI: *AutoRotatePages
+
+*OpenUI *ParseDSCComments/PDF ParseDSCComments: PickOne
+*DefaultParseDSCComments: Default
+*OrderDependency: 40 AnySetup *ParseDSCComments
+*ParseDSCComments Default: ""
+*ParseDSCComments True: "<< /ParseDSCComments true >> setdistillerparams"
+*ParseDSCComments False: "<< /ParseDSCComments false >> setdistillerparams"
+*CloseUI: *ParseDSCComments
+
+*OpenUI *EmbedAllFonts/PDF EmbedAllFonts: PickOne
+*DefaultEmbedAllFonts: Default
+*OrderDependency: 40 AnySetup *EmbedAllFonts
+*EmbedAllFonts Default: ""
+*EmbedAllFonts True: "<< /EmbedAllFonts true >> setdistillerparams"
+*EmbedAllFonts False: "<< /EmbedAllFonts false >> setdistillerparams"
+*CloseUI: *EmbedAllFonts
+
+*OpenUI *SubsetFonts/PDF SubsetFonts: PickOne
+*DefaultSubsetFonts: Default
+*OrderDependency: 40 AnySetup *SubsetFonts
+*SubsetFonts Default: ""
+*SubsetFonts True: "<< /SubsetFonts true >> setdistillerparams"
+*SubsetFonts False: "<< /SubsetFonts false >> setdistillerparams"
+*CloseUI: *SubsetFonts
+
+*OpenUI *CompressPages/PDF Compress Pages: PickOne
+*DefaultCompressPages: Default
+*OrderDependency: 40 AnySetup *CompressPages
+*CompressPages Default: ""
+*CompressPages True: "<< /CompressPages true >> setdistillerparams"
+*CompressPages False: "<< /CompressPages false >> setdistillerparams"
+*CloseUI: *CompressPages
+
+*CloseGroup: PDF
+
+*% End of Ghostscript PDF Writer PPD file
diff --git a/lib/gs_ce_e.ps b/lib/gs_ce_e.ps
new file mode 100644
index 00000000..41b29d9a
--- /dev/null
+++ b/lib/gs_ce_e.ps
@@ -0,0 +1,46 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Define the Adobe CE (Central European) encoding vector.
+% We define it by differences from the ISOLatin1Encoding vector.
+/CEEncoding
+ISOLatin1Encoding 0 39 getinterval aload pop
+% 047
+ /quotesingle
+ISOLatin1Encoding 40 56 getinterval aload pop
+% 140
+ /grave
+ISOLatin1Encoding 97 31 getinterval aload pop
+% 20x
+ /.notdef /.notdef /quotesinglbase /.notdef /quotedblbase /ellipsis /dagger /daggerdbl
+ /.notdef /perthousand /Scaron /guilsinglleft /Sacute /Tcaron /Zcaron /Zacute
+ /.notdef /grave /acute /circumflex /tilde /bullet /endash /emdash
+ /.notdef /trademark /scaron /guilsinglright /sacute /tcaron /zcaron /zacute
+% 24x
+ /space /caron /breve /Lslash /currency /Aogonek /brokenbar /section
+ /dieresis /copyright /Scommaaccent /guillemotleft /logicalnot /hyphen /registered /Zdotaccent
+ /degree /plusminus /ogonek /lslash /acute /mu /paragraph /periodcentered
+ /cedilla /aogonek /scommaaccent /guillemotright /Lcaron /hungarumlaut /lcaron /zdotaccent
+% 30x
+ /Racute /Aacute /Acircumflex /Abreve /Adieresis /Lacute /Cacute /Ccedilla
+ /Ccaron /Eacute /Eogonek /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron
+ /Dcroat /Nacute /Ncaron /Oacute /Ocircumflex /Ohungarumlaut /Odieresis /multiply
+ /Rcaron /Uring /Uacute /Uhungarumlaut /Udieresis /Yacute /Tcommaaccent /germandbls
+% 34x
+ /racute /aacute /acircumflex /abreve /adieresis /lacute /cacute /ccedilla
+ /ccaron /eacute /eogonek /edieresis /ecaron /iacute /icircumflex /dcaron
+ /dcroat /nacute /ncaron /oacute /ocircumflex /ohungarumlaut /odieresis /divide
+ /rcaron /uring /uacute /uhungarumlaut /udieresis /yacute /tcommaaccent /dotaccent
+256 packedarray .defineencoding
diff --git a/lib/gs_il2_e.ps b/lib/gs_il2_e.ps
new file mode 100644
index 00000000..684c6bde
--- /dev/null
+++ b/lib/gs_il2_e.ps
@@ -0,0 +1,62 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Define the ISO Latin-2 (8859-2) encoding vector.
+
+% The original version of this encoding vector used Unicode names, rather
+% than Adobe names, for many characters. Here are the names that appeared
+% in the original version:
+% \047 /quoteright /apostrophe
+% \056 /period /fullstop
+% \137 /underscore /lowline
+% \140 /quoteleft /grave
+% \055 is /hyphen in StandardEncoding, but /minus in 8859-1; we follow
+% 8859-1 here. In addition, the following substitutions were made:
+% /Lstroke => /Lslash
+% /Dstroke => /Dcroat
+% /*diaeresis => /*dieresis
+% /softhyphen => /hyphen
+% /*abovedot => /*dotaccent
+% /*doubleacute => /*hungarumlaut
+% /division => /divide
+% /ssharp => /germandbls
+
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/ISOLatin2Encoding
+% The first 144 entries are the same as the ISO Latin-1 encoding.
+ISOLatin1Encoding 0 144 getinterval aload pop
+% \22x
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+% \24x
+ /nbspace /Aogonek /breve /Lslash /currency /Lcaron /Sacute /section
+ /dieresis /Scaron /Scedilla /Tcaron /Zacute /hyphen /Zcaron /Zdotaccent
+ /degree /aogonek /ogonek /lslash /acute /lcaron /sacute /caron
+ /cedilla /scaron /scedilla /tcaron /zacute /hungarumlaut /zcaron /zdotaccent
+% \30x
+ /Racute /Aacute /Acircumflex /Abreve /Adieresis /Lacute /Cacute /Ccedilla
+ /Ccaron /Eacute /Eogonek /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron
+ /Dcroat /Nacute /Ncaron /Oacute /Ocircumflex /Ohungarumlaut /Odieresis /multiply
+ /Rcaron /Uring /Uacute /Uhungarumlaut /Udieresis /Yacute /Tcedilla /germandbls
+% \34x
+ /racute /aacute /acircumflex /abreve /adieresis /lacute /cacute /ccedilla
+ /ccaron /eacute /eogonek /edieresis /ecaron /iacute /icircumflex /dcaron
+ /dcroat /nacute /ncaron /oacute /ocircumflex /ohungarumlaut /odieresis /divide
+ /rcaron /uring /uacute /uhungarumlaut /udieresis /yacute /tcedilla /dotaccent
+256 packedarray .defineencoding
+exec
diff --git a/lib/gs_kanji.ps b/lib/gs_kanji.ps
new file mode 100644
index 00000000..f93af381
--- /dev/null
+++ b/lib/gs_kanji.ps
@@ -0,0 +1,157 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Scaffolding for Kanji fonts. This is based on the Wadalab free font
+% from the University of Tokyo; it may not be appropriate for other
+% Kanji fonts.
+
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+
+% Define the encoding for the root font.
+
+/KanjiEncoding
+% \x00
+ 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0
+% \x20
+ 0 1 2 3 4 5 6 7
+ 8 0 0 0 0 0 0 0
+ 9 10 11 12 13 14 15 16
+ 17 18 19 20 21 22 23 24
+% \x40
+ 25 26 27 28 29 30 31 32
+ 33 34 35 36 37 38 39 40
+ 41 42 43 44 45 46 47 48
+ 49 50 51 52 53 54 55 56
+% \x60
+ 57 58 59 60 61 62 63 64
+ 65 66 67 68 69 70 71 72
+ 73 74 75 76 77 0 0 0
+ 0 0 0 0 0 0 0 0
+% \x80
+ 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0
+% \xA0
+ 0 1 2 3 4 5 6 7
+ 8 0 0 0 0 0 0 0
+ 9 10 11 12 13 14 15 16
+ 17 18 19 20 21 22 23 24
+% \xC0
+ 25 26 27 28 29 30 31 32
+ 33 34 35 36 37 38 39 40
+ 41 42 43 44 45 46 47 48
+ 49 50 51 52 53 54 55 56
+% \xE0
+ 57 58 59 60 61 62 63 64
+ 65 66 67 68 69 70 71 72
+ 73 74 75 76 77 0 0 0
+ 0 0 0 0 0 0 0 0
+256 packedarray def
+
+% Define a stub for the base font encoding.
+
+ /KanjiSubEncoding { /KanjiSubEncoding .findencoding } bind def
+%% Replace 3 (gs_ksb_e.ps)
+ EncodingDirectory /KanjiSubEncoding
+ { (gs_ksb_e.ps) //systemdict begin runlibfile KanjiSubEncoding end }
+ bind put
+
+% Support procedures and data.
+
+/T1FontInfo 8 dict begin
+ /version (001.001) readonly def
+ /FullName (KanjiBase) readonly def
+ /FamilyName (KanjiBase) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ /UnderlinePosition 0 def
+ /UnderlineThickness 0 def
+currentdict end readonly def
+
+/T1NF % <fontname> T1NF <font>
+{
+20 dict begin
+ /FontName exch def
+ /FontType 1 def
+ /FontInfo T1FontInfo def
+ /FontMatrix [.001 0 0 .001 0 0] def
+ /FontBBox [0 0 1000 1000] def
+ /Encoding KanjiSubEncoding def
+ /CharStrings 150 dict def
+ /PaintType 0 def
+ /Private 2 dict def
+ Private begin
+ /BlueValues [] def
+ /password 5839 def
+ end
+FontName currentdict end definefont
+} def
+
+/T0NF % <fontname> T0NF <font>
+{
+20 dict begin
+ /FontName exch def
+ /FDepVector exch def
+ /FontType 0 def
+ /FontMatrix [1 0 0 1 0 0] def
+ /FMapType 2 def
+ /Encoding KanjiEncoding def
+FontName currentdict end definefont
+} def
+
+% Define the composite font and all the base fonts.
+
+/CompNF % <fontname> CompNF <font>
+{
+/newname1 exch def
+newname1 dup length string cvs /str exch def
+str length /len exch def
+/fdepvector 78 array def
+/j 1 def
+16#21 1 16#74 {
+/i exch def
+KanjiEncoding i get 0 gt {
+len 4 add string /newstr exch def
+newstr 0 str putinterval
+newstr len (.r) putinterval
+newstr len 2 add i 16 2 string cvrs putinterval
+newstr cvn /newlit exch def
+newlit T1NF /newfont exch def
+fdepvector j newfont put
+/j j 1 add def
+} if
+} for
+fdepvector 0 fdepvector 1 get put
+/j 0 def
+fdepvector newname1 T0NF
+} def
+
+% Define an individual character in a composite font.
+/CompD % <charstring> <(HL)> CompD -
+ { currentfont /Encoding get 1 index 0 get get % FDepVector index
+ currentfont /FDepVector get exch get % base font
+ dup /Encoding get 3 -1 roll 1 get get % base font character name
+ exch /CharStrings get exch 3 -1 roll put
+ } bind def
+
+exec
diff --git a/lib/gs_ksb_e.ps b/lib/gs_ksb_e.ps
new file mode 100644
index 00000000..d038190b
--- /dev/null
+++ b/lib/gs_ksb_e.ps
@@ -0,0 +1,63 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Define the KanjiSub encoding vector.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/KanjiSubEncoding
+%\x00
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%\x20
+ /.notdef /c21 /c22 /c23 /c24 /c25 /c26 /c27
+ /c28 /c29 /c2A /c2B /c2C /c2D /c2E /c2F
+ /c30 /c31 /c32 /c33 /c34 /c35 /c36 /c37
+ /c38 /c39 /c3A /c3B /c3C /c3D /c3E /c3F
+%\x40
+ /c40 /c41 /c42 /c43 /c44 /c45 /c46 /c47
+ /c48 /c49 /c4A /c4B /c4C /c4D /c4E /c4F
+ /c50 /c51 /c52 /c53 /c54 /c55 /c56 /c57
+ /c58 /c59 /c5A /c5B /c5C /c5D /c5E /c5F
+%\x60
+ /c60 /c61 /c62 /c63 /c64 /c65 /c66 /c67
+ /c68 /c69 /c6A /c6B /c6C /c6D /c6E /c6F
+ /c70 /c71 /c72 /c73 /c74 /c75 /c76 /c77
+ /c78 /c79 /c7A /c7B /c7C /c7D /c7E /.notdef
+%\x80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%\xA0
+ /.notdef /c21 /c22 /c23 /c24 /c25 /c26 /c27
+ /c28 /c29 /c2A /c2B /c2C /c2D /c2E /c2F
+ /c30 /c31 /c32 /c33 /c34 /c35 /c36 /c37
+ /c38 /c39 /c3A /c3B /c3C /c3D /c3E /c3F
+%\xC0
+ /c40 /c41 /c42 /c43 /c44 /c45 /c46 /c47
+ /c48 /c49 /c4A /c4B /c4C /c4D /c4E /c4F
+ /c50 /c51 /c52 /c53 /c54 /c55 /c56 /c57
+ /c58 /c59 /c5A /c5B /c5C /c5D /c5E /c5F
+%\xE0
+ /c60 /c61 /c62 /c63 /c64 /c65 /c66 /c67
+ /c68 /c69 /c6A /c6B /c6C /c6D /c6E /c6F
+ /c70 /c71 /c72 /c73 /c74 /c75 /c76 /c77
+ /c78 /c79 /c7A /c7B /c7C /c7D /c7E /.notdef
+256 packedarray .defineencoding
+exec
diff --git a/lib/gs_l.xbm b/lib/gs_l.xbm
new file mode 100644
index 00000000..6583d4a3
--- /dev/null
+++ b/lib/gs_l.xbm
@@ -0,0 +1,29 @@
+#define gs_l.xbm_width 48
+#define gs_l.xbm_height 48
+#define gs_l.xbm_x_hot 0
+#define gs_l.xbm_y_hot 0
+static unsigned char gs_l.xbm_bits[] = {
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x3e, 0x03, 0x00, 0x00, 0x00, 0xff, 0x1f, 0x07, 0x00,
+ 0x00, 0xe0, 0xff, 0x0f, 0x07, 0x00, 0x00, 0xf8, 0xff, 0x81, 0x07, 0x00,
+ 0x00, 0xfc, 0x1f, 0xc0, 0x0f, 0x00, 0x00, 0xfe, 0x07, 0xf0, 0x1f, 0x00,
+ 0x00, 0xff, 0x01, 0xf8, 0x1f, 0x00, 0x00, 0xff, 0x41, 0xfc, 0x3f, 0x00,
+ 0x80, 0xff, 0xc8, 0xfc, 0x3f, 0x00, 0x80, 0xff, 0xd8, 0xf8, 0x3f, 0x00,
+ 0x80, 0xff, 0x98, 0xf0, 0x3f, 0x00, 0x80, 0xff, 0x10, 0xe0, 0x3f, 0x00,
+ 0x00, 0xff, 0x01, 0xc0, 0x3f, 0x00, 0x00, 0xff, 0x81, 0x81, 0x1f, 0x00,
+ 0x00, 0xfe, 0x83, 0x83, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x83, 0x0f, 0x00,
+ 0x00, 0xf8, 0x1f, 0xc3, 0x03, 0x00, 0x00, 0xe0, 0x1f, 0xe0, 0x01, 0x00,
+ 0x00, 0xf0, 0x1f, 0x38, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0xc0, 0xff, 0xff, 0xff, 0x01, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x0f, 0x00,
+ 0x80, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x03,
+ 0x00, 0xc0, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x03,
+ 0xc0, 0x3f, 0x00, 0x00, 0xff, 0x03, 0xe0, 0x0f, 0x00, 0x00, 0xfe, 0x03,
+ 0xf0, 0x07, 0xfc, 0x00, 0xfc, 0x01, 0xf0, 0x07, 0x0e, 0x00, 0xff, 0x04,
+ 0xf0, 0x07, 0x7e, 0xe0, 0x7f, 0x02, 0xf0, 0x0f, 0xfc, 0xff, 0x1f, 0x01,
+ 0xe0, 0x1f, 0xf0, 0xff, 0xc3, 0x00, 0xc0, 0xff, 0x00, 0x00, 0x78, 0x00,
+ 0x80, 0xff, 0x0f, 0xf8, 0x3f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00,
+ 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/gs_l.xpm b/lib/gs_l.xpm
new file mode 100644
index 00000000..dccf2e47
--- /dev/null
+++ b/lib/gs_l.xpm
@@ -0,0 +1,58 @@
+/* XPM */
+static char * gs_l_xpm[] = {
+/* width height ncolors cpp [x_hot y_hot] */
+"48 48 4 1 0 0",
+/* colors */
+" s none m none c none",
+". s iconColor1 m black c black",
+"X s iconColor2 m white c white",
+"o s iconColor5 m black c blue",
+/* pixels */
+" . ",
+" .X.. ",
+" .X.. ",
+" .XX.. ",
+" .....XX.. ",
+" .............XXX... ",
+" ...............XXXX... ",
+" ..............XXXXXX.... ",
+" ...........XXXXXXXXX...... ",
+" ..........XXXXXXXXX......... ",
+" .........XXXXXXXXXX.......... ",
+" .........XXXXXoXXX............ ",
+" .........XXXoXXooXX............ ",
+" .........XXXooXooXXX........... ",
+" .........XXXooXXoXXXX.......... ",
+" .........XXXXoXXXXXXXX......... ",
+" .........XXXXXXXXXXXXX........ ",
+" .........XXXXXXooXXXXXX...... ",
+" .........XXXXXoooXXXXX...... ",
+" ..........XXXXooXXXXX..... ",
+" ..........XXXooXXXX.... ",
+" ........XXXXXXXX.... ",
+" .........XXXXXX... ",
+" ..........XXXXXXX ",
+" ........XXXXXXXXXXXX ",
+" ........XXXXXXXXXXXXXX ",
+" ..........XXXXXXXXXXXXXXX ",
+" ..................XXXXXXXXX ",
+" ...........................X ",
+" .............................. ",
+" ................................ ",
+" ................................. ",
+" ................................. ",
+" ................................ ",
+" ............................ ",
+" XXXXXXXXXXXXX.............. ",
+" ........XXXXXXXXXXXXXXXXXX.......... ",
+" .......XXXXXXXXXXXXXXXXXXXXX......... ",
+" .......XXXXXXX......XXXXXXXXXX.......X ",
+" .......XXXXXX...XXXXXXXXXXXX........XX. ",
+" .......XXXXXX......XXXXXX..........XX. ",
+" ........XXXXXX...................XXX. ",
+" ........XXXXXXX..............XXXX.. ",
+" ..........XXXXXXXXXXXXXXXXXXX.... ",
+" .............XXXXXXX........... ",
+" .......................... ",
+" ................... ",
+" "};
diff --git a/lib/gs_l_m.xbm b/lib/gs_l_m.xbm
new file mode 100644
index 00000000..68602531
--- /dev/null
+++ b/lib/gs_l_m.xbm
@@ -0,0 +1,29 @@
+#define gs_l_m.xbm_width 48
+#define gs_l_m.xbm_height 48
+#define gs_l_m.xbm_x_hot 0
+#define gs_l_m.xbm_y_hot 0
+static unsigned char gs_l_m.xbm_bits[] = {
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x00,
+ 0x00, 0xe0, 0xff, 0xff, 0x07, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x07, 0x00,
+ 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x1f, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00,
+ 0x80, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, 0x3f, 0x00,
+ 0x80, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, 0x3f, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x00,
+ 0x00, 0xfe, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00,
+ 0x00, 0xf8, 0xff, 0xff, 0x03, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+ 0x00, 0xf0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x07, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00,
+ 0xc0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x01, 0x00,
+ 0xc0, 0xff, 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x0f, 0x00,
+ 0x80, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x03,
+ 0x00, 0xc0, 0xff, 0xff, 0xff, 0x03, 0x00, 0x80, 0xff, 0xff, 0xff, 0x03,
+ 0xc0, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03,
+ 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07,
+ 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x01,
+ 0xe0, 0xff, 0xff, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x7f, 0x00,
+ 0x80, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00,
+ 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/gs_lgo_e.ps b/lib/gs_lgo_e.ps
new file mode 100644
index 00000000..b6707ae6
--- /dev/null
+++ b/lib/gs_lgo_e.ps
@@ -0,0 +1,90 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Define the Adobe "original" Latin glyph set.
+% This is not an Encoding strictly speaking, but we treat it like one.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/AdobeLatinOriginalGlyphEncoding mark
+
+/.notdef
+/A /AE /Aacute /Acircumflex /Adieresis /Agrave /Aring /Atilde
+/B
+/C /Ccedilla
+/D
+/E /Eacute /Ecircumflex /Edieresis /Egrave /Eth
+/F
+/G
+/H
+/I /Iacute /Icircumflex /Idieresis /Igrave
+/J
+/K
+/L /Lslash
+/M
+/N /Ntilde
+/O /OE /Oacute /Ocircumflex /Odieresis /Ograve /Oslash /Otilde
+/P
+/Q
+/R
+/S /Scaron
+/T /Thorn
+/U /Uacute /Ucircumflex /Udieresis /Ugrave
+/V
+/W
+/X
+/Y /Yacute /Ydieresis
+/Z /Zcaron
+/a /aacute /acircumflex /acute /adieresis /ae /agrave /ampersand /aring
+ /asciicircum /asciitilde /asterisk /at /atilde
+/b /backslash /bar /braceleft /braceright /bracketleft /bracketright /breve
+ /brokenbar /bullet
+/c /caron /ccedilla /cedilla /cent /circumflex /colon /comma /copyright
+ /currency
+/d /dagger /daggerdbl /degree /dieresis /divide /dollar /dotaccent /dotlessi
+/e /eacute /ecircumflex /edieresis /egrave /eight /ellipsis /emdash /endash
+ /equal /eth /exclam /exclamdown
+/f /fi /five /fl /florin /four /fraction
+/g /germandbls /grave /greater /guillemotleft /guillemotright /guilsinglleft
+ /guilsinglright
+/h /hungarumlaut /hyphen
+/i /iacute /icircumflex /idieresis /igrave
+/j
+/k
+/l /less /logicalnot /lslash
+/m /macron /minus /mu /multiply
+/n /nine /ntilde /numbersign
+/o /oacute /ocircumflex /odieresis /oe /ogonek /ograve /one /onehalf
+ /onequarter /onesuperior /ordfeminine /ordmasculine /oslash /otilde
+/p /paragraph /parenleft /parenright /percent /period /periodcentered
+ /perthousand /plus /plusminus
+/q /question /questiondown /quotedbl /quotedblbase /quotedblleft
+ /quotedblright /quoteleft /quoteright /quotesinglbase /quotesingle
+/r /registered /ring
+/s /scaron /section /semicolon /seven /six /slash /space /sterling
+/t /thorn /three /threequarters /threesuperior /tilde /trademark /two
+ /twosuperior
+/u /uacute /ucircumflex /udieresis /ugrave /underscore
+/v
+/w
+/x
+/y /yacute /ydieresis /yen
+/z /zcaron /zero
+
+counttomark packedarray exch pop
+8 1 index .registerencoding
+.defineencoding
+exec
diff --git a/lib/gs_lgx_e.ps b/lib/gs_lgx_e.ps
new file mode 100644
index 00000000..c2e3217c
--- /dev/null
+++ b/lib/gs_lgx_e.ps
@@ -0,0 +1,59 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Define the Adobe "extension" Latin glyph set.
+% This is not an Encoding strictly speaking, but we treat it like one.
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/AdobeLatinExtensionGlyphEncoding mark
+
+/Abreve /Amacron /Aogonek
+/Cacute /Ccaron /Dcaron
+/Dcroat /Delta
+/Ecaron /Edotaccent /Emacron /Eogonek
+/Gbreve /Gcommaaccent
+/Idotaccent /Imacron /Iogonek
+/Kcommaaccent
+/Lacute /Lcaron /Lcommaaccent
+/Nacute /Ncaron /Ncommaaccent
+/Ohungarumlaut /Omacron
+/Racute /Rcaron /Rcommaaccent
+/Sacute /Scedilla /Scommaaccent
+/Tcaron /Tcommaaccent
+/Uhungarumlaut /Umacron /Uogonek /Uring
+/Zacute /Zdotaccent
+/abreve /amacron /aogonek
+/cacute /ccaron /commaaccent
+/dcaron /dcroat
+/ecaron /edotaccent /emacron /eogonek
+/gbreve /gcommaaccent /greaterequal
+/imacron /iogonek
+/kcommaaccent
+/lacute /lcaron /lcommaaccent /lessequal /lozenge
+/nacute /ncaron /ncommaaccent /notequal
+/ohungarumlaut /omacron
+/partialdiff
+/racute /radical /rcaron /rcommaaccent
+/sacute /scedilla /scommaaccent /summation
+/tcaron /tcommaaccent
+/uhungarumlaut /umacron /uogonek /uring
+/zacute /zdotaccent
+
+counttomark packedarray exch pop
+9 1 index .registerencoding
+.defineencoding
+exec
diff --git a/lib/gs_m.xbm b/lib/gs_m.xbm
new file mode 100644
index 00000000..9c245cec
--- /dev/null
+++ b/lib/gs_m.xbm
@@ -0,0 +1,16 @@
+#define gs_m.xbm_width 32
+#define gs_m.xbm_height 32
+#define gs_m.xbm_x_hot 0
+#define gs_m.xbm_y_hot 0
+static unsigned char gs.m.bm_bits[] = {
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x48, 0x00,
+ 0x00, 0xf8, 0xc7, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x80, 0x3f, 0xf0, 0x00,
+ 0xc0, 0x0f, 0xf8, 0x01, 0xc0, 0x87, 0xfc, 0x03, 0xe0, 0xa7, 0xfc, 0x03,
+ 0xe0, 0x27, 0xf8, 0x03, 0xe0, 0x07, 0xf0, 0x03, 0xc0, 0x0f, 0xe3, 0x01,
+ 0x80, 0x1f, 0xe3, 0x00, 0x00, 0x3f, 0x60, 0x00, 0x00, 0x7c, 0x10, 0x00,
+ 0xc0, 0x3f, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00,
+ 0xf0, 0xff, 0x7f, 0x00, 0xf0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07,
+ 0xc0, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0x1f,
+ 0xf0, 0x00, 0x80, 0x0f, 0x78, 0x10, 0x80, 0x07, 0x78, 0x10, 0xc0, 0x13,
+ 0x70, 0xe0, 0xff, 0x08, 0xf0, 0x00, 0x00, 0x06, 0xc0, 0x03, 0xe0, 0x01,
+ 0x00, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/gs_m.xpm b/lib/gs_m.xpm
new file mode 100644
index 00000000..629b6d1c
--- /dev/null
+++ b/lib/gs_m.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char * gs_m_xpm[] = {
+/* width height ncolors cpp [x_hot y_hot] */
+"32 32 6 1 0 0",
+/* colors */
+" s none m none c none",
+". s iconColor1 m black c black",
+"X s iconColor2 m white c white",
+"o c #C0C0C0C0C0C0",
+"O c #808080808080",
+"+ c #00000000FFFF",
+/* pixels */
+" .X ",
+" .X. ",
+" .XX. ",
+" ........XXX.. ",
+" .........oXXXo.. ",
+" .......XXXXXXO... ",
+" ......XXXXXXX...... ",
+" .....XXXX+XX........ ",
+" ......XX+X+XX........ ",
+" ......XX+XXXXX....... ",
+" ......XXXXXXXXX...... ",
+" ......XXXX++XXX.... ",
+" .....OXXX++XXX... ",
+" ......XXXXXXX.. ",
+" .....XXXXX. ",
+" ........XXXXXXX ",
+" .....XXXXXXXXXXXX ",
+" .......XXXXXXXXXXXX ",
+" ...................X ",
+" ...................... ",
+" ...................... ",
+" ...................... ",
+" ..................... ",
+" XXXXXXXXXXXX........ ",
+" ....XXXXXXXXXXXXXXX.....X ",
+" ....XXXXX.XXXXXXXXXX....XX ",
+" ....XXXXX.XXXXXXXXX....XX. ",
+" ...XXXXXX...........XXX. ",
+" ....XXXXXXXXXXXXXXXXX.. ",
+" ....XXXXXXXXXXX.... ",
+" ............. ",
+" "};
diff --git a/lib/gs_m_m.xbm b/lib/gs_m_m.xbm
new file mode 100644
index 00000000..55c010b8
--- /dev/null
+++ b/lib/gs_m_m.xbm
@@ -0,0 +1,16 @@
+#define gs_m_m.xbm_width 32
+#define gs_m_m.xbm_height 32
+#define gs_m_m.xbm_x_hot 0
+#define gs_m_m.xbm_y_hot 0
+static unsigned char gs.m_m.bm_bits[] = {
+ 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x78, 0x00,
+ 0x00, 0xf8, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00,
+ 0xc0, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x03,
+ 0xe0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0x01,
+ 0x80, 0xff, 0xff, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, 0xfc, 0x1f, 0x00,
+ 0xc0, 0xff, 0x1f, 0x00, 0xe0, 0xff, 0x3f, 0x00, 0xf0, 0xff, 0x7f, 0x00,
+ 0xf0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07,
+ 0xc0, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x1f,
+ 0xf0, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x1f,
+ 0xf0, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x07, 0xc0, 0xff, 0xff, 0x01,
+ 0x00, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/gs_s.xbm b/lib/gs_s.xbm
new file mode 100644
index 00000000..b1e11048
--- /dev/null
+++ b/lib/gs_s.xbm
@@ -0,0 +1,11 @@
+#define gs_s.xbm_width 24
+#define gs_s.xbm_height 24
+#define gs_s.xbm_x_hot 0
+#define gs_s.xbm_y_hot 0
+static unsigned char gs.s.bm_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x08, 0x00, 0x00, 0x13,
+ 0x00, 0x00, 0x33, 0x00, 0xfe, 0x31, 0xe0, 0xff, 0x38, 0xf0, 0x3f, 0x38,
+ 0xf8, 0x07, 0x7e, 0xfc, 0x01, 0x7f, 0xfe, 0x90, 0x7f, 0x7e, 0x94, 0x7f,
+ 0x7e, 0x84, 0x7f, 0x7e, 0x00, 0x7f, 0x7e, 0x00, 0x7e, 0xfc, 0x60, 0x7c,
+ 0xfc, 0x61, 0x38, 0xf8, 0x03, 0x38, 0xf8, 0x03, 0x18, 0xf0, 0x07, 0x0c,
+ 0xc0, 0x0f, 0x06, 0xc0, 0x07, 0x03, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/gs_s.xpm b/lib/gs_s.xpm
new file mode 100644
index 00000000..859b601b
--- /dev/null
+++ b/lib/gs_s.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char * gs_s_xpm[] = {
+/* width height ncolors cpp [x_hot y_hot] */
+"24 24 6 1 0 0",
+/* colors */
+" s none m none c none",
+". c #808080808080",
+"X s iconColor1 m black c black",
+"o c #C0C0C0C0C0C0",
+"O s iconColor2 m white c white",
+"+ c #00000000FFFF",
+/* pixels */
+" ",
+" .. ",
+" XoOo. ",
+" X.OoX ",
+" X.OoX. ",
+" .XXXXXX.oOoXX ",
+" ..XXXXXXXX.oOO.XX ",
+" XXXXXXXX..oOOOo.XX ",
+" XXXXXXX.OOOOOo.XXXX. ",
+" XXXXXX.OOOOOOOXXXXXXX ",
+" .XXXXX.OOOO+OOXXXXXXXX ",
+" XXXXXXOOO+O+OOXXXXXXXX ",
+" XXXXXXOOO+OOOOXXXXXXXX ",
+" XXXXXXOOOOOOOOOXXXXXXX ",
+" .XXXXXOOOOOOOOOO.XXXXX ",
+" XXXXXXOOOOO++OOO.XXXX ",
+" .XXXXX.OOOO++OOOoXXX ",
+" XXXXXX.OOOOOOOOOXXX ",
+" .XXXXXXoOOOOOOOoXX ",
+" .XXXXXXoOOOOOo.X ",
+" .XXXXXOOOOO.X ",
+" .XXXXOOOOO.. ",
+" XXXXXOOOOOOOO ",
+" "};
diff --git a/lib/gs_s_m.xbm b/lib/gs_s_m.xbm
new file mode 100644
index 00000000..9675725d
--- /dev/null
+++ b/lib/gs_s_m.xbm
@@ -0,0 +1,11 @@
+#define gs_s_m.xbm_width 24
+#define gs_s_m.xbm_height 24
+#define gs_s_m.xbm_x_hot 0
+#define gs_s_m.xbm_y_hot 0
+static unsigned char gs.s_m.bm_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x3f, 0x00, 0xfe, 0x3f, 0xe0, 0xff, 0x3f, 0xf0, 0xff, 0x3f,
+ 0xf8, 0xff, 0x7f, 0xfc, 0xff, 0x7f, 0xfe, 0xff, 0x7f, 0xfe, 0xff, 0x7f,
+ 0xfe, 0xff, 0x7f, 0xfe, 0xff, 0x7f, 0xfe, 0xff, 0x7f, 0xfc, 0xff, 0x7f,
+ 0xfc, 0xff, 0x3f, 0xf8, 0xff, 0x3f, 0xf8, 0xff, 0x1f, 0xf0, 0xff, 0x0f,
+ 0xc0, 0xff, 0x07, 0xc0, 0xff, 0x03, 0xf0, 0xff, 0x01, 0x00, 0x00, 0x00};
diff --git a/lib/gs_t.xbm b/lib/gs_t.xbm
new file mode 100644
index 00000000..fa3bee48
--- /dev/null
+++ b/lib/gs_t.xbm
@@ -0,0 +1,8 @@
+#define gs_t.xbm_width 16
+#define gs_t.xbm_height 16
+#define gs_t.xbm_x_hot 0
+#define gs_t.xbm_y_hot 0
+static unsigned char gs.t.bm_bits[] = {
+ 0x00, 0x10, 0x00, 0x20, 0x00, 0x68, 0xf0, 0x67, 0xfc, 0x61, 0x7e, 0x70,
+ 0x1f, 0xf9, 0x4f, 0xfd, 0x4f, 0xfc, 0x0f, 0xf8, 0x1f, 0xf3, 0x1e, 0xe3,
+ 0x3e, 0x60, 0x7c, 0x30, 0x70, 0x0c, 0x1e, 0x00};
diff --git a/lib/gs_t.xpm b/lib/gs_t.xpm
new file mode 100644
index 00000000..19f773d2
--- /dev/null
+++ b/lib/gs_t.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char * gs_t_xpm[] = {
+/* width height ncolors cpp [x_hot y_hot] */
+"16 16 6 1 0 0",
+/* colors */
+" s none m none c none",
+". s iconColor1 m black c black",
+"X s iconColor2 m white c white",
+"o c #808080808080",
+"O c #C0C0C0C0C0C0",
+"+ c #00000000FFFF",
+/* pixels */
+" . ",
+" X. ",
+" .X.o ",
+" o......XX.. ",
+" .......OXXX.. ",
+" ......XXXXXo.. ",
+"o....XXX+XX.....",
+"....XX+X+Xo.....",
+"....XX+XXXo.....",
+"....XXXXXXX.....",
+"o...oXXX++XX....",
+" ....XXX++XXX..o",
+" ....oXXXXXXX.. ",
+" .....XXXXX.. ",
+" ...XXXoo ",
+" o...XXXXXXX "};
diff --git a/lib/gs_t_m.xbm b/lib/gs_t_m.xbm
new file mode 100644
index 00000000..55f3f353
--- /dev/null
+++ b/lib/gs_t_m.xbm
@@ -0,0 +1,8 @@
+#define gs_t_m.xbm_width 16
+#define gs_t_m.xbm_height 16
+#define gs_t_m.xbm_x_hot 0
+#define gs_t_m.xbm_y_hot 0
+static unsigned char gs.t_m.bm_bits[] = {
+ 0x00, 0x10, 0x00, 0x30, 0x00, 0x78, 0xf0, 0x7f, 0xfc, 0x7f, 0xfe, 0x7f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff,
+ 0xfe, 0x7f, 0xfc, 0x3f, 0xf0, 0x0f, 0xfe, 0x0f};
diff --git a/lib/gs_wl1_e.ps b/lib/gs_wl1_e.ps
new file mode 100644
index 00000000..ef05498b
--- /dev/null
+++ b/lib/gs_wl1_e.ps
@@ -0,0 +1,65 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Define the Windows 3.1 Latin 1 encoding vector (H-P Symbol set 19U).
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/Win31Latin1Encoding
+ISOLatin1Encoding 0 39 getinterval aload pop
+ /quotesingle
+ISOLatin1Encoding 40 5 getinterval aload pop
+ /hyphen
+ISOLatin1Encoding 46 50 getinterval aload pop
+ /grave
+ISOLatin1Encoding 97 30 getinterval aload pop
+ /graybox
+% \20x
+ /.notdef /.notdef /quotesinglbase /florin
+ /quotedblbase /ellipsis /dagger /daggerdbl
+ /circumflex /perthousand /Scaron /guilsinglleft
+ /OE /.notdef /.notdef /.notdef
+ /.notdef /quoteleft /quoteright /quotedblleft
+ /quotedblright /bullet /endash /emdash
+ /tilde /trademark /scaron /guilsinglright
+ /oe /.notdef /.notdef /Ydieresis
+ /.notdef /exclamdown /cent /sterling
+ /currency /yen /brokenbar /section
+ /dieresis /copyright /ordfeminine /guillemotleft
+ /logicalnot /softhyphen /registered /overscore
+ /degree /plusminus /twosuperior /threesuperior
+ /acute /mu /paragraph /periodcentered
+ /cedilla /onesuperior /ordmasculine /guillemotright
+ /onequarter /onehalf /threequarters /questiondown
+% \30x
+ /Agrave /Aacute /Acircumflex /Atilde
+ /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+ /Eth /Ntilde /Ograve /Oacute
+ /Ocircumflex /Otilde /Odieresis /multiply
+ /Oslash /Ugrave /Uacute /Ucircumflex
+ /Udieresis /Yacute /Thorn /germandbls
+ /agrave /aacute /acircumflex /atilde
+ /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+ /eth /ntilde /ograve /oacute
+ /ocircumflex /otilde /odieresis /divide
+ /oslash /ugrave /uacute /ucircumflex
+ /udieresis /yacute /thorn /ydieresis
+256 packedarray .defineencoding
+exec
diff --git a/lib/gs_wl2_e.ps b/lib/gs_wl2_e.ps
new file mode 100644
index 00000000..5c337a4a
--- /dev/null
+++ b/lib/gs_wl2_e.ps
@@ -0,0 +1,65 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Define the Windows 3.1 Latin 2 encoding vector (H-P Symbol set 9E).
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/Win32Latin2Encoding
+ISOLatin1Encoding 0 39 getinterval aload pop
+ /quotesingle
+ISOLatin1Encoding 40 5 getinterval aload pop
+ /hyphen
+ISOLatin1Encoding 46 50 getinterval aload pop
+ /grave
+ISOLatin1Encoding 97 30 getinterval aload pop
+ /graybox
+% \20x
+ /.notdef /.notdef /quotesinglbase /.notdef
+ /quotedblbase /ellipsis /dagger /daggerdbl
+ /.notdef /perthousand /Scaron /guilsinglleft
+ /Sacute /Tcaron /Zcaron /Zacute
+ /.notdef /quoteleft /quoteright /quotedblleft
+ /quotedblright /bullet /endash /emdash
+ /.notdef /trademark /scaron /guilsinglright
+ /sacute /tcaron /zcaron /zacute
+ /.notdef /caron /breve /Lslash
+ /currency /Aogonek /brokenbar /section
+ /dieresis /copyright /Scedilla /guillemotleft
+ /logicalnot /softhyphen /registered /Zdotaccent
+ /degree /plusminus /ogonek /lslash
+ /acute /mu /paragraph /periodcentered
+ /cedilla /aogonek /scedilla /guillemotright
+ /Lcaron /hungarumlaut /lcaron /zdotaccent
+% \30x
+ /Racute /Aacute /Acircumflex /Abreve
+ /Adieresis /Lacute /Cacute /Ccedilla
+ /Ccaron /Eacute /Eogonek /Edieresis
+ /Ecaron /Iacute /Icircumflex /Dcaron
+ /Dcroat /Nacute /Ncaron /Oacute
+ /Ocircumflex /Ohungarumlaut /Odieresis /multiply
+ /Rcaron /Uring /Uacute /Uhungarumlaut
+ /Udieresis /Yacute /Tcommaaccent /germandbls
+ /racute /aacute /acircumflex /abreve
+ /adieresis /lacute /cacute /ccedilla
+ /ccaron /eacute /eogonek /edieresis
+ /ecaron /iacute /icircumflex /dcaron
+ /dcroat /nacute /ncaron /oacute
+ /ocircumflex /ohungarumlaut /odieresis /divide
+ /rcaron /uring /uacute /uhungarumlaut
+ /udieresis /yacute /tcommaaccent /dotaccent
+256 packedarray .defineencoding
+exec
diff --git a/lib/gs_wl5_e.ps b/lib/gs_wl5_e.ps
new file mode 100644
index 00000000..8d6ce40f
--- /dev/null
+++ b/lib/gs_wl5_e.ps
@@ -0,0 +1,65 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Define the Windows 3.1 Latin 5 encoding vector (H-P Symbol set 5T).
+/currentglobal where
+ { pop currentglobal { setglobal } true setglobal }
+ { { } }
+ifelse
+/Win32Latin5Encoding
+ISOLatin1Encoding 0 39 getinterval aload pop
+ /quotesingle
+ISOLatin1Encoding 40 5 getinterval aload pop
+ /hyphen
+ISOLatin1Encoding 46 50 getinterval aload pop
+ /grave
+ISOLatin1Encoding 97 30 getinterval aload pop
+ /graybox
+% \20x
+ /.notdef /.notdef /quotesinglbase /florin
+ /quotedblbase /ellipsis /dagger /daggerdbl
+ /circumflex /perthousand /Scaron /guilsinglleft
+ /OE /.notdef /.notdef /.notdef
+ /.notdef /quoteleft /quoteright /quotedblleft
+ /quotedblright /bullet /endash /emdash
+ /tilde /trademark /scaron /guilsinglright
+ /oe /.notdef /.notdef /Ydieresis
+ /.notdef /exclamdown /cent /sterling
+ /currency /yen /brokenbar /section
+ /dieresis /copyright /ordfeminine /guillemotleft
+ /logicalnot /softhyphen /registered /overscore
+ /degree /plusminus /twosuperior /threesuperior
+ /acute /mu /paragraph /periodcentered
+ /cedilla /onesuperior /ordmasculine /guillemotright
+ /onequarter /onehalf /threequarters /questiondown
+% \30x
+ /Agrave /Aacute /Acircumflex /Atilde
+ /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+ /Gbreve /Ntilde /Ograve /Oacute
+ /Ocircumflex /Otilde /Odieresis /multiply
+ /Oslash /Ugrave /Uacute /Ucircumflex
+ /Udieresis /Idotaccent /Scedilla /germandbls
+ /agrave /aacute /acircumflex /atilde
+ /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+ /gbreve /ntilde /ograve /oacute
+ /ocircumflex /otilde /odieresis /divide
+ /oslash /ugrave /uacute /ucircumflex
+ /udieresis /dotlessi /scedilla /ydieresis
+256 packedarray .defineencoding
+exec
diff --git a/lib/gsbj b/lib/gsbj
new file mode 100755
index 00000000..30cd09c4
--- /dev/null
+++ b/lib/gsbj
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+exec "$GS_EXECUTABLE" -q -sDEVICE=bj10e -r180 -P- -dSAFER -dNOPAUSE -sPROGNAME=$0 -- gslp.ps --heading-center "`date`" "$@"
diff --git a/lib/gsbj.bat b/lib/gsbj.bat
new file mode 100755
index 00000000..3dbfd6f6
--- /dev/null
+++ b/lib/gsbj.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GSC% -q -sDEVICE=bj10e -r180 -P- -dSAFER -dNOPAUSE -sPROGNAME=gsbj -- gslp.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/lib/gsdj b/lib/gsdj
new file mode 100755
index 00000000..e87cce2e
--- /dev/null
+++ b/lib/gsdj
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+exec "$GS_EXECUTABLE" -q -sDEVICE=deskjet -r300 -P- -dSAFER -dNOPAUSE -sPROGNAME=$0 -- gslp.ps --heading-center "`date`" "$@"
diff --git a/lib/gsdj.bat b/lib/gsdj.bat
new file mode 100755
index 00000000..a8624e91
--- /dev/null
+++ b/lib/gsdj.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GSC% -q -sDEVICE=deskjet -r300 -P- -dSAFER -dNOPAUSE -sPROGNAME=gsdj -- gslp.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/lib/gsdj500 b/lib/gsdj500
new file mode 100755
index 00000000..aa975363
--- /dev/null
+++ b/lib/gsdj500
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+exec "$GS_EXECUTABLE" -q -sDEVICE=djet500 -r300 -P- -dSAFER -dNOPAUSE -sPROGNAME=$0 -- gslp.ps --heading-center "`date`" "$@"
diff --git a/lib/gsdj500.bat b/lib/gsdj500.bat
new file mode 100755
index 00000000..45dd85f3
--- /dev/null
+++ b/lib/gsdj500.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GSC% -q -sDEVICE#djet500 -r300 -P- -dSAFER -dNOPAUSE -sPROGNAME=gsdj500 -- gslp.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/lib/gslj b/lib/gslj
new file mode 100755
index 00000000..c46f986a
--- /dev/null
+++ b/lib/gslj
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+exec "$GS_EXECUTABLE" -q -sDEVICE=laserjet -r300 -P- -dSAFER -dNOPAUSE -sPROGNAME=$0 -- gslp.ps --heading-center "`date`" "$@"
diff --git a/lib/gslj.bat b/lib/gslj.bat
new file mode 100755
index 00000000..067df7dd
--- /dev/null
+++ b/lib/gslj.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GSC% -q -sDEVICE=laserjet -r300 -P- -dSAFER -dNOPAUSE -sPROGNAME=gslj -- gslp.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/lib/gslp b/lib/gslp
new file mode 100755
index 00000000..837a457f
--- /dev/null
+++ b/lib/gslp
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+exec "$GS_EXECUTABLE" -q -sDEVICE=epson -r180 -P- -dSAFER -dNOPAUSE -sPROGNAME=$0 -- gslp.ps --heading-center "`date`" "$@"
diff --git a/lib/gslp.bat b/lib/gslp.bat
new file mode 100755
index 00000000..5137b94d
--- /dev/null
+++ b/lib/gslp.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GSC% -q -sDEVICE=epson -r180 -P- -dSAFER -dNOPAUSE -sPROGNAME=gslp -- gslp.ps %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/lib/gslp.ps b/lib/gslp.ps
new file mode 100644
index 00000000..002dc978
--- /dev/null
+++ b/lib/gslp.ps
@@ -0,0 +1,719 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% gslp.ps - format and print text
+
+% This utility provides functionality approximately equivalent to the Unix
+% `enscript' program. It prints plain text files using a single font.
+% It currently handles tabs and formfeeds, but not backspaces.
+% It will line-wrap when using fixed-pitch fonts.
+% It will also do kerning and width adjustment.
+% Standard switches implemented:
+% -12BclqRr -b<header> -f<font> -F<hfont> -L<lines> -p<outfile>
+% Sun switches implemented:
+% -T<n> set tab width
+% Switches ignored:
+% -GghKkmow -# -C -d -J -n -P -S -s -t -v
+% Switches added:
+% --add-to-space <units>
+% add the given number of 1/72" units to the width of each
+% space (may be negative)
+% --add-to-width <units>
+% add the given number of 1/72" units to the width of each
+% character (may be negative)
+% --columns <n>
+% print in <n> columns
+% --detect
+% treat the file as PostScript if it starts with %!
+% --first-page <n>
+% --duplex(|-long-edge|-short-edge)
+% use duplex if available; if not specified, select long edge
+% for portrait printing, short edge for landscape
+% start printing at page <n>
+% --kern <file.afm>
+% kern using information from the given .AFM file
+% --last-page <n>
+% stop printing after page <n>
+% --(heading|footing)-(left|center|right) <string>
+% set the heading/footing fields; use -B first to clear
+% --margin-(top|bottom|left|right) <inches>
+% set a margin
+% --no-eject-(file|formfeed)
+% end-of-file/FF only starts a new column, not a new sheet
+% --spacing <n>
+% use double (n=2), triple (n=3), etc. spacing
+% Also, the string %# in a heading or footing is replaced with the page #.
+/PageNumberString (%#) def
+
+/lpdict 150 dict def
+lpdict begin
+
+% build iso-latin-1 version of a font
+/font-to-iso-latin-1 { % <font> font-to-iso-latin-1 <font>
+ %% reencode for iso latin1; from the 2nd edition red book, sec 5.6.1
+ dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding ISOLatin1Encoding def currentdict end
+ dup /FontName get 80 string cvs (-ISOLatin1) concatstrings cvn
+ exch definefont
+} def
+
+/find-latin-font { % <name> find-latin-font <font>
+ findfont font-to-iso-latin-1
+} def
+
+% Define the initial values of the printing parameters.
+
+/AddToSpace 0 def
+/AddToWidth 0 def
+/BodyFont null def % use default
+ /defaultBodyFontPortrait
+ /Courier find-latin-font 10 scalefont def
+ /defaultBodyFontLandscape
+ /Courier find-latin-font 7 scalefont def
+ /defaultBodyFont
+ { Landscape { defaultBodyFontLandscape } { defaultBodyFontPortrait } ifelse } def
+/Columns 1 def
+/DetectFileType false def
+/Duplex null def
+/EjectEOF true def
+/EjectFF true def
+/Footers false def
+/FootingLeft () def
+/FootingCenter () def
+/FootingRight () def
+/Headers true def
+/HeadingLeft () def
+/HeadingCenter () def
+/HeadingRight (page ) PageNumberString concatstrings def
+/HeadingFont null def % use default
+ /defaultHeadingFont
+ /Courier-Bold find-latin-font 10 scalefont def
+/Kern 0 dict def % no kerning
+/Landscape false def
+/MarginBottom 36 def % 1/2"
+/MarginLeft 36 def % 1/2"
+/MarginRight 36 def % 1/2"
+/MarginTop 36 def % 1/2"
+/MaxLines 9999 def % max lines per page
+/Noisy true def % i.e., not quiet
+/OutFile null def % null = write directly to device
+/PageFirst 1 def
+/PageLast 99999 def
+/Spacing 1 def
+/Tab 8 def
+/Truncate false def % wrap long lines, don't truncate
+
+% When writing to a file, we want to write out PostScript;
+% when writing to the printer, we want to execute it;
+% some commands should be executed regardless.
+% lpexec provides for all this.
+
+/lpdef { % <name> <value> lpdef -
+ /def 2 true lpexec
+} def
+
+/lpexec { % <arg1> ... <argn> </op> <n> <do_always> lpexec -
+ OutFile null eq {
+ pop 1 add true
+ } {
+ /t exch def 1 add /n exch def cvx
+ n -1 roll dup wo
+ n 1 sub { n -1 roll dup wosp } repeat
+ (\n) ws n t
+ } ifelse
+ { pop load exec }
+ { { pop } repeat }
+ ifelse
+} def
+
+/lpmoveto { % <x> <y> lpmoveto -
+ % Round the coordinates for smaller output.
+ 2 {
+ exch 100 mul round 100 div
+ dup dup cvi eq { cvi } if
+ } repeat
+ 1 index X eq { neg exch pop /V 1 } { neg /M 2 } ifelse true lpexec
+} def
+/lpshow { % <string> lpshow -
+ dup length 0 ne {
+ addspace 0 ne {
+ addspace 0 32
+ addwidth 0 ne {
+ addwidth 0 6 -1 roll /awidthshow 6 true lpexec
+ } {
+ 4 -1 roll /widthshow 4 true lpexec
+ } ifelse
+ } {
+ addwidth 0 ne {
+ addwidth 0 3 -1 roll /ashow 3 true lpexec
+ } {
+ OutFile null ne {
+ dup dup length =string length gt {
+ /show 1 false lpexec
+ } {
+ (S ) ws ws (\n) ws
+ } ifelse
+ } if show
+ } ifelse
+ } ifelse
+ } {
+ pop
+ } ifelse
+} def
+/lpsetmyfont {
+ dup load setfont
+ OutFile null ne { cvx /setfont 1 false lpexec } { pop } ifelse
+} def
+
+% Define some utility procedures.
+
+/banner % ypos left center right
+ { /HFont lpsetmyfont
+ /addspace 0 def /addwidth 0 def
+ /pairkern 0 dict def
+ 3 -1 roll bannerstring pop 0 4 index pwidth showline2 pop
+ exch bannerstring pwidth exch sub 2 div 3 index pwidth showline2 pop
+ bannerstring
+ % Prevent the last character of the heading from grazing
+ % the right margin.
+ % ****** WHY DOES IT REQUIRE SO MUCH PADDING? ******
+ ( ) stringwidth pop 2 mul add
+ pwidth exch sub
+ 3 -1 roll pwidth showline2 pop
+ } def
+
+/bannerstring % string -> string width
+ { PageNumberString search
+ { exch pop pindex 4 string cvs concatstrings exch concatstrings
+ }
+ if dup stringwidth pop
+ } def
+
+/beginpage
+ { /lindex 0 def
+ /skipping pindex PageFirst ge pindex PageLast le and not def
+ pagex pagey Landscape {/BL} {/B} ifelse 2 true lpexec
+ /pagesave exch def
+ skipping { nulldevice /OutFile null def } if
+ Headers
+ { lheight hdescent add
+ HeadingLeft HeadingCenter HeadingRight banner
+ } if
+ /BFont lpsetmyfont
+ /pairkern Kern def
+ /addspace AddToSpace def /addwidth AddToWidth def
+ pairkern length 0 ne {
+ /addspace AddToSpace lpdef /addwidth AddToWidth lpdef
+ } if
+ } def
+
+/endpage {
+ lindex 0 ne {
+ Footers {
+ topskip plength sub hdescent add
+ FootingLeft FootingCenter FootingRight banner
+ } if
+ /E
+ } {
+ /restore
+ } ifelse
+ pagesave exch 0 true lpexec
+ /pindex pindex 1 add def
+} def
+
+/endcolumn
+ { lindex colines 1 sub add colines idiv colines mul
+ dup llength ge { pop endpage beginpage } { /lindex exch def } ifelse
+ } def
+
+/fontheight % <font> fontheight <ascent> <height>
+ { gsave setfont
+ newpath 0 0 moveto
+ (|^_j) false charpath
+ pathbbox exch pop dup 2 index sub 4 -2 roll pop pop
+ grestore exch 1.25 mul exch 1.25 mul
+ } def
+
+/wdict {
+ dup length wosp ( dict\n) ws
+ { (dup) ws exch wosp wosp ( put\n) ws } forall
+} def
+/wosp { ( ) ws wo } def
+/wo {
+ dup type /dicttype eq { wdict } { OutFile exch write==only } ifelse
+} def
+/ws {
+ OutFile exch writestring
+} def
+
+/outfont { % <name> <font> outfont -
+ OutFile null ne {
+ exch wo
+ dup /FontName get
+ dup wosp (-ISOLatin1) ws wosp ( RE) ws
+ /FontMatrix get 0 get 1000 mul round cvi wosp
+ ( scalefont def\n) ws
+ } {
+ pop pop
+ }ifelse
+} def
+
+/StringFF (\f) def
+/CharFF StringFF 0 get def
+/StringTAB (\t) def
+/CharTAB StringTAB 0 get def
+
+/showline % line -> leftover_line (handles \f)
+ { { showline1 dup length 0 eq { exit } if
+ dup 0 get CharFF ne { exit } if
+ EjectFF { endpage beginpage } { endcolumn } ifelse
+ skip1
+ }
+ loop
+ } def
+
+/showline1 % line -> leftover_line (handles page break)
+ { lindex llength eq { endpage beginpage } if
+ lindex colines idiv cowidth mul % x
+ lindex colines mod 1 add lheight mul neg fascent sub % y
+ 1 index cowidth add
+ showline2
+ /lindex lindex 1 add def
+ } def
+
+/setxy {
+ /ty exch def /tx exch def
+} def
+
+/showline2 { % string x y xlimit -> leftover_string (handles tabs)
+ 2 index exch 5 2 roll setxy {
+ % Stack: xinit xlimit string
+ showline3 dup length 0 eq { exit } if
+ dup 0 get CharTAB ne { exit } if
+ tx 3 index sub tabwx div
+ 0.05 add ceiling tabwx mul 3 index add ty setxy
+ skip1
+ tx 2 index ge { exit } if
+ } loop exch pop exch pop
+} def
+
+/showline3 { % xlimit string -> xlimit leftover_string
+ % (finds line break / tab / formfeed)
+ 1 index tx sub
+ cwx div 0.1 add cvi 0 .max 1 index length .min
+ 1 index 0 3 -1 roll getinterval
+ % look for \f or \t
+ StringFF search { exch pop exch pop } if
+ StringTAB search { exch pop exch pop } if
+ dup length 0 ne {
+ tx ty lpmoveto
+ dup pairkern length 0 eq {
+ lpshow
+ } {
+ { kproc } exch /kshow 2 true lpexec
+ } ifelse
+ currentpoint setxy
+ } if
+ length dup 2 index length exch sub getinterval
+} def
+
+/kproc { % <char1> <char2> kproc -
+ pairkern currentfont /Encoding get 3 index get
+ 2 copy known {
+ get currentfont /Encoding get 2 index get
+ 2 copy known {
+ get currentfont /FontMatrix get 0 get mul
+ } {
+ pop pop 0
+ } ifelse
+ } {
+ pop pop 0
+ } ifelse
+ addwidth add 2 index 32 eq { addspace add } if
+ dup 0 eq { pop } { 0 rmoveto } ifelse
+ pop pop
+} def
+
+/skip1
+ { dup length 1 sub 1 exch getinterval
+ } def
+
+/e== { % <object> e== - -- print an object to stderr
+ (%stderr) (w) file dup 3 -1 roll write==only flushfile
+} def
+
+/eprint { % <string> eprint - -- print a string to stderr
+ (%stderr) (w) file dup 3 -1 roll writestring flushfile
+} def
+
+% Read kerning information from a .AFM file.
+
+/readkern { % <afmfile> readkern <pairkerndict>
+ /mfilename 1 index def
+ (r) file /mfile exch def
+ mfile =string readline pop
+ (StartFontMetrics ) anchorsearch {
+ pop pop
+ /kdict 256 dict def
+ { mfile =string readline pop
+ (EndFontMetrics) anchorsearch { pop pop exit } if
+ (KPX ) anchorsearch {
+ pop token pop cvlit /char1 exch def
+ token pop cvlit /char2 exch def
+ token pop /kern exch def pop
+ kdict char1 .knownget not {
+ 5 dict kdict char1 2 index .growput
+ } if
+ char2 kern .growput
+ } {
+ pop
+ } ifelse
+ } loop kdict
+ } {
+ pop
+ mfilename eprint ( does not begin with StartFontMetrics.\n) eprint
+ 0 dict
+ } ifelse
+ mfile closefile
+} def
+
+% The main printing procedure
+
+/doFirst true def
+/prevBFont null def
+/prevHFont null def
+
+/lpfirst { % - lpfirst -
+% Define some abbreviating procedures.
+ /B {save 3 1 roll translate /X 0 def} lpdef
+ /BL {save 3 1 roll 90 rotate translate /X 0 def} lpdef
+ /P {/setpagedevice where {pop % <key> <value> P
+ 5 dict begin 2 copy def
+ /Policies 2 dict dup 4 index 1 put def currentdict end setpagedevice
+ } {pop pop} ifelse} lpdef
+ /E {showpage restore} lpdef
+ /V {neg X exch moveto} lpdef
+ /M {/X 2 index def neg moveto} lpdef
+ /S {currentfile =string readline pop show} lpdef
+ /RE { % <isoname> <fontname> RE <font>
+ findfont
+ %% reencode for iso latin1; from the 2nd edition red book, sec 5.6.1
+ dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding ISOLatin1Encoding def currentdict end
+ definefont
+ } lpdef
+} def
+
+/lp { % file initial_chars ->
+ /lpline exch def
+ /lpfile exch def
+
+ doFirst { lpfirst /doFirst false def } if
+
+% Initialize the device and fonts.
+ /BFont
+ BodyFont null eq { defaultBodyFont } { BodyFont } ifelse def
+ BFont prevBFont ne {
+ /BFont BFont outfont
+ /prevBFont BFont def
+ } if
+ Headers Footers or {
+ /HFont
+ HeadingFont null eq { defaultHeadingFont } { HeadingFont } ifelse def
+ HFont prevHFont ne {
+ /HFont HFont outfont
+ /prevHFont HFont def
+ } if
+ } if
+ save
+
+% Get the layout parameters.
+ clippath
+ gsave % for possible rotation
+ Landscape { 90 rotate } if
+ BFont setfont ( ) stringwidth pop /cwx exch def
+ cwx Tab mul /tabwx exch def
+ BFont fontheight /fheight exch def /fascent exch def
+ Headers Footers or { HFont fontheight } { 0 0 } ifelse
+ /hheight exch def /hascent exch def
+ /hdescent hheight hascent sub def
+ fheight Spacing mul /lheight exch def
+ Headers { hheight lheight add } { 0 } ifelse
+ /topskip exch def
+ Footers { hheight lheight add } { 0 } ifelse
+ /botskip exch def
+ /pskip topskip botskip add def
+ % Translate the page so that (0,0) corresponds to
+ % the top of the topmost body line.
+ pathbbox
+ 2 index sub MarginBottom MarginTop add sub /plength exch def
+ 2 index sub MarginLeft MarginRight add sub /pwidth exch def
+ pwidth Columns div /cowidth exch def
+ exch MarginLeft add
+ exch MarginBottom add plength add topskip sub
+ /pagey exch def /pagex exch def
+ plength pskip sub lheight div cvi MaxLines .min
+ dup /colines exch def
+ Columns mul /llength exch def
+ grestore
+ OutFile null ne { nulldevice } if
+
+% Print layout
+ Noisy
+ { (Page height = ) eprint llength e==
+ (.\n) eprint flush
+ } if
+
+ colines 1 lt cowidth 1 lt or
+ {
+ (Page too small, it must be large to hold at least one line of text\n) eprint
+ (please specify a page size using for example -sPAPERSIZE=(a4|letter)\n) eprint
+ /gslp.ps cvx /limitcheck signalerror
+ } if
+
+
+% Set duplex if requested.
+ Duplex null ne {
+ /Duplex true /P 2 false lpexec
+ /Tumble Duplex /P 2 false lpexec
+ } if
+
+% Write the kerning table, if relevant.
+ OutFile null ne Kern length 0 ne and {
+ (/kproc) ws /kproc load wosp ( def\n) ws
+ (/pairkern) ws Kern wosp ( def\n) ws
+ } if
+
+% Disable stack recording so we can use stopped with readline.
+ $error /recordstacks false put
+
+% Initialize for the first page.
+ /lbuf 64000 string def
+ /pindex 1 def
+ beginpage
+
+% Iterate through the file.
+ lpline
+ { dup length /pos exch def
+ lbuf exch 0 exch putinterval
+ { lpfile lbuf pos lbuf length pos sub getinterval readline } stopped
+ { % Filled the line before a CR or EOF.
+ exch pop showline
+ }
+ { % Reached CR and/or EOF first.
+ exch length pos add lbuf exch 0 exch getinterval
+ 1 index { showline } if % omit final empty line
+ { dup length 0 eq Truncate or { pop () exit } if
+ showline
+ }
+ loop
+ exch not { exit } if
+ }
+ ifelse
+ pindex PageLast gt { exit } if
+ } loop
+ pop
+
+% Wrap up.
+%**************** WHY IS THIS COMMENTED OUT? ****************
+% EjectEOF { endpage } { endcolumn } ifelse
+ endpage
+ restore
+
+} def
+
+end
+
+% Usage: <file> lp
+% prints <file> using the current parameter settings.
+% Usage: [ <arg1> ... <argn> ] lpcommand
+% interprets args like a command line.
+
+/lp { save lpdict begin () lp end restore } def
+
+lpdict begin
+
+/splitfn % (FontNN.NN) -> <font>
+ { dup /arg exch def length
+ { dup 0 le { exit } if
+ dup 1 sub arg exch get dup 48 ge 1 index 59 le and exch 46 eq or not { exit } if
+ 1 sub
+ } loop
+ arg exch 0 exch getinterval dup cvn find-latin-font
+ exch arg exch anchorsearch pop pop cvr scalefont
+ } def
+
+% Parse the command line switches.
+
+/doswitch % argn ... arg1 (-?) restofswitch ->
+ { exch dup cvn lpdict exch known
+ { cvn load exec }
+ { exch pop (Unknown switch: ) eprint eprint (\n) eprint }
+ ifelse
+ } def
+
+/more % argn ... arg1 restofswitch ->
+ { dup length 0 ne
+ { (- ) dup 1 3 index 0 get put
+ exch dup length 1 sub 1 exch getinterval
+ doswitch
+ }
+ { pop
+ }
+ ifelse
+ } def
+
+/-- { (--) exch concatstrings
+ dup cvn lpdict exch known
+ { cvn load exec }
+ { (Unknown switch: ) eprint eprint (\n) eprint }
+ ifelse
+ } def
+/--add-to-space { cvr /AddToSpace exch def } def
+/--add-to-width { cvr /AddToWidth exch def } def
+/--columns { cvi 1 .max /Columns exch def } def
+/--detect { /DetectFileType true def } def
+/--duplex { /Duplex {Landscape} def } def
+/--duplex-long-edge { /Duplex false def } def
+/--duplex-short-edge { /Duplex true def } def
+/--first-page { cvi /PageFirst exch def } def
+/--footing-center { /FootingCenter exch def /Footers true def } def
+/--footing-left { /FootingLeft exch def /Footers true def } def
+/--footing-right { /FootingRight exch def /Footers true def} def
+/--heading-center { /HeadingCenter exch def /Headers true def } def
+/--heading-left { /HeadingLeft exch def /Headers true def } def
+/--heading-right { /HeadingRight exch def /Headers true def } def
+/--kern { readkern /Kern exch def } def
+/--last-page { cvi /PageLast exch def } def
+/--margin-bottom { cvr 72.0 mul /MarginBottom exch def } def
+/--margin-left { cvr 72.0 mul /MarginLeft exch def } def
+/--margin-right { cvr 72.0 mul /MarginRight exch def } def
+/--margin-top { cvr 72.0 mul /MarginTop exch def } def
+/--no-eject-file { /EjectEOF false def } def
+/--no-eject-formfeed { /EjectFF false def } def
+/--spacing { cvr /Spacing exch def } def
+
+/-# { pop } def % ignore
+/-+ { -- } def
+(-1)cvn { /Columns 1 def more } def
+(-2)cvn { /Columns 2 def more } def
+/-b { /HeadingLeft exch def /HeadingCenter () def /HeadingRight PageNumberString def
+ /Headers true def
+ /break true def
+ } def
+/-B { /HeadingLeft () def /HeadingCenter () def /HeadingRight () def
+ /Headers false def
+ /FootingLeft () def /FootingCenter () def /FootingRight () def
+ /Footers false def
+ /break true def
+ more
+ } def
+/-C { pop } def % ignore
+/-c { /Truncate true def more } def
+/-d { pop } def % ignore
+/-f { splitfn /BodyFont exch def } def
+/-F { splitfn /HeadingFont exch def } def
+/-G { more } def % ignore
+/-g { more } def % ignore
+/-h { more } def % ignore
+/-J { pop } def % ignore
+/-K { more } def % ignore
+/-k { more } def % ignore
+/-l { 66 -L -B } def
+/-L { cvi /MaxLines exch def } def
+/-m { more } def % ignore
+/-n { pop } def % ignore
+/-o { more } def % ignore
+/-p { (w) file /OutFile exch def OutFile (%!\n) writestring } def
+/-P { pop } def % ignore
+/-q { /Noisy false def more } def
+/-r { /Landscape true def more } def
+/-R { /Landscape false def more } def
+/-S { pop } def % ignore
+/-s { pop } def % ignore
+/-T { cvi /Tab exch def } def
+/-v { pop } def % ignore
+/-w { more } def % ignore
+
+/lp1 % filename ->
+ { break not { dup /HeadingLeft exch def } if
+ Noisy
+ { (Printing ) eprint dup eprint (\n) eprint
+ } if
+ (r) file
+ % If requested, check for a PostScript file.
+ DetectFileType
+ { dup 2 string readstring pop dup (%!) eq
+ { % Yes, it's a PostScript file.
+ pop dup 80 string readline pop pop cvx exec
+ }
+ { lp
+ }
+ ifelse
+ }
+ { () lp
+ }
+ ifelse
+ } bind def
+
+/lpcstring 8192 string def
+
+end
+
+/lpcommand % <[arg1 ... argn]> lpcommand <any_printed>
+ { % Push the commands on the stack in reverse order
+ mark exch
+ dup length 1 sub -1 0 { 1 index exch get exch } for pop
+ lpdict begin
+ /any false def
+ /break false def
+ { dup mark eq { pop exit } if
+ dup length 2 ge { dup 0 get (-) 0 get eq } { false } ifelse
+ { dup 0 2 getinterval
+ exch dup length 2 sub 2 exch getinterval
+ doswitch
+ }
+ { dup /matched false def
+ { /matched true def /any true def lp1 } lpcstring filenameforall
+ matched { pop } { lp1 } ifelse % let the error happen
+ }
+ ifelse
+ } loop
+ OutFile null ne
+ { OutFile (%stdout) (w) file ne { OutFile closefile } if
+ /OutFile null def
+ } if
+ any
+ end
+ } def
+
+[ .shellarguments
+ { ] dup length 0 ne { lpcommand } { false } ifelse not
+ { (%stderr) (w) file
+ [ (Usage: )
+ /PROGNAME where { pop PROGNAME } { (gslp) } ifelse
+ ( [-12BclqRr] [-b<header>] [-f<font>] [-F<hfont>]\n)
+ ( [-L<lines>] [-p<outfile>] [-T<tabwidth>]\n)
+ ( [--add-to-(space|width) <units>] [--columns <n>]\n)
+ ( [--detect] [--first-page <page#>] [--last-page <page#>]\n)
+ ( [--(heading|footing)-(left|right|center) <string>]\n)
+ ( [--kern <afmfile>] [--margin-(top|bottom|left|right) <inches>]\n)
+ ( [--no-eject-(file|formfeed)] [--spacing <n>] file1 ... filen\n)
+ ] { 2 copy writestring pop } forall dup flushfile closefile
+ }
+ if
+ }
+ { pop }
+ifelse
diff --git a/lib/gsnd b/lib/gsnd
new file mode 100755
index 00000000..6fa454b3
--- /dev/null
+++ b/lib/gsnd
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+exec "$GS_EXECUTABLE" -P- -dSAFER -dNODISPLAY "$@"
diff --git a/lib/gsnd.bat b/lib/gsnd.bat
new file mode 100755
index 00000000..7d07144d
--- /dev/null
+++ b/lib/gsnd.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GSC% -P- -dSAFER -DNODISPLAY %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/lib/gsndt.bat b/lib/gsndt.bat
new file mode 100755
index 00000000..91dc9514
--- /dev/null
+++ b/lib/gsndt.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GSC% -P- -dSAFER -DNODISPLAY %1 %2 %3 %4 %5 %6 %7 %8 %9 >t
diff --git a/lib/gsnup.ps b/lib/gsnup.ps
new file mode 100644
index 00000000..4ea81bdf
--- /dev/null
+++ b/lib/gsnup.ps
@@ -0,0 +1,92 @@
+%!
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Prefix this to very well-behaved PostScript files for n-up printing.
+
+/cdef { 1 index where { pop pop } { def } ifelse } def
+
+%%%%%%%%%%%%%%%% Begin parameters %%%%%%%%%%%%%%%%
+
+% All parameters are also settable from the command line with -d, e.g.,
+% -d.Nx=3
+
+/.Nx 2 cdef % # of pages across the physical page
+/.Ny 2 cdef % # of pages down the physical page
+/.Landscape false cdef % if true, rotate page by 90 degrees
+
+%%%%%%%%%%%%%%%% End parameters %%%%%%%%%%%%%%%%
+
+vmstatus pop pop 0 eq { save pop } if
+.Landscape {
+ currentpagedevice /PageSize get aload pop
+ exch 2 array astore
+ 1 dict dup /PageSize 4 -1 roll put
+ setpagedevice
+} if
+/.BP currentpagedevice /BeginPage get def
+/.EP currentpagedevice /EndPage get def
+/.Ps 1 string def % survive save/restore
+/.Pn { .Ps 0 get } def
+true setglobal % protect from restore
+/.ELevel [0] def
+/.Rmat matrix def
+false setglobal
+/.max { 2 copy lt { exch } if pop } cdef
+% Work around the common save ... showpage ... restore locution.
+/restore {
+ .Rmat currentmatrix pop restore
+ vmstatus pop pop .ELevel 0 get lt { .Rmat setmatrix } if
+} bind def
+<<
+ /BeginPage {
+ .Nx .Ny .max
+ gsave
+ initclip clippath pathbbox exch 4 -1 roll sub 3 1 roll exch sub
+ grestore
+ 2 copy exch .Nx div exch .Ny div
+ .Pn dup .Nx mod exch .Nx idiv .Ny 1 sub exch sub
+ % Stack: nmax pw ph pw/nx ph/ny ix iy
+ exch 3 index mul exch 2 index mul
+ translate
+ % Stack: nmax pw ph pw/nx ph/ny
+ 4 -1 roll 4 index div 4 -1 roll 4 index div
+ % Stack: nmax pw/nx ph/ny pw/nmax ph/nmax
+ exch 4 -1 roll exch sub 2 div
+ 3 1 roll sub 2 div
+ translate
+ % Stack: nmax
+ 1 exch div dup scale
+ .BP
+ }
+ /EndPage {
+ dup 2 lt {
+ .ELevel 0 vmstatus pop pop put
+ .Ps 0 .Pn 1 add .Nx .Ny mul mod put
+ .Pn 0 eq {
+ .EP
+ } {
+ pop pop false
+ } ifelse
+ } {
+ pop pop false
+ } ifelse
+ }
+>> setpagedevice
+/.EOJ {
+ { .Pn 0 eq { exit } if showpage } loop
+} def
+
+{ currentfile cvx exec .EOJ } exec
diff --git a/lib/gssetgs.bat b/lib/gssetgs.bat
new file mode 100644
index 00000000..e2805617
--- /dev/null
+++ b/lib/gssetgs.bat
@@ -0,0 +1,14 @@
+@echo off
+
+rem Set default values for GS (gs with graphics window) and GSC
+rem (console mode gs) if the user hasn't set them.
+
+if NOT %GS%/==/ goto :gsset
+if EXIST %~dp0..\bin\gswin32.exe set GS=%~dp0..\bin\gswin32
+if %GS/==/ set GS=gswin32
+:gsset
+
+if NOT %GSC%/==/ goto :gscset
+if EXIST %~dp0..\bin\gswin32c.exe set GSC=%~dp0..\bin\gswin32c
+if %GSC%/==/ set GSC=gswin32c
+:gscset
diff --git a/lib/gssetgs32.bat b/lib/gssetgs32.bat
new file mode 100644
index 00000000..e2805617
--- /dev/null
+++ b/lib/gssetgs32.bat
@@ -0,0 +1,14 @@
+@echo off
+
+rem Set default values for GS (gs with graphics window) and GSC
+rem (console mode gs) if the user hasn't set them.
+
+if NOT %GS%/==/ goto :gsset
+if EXIST %~dp0..\bin\gswin32.exe set GS=%~dp0..\bin\gswin32
+if %GS/==/ set GS=gswin32
+:gsset
+
+if NOT %GSC%/==/ goto :gscset
+if EXIST %~dp0..\bin\gswin32c.exe set GSC=%~dp0..\bin\gswin32c
+if %GSC%/==/ set GSC=gswin32c
+:gscset
diff --git a/lib/gssetgs64.bat b/lib/gssetgs64.bat
new file mode 100644
index 00000000..4bdd367a
--- /dev/null
+++ b/lib/gssetgs64.bat
@@ -0,0 +1,14 @@
+@echo off
+
+rem Set default values for GS (gs with graphics window) and GSC
+rem (console mode gs) if the user hasn't set them.
+
+if NOT %GS%/==/ goto :gsset
+if EXIST %~dp0..\bin\gswin64.exe set GS=%~dp0..\bin\gswin64
+if %GS/==/ set GS=gswin64
+:gsset
+
+if NOT %GSC%/==/ goto :gscset
+if EXIST %~dp0..\bin\gswin64c.exe set GSC=%~dp0..\bin\gswin64c
+if %GSC%/==/ set GSC=gswin64c
+:gscset
diff --git a/lib/gst.bat b/lib/gst.bat
new file mode 100755
index 00000000..2bf70618
--- /dev/null
+++ b/lib/gst.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GS% %1 %2 %3 %4 %5 %6 %7 %8 %9 >t
diff --git a/lib/gstt.bat b/lib/gstt.bat
new file mode 100755
index 00000000..ce087992
--- /dev/null
+++ b/lib/gstt.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GS% %1 %2 %3 %4 %5 %6 %7 %8 %9 >>t
diff --git a/lib/ht_ccsto.ps b/lib/ht_ccsto.ps
new file mode 100644
index 00000000..fda9b510
--- /dev/null
+++ b/lib/ht_ccsto.ps
@@ -0,0 +1,3552 @@
+%!
+% This file is a reformatting of data placed in the public domain by its
+% author, CalComp Technology, Inc.
+%
+% Aladdin Enterprises, Menlo Park, CA reformatted the original data as
+% PostScript halftone dictionaries, and hereby places this file in the
+% public domain as well.
+
+% This file defines a /StochasticDefault Type 5 Halftone.
+
+% Note that the Black array is used for Default, Black, and Gray
+% (not too surprisingly), as well as for Red, Green, and Blue.
+
+% The reason for using the single Black array for the
+% RGB additive primaries is to make stochastic dither to displays
+% look better since there is no misalignment between primaries to
+% a screen (as there often is printing to paper).
+
+% The CMY components are decorrelated (90 degree rotations of the
+% Black data) so that misalignment doesn't cause color shifts. This
+% is the same reason that conventional ordered screening uses
+% varying angles for C, M, Y, and K inks.
+
+/StochasticDefault <<
+ /HalftoneType 5
+
+ /Black <<
+ /HalftoneType 3
+ /Width 167
+ /Height 167
+ /Thresholds <
+00AE10FE266C139427851F4EFD0DB00060AD25D6164400C765227327CB0C5A30
+D90786049501CD2D0752018608389F2F159527851A9E07FB00AC12D226A13A15
+AD3E00DA0878006B384C0093085834790DBC770133A31E41940CA900510EC834
+B02746993E00BC0634D01B43F411C90AAB269616E012B140048600C84B077500
+5AFE126B1A40F53903710A8305319C21854011844701B96B00D112790E5A008F
+1150296B3F09E563277C4900AD50017109D4013B6C1A87123E6C0D79F626511A
+A90E86003EED01784629E737630E4778A53F22B65700C94909F5003E5E461258
+336C098600E15804F75C13A22FFA1FCA1BB5263FF412CD2F502269C2094DEA1F
+7A233AFE60017204852605D460136BA6118607307F2779005A336A017B005A9E
+15760D35D825B03404A527CF6C0865AC27DB225AC10F5200D6581FE9610D3088
+2749B538CD48246CC404F21F79310DDC0236CD1F3DF122A92B9A10CC5027F401
+BE50003285059201F8384A9A1A6A12C6005A19B026F6001DE2660D277F1F793C
+2276B901DB37B304F0401F79122E9A1A3476247C0D4704780D5EA500650A9E00
+F00F53278A005606D96C0541AB1AEF0EBA5A1933FC27045323B350009D1F4CD6
+06A33F25D21F3FEA2BAC5B01790D8F551D76013AB7411B7C00A93B006FEC276C
+07970027CB4505E6095A017808FC043A610E8901A4851B58A512860461400D69
+1D7D3F00A60D693A1ED05A13DD41305D12D20550BB27409B0D790085503A942F
+0173FA069B01AD5A062E851F6E1B772655C707B66C0046B005CF015AB9842DEC
+054F279750266F1F7C03D2123DBB64183DB612286C247B2F0078A1014679ED3A
+02DA3F12EE3914841FF24F0CA50579005022F827C33900EC2989155300E51140
+651996421B9112BD344A8318A45B1F7E27A41F60269E17BA5327CC2600BA4005
+6A2ED51A84C300E84A068427529E04862C03984B0BC400862675340086084FDA
+1FC23109D0045AC01A3C5512E54012D5520D9F00D10CA8003C6A4021D7601282
+27971A49016C24881DD53601E20CB837A72F4996012786004D79D7009E0750E5
+3D0F6CC1220065951FA060016CB5005D049234642749CC129B046209498512A7
+04DA269C2759CA04F72807C502624104FD0B71013DB400F11242BE4800813E01
+980A67385B20EB269C005A0627793616B923DB1840E51266BB3D207C276C1DAD
+04E25A1CFC223D68044A75217E12418D00B0316426830036EC2550307B1A9322
+FE01920B2AE9015210F127D113AA00700455AE1F8749056B00E51F5AF410C52C
+043F5A35CA12631FD02A0949B1410C770530AD0E2850C83C11C100E308316D1B
+51B72FE1066C305E0E730A83013D6C0D4DAF5032E115861FB026E0126C334C87
+01780DE24E1BE81350F78F0B7901761349F43C9E115A940B63037C0049910853
+00EA06AD10F42D940D40A90287009327F216AE29EA054DD20D8501A11DBC6A04
+61BD0546E501610E5233B2501D6CBD3B0068098634DF27A3153A7D002AF61BA0
+0D850838991F67E712A5014996058801419E6C0D27C91DF95A2274E70B248349
+286C1F78B201DB360079219426CD1FB335F825BB1F9E318501268600A82C6701
+552F9804D30C2CDC1E683B0585257930041FD927AE33C90A6D014CDA002DF734
+AE26CE341BFC259D126C34590178147D21643547D011A00583006025A5203F5F
+1ACC0B5A4115900F39981F5A32B439CE046400A439068A44BA4A2260106B08FE
+5A12D660113D5A4023BE51007F0A478C26FB1A33C22650F60427E26800853C04
+CB003769A501FD0AAF5412397E2386450DAF0259007F0562007905690CD51940
+F50E3D5A0DD438A106633F1A9E6C0553A112AA2BCC00B44250007F0E6B20A227
+C61F3FAA500176086C0FA15F01792750D404B95023C800DC0BB8075633633949
+C9127B018C07E8385033F200AD22FA5A00D70886047112791AF44813E33F126C
+04F8009F267E38059E330478B101CE760431DE26B431006F085D8600780D5B3A
+7A013EB54719931249B00626701B864000F35E049F11EF6B173BF43E22DD27A4
+2D47EB4900A361206CC82677007911F222BF590034C32241F901740F62159CC5
+471AEF009204640D81045B128620DF27850438B51FC7003F643C0C84325F2776
+267F13E001BA0B2B6C33FD27781498017E0E6C2979013483266C1FED27A42788
+3005955001CC1C902F7919C702B44B2064C03F22842C1261A00E6C055FD120AA
+3A14EA27B61FA71A8A225A07D9502F841F60DE31BA042799320EC91A5A0127C2
+650CA5500F941AC6125A227A3406B5005005EE53238949007727F750157D0032
+932452E0350512872F604023FC2AB032EB26CE2F9F00591AEE4809661386229F
+1BE4019E089904EB00A5276F265AE4009D0CAD00592DC31FB226DD1249A50DBF
+2E9F00490AD90053C63E207E265A06B50B40522F6B00F00D5000E20946FA013A
+7927F312397901C457096E048200C60AE7127F2700F405BE00500D774BDB0544
+852749B540951241860179420067098601AD11E549167F28A53E12BC0727A646
+0B7E03AF0DD85A0BBD0040934D3C01CF05B44F0886006C09780069124EC13F00
+A52EDF5008F8027F2E6B15F24936613E1B860E95044385236C1F40DD04603D00
+820540CD1850017B1256BB6722790E6100B30DE8339B275BEC01D21493278627
+791A68AD1F5AD50CA8009D4C178E0D359E21D630533862329D04B97720523386
+17A401391A67B707E4006C0833D6002FE61FB834FD5027D12789037039DD0961
+01953450E30437C81D60269538187827802704EAAB5A1B6E12833A1FD823A41B
+B527F936059D6A10790140AC295A12CD22A92C0EB517C75001F81FC0350DD503
+BF79117627EE501B9C63046CF73F24DB0847019D27E21F842E70006B04D80E36
+831F6309C301D9069E270086052E8F1C3F5A04EF2550DB00466019F10FA30147
+5F3E0C67D31241EE2361C47D102C7721901FFB4E26A7551249049226019A0D79
+1A50C00141731BD046008412669D004BDA470165C201F307BA631F00349927E3
+01BC5210405D3D04790A925D1533CE279A0D6B00C4400579005A860071057D44
+2F5F01914F27623D1A50A5076803C63D1FA22C0D61961B832AF8174E02A026FC
+14A81F8224934204AC297935711E603AEC4935C550006BCF22AE278512662EAB
+0577006C23C71AFE1FAD340198025087083E00F65001CD375E018604690678C6
+6C1052BC385A00F03E1F8213AD325A12FE20AF2F0E79246C09ED1B47861F7445
+0C8B56F40C791A3E630077C101E14A1FC82D04E557016D1DF3309F1A8F4B34D3
+1A3EFE26AF1FD713A64824EC00A80AF50042D421974A0AE70056BC0433C7006D
+0C63B93D1278095738C30B5300C64E12F700A21150BA0A26950D6513E933017F
+0B6700B904F7123ECF279C400884006D087D4622C22B13E173266213AD480CA1
+2747BF1CED2C0040E21A6806D9345E04A12BF90094047B2770015AF21AB9128F
+27790434B3112FD3270840AF004E9E20F62F0B7F19863A0077A43F1BAF0A884A
+125E3C0AEF0150920462460B59006B09CE0577422F6C228A2D0D793212AA2784
+341A874C148D27A636006CCF04438F01603AF430651F84265B27E600418D4F00
+B0237C075ABA1F52D836497C1D5097085A01DE502FB126D51FE95A0DA048003A
+A504862F007A17DD0E347C0B5BB127048C29A9129B23CA0C6B0E5123DF1AB10A
+CD3F0584395000AE0ED160005A950179A3136130D0046C079E5426A60DF16911
+52008726DA3E00B304D764267F2F12AF219D38E4328B40296812B304CC5401BE
+5B00F35F016C08DE4500F13D04D60759EC1D5033B51AD8119903A00CDE019D05
+7817862E04FC3D16DC279E3910952705910C33A6006B2CAE3B15941259400490
+003679046AC71F4ED41B56EC34B3009B502292360877CA40006D47016C1A8626
+78B23B07843143651FC52703DE6021844124E63916FE222EC304870E46B64A15
+34D2005A4021BB27FE0D3B661F7A27833500A01AE14207C9008504A50CF201B6
+5126820E359A1938851F43C4239E12AE640DA45A227E12308A0D97006A227E27
+5E266D2A5A38D130AC02CE5C1FA159046D00F64901E14226EA5322CC1FF90D79
+4700F306C26C125EB81CFA4110790B419805681A543A6203CF01F943185412F7
+1DC12EEB4000D5051F6ABB4E00E90D860055984006F933019407A64A05670071
+3D1FDD266800EB75123C950785024A1679AD04C107E60C50BA107800935A276B
+1B6C257A1F973E02F91F50E30648D910A004347E01773B267E1E40B100C44701
+E32450F93E00E10ABE00A608771161227D450D79013FBD12891A762F509B006C
+04860A5B01861CD26026781A38E2290C822F01B327E80033C30DAE04F013AC27
+811F699E0186326001800756A73146F5003E159227A5223BB00B2D791B50BC12
+771B8234D7481AF15B00A1127E270360B91DDA2760C46B0150295A401E96226C
+2F47BE3B12EF0DBA28D2003C5C19880CA500692F87016127E8521AFB4E05D008
+E403683B1F9D5B1582290852A5347912851FEE24AE00F60834BF27E71E614026
+AE0DCA083DB315BD2F45953D25A0033689019E5500A547039B5A1E7F12895027
+7E226D277E06490DA7002FE0490A963C15BB1061048E502677D20168094FF014
+4AD8009F0D6A3648CC019B11B2840433862249C93AAD41057B019C0E4725D61A
+EF01B76100CE04FA0C600278328101491178BD06D83159387916AD2150B50A6A
+00980C2F8F1F5A2C7911F6730A2FB001CB7813640546D1355001802D6C1F5696
+0068099E0CD154017C21881E61385A00F211C56A0C51B30EEA320B7F256AD117
+3BDE055E26FD0249DA009F2159E46327C65E0627B621D84B2E9D1FE1270AA004
+2A48C2377601427D1F6A26C704EE00296C265D4C0D52BC0BFC015A0E791FF824
+5933EB008D0B7E316C112686345A1F8827D31FB22357FB641E50276C00C412DF
+5304F0123E7727BC3848CA013F9F00B7502700CF411B723604B922ED1A5A04BC
+400FDC04B44812D828843270003EEF345E00FD04D612A4277A0034E6162E7422
+50BD1AF71240AD006A34C601469414398510CE0047047A0C3DAE790052059000
+6C3E0068CE3456E71279059B26D101A508862F53207BB509EA0027D716752740
+7728E000650947B513407020B14903A03FF8470A994000A508500097054709B0
+01EA129E276C01287E279200D3065A02851260EE0E6A3E049E61126CF00E9B48
+2C880095277A19955A2780143779066C01F823B41A6706BF50266F218505641A
+B456046CD700A804663D0088064F9D12851F96360DBC601C6E30921BBB23EB1F
+50126BEE4119FC0CC578204E0EB0005020FC12502F8B12F54100A963133E5A1A
+79017C4300AD08C5045738C13086009504C8510536CF27007819B401EC69153E
+E76112D72A7A22863560420D963FC80DAF1B5134791FE227AD215031C714DD1C
+3FBC013C5A00DD1266420DB501FE3E00C4055FEB26B820A412920486279A1235
+A30DC34131EE3E072AAF1F3F5A137B26CC5227DA203EF2045A09DA6C002DF50C
+B1086A3287009E05D03B0D7F355F305106AB01821A3FA06C0064AD045A38601E
+CF350CE004AE39C63E1DED3665254D911A7F016D21DE276C3412E5700962BD0D
+5D2B7A1A3AB7770D308626A200DE4905B900FB4C1A603C0564FE12A8400D6C00
+780893017926840D50861FAD274BA605E638692F540D711C9D450C86003F6447
+2F5A11C90057E301794A00840E5FCE78008409B63AEE0C771B960185086130BA
+285122A549017C2750FA0457376F2E5C019F1ECA01A41A8927F32460DB073ABA
+3F1DE222BD0178064977228549126AB55A02890EE33310B827EA14A00D841BA4
+5B002B961F5038DF1249CD0450005AC5016B177740138520742E08B300E76F2C
+0185005DC226F82AB81F5A35AE01FD3104D70B880332791F9913CD21AE27F235
+00CF1A57E408C600DB4926783A1A922E13E7269B014E1B46FB4B2701604300BA
+104D26C01479009F0EEB1A863E12D30040A512CE1CF216B328500D8624E8114F
+038736129322580D7A006C0E50E52AA201933100F9052E12A5226C009A460094
+0A40623C01FB083ED05012F101A4058C00328527F62042AB0DF03403A427CF10
+A86822854410C1471FD92F04950B810340E812476217A4492C6A12F96000C307
+5B047E0186084F7C26782F1290223C7502F10AB66005D25A046E1ADA27AE125F
+0279D80FA5315F37F86C0150E526426C035808C15026831F613C079200406C04
+E3642772003DC06918D15204EC01CB319F279134118726F318C45F269550CF06
+41C05019F5651F51CA00BD5A2791197804AA2F6A1F7926AD5F1A9D118F05387F
+2250C90E50017D3800D530048A265B9A087849395A15CF67009E09CA41007907
+C338501A924929F24334DA193DBF109A02AE600154A71B6A29821232841F3FBE
+34A1087D009427C43F226C1AE3019F0C2E87203C7305B438D12F5F01A20DE001
+B56C2550BD0F9D3F00D213AF79052B98003086276A268208F904B35A006C0B7E
+4412831B006A3495012C820527D604792E4E127800B02760410DD44F0BEB4507
+DD046634E25B0095066139F55E1AE148145ABD1BEC0C32B31AF000B2334D227C
+276C208F26EC541A7700B2390C7800860B6C48A5046133D7183AFA4006C20DA1
+0055FB00AE0C6900563F20EC50056B0A870496277E225AD105B200CC50127900
+9B1FF3316A22854212DD0479275A1B8C095A40225BF70F62C50D791BAC135A2F
+7C153CDB1FB32F00A508DC7816F21F52D30DB144803C11EE05AC21DB480BF600
+7934019C36127F2551BA005012D427B41F92002F99046B9E013E77007D400186
+276C0E7904F40CBE00E0055F3E019327E2085EDB26AF22C627007727F500499F
+05771F84307A27D3224279249427F714B9730D33A31FF32FC0125809C6004067
+1293401EFB27650F7A069D04C42F00922C6034F70CC5253BFA0EB60037851F40
+A600F10240D4004AC40568400351E93856309F3E0086096835592600A9602274
+298504388626A722C66C1B54C200B03E1E86267B1A6901790CD05026BC0B32F5
+0F4BB524DA5012BB21DA279B1E503284173BAE22D011A41F852D01820F760151
+E712541386243E670FCF00E9046009920437DD014A08922B0141D40162430071
+39FE49268E1EEE3256088601A422DA345A27771A5AFE4B0BC800497E0150A201
+681F994804E2085F334972A20C8E1A407A26CA79156404BC0F04C24F27E014AC
+01FD6C0D30B700E2125ABD016611941543FD04602F6C01F808C50CAE30FA233F
+6512921D41782286340775048343015A06840060A40241B969017E0A6338580E
+AB4A34F03047970641C96A08E301B850276C2050A64617C1651C5AB66C225DC6
+79123B8713A64C047901A407790EAD1FE02676127E00AB0BE600AE08391AA426
+961334AE166C27CC510BD72F509E12C227053A6124E90DAD003A09A2238F1F5C
+276C1298037D22781C3ED1501A6A34791F5030D83F068100349E0DD212992748
+623D00830E5AB805EE005ADA00AE05CE5712A31AE4349D3F17CE3512E5265312
+F6492FBD15FB4005D300610DC41E3A7E1A409421792F049F12BC300DF4355000
+860D4700DF0F492151B206E53D1ED715502BDF38610093045A31CB394D208D1C
+3F7942BB6C017905EA5522E5049E0032831F7C00266C017FDD12BA5001752753
+FD4C2DDF004FF9A201EA325439CD0A9C055B01900DA101F509930060E82EB652
+227E1F406F0E9F04E85027A501356E278135127B276A1846F8276700730CF265
+23AE570779009A270684006D04A32750911A9C0350DC00A90434C41659EE3685
+017C41019E12CB28F01F77308604FA006C265B01822769BB0D5A01CD2E513AB0
+005D05F061046CD226015212DE4836680086103E7845ED06A812C73EFE4D1D3F
+6B042B9A1FD3126201760D82380A1D406006BC00613146B41FF727CD2789256C
+1AAF2650036908DD014FF000BF412F6C14C91C47861A9F0DBC5009E601863600
+9723C426A52F048600399F1FD43450B71FD830891B7A123DBD432E71118427F8
+5300AC0B6D0049E11AB55A227906990153A50441AE31980ECF2BB5129F003486
+1F8816A611F50C981A940D27B9380E67EF1F7F2909BC1AA82750BF08266C2C58
+3670045A0AAF00963BF0085B009E27C426AF1ACF657BD81F8E238512E5004C83
+086800770640C4500E7C17CD1F9C263E88153A5A1BD80188065DE400CC043D61
+1F9330A51FC35B0D7B0552014EC61249FA0B89490D90003D62124ACB00ED0A5A
+01FD1AB7490969108828501FB12708633C12DE2F61267E340BE31B64175A3772
+0045620AE94205FB3A660480216D23DA3348820054AC05349400A561267B0DDB
+016339CD04B200F21F9F277B22E848127835BE4822841188007929043B00480E
+F72C6C267A1B3DBE32AE12DD65003CF001A236830D5BB30466A50382106A26A1
+3411702751FE00CD04630D6C0244EB1A3EE1791B603883206C3101ED1545E104
+B301366C27792486277900319E1FCC4603DB78108040CD049A00AB0EEA19BD47
+277900DD05AB0CF21AC72F5099275B00D53449C700405A01C415F82F19834A11
+C63E04F5015A1F952285125D1A920E4900D210943102CB500E6C07F5015037F1
+0B43BA1A73B35A01A504C206DB0B7104415A3A1FB42278305A1249FA0027E02C
+0CCE23B22BF60042BF25AE14772D4A8622F329981433AC690830B500D606AE04
+CB64235A9F1A772560980CA104C8079F0D5AE2013E602298330154FB0027752B
+801E6A0092027112A43F268E1F50318601792603BC0C931A84270B78A80E8627
+640877BF00E42B5B14874531C84206FC0047E44D266CC16022720553AD3E00A6
+27811F5CCB1968269850E9074926861F5736932F5321E9159C01870B5D04C509
+D6013895451279493363007B1F5795047A014408A3113EB1007A08D15A00279E
+41166D275A27781241AF022D860DF53E1CE3224E366520CD391277B30DEC0641
+BC1A316CAE0CF60649D639503AFE4B01C655036CCB1349B012E048186C25AD01
+E9632C1BEC3A05A44E1F573C0D9E01D8501B98127F33509C187701B604380AAB
+2FE21A64237F1ADB00B42F047901D43301229413D10D3FED106001A579006C23
+FE2748DF4B278022A66B1A61AD009D07EB500ED2093CF01F5ADB6A26ED055A40
+1CA0480F76DB015DF704AA0CEF00BA280C6CD6004057057C015BB400F05001A5
+6B34007C1F608E0A689D13503F2095255A10B5055E0C833012EA390079063692
+007738F04912793E04BD53016CD53F01E104AB6A207B3700B3096900D10B3DBE
+0D427E40EC501F84009B09FA049E39540D763EBC4A108563AD376C014DB0009E
+1AC80D4939BB4E0EA800770D8D006F3307E5043DF5216D18359227771A4C8E0C
+48008D19A722D76C042FB41F3E92112C861F7B35651A79FE3B1968AE1FCC27AD
+30128540117F2904F74827C5003BD82600E604C16001CA05791F9023D21AB16C
+095AB222F95E1D3FC1045A00C44F1F9D36138F2656129F25851D40FB07499126
+EF2FA4278A21662ED306276A01C612502D6C46325F14962AEF15591FA72A054C
+00DE308B2278266B4127F21262048617611FC028F612BB50247D0D4C8601AE5A
+04A500BF0532C61EB53360017E103BFC6301850A4CCB4805C44513A14F005408
+BE3F0F7100660844CF0532AC1FD54A0D95125086154CA648276C3D1B8C32A729
+E70068347A00279D3510842800D0640D811A9B4005DD0E61FD0AB2007431500A
+C9005F27CB1278016C0D6005EB0092125AB11B912767B804D60CBD01E10A6900
+A008E30041FA2785175708FD043BE20086049F1CD33044E33C0194053F5B019E
+27C21C3BCB4012E62F6B22986001804B04E4502695005020BE26EB270183345B
+00DF0638D126994B01E929A51FFA6C185FDD006A08842F58DA042EF204377809
+B300EE0A7C006C1251C01440F15001D84804BB78122D9F26D83012942586002F
+791F3EF50DBC65277E179704611FB127DB1A8634521EF431006F07F8003F5A1E
+8523794934AE26497B2660980CC00641B9651AA95F12B1502B6A365A008F06A5
+52206CAF1AD70F6200910A5A0085269E0FE03E20F92B1182350DBC27C815790B
+500069B112E71F80265A9C0E840434AA227E0B853D01B8471F7A279E1AC1003E
+A1661F9212D7532482275A1FDD269E36089604620EAA1A9333520841E9054901
+6AF7005A38C15001CF5B047D4101F008B94134E750088400AE4601A576047B41
+D950227B14973A01AF28008A05D83101B70D356B542F9A0027852D05913D09CD
+01E80CB41A3A6B13D43100842C41E15022F327B61A6C044162007A085ACF1AAD
+6601740640DE34AB791A405600A410BB31026C21F173125000DA4B0D93340196
+0CFC02532788125505BE00693C01970D44B84F074101F5492BD91F8B267800F6
+22AC6C1658BC791F5033D3086812994422AD2D12954B355A00820D2DC049376C
+20DF133C26B911380CA527CF04EE61125AF81F521291501D78D9021FEE1250D1
+0D50D84B1584227413822853F900790A48EE500886032F9E01790549FC39B40D
+C914AC380086243FF01FB1570071052EF90D982F613E0179E114A72F013DC06A
+2F14C42661E72E50216AD00B39EB237E2640AB18F82ED301791473BB5D0D8300
+6C4404E13A4E0E82022FAE003B09A5048C158426EA3406840050D83D16AF1FD6
+26A55B0123F6049B0A4BC960016CB66001850E792640CA390D6CC23A04F43D00
+279F7D013E860346960027EB00AC2FBE4101982440BE279E1237C322AE6C1267
+31D0115801702749852575450BDB044B890E2F9E23C649046C26D308F36A1F50
+3F005FCE8106269D5A0079094F04A8720041A25000AD10E55A0C78227F1A6426
+FA004A1B9E22C812B42F5F06BE681FDC5A1F71F15E27CB1F5103A6005AB71BE4
+0F6901850573096A0039CD790F3F5A3085002EFD234818E932571FB2006F05A0
+40009563146FC85A123449C71939F612407E21794905610DDB4F0F8605650149
+79006A0C3AEB25A51E86279D1BD83504EB01BC551FA0310069F20861128037BC
+0178225012B205C57D1A491259EB0438F41DB022CE3A17E3270679334977013E
+CC00B3044BC7460E9227D1035033690085129B3100963701C70B390D98013FE5
+6A277D0E3876278E24C027E92FAA14FE77122769BB00E511A941088200944D08
+C53E0B8817DB501EE82240BA084504E40A9104A86C2460B501C50834F81E7B26
+04CC502BE734B31EFC27C956007F085A00C20C4C00A5551A960E39791261D538
+158B28E3009B12503A9F00882B580C26F700A334186BA50F852A770056861161
+BD1AFA082BB61F6C314892105B01B52F791261B017FD3F24EB1F50D311477B26
+54B56C2350AD3912BB1AF45001C805520B79006B2383330458A302297E26721F
+65B413CC3E1B79006BFA2D673D04840977015830A22767B0225F3C00D0053E5A
+19A46C003EB747773E1297006B0D83047B0634AD1F4EE73C2162F277122F7E27
+60FD00C227057E4501AD1F6D2763E90727CE3904E87548336424D778003F5503
+E0129D3004B2380186266294058612F00D38E12799216C04ED38007E0758A401
+79045C29EF07A1044800DE0C600093043E630CA3185FF94132B41ADB014AD41E
+40EE500B9C05DA0250345D04DF26B2194702B422C6279B2DAC10FC0086180047
+F30E831B9F0DF13350129C640127ED00B51956D9274AB913438B04D32D019E77
+04470A5DDE05B7012F951747A41ACB5A0C8E05CA0040A86C184EA53D1ABA0798
+01410DBA26D249216C0AF65A1F7E490EC7003DDE2750019E5A007A09E615A623
+884120C12C0D8C34B90C77198928F9139427851DFE2F4AD1207A27843A009A11
+49900D3E98108B006612D3355A248C1AF2109F2F860D3AA05A1081005A12D624
+6B1F7938D231851F9827682F6D1F8C00DF2A0BCA5B1B6C277C31088D002460DF
+1A650EA76A1A3EC51FB22640641248840958EA006C223DFB345721861D5301FC
+0B60018B116C27C4802E65067900BE27A73607CA00EC2F50A51A5E04A6662E14
+B41F503482006609DA5A016BD642196338CA500175216B2FC1013D6C098600AD
+06DF02BD2651CE032764BC055D21BE26A34A00AF3F00A5277D006C055AD10029
+E21C41F33D01940AC44C125CDF095000E005B801CD0C6B2546AF3C10AD08FB01
+A64938F17430019A26773606FA005085067F01C836ED21B2263D8610AA036011
+B33E0AD60F7E237928DB264FE3045110FD1AAC31600D82004497236B12890940
+760DC1401BD46C0463C60148D126A1123993105000F808A20024D90FA9007C0E
+50CE13A4227830521F742E7A133E72EF00502FF43D047D082B8614E86B0C471D
+BF27F7213F9D6C0461980DA453277F3404A901223FBF5A137722792751A70486
+5000782E8321600FC702530BC44111F300BC57248D1034E322A10D70006C047C
+014FDB27921E8400F050279430C500AC0C9400389E1F78005A4313ED3F1FD56D
+0F4DB64721CF00F6345600810840FC3B25861236790154F21EB2279C216E2744
+86325A37E31E9C25644100EC450DC35F10A700E407471986209E136CD03348FB
+04603A2078D750127F018911531FAD3401733007E70043F12771A06A023CAD34
+EB0E9A163FFA3A1AE526D004408E3B1F93269D1F834C278740147927D244006A
+287B1F9C33D31FBF2F077701E24B306604AF004812861F5D32C06B0A50B236DA
+049501875C052CE4015A02972D681F9012E826AD1A5600AE07F3501FC6320479
+006C0653BC04EA4E009208604006ED04B2335A05973F01F227822269B93B0ACB
+058400550DAA2253B806C9016105A4386032C300EF0B49D220C26912609E0D82
+16062DF9106C00564000D9096501990D7E1F5ABE00E64E08D6006405B1015F09
+E201A90C5CB516F601C3450C5B3F0F924913B240089E12792060E56C053FF404
+5113F12F03720F7E27B73412A241197E26F313840DAA046B2F77018C277C223F
+8400AB0E894623CA2FE0123E673B1AB926CD12B65727771F8612CB50268B1A50
+04A331009653277825B01F770185123E922C4F17EB480EDA0746924D27841277
+0040B73B1D6C00D994501F8627CA1DB461268720C22F5B00A312376912802E5C
+34E74112D5389D2F501A86043791083C591AA500F16800F7375A1F7A26DD28C2
+0D3C26CC502285277D0163D01E9F24691754F9006CC306A3395F04DD2550C306
+49D712BB13DD5A186D276008E5601281268F00990C87055A026C3C009E0BDA01
+6A3B00E20A3EC9630EDC4A12FC0139E8113FE3501ADD006C0AA37A27018E22AA
+133804B501FE26961A5704CD26B0366000A504660B7C0236AE043E7813DC344D
+F2059E3E01AE0E85199233561B6D00C66826F054246CAF12E527792D1B982385
+04D100A50589014693007808AA00D41BB526405A08EE00C80B478F1F3B672200
+B551279E0139851F3E5C0268052DBD03E01AA03704B301481AC527E2203FFB2F
+A717F31A642D40A918792155AD0039801D922D409C50008866042F9E27AD1FF4
+340068C12F560069E3781F68305A05E0278A1278411A0DC82647D74926F46C12
+50EA006C0C8D03406D19D5501BFC046B0BA600F40EAC3D12983100D80D406204
+860850BC05660DAD275A346C1F5AEF15B42C561269394B058600AD37487A2284
+3304B20CE046783E15791C63EB0DB000F337A545780C95306B0083402175F760
+0E7903507F107201854935B500780DFB2793056C2EF7065E01AE08611AC6310C
+B36B017906632649D61A5009FA751B490C50C80DAE40106D00F64F01E5793280
+125A01880631D11F5F27BC5427CA1FB43904862748A022C8278520405A05E702
+4E7920A301CD3149CF125E34D74019760CFE11BD2E063B611AFA36B014E6611A
+E1118B022FB001D85A14850027CC0EFE00C80A317927861F6D2700F7501F7B12
+F926D1530A4B00B74935CE00AE22D839047B124CC44801A312D626871F4EC746
+23DA27A4055AD9183BF91255C40E9804AC27793E04BA26A20037830163CA22A2
+4614962308B201FE27A81F5AA10D9305854101960A5E00974A0DB0003D7A016C
+0761CE2695223BD014872D791F9600379D037D0056E901A02586004779D1009E
+047901830B339627771FD75C1A6D2640EA315094036134862745BA005A06CC0E
+B65C123FC900A541057813A527943012851F6C27630B54C022EA075A1C773262
+00480CB3036B0C8C007A12762640850D4A9126006E31415F00D01488287D1ADD
+571EEC3D0B7B3205AE29526420791A920DE23B005023CE2F15FD223BDF3F17F4
+3056DA1D4FEA15B63E0D770063A5084700FB054C12ED5A1AF922A01B33802760
+1369E10A406D2F591FC62650BB045A06A6470EFD099600780DBB193C9D065A01
+9A5023E14D277D0435910165295617C0326902D7085EEF01A90AE6129E31008C
+2A9F26DF04BC1F82E9601A9733ED2A5C36F501AD0053A7043AE343B205EC119E
+2F5A01EF076C2F039E4B0087195ED44001F100C72E6700466C1679F03D006CA9
+064B79128663017B26089600288E4901FE19C0421D6CBA5A2660BE6B2706902F
+500EB94309CB02B53D1E9222BA0DE740079A007627F74025009E2A521FBF2266
+0549F11FB812D73F0492380D971956D926AE0FE8049B4700F33E208616397626
+5A347704F5431569017F1286276C094101D24A007310C01A448622EE1F3FCC1A
+600D2A871F6E400DA53D239512C6791627AF32E100550E863A9B410EDB39B604
+C43F0465A1125335B600C4062EA21FCF4934BF690532A4277F3309ED014A0E92
+0A450079B84800C86C0162961F79490EA5015A036413884D2FEE1250017DC278
+3901A86C043ED5307F00774A35691EFA1266B101EE40007F1A3D6C345B1B850D
+51B40048A306C700B525871F5DB20DD3345700F614AD227A3B21B81F49049507
+6B3B0B8D004F9D01C86C004CC201DF1868BB005D40085AF7126A26A41FBA5013
+5306864C1974275A12B41B45E4017F1A6A2559E60E5200880A5610E05A127002
+A05A278225DA29AF1CDC263E0D831540E13B05F03100D94F35F52CA13C01CC12
+6037AE6B11340A68D33E12ED58019110C52C0896007927840050326B1CA00A5E
+CE07B300DF279E226433E01E692F81124700CC063C6E441AB438498C0151C60D
+74057CE15A26D816BB5027D5142E783519F62363344992014F34E722A6370093
+0477087E2F04DE1BC13004A00CF9008D267D0C319E27EF0D843D016CBC3B23F0
+1B783E00B822D93900C60B9F03720686500470E623AD045A257F1B5C9D24078D
+12791ADA49279300800427CD4EE81450078E4622A4276B1B5BEA27C913B31ADA
+26BF04762FFC401F772780135001CE0978019E0DFA045BE36C27921FEF00930B
+790529E4300457FA3450012F9F003F6201790665E9128645089A0C860627FC1F
+86057201D54A20BF2CFB124D9640790161EB402D694834D600BD50116E004ED6
+1AB241146CA40446C620942D60057949186A305020F63411CC38016A299419D5
+00B70B386CB5276705AD00830950C41FEA5A083B009D26B930008509F700AD39
+01790B502F60057F114DCC0E5300AF04F00C3DAA6C1F44BA4927792695204E09
+BB035A0F6A26DE1FBE5B126CB127129422AB670E70B012FD27B33804A500BF5A
+27D01BB86B12520EBF2D9E13853D0B86013ECB002712A32251008509AB055A38
+5F04DA218D3402792D07F60150318501670DF818920DAE36F100BD7901427D1F
+55B212F70B84326C2750FA044100E63F216626FB330F8743157AAC601D780363
+D9125A386F0E48922557E3009E3E1FA73902941484256A2B5AC3042FFE0F5705
+E800500BAD1485223EA42FC33D018234009D4400844100DB0B38EB203A500986
+0F56942277330482013E500079CB38600C446C04E4652258A5195FEF8B09D21A
+B324E21A9D21F41D9628AA07C75C0FA163228012D51A3DAA4E036C26E11F8712
+643D0D60A9009D0A307C225001A20D8A007726CD521B6CC60C9D01A540022DC1
+013805C72DF41F5234B11ABF29DC05B701357412F45A00E46022BD36D3118600
+428747008D247D1660C7412DD40149F2007F08599E1169CF270CF01AC2661B85
+55009204D0781FCB0040F50A49DB1F61F822A82B049000F31BB8275000C43805
+792144366C279304502F79016B0D730162127A4423ED3600C527AB005AE70629
+CC319D006004459E1FE2321AEC275DDD0063D03F1FED27C3123D7B0EA104387D
+276B1F6FDD651B6CFA4A16860D77019904500C7E1D6D1264A409854226860C31
+79015A06A620E62708D66913C52C983A0486006435AE12601FD12540FE3C0450
+A732580227A2042DB41D6A4001622C7F1D5A27950EA13604780947E21F6C305A
+00970F7E1A69F211B503E600770E61C40149CA27B032CF27FA38009705864712
+77268C3412865C00781250B829D1056C01498407760140A33B14AB4B04600A4A
+AA01642DD74F00E90BBA054D00B4270C853F00B528D01F3EF067049D33FD4020
+C53101D11A43B81EF22771346105A3541B389A016C08D9274CEC1A7D0552983F
+04A500630D8D1A710ED7794935F46C073EE026AA23E311B405C800792654AE15
+D666113EAD0DD73549ED269F013286265A47A826F534127F390A88007B088504
+50BB135A1BCE5003FD0569BD401FA726F1340E82163EAE2CC812B122C4105705
+790075369A2FDB1F50F3115A23951F603097228512469E01D451269306498300
+3ACA46005A087A0050AB0D9E6800800A9400DB177E3412BD5A0DF027A11FAE12
+409F0DD93B01F76C14791FB42CEB01462608BD005012CA5A15770D84003E6C2F
+653F1AE80030834100BA5B01751A8303405C0CCF4B00C70D3108940043A31FFC
+5522E71A4E22A51F6931DD3E0C9D3B1A990E5001E0096B04864A00FD62097D00
+5A38851A7727FC29C212E20669009D08328200C20750D21249F3085BE01F3A65
+1A7F123FE222AF12581AA526BB27E61F62385015DD35561FAE279E01F678002F
+851A4F036A0092055A30771BA90D274DE2470077225DB77F401390219A3200B1
+04F9334EA208F001AE5A0D6FC90527983416F826A50ACA14B239531F7A2782DD
+671258D006870035770E5AC14001E50A8601714900B95227EB26792140B93C1A
+C8375122D42650F80449E000A60D7F1A864927BE3F226CB81691277735048600
+36912F0079B305EF00BE60016C087926E81187046A0D9A05F803864812C44004
+790D50402267DD0160B937E25026FD22BC00683348B9125A26CF129B054C00FC
+6127D101468622405A1AC3125D1F811239B5401F53EC024A93057C2F61246C00
+9204E009AD011E40BD3C2173275FBB04AC2E006C9E265B27A910F32F61048500
+930CA36200599901730C99018E0D2A9E12348C1F4A01AF340085175AEC013E58
+04FE1AA94728C15817AB400D552B6C344F0D8827D92D9D01612F41D750237727
+AE30017C0863F9265ECD02B50E3D972606870B2F7E01700F50E0067B00850893
+036034DF12783C04860D5BEE1268C6009E013B932847DD0469018D0B6D23D327
+5010E300B634FD1263266E375FB2006B0C9F01DE1141831465F03D0D7900D21F
+8324791ADB205B34CD3E1BF62F12DF27BF1E5E35B16C0065B5045AD86A2456F6
+0EA504317D1FD3420D8600E20C7804D3016BE9199612A125F91AA100811F50C8
+0BA70132C700860759E822A23301951A3A6E1991044AF4411D54B312CA27A536
+169627EC2FC21F3DAE1A5A30C616AD2E751F3C99072A7C2663D706B90050921D
+F427C0123C7900B45A27861A7920842FA10FF8042B8727EC1C5136980229D505
+4F18C73492157505C500A4093FC0065601780A7E46077C0050E5054024E93F25
+840F4605CB0A396C2146C70FA400973860264BA01E5026891F503D00DD075A02
+68384F0DF50436791F5B9D124A21CF193A6C00D24510B205EC5227CB33006ED3
+00633E0984005CBE01730C790150F509770092266600E609BE004FD9490DE81A
+467718840E3EAC07610049A60D693E01C40A5006AE02D7005A1777D706490078
+BC1547F2512086247A006008FA2F543A63314A7C1C9027DC2A9F22AE5A22922F
+1378C508580DC819EF2C7C1F73B305DC60006C26791FD909B32F0169F63C08C5
+01B8772340C731B105D561226CB300F73E056BEE700C60A91285248E4B2A653F
+007A126BAF10319520F54A1BE5203F6522AC1D3AA2218527D54A04A2511F9626
+823304A03C04850032FE27CF22592F8638DB1B50FB137A1F40ED6C276A237C34
+9D22106CC45C2E0590006C08B301C22FE025A44901B40DE802B70DEF006A0F86
+00D50434F105BA69024686279A013E7700B5500027943415B22EF8115A018519
+6CCB4012935B227F300A6AA60084217A132F980F3F268517BE42012797012DFE
+055009E300C20DA51E9C042750C0087901873C049E09F15200D867044901A90B
+37EE0D347901680EF76C1761B327CB5A057A019F00EE0CA50688032F9505A162
+2600CB0DAA08E60161AE254612FB4026CB1F9C355A1288046C0E3987266D1F86
+22782746B84926771BA364123F521FF23200D3215ABB0C673C12F25E01794308
+830449BE4427EB0D3906BC0034DB0F4AFE1E3E5F12EF0149C3004ADF5A0C732F
+0EA14936C34F1D6CCC3B1A83226B30D93848E900664113B026C5552782123092
+411579C95A19429B1F50C117D62BAA2700C33F12781D40B11354366B1F792777
+22C65A24D93201BB49395D31541D862F009504850AA5550E3E670DF6501FB027
+EB6006D000AE355001C7095A01FC0C5A4000759E00840C5FA51284045034DF04
+A24724BF0DE75B27952267127F005AAF6F2762A3044187009E04D3285738851A
+3EA00530B500E2621BD8005C0D88300075A40450F9015A0D86159E1BDE345A00
+750DDA0046C42606FD3C0D28E96C0580005F4008900244864E09F1019D0D6133
+E909B95012E000603F0084094F78119704F500C3400BF0791FE14C31640179E5
+00A42700840C7900229A125D4112F8611A8314984F37C01FE92F1AD027B21638
+6C28FD1C92207B2F03881A9D3B00CF0BAB00E01F9E264801E312522FAE15502C
+6C0D8604A908EC6B12638A1A79390486259127E702B75A1F40BC3D1B7B22B305
+5F2F6E048611FA306C2850A50458865000B56A002FCE27B212FA6C2351E8391F
+9524682FE100861A7A41049B4934B512E91FAD26E43F1F77278312A450270860
+3C00B822D31F50327841BD33D93847C44C33DE049E0838B326E332058101790A
+AC48086A014AE3009F0D6600AC1252CF0C416426901F5A366B335004FA0E7A1A
+9800EF0961E11BB8401FDE26792A00CD3501FB2250BD0C4F12AC19674011F108
+5F00A30AD14928F501BC52259D490AB403791140D212279735129F4903620C87
+3C01BB0B6105D30153BD04436C24C5002FD42701860B6A367F016C0D56D10CB8
+053D6901CC41A8198F116C049F08C726026C075A03A52700861B6C294A8B0466
+0049B025DA276C128B39FA3F8D1F712749D74726EE005E35FB01BC063FF102C5
+09B56C1B4CBC46276E268337017F065A9F00500CB54F22AE5A1094006034F16C
+013C9F0584277926DC27923400850E6C3E07CF0037851F3EF42494013FE40450
+DC267920F136571D9426781AA42781361A8612A55112945F0769F81D51CC0449
+F519B200346E2059E1167F1A7104D82749F3472781144EFB1FB22A79186DF30D
+42BF00E6113DCF297C1A64109301E04F006D2604C30AB60158057532861F8019
+79124F8212792085263B97006005CE0CAC02CD4912F23B136CCA335E0394063A
+7827D3189E0426CB5A23DD14BC019F0C78045AAE1A3AA01F881250E405C66000
+552CB567228A0B5E01BB4007A600DA0640E33E006D0EF94A07D23B02FC3F21B4
+1338A900299A152F7C24609E0192370049BC37FE510D7E01600CB6013B950D3E
+6012E9500C582F96137C2051A3069A0BF400B62F603D1BBF12A550307A158722
+C60EA909C900AF2C47D500B32F5701E80B4FD42077327B1F6922A7306401BC3F
+018D11F51D57E201A5096B294989410779007D365630611AFD1240DF5300ED4B
+2F77217D2D1278DB064F0D771AC731700E9D69277621A154126AC422AB008F2F
+6020974F01780C8C5A2481450FD95504D43A12FA26B478105A011A329F21C91F
+92285BDB0068D204880035B401D2056630AA016C275B35436C3F07C804793465
+06D70141F230691A802777243F6B12931D3A7404D03E1CA42A063DEC004AF80A
+86007423924D1CE4266C277B3412822750ED0DB7002EF71BAF490BEC04C45024
+8E016A0DAD4202C00B9D0147B20C38871FF300A84915FA3E2302D612862F00B1
+04317C136227B800E50B33C327DF4604F008BF740034861FAE520A6C042FEC26
+9A5EC200502F6C00EA0945871D3AA71A409920812453EE0B41D012FA00C01EA3
+14855029F0169E274A94115A00DC5001EA0450D908E40150F418600D9A64006D
+B75A1986123F5A34DD15C5052E980E8404A400D04808BC0036821C51980B673D
+21951F6C3E007A2FC726891A359426621CD96A225AA2006A2783390880005AC3
+49345C05EC6C235AF50A51DB04406C124990057E002FA31B5E3C1F66A6077900
+31851FCF5A0079083D126AE706B156277C1230AF014977DA076712B93700941A
+5A3147730D5704EC400E97005D0AE70034C5279E123799218F1464275A319605
+42A8295022FC124C019E26C300B504439D0D48FB006338D814771A863E1F76C5
+0541DA224FC202D90050B116D40D9E085D04D36609F001A74000FE0432CE11BC
+0554D526A42F098500AE39500DCA3500972647851BA431CD1A6614BB7701409C
+01E10B40E91248EF01A1451BB223D403AD4114843E129C04CE520CF42701532D
+FE4F048C4623BC008F049E27D5346001CD224DBB421F866305790845B30D602F
+AE04C000B40D3B7F00E204AF0A952FDA126C29792790225A37781953C007435E
+2AB201FD5015593086017A063285267738048627701F3FF93350127E2779340F
+92184575267B1C9833017812E2661EF52492017A1B864319B90C36F4017E0451
+ED3750115AD12379279322602E9717683D0E9005416C943000BB4D01F7223F6C
+2384166BC50E9F0034791DD860126D27E419680086239D2786116C03B14721F9
+1BC36B0050FD00426C35762750D322861F794738691D488104E60C6108F000D1
+03863312A622EC045527680DA300E60EAC17FA540DBD12F25A0FE501B9500080
+26AB00C60550D4275DB908EF015927EA601F900038970E5115DC27AB03D25B04
+6C9E124A22B32C00871FF93406AE0D5800B305C90150BE04E54F33DC1E0CF179
+1C2A910B52A500E105AE4026791F5BC70FA6013EF705A7093BB53E12DE084800
+FC1A79390D9A015A3F26D81F3D790ED00BF71A9F005410BE3005D600AD0539A5
+2040CD50127B26A91FE148016A119839C203CE267B1F6027467800A12F820125
+A645346818A310E71C5C3146860779013485133FAC004710C22750CF0441C66B
+076310793E1FE52E0067DA6E0A60A10D740295651D3AFD41146C258D371A8627
+0985005527500766D51A3DC81239622F5A009604D540016C2A84144A7E1F5985
+0D79501C75BE612652D000DF4F31900477079302BE275A46016A123AEE70014E
+96278516F56400549C01339427610679009E2FD2345A006E304A91043FB304C9
+263F631A49B83D76009805D0287801409F0DF716AF20E85022C7630D6DB63C01
+840C5B3283002EB422FD4900970F50C23D0627C71639D426B92700C772047F34
+DB4A07F95F006CAE2062C48A21B53502709E004B9C1BBA12EE193D65269D1FE8
+27AE0134CB0045F601C43A044A0BAE043C653F15B422E51EB8336012861BA433
+BA4879064126EA1260246D350DC92F116CB31BE712BF39590E6D05A50DF4219D
+073CF069133B6C10D104E505790929C9204912862250C104822575003D690098
+0430DD28046BF81FB326EF1C9E40017F370BBD2786015A148F44018548005F08
+4A88451251BC01601F9C122BCD3910F437040E6C0049E30D4627FB0475017E33
+50A10DF0065300770CDB5E2695132F942166EE1F7A2C781297097E01660C7C49
+16EC4000DC07842601CA2DB2630BA500DC07B55A1F74FE3E04670080491AF826
+B85025811A6012D92253007FE00199482B6C2741F253136CF76000DA08643D12
+A52953C80DB51A488416599B133F5A057E00750AE2501EA360146C30EF22AE00
+F7571FE52FAD39EF0B2CE0223F770FB900487915509A0048A750FD27861339BC
+61128625DF4708CD007B133ABC622186410E7904AE5A057F00439101E222C326
+F328CE27AC38008805A054236C12E8590D7700368D1F79339440008604500DD5
+25AD350299086A3D00E60440BB50018411A5471D395A09A700C40C6001B30437
+1AAD2F9D1ADE5801E5117B275A36FB00A00836CC00A54212BE462B7905C90032
+E601A20877276C340CA4047B116C1B5AAD009A0DEE395632E103A5086726D31A
+33047809A168002DAD0A3E5E1C8C22AD2F50964004CB3100A219E8371AD827B0
+1235A90D82047600590785015AD1266C1F3DC4049B3F19AB22FA4904C646035A
+10E126C11A8E2E6E1550CC284192127927966B002DAF26C7340B72B912EE2088
+349B1F862640924D0C7B23750036971F4E00D805911F7925E64F208A22E93460
+1AAA12542496461A79258712C819B160226C26D6009E06357B1F640083058625
+7F1FEB3077019B65B61BCB223EEA6E1F59D100B404664109D70027801B52F238
+60264CA50F5308E35A1850399F1340B83A1FF82C0DA809F10079325D00812769
+137D275A1BF027A0184E356B00A806F40C6800DD05C81EB5133BF3790A490378
+FA003F6C014564124FD40A6AE500C53B01FC13AE61096BB2412F6C12AE013B6C
+04790A65019206DB0039F96C0C5AB304CD375000830540D001932B7D23CE5004
+D82FA927C70DB4005B4005BF5312003F5A018F045207BE013A6B432CF61F911A
+6AFB0E9E086901B7067000409E772D0171F80027D4690D794F12944E34882963
+15F726C10ADA01B408D201830B770168B301ED401F7F279A1F854A27673F0086
+08501660E36A1A2E8E1FA330BC07FE002F951A3D5B0F87522784062EF2270B8B
+04EE4A2752C412B229DA30B01F4826699E3E03D6133C684106E05D26FC1E793D
+0FF2043E5B1F86266C127919652D45D5229E1235E68726DF3046D01F93287812
+E70C86005805B733034B26CF1F771245CD2FFE250561BD203EA55B1A3CEC01A2
+3E00E204410EB54001831C5434921F513A9E31B921D9311283225FBE015904C1
+3C0EA301EB5327D526A301470CB95A0DD70451267C22844101DA06A62547CE04
+40BD510272CA1B3B6600D60A604000830D710458C17712501F84267700F32090
+17359A005708BE501B6AB400FB09B302EA0150F7049E0A6C004A7D1F0C6C0580
+106C3B0DF1269E22AF4F27C772264779B05F0050DE34A20A790250D03F0E7E02
+5008940449881ACB60256BC870045A9E0C40A7125B38E00F660045600D924A05
+C8094D38DF316001F9502E780BAA046D1CD0279E360180275EEB0049CD04B55A
+217927EF0031951F6C129D3F005AB70E861F9625F1551F9E27FC134B01EC05CC
+00A92A950D5D01C16B123EE02A5A00A54212841A61384C2495341B7B213DB12F
+F504A2C522A81FF600B45000820777013198113B01D91B3B12942B0484186327
+92126900902FDE12CD23B32D0F6D3108B700491BE3223BD46B00ED05AE008622
+F21AA43D00F83E267912860D7A178C441BC312601F852F92067C0050CB1A9B10
+369E0D386C1533A300671281500CF700D14B24E021792C44BF017F0831CC015A
+0692277B2286325212E92346B5492704B36F0D8621833106C94930A00DD25A12
+C14900DF521284175C2E4776015734651A984117CA354ADF035AF082500073F8
+0BBA5927F100C31AB327F11EAD266A336D015AD90081451F9A278511AE005024
+792A7F16612FAD0A6C04C55C1F6CAC00E826AE00D3340996013ADB4000FC144A
+23EF1F664100C16B1963AC0AF54712D726AF05C73444613A16A40F5001FA065B
+3D1FB46C123AA7401AC60DB24218A0670483007609F7551F43AA03CC11E96626
+00E2056C3F00770486366007C9013ED80013EE3CAE06C64C04DB2F6C0486147B
+1F490D27BD42207C390086107A335101860A500483008A0DF52241AA12FC5A0C
+EA01512F8F1AA312BE2650FE0456368F2A50119E01513C1A772B6C2051B9274B
+8604AF570D6CBC5B099505E1335001DC2E007226875508732D7A199701900A81
+0065AA3E189412DE690447F66F0ED95B003E6200DE0734BA1DD94E2F800ED500
+3277276C0138AD7615509C22AA27E60DB41A98264F87219D4161102D87270E8C
+265712FD23AA08C001AC6C3004A00160E01DB6470CE461223DCA5C1FE927A617
+85042F9404347B2666D00648F803550795013F7911D000E5077926DE12BB630B
+FD03A0077800F112653D219E32003CB32F771286207E245AC71CB30036A01FEB
+015028E31FBA27EA29056DB626820035A42700449705267EF21F9C27874A0A61
+3D12C8014A2566EE0D9C1A94510A27BB3401F4088A1D792777003BFB046C0BB5
+04D86F0060F34001A379005E4336672E5207E45A14C82E09792601973E04D86C
+1241960878016036C6642050C000B20A3686122F65DA3D21CC1CB85023751F40
+BD3A0481460091235635E21A416030A30CD0015ADF0F790146B704F90C9E043C
+810D59E1026C0D5EB4066A3D036C1E46D63A004B1BC4570C77BF152D69B93904
+500C6C02F82FA70179225DB77A143E5300D3401FF25B046C961269315501ED11
+BC6A1E49CD3878274F1ACE0C5112C4471D3CB50EE900CF229D1238862350AF34
+4BF5531F7E3007A7002FBF4839D6065000DE0A6C3C13974A00B9762700864D09
+6C002C860CA365005A9A1D2FEB143E9512662AB204C6006C2A79173F6A1DE718
+5838613143F01247CF3F149926C5341C8B12D6499E0187530C79EC620527E630
+0460E400501179B43BCA40126D1FE62A920D4101C105A6365A05AF003AC81A2B
+50D200BE47305B400EAE08580015A40185219A27793701E26C05772687168400
+60B201EC0567009A3D0EBF009F491AFD74260D8F1F9D2777298F1AF5591FE131
+520CD14112E834AC46F601CA3413F2270ECF6C0560CF00B4057D0E75278C1FF3
+26AD04C551278300A408BF004F93056001852C780051F3004160083BFD391ABC
+2F103FAF6D1750853E1F9027D4215627015FA4008508A500F41A6E278720FE13
+7E2369A10748E2133C62189F05D7017C279026E1622FFA346A00DE06B0630D27
+CD1AA5045033F83F1A7A12771FDC27058B2D6912C73657014FE4005A10EF1BAE
+01603E0585019E238A04A660017E2705663C1A854906AA500037B11F447A224B
+D64824E7115001860D7E41019E0DD8226D277A1A2AE326AF22F712AD1A762FC4
+1FAF24690F970050CE0150099B01CD08AD0B6B019D05FE79153AE03150177927
+4CDD470C69019E29D90D51327900810492420C69239D1AF3016C0D98075404BC
+50259119309349005A2979D90D7405D42846C149126CD14201ED50007C22AD1C
+6734B54003810D50C912A9267811EE18683B1E990D59D912B56900D73073189E
+5A0C860231F3015F099A003DBB6022E23812FE26772E8D12E906B45A006D0C7A
+043C674504A50B7F008605D047277B1A8722EF336427782240EA4F13781B40BD
+045A0DC46221AD045A00CF30780E60008816F820AE27C41FFC33B03F12782D4A
+C23A43C712A53E0A7C015AF813B237F3124000521FA42592005B07B2005214A5
+1E389C14E1099204781286492EDD3F256F00D9395E0147C300FB27C0203F6E04
+27960F5701FB4120E627BA59119227C51F528F05308100589F1B4700C4045035
+86123FAA2FCA1F5AB905D2285A374BEF163D6004F50DA5276B00A70EFB00BD5F
+0331C427A2004D8E227C3800D9127D229319AD26E634B3254101920A5A0D7900
+6E0356E300AC075A001F6D295C1AE72EC83F007E0485096AAD32C665015017FA
+2795308423790860B7046C2E5A26C922F800BA097100941E8B4908B033792582
+125B0486009E41F14724BC7927048401750839A52279013FFB1548D91DAF330B
+6CB45A1F69BC014CD50479094994004185127901DC0D2E6CAF227F345A01DC14
+7928811B5A3D0D9F6C00620EDA2F0AF001B1502D9D07EA3350018204740858C2
+6B2746E94B26B227D209366C1F8023EA9501D9049D4912681EB82F5A20C14704
+89270C79B93D047F0DE71AC827F6300F51D000A23F018427791F6032B312FE28
+12861BE504AE0B41933C14E42E0A60008A400D50C432A519DB6800E60D4F8304
+39A60F7A0565D1014A0DF5310E81233B6621FC1334E00E33EB23922666B60443
+00C1129639499E0BD1044CB320DC1938F426931AAD48346A1288053F624412C5
+671FA027DD124C02D10560018510781A43B50DDA27A40E38501F7F3700AF0878
+440CDC3D002DE61E5AF13A1069AA204D0160069401468A223E650EF0500CBC05
+50EC0443620150C9006A2C591F6EE901CA5A236CA814C62E02E11B6C125A3650
+1286482EBC18CC6A005027EE3F1383269502409B1AF101B64600A560206CA100
+5108C8005028E178275006C8043260238734006C068656056F017D257604CE27
+49FB11B400860638F50F5E00982F7912A41FC22FF101A66126840455006714BE
+600DF16C2350EA00A01A6CB4600A7F005004CF44006CC539AF491667C000E405
+9B335D1977228638139F21D2309A44359E05D43E0027793107B10036791F52A3
+389800F805B200C7330496065C3B1F77C3025A08A22ADE1660D30052346C1887
+315401C2075027AB5E1F7D1296083D0EE96C1F66F800AE0EEB8026C64211B628
+D13906E3541F9E003976276C1F9F5A0149B6451EF02289326C145A226E3900F6
+193FC633FE82002E860433BD023B68248B054A15CE279E26843014E22650126F
+24EB340C80276E1FCC00AE30DA00C25801790D6D2604F21A50127FB94C17A066
+1C51CE08EE047712612749811F6F2561F012418B00F70A359D27C82278008642
+206CB30DCF3E05DF108E267F14F43E129E32F9225AB470002FAC124585266D3A
+0C760134981F78125A9F3D00850F61BB01D10BF14126C6226C0986005A04E600
+8A06990DCA480BA25F117505254ADE18AD5912871AD13E12FC279201780EDE1B
+A55F098505F600910479411CA611850B3D6C044A7C0E34E326AC00C55A0D6CB5
+3A045A0DDC013EFA037B27416029DA01B7083AE10B9E015035D721A326447A12
+84015012BA2F05A40A277A005A9E1F6C29E8009D4901D6096C0085024920C641
+017F3808D70153BB1BE26100F00AAE004519BF27E9301A84267A35008C058112
+CE284BB94726A536D927631F853750019D21B8409F0B634000F8267A04B04F01
+A81F5034AF0579003FBC32A31A5C2FB712DC4E02FC2D4DE6129E1B3FB56B1562
+2D84183AA3270076F922922984226C4611B400C309487F22945A137D27CF1F87
+0C6C0452B500E51F60F33E0468FB3648E914AE2F0D50BC0441623B1A79278A1B
+BD34DB129E055DF417BC5A1F962A0492482186263F6B27F7650C790446A60E5A
+03B8651DD7345C019C0C690D7B0B7701AD04E500B31BEA27840E6C013CCB1F97
+2FA611602686390B69EC135D3949FE126C015439D218593D00AE345E00930661
+24F901500A9801F6095FDF0153D81F503F00AE0BCB059D2F4E7E21871233EB00
+2FA50059076C01AD2DE01B672941950C3471A01A57008E07642575F9003C7812
+CC22C10DB1043F60064C7B26851A3292012E7910F05F3000B40850D102920836
+A22451C50040E02F500C984817F93D20E027C62AFD2154127C2F6C2779084F01
+D21AF05204790C680150EE0040DC772F049D00CA0D2F8726E41F790181089F6B
+218213C34127CB3C12A228D8237B1F92381299340C8E02CE6B1E5032631AE10C
+3EFD01B2650C42CF1A49F539BE4825740E9305CD014DB800470DCD23B31F50D7
+014426921AA555058501662E4FFD1FA22A00ED0EB2470D50E200A54016CC6F12
+3A9E135A2CBA5000D80B5E348513A420EA380086069250007E05650046C54923
+9F05CD1266C034557F3112B227E127C41A44951F5512B84120762766B4005707
+9E0FBD22F1310BD405A4501A79018A5A057F00AD374C03C356086CAF1A622606
+79F100B54000A71B5A35501F76AD0E862667175510FD00B13154208A2F1979E9
+3A0484277803387CBD094DDC0230F74B36E11079006C12D35035620074CF1F69
+355A0683043EFE6C0148E2046C1F7F2F8A1BF6076B00780455BF2C5012AD3F1F
+9E3486135C09F4175038860026920521A660006F067B0F9D3507BE0394005AD7
+0985055027D037652D4660008B49276A3A00E00EB74626F01F405A06E7691B2F
+EF27003DEA45AF3D137610895E278500BE07D2033C5C01C508A2007A1B854909
+ED6C12DC600727964C14E311C1590527861534986B091F9F0048AD3ACB3E0A9C
+05C1274004A308B620D6279C25521AC5227B3C14EC109E017926AB28D3239E12
+6C1ADB6104EF5A0FE303A72C810060D80148F94B15DF76083AFC22A3346B00E1
+502F6C25F51A47A623EE179B02AB0CF801994012B804ED127726953300840C69
+C51A7A3000B675045CC079220A8001BC21EC2B06D90D6D276B278622EF3F1F88
+2FDA27BB3515843704A0003EC75201C63D00833218ED6200D15E0026AE5B2782
+1B6926019048276C187EE725793E128E004A0DBB00A30C6200B684014826DC15
+50018E0A5030FC05A40027853201B2276B1FDB26AF340C9529109E3F0026C458
+0D6801D423901F8613CF3D0B82013490003B6C401F7F27711FDB2A507B1F47B3
+4B0464D61FA73500950DA45D12409E124A0451C8275B34520150A0349219F410
+A4006905AA56046E0C6A015BD300B550277E216B128626AA541FA36C0C479F2B
+0F78E73E04CE0CEB04B66111F200D853043D5A00FB50276BEE611F3F5A33F327
+50236CAE590465C93C1764B4005E374677BD0A49971A82069301771A79411DB9
+69045AB28502298D2F85124609B200490561AA28C7511F63BA0DE75A00C709A5
+0586003CC6015D0DF4173F5604EC4F27DD1F46FD0027D5249D166800DC0EAE7A
+12650141B0048C36DF1B792640E71E99279E124327621AF60DB100F8400E7608
+FC0142B4270640C21B491294226F2F58401F8427793712A01EBD2F6001CA0947
+017BDE0596097902D605370EBC410071E64012921BC4260E522FD3125B38C934
+560DC301ED5E0038D7270C3549ED00C92558F563276CE9792050007805DF1146
+80043C99125634681AFA0F509427792285019D295F0A82017706328650086B01
+F739921A770437C526E422543861144A9C0ACA00793D00F1073E7BE402A50650
+772D5A05D72F6522962D0077F17A013AA76C0050B301DB08C301B3085AC7006C
+07951F832B771CB93012771F40B33C1D5CFD7A291A9C1F3404CE276C017DEA04
+91003FF8015011F33D2386460DAD6F196BE70692125D1AAD014905CD0D3701BF
+10FA15692D920037AD19652EEE01BB53269C3306D400AD31C60F7815BF2FAF22
+CA6311E23AB5357B092CA724F9480079098502D900B70C31841F5A12C14F236B
+C038134A238E3412C41A9F4B00BA5004D966124E0D61DC0529FE1F3E6A137731
+501B86224D30F45012D90CA926900450A400C751126DA80B49006BEF084FB779
+4902F14E15583E1FAE6B0D862280006CAB042F7F2705C00153BA1F3D9B500D78
+29861B4F93482C6C4234AD1A53F51E4DD8019F1B6C4000840CE34A196744056E
+3BE649046B128537019348006D0D48C45A046C0A862B50A51F6C2879275AFD01
+3FDB2F5F0EA904510C76CD5C00E84804693F229314397A0F34C825B12F1A8246
+0A9B05C735AC0DFB6300E40D9D043477237A00E80D3CF7442D6607EE00338D20
+B912533186003A0EA13607B323CB64072AB627D713B8401F5ACC12F64D319E20
+0064D70430E422B9013DA609DC00A0088601C40C3E8607417D0D3DB013D82862
+04883EBB11FA230160269A1FF4004AAB1A29A022DD27003DE42FB118D41245F7
+0DAD08C4003BA16A078601772BDB1FA401460DAC1B8536AE00F1075AE11F8849
+008F04439D00BD5E2681195300603E26A829751F44AF009F325A164B792604D4
+21922750CF016838A301CA124AFA6C1F61890D750037E4530079053B6008E700
+7741008D09487CF7410E6CA4007F125AF81F8424601DE7224826950450B21227
+CB5A047723A416BF27006D2F4B80B50DD6003E762BD00A5AF30750047FAD1579
+01445F00920630941F502296134826B21AF5259C006932FB257F276C01D51178
+277C3201A205EA3E136CF50F6A3C12E10041EE2CA104780A8B02D2671BE44903
+BF39AD019B69108202B80C5A2FDF187B2A6626A80127D10030E01EA978113395
+265A9E1991265016A32751D1122D0C27AF36156B27CF3400770440B43C0370D0
+5F13D93000FA6B0031E00B9100793650EC0DA80227523E1F55C70561188B3512
+79BC651F40610ECB1C9F3B23C960003AE7640570EC00397F048D14792688129F
+00D80B942761209D12C95426721D5FC03B1F50D101A4275AAF066C1AD922C512
+5A3C019209378111710BDC1940C234611E97228604580CE804920D3F9D18AD5B
+045027055FC21AFE0047DC016AC43E06DD013CA561C7720150F2049E0862AF12
+D56C0C5A9D124E008227A458223EAE791C502DFE41128C226C1F61E300AD7808
+7F27A44404C16600470CED03BA50278102E86A0440B76C013ECD0E405AC12252
+34BA09E9014E2E5B394F1EB30AEB0160400ED700A90C500092042F831F790E34
+92278500974933F918B42C50C721F12760287C065700E44900F8123FBE277834
+44D5650579411281B743F23F01790EA72D0D863A0499631D83105500461AD422
+793C1F882640563A18FC012FB826EF49016D0A8D05500D63C0035D07C801AF08
+CD41127B1132FB145000E52F531FD7279E223A6C00FC0C5A3E0F8B1A50128B1B
+4BA52504780AD6015A401F66C704B60EF56500834838AD007F3368299427DF23
+B75A09F704C95501E80E603F0786006B430F840065058D00A11BFB27A10E387D
+266B9F006007BB005312E12F00F53B24007B16A12F6A226CBD4B1CFA0E32BC27
+F123982CAA066600C35B01EA05BC009227794305880933C41BE51FC027F30041
+A51F7E2672288235049E27C543016BBC3B109401830D6F01589A12864932A41F
+B427F101D226AD0B2F7BE12760377612CF79063E6C1A820433C628129223FE1A
+B108F30279077E41128732623F12781F50BC14DF2753BD04EB1FA5307713D937
+5C01852250B209C1044839F54A1F82278B1B50974C096DC02A620BC901E8053A
+00962686500079086E047B173E9F540D40AC12852A681CC00EDF611F6CA00D3F
+693A017916852F104FE8490FDB015AF11A66006EA52705854C22EB27B034F61F
+43D00626C2056C007A3473276800FA6000500FAF19F1500030A912E45022A356
+0D6CDE045A09772C861F4921C53400E64A00A520DF2C9F003B6C01A50C3C6D2F
+5705CF24AE480DBB4F12D8046C2F5834D9146C23A10FEE013BBF062CD51F5504
+DD5026811F4178E20C5402D64414B537E20A6AFD1128DB2170355A15E350057D
+3400CC38015A9400AE56279F06D96C057900A21D8F2148990EE12F0A40DC1FB4
+3F066B007C08A501306095124EDA480DBD0A9B17854012BA1C9300800526B662
+247B002FCD01388B004E2FA03F12CE0158B96A1453A23D1AC40C79018424F91F
+AE40237B1AD6019D400D86012F93003977279117ED01770C8603C8005C32AA6C
+12429401770E9B4000920951B9311369BB3912892F610050C130004387049A00
+F20AA60135A22250AC1249FD1927DB4511EA227D351AB124396A3D0BBC003978
+1F5AB86300770C5AA71FDB2961136CE41A40EE01601585255A03E2350597316A
+39CB2C4997400DF71AB16A1561EA22B4197805E56227810E4600FA0B6C049426
+6630B40D60087C0450F0009026641FFD6B185BF41A63E008B2005A1F9727A51D
+622D428F195004E85E1DB227FC341AB527F01261019C471A70AF01ED1AA92605
+4A78B4126B33571F9126458600F20D602D790FB3620C3186045C00CC40015AC4
+04F9572763D002860649189B27FE0137750E8D25C53805860033A022C000F52F
+A01F50D74701F3065E0CDE032186015D3F049A420F760855C8275000B11AEC26
+9B27AB22D11252F0045A37C84F27D20D633E11AC09800027BF42038232138026
+46C9490FCE0050E60AB305F80D793C00770B85044E861166017922DA3600F708
+3E5A22790F8623EF012750E707B53B016DD91255328604D80097350376AB1D49
+B94C126CF20D3B93400087072FA326F428C90D811B50D304AB197900964D27BC
+6909552A911A790E82005A1186279D1F863353C54E34A112D72706BD31FA3D01
+840D96355D0177097C01612E8A003B9D129526008819A221C94A2AE636B05007
+35A820C84704F20B690479307F223E6C1F7D2640AF1FC426E14822CB0144D13A
+B04A07A96026871FCA4804DC4095523AC80A2D7B1B6AC73E0365B01E41A81C7F
+255AD03F07F600680B9C461F86266012AD1AE9550B49008E046031B512642C47
+F50B5B1CDF12532078D704406201CE30AC27C51A6401BD4900932708E1006C34
+4C8E5000791FA822D94904C9384AD21F50F20543BF1648D7016BE4385A016C0A
+9E0071045F12E06C12520089502F951FA825FE05B401D94F00CB600168108134
+0098522F9605266C1D86122AA0006C05A1325F00270D821F62A900DE0E502194
+2B07E7006A3D08EC005020A326811FE02C00A608DE04CC2479341576C06B2551
+EA004379049F00572FC93E04A10CF8003BA511EA50226E087A023BE83F0D28FB
+10417E1F57B909F10125A0116B045A3F12841C8605309E1235791F4E86062D83
+0D5204B633F427794112D81F9F2C0079EB3C11C30141D40060124E1C892F1095
+350CDE2D9F045ABC3E0DED1F5AC100F90450D7183FE43B127E1FB04AD8009D04
+3D5A277704FB12C34A149D27CA502282128601602F980350C337531E7F2A9501
+5DAC013612D11A3E720CE22640C61A92018049346C2E9319476C3904B415FE22
+B5511375B36C2258CB019D2E15851F40D84930E737B400F626AE12E65C006CAF
+0EDA013EFD561ABD27771093004907B83150860558B72705639A26770D5A3386
+39C76A075BAC227947177C26F92050147900840A3D61412FAE01955B0D6BCD01
+FC08871A662FF612BF01B535497D0079375E016C0DB527E334BE1BE6123F8326
+0477B3004712D80C3EFC7A41019D08C4344E8A136C3A0DB01FEF01B70750CD01
+B20C792A5C00416B079D0039099F006B3C12F64900AF7427018206660F782D67
+00793F22C339017F26961B67009B4714EA4E1F6FD35B1A84003BF63F1245AF28
+01FA1AAE22E906A40027F13801EC04B557009208A303DB2CA527D7169F0D7D24
+6D3403B81B4E2E6238013FAE14476C30601A960D2FAE22D412F62D9F017A0564
+0A6F005AD21367FA3D0D6AEF5A278E215105B86027821FAA2600AE07E85A2779
+125223861241842653D9019934A31EDD2661D3461CEA26AD6005793652125AC3
+1CAD27D421A413C74A03850A4FEF31680CB226CD330686002FC00B3803ED27C4
+0D6801CE6C0D844D358300791477275D991153851A6C123DE31F79316C236012
+6D017B32E900BF09F449287900A70BC45AE3027E059F0DE94000D05306840145
+731A425D1FC7279826853306AF005019C72549057900A50E6C3C1BEF00490569
+F931633F00CD0660D63C00E1310DFA1A3E6812E40A49018F2E048650057F0B2F
+B41AD203EC0A3D8A0079094F026C401FDE27A8155A05CB5100721250DD39AD6A
+2159AB79125F1C8E257E2E04E41CBE1242CF325401DC0944BE0533A426C50960
+400DCD00AE05F935B14804654512921E8512D95016722110349726D8225B0586
+28761AEC4E309A04BA08F13D00790EFC04A545228B2C8501A012BA1FE74533D3
+009F0E5AD8791150019E1285209F2F046BA31F995A008106C750246CC25A11F1
+4012C03E1FDC4A00862769297C204CFE155AB633EE05920C6A0081249D1937E2
+27AE03610A5001FC054D0044B24801DF11AC483367009404600BB73E1F92172E
+76D8007A288A00BA5927751F8341005A22CA1EA32D583E00AB0439F627B38D53
+0B6D0046BA4B1FAB01643C12CA1E54326A13924A29B0385017EC5C09DA0E6331
+80013C6104AE1A70307C23411DA7278623D9286C1040B14809780446CC229D2D
+008605442679006699005C9401783F0EC008A400CE0D40A23C0084125131B11E
+FC2FB901419304791A8524C61D7926971FCD266C099A345A007909A42B4FF31E
+8A26814A00F655013F5012FB1A6C3A01F00AC64B19DC0E920B7D01DF07C56724
+5A9A067A003A1AEF27A4167801F81146D609A4006BE200A54004DE0C60009D6D
+02349527AA1FF72659D5127B278603F406B2007104C80C5C00A404FD6E0027F1
+27BA16366D1551B135ED12AC19C53A26F60D32B817FC591F6D336A278504621A
+E2265BD600633E04790F50E90D5A35F6006C29940DD5347E0D9217F84C1AB926
+F05414D5083B6C00E605C436660DAD1D9F690450A8137F2664330D9E266B30F3
+385020891334EB0E2F7424D65CB2016908E14F2B68358F20792791370F7C1AC5
+2F509F21CC270D40BD0078057C00940A439C00E00F5A228B284DE33A5038F049
+1A7C3B1EC35A0E740061AE01F20B61014A790385500A871AA450238304378A01
+E60FB21ADD2B75079F01369413C7502796216429BC1549A511F0013C610041E2
+04603E009204683A018620A724BC40126C1A79219327EA0C31D0223DE2069700
+AB6C0451B4005905AC5E016AA10050C901A60A1336952285410EA208C3005A04
+F9195BBB2752008D2601720849DF7913511BCC395022C11A326B264AC24716D0
+12600AB6016A08CF5001860B43A51BE83F0D772FA127CE1F3AD83E1BE3014067
+00D60C41CD22A5275A017A4800BF50276CBA09426F00DA07C200780287092F8C
+1F4AA11BC0225A32BA0FD62752CC0DB53060017E065D9C27A201D20761004985
+00920F5C4429D31A3BEC3F1C8B25C6123BFA4021831C6C3E2685FE5704C93000
+D11F812644B4490E84015004FD6812D041EF35A13A016AF5345A12E165046CF8
+08B301630884017A1F9927861F954122B42ADF3301834C26D1218C047B0D9507
+5F007F276CC80879284E970074057F23CA391295350BF612532FEF1F862D6C14
+4CE04022D465043EB40E6C078C017C266C2281153D6E4119DD4613F93E00D80D
+5A3045B135C812652CBF01A20B5085016008D6017B277100790CCF04B507E350
+0046117919509E385A04ED126C22A02FCA239D390885330B6C005A1FB9280686
+0098072FB412377727921FEC35AD2FF6005A0FDE3200820D62046BC13D059900
+5012EA24672DFD22BB12AE3B1F52B012E8175B30F713920C5FF0054985247B00
+9006600EA7268C330D5DAC003BE96C0051E5472DF50C9D00A607FD009E05860C
+9734581F822650FD038810782253F20548861FFA3412C2229C2F6212E422B949
+276139532D661F9232A527F30D6401AE334E9C05DA007C06750D5AAC1F60B227
+C512770D934520C5254D86004B9E00CE0C3F690059054839C54C036CBC1AE627
+951F5023DA1F60B43F0155B800488605475A00F30E3D610145B709487700AB1F
+5526C401B019D6223FC53B04F401B67705398612541FC62F019912603F1ADC49
+366C2648E8226B00CE04B008C5123E6B1AE105AE013D96143869028B49056F43
+16A550049408339E00F30DAD00BD04D20686007621E5137A003E602B501FE927
+D22F03F3005105793AE84D01E2640D3EEF193DD51F812456A811D91AB96E1379
+21A1253F5A017B08F700A50D862E0B78C61E419B126632E12078269304C43397
+25851A36DD2778009B4028634404A26C015A8522641E3FF81A50CA0592127941
+21B000C4772E039512C02F0150B9492771276B2F7900BD50276E277F0D50E500
+C5531FE131AF00FD0A367F1B5AD4126C1F7A2577125D1F6C2240B83D068725F6
+1FC00AAE651149009E43267E1BDB4700611AAD2A04B470026BAC0E5306FC012E
+762680290BE3005F07FB0EA04630AD136C385C02F96B2708920435D401A70C8C
+04CF2F6C1F7A05EE00BF50049F12CF500DF9009932511AE11243CF08AA005097
+01277A2AA508DE64143A500558CA275008A57A12611B960FE901A72389360A9E
+00D41AB725409B3C09A5006C107E2951BD00EF3E018127A401CC35E840AE01DE
+540F61C8276C0D771582380178B766146CC20D942F12A5268510408431139E27
+0561A234487BC8009E0941A54A2FC03E168400D21259359819C9344F00DB4931
+ED53267F1D5434B1188600E010681B416212752C8006318F1F6C10EA0CAD279E
+00316D27831146DA4100FE2287320478EF1D9F0E6900F3621F3DD506F8007C1A
+560DE2045AED1F673359018608621179289120D847019226416822A519E00B3F
+6419550C268534018F2E009C04B536E00447FB1A3704E3203E5A01B96B09FE04
+50D70050F90149DC2F00BB260F543C20ED6C0126940469B33360277904EB0050
+067911A51A860E6900C0083FF5005F3E0BA22749AD37D001AE26FB184ADA0454
+BC274664007A185DBA0FE81FBE310AA65C0F73004FBA3E018227E320793904C5
+00763140AD3445923B1F9B2B0040B304F7411FD127ED22CA053E651AC84B0D9F
+04CD085C314D870E99007BFB085ABD16EE491B644200602795084B8F410D9B04
+F036501F8648349B21881E6736941A8A41126CE405B366033ACE6A12F126440A
+EF05B4491F69B827E52F5A3C04BD1A77144B93229F12EB56267E015A06703B0D
+90013D86207935019E05CB3449FD04398105660190691535B527D71A5A23CE12
+460154B7179F264C12A2025A0ADF00C0611472AD5E127713A35A0484005A1678
+F300860732E71F7227439600C504ED22B82E247E1F3F680CA234E312AC1AC751
+26BC00CE5A2774247905DF0027C601570AC70DB0096001F178043B5C40188710
+5105864F00789E1B3D5D0E9E3E126E009107CE792340AA2FDA0161066C4101C3
+0DFD19B526E7531F60C700B308E44116751D860D28904A24AF2DD42604EB5401
+6C0C7E00860662B5840A3B6C0C79E75F27CD26871C794110FB023D07D9269200
+31BB1240AE350D553A23B16C0052B801FB126C422761400377B200D704AD5000
+7E03852479012F86126A3B19B200D2129E32548C123EEE6327742651C927501F
+C425AB00F926B51FDE411FCC2C016CBE00DC5001D124B2206441005BF3016E11
+3EB82DD1229A1F5A2F6C400E7B00BA40157C2E641279BF2BEB01B46812E20078
+0B6E47A13C1F8C22A438F6329C1A4E26FA12D6500048049D0D6801B83005972F
+4FC7277B3B1ADF6E265086036CD504BD600D3F9D133A63472EAF1A8513D05311
+1E4F2F6C0E26CE195839F40C49DB053FEA01800C6C1F83490CAE044D902605B2
+00E5043C7907A200850D793299007D3001A40C5BE03922812F1A8627790D3BFC
+1EA52C1286269F570C7F0085083CAF00D304AB472D6C05EE4A0CA43C00580461
+38500297275A35F23E0E7900BC09E44A04630B49DE0077045F3F1BAE21842646
+F749216AD44700860B6900BB500E400AFE1AC03E1F814001F51B4FDC0AA70480
+08F6009F0938925FEC12C23D78462FBA125B349314A65A208E26F932A7012AF1
+1E3BD4007847348412771AEB402C6615DE470462460DBF61278D174904990847
+AF05F5014C95046B09D44D06DF0033FB1F5029E56A12834D287801E00F9D3301
+D52450F61A9C12A522D3480CC4045900C91A602A6E401F9D26C327113EA92FC7
+019A30F312C000750890015122C11F3EF2245A047FB27900395F019E4D149026
+82022F8626D322613476275ADE002705834901F9058F007B08D0007A3300B706
+4061124ABF6A045B9919A512DE1B4FC1229E00720ED6345A1BC612E8365312FE
+003CC36F12F46515405A32C3133E8939169D3F1F5A890467BC0F4301C73F1AF2
+13672185265BA81B86126C3248DA007B08377E25871C842650F905A800D00781
+006CB35A0D8122860D6B007C2F5214B12AED15820D54A804992BE93D012768B6
+0DEB2F05E0286A12AE5E00780D9300A50DC10133A16CB3320B86276C22DC279F
+1F5026F16A1A6ECC0099093D22D8400A6C257D01990C40801455B85004850B8F
+246C0197077926A66A0140AB3B0078CB109F005EDC01B6630073B20A27A43800
+709F265C0DA60253C13C07D0003F6A05B300C30727941F56F700A811D72FAE12
+406C1559346812ED47043AE8005418DC27B53906E3641F7A0D9F34E7016C3253
+0D771F62DA12457F1D5DB30FA200D84118F3385831E81F6A21865A0D380162D7
+1BB811A50C770463C00142279D0B39521FEA77008027BB00FB39602DF30030D5
+02381CAD26F30041B75022D11A86052FE821571FA12B04721F7F2F1A7A2641F0
+3B1269E91B52D5133DF8048F227E2F00944E1A7512F02F44621F8A5030BE1278
+2C48600177089401C42DE30DB4502D1A8D226733BD4101791A50A54003C4003B
+6104477913E01BB300C3083E970127A000347926773104964D06C701499B05E2
+3E1BF449C71540560060395533EB123AA278074CE51EB45F0528B24911613654
+06BE0443A6540D6BFD7B003E60319C042882004E36BB500A8B01C80C50ED34B8
+0DE94705C60C5A03C6350181063086016C4727E607A04412FC29B55503880ADE
+3B01F20C6A3C04B50AEB3F1FDE2751258601933D0178BA00CE0692095DA90EF0
+01601088264DDD25B91F9E450060376B258A164CF4540CD75004FA0A52BD3D1D
+8412791A3C7045009606842277049C30E307C400458F045422D8300479013CA5
+6C0D34E602A31985229113661FB52549146CBC12D71F5DED0F69E0026211D027
+6E27822260014566028E50208627952250AD12E16122C51AB100603E17D95E04
+800134CB2679209949177800E1501D81229157006AA4045A37621BFC0C40572F
+6C1FFB263C67209A27D0193F950586005A0FCC2FA212FA5001CE2C04AD3A1A93
+3E1F98226801ED27AF2CDB00AE12BF5027>
+ >>
+ /Gray 1 index
+ /Default 1 index
+% See the beginning of this file regarding the following.
+ /Red 1 index
+ /Green 1 index
+ /Blue 1 index
+
+ /Cyan <<
+ /HalftoneType 3
+ /Width 167
+ /Height 167
+ /Thresholds <
+8449386C275F1EB224FB26AE1FD23246FE135C3A8D105A01874A27952305C10A
+7B2C46C70CF700BA0635852676217F1A6C4025821438951F4398621578B54113
+47C50C87006533500E8A270C94033D5E1AFE7141087900AE10D72BB21EDD3147
+E6368B12791B539B006408790D609406A022DF3100B00A347D1F54C0274CAD22
+E91A3B7B1DA227049F7800502EB53E01274CB248002EA3085600AB3C12C5501F
+8F3800850D630022C701B305EC4F007E0885016C06A5115736B21A5334E33F1A
+D80D52EF4A306A17AA1A722741641F924902C408A631F0019F4A00BE50016DC7
+072FA4270461EE76226C263FB604FD6C2150F130AD12C2325104A8601F95256C
+068700406708A8006C09A301C10641C720B232C800502D6A3F09854722914901
+EE2F0685003794077300D840016CC23E166ACF125A1D7CD70D841A71C31340F4
+345A01874700D90B5BBA1BDC27AE7715623283122FD71F5A34DE228627790495
+01EF0B9702AE6600823A017800FD3E06D401AF0ED73D12ED29583A6012523C0B
+DE2E601FD9291254FA014FD8103C01A805DF5A1B782700B5077900416A009F0D
+D8193CE10446C449276BBD1294267727D2226130860E2E79018026A51FF902BF
+501FF35F04C73E129A4117DE6C1349B3481F60EA124F00F23406A502ED431652
+04F13D0461AF0C991BCF2F1A7F2779204058027C100440D70B49C26C043FBD01
+544000F319C92269276D267E142F9D1FC827B443119F662250366C049B5D008D
+0DFC00B204CB6318860D7F045CA50434851A6F2DAE571F803001CB0986493566
+1CBB14E750217E278F004C85125C00EC0C3C5800F50E931A51EB044CDB671AFE
+12470486103C5A00980E3CA819865000B9573001D1265A0E8E06329827861F95
+412289360075BC335B1F87300079276E0560EF0EAE01EB05A53649FE9C561B86
+013D0EAD68168F0FB8760D50308508A400D80547F604620A50128728540079F2
+15A430501AC92F68226F27791F40AD04F1379D1A3EBC6A21CE00870634F61046
+8F22A113E302D52A4D84062FC9014911B8310AFB2E781C9F21D043346104B300
+40A019390092275AD766276CAD13E02783006C3903D12765088B4D0D8601F723
+BC5403E0095201C06C0E65AD270B8600DD0ED04E1AE312B440006B3376266A12
+CD00263000B827F97826500CEE2E613D21649E0041E11646229F6C123DA92DE7
+6B04DB0DC33C046B00E40DAD258501A306E10C970059336C0049E70A50009A0C
+6027C665006CD0043E68390D701A91013EB16C1F60F36C2264A54005BC510173
+06A312C45024852D0C74B6460DA801490BCA00347705681BD024F6460D851AFD
+22B03F1FA52C8500397D1468D32C5000E3250840FC22A12646049E3E01834F23
+9220C9139C2E861FAD6CE360116C0546CE00A24900C806E50138D10E4F78BA5B
+0D30BF5A007B07339A21405B1F9E277F2278015812D4347B27682FF812BD23AF
+122E7C25DE2751F30E4C1AB43B1F52EA00BC469E3D0BF7125600920C4704D301
+5526901536DE27871F7F012FE20969F927046CE21F88267C1D56EB22B82F9F05
+601296502DA9047800ED57046C1261CD22AC350D82199A334DC57701491268B6
+6C2063BC3A08FC04A20A4900D5043D50130739A5228F2F197E341B9C278713AE
+5A1FA22B014B05E9600127DE1BB5570070AC018808CF12B92949F546236B0FC4
+01A6268702500868C80191067912408C0498500D93076E2D612700C852229C27
+EA28B6279F1F790ECB004798115F00FC3949791AAB48005AC4163B5A06F402B4
+400E79016D0D3EB54000D8055F3B269E1036C226E5310A780159B105F5461091
+04285AC97E004A07F600521F862A64276DF45A1A61F10194C4550CDC00BA5803
+E364046C257A3304810868F81F86401AB5770E6A3B1FF23512EA2662345A0186
+05630990009D1A50117A1A3BEA781E3F5A19B037C40126DB4100F128BE1FAD12
+FB4B12A53F047C095B01810850E53E1F6CF20241BB35550ACA019D05348D123F
+7900A1316C3661009A27CD1FF15A017E274B9112E26B1A6093067A00469C1CFD
+2644276500B81A57E00E3A27EB159E2F7710D800B00DC6013C06844022712700
+3377277B1239851242B50DF6004EED26C33511AB280096350450C701910A5A85
+0540AF00F83D1BCD27B21FE13544EE6004D1680044B800F830630147A3572F17
+82267801590A86049C39006CCE1245DB3B14C73200679C085129830477228827
+6B215AD626B404F0500DD112AE26D916510C8C3319C521EB153DB10041C8012F
+DB1B4CB4053E6C0080D61F94277F380079AD037534540BC140236C32811F4C9E
+27C30DA9098545EB049F085BF424AC0036771F3E9C1244008F460176D00D49FB
+213E6D26A6152ABC5612771FA64F0D6C00865007950026B03E24A00C2F7E1393
+0DE21D79126CCA079E123AD13E25751B62E12352308700954E2678A40D35B320
+D514AC0EE700B00DF438007D1B653D23931F500487093FA76B0050A408790084
+095086270DA5530B3D831F5BD10DA93C04510AEA01C1651F416012D2267F015D
+A409EB043FDA117900692BD41F8F12631FD0340C791A60E015C060056CB45A20
+D6641A532F7D129403D94501E368003AD50484099337E949132FBE1F40864F12
+8B1ADC5A04B249276C3C00FD04357722E76B005EDF01BA2F05840CAF1D680DFB
+024127F65A018605652E5A1A7B32731D5FBD0C45A100CE055FEA3E2065FA0425
+DF126C3449AC22CD2B04F249792171BE08F7015030601179CA40146D3009F805
+B93C00A619E13D1B78265BAA005A36E81D9A014E043AC05000934901C7270482
+0A2BDA22490479093CEC06AE00C32B65128635501C92186C4024DC48017905CF
+6C0355DC3901FC056C3D20853700CD05B55E23864A01AF0C43B41C477E125AAE
+16F4013AD23E1F6CBD005012C2244FF000C14E08CF0196045031E4126C2F8527
+0078C2013A86462A9C00F8052F74016A9F123900E904326827901AB722EE2E00
+62A0218647247B1D955A0D864A04B500CE12502D94164A7D103BFD54A201267A
+14DB2F51954738AE5000A00EF927A4124E8422794A07B05500A205C027FC0CB4
+60002CBF20613D259412770BA8274AB400C109F35A1A770E43AA14DF314F862C
+048C0833EE00406B2749A70460B20733841F882F7A183D6C402285276228DA11
+9E0153A91541BC6C132F991A50AF0B643E1E61BE13E8361C62BB6C1541AE00CD
+0D6A0074054EBD3C0DDE00B55901DA0740F13A1F7927692F8601F70BB9063FCC
+6C0D227842F133A605862608FB01651F7C2F84199100CA3001D43714E71E32F2
+227D0E79015A3C1DA06C1050AA0BF500B82F691F9215602D476A1229A526E936
+087B03982700F66622CD50199626C501771A88122A5AD90CB004E000C70D9E01
+A504FA12AA216E277F3506FD01540CDC5B0DE5003CCA01B77B0D41820C5AD304
+4E239C5A127727A134E229AC125A0184279513339C2785216900C80AF9129F20
+763463238400501AB0D807276A005A3F12BC4B1A7811E906CA015B376B1E9A45
+125E9D0041860D5034DF432F9D03E70842FA0028821A5A4104EC5001CE0AE604
+AD407904870067C01F5A11C7581F41AD00A13D04790E53DA4000E97903387927
+6C2560347926E51F50387A078D00EF1AB64B2296278D34007E2678105B274726
+DB0128B40030860EFE013ADD068901791285217827FB1B6C0440EB0E6002BB11
+772D92364E00DF08AE03DB27A6278700304C9D1AB720EA6A008F37B749277523
+50BB0FE2540473F601276AA80460AC006105B812702286341578C70147D7209D
+133478277F1E893200D95016CF2E0149F03B720591092F7B0D65D51F9F2D0799
+355018A54700EB0EA40892005B0A69BB0044C7344E0D6A00793B0ACA034DA31F
+D02EAD1BED77044F98531A8F4417A827871F654025F51F5A04DB009108A434C8
+700047C44A2752A4045D05C159276C267C18520DF4126004E50B6E068E013BCE
+41046600D20D9D04277C0032BA1A2D6CCA3D1CD82D12CC1F88264ED04801AD69
+055134A60976005DAF0E9E005A27C6520D33842252AC0D820126B71AD75013F0
+26405B00FE6720B40C6D27C422603949FA15D22786311397235C02D68425C412
+DF5E1F40F2125A0483086C003ECC0F24F93A06E36100480BB400C46C0950BD38
+48B0193E5B1251208D256B16FE003FE5159D3F1A850FCE00409E69013EAD791E
+39CC402680195A0DE3149E2F5A39FD521AA56A08429F0D50087F007949386C09
+EF005F26C41A2DDF1F90238527CA3905DE2650F10C651F74F8009D076C2750D9
+47336A00963A069D01C7344F12810158F3004C9A0687012F751FA901DD5A05ED
+0F791A3D5906863F00B46D0537BE4021FB27B512508640006BA53C1F77DF5D22
+3C501A933001860B2778D000E505B10BD601790D871B57336A00EE04A13449E5
+043ABE6C2501B4520061F90CB2279B206C4303AC086800C54013F15D01B522EC
+25970FFD01A033498213950C5392116300EE05660D49791B84043A7901A4053F
+6012E430BD001B7903FB2740BC531F6C0F7904B924D22F0D863312D026B45405
+8310713E1B8636A12DB201E62E63179739199E69008E60017C19972B05BE7913
+5201C00D4B0478F00EAF00D86626F66004502B7036497E1A50AD3B26AF01CE10
+A548385F1B9112861E500DD63C5F1F9912326C0074043EC226F31F85128D2F04
+923D1F7A2782005A35B3195A0DC40127D9043EF50046BA3B1750B42FFE00A530
+CF10B95025D41AB2385A0442733BB04B0E80046200E82AA61D8C37530596421B
+DE5D006D0D3AC524F3490CCE47006307416C0EA201F44A04D53E12E63B0FA631
+5600E765270AD42094288D27C530017C26603F11A70041AA129609CF0331EF29
+0466DA0A6D27792E09B501FC08662CD0007916A505EA094AA71FD224F05A0D7E
+006033D02650DE4A00C705E31250D0036227943F1B6DA43050861E37800D6C9B
+270087123F5F1444693D1792287A018614A020F8125F269E1BCB2177278401D8
+4600EE6613BF6C0441AE1FE86300792F009D5012C522F614BC521F7B300D8650
+01804E1FC74908D96B34019E48316C05F60080095AA21750E8069422790D2FF1
+1F6227A06C015AC11F3E881D9A01DF661F792553BB035A32F6446C28773DBF01
+8312793601941B51B20B41019F0C297927643486203F760CDB0069E50A5800B2
+074DAD04E74002D057266CBC09E200AA04FA004612EC23C8017C0B9400CF0852
+31860CAE143E6023940B307C00299E1235860231A41A61B93B03772780016C3B
+00CF2656B0271BAE2E089302388D270DB34912EE00AF3F126F22D61236CD032E
+8115C634D46A0150BD003F11B740077A004AF30D405013C7279D003D98138526
+000DB200226A2A499E0550B92FDB05276CEF722160B00E980ABE01A307AB3145
+AE3A1F8D22FA1241D8193C5A1FAB3707E4013285266C207F275BC17705502E60
+39BA2B501F69F20041DB014AF712BC1A41AA20E64A08F85022B74A09DB04521A
+FD26AB1250A423884908DA0048FC0E5CD62653F1004A831E793750841A5BBB33
+A60149831F69B600436C014F1FA4380D78F826611EE627B312306BAC08860050
+12EA204BDD0551C7344980D804F10C32DF1F6B124779C5003508CC0038FC266F
+1B6026F61D86115601C0053E6B277D016599007F0C659E1F54A30550C54D0D95
+07491F67AF09E0005904DE770138A20E5E347E056D005AD00151118B38610178
+0D7C3F20852799058C00D53104F00A34961D3DA0048534009D0B7424B904FC00
+C3082CD70150076B38FA0D9C085234FD1B9C0B7905DF5D19478600960C83045E
+9F0029F8223FD46C067C0B41921A65E61127405B1EAE54008609A5003A125AA1
+49279D50048500E62F81004904EA27792750AE00CB0D9F2E12C727F82D0F7939
+1AF6123901E730B212DC0034791D8627843412B760197926CB1FA7278F31126C
+A33D04B31AC727EF1CC05B00EB0E69345A1A85461B56BF004F7A226B19E7641F
+C43060137B276A2286410F9E24E51A95005B26DD229E045436EB268C122BB40A
+34CE225035D73C1AC45A029F640434AD27C43001A9220261BB0A993B048C2748
+FE2661E8771F3ADF0D6D17A5335A12981F68B95C229F16F30D79315A3D1BEE56
+09710146BD01D25C006FAF601A84006C279A4B26B610F118A2450626E8049500
+5909E40447FA2706CF662683094600900634932650BD12E73D01C678106928EA
+01C80B924105834101DF4306C90CAE03E162277D04614527B33E017E0D60C212
+45AD00497A01995A046CBA00640A8F40127F1B3CB959106C005DF80E73A33600
+6C19D44D12C63404851A4D0DB901794002EC4506D23F03E00B4C007D06850063
+1CE004B06C0134A51F99602281182F91244906C82352D1053DF501477A00630A
+CD704C37AE1345853B199E73005B9A2900E3145AB86A2756CD0C7901408606AA
+67203EE0058E156C27A63312B14C119A1A8B34563A6C2F5000C20D3DAD12E004
+884F1FD22F007F075F32CD1AEC401FFA2F10A026EF4B05CD2EE40C5001F41D86
+123886271954FB25A500903E019B5010AD0193286A13BD345C22AF1383502C9C
+12CC35D92F41C0500B771340BB6805DB4000F10859B704EB1694277914428B0E
+53970C33C327792F00A51A5A2FF60DB568270DC0350B7C49329801490FDC013E
+A321E01F5C294E0D94005A3249B607850056D50127F3266504AD00EB129E2291
+1C4CF500792C6615F040126CB025DD1A85043A6900880C47781A7F013479226B
+018423782DAD26D24A00CB8506397D127826EE5721D7402AE24506F551009509
+8B006726C300466C401A6C10A5032D9123D800531A862A128B319F3D12793467
+01F608A5012DBF1F3EE4511A9202FE400FD8059401793E00D5571E43F41AB005
+4FFC26862A781B624009A700CC03F82DB812A4013E6120F41B385F8700770ED3
+1F7F256701F30A3B86219D490CA53A006F99013E51049D2750B715A52760BE00
+E12F50D300A9159E32C814940475059A3E0C22BE6001DE4705630A8800840464
+2086341B7827DA2C50FA0437A61FF201B1054F1F5DFE00A4288426FA0050B849
+0B6B00DC410CC04630601EED69007E046101B31250259E53277F21C450128634
+04A36C00642581370C77009F0AF600B96B2678316C1860227027FE0DCE400E6D
+9D0940BC36A72D4E08A53179275ACB016D0733CE035ABF0E27F81EBA6611F600
+773E08D3023B934212921A5A2CF2085F007D0DE234501AED5A91042D991B34B2
+27C71E5031B40DC5005ACC05AA0E85193D775308860D5A2479E87E0741791662
+0C9C0F3C7B0427D421AE4E1C80008A0FB73850129F30D822862769D0057708B0
+00663A1CDE2360EC143FB610DA01C05A1BD5227E2F593C04F1129D269205D902
+7F1977265AAC002FE21457066A01E75A1ED005B60040AE18EB6323821B419F48
+088600348F205A0DE7501F78125A07AF043E860E499927DC21405A00BB6A0130
+1343F30C4F8400740D67F913703E259812397C1F6301C70DB31EDE263BC43900
+4926C81236BF04E33350C61FED6A05823402A627E42251049C00C749076C3D0A
+F1003F612DE31243EE0475089D014085072F9327791F40A304AE4612991A8634
+5000E10D7939A033C00095053DC650017924FA1A9E3C008611491A85125A3550
+00B210D82F0462C52650E20542C5306100B232EF27C92162FE00B53604760B64
+A91C86271278D966A60040C112E526B036019E02EF4D07E15000F731A0256A00
+7F046093046AA20F72018C5027884A06940147123AA4135EFC116E053ED06C14
+7C361AA712CA501E900EBD015A35911F4ABE4827CD0E50C860016C0AE9006434
+5A07DF01C84A0EB8601FAE49005A09426322E712681AA9278D003E7721C22758
+FC6C26E604920E7B2B6A016CE83D0C7B125B38AB0186129723810D6B009D4626
+711761EB26B83502FC0840C646071F54308022770451099449276B19862F6522
+9426801249EF472ACC1240F93D1DDB28AF22EC003E19D4275DB3770050C3002D
+851F9B65002EE12257FD00415C04AD2F7E207118A9017A0B610086229729043D
+E012AC2F7512F1227C27733700822904873618C627ED1DA53B029826860CD210
+50C504620C9D0139049E2FA527D21FF62688145000AE1AD4007F0D6B26D70557
+01BA1B85380BAF05C73E007F074787224F9B002986B50DD5149E1A3CC9601ADC
+05AC3D00B404C10A5901BA055A129524AD00570B8F0182086C0D6DBB6700790D
+4B26E01A41934D0BCC330EA25A09AD01742F961F8326DE023EF8500DE22CAE26
+FC114D00F0791B4F8B481A9E3F059200BF0C51FD16D14512F16A0B82016C08D0
+4E31F0045C4434851F47F24C1B70B4410F6B0077095700A106C9278330692795
+22F017A22A47FB49286C04E4591F7D501BA51356D0003DDA0D5AE704256B0255
+00EB7927018A2F610ED54B126C1A43D53C1F7927D801791A8727BC215A35CD1F
+A82F1144AD22F404950E792706E63D005DF03F26921C4F26BF08E9006A1250A5
+003982227804521A6CBB5D1634BF003908D00052BA2F501E9922623E059E6400
+309F254ABA471479005437B500E306B20A7700D8270D62E022BF1A3C9542345D
+1CA50EFA01B406503477007A096411D225A53200D744018627E0331193681F79
+19379549FD38B872400750F14100A2531F9E37F8329C1261E7008E0C5D34E907
+630048F1044161024BFA053185176433B701CB61126CAE195001C90467E40D48
+78278A33CD085B279F04C3123CD07903420A9E65126DFA6A27841F6913E55E01
+D409AE6C1F3DBD5003DA0E5A008720D82491166A227F265D12A53549C9003E98
+054CF004BF11E447015A23791F61C90340DE22B01E78007A0C8B6B132FF80E6F
+0163A02704C200B06301147B1C500E2CA21F7812BB3406810077086B007B0445
+A5213EAC15552FD039991A9E12E32780236EC6013FD600468A3C249E0430770C
+84227834008F3901A60D6D23941AD413762697650039B11FE72706A5263F01B2
+0CF2027805358E267D2C01E20D792072299226FB2DA30D6C08F628A10140DE2F
+550485147A2060328E1F7A2570008635B83F0C92390EA41349860150BD3C1FF2
+4009A65F1F9526BA3905F24A3185260ECD6C00AD04D66600C4046C2648FC24CE
+27B326E027AE330E51FC01760BA302780E66277B0052B5013B0F9D561F84265A
+12F91B4ADA22BC27F812B55A1FD66017F501B3043C694000F3093FDF0D478600
+4AD750048D4A165F3246C540B10D5000C849326001F606AF0A6005790140AF3C
+017B0DC864057E1AEB25AC08F901C60C5A01AE27CC1A6E0565D000F550278505
+35EA27065C970129CE4801C0045A0B498316750950F6472DBC3E268534158525
+3BE40F7B01560C92014A0F861AD36C057A36C04926861FE100C511AD3E0D60E6
+782904A70CF005A2013F7C00860579008640109D063685225A2D49EC0DB85928
+7E154F9A216334940130C31FE338A5008608246C2AF85A12841AA94234861C45
+BE4C1FCD621259C31F703612B727960175385A2B801E48DB441451049F27EE12
+502F5E01CF20B960126CD8193EB6680524913543E42BC900AE21D03A00780712
+60F30B5ADE0DAB5C0554C82EA83F1F63C25A0370003CB841126B00F4065A2F6E
+4332781FD62649155FEC35691F7F2850B50EC238501FBA4903EF2750C60441D9
+0F8801793A07CE01B43101F905C511417A0A71006C12D32758E9009E0438B107
+EC007D1150DC006B12963104E51A459C00ED4801600EBC4500CF114BB5006A08
+77FE3D0D81009226991A7D107400429E00318802511277EC4F0D85006C126029
+7E04941DA552D731008F1B47790040B33C00761169EC084722F4309F1B6001D1
+258E2849B80AA501FB0855009A04BF0A4F00C54000D80A6B345813EC60092E81
+1B7700642FAA006D1AA24F1F85276622905A1B79275AF215B6279F2884219A0D
+3F651249852276279D1FCC04267927ED00498627A50C336C21842FFD39550B86
+1A8204338D26A32D0061BC355A1DBC04E138A82EFB0D27C4590CF926B3420027
+D5239D337B25EA125A2FE23F011F9C4124C60432F91866209E26D9003584168B
+067C0EEF279D1A5104C9186340276B147FC73E1F6B2F8227951A5AAD239815E3
+019F043271DD0DAE29DE2094128131CB3E12F801AC0CE5043FC3089E00308701
+490DFD045A01C825B534E01AC4015D0A5538703EB8065A37CF0879005BD304B2
+099500791FDB24AD35E46019ED114ACD1F5012DA410B6B480068084C966C1238
+A51F82042FA862036C0CFD01A50541C0016622865D04B76C126299268703ED09
+801A59AD01D028B2235A0082083EEA600D9B00DC05BC50270576F412AF01DD0D
+7A06377B016226792143B3003F50018F0A5004FC45086000942C5A387C1E7726
+6B4512DC692258D7661C50BB3E1984048C00771040DD30B201E60D48901A9D12
+502DF13F1F7C265817C212A0043F660D5001A7053E860493097B0078329E14D5
+22B31A3F01DF7900500ECC6C0A3DBF1FAD278C204D8D1A730DB608ED285001E8
+4600B5103A6C4129B9052F7A124D0041D8491FC47200318127771F853B00A461
+2B008522771FA430E74C1FF62DAC0DD262129425C9601A6CC0345A1FB725E24E
+0DD10049B807D800B337501AC605470092340C77EF0F5A1FA62757A3007C126A
+2383002FF9035EBC1B680FBF013DEA472761314BF001BC267E225AB1226330E6
+27AE22F5015A30850060C828531669E3355422F51A79400078073FD2003CFA27
+57380F822297360D7D1F51CE01A50B6E48F61F60E3711D7905AA340C43B51BFE
+0CB44C10E54418D04A37CA06465D006903920984006D3001FE1E6F123EF53C00
+7B0C9A006B0434A826881633931F500D9901800E7526AC20DF67002C46D84A0D
+FC053B6322F729AD15C850227D34059800922F4F8600A405D500891F74279510
+D74000F30DA5016A05860F3EBD0444E73C0D7E04AD2F069A018A005011DD5914
+E85F0DB055067F009F6900D10753BF30DE056A264AE3133900990A3A04A71169
+264EE2791250015A3F22942F048B0AAB016332FD12B61BC3385F18C5269A5028
+8B00A9055913B226EA2749C84188096C05EC60023DFD6021EA27A932EE127B04
+3CB57C056A017F297914D0500B9404406C0EA000D76623F74907DB106C1A7E38
+690EB106C8003B6C1C7A296C1F8618CE344B771B8A106F05AF27F021874819BE
+2D42A576042D98381A8531129B1FC92FE04E1A79126101418612942F0079C55A
+27B650C82750F9008A260464D337A706EB0153C1355A1A9311860040752F5612
+DF3A5A0444C91249D926851F970A6601851B700E29F11FA04012BE79002F8F04
+77098600522FA212501FCB24AF1AC200AB3F0184195AE101B91B56400D853713
+7727AA22CB4515F22F57401550FC04A0089802C336465707B500EC26C12C641B
+92125001D9385B0DD4072760C30150CC0164E50179491502368626FE27A41F4F
+F104C05F214C0F8601380C860131AE13409F2C04751F6B27831F6612F32948E2
+50279E04EF089901A30DF235008608397801E14A36D05111E304B563003D5400
+86270E42AE145024C91F5ECF0347F200730A56348612754B1FA232D5253B6243
+33E919AD045AB20192033D5A018B089E00DE7920632F48D114445B00F8127524
+7D0C5B4701FE51003EB561108500792168EE3D1F7E330BA12640AD3C099562BB
+05A6008D0CCC0026693E07A103DE1F6AF05C239E63076CC60047AB0EDB00B00D
+D7007907A0003A08D5125C276C3453276C1A9E6A1BB05E119E310086062FAE22
+5A401579C423DC1B5AD06C0464D93F0080350C88245E27B339F60049E23604ED
+0D6C007F05960980017627D11F40E21E60FB0CAD28612371340BBE01B40F5A33
+EB0D9727A304DA40329A1F851234D3770A27A01FF33297035000B20EF25A1D83
+125A22F52711502F6A3C175B2C7844B316FB256C3295084900D9123FE83A1A57
+F5198D297C346F2747BC50226DB56B244AC000AF0CD800B550052CE53301EE23
+52B912488F003B9E01F732046C07A4460B35C027086BAF19FB411ABF0194056C
+0E8527069A60278A27B71BF01FCB27A00C5A007A084B8411348E1FE312C605AB
+5026851F7600AC1A7B23671A835001B308D900A87906276AE804435F124AC61B
+82266C0041BC00D506760085D00AE801C349E0019E0A33840E3FBC0041CF1AA4
+2885005A0D922F0B79256108F6019E0C6504DD0D35019D04793D1A8E1F763A12
+D459047947188A0C762FF81A50D40C83265D9B12843301F776005AE4122C7901
+649D0D7934DC21A517BE692F0AC300500B5C3179026025FE34A5269E3000B357
+056D0080492E7900EB0A3EDB27693E05C400E44312861A782F5D401F5ABC0052
+34C401AA0A3D9C05DD29AD156A36522EB93E1A278B21406F04396C1BEF6000A0
+5A1A8222507C046C20CD27B001C95B00C513A51F5822ED1F7F27487BF7165122
+EA620250F9047F3E1FAE25C36804D1276503A3246B401CC1003FE826BA6A1A27
+B43101934712BC263BE743156046045A3F00DB4A1277FA389D0049B51386116C
+05DD1266F03E21CA279B3704F91A69274C92019E08E15226733401BB27F04904
+C20DE20238981A7E236C27E71F63401279229004EC0D85015E9E6E0157AB1299
+22BE3D0527D24601E60DB4013BFD109F06791F803E1C96386C01439A3A0340AD
+00C4093968C80A4526CE3F225AB9006E0B82003BA64100DA55127900A7540A81
+19590148129F500D96501DD54F0690005B08B200C731EC229D1FAA3D26046C24
+D90E3D6900BD1F89287904500A86006312BC6C0D40B101CB115D41307901A50C
+9D5A216C003995266C2785480CFB019E088400A204CD4901FA0F61259F1FDB46
+0727C81F3BF40881005DB47912307B27622A861E6E402F6012EF4904DF4D05E4
+30D0126CBA61153D5A2C92002780AF066B00920D4C27E94112FB1E6012863D07
+BE2AED1234DA27AB0DCA793A00D33B05F43A00823F1FCF27832E6C0F7D016C08
+50017BCD41B5074FA51EE1472E5A01C220AF27D61D40E950012698561283482C
+F716B51B4E2FF23F06DA0EB25A0BF800AD12CA2F4E7712DE34562C6C18A5345A
+39BD50006E3712FB820CA10065472FDC0E490459AD089504DF0BC300B104D652
+0134A11227861A60068600500E79E404A71ADC5B013D791EAE29DC177901935B
+279901E84D2195267F055B92016922772D06EE54227F421874B312F15A0B9504
+F826A41F3EB832F3640E5200278D3501920A7906EF460D6000940F53A8073A78
+D32F00E7340586046D0060C60465178427793315812A782160018F053BAE451A
+BC0DF7500D8300980530D11BB3580022502B7815AF1A509E1FEB3513F71F6B33
+435A27486B3C23B76C0C53BC0040952649FC27CB012F6C24770E34BC13F1500B
+8401A031CA3C04C00D7E3409CC015016AE381FB413FA00B24170108600A86004
+2F790236AB2249117900D3581682112DA11BE66712F55A2240D13B15933CE548
+307E016C279F220861A41F5BC41FAA27D638128623CE009B044DCF03B80850EE
+3F1FD02664008704613F01BF26D71F467B0C770433AC60ED04CB400586013E69
+00986C0050C101A50EF109A30086072EF8206933EE12C2320C811C44B10AF904
+AE5221760032CB223E66075A1486205927AC6C1C3FFE6100E051087D49366326
+01BE1FE2290DD05720C56B0067BE5A1F97420491005AD7046C3F05792C03BA6D
+0061B400266C12C523FC18CE0050F33E108000457B0C5A06834900AE35601EF4
+2267401F93310E9F5A087E0DF14C3396247B2E6C085AE51AA826F06C12013472
+105AF527D112B8501938A5233D831B7427781FE1125093007809A0014E05A45A
+029F5F188648377A01EC10B563056CFA1CB123E4003FD9054600B879042F860F
+3AD227048D0BEA4E307904509A3E01850933E0124401D9380DFE27C2234F38C6
+21AD1AA1640D2F9E1A2C78CC058600790B4E3988126A01BB26DF1335EF27AE20
+FA395712A4500C7C00E85A01C76A002CE41EA43D14C71BDB129F1F8632019300
+554009D245B81F9F320179246E2706C95C0DDA054CE800BA04993141CD193BD7
+552260DA6C1F3EE83B00D42B00C512502B89401A9D460351006C2E9E6E1266F6
+2C501156AD22669E015AC61FA512960547AF22641CE826B5501F7F2785096086
+1A770795007D0C6600DA3C13E75904FA5608503F1FAC2860A5042BB21F79315A
+06A1650078046C0B9F07E50232BE279E123579143EB77903405A048D00830856
+00ED04B461223CC71F8626660D7F00C34C0DB200E5793402861F99263F611646
+5A0D840147A5042AC0154800B40F6A23921250792665A0065E00E12F117BCE36
+A80A4104B53C018623D0360AF20031831B4679006027D6380AFC00A40B3B6C04
+9E00EB19B32600A935501FE9279D2683490188401F793612AA22F45D0CDB013D
+E8580550E1029C384F1ABA12CB31891F79264184006C0947AE26DD04501168B1
+22D6276D2A47BB492771390EFE6A077900A102E92F5E13953B20912F114FF92E
+6000D10DAE36CC00FA26B26C11409100850D7A278B04C90645A509E40134D927
+A70C4EB42708791460F127691ACA0C75008F6C1A45B90BF00333DC2485006995
+126D2A4F971BFA265A0D6C2F4BE24704D2600B6B01FB0927CC4D07C601B06900
+85043294268B1A750CC53F146C0ED100792841640149D40053B917E020CA6201
+841C9E27F63B007E07A60CF801670AA412CE520140B612E13A8E471ADC3E04FC
+64075AA5006B0BB4502177016D22811A530C39EA621AF525BD34F11A406030F7
+1F852241920D851B3E7E0041EE1FC6004796008534A31FE52A04A4602177275A
+94076D16AD1D2F4CB706D4004C0E48AF39CB01A00C28861230BA1FA533509312
+2F9A26831439D42751C0004F11BA48267D00A721842654FE0CAF23ED0D349A12
+693B058F4117FD0D3F6100731FC412593663179D22D92779043392216C2E5815
+50057A01896B1E41CE3C1ADB27783F128C2FF2159D063ED979045001792F5A0A
+730150B700940D6C0254B0196D005AFD21C36004522E8A240FD7491365400750
+C53D0DD901A01040B535F50548DA015A3D2060BC7A016F0640691E78C1004997
+056F400FC40060EE00500BE64B1B7D136B38E36C0733F71A5F2FF10499083B6C
+025A15905027F601AE5F2600A43150BC12CF0A9D4730EC00B94E277900881A64
+B20BD7009A04AD20C626B63909A5007904864908C601EA04A10B512DC768012A
+B422CE0EA0039B27D2126C3A1FAD28D93804F427BE350187092977A30240BC57
+3006F200BD79115C0092316818E1005A0D643981129E19EC7705461AE327BC12
+F650045836F3224DDD02871F80371276BB336105B501F10A9E042798640049CE
+0173344BBE19D62D9F4500B706497E223EEC79490486016C412F5B018A1D6C3D
+02E20E5330F400502A60461AF73E860C416316D42C5B23BD0E31921E55247B27
+61B1005012995C156E30821FE21768268B01E750087900618C106B0750B21248
+DA1238E10D790173AA275A3A269E1FF84A12B34E26861FC900A5046C26860032
+CE2798126200933C26D31791088500652D43EA04AE502704961A8626632F501F
+51C40124A312813D12AA013F6800861AE13D1F842F0AD00154072CD71F3CF01B
+B015E30D50CF12A01F61C60548A41DE912B0345C00275AF0009D4D12F3401A69
+ED0441B8670DCE01358624E43400FE08AC0050358500AD1B3E6422C427B71436
+A427D21F65337F0161981B5027FB18500E9A04DE016C3E05830135C104742F54
+20E629C3124A7B0C6E0052A3345B088901AB2F5B12B41BC1155A276B01F75A27
+E10040D003B278108041D7345906C05022E90FAE400D770462D800BD6311931A
+C36A0BAD5A0E72018224973304782684003E9513396C0182057613DA95033B73
+3F068601AA770053359B002D951F4AED056C0AA341227A275AD70540FA0B4BCD
+0596005A0C4ADF008603760CEB22B727006CC404419E00CF1D811251AC26C822
+ED6B1A50FE119C400C79003FF81FAC26EF2F04DB22C51F6B4000E046276C017A
+08CD117D40067711AD5A1E723600FD2E0D7818EB266A007E29711F57F525B312
+306D1538A4277738128827009B36CB295000B54309FC2EB32050E306BD5227CF
+24A20822C612B21FDF266E2F14C026D41248FD073A791244C2491E6BB502C511
+479712602FA50E70133BFD319C1B69223CAD4200940849F8123284205A376C2F
+46BB3C0079095F40008E0D3E6C01CD6127B55A0A69028309AE410F7F0150E90D
+791F9E0CFA38AC3B4E34C225A61F8B37089F0FDA5A1A65BA006B049D2FDA0BA5
+00CC053E60014A8904FB581FE20050F9034BDD48047808F96A1A8F5714700D7E
+013F8A3B1097017C2F785035690A5A009F11DA4B087F016686225FD803AC265A
+01DD07513B1A860131BA007B2540EC48A101840A7905EF5C0ECF2F5A3A81055A
+A501E60CB105EB00631AE8124DBE1FA82ED504B33350089004348622CD376115
+874A30B83D1955B33A01854A056000E80A780047D70248EE247E0443AC06263F
+A5385A144B851F66277C1C9836CB1BA3400E8508B21A6032A6122CB913523E22
+D80138A800E826CC124400F11A5A0DFA00AD01E9278933573E01933F1DA73205
+BB003E851979118F269D13E86427F36A1C50E1045A00266A3F1FCA26AA3F0186
+1AA513E11FB236197527861F6014910B77268638017F066E25671B9412F02243
+DD00A74901E15000FE0A7700962B0565D43F16C71D9D1468399E0E5C2F7A0069
+2795133179D2550FF400C40D3DFA08AD01E30C6C007A2705AB2D5E3992007905
+66882264A5007E1160C31F6B335A1C6CBA682749B9471F6B12811BA404FB0CB8
+6122F5540CE147127F1B50C500F12E6100753F019D0639930F2778C139B207DB
+5A0040561FC52649007D0B6F0050DB08BA0244CF3E23FD2BAE0DDF5927F415AD
+00E7277B005A9D157430127F1B2C9E1E6A23DD126CEF1A5100862D782650D301
+2AFD1AB022C817B701ED60004903851D792693016C44305B22A127ED1250D34A
+01DB0C49C31FE64200ED0534E127993A0B82049B0690044A09D1018404CA38E1
+065238671F7F2D069F00348C205AAE27E30A3A664004D339B30DBD1F5ECB00AF
+600A227F1A862F1279E704880867F559279E25C712683959317A009556036C00
+7A31049A0C503580126126D1370DC52364F206B86C043EA64007A134007F26B5
+0DF403B9073EA852096D01840B5434873F0DBE21E02AB0096134B818CF12B44E
+04790A3D910034822678290799380D951A46790A5E03F45324D827B52FF82286
+136C2D781B4C6130D500BC5000D16C125FB10478003B6C01872699128646096C
+2849860C2C801937D65204F5015FC13D1E6E2FA2173907CF0161338600A511F3
+22B41235A020D31760C11F68CC0249BF06A90378480592013B5A400DD35F00C7
+5A254FBE129328771F63308E126C1F9626D83347F9125C1F82276C1277224FE7
+01475F05850036C8245ABD1A61F00FAF00F25B1369B5275AD112BE26A0300093
+0E5B0B79006034AA24EC0DB500228613700F29852241EB3E18CF26F31FC8401A
+F600C0501C9F22FB0033DE4905F17601348D25770E4F00990CDA0055BE6C1F50
+F00448E62292014B0566E20751348C013C850028991A39791F8619FB2E4DBC13
+9F1F862812843102F90D603F06D00152D90046ED04BF00405A048F00A205D500
+A70A9D00CE042E961FDD3240F065078601439C0D307622864304CD2F017A0435
+85006D0C65C64236EC40199F10DF0088055E2693C5013D9F43E5089A01560B86
+2F930E520867A40D5C3E05EA005810935303972650125ABA149C2BA923F1276A
+277A104801873512962E0D79275FD67D2A1A78B90944F90E4ADD4108F85900E1
+335300981C3F6C00DE0457EF21B1681A8801E2491F9934128522583E2278EA14
+B21F6C412C6D4436F630563AA8500C7A00AC1150209F27FD2E03C44701C60B34
+7E2154FE19BC501FA62ADE1F4E04830152C7266B27701D4FA53F081A6CF82601
+6A3C1FC326A2006C043DB079005032941F7F266BCB4127C52140B600CF400979
+00DB046B079E01BB1BFD25AD0CD74106BC4F01C509480EB2410027961B50A327
+05926A260E9E4812C0630EE401CA5026A938017A0538A1276C22833E04B15A09
+A401D5660D31850C3BC319E40F97075A0486177221FC276A1F7F01CD0D791A71
+501E9751276CDA01AE0D3E954001EE085A018412AC1FD22F027E08A304D52700
+F458B147045CC712AF5A0D7E27E01FC4611228D623B801DC0BAD3C017E084E86
+0D6230791FE926691F51C03E125B358500742D6C218B5C18833F1F9A24750460
+F14B01C32E0167C8123DB86D2F01A6073884268D330C7908854913D54F00D908
+AF00F0501A38F727913005BB5000E067067E014D23CA1FB211E3006A029E08D5
+29A5395A00B711DC3A06E7004819862771005A0F802477389D26F72963146BB4
+38FE1555369765123400278F0D3F83002FFD0149107A3301E84E0C8317784A2F
+60129D1FE13401F724A90666018832A40C387B43D31549B10EE004A3003BCC04
+FB5200E727C63012863A1278EB3F1E79005005D26A2243D8046C115EB52AEC1A
+C32F610D812D79123A670CBF6F006B107F491994274622A3265AB66B007E3861
+2741D0531A844A046B12E2314984007E411277A53D08F21CC427DC2DAE11D105
+5B00790993004B055A3AAE01500ACD7960E622A61A4DD36C195AAD6805974517
+974104FC3F00B405F62E5700A15D1A7B123EC74E12FB017613E4270084093193
+1B5226F71F6A39158F3D118C00A36504DB600B5300B527E625A53411EC5E14A4
+27F5034F006B3E009822F51F9D2658CA047E290EAD1BC500F13C03CC780039F3
+024712EC4901BD06A20B27C12F0DF73477019E0927A91AC9542704BF4F359D05
+80046C0061307827A235C327F0209E127D1FE2269E2F0D3E077E02F2280440B5
+06371BEE25B75B00CD37590E861A794915B96C123FB100E46C042E9F2546CD4A
+0262B537ED540567B5440A7700A64805BB501F6C0C3DAF401FAA278613960481
+0D5A98042A77007B1D9422CD12A04A0F6C045001E81A469D1DDC48395B2C771F
+9D610E3EB55F139721892F0E861A795039880058954800B33E1F69F804406A13
+F561107C00455F14B41FF622AC17E6117101860D6433D600870C6F0050BC17A0
+2F531378AB0E2670D0410085093074228A1FC027D23600850934D7046A2F501A
+B65B007F0D5C23A51A50046C20CD29007A35C3500FD9306001F32AD021570085
+04D5083B6B401AF4003955B21AD0345706AE356305DF3FB336C86111A500336D
+059201EA084AB80634FE155104842DCF0950C726FA3300EB123EDA12277C0D60
+CC10533494088600339A26CF0CEB374856087D028600501ED92750C004602A49
+B81FF02277D94400C16701477BE73B0162BF1A48F705A5016D08690352AF1FF1
+4C279A15CD22820E39D827AC008E06F627A0128A0141E5129D02277A1D812286
+2679019E0DFC2F6D2650F300BB60216EC22701864812E23A5A018A305A260079
+0B2F87265AFD12B72579279635125A86007927DD0D680040A500620849AD2355
+A10450C51FEC22468800C421E32449D702781A86267912963445CE2E41BA6006
+79003F7811F605377C0F69015E12943C21E02D00530DAE12503677137F27E633
+A429EC127440018E06426101A304F54F0B6C1BE834500D7E00DC2F4D951F8427
+5AEE05AF00E20DAD175A326C14921CA316792D50129D300368FD3E0882017810
+FB1AB50C85F71FA74104BB08406401570BC90069D70127C81C9E25AA1FF6761A
+3D942B77107E05662E86006006980328AC1679013E9F18AE2F5700B806D800BF
+0D5C048D0A3A9E1AE222B13D1B6BA70353C23304FC4E07850F6CBA1F90267504
+DD0092235A0F6A007C0A5A27D82550BD0FEA385633651E940185481277B1213E
+6019B80C6001C8083F653358387E043FDF00BC4A06D001600AAF01D9074ACE0D
+501FBC27A5279422790073173E5B01D76A277A20A435E35013791E3F9A450A63
+01500490340D5EDE05B601E526BE1FF2153B8E4133DB500B592FB867053A6012
+E43F206C286827791FFC4F26EC27680984015AA0002FD22709A380291AD0269D
+05406001FB2C9F27AB0CCA01B227CE203DC30149A0003176228B0DC600B327D5
+3604C42D006BC707790034F35022A213D10B9F1241C56A0F3C5B237C2747E349
+2684223C9126A31576005009D3005039E22FBE059D32500DE600C50974002FB3
+27FA0450BA31EB39C36B1256C10427861F3E5A400092044CD80ABC01781F6DEE
+04500F77FA01900864A4018409E701A13D00954900AD462CCE400DE549128A4D
+1E01B575005B33EE15C73D188012781F5F397A1A850D4C8A1C82301179FA08B4
+006C28830A6111AE691A5AF8125227E947713E12782A83016C1BFE01511D79B3
+09EF009E0C6A03C71153F0047B0059C536ED6B1860BD04620E426B12C7239A1F
+503185129E601A8412922300790D85062FE80040A650126CCC0CAB691237A626
+681A5410B100369F27CF1F405422C64712F8329E1E3F5916B00D35861FFA1276
+23851F963D00EA413455123FA8014A7C00864A06CF0055F01248DD0440FE00AD
+06E76B1F3D55194EDE1248EB2078003F9F05408601963A0DA004BA00DE264AB4
+47269E27E7012F951F5036B91A7834A500693F1FE63005820D299E340C861BA1
+01EE4A00770562AB0142F43E05DA006638E15A27B01F497726811B6601F03100
+78183CD77848009D31FB80274985126C008406A73C002F9223700C61BD04DC23
+65C5055A016104BE085A01BB561F94CB03F06A1BD50C2EB320DA31509B260595
+002B62A2157927663704A801C8782F049238019D27F1224BD70E26C64C04CD1A
+682F8616950D5A00770D831846770566CB015A2EFA0B477F13B3600E86411CB7
+4904F14F25D8492770218627F8380DD1265A1F7F2650B10D4D0686003ED701AD
+08D42E9E0D48B322F801530927E6136C004008E101BC20E930C21B75DB5A04B4
+00D140126D277C13502ED53AA0315138F42764067A0C26882F058624A4640879
+048F0D40C44935BF751A3C5A09D40FB45A22842705A05A23AD60127C0793002F
+76AA3D14842357FB05426002F51FC42ED80058B712E1411A800D8E00721DE03B
+0427AC01DA510089266C12910036970CCF07AE03509E1A8600A711BF32019727
+CC1FF35C128C1A406C145A3892047F2E9724B36C0450AE27CD631A7C3050047A
+0D6A024911861A3E542689009E07E9008F0C790EDE0099108618D923A9790A44
+B312503C12E435541FF92801850B5007E200B64F2178003FD90D50E53F09FE00
+40C9325A14BA65085400E327B30036A420D3403169048D22A438048633009B27
+D71F3FB939016CC946177A22982E41CB01AC275CC30160195930861568430CE4
+394D046BEE197D0E6D3702BB2756FC04B400E1104B1AD30D82003DC13F0C7504
+3CB5410DA66027A129F126C92767EF01AE1AF6395A336B1CA8276C267F1FC500
+3D6C3A0020DE62006CF600794101BC6C0063B024F6279F26843302A42DF61249
+96006212771A7F0E5401E1395022FC1F8311781F8E480A6C009B0EBC50126D08
+61F92050C1105E04A36C125A99102678FA064F0BF7075A3C19E70D4F2DA93AE8
+0148DD00B8316002CC761C405604B627A568137C003B631F7A275BC764014427
+EE1B6020F62B9A125A01F44609D300820A78009A06347C0D764910BA01CF3F00
+F305B40A672C4DB605FE51993B1FC3321A58BF169E27109944197B126C015B12
+EE6C136726840435B127CE2CB133D726A21F7A049601A332C1035007E927B352
+1A810135E927BF310C7E016B36EB513001EE0948D13F005432C2671B79239F67
+02881DFE126C227C1235801E7922940E2FA000D9355C004505DD22AE25C65009
+9901462679B85A0A8C0195068000DE229E351792225512B63A5712BF5E21CA2F
+01951F7F225A9D125F3147E704791241600E49018A07489C042B750546EA3204
+D60053BA36D6510540C700AE1CC95D1A8101860868007205880FD92D426C1859
+38D764147A0D34F1234C86067A00439E24DC199E0026BC4520A72B0463A10D85
+023DAF00DD0540B7306C058500A208C4560AF201BD1453FC0A7F269112F7782D
+5A3F07860134E621B50EFA144F1F7C32CA25491EAB2F791250C10442FB32601A
+E3355000880850E127520BAE044C39D1008C123FD728AB01C817F25027DA1261
+EB1DCB640C51A222902F09940031921F4A7912863801EC0E581FF329A91DEA49
+346600B40CED057C0125AE00CF6C013BD512B41A4FF0045A2E630D497C076488
+006CE51A2FBD26D921497D1484115A00CC5024D23363401F94275A368400405E
+1AAE013F500CBD1884F3124882156C2F92007307DD00A7055AD66A0E6106CB00
+6537790084059201A326FD1E3D9B4205D86727EF1779206F26A55A006C1A7234
+780C309400A53801863400AD1A6C3F06EF421363B10CDE033FE6054A772646B9
+4902940C5F3E00C8127727476227BD44752F5A3E18B666043F5A2A93123CC700
+AC38CD22FE1234C427054982127700950B36BC27F11F753B098E4501F904AE00
+7106D325AF1FCE3D0F65C91F95036D005036D100A60479274ABB41266C297910
+3900EA269928861CDD24AE1FD22E790D6F0461B3002691360085258E01AA08FB
+01359E24EF04B0006ABE1F7B2250B40D497A27E101C5601F6FC73E1E6A278522
+5C30D2099B006A21792750C0138F254EF1069F00860926F90D9E0587462179AA
+00E30547811C720A6C0484004F9B0C4179B801F238501FEC5601790840A41AE3
+4B1095267927DB34A6116A0477076CE829007B30E027AB1F79266623ED12D11B
+5D019E12E71FB55092197E01F00D5A01940C3F5A134AC321D638156CEA0C49B9
+12500DC43A5D1A49CA077B0E8527E13C125608D3026828FD189E125A3B0E8600
+5004FC00A80AC3009E1F7C27FA14C507DF003B6C04B10D7A402BD1154D920050
+1FDF3100FC092F6D2660CF0DB326F515B5412FD41F60F2093D255A04B16C0430
+9F265FBC0483002AB21A5E0D9E176120862BF027B3340456A5126B1A600EC601
+A109883861039E0DF536510090053A02BD34531F47B64A2769BE04E700418512
+5ABD0453337C0466DB35571486339612502FBA2646500478F73748971290045D
+00438504A72DDA27792F81154F396C125001AB0B53347E23921FF5432F6101C2
+0F5E34DC1A3CBC6C1054A51349CA0CAF013F59008747335A01950A8601532976
+A60F86163EC4610CDC003D5022C265053ACD50017E05E6005A0C80005B9B1741
+F900A00889325412DA4100B05022834908C068235EFE71470BA577006C08F700
+346E26843105A4002F8622A61DF72E009E09EA00C20563E5005A05991DB52C00
+7E0C27E24A39BA31CF22F4266C07960FB9245AEF01AF35F261226CA20041B704
+500F9D1ADC3A1B78009802A57804298E016034941F7A228514E1365512A321DA
+1A6A26B313C90045E527D400501A7827A31BF96B0D3FEC6E0240F634A32742C3
+3D13DF1B47C005268337E54604F2395A207E1733C8002B961434D20C4B1227E3
+0430DF22921456A11A9B0EEE6427F2450ACC005012AB46216E277826881F3D78
+19D43E810A48A825C45A0024810F6D0864018C14C22150019D05317F0E79052E
+D1043DE6125A2FD16A008205A749E7266B30551241E826C220E0005A04F72C99
+02A008D70079063DE540046C20983401700D7A24FD04920A7B0130A5005219B5
+22781254088704AA502785003278D140046023791E9301C107FD69126CD90440
+7A1A8301A4791B41860F5D2BB93F08DA015F3E1A7A11955B1F6B973E0560D604
+B60D5001D00FA133600022EB601187043578AF05E827AA1EB6334C0064E94119
+CB6826DA1F438A12941A4A870983013CBD46296C123EAE09F705CC62007F076C
+0E41B93C1278266C1F73266727A65B009237F7490568B91F9E2F8E125A34D122
+5AD91E7A27910E6700BD1BD6472F6C019E0DF369135321B312CA00B2106B2C58
+3F00B4441F62F100B130C63F0064AE0449C60173207D274ECE07B400C53D01F9
+2C08CF771930821F5BF6412A6C01FC13BC913F01D71C59F20B2D661F83003F77
+0DE078290D9337510C96014EBF005226C40032F71FA4125E0AFE0094045B1F4B
+85223B9D1450A133850567AD00C50DEB2DAF12EF250FC54D1A6012D018503F08
+C70140AE0049B30D389C12CB043DDD2F5A386900FE1FCE22513E02A50A750181
+2F6C2750D60DA424852F048B0E50276C125526DD1731FA2179410DEC00AE1B78
+2A56346A25860DAE5A2700F15300A73A049E09C146276B06571F772F84003E6E
+D401BE1150F8055D4002BC5A04E200B21B3E86163BF0660CA562047927E1269B
+1F5022CE279F3601C11A49F42700EB12D2451A51345E017A05810047873B0CAD
+008628A300F95D266ADF1A8528058648046B334A9701850D9A138D0F440964B4
+20D7274BF74826E0069C00428C01EB125FE126AA019D09EA038E055A98005112
+D4335094124600AF04E60CA01C793B019C6C0F38C61A7A276C49227904A63400
+DE08AE26C90E4726903146971A39AC228715357927722667FD06489D04307920
+3FC90E5A0081053EB36F0C8200E1660D79013EAB512379280476F31CB45019C7
+5031CE52017B2FDA227810803304890D533A0EF55F15E927AF00F426601AF001
+C52457BA78330086089400601A8F125321F81934791F9B063A781AD8355A396C
+1FAB370E6CB23B01A305275FFB841F6C165103D24715DE4023A3620A8A01E20D
+B100ED5311D06A279412501A79A104690ADA01508600D40949F61AAE12CD0056
+2DD7125AB401DF125534AF4119C76A012FEB1B48102EB127D6125E0892015AA5
+2F008B062897340C950427FC239D085001E72650D31AAD00A06C012F9E005010
+6E4106B94F276C2C7D054901E048165E30B70EC5003EBC6E0863B9045031BE4E
+00934810B200CB500C72CF260687621F6BC4024B093FD72EB3366000945008C7
+0132E7223E682741653A23861BA4510140F960003CEB15A64127CA123B652FA5
+00850350339B1A830195370D842C78019206EE533513DB580469AD794F048A09
+9E1FC826DC370BC441126AE30144F71F408413751A64C1401CAB12663542ED1F
+3EBC6E1B66C031D31D873703A1089816E8279E1EA339EF1249792799670427A2
+380C5CD300680EF633048422791331F2002B5BE51343F30A3F7927B65A00740E
+8926F3122F841A479D125AB500C90C9502B307430425C46C052ABC1F54355C00
+7A0554E9048C116C2461DD0647BD0D6B26C860249F1FE8276C2C00AC770840B6
+263A00FD3F1B6C327D00660D4B7F1F60D63D1F9061006CBD06AE00DE3D049F5C
+007E0994024B88075204DE41089500540BE26A1FD93A6000790D690676018535
+03E20C3BEA4400CA772911961F822252BB28F90649861A45B5013DA6002F8722
+D8013A13A822EA01780659B100FE5F047F0747851D771FDA5030F45A862D15A8
+6E098C01B50FFE2A921F6C3E1FF029C60A3986142752E4004F08F900500E851A
+A1600D31C31F6101CB6C1F60BD00F91250B62EEF00AF084903BA0A3AD112512E
+61365812820D31C627F026C02F12CF25863413792063B32F5000AE2704C75026
+FA2FC726A91FCE5020871A4E86245019EF4737DC02AC0878005E36B001C76212
+821E4C71C0046C0F60EE7B0450329E1AC240266D1F3EB927D9193CF905A03F00
+7F113701E3590040E4226C277322A512C600B44A01941D50AD00EA7704388827
+7C1F3BBC6000D9043EFB50018411903E12A2063485229628046C1686243B9E6C
+2781164B9D02F2099701A525F746057901620B7750009D115AB001F53E127E26
+92124C86410B950481005A0A6C007F3F05B90032D90189077B015A2F6C4112D0
+1D9212792F0A9F27D7043912961AA5430C2666BD0B55386C04D508AD0C770050
+93045A3060129D27C962930D34D01F4AA40CD7008708792F510EA13C0D79016A
+2F4E10B65A19D204AE6C143F97227826631BB327F2480AD32A4CDB025A08E143
+AF3D0569FD011EEA00A4243F72276B1FE5297516865034A71C9D21E43749FA00
+26874A09CA01FD0540EC002DAD205B12B534E627AE10FB5A26925A0F7528A126
+C71FAE16E92D643F00E02650E900691579FE5827E3310077CC3D1A7F00E21290
+1F7D346720F42F12CB22AD01EE1F790A1B3DB468079D04387E1A4F32DE4101E5
+6C1B61D526FC21C01F933301A20D504001DF0749C50AA80086087900279C5000
+7B1249B43D78002260D00F39874629650FE000CA0BB24E115300AF07D40F40D9
+017D05850A3075C53C1B842770225A9F1A64D4144EE3472577126322722F02CD
+0837A921F904540B710058059F0DC1774803994234BB500149097E015FBA1B52
+00F725A5295E00E94601D35205844900740E6C394C00ABFC015012812663F600
+5ABA046421994707C000349705590B6F00F46C2163F023A5278633128B29E422
+5A37D86C0535ED269E20700E27C17F0447971A53D605AA50215A1B8B41007BC8
+3D20792792006A472DC61FB46C0D5504E500A50FBC300D7D350185096C008704
+9E0BD801A76C1260E3006B1348B539F13BBC492681043818BC2705860D2BA426
+C6229F3710962788126A470CB8365A22981233BE1FB037E728B514D65A260C78
+2DED00C30B3286233E7814B0122D8C22417E1F4DAB38D349270AC93E007B0C53
+00F95A02750D4DC7125318C1620E8505C600E9501234F52700BC0C3A6D3E0179
+B73B042FD8270D69E8015D18FE22B212603E0328DA279E205C36500077D905AE
+4922BB27CC1FF531543985173CB6401E7C2F94006C0D5E097901D81A5AF06C0C
+5BFB1F5ADF078E005A0CF84D01DA0640D103821C790DC2024186006006690B50
+008406339640BA1A476C27499C06CE01EF3A0060F5015AE20DCD0079035B0779
+9E4A11901A3CBD6B183CD21F9D3000A0047E2700B21A5D412F6C06965A0D7B50
+2F7900B618FA2C0E66EE6C055AB5005034B945045A0C7800F479500082093FBE
+16E0681B3B5212F23E0392065D4300C00449F30057069C0EC127DE239827A51F
+6A309B00492593003A880138791E40D12E6C2685204FAD179B2FFA04A02B50EE
+1750DE26A524C85D1FA36A1657008D04B311DE1A6212821D50C43F0C7C320492
+264412ED1AB841002AAC26D66D0443B401674404F46C1E3DE740744732F401AC
+1FC83901A51ACE10EC4B2694064486004A1291361A982285087532A238DB5524
+11A54612F16501960633A901986000A45A1F3CB2158C227B351A9E27ED255001
+850C5001CB0450F71240C412AD1AD56616CD610EEE67058701C0083E9D003B5A
+01416A48138723A40D317001833C04F23F01E02FCE223A5A3E004EB546279F05
+771A9D26BA60176CB25F2784311271E60964012FEB0F2C921BAF345007BD5A25
+04CF0D92177F12660449DC2787013F621B82125BBF1FD627AE1FFB4804C713EF
+26CE0087062C944004C430522273277B480DF73F1F7F2F0FEF6E0D692AEA12B5
+640B770464CE3D1D60AD3F1F8C330094054F7901843404A62E00AD3212B22050
+1461F2126ADE1EB310C700E108610177BA1BFD4911924F257B126C0667E80DA9
+77268401E30E582EDC006C0F3EF809481CC40050D80436801F9D571F845009E4
+007712952F0079A31F5001BC3845F8329E146B2250AF05C400DE3D01960A5201
+79008430633F017B116A1F4FB501D258269200AC0CEC00B9276C04D108C36A00
+44D3019F074C002DDA1FB241136CFE0039E55115D35A25DD1F3EE92749801151
+931F5693003CE57930048534057F27791F3A733EC4394B04860A28C1340CD200
+B11F923300812F04FA0A542069CA0349A622D6004C9A018E0D3B861F5FB000FD
+4005A500C737499F23D91F60FB3E0869E22E5A088500600B7900EF096D275735
+691F7F2560C43B25A016DD0DAC591CBC27F30D673F12860641D81D792F85124D
+14A525593D26931A347F265AC4784001863300A4092F93126A03840838860E9D
+04630BC721F53A04E00840CC732600BA5A1FC65E12E80B4EA526007D1ADB2740
+AF6C0064A51F5A40FB09BD5422C75F123BB77900279536078127921A34DF2568
+F6059F1250276B0DCF3065218103327A0C83015012B63500791FD726AE23D128
+A7339B17E60CA404B408F140126CE60859286D0027980583007722E42750FD15
+673A01C2085AE27900409E01DE0BB45712DF1C480DA96A125AEC22864A04BB27
+A62668C1006136BD2C78006D0CB05A26861E5005429F2809960126890041D404
+62F61067059900541FE327053F9E04265D411886013FD66C1739F350126CFD15
+5204B95A117E013F582CE007BF1886247705F111BF5A00A92BCA278E205AA510
+96016D0E8704810E640150307727476C315500B2044F369B04B647EA335439A8
+1A8A0497003C7904A2501F9326471F63FE11821F79380086047701FB183BCB05
+457800D13E1A7D00EA12502FFD13531BA840239800317601FB12B46C0E51DA36
+46FD5033981B8613502CB74432F31278084979EA15863CA901DC0D9A1B500C9F
+046208C026003DCC682600AC2ECE12B7006C35425B01AE138D27713916E82677
+096B00D60640F02A533AEB344C1BFB27CD8504BF00F612CC1F83297920CC136B
+3C106001D50849C70B5035B50DC94921F53D03CF00B40D3C6934BE0549F627BC
+32A327790050970D30AD2063F40E5A349901790A8F01EC0E5ADA1A5DCB12A427
+793803EB226C0D940227C305562FAD017707850E5E39B231CC002B7600670E79
+276B30AE007926C51FA52F489E6E0D3AF07948046C45277912A803F42F48D900
+600BAD4B0D901C47EE4A2783165F04BB0C8000B35A0078083E6015446F3A019E
+0DDA0A8A003FF801C21F78268015315EDC126A285A018509AE6012772C8D04CF
+005B298C146C1F62129321E2263FC352067A0C5038B70644CF1FB2266C3A8601
+339405397E226500D1581AA500BC14497E0D68EC0048CD21E427C9047E016D12
+50AC0DC820F01AB500F32148E74C003D7A01E80541B501540933E40DAF05EB52
+20821A930D37A128DC01793C04B901610D9C04CC30921B76266C203DBD22AD1F
+E42D970EA75A2771306522A55A1F84279012A400FA7001269F00E919A927771A
+349B22EB1A50279D12E401AD098200D605550A8B015F1FDF27A301761B84225B
+3E0056D50527C4480DF04D00DA0F9B2F0886492D6039DA22AE1A347A0C379000
+491A9F23DB1B9B225B354B9A0150397C1284045F1276D51250228619308614A4
+671C8428633C00C8326300BB5C1B7C199B26F750307B1FBB253E6F0048E201C6
+06DC0D5F400B90006905D94006FC04B001E94205B30C5000E22F5A3E0EBB7949
+2F6C420BD5005ADF055D0171A70C446C30512241E948266CAD3E1AF210740284
+18C827E400AD04F574123FA4641582276120AB347A1F5FC13E01F51C85006D04
+54B317A15E1F6CB55A1186365104F801D8072760A5062FC0269D27A2310661B9
+6B0CDD6020D52B00BE4D019A11894713E0394F01FB0640690444A412DE3F0052
+FE12B42161344286199F03EA6B2750B9265B1A9213581F9234127E265BCF3866
+09C3239D402003CE059B374A9230124CB7460E32F000B104C67A01600C872E00
+C95027A72EBD3A5F058E0F502D7D0D319F014E08F800B9048D0B5A06F3015012
+7C0C6E109F27F03A00DD2701FB084001EF4500B76227792575D01040E3520046
+0DCD0240F81B4900974601A7084F941235FA26C3500480087712852757C210D4
+2D0077055AA31A6C3A088600981156386C314F01D411397E00C6274BC1480660
+BE00EF3204971E8549026907F16227801FEE0426C678007F26D7581A8427570D
+3BD21AB31FF739630482007A2600F9522469D81241BC5025E11F772F54386C1C
+E6279D31A226D327B130CE217E13629B0E47864E3395276B0D792F09C30DB000
+198803641475F768265AAD009627CE34137E243BF30442831A77012FF226B227
+D822A10034822166C71F96330CC5019E5026F01FB605F400C4139D217904F23E
+0D7B017726DB1A46751C83410EF50034D627A6360CB200500DA266163CFC4008
+7902C24112FA74214A97034E06800EA322E413519A410BC0013D9501650A8504
+57BF19AC0ED23F0077046A0D8300500892005906AC035034BF0426D612C217AF
+21E149398F345A3F26C41FB1084901870A347C0F710458F906BC6C1E60CF00AE
+0D41950B46009104500EE461029207514009F362224813D13F0A78286F266227
+780556B4501F62B222EC126900AA2B0A9E00C65124AE5C1276005787125FC134
+5100AD046113BD49276600943405B800336BC75E1DDC3169073ECE1132792785
+164BF027C91DAB3C008305672679AE1AC422E01F40FA6A1B47E44927CF227C1C
+69A70041653B02940685005504FE954D007A2A9021B81CDF451AE927B01F3E5D
+40008A0B3279225AD41F69C95A176CB238491EB827EE12B37927007BE25A026B
+AE12D101930EA21BFE273B0C9C00428605509E391279E2402E6B159239058621
+DA1D3CFA4017791FE62E8627900035A21BDB22507C1F73ED0C4601924A00B947
+720349B400E905AF35087E00406A0DE44A34EF0142085A2F850161A50432BB04
+630D8101920BED06552F860CF459266C12EC1DA51205DD3B0DED016A30790092
+56016B0882009C12E626B75414E93300A804491FED2F097D00970C50006D3C02
+50B63C042C9227005A397D1ADA00407901CA6C27DE1832CC1F3EF954055001B4
+07DC0150EC2FA10694016C08D6019609750DD12150F404850BAB01E149102A8C
+23AE2D12963B19EF27901A6B2F731F5AB9175FFB209E2B11941F52BB39FE0042
+B53C125787237A27A71FF9365B2C7812E601A53E00CD30A72976276B8625619F
+1551D40541C03B0DA72FC526D8276C05813E017706866025790F970158C126F8
+225ACF33A81DD62384146CBA08F7459F0625AD2F4DBD155F40028707A0520084
+036C24C91E7F2263277A0D6C00544026BB23902B6826BE1F5B019A126C2D5538
+672F5A04C05C00DA0840FC530A8600640DDB23AA09D600419727077B015BC600
+7F126C1A4B92126C07CE3700EB0CC600694308B100C6491F7950227F1F5E0489
+01CF1A00B904348222479710611FE2237912500DA21AC44A1FDC27A43912FE30
+CE277734046B12862F018D0B5C056C01EC1F503665193DE376480A8E043AA412
+F84A346712A926D60C9600A337FD10AB1BCA23B112E3780B5102AA0E82003CEE
+4632CA07B400EB0E9F26951A367A27619C0127CB2050BC3E0183146A26823404
+CB4937D8143EA529DE01A40B2CDD25921C6F9E1F3D5E2F9E187727406C04B842
+0FDD05B30EDA153A6C405A1F47E70DC1002FFB149B0489003EFD5A0179360092
+095D00C74E057F00A50CD9489F3F04DF682049FD37AE48107F00A20CBF005404
+34F0225AE0006D2F0ABA04E92A77135A4632600B49790386355A046A3E1A61E8
+4427F7334F991286005A3E1D92207000D80744F512A41A503978059E2F05984A
+33FE00A50DE7611291005087046109487926C860045000F22E0550AE06E00154
+CA04E21092340094276235732653B708F50F9E7901541F864F02722B5A36BD6B
+0330D22166F6174499276A1CB422501D86143900BE581838B9007A0E59269E2F
+D8247927851FCE6A017C0D31851FA7611D832395003CB31AE614BD003ED24300
+F531C400A4053986006C04D9076822B115E06A043AB03F166B86017605C600E8
+258413F45D10D40477395B2D501F7826B31B45F526BC360596003479BD40165C
+D0127927498612408C1A5226FD671AA400F80A9C00416539CC45136CA83E0BC7
+3DAD00ED0A501A884507930D552EBE11F10789013EE662036CF560270C7BA312
+6B29BC04DC018A0B5104E90F9E2712B138C45008E6013DD900460DF368047901
+6C27971F5B19970A7C226D27D31F4EC317A0492AC64004772640D0501262BB3B
+22AD265A318811B0006C3D218B1E5812CD01C008B101EF099831017B1A68EA13
+49F7270F6CB3013B6B00B60A32F7002968BC015009C62D79258327E51BAC032F
+00E03204F26927075E401F9E27E110B16127AD01760553385B2FD96C0A2DC823
+4A0778E82A0153EF1A416515791B5EC546306100498850006217A52A79124E76
+B55D2041CD25A230860FE504B9265113AB0E810195093F613C0D7C005AF90DAA
+017809FD01500BEE0040D90C663F1F55D004BE0040A32779234984276C2F6912
+C85A0DA80055347E0C5A9D04289F0DEE522196601D6DA906389A2786124705BB
+0159117C2771A2601B539924007BD912B367006E05783500EA1D3FD8338501AC
+104F1FB34200A11FBB340466CA31089C00C95026F63400A61ABB39FB052DD921
+79009222C82F0949019006378708EF01502E6C0C47DB6200F9365324F112B304
+E8269E1A338423621F862779278D1F538518B304E3770D337D2666EE02690FF6
+3700DB0DA4007F421FDB278622AE01C51B3FE3501E7F4105D83C01C14712D95A
+0DD1015AEB691F3DCA4000DB0A1237B30D2B5ABB3B26770433D427AE22C8490C
+9F5000A41AEC2295007D058F5C0F820044922612864F1F713C01AB0785400E84
+0176113F9D12AD27F40D5D0180F727C117E0501277225AC2009E368504278F4A
+1ABD68017827851A6301C34E00E32CCB0FB306D5003FA70D3B6B2F5001AA4808
+A3125029BB3F046CAE1A6027D1330695015010E51650258C00640DCA3519904B
+15802E019B34007927AD22490C9E6C0465A92283FA6B0077E904501A9213F759
+1A7F015312853169127A266C047935CB26F81932EE2753D50DA84A00B734E617
+8E286B13E05A26D127B462077D044C1A41B74A0E55046B355D00C827AE143D67
+12F41B40B82F0786042F9D1DCB0046D73B12A23E117F00563865144FCC044AF9
+019E1A8522FB2B4AD30B7E005A9B204686058A0B50FC2263BF3E046CA23B09D2
+2786015FFC002EBB07EB6C235EF01A89117A00D5310DF7193B5A055025C31F3D
+7F0EDF00A34101B70D3DF26500D004FB28C512B5470C60400D50AA018B12653F
+01FA3A790440640AD300A42F037A0B6C0044EA225ADD6E017A25D51FB3129A26
+83196C008F06DA4A01A46C0060D21243E10D405A327706935D086CB41D409404
+E92E9D1A3A91127927DD1253048600359C26E5300ADF0134EB213D9C00853908
+789E2701FA5A137224A4300C6C9D1056401ACA043E5003E534A319854D289600
+C131018A086201B2406E315A1F86255096052C9222501A8A093D5717DE01AF79
+046C3B1BE1059D276C0E49CE12B45023782050B835F11F86123393004727C114
+6600436F3E00FC05B134F744276E227E3112E5203BA56C0061B105FE18B9281F
+F02F055AF522A512780160E3265506AD003EB86014AF5A057211854B13A55200
+66BE184712CD264500CC680E40AF00E81A51C53E1F61A700860CA11FC0704906
+614001AF07426F0F9CCE163EDA27790A26BB04D10840E51448BF0F3DA86C0060
+E3007C2D681F3CE812BF502F7918D11FA102279200309E04EA0C6500419F06C5
+5019CF0C87053EEE32AA0DE0571E40600C5701C70AB304CD490B970251248633
+137A27840047810165C8270A77008635C80D4300C4631F6C92063AE83F24DA1F
+A900C93C761E922E0D77E45D046CED32511FB622793D1189067800E10431D526
+6B2B82013916B520F52650C51BEC52212C4C97126800FE50128427629B003886
+015CE2133ABA401F92269F10C4005E4206970041AD006136F16C1B5EFC125538
+981D8C265A386701AD306920A6530D7703862A0879D022A41F8516602C511A90
+334FFC12C51AE95401CF0E50DD12AE3F00954933BF45196C2AB26E0E26F40A2C
+C9206B008C0265412E602604F412D342014D1AB22C06830B99005B05C04F27AB
+2068278E4605780EF91341DD7F006C0E8632029127008504F40145B6391A8640
+00ED113CC5691FA244067F01590D7908F9048126771D942C4CF5125B3089074E
+01C437056CBF0048D705C601F51F82267801FE36009C27CC215ABE3D016C04E5
+4839A100ED6605C3013F94007A09369F223E9204395A1A790EDB045A08F60087
+0531984934A34F01780CA51A50B408FD01B97B315A067EB626920058A81FD748
+37F72B6903F3014ECE0A50F51FB25100AD73092850C83D00E162126CD640AD54
+277F0D5FC003AE5A2279095302FA0B299726F027CD31A3205A34E10BB201D509
+3B8104E00DB3157D2646A41A2C8617348122490FA004E60E9E135AD31A6C1183
+00500F93267B2F00D40D8737147E2778215F2F41B96B0059AC1D69B50DE826A1
+1F82279A234C1FEC4104D6007A1761D74727F2341382236C114100B12740046C
+0EF236127C2F04850F98188724820E34A026006A3B2394321B61A505265AA815
+41BD0758113A0CA01DEB013E6C3516CA28A51F8B3450D300640A75006C0350BC
+00488527771F6D24B7501E752358EA0E7700DB5006F95C126CB65E2774346029
+7E05409401E931A51BF22BD611AD5F26741F50BB00DF0CB407D404501FEE2F07
+F401406F0054366101D00C63C26E115FAC1A6827EB05501D7D105DCC0048B638
+D96F1B6AEC38C1491F70C70050E21F6200D136601AB05604773EBB07DF045AD0
+013EEE770D2C860434971F841AD7005D2F9E1FD50D78059100E14912851AAB33
+C61FAE23DB143E982204FC0E55C0004327A900CB3E0452BD276112923D01CE09
+4500DD08B300D923AF1F51386606426A047D006C3908B902F911772F468C1369
+279B12790C8661278D1FC930AE04F83E1B863401409E002750C10148A412BF00
+9F043E9418600C50079101500A60009F043E269E0840C5305212DB3F00E72AD2
+154E841A7B124695125300D4671FFD4A00E947935034B3054D810455F33E206C
+3105C2013B6C0D4B8305602C790D52CB4E349B042A7BF2057837641F912F0A85
+04AD50209C28861E98125825880D6900F20AAD26C912B43E239E1BEF4A279534
+5A01A3045A38F80149E027A53800C00B53058315782250B80649DF0D2FD07909
+2F8E0E387F276C2FDF1B4DE901A522F827C61FAB22D2275AFE6C125FA60D8604
+9307A050124801920031B127FE0034BC23793801B00B832761013E04790FE014
+40BD3A0065D810AF6F2260EC049E1941F912A500ED2F01861A40DD62163F5F11
+E407AE00D34932EF3F00E00C4B00F02F4CC2411651A13A5B2776004984005BCE
+065A0B88006506D1401BF024A91D8634007706DB49126DEC2741D609A8006B27
+9218A55A143EFA5622DA6001F705862679083285277B006712842F72107B0A4D
+01C233007927EC223A6C2079C26827E9430A70208450078911A155267118CB0D
+B91FFA26A22890016023861A477E00439C083F5126DC00356D27841F964411B5
+00500BA101C233532A6B3F1297015A1F7E2769B95A2279026B01F83207C804BB
+15E2301AFB1F5035AD2C45C71DAE239C5E088100510BB56022881BA63C230298
+0066472B7912FC01683D0188047500AA073289215A0DB200C5570ECF143FB850
+00E2059422AF1D7F2749F11B6A0158BA00FC053709A50D65CD01AF12E32749F2
+062FE001A445306B980A77006A26F50DB107C80129FD162FD61CB46B0E5AB101
+D70A5A05D166279226C92F791A9500B60DF85B1AB20F9E05C60D47048912D127
+922079481A6C345005A0610986047B00E012723A0D79013CBF4529CC6A123FC6
+03500D79D34A34BA11E204CB521F4FBB23EF28BA1B691346C3113FD13A196B3E
+1F7904975A042D9B1A5331E8003FDD057202AC26CB0D3F64129B764F22861F3F
+5A2F6604A600226398123D5B058800225231D812821B3F6C324B92510AA56201
+8B00309222487B163DC1263A01F00981016A0EFE2679278601388227E334652A
+7B26E632A405460AAE00E22B96019C6C0D38B326D81F9A225104FD5827E11F74
+0F9A0436E9005A2FFB69002793165B3E1F90380E86340095077D2649E3389200
+539D00A047FA0BB226EE3A1ED66C0964AD0248966B123AA2401382317A1DAD50
+2601F03B00C505F20E9D374677BF3F046CB41FE627D168BD0441AE024F9D00E7
+0D26BD3650127B2559F30BCA04329F61006CB07912511FE822A7005A05D72250
+C9066B038600FD0BA5006C1F60E95A2781135012F4223FD24C026C2F640D3FBC
+7F4100930B6600D915497F1F842495133EB45005F801AD6C0060BF05E75D126C
+1AA20C78044DEF1F6C295A022D8800406101850C46FA233ECB123B04BA610CD4
+5A089F00E2042FD14214B05527841A7900C80B27591AD333007E094912013D96
+185E2FDC13521F9F41007F04E427C605387D1E65E90D41F91D4A2261B941056C
+2D479E3B13801134931FA713462177368A14C2014B0DC4043CD26908AA005A24
+EA12A900EE77013414B32240A634552FF501AD09D9057A015A107C26750D30F3
+0C2D722240C62FDD00501FB5270BAD04E210B467176FCA12AF23BD32047F0050
+78F02B50248E002FF9276C225A8B017D4A0B980339B9244B1D7EF7009E0C4CF1
+275AB579ED1D4DF300860A3AB8720468EF1B94227112AC5001A345007D2F0486
+07DA0131783ABD0DDC1960B800F35601DB2C5CC55401D9065A2F8526791F9262
+00318A2777129501792783390F60DB6C0560E90786047C196C264F32A11FC427
+E32FA51AD75A1B449E01A60879035737C86801844934611C81223DDB05395A28
+79015F9E1AA60E35089A01E91A4A7C04910EBD3812A51FD82D40DE50126CDA60
+0350346C2C8712A401380E278406387826A7630127CD223E5A08B9003B5E20DF
+2D12BF24AE5012A9369C13E2004B86019108406C3D0D772681094912AD279922
+F110B200FC4218BE551DE604C1345019C70556B91F4A25C92E12791FD424B20D
+E4780162400A8600610A833500B86C13D5375A169E1E830D30FE12D201984100
+C60450A00DF80049E11439DB276CBE5B1F750D40C415B334500160F5086A0079
+0660008F094726AF15C305DC01421F78CD5AAF12C7580DD30447FB4308A501D4
+334979FA0189075892096D01D72A600047690C961C3A6A26E71FAB23C31AAF00
+F4237C04630D6E0178276E330C9F4701790D86491BF7650D8632009C078D0197
+4800AE3A6000563F11BB26ED501AB624CA0349972704854A00F7274BEC01AE5A
+267720730DF35A27841E406C1F8A340A96540081074800D327AD7A053C5A11E5
+781E4186269F1BF921AE27ED01950D7D22531E78BE600848002C790131932280
+2E12965C1981129E270C406A13C53E1EF4349518A026F71ABB5426FA04C45000
+5A048601793460179F2FE51FCA39A61AD203B0690530ED27B436007B042DB425
+E14812F9375017EF3152129E34D11F9749006C0679346C1440ED0F50E43D2093
+12AF003D6340059600C230A43D129B09E800C25205AE692A0DB41FF5229E1253
+002668DB00872A06CF002FC70D5033840E791B6538D80041A1680D4826FC248F
+DB1A49E8006108AF6C0031E0276C0061CF21A13467008549035B3F0087087039
+02860E993E1677CC2F46ED410CD850056C00854800614309563F23D75B11771A
+60DF219E45007F03792B5F1ABE6801850AFA016E0C770439CB27AE20FD00B25C
+267E00650BBF046A32870BCA10E01A4069075301D62D7722953A12D82600EF76
+2F5C01842762FD3ACA401F6C26A24935A953046ABC0141D10447C2185A32F912
+3BE2009E046C11003C9B1FA534F61A42C54D0BA41FF339048300EB24AB1228B8
+0DE46C1F3EAF12D650326306A341127F0D5E1D950138CD27B3370BF626B536E3
+129D0140BC009807523D0AD55B1FA515CD0086043DA11F6C269220B827F55D0D
+6A02841292390C9F1AC422862C7726E1197B226D2757B712E7279424AC014063
+04913149A0153E04CB5011C4014C097903B30BF301770C6320EE361294246034
+8601780B9301AA054E81173AC450AE70056A0D7600852704873F017A0D53B51C
+500E5A04D9791B6B3B05CA5A01894400BC1DDD2700F627AD00B929488612791B
+50A219840D6C00781A7C0E6A3B26C912B16C2240EB0850396C27E50E45CF04B4
+375905830031AA23D72F630453CF0169385801FB08A4005E32A2008A043B6000
+7F0A6B1058BA14F450017B0859BC7919378826762DA215512F7E189322E0137B
+00487707E600B31FF327BD24742B851B3EBA6104291245E221C1279F1361ED0E
+64CC25AD2D076CC92F9A3950004ECD12A14822ED2F1479278301518D4D056F38
+6910F9006608EA015F3F04DA1FAC2DF327AE1EFB4F01842F009E0530679A10AE
+094F901B5A2F7800E13D12C354087C00A126E01F4B32F205A53E127E1F55D405
+46F612CD1D9E4334C41FFC30086F3D1DB726E31F4A0168F100AF0DDF2364E900
+44C43185043EB529CC1BA6395A1174078000520FCC25E801530EF26BBF003E86
+015A09D04022991935770066E33E017406F616A72E017E3204791A61B508F110
+3CD10931C019D7049E4B26C04F279D11C6552780074A0190084904873E17F54A
+12BF772600F420853305B200EC10491669A4401DE6345A0F6E097A0086117919
+CB4D2FBA0E40AE144F78266C0DF1044C7900A245C800780D6000A710D4260B79
+1A82008F0438A5125F0049AE5A096C01824A16952F45BA2740E0620079139827
+891F3F50961B5A33DE385303B80055E812BD1F5026A6247A27720B62FC1F5FDC
+0FA900376E2355A512489E016B275A3F159234018421753300A4235AC26C2658
+CD6C21D85C047D355301D348376200DC412379265ABC7F01500B86019D17F837
+AD27C726B5215F00960450860129960141B0008227A912388627045A27D93598
+412A8533984329CF384F1FBC56088326F912391AEA269B3405FE01D30C630493
+3515B430500ACC0179092706F40DA1009211772E7B0C405D049200850AD600B3
+21C43808B00040862650E2049800612D7C2053E70CB200DF0555D20EB805FE67
+0EEA003A0DE100380B9D002EA21FE6129B1AA704C4551E6CD4089A01371ACC27
+F02F612277045F01820D5A0344EF2740DE133AF15223E51A36D91671015CD218
+67E4129F026B0CFA05630150BA04650AF95C0F30DC1B95056AC679005D11D767
+2279278B1FEA4D059C4204F76726A431E5>
+ >>
+
+ /Magenta <<
+ /HalftoneType 3
+ /Width 167
+ /Height 167
+ /Thresholds <
+2750BF12AE00DB2CAF27ED016822981F3E931A3AAD042CCE0150FA12A22FCC0F
+5A008605953F19D0279A20673C26FB1F6C2F57400CFC1B62375A04A46A005791
+22811D50E10078174999207926CB340180045ED9173E6000B11AC52261E112AD
+502295278620508E02664501602282276E27D0116202E0690FED5D1FD712BC6C
+144925B51F661391228519A302E6340D6CA53C01790430D82254048F4500C407
+E3309C0477228406960045703C1A7912841D3DBD520AFA0450D70C54F44C168A
+256B376000459E1FB925DD4D2688106001F00EA95D099206CE00BA78013D9301
+86255127DE1F3FEB0AB5043C6A0CF2013BDE0A880355B529FC1244A007E62747
+6C01863006810135C6035A0CC60547E90DB834ED500CC8018B0A50BB364E0082
+28049C31603E007BFD6B0D54A64304BE065436611149B228055FB41EE54C0778
+A23A12EB3355396000564015C749F41B3EE2059B4901C7064D96043177267934
+00A02701973E08C300B31BE013794704613B00C40340A5501A790141BD336722
+8D1A2D50B40DE32DC4019408770160482C7812BE30508A1F62442FF012751A4E
+94002F7E228F04F83D13D5521BE969123BF041267A1A2F7F1F72042BA11F5721
+E82F05861AD12250B74100F326AD1C3802D53000F32D6039FB00BB27800077EA
+1F52390B9D274201C06304770CA511B81BD76201380D5A86216A1FE8315838F3
+1841D800A20FB35D1D7F4512DA621F770D53326C01E7349F0D7A1F64E30639B5
+27DC185400E83A0447ED12683459156C4012AE2FD711A800F7561F942707C300
+B3056A3F00D0073CC15302A60D5C269F700038A4270AB2730063B601DC5E009F
+10CB78003BAB40016AA626790797016C248F0B850450B8551480400C99017D25
+6C0A40D8223D099900CC6E1A6AF126501F9F27DC226C27860B32B36CA13301C1
+0DA500930D78005EAE126A28E0052FEB0DB66827013DE92B9904A8540D8215ED
+2AB114522F7C006B0D8622810D5AB36C008107D000A805F95026841C87257E37
+087B00DA48326C12861BA85B2685216713F21A3FC701430FBC6704895A1F3F9D
+1639893E13C3325A401565F4126FC33C00FE125336E812C61B5A34D60E72009E
+22C14F1BDE12A519995B046ABF4A12614006B700337A00D0087B008F05F90149
+83052700DE5A2776346122D326862F02822690144D9E015F390079B27F045A24
+F23E1FC122510190087500C012F3309A01C72FA93E1127C3269D1F406E2A601A
+C9005904C40C48D322A5129C1AF65024D501339D0FE00178284D83126AE52950
+1FFB3300DF064DD4096B04954C01F505AF4708990449178D2761BF0D46620447
+DE15662C40EB1A77128434477800D43B1EF12A01A732F9268E205AA61493345B
+12BA2F46783DC212EC5F9238099F00F6088004A70ADC4F1BF50140811F3EC01A
+FE0A400E50BB00690B860047D46A2149F746268421AE1B3F5F047700DE490B63
+044AE409BC00790E3EF2355A2797025038610458003CA40C4AEE056C2D47AB04
+D300AF3C0885007F0C579F2686122CA51EFC3B0D7927861A2F812239E05B0CA4
+01307D009932790D8500A207793C04E500B20526904D04AE0C49831F6C0C8001
+EA3F05DB490CF4395819CE260E6C2F4F1E1153D013851AAF2E47633A139D3F0D
+60BD04D56C038650266EDF1A3B7B27C74F2F970530B801680D9D04480050D612
+FA264E1A9C32F638A4228C1F3CA1476E0B7800E21268B401EB2BBF7912642E7C
+1540BA007B0E406C2F5A1F9A22D12DB83E116E01F35B00416420B224D10150DC
+00BE6C012CCC1F41DE1FB526F900AB25C41F5027C95126742763EE3E128C5432
+9E12D200B2193B6A12862F01792485037E0050AD04D700B27703406127426C12
+FB01B852006CB1233A550D35AE4012BB31009226D9073D02FB1041791C8726CD
+275FE7790C6C3B0A84B5620686007E0C6C0154EB0426D42DAF244A90280D861D
+751641E408B300C7601F53E726B519FD0DC301416C066101DA2FAA402379CE07
+91006E123E9E0E5D3D1B9E78004F860551108718405C3B0478F1016009B00DC7
+0A5701C62700DF05792474275ACE00BC2651C71AAC12E334A20C683F1F7E242E
+B822ED04C500964327721FE732078600F378165A0084045AA31377125EAD7214
+61C000DF0A5A02A2124C269F17B754014612CE235A1AD727B535156990016605
+813904FD4934CB059E01357920863D01900D3B70065A017E2656EB129F22934B
+14771ABD043C5A2FE527B8691F49B405EF0A4426F1126ACE3A0366B305E46C12
+418A1A9436671E88219B3448861F5036F0049B0D418F4B089527600042641B49
+EE16BD5A08FB7B00990E874D315C08CD049F0D4BC81A653E05CA22ED27D11F41
+F704B340002B9B1F3B924534AD40317600C504397920E32782013EBA4F00730F
+5CA60A31BE1FE80FBA5D187A00644627BC5404DA4A18FB26AE01D037AD4927A2
+0B3E5F00F53F08C000690E861AA51179065000EB0479276033B369049426016C
+ED203C540F26BB002FDC4901F95000D75004FE096BB9015A3E20E304371AFB47
+04E036B5049C002E8F013485260C5519643F0BE019A522684126920147D82091
+287911620886015933671FED5A04E20D561A7C00F806D53D1F62F300690E9F1D
+EF7804328722FE0041DA461183276D31009E27AD0CEA106C1F8F3106802C7512
+62411B6810E0008618B134541D7F2653ED3149DB004F34C91998355912D20084
+163EC02F4AA541099E00C87B4834A26105279E13318440108526A5122F940DC2
+6C1466B77801388215770D6C27C8610F54DE01AE40E835CC01A42781013EEF00
+BD51297E106C00A5093C9B4025B71AD4009E0A368923A701E90F961B61127AA5
+085027CA5805503A1464DE08A52A7A2701975000AA08CF4312E11A51329900F9
+0D50CF129F0450BF00EE057A1F6C2FCF048C0CA701D435049208276BF9025C38
+6C13AD3046A00EFB075F00E30B298026762E01FC06530EAC6B0270B4042AAD1A
+610047DB1B7E26439E00491165AE0AC01FF62587063DB840226C1F5D1277257A
+1F6C12D45A1B7F360AFD00AF31E11F53C500E5500D7F276E2750BD00792F6B27
+712749B950012FC01295032E77C400B0214179129205CA501AF83F1E6422855A
+016CA204446328409B007827DD361A85259733C40493267820E13266129B411E
+C6780B2E860DA500F7087B015A3F25A12179136EB91AD911A85624811FD53D19
+EF3E0D64E2014DE83A79055100F3032FD227E91F502B603E007A13E521760086
+06D204BD00AD0DF3009E3308940450A516436F05498B02693814963D01AE05E1
+1A6B3E12C508B004CE006B22E848266C3649DC1A3F601299012FC61F54128639
+0577B601F4043BC53F22D619B001C426551FAB00774809B74501613D0EF3005A
+4705864800B855013FB4601FDA23501F9527E61ABC6C034CC53948055900693F
+0CCE009E4B00864D25C52045930D7712C527B2601FAC5A0D75067C00DA059C4E
+33AE01640DF327A532921F662D5339612749B922E412622F9C22C21234FA1F86
+4805F2532278108803FD5026821F5834970C86059E00FD07A6009D0CF52D47E5
+51006CE93B00AC5D0D338C26A70E600690007B24854905F05F0C9213F7305B17
+E812B0521F3BAE12BB22FD2D6724EA12500099053DC16B04620D820032DE0F5A
+00F62FAD35EC1F9227773712B42F079800860628B91F5A006C0B338508399D23
+CA2FA0226C12ED045A389E50197911460050E307B504CF0C790071277B01D608
+600185500BA201BF2C6512C835B145305A0DD8003EF91346DD19416E3D158122
+6C267C018C076C0EB43E0465D42240E04C146C2D861FEF2F5312F60B35951239
+CA237F057400974E287908C86C277F005F07950D7B048C21D1264C830133DF2A
+B42241951F8627991F7A0184086301B308F86C0465E1125A34F56A013AA135EF
+41D01268FD045001840E49B44426811FD10030C90457FE85263E6C1C832140FA
+3B12C6258B1C3FEC3B1AD329445C0F92008549006107D201A2279C5D067E0160
+30B50DCC5227D60FBA325A22C01BA14A1F8C2F0987027800C207DA006F4209BA
+6C2750BF00487A015A27A522CD410CD600674001E31B3ED83A1FCE27A12F770D
+3FE81BA5430B860150CF086A01B60A6012D01647C24A266B321AC1225039CC1B
+511379DF49087201268D005227BB5B19F9045A00C308A20E4185229536130AA6
+01C95000A16A015EAC055900B451046CAB009706E23D22D0310CEA279321791A
+6C1240BC24A72086013A680492003E6004E24100613C01F011A54915BC296421
+962750C7139436019F07752BDD1AB20FE6018A3704832350A41A870A50850379
+4A01610BF201AE6100740E5AC31E3B7C1A49F038503AE34D288B225A0FE0009C
+430A94007C057800BD400D27CC219F502FC51A7C0F37912779208F35682B4FE1
+086901B25CD624742F0EEB341389205038F3306B269E0D3364267F13A8500469
+9F1DAD0D6636C405E6006C3B08D51454F026B91A4CF817920D7E34D50D94296C
+00F6355A0DE9500F79043E6300D65B26E21A620485276A336D1F59FC17B8320D
+F6263AC519AC12ED35B151156D3616BA27F127006EFD04A4005C0CC8047100B2
+06F40386277B12D55926F71FAA279534026D9D00600CDE0440A500E26B00A409
+D64611F8017816A427EF1A3A007A069A5A2467C507DF017D0B920EDC194BC60A
+F0013A6C1AFB12503F0155F6004A81268A1EF34F2BA40979005A349A096C26CD
+1F9726791DC624851A7904934101B92FFC1EB131511284003CA2400DCE00A408
+C00E3F7801945C009966007926440586002D9D22CC4604780948B140106C28D9
+238627A71D41237C30701AAE04613C018031630EDA095CEC175038B0294A9213
+6A32541ECA123C6401AB1F4BBA46006D0B538DB327F63904AB003E582DA31ECA
+225A0041831F752759BA008A287A00D8762E17921F3EB70B60049400673348AC
+11DF0148B244004D05FC01500A6103AE27E237199D2481006A0C9205EE33B65A
+15FE4C207C29692786004ADC1F3EC01240F1115AC26C2450C70681005A991FA3
+6B042F9F2085129E01501179D85A0E9F00D33345E71FBA12A001852C8B2245A5
+04FC0E79003DF108BA049A304EEC1A762886055B22D82697341021721650D912
+851E921245650448B135F905AE00CD0D406009C526A43305BE4409DC015432CF
+4212BE1CE4042E7E258E1C5F1279AB59216AAD39DD5012720051CB055A15A827
+DE1F406C024F0979008A3D0AEC03D21AB42F0B7F055086042E8F01490AE41268
+3E1AFA0D31E1003CD66006CD003F6331F969054900EF1B3C6C0EA50079054925
+C7195000AF063385269827C71F5D421A734501840653D00040E90D9F057E02E3
+5AC40BA700792849F409BF00E9327B016D1260236C31791FE33D126C1A855311
+995D277714790083354D840D6CCE01680DC427ED03380BC02F00860633CD26B2
+0C6831EF4F0A85034AC713A421D427AD1CC35A125236790560AD26EA1C46D361
+26DD1EA3349901D953268441128623521279275AE807AE0026AA1F822760B805
+51218E275AEF6A0D3DFA6713D25A006F0A64057A019F2DF612D422AE2F0D961A
+60306C4714AE3F0138622E4E1BB803346D247D0D9F16D727A52CDB03A3089200
+57B504EC0138F12700A406E922AE1AFA0128AF45123FF63B00841A5BD36F1F4E
+EA14479B00671B96267F0139C3223F7900672D780F660682012774AF0049F612
+3C6B009F0939009D076B41005C2A790CB201CD5007B701EF1FB00D3A6C138A4E
+34C4089D01417AFC3E0CD8124700B3770426833F12E61BBE34E327B50D6C015E
+3779007D4935B501BF12F62F661A8708FC01CD6B0D5B9501AE2F41613D0A8400
+79145020F9267C17477922AC5B076AC73986335A0D77269A630527B758058650
+31B807490093107727BD1A56FD3E01DA0EAF6C005CE612AE26F600B437E73049
+D8401F85152E9D01CB58226CB3751351B522FE15B404396C4719932E6C344980
+01921AC64026E20C723E1AD1123601AC5D01952A7F1E5337C35003982F600186
+12822250CA279D144AC312FB0477275A3D049D00D84AB01F7E123BE43F18D750
+04F900C15A1FED0D3EBC5A049F2DDE0C3595102F891C4E126000D44101C3113C
+EB79002C9F1FD812417927F433B604520D832D06864E1F7935129E3005861C84
+123F5A046B11A02501F109B9571F7E4110FB280D3FE83B027A086E2250EA11A5
+3B00F80CA1043EC92F57009F04794300EA51256BC07615347924CC04DE08A600
+2CE01F8126A3205000EC083D6A00E7072B9421500EDE00A9621F820D27005F32
+A1056C00A02A12861D6C2605962F529800348110680160CB004FD901B405FE25
+A81F952F50890052126CE0125F0471009E0A6C015A38E46B01D74816BF4305F2
+501FD24A38C90449D922A81F7900508E4C346C00E10827930049BD01641AC527
+AC30CE01624004D778205312DF1C5B0BF5472C6412B53160048E00490B55E91A
+AD126026861F469C0B6800F6073FD05A257F1CA8411EB065033EC76A1B7B2D0A
+C83A529540DC0448CA1F872660A9074AB03AD14401CB2248E126C41FAF40267D
+1F6C3E227F307904690BF20447C820A8350750B036E62A4AC921A21988002695
+129D3B008A2E61017C0977015D35960D84013DFA31BD0627D712A1344EC55333
+861F9D2786115A00820E791A912A550969BC274D96007919AB04D3501B810DC9
+28F426A32F07870040933B0DF26C124CB9491DAB7603359700D80486325512D9
+6D013BB507E7502701EF23860F79225A3E08F70036DA2279016611864E04850B
+77003C790DF805B30AE65000CE0F49C94626801332820342BF27008009AC113E
+630DD2274FC8375A04F05212D122AB279B26EC1AB1005027C85508760F429A04
+3F5D01862103DE0C5E06F30147D7501FA02FF500C022A03300860538C5258D0E
+753701FE279B1849068602D0632757F904C45A0140CC005C0486310C62B30F79
+2D600DF200864526911F57336B12B4784A0526A91AED01AF701A479C016112F0
+27B51A34FC27B21D5EE80450198F422D621DA527971F5A00B208E0631AF45B18
+6BFD1F64269000F050047C08600DB430662694046C0BFA00460E812762E50578
+19B422EA61156AB11AF70D4097492CCB396A31970535E2035A2585156001EE40
+1AE46C136129DB1FA75A0C770063B85A1F783900BC0B3D6A3924B11A357D22EA
+1145DB2719FD4912AC5022A23501A60AF2009A0487430030C15000612F891239
+BB691331B951099200409B0E77019442126CAA325C00C803860C7701ED179127
+773900932F01860D409D01D61A7B2340AE1FF9248401790CC41A3DA253146AB9
+5801CE123FA02F4E008B3801CD2F007B2462B626058000931CBA124085179B0A
+BD0D48DA4E1295603001A5087C006B063FB41FDC400A2FE10E9948218F1DA200
+79056CD9069F2756AE00945A0138CC00347D0550E3155A357021DB2811FD6A0A
+E237B51444D602540CE278411F812650DD04551FD52C06BF3B01EE0FA1236C14
+D934582F6C04D8124FBB0D48AE24CF05572F6D3C0CA5016C3B009F2CDF20A500
+4AE60034C521491F862C77095A04DE6C0D56A32250E412A9300050F119AF0F50
+0060FA00682773347A006C05C22606D0431FF634B027EB224C850527A56E0066
+1AF15A01DB0F49E84F102F851679013A693F0DA06C1F61DF0EC01C682A8512AC
+400D549F3E177B046E08790050862696003A05E801C90B622AC06D094C97501B
+8B27821F4AF5394804C109B2502285015C37D9137730A51FEB04BD5327DF14BC
+501F78123F62328712417E077902F308B11AFE23921228C63304821A6C3E0679
+CF1276376027E17B2F0BAD26D201F127B41FA4324986129A58016F0D83019410
+3BBC6B0143C5279E0435822872267E1FA54100F327C01FE51BC4330988054379
+279200BC05EA015BC3006606AA2C9823F127BC320EFA1C4BBD6C226A2FA1167B
+00243BF5002FE1125300BB0760009F6B267D380EA127FB1BA1008D056500840F
+436B0086073F600EE80155C904F7095AB723DF27942968337F00AD3848830065
+F50EB604C7661F405A01D60A780425A54B1B8B12501A8B0F3E5A0CFC006C3A22
+9E27D71F532FE5005014FB32117B1241CD08AF01C8075D03C0630D50058D0A6D
+0149EF26B82F01FC183A564026881F3C7922D41A46005510831D6399043A860D
+2DA70E79013FF243B7811241790565D544347827BE3F12F80049E40057067C28
+6027F121C7502CB418F933499700852792340E791F832F049200500CA900D70E
+406001EB0AB31E4F395B2E4E01E909BA345222C15A400ECD3E016CB740046AE8
+02812750BA03ED0C470066C10444A4277F0878AD00E3611F6C228C1241FE2D50
+1C79AE3E2258A42782004E129D5A0C6CD512AF62089E04F2500172C761A53C01
+DD063EC46A01DC4700FE1AC25F052750045BAD189D3F0D9204E80C5804862297
+1E6134C24019DC0B711181370992013C5A12C522D91A6C06AF5A27A401D1501F
+3BC05F1D722654C9129D206127940BD8009F12882679148D047F3900EC700564
+E73A0060C9233B9F1CCB0E61401F65BC7912358B186105C7551F3E522702A80D
+EC50367900910BE031006BFA0030D9135FD070033CB44004770034CF276B1536
+AF270C2D12D15127A316502691199E5A2695331178A91EE03000D12701A82666
+2A7B18DF2F5A0CB8028210699B01AD39BF0349E41B67D2028B0A7804A12CEE41
+00E1123C6A0FF56C133EEA05A201327C277811D5016C277F25FB3269009C25F5
+1AB22648139622501F94300692005F44017915AD7F045007F35A0AD02B763E00
+D60DB5804B2F6D0027BF16A42377045ACB2712B2500495264822E71D6024841F
+F85A127F00A46C0E41F77C48098D00417700E708603B05790053E43700750D89
+611F6CFA4A12CA01A3386801CF50279221D40426794B165A329F00AF441F7529
+A8263E6000531981265EBD009D43048F0049881FE15A07F100AE36851BAC0D46
+01A41FDB2B770186076AA13B00C408AD0DF74512D418B12FE43D0027DD22A029
+1AAB4A00F41F9A26600123FA11BB3E88046228D813B03D0D7D4107863E0CC401
+8608A000DC09A63D01B922E43004D76400209E314DF612CC5A1F40B813D727B6
+2A0764CB23B30736A10E3A0086315312B9208D3300EE07662D44F73C0DE8007A
+237734049D0DE40063FB0DAC35C7059B0A46821A2FB125C8340F7A391493223F
+690448E8005CCD760C5104A90E5F2FDB3F01FD5A2779286C1FA5502B860A6C04
+5AC4480D6D004893013785126B0449E63B6E054467194AE30C8400406C1B9F01
+D84D1EF5531AAD34426C2C48934F1B8629780D509B3D1FBA5301C005277F2F04
+AB6C008022860D6BAE1F3E58154EF1024979B74F08EF6B00490BA86D1251C700
+A450049026A90CD91250F4304D22861B503177136A3E1FFE2905DC610D4E1266
+D90450BA004B9F1AC412348E234A1338C06B234FC1125A1F84310CB700D90285
+09790048F924A72C097B35B53AE21163CA22AF2FBF15780FC631AD00D406339C
+2653BB01EE2E6519AD3700922D6915FA10BF01370DCD054901AD1A5D129206E7
+6B196FAD0D4686233DF3115001F83F009104EA7D016C27CE04341F9C1A297AFD
+5C1D3CB3401F771230B91C772B831F95076C00C75A08B301C308DB01B350006C
+A73A017AF177002D9622652FD7055A2D775006A502E47B3E07F1003D7900CA0A
+9C4A1461385422E426C53704771A9239F7016B08508632067701820A5F299D01
+8522792794500FFA1A68345612993C04804611DF057800502079E96C2763F558
+25C900ED49350C27D738005EED01C30D5634C9385B12D32F520E26C41B921240
+E6710041BC0E3705D60279099605DE7B014709CA01602FBD1EA012377927841F
+40582F6F229412491BC2400627B44201FC08760E40F800B10DF61A622743129E
+27991EE74026791BDF368C04B0410165127AAE0EDC0068169D24D52700FD461F
+DD274FEC04563F17F40D5D01C63C008605A509C7005AE70DBA631F51C728AA61
+054900B2094612852F8D290285B25A0469B91D41791A77019306821A97490ABD
+7746375E00B464173CC9650459AE6C235027F3335A3F1F61EE6B2750FB005A3D
+0453D800F21161B604EB0CCE043EE7780F2B9F470C6CA31F54AA2686126B217E
+2750B500D35B016A0C6E0456AA056900A410F4199234A0500152345B27C85104
+4A129E40125DA40D950035A71FD664044BB3471F7B502ADB1F71277F1F406C3B
+00903401820B3DCF13861F9023D401680D58C426003F9E1029950C34AF26DB1F
+6B27B20132852700A405FC30500A8E015015DC26480184B600620CA300BB0D4A
+008E123E7925E77E186C2748900126691B82275BAE26005ED10062ED18328300
+3DC60152C73E00A00437841535BB27DA2F881F3FEF2286276B276D0DD9062BEC
+21BC01800A2279C05C0475B600307A1AC5690C84003395267712ED04B8124099
+01F80CAB029B17EE23A6471AF5256C2F50E1006B34A322FC3A0876DF154BF948
+01D86000812CA703E30F5AEF0461DB1A6C129E23D328AB2679019E10EC143C7B
+22C51A52259C27D620B608A3044027C1059C0A3ECB3AAD48009F1F096B983415
+86270559C111E3144C96270760DC126CED0949851B7A00A208C5015C3C03D207
+BE0085275E891076133DAF45EA3D0027EF2F1B69E7065A401FF02646B70EE000
+3A6A27498B0060462D6537D02750058509D75A009403BE07359D0F7B066F0060
+A6210592260086385017F4095C1386349E1F3FAD12502CBF550478006B07F61B
+8A2F7F1F6C04E248016CFE3E0483065A35691FCF7400623550D3126C007910E1
+364BF73002DC4D09BD7C3803782784043AE979192F8A205431B100FD10551767
+26860EAD761F50355A1BA70040B500F1790626621AAF6C0856C3034C37AD007F
+055A8A01791A50A405D40B31F122BD0F9E075700B46627762041B812551F9544
+1AC427E127B212317F5534C06612CD059F2349C5460065057E00509206860038
+EA20A41385345E0BD80050BA2C5A139E3A126FCC1640A500E2500D47B20EED00
+2AA21FFD4F2E6601850555A51A92264401D7501FB323CD0D4700B84D01CD0593
+0E742548BE39F5491ACF420C65B201FD3E0CE11A6332501E6BCE028E0C349912
+38921F7B23D828A2123CCB2741C31382216B9F088101791FE426872F0DCA009D
+042F77DC4000EE5001680C790452F01AD2014F0879276C2F7C125421FD2AC627
+E0203DF91748980C502FE04000C55124A236089202D15008B400305FF010792E
+0192321A85267B4C06603F04B10DC122CC12783C00F9752564078E00571AA071
+340C954129671BE02DAD016C075900A52F00EB331287217E4E2F9D05CB0BAE00
+3F501FD85301DF5F09F601980A5001F924610693005E34AE003D5918D2395401
+6C12FE49395D13EC690B3986266011A62F971FCB3C016C0E8427EA1BB300E504
+AD01770B7B0D690C9C015C34D71D65B8035A0EA64604790C65F7276B3F268621
+4892042A961F5ABC17F45D059E12DB34BD1B8A27791A3B624104BC500D2FAE14
+E94836FB68043EF3601FE500B552046C0C871FCF277D135A94227F4809C300B4
+11466C2284299222F9760027A33A18842D62156BB53F1B9E12E64D2DFC024EDC
+12B72F5C1AA332BC3F007905AF34501FA8014FB0047A26F80040630B9F40B821
+9D015037851F6327D936A52647B94B28CE1281058C00357A26841A30E927BF19
+4500AE0AF00061E21BBB5301D708387F0141C620490285006C09D601499D00E8
+296C1F9E5A007A270AA4052FBA12500184127A4426A321D73550019E0BE13A08
+B701DA296041277B03FA3E01DC0D5A043AB56C0D5AC500AC26E3340E7C4A046C
+3D0B8511A61C4179049100F60585095FA51BDE0E78019227FC123ED11A871259
+AD18DE4A250575115FA20B48CA0D99068A00E6045A0086096C22C62641F10BD1
+01BB610F85003D9F5A12781F983401760C3A6D26854512AC2F0070B45A22F932
+9E123EF4147F268E10DF053ECF0DB36C204286007822C8279D350AF7008B4112
+F061256F1F81492761127704EE08CE511C66A0174CB97F12501AF204266D0D79
+0158C200DA30AE00CC1F6E27800C34EB246F125026E2143084269E27CE154A05
+8B24683B02BD3304862E0082FE33C63F19F600396E225A146C328922F01E45B6
+49015A9F1F6C277639009E1F54E30639D128B61142C62680EB0EAE00F8661F6C
+E90E3D0896127D1F5EAB275007C201543187186C345200D36016DE2AA2085A02
+C3771F3B5C06960433C700B205F8009838A3521F793600B107317927003ED405
+9E35449A30D2219F1338862277195D339B05E400C0671649AF39C56C0044CF04
+50007F0A60B46C1AA000EA50236CF10D60BE1467005504842661A601F12FC21F
+A412792F98005E0FF538068600B411FB4927CE0476257D016F055686066C0034
+8723603204C806502778E1285000C8085100A16C2060A50046B601F11A9B4002
+952683133FEE2750006ACC18BC2E48861250365A126C1BE1022EC614A86C235A
+CA01E96E1F592C6A00C95001624304EC5005BC0C50F00E653E228A4601940660
+014D20AA69103AF15A1EE62D003DDC0C447808AF00377F1F50380EA427DA0DB5
+431A781085016005D1024C12DD27A01F67C51244623F0588126A3448AD1A9326
+F43819DC20B34C04D10B9E49399612C1004304B666269223EB330EE03413FC21
+663B23810E31F50D4A01D165057A0FA63904834F0DE60068DB19A532C4500D40
+8A00600A2EE4143C93410BAE04E51B861228FE12B332601F792784013FA200D0
+510F30F627C81AE70D7F043DB9790C27890447C1205A2FB81E6812499D04D901
+95EA23801F6C3609D227B2264BE946276BC25808740482015033EA079D2D50B1
+01F00A2FDA0E62006C9F0D3D5A1B81287914DC015A347F22AF6C2E0DDC017912
+8541009449097904D54C01BC691F5AB46C0B33AF1DD94815FB3F017922A53908
+750184042779BC2447F1419E0086045B1282257933B008498B1E94007109BA00
+F822C9265A2E6C04B76008792384309527FA17500165C632AD6A0985047E003F
+C82EE71A5C296D1F005A07AC00E356036E00790D5A0A92014125B334E626AD19
+93227D12D900387C228E4D00A227C431035FBD00FB0EA7006B27A50DF504603D
+16EF4B375A28D205B95A1FCA2FAA3F1286355004C400471B9F58008130058F52
+1FC527921159BA27E62041FB01570F9627046E3F20C027FB00C347015E39D900
+6F253FDD2E49861278049209E1149C381EA5145200B2075B009225A41F520040
+12F337B213F85A017C0A3EA512C7433AC24A2D78123FB033FC1FC427AE20F816
+8800600E7830CF005A04AD2162C40D5A04BD401B78134FEA402278276433EF22
+871A7B2747D00586007F0BA50445673C047A0C6D005AB406E9128D2E7726FE12
+38E22260BB3D009A095F01F33102860C5A9E187330D70069B512D9590D991E3B
+6818EE117826A912C9500D810340B534671CAD227C0050ED0142D16C1249C146
+28D405740DD979295A0049933019912550BC045407980D6C01F31A9D23690C42
+920481007932510DD9299E01690C47DD4C2779175031E03A1579FE059D016B0B
+AD08CD019B095001CE5000970F6924AF1FC42F761AAD12F722AF26E32A1A7A27
+6D22D80D9E01417E0D86015011E72448D64B227A441FB1370050AA0649851A3C
+6605277E0160A6048A239E0185053E6001AE1BEF105A00E44F015736C712692D
+8B0527DC1F77127A1A3FF8335004A51ACD270D63B006DE006A34FA2F62E12690
+277C01D7059F18623C13E24807A169237E13FE2087276E1AF400A5088500A45F
+01275621D427901F3E8550176DAF3F102FBC1A39FD3B08604100F35100782C85
+016005934F00BF08A400832751C504AD26F31F8C27750E7D05B400CF60056CCF
+0E27F21334CA01F646AC34E81241D10C5231E11F59F51A8F2977279D1F8F0D26
+74FD1A499F00BF0E3D9A006705EC01B260008416872677056CE2013779279A21
+8501A415005808AE0E405B3047BE00D2502B1AC83A00AF055A36A605C101410D
+922AE61F6D1240CA3BB479115000E4600430E6270562EC790C5387019E49D612
+8B1C34C52699143FCF4712F0433161385818E71D6A3F17792A6C00C604B22A66
+12953E14EB2F1D9A5A0065A30C862C006C094D86002776B9004A97133C6C0ADE
+005006D63948BF2F00A707307E1F53F54B34AF50238638129D22CF00E90EB53C
+1D47C412510CCE1A4F277838CD491E6ABC11ED0155316912966C045BF21F40D3
+00533E147AB75D227901A72FF8026C0C500439B9692D15BF770C57C41B4B003A
+D6461E6C033D6A06B45E0D6C02E1590D813C049E0CF904B74601790FDF5A01D0
+0CA33060411AE235562391004681043ABD401F752350B81CCC213DDA652F1286
+360AB200C0502064C636600178089641126CD8043E97012679092EC8145AE407
+522E6736435E0079A30140F360006FD804B50B6C04FB3B007727791D8A08F401
+34BB270A51941A9C0DEE66254A01C8123D610A4A87279C1FF27E260597440027
+A435008226B66D0529EA27BA1FE3285001EB1FA03600B31CC75A247E20861277
+2FB33C00329E213D6512F1007807A003FD0B63BB12DE267907E500D011793F01
+95075503F84806D066267B3404942F048517A627E91F5CCA3D2261E40C47B61D
+E06001A004306CAC01C008AA23FD1257268C0E27872D1061419D21874F26981A
+B40DE627AA229C501576AD38016C27773200D50E802F4ED91DBA3407DE00623E
+005BD90E6FF6470469DE1294183EAA6500810A900197197A2D73085587267200
+2EDC015033E10595095BBC6C0D57AF04864B27B951206C2B771A3C51019E1150
+2A8F365604FE5026BE12A31A8F2F5101EA0C5AFC12AA4122F50D8A008304500A
+860151337A108600397C2042BD270D491F7B1486046C2FDB044CC606AE3CEE13
+00D83E01C9076036860477003F6C05E2002666E911CC03AA431F55F709760083
+0467A01842B20DC61A40A73A126CB41F3D5B06FA01500FA4163A614434C705AF
+26D71247F50AAC63196BC10041661FEF234A14FC0040DB3A01960934D300AE26
+E800AC6C1F5CC5046C0AAD2F61167F2A79245000AE1185279A1F458100D95A01
+6D336A26AD1EF127B31AC300F12759BA0BF873005082F05A03DF4A35CA174198
+1A6534570176472E5C17841252DF0049C1125AD20DA03049C906318321860D6F
+B3042749B54623E912523286227B2792065A01CC31087F01BF442C7921E0244B
+D100F70C5081126700A333156C380D9E36109B1ACB50007C06922F851F6012C3
+1B448C177A0D861279263EF8003DA41AF2228600AE05ED006BD43B22E31B4900
+B708316D0F2DB323CD12DE2F900069129227631884042B94123B1BD9013B1198
+31017707820050B400F61FA822C5A204F52FB13D217B1B3495244C38611A8412
+42A5005A2AE03E126BC1015D0D952AA900CC05EC014B13FC279E1F55F125961F
+860EB75A003F9D126C1F953100EF2779215AB504CD4900EB5E278001369E27D0
+1C6D04AA0B782E50F9016031DF384D09C8054A920D604500660FE0385B12A740
+0C9E5A0470C86B2560CB1A884904940850027E0E3FD05002790AA234DE50005F
+B079472672C7274FAF229E26F10D3B6C1080056C0C1F7D4A006C0A9E04F75001
+EA02B309FB00B46A1B50BE0857009A35179020F3007726841F501277C1580471
+0D830040600AD600663B1BCA720251BD4004CE4725A606DA014184227C265104
+D70D5AB90C4701A326D52753EB01A30E3CC1045901BE5F22831231D921B9319E
+3A511F9234541C830140B50E4104E2003EA201EC3C1A5BA53E20BD610525FE2F
+CD4512771FCF264B0333B7055800860CE7127828931FD04630DF2687E635129E
+22D5452D651979126C26861F5B3E04F20F3D791EFC265DE00641683C13D6033E
+9E6926481FB030DA29B212C452274AEE048B0B27F22E06842752870F5B3D1A95
+2F00FE07BC30A31F8E2E1A6AE36016500886003F67274A851F9A277F1F40ED01
+B36801770B8301D208B401DA0AC126F715632988344E94124F790D69D42700F8
+71012D779E40007006B70169089E0EFB6A1A911FF62C436B3A01BE0752048F01
+5A3F001253BF05405B00B40DC727A92FD80450CE237D2B9301D0400583005037
+CD04B35A0C6CF93900DB069201650A79046C3B01AE126C2F41B26B0961AE13FC
+013BC500E56A0AD44F126445016C3F00FA7803490A79F33B13B51EC805DD0068
+0CF406A8006B354E18A027F01B5A277D13692781005D327900F109A80D2CF81F
+3AB840139F3950185AE308530FA54C266038F2521B802700D709416604B400D1
+591F6EEA3E22CB1BB6659B017730EB1F7F2586058300641F7B35069E00D6266C
+2260B119C8128725791A4696245412AA1A6034E9228A204FE625791F9105D800
+4E1F97360075237B0C4D924026861F9B348820EE12B9720B34C726AF2D006B96
+277912924128CC50156E2E8E1AC126E1105A0346C60449FA22AB193F9B04C43D
+1F6C26D15A01850759007604820DA93512B027D81A37E819A20031CB04409650
+2FAD228C1C5E3E0AAD2D0068A1097804331AD3266708A503E1325639EE0D9A00
+AD5A1B6C117B04A40C346C277708A201E63200C905792B46BE1242A500CC3608
+A000FB365A277B11E50158DE1A9D2FAD1A3704B301600CC400A7095A391D47A5
+11840150BB4004E6003D6A08990235AD25D50D50048600409433791F8D360077
+0D59E8126C2354A005880038AC27CE28F326C322E2019143007F055AAE04790E
+41862162BC3A137B00CD0847DF25861261BC39138627FD50A748009A50157948
+00B90F773F22E02C0BEF39AD2FE51F57F700AE22EF306C1460A31E50E20A7500
+7E055A3F139B591684481AB50DC85329A5123D6408DA0060F76C1353F241276C
+2B489901E07F005322D912601A812550B826F81A49800067043EFE741F5AB507
+DC00A50B63B22DCA01268407DC0040EC16497C0C66017E099712782C7A1FEE66
+21942F1395265EDB0C77005306F00DA150337E017504FB27460DE349006C0E04
+37F41039CD2B129C1F6001BC511245884A085F00488501448F145A018627BD0B
+377F01409E1CEF26B31FF86B0428DD30049800693D0075258204C15022861249
+20C929097905E504D1106C3B1369F03C079D21F40DA5056D0E5939BF12E71BB3
+6C112FC90D356D246012EA2641067948BA33A41B86126033B81EE522B4153F65
+3C04AE0B4A043AC401F64500CB3401AE27E81F9D26653D19EE12BA1B9C4B009E
+700235B5218AC46220AE6C005FF9074ADB347F0472C70027B926D43916C72706
+3DC2500F970049FD22B42E0083325B0C84013CB66D0D63C72250E820AF16F70D
+9F40017828D0059800763DB8491A633F26C904B33F04914A306E005A34D22F9E
+00790661279433019C540064F5168527964E0170EE3A126A01465A27BE029307
+770490314FDF00D0522661BE751C50790D85591F7E4A14842A6C0140D5049600
+5A2F623912C83D1AD5660750275500850927861A378D256C1441FD3A1D659502
+740DA1600A6EDA67002EE51F3E791063076BC64104CF5027C2104700AC3F1385
+340179078646315C1CE710A318683445A62501822FA100784627601F7B26CE03
+C23998116A0148E11FA9267B1250CD4020A53905AD00D60530BE1054009F1AF7
+0BD00E793D1FD8263F5A019A0D39791AFC004808DE123EB53B09A705F73E01A6
+0FC75B1F792640AE05E100A5520B912A1C79F10C1EDC334FE504BE5001C905B3
+00580DAE0634F91F87002CB3224A129E6C045BD203AB27DC15510E973800901F
+60EA275901EF08B95D27D45005C600AB26800050B901E50F5AF212BD0D54FA17
+AC0EE600A30D68275504EC22A612338603D100F008610CE60481481D69384779
+1F8622D3502776356C4200FD50006BC31BF92147B1036C1186279D2386006819
+E4276D1260D81D7934009F0EC56B1684236C3F22F7014DBB0030946C4105900E
+3D6817972E602293277923D15A115037ED51047E01F4360CB91943861B7A0192
+24F51E66E212780133981C7B26754518920F3479277E125033F93F1F70278604
+3877268532067A018630591550FD01B22A5E4307C0531978375A22902779296C
+12DA2F950AAF04E2007F3B0DB400C004AE2F600DB34508790563861F42BB4D22
+CD016034D5279E048F00BC23468C044FFE2D530127F40C52CE049C123E841441
+AD03D423B21B45A101EF4812E9400BE1019C400177BB14661ACD31A41B854726
+970035CA0D5039AE0085092FA426D55405BC11CE3204FE0040A701F00966D304
+5D089E0DD416B15000D902C24F22DA4105C5761F3E861A7714D8386300FB480D
+9D4304B500C3269E014C12FC225029A8420596315A2764148F219937129E27C5
+3400E70A5D00970E40EC04570D7347315A1A940037B9126707DA774901AF3012
+7C2756B106E76A123D0879005ACF1F8531007907A6661F3C5E1BA32F007E0590
+49126C4004DB510AF55A236CEC055C3449C35A0080083983276A00A25A226AD9
+1C622694351A8926C72F7A003E6C1F95213D670B98511C823600BC0848D000A4
+04840E982E05C515DD345A3F1286195AB76D00649A0D6018F45001E408D95004
+EA0150DC005A11944A279E16F029508514A31EC000FA12D0410BEE5324812099
+401AA73A1D874509EA006C2F5000C25E9A26EC2F046C0A52AE1F86340074BF08
+F00446DF27C3330BE500B82762137C3104B1002F8612D602233EFA1549A800F3
+1F87380CB247019D0BC00242AD0D6A018E2450C404EC0B49AF1BF72E00B70DED
+50278212347B276C26E41C4D92237400860AF84A00EC3D062AA41C3ED004743A
+1D93126B3F247727801A6930F24101D70665347904C8073F6C43355B276C01AA
+306605D201B435008804D26800DB5B28921FC9219F321A015A1078B426FA123A
+D40455D90F4581245A8C0C78014F9720602F8F00AB22C46A1254A1217627699D
+0E7031C71A770D4F06DB78122D7D21772F4BED0053DF4012FD1A613056367D00
+7907418949296B09A501E2571DF5118D013FBC016430A722691F7B327720D44F
+0BE801572FB300D5472CAF00C909A90EC62287157A3050A512BF1B3D602FB600
+F40B9A06A351207C13962F580C50E912603E0D953B01B60C60017E0D51FE37BC
+49003792019E60247C2F159A2900A93813B4213FFC023BD2074AF90E6D003EE3
+4006DA00A60740BB015E0B8A2267B52C550060C605E45012881FA03A1AAE5A04
+780C9F01BC14DD235ACB26049E18D327783A0694035E33CA6C133BF21249CD02
+AC0CCE056000973B2685207912824F127919801F863275055801B60AC304266D
+004FE0019310641A7C29CF3D11E600BF420DF36D18792AB21FFB4E14812747F3
+4927D804711A7F16E159206E3400B219F54904CC511DF869075F941251A51286
+1A368127A41A7826941D5736F1207926DC5004E43F019424F43E1F853700CF07
+3E6C0E8500349227DC26792784059F3C016CF134600094105AAE224FB50C5000
+9F5A067F013783266E2746BC4C1B6CB509C502F13F06BC01FB355E00EE2647D7
+4927711F8D3FFA398B126C27DA25B0490066048B4A296C1B860027A5035A076C
+0226C7089F046C118F19A841CC01693D05B80CD1560D6C017F366A0B860127D4
+2F00C5246C4304BD5301D305610BBB013C870C6203499F1235972712D2401179
+03B40A499D2552BC01F52849D10AA3005F08F111406719AC124F0CBD5022FB01
+35CD002A7926DE1F40B81BE16109EF00981A7A0EFA0450336B365A1F90266441
+0CCF5212AC00660D9F00E34A016A0848AC0A7901810532E326B338089E04DE33
+4CC44738D933BD417832501FD322B8003C60082750A4128327771F3FE426AD1F
+E912B534499B04417A1A8600E12F6824951F39E851236CFA12B227CE2F006AB5
+0050865804A550286C30FA1186046E2F5F05B3227B1B3DBC401F5AB702E72791
+25860439791A8A63126BEC08A904860D6C2C5015AE2F5212E30148269E1FE000
+AB0BCF003B9D1A88032F7B20921CFD286C3816B227D01A2FE91FC0374F981483
+1A61F812415D129A2200790C840027A400E5790164314CE11F79F00B40C300F5
+049711784F0984003F6000E01250B909E933610D9D01F1094E8644029008405F
+0080056CE9280D3CFD0626C44600DA0D75005A34DE1B9E15860D5A01F95004A4
+750030880D5C00D81B62E200B53005A03E1A85385728D3049E00874104A36227
+6FAF5A007F12672295275BE70DBF2447A204DF3450048412A55F0C84009E7500
+405A0CFC015A09C7015035AE00D00660EB27B01F50F60D673E0E55A50A850495
+002F861D54315D3949BB0132D9245AC6227727791F6B365413B1401D78123FC3
+0027AA2BD617C1501F9B42195AC9791541923012822755C526B013416600E948
+38D9306B22831A3BCC6C1D4FC33649A10E2F730C5ADF4A00C34901EF125F3E1E
+FE4A0FDB3400BC06390DEB2744BE490483084379015EF2123C670CBB5A21D300
+32F21F523F1264A31B772649B846277822861F6D2687390E6C0488125A359C1F
+CB2640FB124625AE6101E608AA0DCB002662A105952F038806A50CEE009F017A
+055ACB27B361176CF70E680179340DEE370BA901490467D80052F1099E043C87
+017908C05027049C1EA50DC200E3095005FE2D0197270142BE1785263F0F982F
+137A218400A66A0A307F225B931240CB6C1985015A11F82EB2153494270050B5
+00773E019A2786460269BA05F13404D500860F6A00EF0DB702E80DB40149A425
+E02FC201B3086C0090052E5CC46C10229D347C236A276CED401F7A13FB501BDB
+38862F5922CF27FE320085043CA004338226961F51A2044AD5278521A23A1DAC
+22653F20E51B4AF520953110AF6B127A003F652A4B8E248512A9600C70EE6B05
+3EF700B36C2261D505B131C7402377B801C5083CF669012FB309D91F79266C00
+60DC05B3731F7C2CEF19C80D5808C578132F92225AAE229F2ADC27901C7C4A31
+633A542FFA0860007A24862051F24715BC78004906D777175A00D702AE06500A
+C4013E690DA649006107AC3E0E841877461AE80D49D94F00BE09E60066269200
+7709F55001790C7301BE5C0084093E6300D36E0033CB2752EC05B21045D2006C
+3A19CF214A129D5B1F793604F50D4F3868025A07DD003D501F8926501EA04B26
+60389700A40FC746216C390ACB05460F84253FE9244005E550007C07467E0A78
+015606C03F09A400C50575159234C7184F05D529029836511CEC27872B04F80F
+A12F8420791A86275AB400793C12C027F41D925000B906D763267C2A07993C1F
+752EAD16C6305A1AAE3D1FC22FEC27961636A527CA12B3541D41F44A0491196E
+3A1A950133A222E859078600C73201A70BC8501F8100A11AF925A1129619E96B
+01D304780CE200860D42D31F7D3104A50EF656246AD85A04B565006CB1355E1E
+BF27DF122FF61B3ECD345B20DB1A7924831FD200790D3DF06514834111DE019F
+0C6B00B25F376E266312FD34B600E3105027D3236D0B8D016904DD4728933B01
+9E00C66812EE5B0D86043C7812DF346003930885007B06E0500F70017E2F0B87
+0626973D0EB502CD5E26F963087C0130AE27772350D7412F61019D2DD927880D
+4F346C2B550D40AB1758C12847A91AFE04583E01EC5A17850034AF014A1F8C34
+129E2A0D8E01990C730199590062A30C93008504612FF310A9275B269E6C002E
+AC04BB5F2773213CBD401E01AD09E00492006C24612F7C05934A02EC531F40B5
+3912811F5D12C31A5A4022864601D12761FC004C059B12CF265A12B948336800
+BC22FD2650E237B96001DD672240500D790440C412488603F8059A0D6A048711
+E82679086C0160BE00EF05B379002F91360086043577279116B86C223FBE2749
+861A7F0DA600E04904F85026D4225137C81A3CB940217926EB2752B900497101
+860AE50140C15A0E7735008706D0581267DD82277A1F5339B214CA0AA526F816
+34982705C96F0D5AAE01F008A24E33F904B100329A219013407FB75D22770047
+E24D270DA91B77305A0592006A034F1A852F0078F6019E27AE1F5635DD155038
+621FE627BB26A51A5812AF22E23F127F1A653A1FE05B08F34912D25007C20082
+32089D006906E212C229FC27771A85385A007D0962FD004A86046B09E001500E
+991A3B9D0C3EDD31691FA5224E1AE72255FC1FA343009408310DC7004BCF0C5C
+4003831A75015BBA0041833000E81A3F652F6C3E00840D77155ACA125000BD08
+264601EB2CB41F79146CF7013BD90D9F4012AE1FA127F00D5ABD12347E17DB00
+940A8000689E0DAB50007A085A0046CA3A00834906932651D4019E4612852297
+30601F95235A11F3501FDB2F9A36750079055710C422B112C82CAE3E16820E34
+F126A71F40BD6905FD0350CE1B5A13BB500485087B00880A397F1234F526A847
+5A268632019F26ED4935D70DAD3E1166D615AE54267900C805B411E323AA26E0
+3E076CF4354979D70E711A8D0D6300A5043F9852057D1AEC4C27D9086C019A38
+1B54A30561347127F21EB8431AD10131C52040FD339D0467F03E1FD028B5003F
+850C27B4004D05BA0BE9004FD72D6401AA4A0A60044BAB143BA3400176078449
+016C05D129B8501278005C8612348C267712478605970038FA27CF32B027CA49
+01C4610E7700E603B511F2691A7E0F97005A306C1FE24709780436A10E95275A
+1D7F2C6201406A1DB42D04A227025832A750043CFE4025D11F6012AE35640086
+043A982CC51369D60827E620A6065A0179310C8626428509A464126D1D7E0C50
+049901770D86164AFA6C1B65DD6F1F6B277D3804A10E7B3D12C327ED1F3FD063
+00DD5D27EC1A32E21F9E450460009D31CC2906E75A00AB27C50036ED23447A12
+6201730D6B01792F500493276C364421790538C4005027B81BF30090042BA822
+F8611FDB490AF54000CB1F78D004920055851B66C21AF00C27CF69119E59087F
+00F24901D42D41C760167D248D00478742008611D336BD2260E4005AF4127435
+01B705DC29BF1AB134521FF42DC7053801C12D0240A5019D0CC66C1B52CD2677
+008A0DA20150227C300A9D00A9600D3D6412871FE1266C034EAA3D1AD5128022
+63A10F5CC707AA28961DF4219D1AE224B31AD2098BEF5F19A5582265E4046C44
+0C6038CB7900503E01820433772294560F8609503A20EB380BDB00418400449D
+003482013DC32FA43E228514AD0B5000E805570FFE2F04C35A2B6A2584149402
+39A71F3E9E00E3572592480E6F385A12D96303781D60AC7A1543870F33FB2666
+213FE6004104FA50276C32840BF712B2551F7D420179BD00F136AE0D9218F80D
+670185315001F6072D7902348D21DA045F385A05AB0985005122A3122700CB3E
+01860B3D85139E2DBF0E52126BB81BD0275ABF00A50438B327FD12B0700E67AB
+22941227B16C125BBE1FDE266A0F5A03BB094E209526792749BA441F6CAA3D0C
+F004AF00530ECC4D117F05602F500B790139AD00F709850030B9269D003B085A
+EA1FC450098300AD056727B56C380BB700D51994296A0138CC1134F62050306A
+18497905602D9420C64604A46C1441B21AD64E006E1150BD00D63448692D40EB
+61017940964D12FB2CBF204AD5017205861FFC2706860C9A08458612E9650679
+01623F009F2F015034FA570430E42905790B9300EF1F92276CE35B04FA0D9E01
+7809CE0150138027771F40FC2F7604BF26DA1AB313C927EA5B1B6B27A422468E
+075014E84ECD27048000932749DA1A79128D07249D5C1B7F255A04AD23E67004
+50860672039F0BC60039D922B8003E781BF0233BBC6C013D840DEF279E310C7D
+268D00F90CA00430C11BDE042F7E087704930037A622E7344F019249346323F6
+1935782E14D52750BB16D8265AE17C05740DC651018C4938B41A446E3C06CC00
+4712812F691EE03364229E27DF00B307CE5E0AA01C6B3250008427790096082C
+C510910158ED123ED3680A34116BAE376012CC013CA12CF5354FD90031F0053B
+E14015830D3E26DC1CAF29DA2582275AA00270125AE010560A8800520EE65925
+6A1A7F01E4451BB4125A2774194C8606531350BA1FA4266A12F75A08405D00BB
+6818DF01C24C006CC8019D4F008D0B3B6B079504491FB8213B7A22AD14F60057
+34D30DB25D1F8725B500C706A34800B4510D851B5B346C3D1A7F0040EE01B166
+12FA1E69354A77007F30D53E046CA8013978C27D015012EE2F4D881364035A01
+A50E49791F9662016CC80048B87900450A920E4A01ED09337F27A4320569BF34
+49CF1FA22E06C400B6355312A165043FC404B639DB0E419B3A860E5500E132AF
+271679C61295233DA50D406E1F872A0D601ACC3F1FEE2286441AC01073004AD2
+0141096C2786127F01691543F50477345A2676391686203EF300479B04E80FAE
+26D95619970D3892043FD712B81FF149056622BF1F522A9E002540F72776009A
+0740E70DBA22921E3DB502CB0943B90E502F9006276BBE60265ABA6C1D42C019
+FE01498E28009608267B01638612794B06A96C003DF079166C4600672EC700F1
+0140D45E1987004B9E032F6C07EF015A2F9E11EC05B243E33A04A75300AD01F5
+365C2AED33971A60E9821FBC04DF269F2A8C00319E12E60AA901EF5E08D70269
+32C017562965019135047D274DE123509A015A069D3C19BB0D78009609FD0E47
+A6065A04BB5026C61F592F6D400AE16913602780331BA022F91A5AED124C05FB
+004708A56300770D3EB615EA4F1DDA5630F4173FDF3B22FD152FCE2350003BE2
+0D921A7920645229AE05327B0B3DEC1E57DD1A7D288814D0005F41316E002691
+4A0D85402676127A008C0C6B03B30C48006232771C5A07EA22C0540B63276C1F
+8512309427A513780541A500C93F125CB60ECC065A00BA452786346103945031
+EA40266D1A5CD71F772796330B830179049E00D17947008625A001E956007D03
+9D3700961F792D8714D03B229526CE61076C017A3D00B00D4A97005E0A960141
+8505930DA15A1FA827FE01B20823961446A222CA6301833700A226BA043E7927
+AC04980EC45512F93B18D95A05A427DA2346C74E1F8726D612A30148C44C127B
+0439D822AE00CE3549B7004B0A53D126F9127B1F50F700276D1F862779310AC8
+00FE0ECC270085145AD801B02F028B11E11A61E614B036FA1A613B062EBD11FE
+0C761940D7345E12CF4931CD01A320794E02E7055A40208527C822A048278604
+39B41FCA2754BC275F1FD1310688015A12803279E5014FF6006D1040AE0DC850
+0C491B75FA09501AD64926630679016BB30C31C61A6108AE015E06F72E6C0593
+27FB0D7800B53549850172107F5003790E60F775214083006B30950C7845A537
+F300B00DEB631C79153E7846E00CB2043384227A4837AD0086054B396912562C
+B415EF5A1F6C345A27AD0D6605BC5008860462400DD8003198123DAC0EF400A6
+0B6B04FC1B50D5196D40038D0C6C00EA50126CF42649D74726C80D1A4178128A
+27E0055A30681F78E36900562FC1680034F41FAD279E2F04668800509C402D92
+1D803900AD55217918A9402D641AF317A72FFB3F20E227C51A4801B30437A01A
+E003BD2D0568025C3E1F8539019E2751B50022673B1F8F470BC800EE085A4026
+B51BD400AA0878009346018905A500D1048523981B2D7927E512AF6C2454F026
+68C6006D1B56339219850EAE013E9E05F24D34DC13783E04AE36027C0B6604A5
+006036B026CD04571A9626FE01B5043813AA228E01277AA30A6C00DD1A50E33F
+11E83901FC124ADC0E63C93E0AE2003B6A01DA0B9E003C6C025A05870C99008F
+26811260E50860276D185ADD13BB12D74906C35025DD045F39A306C36C00F954
+1769249F1ED063017D27852250CC263C0DC228DD267A1F5A37F70068F100A51A
+593C08913704861A502F9D38D51241E7345C2E8012693712A3005B2FC2208726
+61B41DCA27861F5094D9006C1D3BB74000771284274D924607DA0E48EB174F2C
+923E128501771FB025782753960031A304501A8B2650CB12861F772757B612CD
+26B91A3B673E12E02FCA2346890EAB00843F227C278C01772F6B04AA0D8413F3
+267E1941A21234B7277E0F72032FF1135104F43F056CE5602079129E0840B213
+49920F3F5B0C45C301F616B55C0CA901E2095F01B1056400D6084EE600BE5A1F
+7E0D99016509D9004056006C10F92D0616820D9E601269C220D2490BEF00C332
+6038A4056101C906B85322AA0D55008405CB0A3BB969228227F2013F97055A33
+B204ED0640600892004EEA04BC53066C00790432C61F50F307AE00561AAD26E8
+12901F682D97025A01E42C055C87019504DA36B2500A6BC0325D1F86124800AF
+0466304BE20177072FBF1FD3339C1F7B286A0044D22779144087274C831F9D26
+931F3B8E4004D026E51A3AFA3F169A0EEB34AD3C026AA07127F14300E7073073
+0134AD1F531189017F1250D778203A6004FB4833D06C139E2086194707E400A7
+105FC30D45EC004164259C1EE3375A328644276E219C27B21EF2540179361286
+253BFC400881005634F600CF2147B64D0F6DD51F3FED13435A00781F9E380094
+0CAC00C530942750F000841E9227DB4F017C046C00700DA122E334108D2457BC
+00F31141C40B5302C70F6021832E7800508604A75127792277135ABF3F2201A9
+04347F2753A40D9861046C9D3F21F727BF1D470C6BE814862B087D043DF42F50
+00EF723E137A2E741F52307822A413CE500E7C00A90FD92400A208F800501093
+3912A126D14801C663046CD41B40C10D76400989126B23974400820D6031AC1A
+FD105104E34F26DB2879237E0FD60A3EB3116003AA10863D26B221ED36C8017F
+06855000FA063677269A013074F13849A601FB08AD103CAF46256B0CCD01B805
+E0005009DF5C124CC40A94013DF3411CE22900D15A056C007D27A5003FAF004A
+A326BE215D05BC642703CE5126BD02DF06AD0086096C3D01C12F6B21750150CA
+38631942D66B015ADA0966008234501FB4142E66A6045E1AA5502FEC00CA0736
+A727BE007906652E80C4276C118B01600BFC01531D86215734FB3D226C00EA58
+09844812644026B21FC53E1A6AA70E651ADF6024008D08317C276C1B5BCA0B2A
+DF008C1F6D2F6827981F8531D238791F6B24D6125A0081105AA03A0D862F9F10
+F21A8C245A35D31266008B10983E0D9049119A003A84277A20D14A2FFE1D8527
+9413F9288919770CB9348C0D2CC120418823A615E6097A005A9E015027DE3D00
+C70E497E1F5AF60A6C2149D226BA0D41019807BA1A3DA54E186CA84000CA058E
+0C5ACB1AA44717952F01B705DE5D0A4704779E012DD3048B4313B94A27D95619
+B500ED2701649C125033F10D9F1B830EF34700188600FC10AC2D9B27C622B402
+4719B226DF045D345002DA059C0B50EE401ED44A01DB1AB43241F95F18A30C63
+3E049300600CDE004804A107EF295C047901A458077E0038ED046C219927E138
+0DF0128605946226860138B204309D12E003553F0078D72464334875E80439CE
+2707E963276D1FAD01457E0527C200FD60277E2F1277F262213CE74E1FAD3406
+7B04830D6B0097123E7747B73E006CA4195A3E05D0003C5F22B06727A2305801
+770984043D672DFA6B00791B3ECC13B4651F72267E2902A358043383236B0079
+0B5205C80150F41ABB1239AD50236CB554267B4711D3501FEB243FFD17B06112
+792FB5015B109248316C1FB62B08FA1ABD6111865600772A850FA56B1834A300
+F7260C582B88009F3A50129B00E3288B1538D5611279390E961A55A5004C0CC2
+005A087F0056C927FC1EB334E72B50CC04267B1EF83408C501B560246CA80491
+0AE4044508BA4022E81E50DB17880B3EC5084D9400820841A911E500BB692712
+77FE14AA2FE927C0248E2776380E7D276AE53F01980D390BC701379600319B12
+850069335003D127920E46C74B04B300CC3E01774933790627E3173ACE22B01D
+F43804EB5912491A7DC505B21250227801BC3780126108F2690031A01F55BC01
+EB0435D81B9D27861EA525EB3A0C6A007949016505860F4FDB0D61054979217E
+4012F63919C74934125AC86F1463950040A0056F00B21F5732E9184823FD2E00
+85305A3F0F79CD39006A0973058501690FE41BB75A00A603511FCB275EF1711F
+5ADC1F68BE065F2FB412C8229E1B4A00FA26641A7F22780C5AE510AD0050A241
+0072A8044F0979005A9D260681CE5F003F501F6AF308D3266C0449C6239E2F0E
+894B04DB0B45752585492770015811D03167126CAE22C337129E27BE40249801
+41BE2FAC00EB2700964603863E017D9F27003DF4043AC26C0D39CA4026790E85
+0160B66C0160C94B0A9B04F623015BA526D61FAF163DD85000840634EA268415
+8C04A5093B00AE2F02820E4E3AE104446C00830D5DBB73147901D32EF818AB40
+267E23EB390BD06A21502EE76126C4142F6AC03D012FA714E179013E612F980D
+F92E05710057B11FF03F24860038AC14C90DB439FC490579019E2F03860850EE
+480A7900F953288213742284154BD8500DD15012EE1F02D9781D509112521FF8
+5A1261EE04CF27A50C3811B9263C13DF206C3749C02D0D82005A354B95122DAD
+224499126808D333501F79BC58166CAC22F60078268B1FD92B49F50141074FB8
+440D97013C6900BE05551288275302FC0C960134930D4BDA00501273F1216C02
+31BB10A40056401A79AB34DE4006740166AD1ACF5A087A006241046C1AB627F3
+2250E1412C840031D4136B3A1AB40CE801CD093D91052D8527009A2F546B350D
+B70131D8058A0028AF013A97147B2250D9417B0476A50146AE00840850E73441
+B908F001417D045BCF0150C1385A00F76A014905E941085233931AAA0E620496
+08369E26DD1F5A27822453D712921F66A13E00C11A9E277A1F47B8013D850B7E
+22AA3404840E9C5A26801FE712B16900500B7915C827BC0D3582112BF9203EE0
+0F9E2685005A0A9100620FD71AAF6C2052A5068F005A366A2B50B1125FA91A65
+B94106C00C9860267B4926AE34497923851E5A3F00F8076F0031F41E5234861A
+DB27B11F610497177E2765BC0DF53E1F792F008625941230D8269F2D1278BB04
+48D80150F14014C051126C007C0AEE00B309783704F22E04DA582F84086A00DD
+5F186CFA1FA529E9014B9926D13806DF005B34830127EB26BE205000952650E4
+044B80016098226B2FE61240CB3B1CC2279E015B3F0594013CE34430D31C9F04
+8600E23B04FD0857178527FA4100E308A000690AE101BD0CD604B86727911BB1
+5A129200EB05600D6C017812CB275F00C90A50317400B20AFD610EDD05409B1A
+810D64D000288410359D27007A346800E729A7328C1B3D6C2748A64C15865012
+950D4AD51FAC3205CF44086600710F3FBE0854004FA11345C40548CB4C0A8501
+63FC3B107E016033B51EC63205BF00A5045AAE01864C0D7D2450BB12F628C01F
+611786046212F227416B2678228B30DE004C052AA71F5915EF2A96145F32466C
+2D5012C6016A2706D32E66218A27A42FEF26914907FB401D85259F1256268F13
+369D1F4FC4005A04C13F1D5EF922B25A096CB11AD223901F7905CA0160C104E6
+0026D83B00C52748F704297F1140851230AD27CC1FAE68193BFE791A65357B1F
+862C11923E1FB42F046CD722A7198D00480C8E4C1A77279235186D21F53D04E5
+07336F008D0D7700A80E4EBB39490DC81A9E00B04D016C37AD6385104ABC3E76
+0D54399E04FA099B00841F50EC407E420DBE3D0BD1006909B300377B206AAB04
+E1013FD56C0153BD043E791249F0387700923606790039EA1230830C5E05B510
+5A2595203F50139D680A8E601F7C00346BA50150F000B45B017C05574000D66C
+0C28BA00EF0CAA04F75D01DB760F48A01C405A05ED266ADB5A1FF03C09D20E50
+EB079D00AD611A6BA62280274BDF4827FE236C0079A5016010ED3F0DD1139422
+0133D40179042FB400DB1A7F23641AE22FAB0A3804B60177189C50337F12981B
+50D8019E0D3C571F4EA4053AEC1B2C63E901AD256C1848E012B04913CB6C0355
+C6014BFE3A5039D64906F60CAE6C311ABC4106EC0DB3771239CD2065364E22E3
+1C3EF50D862D02AF411278275A276D16419E27005AD1087A00B13E11A3084401
+7A0495571F7B00633349791245953801D609C5045D0B87019C15E921532F9336
+571F86264907E95098266819CB5C1F8127A6003EAD5305722260C16C264DE447
+00FC0642C8314587145B2BE400BF77086427860EA8780B27841A930CBC032679
+018631501F8E263FA412710292006A1E802B752700FB5401339822603E01E25A
+0D9F07C804A10C986025771A9F5A2364CB04AE06D600B5300869AC33149829F3
+22864A2D7714AE25BF4200F62BB223CE0C2CE02700FA49125A307822B41F3A5A
+4104710BDB06C204A5015AB3731ABA430BF1375001F5076C0E50CB02319410D2
+00490E921A5D128522951F5A01F5043EC6114A83192FF815C4015A4000C74934
+D5005B2799502FC71AF20CAB05DD00792747BD19EA0EAB009A04CD40801078DB
+0346CC1F9E31007927862479276C3601B304E14515ED01316C208338601B79E1
+3E1AEB44026C0D6304CD00FE5127701134A1266A108203A56604B35B0D8336A2
+01F03C0065DD12AE32BE3D1B7A266C2CF70E48003B042979008811842248BE35
+781248E8227B279F1FF200B204CD396301DB0D7B2661A500943405AC54008248
+33DA236D218004663AFB0542E90A62450072375A17641BE30B347E26612FDE12
+3C630827B11F50288810690949B71AFD015A0AED00CB4A12623D00900D49890B
+FA4912C64E0152057B0D5BC31FA530931F613D04CC00E45D068801D81B5A3A15
+883E269C1FCD177C0E50C4400677006808834C00E51285238E1FD87B65CF1AAF
+26C4279E005B08F03B9600AF0A5A047036582C6C2608BF5027A81ABC09297F1F
+EF670E38B9270D941A980CF511A616881F8634009F12B52BCF0E9831AE4104A5
+5301990679225AB51AE149006D0BAC0053F8278411712E43BD3D127A1B8930D8
+1FB75034D41F9F390086042FA526C4239700368601E60950BC0D9F1A86471CC9
+146C2F41BF00F04F01DD0869035026AF1A6C258927CD27F71FB446316100BC06
+60401D0A38820D76016212D31F9A2B046B3F1D4DFE3EC712A806ED45783E1086
+00683648DE12520126D26C0461F0055D00B03A512ECD015A0DBB692782015B26
+6C00FA048630771FF028CB129E01417C018536EE5916C43404A900DC50039C1A
+915027A3046D008406279A00790757AE2365F20C73006727F846186A277B1235
+81276E3501A52750E8049F0E6F401F7E2252B62EE860009309F501A10D90015B
+059C0ACD395432EA01A2F94F00DF2D4CFD5327750150BA12DD7F016C26007C1F
+8332009E04E52255EA0579016CBB42793F1C8D204D39CB315A0493006138DF2B
+5015D71E3DE506B25121490FDF00470D86005035F40D30BC129F042F79219440
+1A7E3A1EC40D6100D30540FB15BD2F49F6125326E51235CE173F9D34E41AA312
+57CE05AE00DA5A00EE05B85A0E83003D6248279912D20D9E340081063FD83050
+1F79346A1A50D13E1C78227D0398126C275C1F8F23A2093A00AD0DE924613A05
+27C2129E502FD70B51CC276C16AE34139626A41A3908AE00E60BAB007E127626
+E01FAD0E7907A40179044CA613873B1279C65D226CB65A1C65C11746A650206C
+2750B801E3086AC94106974730F0344AAB0E5838630A7E0169B94102A4600084
+065A01438304750734862278411D9212653F23FA30AE0CC508F8016C2F6004FD
+431594116601BD5A12E200B7300D6CFD01AC14E0274FC2040FBC04641579CA26
+7A401A8E0CA27249335F08E20448991F6801A250017E4900C80B4BFE5A1A7727
+5A34DA22A40186085632EE1E8E2649FE397100436201D441012B92084A01DD37
+0492096004E900CF0F673E2486135412E75101760F82012D851FA411D022AE3B
+178432501E9B27DA21BB1250DA24B54B0FF5320BBC2650D00C7901691A7B2686
+1E3EB000C2541B6CC622A7268638048529742260A900265935680986003E9F30
+5638E95103406805C44A00D44002F100A6401F853700B60EFA3B25C50CF73460
+2C92002FC4049D067A0F6527FB1E409312674000C6095812C02FF31FA3330D73
+B914F7279424794222D3277A30841F77059F4900F527770027C622AF26DB5E08
+E22793013E5F05E000BE0CF404790E6C278601407D00773E019E6B04992F0092
+1FB427D4125000BA51257F12369C01347900F60B48DB21AC05EE113C8044B10D
+D3521FF21678DC08A5002FB31FDB3C157C2F5A13AC1B790DC5620FF75B22405A
+098C1B5A277904DD124285226A31F31F9B00791250CC00B205D15A227E279604
+870A6B0550EC203F5600690CAE00FB5500A10DC20640FA3A18D7336104A5486C
+0B8600780C39B200771A54EC268F206C277C224D33B200F01AB3320CEC1BBD5A
+1448E11A5EF539610695005BE2346604DD0745EB0B4FD40D416027B00078124E
+2E7904D62705822C0195346A001B8312447E0B6C005AB304F90882266A278630
+00982B0579AF13D2003F9D0FBD50256CB501E00DA2015F2FD138B405733C2087
+2E0C9F01E31A6C223FC42794007D08A134BE3F1F84321282296A1BA7540160AE
+029A10BF3D19DA3443F22949921A5038C307790041CA099E0067CF155A394978
+089A5B268A0430D500387D01500EC950227F38058F119D1A5FAD26791F6A2FAA
+04781991275ABD00CA511F65F51950C04106CF5095265FC418F3268711349127
+9F31CB01EC0452D11869C03D00722764E3046C400092073C611F832650C10858
+036C4226E550016CF8375F31A50FD879025F12AE27DA1A6E045AD20560B60AF1
+02753C2290122F78267C4F0886017E045B07C30060F9126A2C49A417624712E8
+4003810B95042FD91F47C11044852268A810CF27A40334F00DAB4220F6278532
+008C05A401F11250D03E08FB013C62400A9400469A006C22A5122E05F9003193
+01A22AE5500E6C007A0D582293123687034F11E824860D5028B316F21CCE12A5
+4000D3123E861AEB0E9F007914C0264D10BA00436001274BFB461B4E019B26E7
+132E921A3A782649DB00C608E4571ACF0035F227AE21CD13991F793203880BD7
+0431FD01AE355A1FB82AF826C25D0085012C6FE700B3082E742085134077176B
+01C55A005004CD4912DF38501F962B005BA41B840DA014EA27B81033E30E8902
+5AB56A124985227749067801BD22E21D3FBA3A07DB6024F327891AA401CA1E9F
+015C2E6F375704FA50277C0149A5225128BA3061088501961B770CEE3AB60984
+0078CE5F0E84004A7901E35700C9115A2F47643F00860C459D1C710D542F6938
+E605A64B27AD1F86500D84267901930878006C0D40A812FE64053C601A4CFB00
+B90549DE00A22686300D77B73A1A7A2B5D0DBD620970E512346C27DE216D017F
+1A914D256536ED1D3EC639AE04E00C35CF1E60385A04AD64006CA03F1A8201AB
+0651305F357F0D3BD0059E0087326A08B10CF52D006CDA095A04F23E20DA2752
+CC267B135A3F1FAF2A073EEE3141C30DA335129A2786049212A420B826EB5F05
+C4003EFE01B50D426612DD005A3C01BC3F1CDD14C7315021AD27E21F7934511B
+AF0DC83F960D42603586227A2AD71261E73E1569EC01B419780027CF360551C8
+0495008630C1385704C508AD00437C01791A5A3E1363A90041F5128B2F5012FC
+205000B00E4E2078C50CFC1941EE6B12501FEB23BB1B92306E1C60BC0D36961F
+85129D4F0688003D6604A800D76C0456B41A640585216F2650BF06671AB423F8
+016C0679371480275A95197A279500882C489B0EF06C12619E043E6A0EEE6012
+85025A06D30092277E28016C279E12EA01B009470597005008A50040990A47F8
+3FA00349B120704013B547096500E0287740277516D72700EA09B57B20532F86
+08A501D1269B057912E75634CE68003E6C009005520079AE3D0C7A044700CE10
+853914944601C6346A00AD4012F71ABD5022742E16E634007A27A412D604FD00
+5E34EF3E0070328428D81248B404DC0F40BC045A1AED22B90436721B41CF0027
+50B7009F3F01CA4838BC27773E12F00453DF12C4006C27501E64FB5723B21FD3
+27881F5A348626116C317E0B8D00EB335924F81F790E5A01FC0BBC520D4C5D26
+6C2900EE04C7266A1F7D42017637C2482A04A00A27E11F9D2E4BD821B627065E
+C62763E459219F00DA4902FD265E05DE3B17D16A257F0B32EA0EB3510C6AC511
+F2005A38611E88217C0154D10C9E09680096561F6C2D80015035D14605641378
+CB01B02F0A73F611792C5A1F8F2F0C98006A0AB55021AD1679385931D806BD78
+11490181327802600CFA04CE0061B701EF1AD625470E9C017B0541AD3AC94922
+86330484B2119B01CC48366A0D9F00D84A14F04F096801D27726508E046110BB
+153C960A49E02F00A70D49067E276D227E275089127F1E5A9B0347A500559E01
+893603A0253D95452FBD15B33D08CA0DAE2640611EE727BF3408F600AE24EE1F
+85127934A552082982155B9D1F3B6803E408D0054EFB1A52E8276101872F6900
+A50C88195C3C00D228BA0DEF123BBE472F6C22961E405A2950016BC46027DA1D
+B96003277E12A1005BF11A48D734821B7712BC501B792D0BB03B22A52792153E
+00F54631A756078001603286019E691F8127AC13F004AE0DC33300E827B3012F
+820C29E2381A782660D21C86015B0A86046C009B502F761A8912BD3F01790D45
+7D2261117708A600BE0AE1003EF95024E30147C400B1401E7E263B77017E3404
+A010D94806E3501FF9023E971F7A256C1B6B275A93007810BA500CE607C104AD
+79164A028507953C1275EB006826DD1F3D710067054AA607940133F906409855
+00860DE9004EBB6A1F05D50040EB2EC11DF712541843F901CF03623A541A6805
+98410B791041FA1CB85E126CC206F30047790DF91FCC2253EA2642E10149F600
+6D0459A11F5CCE02AC30D1385A2A6D265E277E226A00970D8A30127E225AA40D
+64AE129E23C4431F8538199A350E822651B601F20CA5048500C90742E11AA000
+3583277A1F663B0DFE27BB21405A00D234154AB6460E8704C32E22FE1639E624
+41842160DE0327C51F65433184073BB27826861A6C01476D0040CA7708369222
+509B00B334EC561BD44E1FC76A04793600900440591294153BAE2C6B00A6330C
+9105279510399E27DC163DFC042E861778059D01DE0CA0039911D81AB533501D
+EC5907D6043DF10045DE086C015FF3005BBE0154CC04B3126829408B32E4389D
+21AF122F7F2664D704B3003EDA268700521169F10DA626549E076C04D0306113
+A37901955A0060D10EAE00503984053FCD0AB11ADF23510E6B0CCA239B12A929
+8C0427B15B0B7C340EDD177A002F8604A53A0048A00D5AE91FD526B12F50DE01
+5A0897501D7C4936D8521FBA5A077C23B0004F8D4100E6275B26841F6530F43A
+60018F4304CF6C0036A6278D144C871A348427AA1232790D2D8A226C2F427705
+CE096B00590B466204925001EF0A3C5E124A880AAF1B3FA477003A86197F0B2F
+F6209E4E00AF400827D32F11B3340479278F12B91AF25A0170277B049400F92B
+A1045E34D906681AE240002CED1CBF4727A10C48AD13622673E1132BC222467D
+086D008408409C27CF3E12F704B900670B7F0133E913650D95260ABA5011A200
+F7124EC600530BC338570978123DB9630C6D00C73304BC5600E70A4A9721D442
+00F50AA800EC2448A613D71FAF26FE3E1AD3344B8F1A9F30F31D6D0157E5042D
+C81F4AE101C17700633E1A790CF4568B0C45741F86471BED096C24790E2FAF20
+FE125A32AD13821F3EF0005A38BC52106CC67806690486015E37CD0150F6003E
+08875002980134AD1FFE1AC7236C007705AB2E66128527AE22CF6B0050C53549
+EC3A601E71357929AC04429324821FA814FC26A0024E17F82A831B96610D2CA2
+1F3DC6036807A5501A3D62274F91015F2F447D057100865A00790540C4006B0D
+9A27CE33155D920A79043D5D401052BC01E3279934001F63BA07F301C2650147
+DA4B009D6612840046D01B734101C0501A790D9A01269204491255A7264EFB1F
+9021772C107DC46123EE4112D3670C3E5F4701A30FF119604600DB5025EF045A
+3F1C8F2E058600279E06D901C309631F83360ED8046B00702E841FE2279D0147
+08DB243FF76C04639C1B50EE27761179BF03D50D35C01FF80150C717B50E2CA9
+22CD125A29AC400179106A9D0536F927B51BA423D81F3A83126E1B5AABEA0427
+80277818389526601DC83704E3503495016109DD3970038927D12750FD34B81F
+E62F00D633086C00E407B7671A3901A4178633522077B9049D3262385330D621
+9E350D8E174C9D00A80CD55A1FAD681A792786279314D201EC5B279B33E80DB3
+00610E792267BB56127B015018CD400582003D6004DD401F6C23854304950E86
+1B3E613649F2156B2E7F02F80850DF2EA5003FC14E12690078096C0086084FB4
+05CF013C4D934000BD0B5AD80DAF037E0B46A62707BC123EA5287F1649E511AD
+01860967004279018641129540B54927854405DB4B770D5000BE05F400277F12
+E70AC60082046E0957C401793912F327793A01FA4609E200500DF0006B2F5240
+0BB5065A267E203EC65300D90A49009F2EBF0DA54912DD26B21FC32D5900AD0C
+9D00E45A266F27A500EB0499089E01E41B9F228613660948EE1A59009F2FCE26
+EB32B02AFC2340602F87120535E052249332007D1550F727770049892353EE05
+5000B506347A225A12C61A940F50A50C65C227015A1AC90E32992704BA31DE60
+1F842F50D9075A228A1AA71FB627EA143AAA20D15F056C0EA061122C84223FC0
+64204BB402C719792F901CCC01509505308827A427ED1F6C2683340179296C0E
+7E0198147827FD336C2B0BBA01E0137F2676275F32840C3C643F00C71FB53804
+8527DF2086125B04810D64049200EF1A47C59C15620F7401F94122C3340059BF
+22F21179007726C86C2061A30049EB472DA427DD223EF43B176BEF119F045EF3
+0040861B702606B04912931947B53E017A3A5B0D7800865D086F0031B426DE31
+0476CE01B17804339E05387E269F00F8046C123FE31348F41A791271048608D7
+005AFA22AD00F2335038E8078C017B12C9493963335607B80BDC00C82350B904
+D4502779015FA10F6C08760150AA3F1FC627A2206B0E7F005042B400CC2BAA12
+A153056C9E1A3F6306A138D40D5A3D0EF54019D50C6905790062057F005902AF
+0D4586237E391254AF0AFD01A5693700CB043C850068E22704F65026C2331AFB
+268C470A7F0051BE23405A3D1160D6125AFE086B1060224ABA448A0639A40064
+04CE39B4325A1F98390F9015415A0BCC1A5F3F20A52560008305A011D0473564
+217D14780159346C129D25FC1B34CE26AE34F72D00DA4C016D0AC933AE27D91F
+0430792585053B681EDC2C0CD304982F5501672CA80086260185319E1FBB25F8
+35B31FCD269421790036DB01B2781F6C284983240BE774225AF91DC9270D6C9E
+41018805964901A512E7671F993808850DA01BF62A007D3A15A327DF34860968
+003BBD6C1D50B233520E6101E54605BD61046ABC1DA101850DD24D05EA29AE16
+F22793008702A9400D942DF410AD06EA0053089149007C03630B945A119E3CF4
+49137601790B8FF75013E81B4EE20D7801874C336C12E026B01F8615E13250AF
+4D0D6C3D01830A730E5E306C06E12FB7511B6D3108E300C1113CC850280EAD30
+05770C41B149092AD01F6312CA355A3F042CC510F45A1FE5006B0549871FAE55
+047000AA13D127F1105201E92A0B9201FE22931A7B305025EC360083266431B0
+008D41127E21754A04683D22FC1C5AE204AD1D6C277C203DBB6612E54018DB23
+B916367927065A009C26EB205B38670A98013E810048BE4212F100B43D01710B
+FD04416202C50728F704CA59279C26DA04A71285490962049B12CC4927643492
+045D00B56C0160A01F95650022C16C0F3DE550079E00D7794D0086270196492F
+A737B80CE20136D51D88246C01491A9727821260D721406A3C00A80CD1009F0D
+52D51240E512553C1AC05A04D00931C21FDA4F0886003475268600C40B4B9803
+2C86049E522784064AE800C3841AD52E6A0540BA0026CC2753BA179E26601FA4
+277E1F5BA418834A34BD12911B429619654011E50053158929EC0039C327F822
+50007905A50C4FF21F841439EE123FDA023AED794601A178002F7B246C2812B6
+3D1864BB3D12D2037C1F6F265097274F05EC2D84B95A01CF05B046006CB607C7
+5526771B6E1F852E065AAD019B06FA73012F943A508500790D9B4027BB5005D2
+125D3041DD135AD01E3A690DA6003F7D1D690D4061048612A5581B85A401890E
+613A04FC0878015A09E60545CB270097076C27EC6F003BA9007C1B41B73A0176
+1D558F0D79015BAC2BEA3F1FD2253FA306D64C1F9D0050B323530427FC33195A
+BA0EEF1AAB41056CD90656008A27530FF0009E0A6500A55E0D7804470D7C2476
+341A9A2E12791F40F004B337DB01B976223C791F7F270D66E21D00F626B0195A
+00C6126A1A9A4A38F801920585320050BE01F42750CC109A2BA922F13D1FCD36
+02DC0D31791FF204C46C2448CD38B5492788300D61E91F58D600520FC15A22DB
+27AC65086CCF27A50434B025D8350D76159E5A007B016A335A0079277F300786
+11A66B1360D405268504720160FE3A237A1FEA4D09C26922502FCD12F43F26B5
+1BCA1FFA2FA2135CF70458E10086096C335812465E3E00F50949C90057B6223F
+A578470E6337E729467801ED3E00860EA91A5126F6790D6C3E12871A6C3B01D4
+09710150AD00497C2763E5093F6B2950118F005A0E7912D1006BB90147841140
+85219C3105830A710339F5401A6B12FE5A0075074BC800860440B112E0169626
+AB0AC911F4431BD03406BC003E994627B034C80E5100A90C94411EA3330177BC
+0D7934580893004C386B007808DA003EAD153AA126D212AC00FB079E1A852795
+152F9F3808860152072DCD0195048607D9305A0CCB27732265C7004416D625AD
+6000B00DFD4E1F852794136C26FE10AE00>
+ >>
+
+ /Yellow <<
+ /HalftoneType 3
+ /Width 167
+ /Height 167
+ /Thresholds <
+E531A42667F704429C054DEA1F8B27792267D7115D0079C66A05951BDC300F5C
+F90A6504BA50016305FA0C6B029F12E46718D25C017116D9361AE52352F13A13
+DE4027EF44035A0D82015F047722612FF027CC1A37019A08D46C1E55C404A71A
+9B12E61FA22E009D0B3800E10D3A00EA0E67FE05B80ED25505DF00B20CE75320
+7C2D61009804E25026864000B00838C421B300D60A850092045D400C7B2E7711
+9200A10DF40627097901CC0A5030B415359304630CD301FE05349B26EA1A3912
+F926830856BC1F4F38CF29439833852A419835D9275A0427863812A9278200B0
+410196290186500496005F21B526C727AD37F8179D01860B50017FBC5A267923
+41DC00623748D30153357D045CD8216CCD58266CC25A23A40033752184013492
+153F5A276B019E4812A555236E3700A90FDC5F1FFC620B72277A24A626501FBD
+12E85500B8035338DE335A1B96503F1F89279813790062E04027BA452F95164A
+82016C095AAE49005F12A538048F00821A790B26D410A700600D7800C845A200
+794C04F10D6C26784F14AE400EBA2F4DCB19791186007A096E0F5A34E61D40A4
+69164910EC00B205338520F4002677BF124AF5173E8704490890014A07802755
+C6119D274FC0264B9E04D719C03109D13C10F108B5611A7904327E012EA716F6
+0674013EE36600773519992240D0095A01863E00BF6BF20E5301E825CC0F5200
+800774115A39A61BCC29B53E048531C44400E96423DF0DAF00F168014A1FE326
+B71D3D6F0830FC1FC434439E1DCD12F64605D4551F7E123EA505F2324B1FE026
+A1007C0854C3123DE100782F5A1B904F09AE109A6730059E002F84014FFB1EAE
+27F32DAC1FDA043F5F01EA086600F91069386F054D8D5101832779142FED2248
+A112CD4E0050399A2FC96C072DAD25CC640EED61139F27C121E24512290461BA
+3E1B852B7424BD27F31FB300E6077748007B13E02293187E2F5115A22D762688
+371979BC59087B0150F414BA58106B0A7F00603B048A00A2325E00A408FB0158
+386901CF5304632FD723AA310083055937B404CF450EE5276C395008EB40226C
+B112C9263B6A0E7C1A78006C0D8419A2501B7912864829B900AD27F60027DD1D
+BC004489015ACA053B6B1B79D9045A0E501CB5530D7A013F8704278500760D6A
+0570AE50C43A17814E05AA01930B780186346024941236EE20630C7701F30BB3
+0379094C01C41150CB043E15A049319104634001AC249427E712B757276D227B
+19E126772C8622C41A9F0C39921284026A0D5DF527B82092266C1FA13D048600
+CD15A51F5BD50A3D52079800BC40019D12E336B526F60B37B327CD3801951D5E
+0D7F1241A306633250D612AF3E1F6CE40DB82812AB24EB00830439F31FA40B4D
+C5421AF634A51F9B3C00116C049E00E23B12F9325A18C24704D14101BC6A0453
+A93549A2266C1F40CA3AFD622784015C2F76EF0026D8123A9522772DD6015307
+69401AE010CA0B87326A04BF0B65007E265CB200FD20AE27CB3904770C6E01FA
+0A850168BE1A5F2B79037F00459E21DF601A77115BD7233F5609436100488500
+6C0550D80C41ED462FCC77163E990E860239700887003F5B034985006734A121
+CF61006C27E031006CAF086100E8491ADB8F24FC26480D68A14100D838651B79
+0E8433500DC72F00CF062A8700DB68260053129E22F51FB40D2A69AE0552C200
+E8099B123DA430C200960540633D00AF1293203DE4500FED40146C3479066C00
+49971FD1349E125231EF175037F91248E125B42D047B0036B427ED300569B003
+D21AA639CA1FE52F9F176034790186045A0050C404FA2654BB1AF726A0189534
+F41E3EC5136A400C279E1281195C96122E8022933101792C00480860BE781E53
+227D0D9501ED27AE21F91B9F2686411E78E5115A3C057AAD27D3004807810054
+960A348A1F6C401E84275AF30D732077265AAE01EC4B27F7004A850427974903
+CA24B61A50ED26BB113F5600603AAE004897018D079C0032860D65F71B49860D
+7901479F0C336E2778016E0D63047C23F400AF1AC323AB1FE7266A3A1C960C69
+4700602AD7016D099258078901FA794933D401A50843FB4704D30D58C712AF5A
+CD781F4201DC05C315AF2647098F00600679006A08F560015034B315C4400D75
+1F5BBE6C27DB3914E14900F80DA05004C600419801D212FE300D831E9E165A37
+D5136CB80035830A6100860A40620178E40DB224D41F79122EC9254A1FB95605
+C7195034C104E61D55BE1842FC00B210F1229927AD1249098126770D3D6C4008
+9101864B00E2139C36A91250AE24BF122DDF205E3B00B9085A3E22CD270163A7
+2678380684270E3801A412872C6C34500360DA6C1250DE402DD81FA51238BD0E
+91047C4A1AE9019A08350EA61A9E5F0179285A3905DB3D22811C613449840168
+C83757037908A6019E441B5AD71AA52FE327C41FA1324F266C197C048607E960
+056CDB600F3983277901951277278A310062921F7926852F5A06D90154C55C2C
+DB0156F300B86019DC0DBD3A783101DA0786042F7D0045A30150AC127122941B
+EF680472B83A0A8600F34D1DED79B55A27F14C0C9E00F77E1D4B24B93903980B
+4A7D018B5A226C27F92F008E24502BF07850007F0432BD23AF12CA6F1767B410
+E204AD0B27B51F5000DD2FC64022722D0CF3300D75267C105A017A05D909AD01
+F52F5534A64022B314340177EE00A912EA245A00AA0869D23C04C40D4B01C214
+8A3677214613A71F93341180133B9E472D6C0541B961224A1DF9410DE9651E7D
+3805C627E4047F00419F1F5213DC2F5E18963D011249097E0033D31A59270BC8
+00791A842755B01442D12F04E2009F085AD40C61BA043B12CB3E23FA460C8501
+614000882D025A296C1FEF4D04780CA21A6C125DE705BF60006CAD01F80550B4
+3E139524841F7F4915D900660B9300417FBC3F0D642F6C024CD23F22F4125013
+81275AE9601F6C00A50BFD0086036B06C95022D7055A00A722E81F511279B06C
+00619F3204CA0BF359257B125036BD260DE7009D4F02AE4104BD68D127E61FB4
+6C043FBF7746379D0EF205C5003BF0012650AD1D7A31821340A23A126B964802
+AD64096CD61E3AEE26B20BFA47A0009D53009238E349267D07950034860E3890
+1F3E5B1693270069FB2F5A00E936049A0F741FE12758FD0451229A1FD826B338
+0D6C9C01962BE200AE0A4605A432E6267B2A6534E32782380186277926FE0E6A
+018109F0013A26C13D167B48229230008B0162A50A51924B326C3F1B8212D831
+52220088055B3D1298632200A604662F5A3F1F86224F769B12643F0DCB26AC02
+7205DD3F00E831531A9B2D045A9704791F3E6B193AD13F11C34613691BBA28EF
+23BB4F1F52CB04E211BA344AD3790D5003C63F126ACC2945BF3C01790D3A7212
+E0007B04860961A00550346C1A4879209227D1128904470DC6059E0FB21A5BF8
+0DB600951A792FC926922766D1055A0AD701B15A0E6BB41CD62F16FD2901C807
+B10DF5266A00770A986B3045A401E02F06F24927E312AF01CD650DA5093705FC
+00BA58016A1BF149277F1DAF229405E20050B83F14CF0E57C500B20D5A218932
+07AA00750488013D6801FC12792B4766009802233CA61B882260B50B51008108
+5E9C23AE1DC7452CAD35501FFB1A30E215BB04C80732F8016B0279225AB96927
+7E1F5A0197123F6B2A5333C201A10B5000B51144961F84276D3500DC26513F08
+9C43007E471A862360019028A226FA1FB90DCB18712655A1118907508420700A
+43E92768C279206C3A22EC27790033C2014D0A7B10722F841267007B27853208
+79268605F70160DA2256FA3E145AA51892276B00A809D64127EC6D1249DB0677
+0034861DA924F01B40D1066500880B5A06CE5B0084490076275B3AA1511641C2
+4C2FF0004B0CE0003FEF3249D300AE07E4115F3F1662DD401A86012FED00A512
+F941199E04EC60226FAF10D865003ABD4014E00F79043E016127830BB0013879
+23BC3400FE27B131009201481250A0079304860DA65F126CFE5A27D222AB1FC6
+27F822A501E94D1BDF2F6C277F380E8E2F0979D02F0DDF4906B8502278158305
+530BC00038A527E04901F8385A04A3015A3495274AEF1B9E233EB412C926AD0A
+F200690D88255812981E86289C2050AD04850A2F911F64377805F27B2A049B34
+4ECB520D792C6005834B0D6C3B01C205316C203EF35504814D05B334509347E9
+004AFD1F67D40053129546127B1A844E15D22AE7003FDB125230C540089E263E
+049F00600A50019107500C6018943E049F00BF12A44801C15027009E40013486
+1B3EF804AE30C91F8D2761860C79129B2769138C462F7711F902B908396C007D
+046A42066638511FAF23D900B308DD004509CE013D92126127BD52043ECB00A9
+274300C0550EFC0422983E14DB23AE1FC633AB1A851249E1009105780DD51F9E
+2F5D00D71A841F973404862C0D77EE3E01D05A04DF07BB3E770456B01A6036D1
+00621FE25000C7701F49C138EC6A1B6FD938B64800CC5D107D1D5005EB27681A
+AC5F116EC2630CD001613654006F4001F4072FEE1F5004D407B40CDF00BB501F
+74265FAD11D62BF21BA531E9019440057E29603474275EB66C125CF90650DB00
+770EEA5823751E50B7246D1F7727854800BC50036C00750A6400D350348B1FA5
+28CA16356C3E01EB1DA00C3A115807BD4115A85A2605A5611B3294233B6A0026
+A0340E82248718980F85042F7C1236F20E6C044027B10041116C23821334F227
+47D761177A00D60441EC1F4C239A27821FA126E80DB5691DAC59006BB9412F5F
+2178277E1437870DD4002F7B26930F500083116C1AD35A139E0EE604A00F4922
+813417862C1AA446267D15B30DE004813B09D501B20BE1345A20A331CD27F026
+97290BFA02530979225AAE03C05F0D7F2754AD40D66C1262E1003DC850280973
+AD0051B21FF5500ACE4E01F303692BF73748D71FA858009226B67E065A317BB9
+01FD08B4501AA50C78014FA334499831058700F6085A04DB0E791A5A3904923E
+229F36097A00943F01C30566ED00A13948E5046C013DBE5A21CC279C0036FE01
+7826821FF501C605D74800BF6C0537C4014E0789305B12F54C2C941D77268104
+F908790D59017F0644A21F69C53C11ED0040861A39B64501F404850027910232
+860E6C007FDD4113F90E7805468E276820AB274FC0055B00990B83062CB21A4D
+0142D312F40426602E4165028C006B20C92C0AF4260E6EB22A6C1945BF334995
+003FAE12DD500ECF0154E91AC512FC4F33901A512C6016851FA422D079082A86
+03770D53A6206930AD0167385A268C1D98385512FC5E1B6CF1366100AD410097
+06425E00C4109F26921F40BA3A13E25C018638009B6227841250FE006812974C
+2C2152EC1BC55026F520B5163901822B6B26D53104E100780689113D7922B61F
+5132ED6C045DE4770D2E921E763CC900A91FDA243FE83A06926C1F63C400430D
+C8358600770A27C8650181470084277A133386245102970B49CD04B30AC70157
+0C60401E57E00DAA32EE3E05870CCF1950C5069F4100650CEA049E3000922702
+A11FD118792F50BF12E83C1F682D7C00E360006CA83D0FBF4814E54008D104BB
+260A7927DA3E16CE9C0F6F4207AF014061064970C01FA10C8600A7611F3EC551
+1AE800AF400E68CC004526CD124718BE660052A5134B851172055AAF1460B83E
+00AD065526E360017812A522F55A052FF01F28B918FE05B161006CA53B20E512
+317E226E2744F734B105FC003E6F43006614C1274700933312861FF135B85020
+782350B412CE490E6C279D05E11B3B6C0479AF01DE17573D098A1A5022922C05
+965025861F5A316E40B20162088A0131C10096284D8519A334E503503E04CA1A
+4056109D6C0C30A42472135AFA01279E78083985009C3D21EB3401DF0A30E526
+9C350086045312DD277912913A1A9D2EE90494401DB46C085D930677325A400D
+E14312D260006CA4014ADA068F006C1983269A12B31FD5257A016EDD5A22EA44
+006C0B7A032FA400D30A644004793AFA013F65128B01AA500D40600C47B512C5
+28FB04D00065F23D0DB70141A300DF0E7F3D1FC32550055A3B19F70D31D5007A
+11891AF05E236CEB07BB2E00FC5F018627D2093BA26C043EBF6322FC500B8A05
+8646209B5A007E0BD34A2BFB22851A9E01F94A04CC4F14653856007F113EA212
+3BD74600CB1D9D2F0486072FB8401BF412673D14AE27C8005D356B04550E4AB7
+411A4C047D0762B427D1265AE0136B288E17E634B7004AA80DD55327EE3219F8
+26CB3579046C267A126931851253017F1A59F713921A5004E977006BFA8322A9
+65046C9E0C4922AD277900349B012E80154B901935CA0D64008C255016E51050
+01950633D127601AAE6C043FBB295012A30848AA01502F6B3B0DA73F00D506B3
+0FCB2CE3004EC301631A8527780168BD1A4A8F270485369E00C25A22771250E0
+17C127F780015D0DF427AD129D3F117601840E408507AB013C711F4F86122692
+4400820F5C8F057D009522EC1AA400509F0C49C822AE27D4330477263BBB5A2B
+0DB337120ADB0040CA3D1F69EB5A01D10D5AD91247C1013CD805417F1E50E33F
+1BC501AE228627DB1F427F00A40DDB0037F60F6902EE66267D330D77E304B318
+85531F8D277927861F622384331A9E26E804B312F1245336F90062DB470C6C2E
+5001EF08873706900149092FC82292007921D92D05FB39BB1AA60034F62650C9
+009C0831CA660434BB1FA10042B31F4F10AC018533D83F1DEA003578056E0067
+B312D97B002499531B60A271277C115901BB05471286279A3806A96D1D609621
+52EE0D9F28049D5A0C7E345500A80D5AC812692F6C278449237927A34000BE04
+D0551F3F660CD94000EE0B5001FD097801AA0DF95A007C0D3C613F099501810E
+AB135126B904E50F8630A225CD41205DB5764E12792AA5176200508849006130
+46C55E1B791565411AEF53012AE878074A23C82D0A6CD92F5B3853057601AD27
+61B110E1279E1F405E072769F20432E0002F03AC1BE5278325792DC6095001BC
+682900F7320AB6006B3B01B36C0F27F74913EA681A7B01319809EF01B108C001
+CD12581E8B213D6C00B01188315A26AD223BBB621250D04026770440C62A49A0
+17C34E1FD3276D227C0A97195B1F97276C01790468F30D4600D93D01E60850C4
+38B112279E0FE904510B8A01DC04BC296B12A37B0C2760F56C0362E63E018907
+F111BE2E550D930745881A500AED00AD3DC70B3EA86C1345CC396541009C0AF8
+00A41A67FD26521A8C40128649277912D05C1640BD793400960536BC26F5451B
+B326781F502D5B397704D4105DF4138425E800C6057601866B163FB03A046AE0
+15B1226807D9046C00863905A400C431F50043D23E00BD14E61AB33C00952383
+1D61A71F85310D7C016ACE1F85277924D82F9E26590E7A00B9381858BE003914
+861D5022B41C6A27994417F66621D230036BBD365A2B72024F861F5401799E0F
+F508B75326733562279400349210E204CA5401E006AE50052EF200500460C826
+7948096104875000911261E70DA500FE334A98052F9E057839501AA412F54407
+D8007020921D3E5A008612994F33F72744E8611A3E6A045A35860379490B6032
+465A13772AE904BA0A2F6D00E05A22F034045400BF0CA2007F1048AE37FD4920
+68DF043F9F48D90CA5007F054EC7005D0992003679015AFD3E0089049B14FB2F
+00C10DE7471F5A406C3A15DA0EB305DD0F42B8046C402777189E2F5E3D1F9E6F
+1C9225DD2C0BA401DE29A53E14D83749CB043482266A1483013EBC5020CB2701
+9C61277A361A95269F0EEB00B407CA3246EE3C00820EAA02510B78E312B123CA
+1BAB10FD37A300960CD626A91267344AF812A43A048E0A4876E33D196536501F
+EC016C055C0B8D012F86126B04347727CE30FE1239A427DC1F4AC41AA20D5012
+7923E21F6110974722823404B9001ACF0189045E1F7F2250791F49C600B10843
+6900C60CEB0037CE076C12924B1A6C127F00C65B017B0727974100D609AA23DB
+0D6400860A53FC4008DA005CC0045A2F6738552D6C129A015B1FBE26682B9023
+BB264054006C0D7A2763227F1EC9246C03840052A0078702405F15BD4D2FAD25
+069F45F708BA6C148423D61DA833CF5A22F826C15801970F792560860677013E
+81056C27D826C52FA70D3BC04105D451159F6125866B277629A730CD003EA501
+E612782C5B36F91FA7277A238757123CB54200FE39BB521F94112B9E20FB5F17
+B95A1F732F6B1A9027EF193B96122DAE238C2A1049E101AB0B8504F45021D10D
+75099601D6086C019406A12FEC5001DC07B401500554F93E1FCC3218DE276CCA
+01794000DA1A7D395A0027922C043CB650023C6D00500C97007D092FED1F4904
+A80033E91454B726E6129C0082086B0156920079306A01ED0D3BDD0512A51DEC
+126C2659F40C862F5506ED0B9201810D6304BB3204A56101852F5A084201EF34
+4AE40D6A40007E0835AF05E900B449037247B9004A9201460CED731F7C5022DB
+1BA235009027862EE61F791740FA3C1DDA2186053992156B2E40E27912399E50
+058642009C0C3B27FE1BA20E9301D112AE6B025AE27B002779B312EE27B81E49
+38B26C175AC9691FD45A2279320B8A00405D3E1FB027E91A45DF1CB821902A7A
+004D95FE045500850694023B654100A7691C7C22CF2749E4471B6AFA401FE022
+C41AAE7926670583003CAB1DC927F04B168527793211CE3E076931DC1D5EC76B
+3300B805349400662749BD136104AD005134C15F1287570076125CAE2451C600
+9E0A2BAA006912EC22B2621F50B45605782762266F28780A3FD113482262F309
+405107920261E40E50049100460B95410DAE00CF601E6CBC06F95804710F7C34
+0A87014908B11FC4263F5A348F3949E121AF17C212D62604BF345003AC065900
+92085000830D6A0477003FD20EAC19BF5704850A6501953D01C00B419A5113E4
+22A30E80064E03974A2174FA1241C202790840FC3C1666A20D5000B20C36A627
+D63400F50E41831C75461ADB2677017B0D3EF20479219D13C400F405B61FF026
+509E01C50C33961FC76621823400A122D827B226F22F01771A834204F33B247E
+1334CE279600AD5A2668F775146403881900B00DC3092F790D6B2795334E8647
+0E9B62137E21CE30B127D326A2319D27E61C6C38542F771FE12550BC4112D869
+2452F900267A0082046339F71FB31AD23B0D5727841A58D7267F0078C62604EE
+1F802762F107690249851E970432EF00BE600648C14B27C6007E3911D4014F31
+6C385611980086083A6C1AA35A0577002DD410C2572785127708800450C326FA
+3512944F08A701469700491BF84002CD0D460052E34010D07525792762B70045
+EF014008FB0127DD003AF0279F106E0C7C125001F3065A0B8D04B900F8084E01
+9F310D7D2D500F8E055F3ABD2EA72750C9002E870C60017AC604B100F0320E46
+B74C1230924A379B05CE0320409D23C3096638CF5B267E1234921F5813921A5B
+26B950276BEA039F198642346121B412FE52003FDE12A44404694006FB014F39
+E0134789119A014DBE002BD52060DD0C6BB9610631A2279D26C02F06A5602707
+D801F804513686115AB56C1F5EA117B354046D00851CF5013EC15F1F7A34AB20
+6127821564A43F1274F504AD00E427C81884027410F21A3EAD6C2648E9412251
+306C440CA771015D05DF5A00D50B426C2F4979BB0E3E5A2FE200500CB30542E9
+01B004FC0640D9056900900B405F0DDC06C601E248006F3E25BB1F7B3050F726
+9B197C1B5CBB006332C8003C6328841C67A41486301986225012D576125F0484
+127C3950019A4B355B229B1BDB239F1A490090370C7A341AAE22DA39602D4986
+082F9B0FDA004DF00D48C42705D556003E5B22841B7601A327DF1F5F018B0A55
+05D6008209AD01E4129D27501AEB229B341A7727A919E9009F260170FA00A412
+9027841F5AA522653071275AA70E972DE41FAD22BD3D206C26761B9230CC049C
+0D6101B9043C7901DC28A1370D931A822052EB05AF0DE433095401B54105E801
+7A3D004CE74821F300B51AF020C80DAC50126D017E04C927E421CD4800EC680D
+7E4914BC00A51A58D10065227E3905943301863A6C26B21FCF4406B738500C7A
+0652C33F26E2219312621F6C148C295B00CF048D2C771260AE0985015A286A12
+DC5E31158026781FC201F83F008A0ADA0D9E013A6F4415603E0878005AB30080
+0CBB045F1683274AEE471C900D4BAD0B6000D9482FF403A8127927456C044879
+F03A0D6E9E482FA51FC5267900AE306B27790E6700762B00CC31B2395E0E8507
+7701AD2F5605C32702940D6C22EB03387927A412CB5D1ADA5A0EEC018F0A7901
+99345A0EF46320AD300D9750007927A332BC27F64905BE34693C0DB400CF033D
+F52149C90DB535500BC74908D50160103C6B13CC207929831FCC12F600BF0485
+CD27FB1B4C34EB3A532AF04006D6006B097726E8163971278D13AE015B42356C
+00B712CE2EAC002668CC3D0026C00862049F0C501B9A0DDC01A93C8615EA7949
+087812F33244B72C5013861B983350FD4636DA510E6CB412FB01763100982340
+A81B5313FD2F5012EA007D1A3ED100784505CB3B18FB017704860038791F8211
+FE631F4726931F50A204793C0097048A1AA8395433EA47B6049B364F04B20055
+316C472777305001640E8104870E6D019610A55A208E27CA2BA9005ABF11F105
+77248618BF07E02C583F017E115AB9045215FD6C1250F339176CD63F01861841
+5D26049E3F0527E31F540099056710F66204D441008926019609289F4205501E
+86265AB00C6D00782CBD366100C16826A627BB044A8622EC5A126AA90D481CDF
+1257B40BDE019E400079E25A08C2013A6715FD5027E422770083059827006D28
+5908E66C1240F108B404A40CE6179B33A728D123AE26D71F790035B612500183
+0C7A320381216530CF0D6B2750129F05F66825DF341A922781073695270079B7
+3B125FC72254BD09FB405A1FA564006CAF4027DB1A7D0026A54E0BE8125EC61F
+5ABA002673CC4008E0043AF521C70B63049D0E86380884036A12932F09A40033
+86014078C45A267F341A93263D5925A5144D12852F791DD8410686123F670DF3
+27BC1C59AC0DDD16A0253BC460257F1F693557276D09EF00790B600085085A2E
+E269083EFB601FD9239F4937C700A50540FD00B05F1F863B0D8E019A4C00D622
+A64903CA6920540AFA042F810033921FB100D20C34C1280A86044B39C43E733A
+1F79277F053485043079E53C0093561F935111804927E93E1FDD255AD31551E5
+3900FE6C1341B21FDA2D004C079F01D344006AC308D1046C27B900EC0CAC0092
+2658D201B54F1F6A117B013F633084007901520A96013DDE00C405AF50226B14
+9E32F84538BC01501FA379002F95127700E40950841F579D1F803604D85000C4
+1C4809F83E0F6C00DC2E580EE301842677A90DE867066C127B254F921149FD1B
+BA77016108E100C710B31EDE6A12F261145020B21232AD002EA604348401794F
+059400338C1F3FAD601D3DCE6404770B64B512EA2A690D6EEF0F2F7F1F3FF70D
+487B2773225230C40440942C068700CE26EF13C70448FB1FAE27D61FBF5B1282
+1B623F018727DC490466127F17920DCF04255ABD075034AF1B922C0FEB2F0164
+09E671123184275FB26C1760BA269D1A77059F2746B54E003E5A3A22CE2FE001
+3FF2043C830170310DA4238713486A41015A3B009D3E08C001870567EE0E61CD
+1666D51AAD12C44012F75004CB01500C85015025ED279E1A357B228C15B23C1F
+5AA400609801A93306960165F11246A5112455DB38A23275088522981A369112
+4A0086440694264BEC10CE1AA50139C81FAC01F432477440E73D1E6CF4044467
+01B443046DD626AC2A0041B81AED1244269204327C0C3FC4501D8212621ADE11
+B3048D0057166AA31F5DC824A526DE5017EE502BA004FA2F9B17AD4F2085266C
+2ED1401E793801883A00932549009B306A1FA5279823DE27C10E9C065700F349
+04C000435D0692033EF212523B1B68E016BE3F0982005079F400780C5A0445B9
+345000B55A056CEE660E2CFA18B600792F507B0D5A96066C2F415D1AB200277E
+04A000309D1FD23C186BBD3C1A90114A9E79075B037900CD0DE25A01F560003A
+EF01CE069C49276C471ABA409633068400500B69066000864102C20D791C8203
+D14006DA014DF80C5A008E07DF5A1FFB5B0C6CF05A1AD80179095E0D6C00942F
+7C1E40B63C1785395431F51FCC27BB2249AE05D9770050365C209E27DA28033E
+6012B222FE185D01E8690D27D82F043BB779013E6D3A0CBC0027F5341250E900
+C605850E62C1185312C74D0D75025AF900530C7B003EC90A2749D338AB4D1F7E
+41228C2D12B014783E2386320BC300ED2D780C265AD614B528E737B01FBE3312
+98225A36B80C476A1288279610379F22C626A42B0D860527BC183804812649BC
+3BF139B548136B00E360126CA701D80B9E0487006C098501357D0D30BC0FA500
+E504550D6CB41FC62D476A00922779203DC87B00418B1B5A2150AA05D6531A97
+47047FC1270E70209E26ED35056CD8375A22E4298B12338627A523F063216CF4
+006F0B5905973400C0074799216404BA5A00F6632681125001FCAB004C396C0E
+740049840552D30146E9005E29A525F700521BBA5F017E09490150BB34429903
+4877C10D9F055800710B5404F921A93708CD022F72226312772547E34E14D464
+1A9F5A227027841B3CC575300A85057D01D9400FD407AF0053114EB20BCA00E0
+0F65294687390FD0602200783DB449127B00509C270079088600A80AC54907DF
+0140500DA20133931FC021FC26D5611B6CE50141DE324F1A7E38049D0768B43D
+1B0A791FEE01AD22CB122FF42067347D1F9012E2007F1A3DCC770031E32758FE
+79156900E95026E0003F642DE916AE1FC726A128750F5A92265AFB10AE27E634
+B5125B20AD2D00EC4005FD01CA094A872600FA4937E4219D1CA7345086167529
+E51F6B27723F24A400EA1E01FD69053DAF43E1085A02DB4C2AD30A48F227B31B
+63267822973F146CAE04D2195AB6104E2F6A01790D3CA10E512F79088700D70C
+A44A1FD0340D9362C9279D1260305A04935000770CAD08D5046C38550BBD6626
+0C43A51A96123904D7279F0A2F7912921DD012416C2F5A017B078901D93200B9
+053F7F006C0A5A008104950B41864C1292267E123EF501B05A119D0050770B62
+01790546F725A5019709F2029D4B1681276C9E3B2486166C04289622853406A2
+123E9011840150FB3E04D90060BC3B1F7C2788380477EA00AD501D94014AB400
+C612A52273276C22E4400059E30137117F003FA005F93C19D927B93E1F6D2640
+C21A9E3250047BEE600F6C04C0714C1E821262C701B0365E007808AC02DC3747
+EF195024864E1A872050CE1FA926C72FFA2650C70427AE00502FB36320791334
+8625CF122FC026F027C6310D82125836612E5112D13A0ABA034908AF00EF2EB6
+5012F900BD601F6CCB01611FC3310D60A11A850E5000F9084F00E45227148639
+0AC629F01F3E6C1F922AFE0FB5018C096EA8152D865AF43050DA1F771D854707
+7F045FFE00B159067801EA22A8133A01D822872F00A63D01B5451A864906F928
+BB5222821F96112977CA0044EA3B0CE2033585017606690D7900603AD91F6AE2
+0B5400950841DE045207884B0294097E005C9F043DDE00AE06BD6C0061901F3D
+D6601F7F4B0D66007D326C1B3FFD003A26B6400877AC002C6C27E81F9F2460C8
+266B0DBD4706DD61246C118C04E954057A005C35541FBC2A056CC425044307B3
+02950CC900B55A129D471A842F12F326890E74005AB627793F0AF34313E55B2B
+00F231137922840433F60E6800D35C0C38A22704679927794912EF39A31E9E27
+E8169808A10337871DD331C0661B6EBC3E1FED42356612AB1C40C1641A751384
+401FF74401E36A1241C40B37DC26C81F9E098A044F79AD690458DB133553EE06
+9201782C840D379501831A9B3350038500A52F653B12CA2741A615EB3C0060F9
+400151A41B86233A654127683E22E73201C7085094006036B32ED73F094B02C4
+6B1F62870626CF720C50CB00B2104893004EBE315004B963086EBC3E00C50EB7
+305E1648E00149057D2C6C274FB906416E1050009E2F016CA000AD1AD35026E7
+0150089D23FC2704950C349728068B002FA55A0192085E12D627B12E10481BEB
+2F016AC71941AF345512DF01B45A12D72D5600CD12AE1AF64909D400865001DA
+0A6904A1791A501294276AD01153ED00B10DE2018A0A62A32340DE1547D20351
+166C1F84FB5F2705A3013BB26C0E37AB1F6C395A35D81A783A069B1F793419F8
+2153128F1A6000940886003378BA5724C501F01A6026F400AF27E9155FF50E3A
+530D89043380107822DA2F7B0152CE3150C71950B41CF3760428792351AB3E01
+790D66E100820C6FB33E0581005A0EC93F207930049D4806FD67267227793515
+8722AC391A9746319026470EC926AE08DE0034A6047922496C277A1AC6380F6C
+9C013B791CA00CE604AF004612945033D4125100985A058E03EA099D01AA26E1
+5F12EB018C42009C06E02648F74B27D720B46409440F8D139A0D8501974A336B
+0448860528851ADF6A265DF900A3288600AD0C3B87470081057A015E34511A45
+D212EB0027F4491AC101369F27CE22501F9B26E127790462A50C66F03B16863E
+1BB200E2045ABC02405D05F85011BE01D46E3E00842F771F57066B2746C1099E
+043AA70053F100275AAE0D86256A34562A781BAE00EC0D417921FA3117DD2655
+126C27500E8B042F8524A40DD650276C2F8101750AA5023E5122CE1FFE006938
+5A2FDD3D04CB129C380DB34900AE4001C7083F5018D012601A4DC50F25EF12AF
+2DEB0DC500AD67058533A150149D3B22854B1F5B049400FE0A5E12A41FF73200
+C4265200BF4E01960C5137930D2978E00D773F00831F662D0BF2591CD7013F91
+BC13FC016C2A41F65B1F82301977CF082CF9013DC500B407CE4E277D207301C6
+4904AE64003FC630B100F1621F44B4003F582C6B10B200CA12B321531369F30D
+9E016C2F47D61BBD00670E91277A1ED95A22D1345A128E2F9E1FB9680549F737
+92005BA6276726731F6C2678123CB9410E6C077F0062CC05F709AE3E126C2946
+BD3C018309874A1A94128A431FDA2668CB1941E964004C33B61EAA27E805AF78
+3504871160EB22006033A10FD001500DB604D660053E976B1F5B95117A1A3E5F
+01DA083FB92B5D0F86411B79A401831A7A4004D96C1269FD07C101931E792360
+0440D1783200852750AA04870854127822B5195200A530017B0A9204FD247A0D
+70013498206C0440E53D067900D708A002992CF7045A00E020C226E841125530
+6B26E749A70582006AD12F5A12E63D04D12E05790E7F31059D015021C2148C01
+64086D0F8124005AC425A8480A813ED419783D1F882678276E2146AB125000CC
+0A45F22764EE0E9B1AA156149222DF3004E327124B0CD23414962B00C833177E
+205A39F20446E537832605C0471BDF133DC34227A334F640026EEC3F0D6BF91B
+A327781A5000D427E54500C913B3266A1ADA21A3125536E11485227A1F943460
+018E290478A5029800781B3ADC1A9D0F5004B74100A26C2261F235AF01EF5A24
+B90F96076C26F422CF31BA394AE2270C7E002CB51D99055A00E56305C200EA09
+9E002EF71DA622862F00A4053184266E3400F7086C0077A50B4771FE5E2368C0
+0849832250B00041DA1254328908A000F941179B5B00800C5A00E6057E0150CD
+3A0565C222503D00DC0C61C43E16860FA676295301860A95015A33478700593F
+01AF0CCA4913A554106CBC3C1ADC345E0FC201612F43F51F92237E34530BAB01
+50126C394F15812F7927DA2DA7048543005D049012974837F77804504626BA2F
+5012963386145735DB66047C335304BD5A12854100E704BE69274AB6471F5334
+BD023A0590005136F50D9E0361388809A101C60E601A6B12A5560434B327F02B
+862061179E0D5E1AB22A008304BC5F269F30046CB1045A253D09F2601FD42F41
+B515F526B30DCF60266D2F09FC0031DF1F5000924D15D12B407A0DB1046C3B00
+DF07C514FA277C1F9E00C30AA800FC045000860E3B5A129E18FD286802D30856
+123CE127850E7B07CA491A5D3AC40D5012B9490CEA6C1538D621C34A135A3F0C
+94015A0DF0017E199250B51FE7129E015D1BD112ED236626791FAB27E0307B00
+29E86C0777046A11A634DB27792695104BE31AA44008790156EC1F5038F201B8
+79410C9B4F0084046C0A721C814705E300AA79214687059E0DF9260986009F06
+F14E258F13C0502779216A009B09D2305C2285276A1E3EC76F1F60C501E1277A
+490DB450227B1FBE6A00B004EF249E3501FB08AA018E25850036912600B36104
+6F0D792ED21FAE24DD1C86289926EA00391079296C2641BB4A277904A600D136
+50006D03951FC9650F3DCE1FAF25D3067100AE04F901458E093B751FF127BC36
+0B9500771282490527C43412FE22CD38AC00C73C12932A5A3F0466B6183E5A2F
+7544BD276247277712C8003E5F0C940249B94626774A05E63F03DE0CB1631342
+EF063F6C1AAD0034860138A50094300C7834721A6C005AA5266F207917EF2767
+D805429B3D1EFD26A3019205840079376500CB06610E6AD65A05A700DD077300
+922F6C15824812F38418BD0C503F01AE1A5E400084365A27941F406333D22450
+CC005A1184147D4921D926BD2F1AE56C008864077C490D632E5A04F04F1AB412
+D53B016CCF00AE25017C05ED0CB400663449EA1DA929F31F580EEC0138861279
+4A1F92310094092F9022A2510C64CB1DEB6112DA2750F217C801AB28D73F128C
+00D1394C04AE0B5227E1500888005035E31A6032FB4204C15012792FAB1E4925
+CA327C1F4F14FA0EB521E6340186073F5A2D78F71291267F0AFC5314BD01F20A
+56C408A20085056C30B74005DD00AF3D02850DA163042BA72045BC26009E19DC
+249E43007A06864C23F1340D7A1464D73859186C422DD90F8805720068088601
+811A5DC91CAE00C7400551D636BA5300D60432EA4605752B049C48078A01490E
+6041127904E747315F129D5A227F1F95012FCA215EBF12573AB6125522921735
+9E22DE00800695018C0A5AB879264601990950C625AE22DD0545005C35D900A0
+2F0E9422791E8035127C226C12FE1D8802679F23791B67C23254003FD14809EE
+013051EB366B017E0C31BF27E93501811A52B327E9075003C132A30196047A1F
+A226D733B12CCE27B13504842667136CEE125B016C127B19449910279E16BF58
+1A32C31F3B9951FE05B64D2C670AB405F3003FCF01BA1049760D7C34069A0078
+0A8200D30946F4015A129A2BF620601BEE27440164C75B277A1F633B007C1368
+A527B60456401C76CC026031B800DD4801E83AA92D4F0DE7193C5A07F70B4F06
+FA782610995A126CA3045E10C15020F961086D1250BC0E9B006C0A488E1F7811
+831FFC225039E101540E7F1A77126200964912F62DA4023384269F27F624B063
+006CBC01417900F66C0062DE20003A6C3D00C51F7F266C27A81C6B335A39F61A
+AE01EF6727C926F129A12760A60D41B53C04750C3FC13D00820DD31A4B10E100
+B404FC5627BB02376D0E7D19EE6B044D39E40C436815863059196001C35C27AC
+01CB412E98227A1746C96C0139B93F1FD7279B0033860438A4228D04693140D3
+20A43600B327E300540865BA145A32C94000FE093FE5500DD93F0078214FB600
+E207500B850128F91F5435E4123C5012B3440A79A923D91886109900DE0E790C
+8F00E9079E008926543E1A861149026A0D7A0450307C1A63CD27AE50046CB324
+972E7F0492385A146C401A8C125CF31FCC27970132BF11A700861A9E5003AE07
+CF0C97360091126C26890051DA01AC27043BE01D72008E0D801A41E112B75800
+D82EC41FF502604205FB572384143DAA762F0093077C1260AD235AA005278422
+5AB40FD4095A3C1A75BF3549C4400D8F04790864A42486052F88260C7A066427
+F4385131A03AD52E50137C276D1240D100B4045ADB751BC230E920BC01E10840
+006C13E627095301F822B3480D9E2ED408AD01D73E0086064D0DB150267F1F5A
+26D10D38F8278621702749D8254FF10449B71C41860E60B3137F470BFA2E5A01
+CB6605774618830D77005A0D9516862F681ACD044CC6260ED74B22F1279D0138
+92042F78C801A8043766277915A2622B009505269B5031DA20B32E0CD51B6AF0
+03CB941F56BB015A08BE0461015A05C56523DC04BD610C7023922F003CA70684
+006C1285492780FB319D004878D73C18780031F001661B812677491FB0275AE1
+386600DA053EF44201AB620577004AEE01A11B860C349E290D820530E61F3F69
+00A534781AB936501F952F01E7279E2647B44A26DE00BA04A00D3A9601864005
+9F3F007820EB4812DE4E19553D1F6BE706AD00FE4004DD4812F05500CF064A86
+007C4A01A83F12553441EA003D961F85237612FA1F86350DB016593F1E9E32F8
+1247C62254401FCF279F3600B110541A6826A6371269AB0CCC6C1250A64000E8
+2F06850D7900239212841A609E128531501F9A23C7126B420E6204BD60186BED
+36C559007B04F05311C7036A0C9E00EF09B3791D5101FE1B6C01832A78123E71
+47E9275212F85A1A69AE11610A83286C00B408FA791130821C8A4C0D851A7A39
+5F1F781280183DC715EE335B0075B5011E4D8A1249E50D40CE2C46AD00499500
+3DA101E7098401A464089001FA770F5004EE6D1F7801BC0AD84C049200405A3E
+1F862704C156126BC339EB31BA5004FA27B32F007409C500E60D50329D05BE2F
+E2395000D30950007615A326913C22842649E347277C235B3C0F6AC541129F0B
+D113A22250F334007907C76B002DC40436D527B300C60D8B22763100A04901C3
+3D20CE27B201CA0CAB279F2CFB016040059D26D01A2980A30927D22F00A05A01
+84096827EC264FFC1F792768286C203FE412603A0567B82F590B50DB33418E3B
+15F21FBE26E501B605DE5E0D3490045001630A459A3F1E791350E335A4207A27
+6AD7015B3E17730079229427A527BC1F500DCE4A07D901AF0A6001D0064ABC00
+DF3F047E385833653F08C801600CB819603E21B17712488501941E65335638EA
+0FBD5025D8275A0A7C006A0F5A239200DD047526901FBA6C0F85074EFC0433C2
+5303A76B1B3DB122E21A9E3A0A8D045C0DBF00D806B800572FAE189F3E017916
+AC280398066000862E66057E10772B943D1A76F61FAA259E1CC82701D76900C9
+0B5701644008BB0441A71FF7850CB51AFB10780182083EFD6803309D12502D79
+16A31C92146C325A17AD0DE200AF05EE5A27841F954D2FDC007E0D5034E81B6C
+0B4FF504A3016142068E01407412EC29A433E6277F1377365012AE0D53002DE0
+213C94125E01690F7C3705F611783F00790660BA412ECE453496127926861A78
+02D74924E321C400884622EC1FC55004A15523AD49086200A54000680DDD2779
+00865A123596277925B712FD5A26872F0B7900265A308A015A3AE21248860127
+C26E2160BB00F350266D2FFC0D9E0179268622811D7A27029D12E541018A12A0
+27F6068E00AC27D8390E8222CD159A274CF11FAF520369086D01A505F7481ABF
+62013BE77B470167C10044D97722F01FB8492A6004C05027D91E500086027D08
+564837EB0CCF269A3300860894345310CC600D7C2712DA3E12EB0033FA26C750
+09CF2D84045115FE3406B84A08EA0192056D3300A51161C836B33FDF056335AE
+065734D01AB2553900F41A406B3B08D50485005721D02AF3016030D90F50C335
+7A0029CD206C04501AA5235C0D7F005BB61A502F6A04D73409850036D227C01F
+8A22743009850041D070260EAB7813532FA017BC50006F0C8700D633640D8601
+7111E617AC22F61FB4145F45007C1061F5136A4004F8691F3EB3004895580088
+3950791A860E2F892197135FB53E0E619D1F772C5B3948DC1D9D461AE8015004
+6C0F4AA012CD22941D7B00772A04985A0D810496138627AA1F40AF3D0C6C1F50
+BB0548A600770A44B5670554ED37B562024ACD46259F2E046CE400B13F126CB9
+1549791A860E5937CD005BB725EE1B3706B5400428F2027E073E0D2F9E26E21F
+7D129E20F027C335A227783061006C0480059D354FBF042754C91AA927099E01
+7734F70D2FC1270BA206BD0149EC124702F3390078CC033CF100C51BAD0E297E
+04CA58269D1FF52298003E6B004F03F527A4145EEC1134A525E627B500530B60
+DB0465A3008C113D8F15396A1FF726521B933109840027E4137601FB124EC73E
+127B1A5DA100572EF605B4003FFC0441971745970568AD5A196CD34D1AA622E6
+6079CD0A5001AE3A5A054B00930979005B05D111AE2DDC27C41CF2083DA57712
+417E00844931E2126B044A841A53D0412761387E006BB65A26A3224627941949
+7F106B006FBF0C673A12792D810D612FC31AEC2AB55E116C04D843226AD20550
+00791E3FEB78123A861230C627E70052FB04CC3B00A304E00EB14915D3437B38
+0CA43288016606A924F70134E11F9D12602F4A7817830C4EE801337A104901FD
+2F00833F0D8F270034126597365515FE38B46B146329F7269D387724800F5A00
+712786194800E7063ADC11B7005A39A529D5089E026A00E311B21FCA234D017E
+0667E00050BB05309127F7381A50F000AF08D9004FD513498508790C338D2684
+3807A6012F6DB83D12C867012EC3014BF1600475249A1F3F83185C8B216C2D74
+0085355B123EC0511F6926E91F7930620D864E087E013CAD0BDC01B823D62812
+61C41FE0277E0D5AAF12C75C0447B158F40027D504A3087E022FD21FAC128401
+5A08EE0140953E0DAE01DA6C2751971E50711A790DCD017F1F6A27FC21721786
+045A07970FE419C33B0C85310D66D501A4095AB1043E83226C27A138057A0138
+A92650CA01E40E63C012489E0E266A920527A3501B96270041B20E4809C5014F
+BC0641D70CAD25FD1BBB019E076B04DB00790940CF00B64021C52741CB6B267F
+1F9432500079B03D046C00A226C31F3C6A0126F86C1A083FA54F1D70276B26C7
+520183044E1FDE2AA61F50BC19FE54217E340BC60147C4032EFD279F205011AC
+007A0C50A83A5630F636446D2C416C1FB214EA78223E5822851234991F49E201
+881A68B121EF5704DE006C3F1C98005333E10059F80841DD4A0EF94409B9781A
+2A7DD65F27790D2E961235870148107A276A27F123A92B9C14BA5A1250269703
+5393105800EA053E5C0DA46708520E932F860B56019A08E5439F3D01C593265E
+058800DF109F1940EC3642C6650C6D008535047A012FCD0443862276300D9C43
+01860765F04032DD1F962E04CE009D0AA700D505A2008F045A4000BF04ED4600
+D95201D0063F600DF90231841228861F9F13BC4D2EFB19861F79391A99280085
+3C018C345107E266054B019222E64804F0501F6CBE5500DA0C99004F0E77258D
+340176F10549DE3300FB229F1C50C000F61A40C81FF326CF183EEB412285290F
+7013862200B50DEC24AA346000790B5B0E930030A026BE12D15A27B569135BF2
+00AF0FF0611ABD5A24C8360085055F4701E74F2277126C27821F5C12F94733D8
+26961F6C128E30631F77289312BE4F255AC7005FD30D405A3B019205487803A9
+06BF4902CC681FC16017D320A03512B422F311A50086336101CF073917A22F6E
+1E3DC15F01F50452D63719802C0C8649286C09468612992687016C3B007804B1
+5F126CD10050BC00D530614C1B782D6C138622F82FB527D82453F4035E0A7946
+1A950D389907297826823400913D0A79044EB412CF18B8346109B02AE021BE0D
+3F8734540B84016D0952A83E07B903F40DB5267F0034A10740A63E046CB806F2
+6423C50D37D12661128035500C9A04317A006C035695007A3159396812C7259E
+2759F567088804E779122F861A7F220A60AF00CB5E1FBD0DB339D30440663A0A
+E327AE5A208C34009F062D7F1F67385206E138CA048401D1094A0490069B0482
+0B3A9927E13405ED0042E61FC3490CDB014AD35012ED27A1225B30446C019326
+791D8503490060ED01B717C822B01AFD2A01D35026782D8600511AEF6C12DD23
+6A1E9E2C1B7F123074159D5A007B27E700AD15F42759DF0DAE2BFD233ECF4402
+BA08DB50006F0B7D004926C51F5640005ADB07B239C178270F9339069D013F75
+00612EF100C5501B7F1247E10C54F52261B80CFB04A41B81126B1F47B9492768
+BA6C1C5A336B1FC360117E00A56422886605790092395E2DAB05277A006C0CE3
+01AD08FA3D0DC400F40F55D2793113952769007A2F5C0E9E3968149D1DC7163F
+D465052B9600770AFE0050E10149A700DD4322F012941B67256E067F01388626
+770B9114601F8627751936B21FE113A51A86013FAA26CA1F3F6A26005A04E150
+1C6AF32764E8139D268F117919853E00BB0532A71D3F93013E57338927E901AD
+00FA0D5A1AF1004412CC26E800A83801D8223E5213B92C12A632601AB208850E
+40A31BCB36981C7C27661F854B145A38A53F2606AC43047E24EE4802D7470078
+0AE80060054A85013AB355193DB8304A87156137CD2286340490085033B304D5
+2EA81FBE4D12E81A6300EB05B10CE601A55A05813A5A2FCF0E5CEF05790A8401
+A148EC40257B00BA3101861A3B5107DD015A26AC03D85F228666017F084BDA11
+9F005A0A693550782F7C0197103B8A3F017E0D7014578F1A6AF908780448DD4B
+03F95000E21F58FB04894A01603E05CC00A50BDA2F9D046B00BA651A5ADA0F9F
+08378B1FA625C2344E3BAC38FA0C9E1F790DE950017F0F41AE098302690A5AB5
+2761CD016C3E0D8E00405F0979003CBB462F6C375A20843212F84908940042AD
+3C22691B9C31FD3B13700EA52F6012974711C502B56B1E49C24412793A07FD48
+12D426C0142F6E26DF1FB212C62208A224CF2752BD06E35020B32EFC0943B500
+5029CB369B00278812387727A438156D3012B325F5571F71297E006A26EB1878
+0D2EFD0036721E5AAD117706407D11CD087A016C2746E000406B1FC522DB042F
+EF26AC1FF83F00790C409C11FE501A6BED22C826AC5112811DCF009E4104C46C
+0027B722EB0C76038600DF4A0C5A009605CD4B0BFA4005D75A277A2241A30A6C
+05ED4A1F952D009B35530077AA0186063F733B0395DA13760582016C3913953E
+00842678043397248201720E5AAD0B6AC31A931163BD00D86204770D40AE0FE9
+2250C0065934D741801078B203D04000E1275AF7016B275A15C11BB4125B2FAB
+0189085B34A352006E0C7B4A12C329E620542F7404C1350183053E6C01DE049A
+0E5018FB27501B9861017F33651FD227A43614B727C422643E1BAD0085355000
+AC08FE0034E424863501CE0D67B84104ED691A40F3124D9D00F05A27005C34B0
+12E91DA44805C6611FA012CF500DE315B01BF03C1FD72C075401D00A2F841F3D
+E11A8600683F01AA123D8112A32401C4511F502F6326861A96042750AE04EA43
+2D650085089117D3263C930062129827CE320086266C04A500C91F86264EB312
+4AF81F9E263A5A27AA7301790DE13812DA4812B250076B108C6100790850E701
+8B266817E21F82306E155C99125000B161277B24551E92310EBD235B2CD41663
+410C863EF71A46602A5000F430530EE2023D6C1D8A015B2F416C0186044979EC
+3E227E4906B700459F2DD619BE4B347301CE4900649827049E0AF101B5056133
+BB761237801F8702DD4D22F336580450F612BC27E31A460577EC199E12813964
+0D5A00E118683192005C1179BD00F2063057BC4002A3772909870135BE27F404
+38D928AD1F3A6C12D2279B03A00ECE22B42A0168C72D510BA104EA01C6084986
+047900A50939B626C620AD049A00D70BB2641A880079274EB900EC30479D0ACF
+12BC5031A400265FAE01F6275090155A026C3B089904F12F5F1AF733076CE338
+6B137D1B4BE60B5000EE6000C40F406F05974900C1781E6940066F017ABC6020
+3D5A01DA4805F535B54010A001D90D3DC5500740651349D70F248A2E520460C3
+21FD5A006D19B054026C0D9400B75001730A5A2F7901500479D93E069D15F22F
+8C123F7827DB1A3CCE411E6B89017A055015582E6C219233047927D9229D1763
+365912C41F7300613F0DFD17418F053B69129A340DED23AF0CFE54268421A700
+7D2648BA114F00C05127D4391483269A2F12935033A51FBA301286280CA001CB
+39AF480E4C00D406B74C2F1DAD166D07945A27772160A4042AE51FA334850096
+4700C61FEE41007E3E1B850D924122851FF73060401AF134BD25F51A62EA390C
+531A81226D01772150B40B6B00A55A0764FC043EDC1A478E3AE112B6400152CE
+12A40A6701F80CA6077E003BF6279E1C840162CA20E017B95300D44901644128
+7900D10E6C143FC50C751A8B26943204850069B001C6074DCC2709FB016B0B60
+D20447E24B2F6C0D5A26FA1B974F2A6D129569008524DC3303F00BB9451A6C8F
+00750CCA1A6927F16014790827B44E0CA727D93401E409A54506C9048B277A0D
+85009140116CB226FA00CC36AE0DD100602EF94F112F91203B95135E2FE902A1
+0079076AFE0E39712749BB472A6D27D622B168115004DD26AE47096C00844126
+791F8931CB12BA1A4F389C02E1500558E83D01DB0C5DF422AA1236791F408801
+4983269D27E91F5035A90026B319EB009E046C3B0BA400FC0A38D62760007946
+1B833100F20A36D02386013CB504410AA836CE7B112FE1005E06A06526795012
+92236A0FB4004815C02A04A54701840D5A4616613F26991F86023479E500B20D
+4CC3007F0D6626861FC73C2261B404ED00560883008D045A400379B73E147935
+129E27BE3202E5079F0B6C04780065A1065A31791FB22B04A56028AC1F3F5008
+56FA0459E7133CDA00660C7D009507771A86600985277F1F50B526E81C6422AF
+47059612A51FC65A019E6622AD5611502CF666126E9E2E6C005103469D1A4089
+2B5012C5002BD4003BE83E1F6CDA602255D73B19CD41319904BA00E84C05DA0D
+5CC906276E247901329F1FB845D209405500930132861F9F12DB1BC7143DA41E
+E42C006AC7015AE8007C0C50A4125739FA20AE27EF3513DF26BB016A1288394E
+0B79008605CC782C1A9E2F0D64A11AAD21C6384F23C227FE0D38D9014412E033
+0985013E9A500479304EEA0B8D0427D23A0F862F0479B8004605D93F00E423B1
+1CFA6C0563B510EC017A374886185F9F025AA4054E01A0097800935012E11F78
+27741B833D23A5381950B812D127F55A10723401126CF026A81AE55A086C2E7B
+2496334CF10D7E085A9F0E31931F406722F41E6035AE004983065A0C7B450080
+103EF35000CE18FC23C5126C2600B461006DBA032C79053F6C04D75A00910442
+971F5ABE67006BC52057D00D29E21FBE01266336497D0851E00061FE3F1C6CAC
+27592086145A07663E22CB3200762152AE04F90AB1441C810C32C212EE336920
+F82E078600A309F10EA501C150006C9800693E01860540CB04ED60AC3304770C
+7B461FD726BF013F610487006426D01F3FEE5008B803CF4D049B00CE23861238
+D627AA1FC45B1FA46108229F276C017E3048E53C93153BD140225AF51267E61B
+A12D11821658D30079114922AB3602792F0460A80086107041B200FA13B41F38
+AE165001CC09347E0DC0043CCA31A001840B50F113BC340E77246C2F01CB27FC
+4926954000BC530C6CB7233C6B48275A43336B1FF71335EB1F9E501AAF15782B
+50220058B31BD130059800830D50F70DBC1A45AE3B058F016021782A81153379
+2784176504C660006D04860534E7002FD3783A07A8530F9400600D46EF06790A
+9201358D2700520E64F332B83E1FA426F804950B5AF112B37418427F2254EE06
+2D77226901925B057F2695214DE80199275B93017917DC29AE1E793D015BDC1A
+A704E4790E50008606601A862712A1340152D604B100C30BDF049508AD590449
+0EDC2F476500A10C82FB12376E0050BD395A34A5186C2C5634DE12774E2FCA12
+AD00F80B5AB20EDA063FF22F4E1BB516F72C4883125698260150E9401DD627AF
+20C2015A2E47E11EA54F07B541CD7B0150086C017D0F6C2E8327CF1F3F82003A
+F4053BD3003A79CA0DAB27DA3412ED2ABE073D8612601EFB1241E9274C0D9200
+6B06AF802700922C5A3D1561BA6C12D030E4054DDF0449EF12602F406E1E862A
+62277B301279B45D008108F43B1FC8270746DB1F9F25610FFA0149CD04A20084
+089E01FB0C4885276C269539006C215A9D0CA5017930415D11CB01B1400D6CBC
+126300860A50047928891FBD00693D0ED9246C04263DAA1F9D22EC31C700B208
+5B0090064FD51D50960D509F1248015919810A54A700791255DA0041A63B0082
+0B6E00B95A223FCE26450AC8683909C400AD40033A9A43016C38961C3E801F79
+069F10FD3B01B40DE60146D227053DBE229912AB57016E9E5E01850DEC049022
+791240631FE7276C237E1A983802E20DC20449F027BB0134732652E1089E0192
+4C27691AF904379B27CA213EF06612DD056C118613B549009D38FA77124ADB00
+3F5A0446601543E73B26BC1247930131B4271A6ABA26E83F00C11C406B24A303
+6527D10468C325AE1F3E7F04F9500262EA225116F77B48277F1FED22581FA513
+C5005BC901B027CD206C047C5022821A5AA00060EF1B6C39046F40218B271A3E
+B92E52366A15AD29DD059C3D0AAA01C4345200BC5A1F405D2F781A861243E400
+C4053E6927DB3E0AEB00792E4980006D0557B300309E26A534FE25600279315C
+0B5000C30A2F69BE17A521DC34790D9D6401792C12E45A0076F7013384129B5D
+26830CD4501AF82F760C8A1847790459D4123A761F8E1A3D79049D01350DDD04
+650C9E01F6086125790B2F920D5A008528A41ACF4100BC3F0E84330A9E01E049
+C301E80AD085007606D500BC41006C26821BC64A125F4304E86A270679A800D9
+08B30150831A67237B1AAC00761F852650AB05C612E31F8E3411844B087A005A
+0CA027CB1FF01BB7278A27609A0627850E6C059401BF1A41FB19AF6B0827C035
+0B46A4076C0432F7019E3B008F4812B95223EE0133E52C0550B500D80CAF00C0
+4A246BB56D2250BC47276F347C298D19F5571A3AE83F12D900490895326C25FB
+16B344782C5B173C6A2F501127F5225A12831D5AF20EB20050039732F31FA027
+0A77D33412851F9A3240DA04A327970DEB335A0FB401BE0B3471236128AD0CFB
+601EE2401FD1277601800996057F006C0DED0436E24900F639B3275E24880C35
+80003FD964046CD05A1BDC23C47915405A22AE2F068600319E115EB01B6A9E1A
+6C2753346C275C12D5083A00A0077900D70DB000DB0EAB4700C66C07639E235C
+F06A1FDE03A1073E692600CC0C8D00A605BB6295093CAD4026A10B337E1F3DEE
+68217900851061B53E0051FE01475B0C7D247512F8005B4414D1482F632079DE
+009E088B015A3D039201B25A04AD19E93343623B25D532A21F4B75128634560A
+7300F24703CF5E1FC9245014AE420E278600543D0063B504E31151D0364AE101
+783908860035F20DA3019908EF049E2750E24829F312661F83276B1F75042C9F
+4013AE3101860C3801860F4C215FC004F14F1FA427FE2686360215497901E564
+01CC5001C3602707D40D5B38D9015012921B642CC126EC00B507574636C30298
+08A004FC501540572FF21545CB22AA27771337850D40561BB901E15A1984013F
+AB00C21AAF24CB1F5012A22F5200860977048F2F0079BE1240A01FF1290E701B
+8501660A971F8526D94912C944045A3ADF12562F7540008611931A5A35C15301
+EB06A737D36404268A00F95027C850B6275AC579002F94128641016112791A4E
+E02FC91F9B1231851A38982D0476A5422DBE19488721F027AF056F108A1B774B
+34CE18861F6C297A1C6C3B00C806B10E69387E1A6C10DB0749F72366D700A00E
+6C4004940B50D01479297F016A057CB53C047B12EE32A927EA2160FD3D0260EC
+056C098841C84927EA26B2135905A9008B28509A26C5185F38C31BB612FD3263
+01AB0A8B042F94223F5A01501279E24E266911A7043A0A99003913E34A266A05
+DE30BF5307D100699F007F0655B00D5FE81459DD1150008A019A062FAD047E0D
+3CE74404BD3E0F86056A01A50DF30040D7109527741F8900D505A400864F2F92
+009805347D2250C815AD29F722633B05FC0D4AD8462C0067DF20AC26750E8001
+990D501F9333168826A834046B009A0C7B003CF53E126F1EFE01306D00840992
+0369005D4606CA374AD01844E5104CB40CFE1BB5430C34AA05791D71E3601FF6
+486E0BA501CE511F7D0D369722820F385727FA3C00D23F07780040791AF52254
+35E369165328C8600085305A01F522AE27E6306322B15A227E26BC01F04B3161
+2747EA3D01BF0F681BBC5E03F92F0083236A127C00A35727A61F5A0FEF770C34
+92004705C61A5037B300D807B84900D10D4EE225B71F5A34C06C1A60C9259412
+62D20DAC2DF61F4CE730A41F772285002B61A4003B851F772781310072C41F49
+D841004D127A2F05B929416C3A10B50046E8015028ED08B60D731A8D4D208C27
+AD1FBF3D0A6CCC0E500079DF013F1AB322D5149E3278007B099304863E05A701
+500D663F04A012C21758267C1F3FF12D50129D1A90480DE601B230DD40107700
+8C0484193EBB501C66D7582269DC12456B26771E7C385A2C9400600845FC0450
+0A8F01503F00B34321792662017B37067A0DDD01AF12F476052750BC05DC009B
+0D60EA3E0882005A23B228D001AD591A8009ED0387269962126CB7045D862266
+01C04105A501FD0C6C0362A82F04821FA538126C964C086800486B0B41DA1250
+1FCD4A11ED1960E435AD24DB1F79009509B204D35B007908CF375A06B83E7038
+550A5D01C41AE034B525C8015A04FD0D49018730009E08C33F04E50CAC01F812
+3ECB3181129420DE29AE0DDD7132049F01E3159823AD5A1A9527822F6B1F3EC7
+7F146B27406318C904511A9D27EF0E7C068B16843500D9269E206618F93204C6
+24419C1F013FE22F5A12EA257B339D23D5270042B326F90C59C4270DFB2EA838
+E104BC1D5A35BC61002DA3268D3304821A860B5539FD2F84216C330CA5278649
+00ED27792604CC1F9D277622854912653F0D9A2184289F27B615F25A27791B5A
+90226627851F4FA21A6D00AA2F6400771B812E0960EC1358346B0AD80040C500
+4F0ABF049A005508FB01A50AB849288E25D101601B9F30F4224708EC69117600
+3CB3400079471B8F0031D752A51D94047E2960126C00850D4FEC771251028831
+009E420074107D1A99269200810D3DFE77086A00B54B11CF0045BC0E600148ED
+009C451AE5043196126B00DC50117D00EC07B138049E00E95827D3126C00710A
+7A4111C505F90131B401CE073A7901880FD94104C65027EF0349BA1F5038C20E
+B550287F1F6935EC5F154926D61F7832436E2F5A06F4006B1241B83C0070035A
+C2631F3FA82EC854055CAB0DDE5A0BF360120778003AD021AE00C92BE4433591
+240568B63E19D86C1260B920CF015E2F5012EE279F04511444DB481E802B5A38
+75019627B71236701FC3591262CD1F4CBE451C863442A91A84125AF82A6C2408
+8600A538E31FC33001943463219A4F157E2859B80DEC492D5A228536069D1040
+8600790586007C3F01A205F00CA7042978E6600D3EAD11C500E11F862649C036
+7A056CD31A860F4A01920C56017B0FE43B2585153485263EBC2D47F650097516
+83490B5A04C00148CE2901975C0627EA3505852750F500D065056E1ACC27AE01
+5A0CC601F908AC25EB1A7E0564C80D7B013CAF40017905600AAF06F601603249
+C800500DB140C546325F164A8D0450D74A0086470DDF3F09F30040693C04B301
+F51760D61F5AB512F827BC22DA4A1BF9125A26841F569D0F3B01B552007B2766
+0E7802A30B7601FC510E33AE27E026B327CE24FC48266C04C40066D604AD006C
+CD0E2685314AF20539BA26951F5FA60940F21F3CBD5001864913A40E39920C3F
+B835860070257A1F8E3260207A148504552FDE4001A128F6086C0DA32DFB2692
+297220790DE2012C7D268E35057802F20CB2013F26A50627E71FB13900659726
+7613D41A94236D0DA601398F00347822840C7730049E243C8A4600D63F01C66E
+238027E3129E1A9939D02F5515AC3E21A545047B006B087700810634BB12781F
+A22C0E501C7B140163B000C20427A063016F0EF82F136B8B0C7A00781EB022DE
+4003C9611F79235A0147E411BF04F04C05983E00C94935A5125D267F226A1691
+24D82087005A0EDA0350BD3D1F6CAE09D4015EE513691F84276AFA6D12659E0A
+420379D03C12C3049F275B08CD338A2778480DE46704C9015019AE6C1261CB01
+B7336417853105FA4B02614104F148006307E9345D0C8E00E761129C32F8379E
+1F53A20041F150074072B838FD49953719791F68931133E027860144D70032A5
+25D21164097A0077345006B401FA0EA51C5D3442953C1ABF22E0620D27D80077
+0AB206E300B5375400791447BA4A259F3000649E053E6222991E502FBA5200D0
+083900BF34165DBB6C1A52047822823900A550126A00E908BF264F1C92263FF0
+5D003DE60627790E9504F422AD44112FA81FCD355A21BC27871A7901D827791F
+3CD5431A6C124BD50E612F8A012779EB0055026B2504E75A0DDA3D00D05613A5
+1B507D1F59E4046C2849FB472AA217F022952769308327C906A100570977006B
+0F41B4701B4CF2471F8534445C04F0314ED0086C01820B6AF11245D116FD510C
+BF0092053F9E1A488B4F1B79F0004D11FC26AE2CE20D50F83E02DE26831F962F
+7401AD095AA20E33CC0B4D93411AE0264B0D790067BB6D0D6C0882018F0B5700
+AD2495125A05BA01590AC104B4003DAC05DC1A60C93C1A9E14D50DB58629009B
+4F228747077F003EC705AF0B38851BBA015705D7266B0D7F00D41AAE00501488
+26F61FD227A52F9E0439019D0C6204C55010D20C862698023BA51DED27C61836
+87042982003773277C22F112752FAC12E03D042997228600610B7A01A9187120
+7E2FAD045C4100FD5722E12E00659B1F852D00C3500077B35D27D4193E00EC22
+AF28DB1D3DF94012CC2A47EF491280269422652F86196B274994095104772280
+30541F0746C64008FC0235B826EB61177126469D006B0D812397128601AB385B
+127B0C3DE86C016A2B7B0E9204E6266CFC5827C221773E008D27A91A6812E722
+6342095A0049AE1F60B80E4AC801DF075A346400E90A6C0160C8500ECD2748BE
+4A1F91355A01BD0E901E50CA12A71A367C146CD03E056E11FC5E13A43A124701
+94064A8827508C01720FA26A049360047F006A25A031F70050E1074DEF029E01
+36B026E512C14000A666D9781227861CA9640B760436B500FE6221C927EF32B2
+006130C54205E25026C562042FD810B20050355A12851A491186003C9E1AFA24
+790150C63D059500C033A039790DE1005034861A991246AE04A3401F7927932F
+078540019D087504EE4312E32D613F00F10A3D6C0749C7009C045122E427A602
+3482056AED1FC65033E304BF3612C826490039C43B26DE1EB30DC701631F7C39
+1298253E7013F9670D7400844F0CF3431330016ABB005A4021DC2799490E863E
+04AF075A12781F50E70D5A208F34008608489F411B822363EB18AE4000B605D0
+1E5AE7016A065714E22F00AC5A2677197F02D90592269D12F1043C592F7E22D5
+1B5AC001DA10B63F14EC6023DE1C3A6600B0087705D069278622D8309F125038
+B70F8A00801C4EAE21D427047B3C0F9C0C62167941077EE879245A0D86085377
+3D19850EAA05CC5A00C50DB431501EC727B2341B992D04915AED1A5034E20D7D
+005F08F22C5A1A921242933B02D3083E7700F61166BA1EF8270EBF5A03CE3307
+6D01CB5A277931A5084E2DA736BC40099D6D0E40CE0DFE27702260186C317826
+6BB900F60A9F00770C37812564006CA30434861250C4217F27539E255012B301
+61047E0069ED1E603046C00C41DC006B0B49B85000FA268428A400FE5D1F4F05
+B101F21FA63704FA502CDA27781B34862064048400880A630547DE0160BE220C
+3E9A0575049414C8329E15A900D3502FE100BE6027A515B750279D04513E0199
+6F003AA50C499D21863B0AF30167257F1FD30E7700875F381BF420613E01A412
+B82DF803CC00A70940621B782A8626FC4F05B01AF4431E57D5003E79019405D8
+0F40FE02921A51E43E1FBF2D01A508F601673479123D9F318B122A861A5300D8
+23912D03A5106C1A406C4600C32667008B09950051F50645E22A40D72157EE26
+78127D390685CB004AD226AD2D782384016B227934017F1A78470C8800693A04
+851ADD25B06C1240F015662C7900F54C1C91229E12EB00AD046526F32701D556
+008507B649325A00940D4E295C1FE021A33E01DC0F49019832497C0B35C00D27
+68B50DF62F5A1AA5002F7927C3330C97530E8B421479279416EB04B75908F100
+40DB0568BB4013770B50C0412FD935CC129C2C508313AF225C34BD136A289301
+AD10509B013E9000A525FB541927863812861DF401500CE42ECD054BEF26A010
+2FFA1F40EC1ACD325F077F002FD21F4F8804E012AD3D0DC200502F6C3A56348B
+1A9A114CB11233A6276C158E05E03E2067AA06864001790CCD56276AB85A14E3
+00299A5B00739E193B854513AE374C70CD0A63007A4701F53D05D15223C80649
+24912F18812260991FA534016CB004E01C630085067D004C0BE0033FD20645EC
+02407901B90D4D1A850434C6124DD4196C0036A3730EF85D006C1059B93C1B7F
+12408F0A6400BA6C045A99017A4900AD4512C2600D7E013EB3274561047D2762
+E103AE0CC90643DF0141830541920BC801EA28691078C6013DE712BD50269334
+0690004609832666CF0627FA4704E40959009504E8260645A218F110B6264B9A
+276C00841A60AF6F005CD201BD4601710956EE1B3D5A31790DF3169F225CB968
+1F98125A33A5176D0DDF3A1F77E86126FE48278C043B990ABB610222A90130C4
+27AD3404649F025AC41A3CD7355022CE340AB42B128C26EB3654049E22DD265B
+00951AE5249E0F4186226A277B136030C41F64E7196B227A4F00BF561B46851A
+5A34690EEB005BC01CEF27C71AB3043DA36C12318F27A71FCB26791960B71234
+8427861D793400DC12B230E7013912F61A39790F2DF827C7122E9F0DCB00AE50
+277927EA044900812FE6008504509D2749A15A123A00A509860054AE1E5B4027
+11E6651A92410B7C066CD43F22F829009F5E04830C96008647195DDF05790B9C
+1BFD3452089C0DFA386B075001D72C08C300FC04B924740B9D00348504A03D1D
+96340AF00431D5008C05992785203F7C0D780161388B115101D05A006D057E34
+5E0EA2380177DE045900E009AF671F4907950D4DC55005A3541F9E650C7F0099
+65017D276B3E05C0015611861DF626601B6F26FC3800CC083500C57947126B1F
+DF320CF104D8804934C75105DD4B20EA1250008608AC6B3012B327E61E6126F8
+780D38A41F4F016C4300B6691F834901A633BB5B1A845037791E834A00F15326
+D65C0EFC4800DA08498823A45012AB26FD1A5204DB094AB72250F8084AE620AA
+411ABC12F74A01DB4100F2691F502BBA39602E500577C15B277F206C26853201
+E40737AB1F5A3C19D84112FA228D1F3AAE4531AB07A301BE0A980EB0602172EF
+6C2705DB2FB950059E492A6A2200B20D00268513983D009D27C71350400DF34A
+007A0740B7113F00BD50016AD434C615812E03CD3612D6226F123FAF00EE1249
+B30D278D380293082EAE1B27B05626CF003B6C01802777033BB9611AA4310286
+35129E29007C300B9423603E14AE0C86315208CF00940B7C01C823EC124600FA
+04AA00E209BC6C2657D00240E704AD4D07B200580AE56900DB0C763F20863464
+2779290C9F01410BB2511B94013679128301BF3D77286C44F6325A03BB532579
+1F66DF019A1D883E1FC15A016CA027621FF12F0D79229406E85017A25A098000
+F6056C31489E01346BD90849C71F4E800150860D307B1F52BC14F622C512509D
+002F790063E81FAE41046CBF1366EE0046D80184277721CB1B9E265F12F820A0
+1486017A2892173D6944145F3F128700279B6C0D80371E865030A46D1B3F9427
+6203D05012E305C7004ADE5026D03360007E0D5AF024D21FA74A09EA05A51679
+00D02C6608FC01B5092E79276D0ADA660429EF3103CF099612AA4100A7113F60
+267C0130C5278D289420D40A2765E7005631A60F3BE6123ED5044AF401A20E6C
+4107630047CE0C49F324C53A0D6D005DDE1B42960553378C1DA62AE800620480
+0E4BB03B7342045A38B21AD42550B910CF30A500FE2FB450173BBA4600F53E04
+D92701C40D5A19B3355A0082277A1F3D92042F8D12851FF326C23E0474006C32
+12991F5F3CD60D501E8612911B5F3848A510CE01AF263BAD501A7E4936702B50
+0460F62666D800AF0EF078044B0DC001521379BE052B97197C01608E00699E19
+399717632EE601B22DA136861B3E7110830554B426D01233860D2FD224B90479
+0F6C1F53BC4027FB03791B00BD30E412603F05A401793A04841B79490D6605EE
+00631192530C9513824933A001FD0F9725EC22B5015DF11340C5006808AC0343
+6C209B27B20CF9610052B401256CBE3A04E54934A104EE006A33571B870D7901
+D60BB105E500D078270B860130931A503C225DDF771F3CA56B0040865012B527
+FB2140BE37056DB4003F8606593D1A790FED055ADD01A91F752F0187069A4C00
+F3580181124F34C7019D063A96006A3347D950276C079D00F8741F650CF15026
+DE0539CA278523901FDF2D1AC4265F00EF096C384979007F08500D9F42086AA5
+1A52FD395A2F9E14E30D5A19802640CC391E79AD3E01699E4000CE0F851A3F9D
+15E53F00FE166B258D2051125B3E19B04838BD50096CC400B40B480061E3063A
+F9240FCC3E006C0883045A12F2401F5EDF12C42584D6025C239713318627D215
+FA49396022C4276D0CB42067FE005B4026F01350D71AB72601820DAC52228433
+0D52C6275A009E0EAF5D007609A634510569AD0148D04E26881FCC122DD81C3D
+CA6C2D1ABA32007C27049D0DD200660441CE3B018E066E0BE5046012F40D5218
+7C266C2759C1055D04A452274AC4470070C834A4089100DB045A1FF52540651F
+8727A817448F1A53984F0477ED1BAD2ED01FA34D03CA0A3B79006A0D4E34C744
+00BB690A5B009208A40EEB0047A518503599072D9F1FD5650D7B2F099105723B
+F049012ECF1650D90032891E7F277834139D20D74701C778153486227012B805
+6100AC6004A86A2701F6730454E20FBB5023752749B7378F006AEA20B71A9D4C
+30008727A627DB03AE08DF004E36922D7711BB02600EEB40046C1BFB27782185
+1279018906DD3A01FE0E863000B42801DB2647275B1078267E00348D2796224B
+B61AEF008D077A38501FE526793460256C2779380379E90040DA530E79043DA1
+00AD411F58C7115A1FC0670087047940AD04E60ACE0150EC04415A1A822800FA
+4208E7039D2F43DF34500D8641009D5E12459A1E6B375B01CA06E911781A4BBC
+123F5A006A2707D8B01A50008423633476209F12F90AC800692185279C331395
+2784015A12AC29E234A12777125A9C234E04D35A0C82410D7BB701CA3C00E50D
+5BDC0C5401FD06357F276E21AA12FA04A5019E0DC700E004B00CD95A2A12881A
+7701C526961950CD2266F6002798037B0836E926A529126A472D6015921F692F
+B800F50BAA50106CA01D3C5A01790E7D22F2321EE71437D40130CA009119842F
+7C1F6501FB08268605A633F14278220D6CCC3F06B90BF701862F6927791F3AF1
+4007DA0159B500DE0D3CBD4E0574006A0DCD00AE41156CBB621C36E813BE611E
+3E640BAF501A992F136CBC4115A953019E11DA2862278522406C3D187A2F881F
+843307B26004A749276B4000EE33088C042C864F31DF14AA430E771A5AF309C1
+00B44A27A80B771294253D6120BF2C0060B40CFC27C005A20055B0074A792284
+4E12A427F90EA00050AE384795512FDB147A2601A254FD3B107D4A16942D5012
+CE00B5044A860D5A951D7B24478621A062002EEE22B71A9027683204E9003912
+9F6A01742F05F8009C2A46863A01C2780027852F6C12E43150049601CF084EC1
+00F04F24C2125000BD6C1F3ED23A01F416AE5A127E471CB4430CAF014A86235E
+B505CD003785203D6C05FC0139DC55036CCF05790148DC24406C18921C503586
+12652BC300AE06EC3C0979044922DA2B0A820427C70149930050C03A044E019A
+1DE8365A00AA5B26781B3DE119A6003CB905F809306D1440CA791160305001F7
+08BE71217949F2042BCD22AC49346C12DF2504FA65203EEA5F05CE00A1450CBD
+5F1D73327B1A5A2E650586015AF6274102FB0D681DAF0C84052FBA01DF5E006B
+E722773504FD003C6C2749B2045ADC1A8B124F86401FBE2F1349E93793098404
+D53A0068E30145D90394127D2F531A64D6205AB46C0560C015E0601A790C34D0
+1F63128F1FD42B69007911DA3F04EB09A45D017F26D21260411F65C101EA0A51
+043CA90DD15B1F833D0B53A50D2786500984007908A450006BA73F098704501F
+93233D651B7D0038F40DB000E70EAC14D520B3350DA478264E950087305223E1
+621B75253ED13A129E07CA6C12791DE20D93137E2F0CA0243EB0260095075086
+006C0D4FA61F771256BC2A15A6266D3E21FB490DD07601468F0044129C3E1F77
+3600AC24F45B089F04EB458509A90DC3279E4C1F81326C2340C10B54347503AD
+7900387F27941FD680006C3E05B44C1BDB2F01C84100B13D15EB21C519338C0C
+5116D926AE12D10D50F004B426D65A216B2788227704832951089C670032C714
+3BDB4512CE6C00399C04860A5901782682172F57A347016330F800B8440068D1
+0460EE4435E11FB227CD1B3DF800AF4005855A0A9101C7500435960028AB1135
+C326ED4E00F60DB542128539127B277733002771224084063C01C60DB000D810
+772F9E15EB273A0EE0571AB80065274426FD1C9C46007A0693601A6BE212914B
+277E015AF11FCD279A0061366C31A100793F128D34059D01CA0A5535BB4102F2
+6C1F3EE5500881015B097C043FA5124BFB12AD1FBE28F10041DB2601C437B019
+5A3F1E78EA3B1A7A11501A9D009009630586015A346226EA1235F21F3B6A0E77
+B51A40861FF868088104337A256C0464E30358BA00DC0C55C49401F1611A5AF4
+6D27642A861F5200F6074A007EC95A2804911046F505B15901780A31E526C236
+109E263B5F05D80040B53E0D6D01790E40B402F4065A3B16C45A0048AB1A7949
+39FC005F11984700CB0E791F9F27B628EA279C2252C80027612D6E07930D5098
+048C401279069101C8680850028726A601C40F6B2346F54929B912CF088801AC
+700057B51BDE270160E9054B012BA21F5AAE1387279C1B347E192F8F22A53907
+13503D04D500490AA204FC083ABC63206CB66812490177C54D339A19820D35AC
+22CD61126C0457ED007804A92D50961260059F2FB822EB561D7C26881FE26C04
+27F96909E22F017F1F8727DE361590265501D304470C92005612F70B3D9E46BC
+00EA521F3BB41A4C0EF35127DE257C2E12AF23BD12F82F68277B34D412580178
+227F279E1F5B40219A33077B005ABF300D5BBA784F0ED13801E506C80049A200
+CE46056C1160E36CAD1F862E9C13C92092234F83013E9E044626A122FC400825
+E300502CD368147D3900852CA51F3FB022FD1A850D46F624D01B6805773400CA
+0B4901A80D46B6740C2D852450C412A306730151BC0540A564226CF3601F6CB1
+3E01911A700D39683E04D06C0065C627600C9A00500AE749006C335900970CE1
+06A3018525AD0DE4006B043CC30DDB046BE72DA93D126C9F224616E141009E64
+213D612EEE0C502678F927B800302600CD126A2676336B0040B412E31A4ED00E
+DD00860B27AD650E6CC0015209E00354BC23F701860D4D8B086527D103396C00
+8327E013AD6C2766D75A2792003919A04000B304613443D0219F1C782EFB0A31
+B8114901C92F06844D2AD502E313A1228F4610F634068700CE216ABC3E1A9D37
+F104AD401F79276F22682FC91A5030A415F2790054288712500A6204F64705D8
+00A4088530500D76B80F8F1668AD0E3D01861B569CFE4936A505EB01AE0EEF60
+056E27790030871F5B33BC750036892241951F86279832068E0E5A26D1013057
+B900508619A83C0E98005A3C1086044712FE1A67DB4C04EB511A930EF500583C
+0CEC005C12854C008F277E2150E714BB1C6635498609CB0130801F57AE2D6F1A
+853404A55C047F0D861863CB04B200FC0D8D005D9B046C365022669F1143B427
+C81F9D2F147E266D276922C919F300405401BD3F046CC2490BD74004107C0258
+402079277F1A2FCF1B990CAF61043DF104521643ED02A50634F2004F12EA601F
+48B349136CDE17419A123EC7045FF31F50BF02F91FA5268001792E0E86306122
+D22777269412BD6B2749C44604E13C19D80D9F006A41007907B50027781B5ADF
+05A8013C10D84F01FA541229D91F602EDE0B3C5212603A5829ED123DD70EAF01
+D4063EFD0078013A820066AE02970BEF01950479278622DE345A1FD72F128332
+621577AE27DC1BBA5B0BD9004787015A34F44013C3711A840DD77C1D5A12CF6A
+163EC26C0140D800730794370085062FEE014991224785093F6A2D5000C832B2
+20C74106C101A3096C00A80867400087066C25951F60A8045132C212AD30F150
+216CFD04B63F266C2276EE610427A42F07C76D0150BE004A9F01F031A608C402
+49921F644127721AAA176A304AEF520DD81A3FE334531AB2365711A5066C0185
+087E004FEC05B301C72200630D8500388F1F50C5123CAB005608A32E0048B24C
+27013EB52E5000789F0427A21D7B3B1AE922AD4C27C0541F7D340AB00031DF22
+A00694600D790864009B531B79128B36E64731DD1EB22BD710AE0079084171FE
+1A5E3D03940C278A0E50336500870CC5471341B578156298431F953814822540
+6C1A7F217626853506BA00F70CC7462C7B0AC1052395274A87015A108D3A5C13
+FE4632D21FAE26FB24B21E5F276C384984>
+ >>
+
+>>
+dup /HalftoneName 3 index put
+/Halftone defineresource
+pop
diff --git a/lib/image-qa.ps b/lib/image-qa.ps
new file mode 100644
index 00000000..3dd10b6c
--- /dev/null
+++ b/lib/image-qa.ps
@@ -0,0 +1,1817 @@
+%!PS
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+%
+% Tests for the image operators
+
+% Specifications for Image operator testing.
+%
+% 1. All 8 standard orientations (0, 90, 180, 270 degree rotations with
+% and without reflection); ditto those orientations perturbed by +/-
+% 10 degrees, and by 45 degrees.
+%
+% Enough space is provided around images on a test page to allow
+% these permutations to use the same page layout. This will make
+% test page construction easier and simplify page checking.
+%
+% 2. All 9 image types (ImageType 1 mask, ImageType 1 opaque,
+% ImageType 3 with all 3 InterleaveTypes and with unequal scaling
+% for InterleaveType 2 and 3, ImageType 4 with both range and
+% single-point matching).
+%
+% 3. DeviceGray, DeviceRGB, and DeviceN color, both direct and Indexed.
+% Indexed color will use the common pallete size of 256 colors.
+%
+% 4. For simple masks, both colored and uncolored Patterns.
+%
+% 5. CombineWithColor true and false; several different colors for the
+% true case (including black, white, other solid colors, halftones,
+% and patterns).
+%
+% 6. Source transparency true and false.
+%
+% 7. Texture transparency true and false.
+%
+% 8. Different RasterOp values.
+%
+% 9. For ImageType 4, different color keys (out-of-range, specific
+% color other than white, range without white).
+%
+% 10. String, file, and procedure data sources; for multi-component
+% color spaces, MultipleDataSources = true. This is tested by
+% constructing string data sources that are used as input to
+% SubFileDecode filter to create a filetype data source. These
+% filters are read into scratch strings for the procedure data
+% source case. The procedure data source scratch string length
+% does not match the raster width, and the width x height is
+% not an integer multiple of the string length.
+%
+% Also for the File case, the number of bytes consumed is
+% checked after the image operator to verify that the exact
+% amount of data is used. This is particularly important when
+% the currentfile is used as a source (possibly through a
+% filter.
+%
+% Image bytes per line are < 500 bytes to exercise direct and
+% buffer copy gs_image_next_planes mode with the default stream
+% buffer size of 512 bytes. Procedure string size is greater
+% than the image bytes per line for the same reason (sM and sD).
+%
+% Total string size is kept below 65535.
+
+/WidthRGB 83 def
+/HeightRGB 89 def
+
+%
+% 11. Banded and non-banded rendering. This can be tested by running
+% test files throuch with different page device parameters to
+% force banding vs. page mode.
+%
+% -------------------------------------------------------------------------
+%
+% Testing the RasterOp-related functions (5/6/7/8) is not necessary at this
+% time. They are well isolated logically.
+%
+% Testing orientation (1) and color masking (9) would be a good idea at some
+% point, because this code has broken many times in the past and has had a
+% long bug tail.
+%
+% The really important things to test are 2 (image type), 3/4 (color space --
+% but only with regard to number of components, plus DeviceN and simple masks
+% with a Pattern, which exercise special control paths), 10 (data source),
+% and 11 (banding modes).
+%
+% ==========================================================================
+
+%
+% Procedure to generate test mask data
+%
+% WM and HM must be defined prior to invocation
+% MaskGen -
+%
+% The mask data is stored into a string named /MaskData
+%
+% The mask consists of a "target". Bits past width WM are
+% filled with 1's to make sure that pad bits are ignored.
+%
+/MaskGen {
+ /H8 HM 8 div def
+ /X0 WM 2 div def
+ /Y0 HM 2 div def
+ /WB WM 7 add 8 div cvi def
+ /MaskData WB HM mul string def
+ /MB [ 128 64 32 16 8 4 2 1 ] def
+ 0 1 HM 1 sub {
+ /Y exch def
+ 0 1 WB 1 sub {
+ /B exch def % byte within the row
+ /C B Y WB mul add def
+ /P 0 def
+ 0 1 7 {
+ /b exch def % bit within the character
+ /X b B 8 mul add def
+ X WM lt
+ { X Y eq
+ X HM 1 sub Y sub eq or
+ Y Y0 gt X X0 sub abs 2 le and or
+ X X0 sub WM div dup mul Y Y0 sub HM div dup mul add sqrt 9 mul cvi 2 mod 1 eq or
+ }
+ { true } % pad bits are always set
+ ifelse
+ % stack: true if pixel is set
+ {
+ MB b get P or /P exch def
+ } if
+ } for % Bits within a byte
+ MaskData C P put
+ } for % Bytes within the row
+ } for % Rows in the mask
+} bind def % MaskGen
+
+%
+% WM and HM must be defined prior to invocation
+% BPC MaskGenBPC -
+%
+% The mask data is stored into a string named /MaskData
+%
+% The mask consists of a "target". BPC is the size of the elements
+% in the MaskData string (must be 4, 8 or 12)
+%
+/MaskGenBPC {
+ /BPC exch def
+ /X0 WM 2 div def
+ /Y0 HM 2 div def
+ /WB WM BPC mul 7 add 8 div cvi def % Width in Bytes
+ /MaskData WB HM mul string def
+ 0 1 HM 1 sub {
+ /Y exch def
+ 0 1 WM 1 sub {
+ /X exch def
+ MaskData % Target string
+ X Y eq
+ X HM 1 sub Y sub eq or
+ Y Y0 gt X X0 sub abs 2 le and or
+ X X0 sub WM div dup mul Y Y0 sub HM div dup mul add sqrt 9 mul cvi 2 mod 1 eq or
+ X BPC mul 8 div Y WB mul add exch
+ [
+ { } % BPC = 0
+ { { 1 } { 0 } ifelse put4bit } % BPC = 4
+ { { 255 } { 0 } ifelse exch cvi exch put } % BPC = 8
+ { { 1 } { 0 } ifelse put12bit } % BPC = 12
+ ] BPC 4 div cvi get exec
+ } for
+ } for % Rows in the mask
+} bind def
+
+% -----------------------------------------------------------------------
+
+% Procedure to generate image data
+%
+% WD and HD must be defined prior to invocation
+% { proc } ImageGen -
+%
+% The procedure is called once for each pixel
+% Local definitions are R, G, B, X and Y
+
+% Example: Generate RGB Chunky pixel data (single data source) BPC = 8
+% /WD WidthRGB def
+% /HD HeightRGB def
+% /RGBData WD HD mul 3 mul string def
+% { X Y WD mul add 3 mul RGBData
+% dup 2 index R 255 mul cvi put
+% dup 2 index 1 add G 255 mul cvi put
+% exch 2 add B 255 mul cvi put
+% } ImageGen
+
+/ImageGen {
+ gsave
+ 0 1 HD 1 sub {
+ /Y exch def
+ 0 1 WD 1 sub {
+ /X exch def
+ /D X WD 2 div sub WD div dup mul Y HD 2 div sub HD div dup mul add sqrt def
+ /D D .6 div def
+ /A X WD 2 div sub Y HD 2 div sub atan 360 div def
+ A % Hue
+ .7 D .3 sub .60 div sub % Saturation
+ dup 0.05 lt
+ { .95 D .8 sub 3 mul sub 3 mul cvi 3 div sqrt } % Level once Saturation < 0
+ { .7 D .25 sub .75 div add } % Level inside
+ ifelse
+ X WD 2 div gt Y HD 2 div sub abs 2 le and { pop 0 } if % asymmetric marker
+ sethsbcolor
+ currentrgbcolor /B exch def /G exch def /R exch def
+ dup exec
+ } for
+ } for
+ pop % discard the procedure
+ grestore
+} bind def
+
+% -----------------------------------------------------------------------
+%
+% Procedures for ImageMatrix creation
+/IMLRTB { [ WD 0 0 HD neg 0 HD ] } def
+/IMLRBT { [ WD 0 0 HD 0 0 ] } def
+/IMRLTB { [ WD neg 0 0 HD neg WD HD ] } def
+/IMRLBT { [ WD neg 0 0 HD WD 0 ] } def
+% -----------------------------------------------------------------------
+%
+% Procedure to make invocation of image operators more concise
+%
+% YY, SX, SY, WD and HD should be defined prior to invocation
+% X matrix source decode DoImageMask -
+%
+/DoImageMask {
+ gsave
+ /D exch def
+ /S exch def
+ /M exch def
+ /XX 1 index def
+ YY translate SX SY scale
+ 0 setlinewidth 0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto 0 0 lineto stroke
+ .5 .5 translate
+ IR rotate
+ -.5 -.5 translate
+ <<
+ /ImageType 1
+ /Width WM
+ /Height HM
+ /ImageMatrix M
+ /MultipleDataSources false
+ /DataSource S
+ /Decode D
+ /BitsPerComponent 1
+ >>
+ imagemask
+ grestore
+} bind def
+
+% YY, SX, SY, WD and HD should be defined prior to invocation
+% X Y BPC matrix source multi decode DoImage1 -
+%
+/DoImage1 {
+ gsave
+ CSpace setcolorspace
+ /D exch def
+ /MS exch def
+ /S exch def % May be an array of sources
+ /M exch def
+ /BPC exch def
+ /XX 1 index def
+ YY translate SX SY scale
+ 0 setlinewidth 0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto 0 0 lineto stroke
+ .5 .5 translate
+ IR rotate
+ -.5 -.5 translate
+ <<
+ /ImageType 1
+ /Width WD
+ /Height HD
+ /ImageMatrix M
+ /MultipleDataSources MS
+ /DataSource S
+ /BitsPerComponent BPC
+ /Decode D
+ >>
+ image
+ grestore
+} bind def
+
+% YY, SX, SY, WD and HD should be defined prior to invocation
+% X Y BPC matrix source multi decode MaskColor DoImage4 -
+%
+/DoImage4 {
+ gsave
+ CSpace setcolorspace
+ /MC exch def
+ /D exch def
+ /MS exch def
+ /S exch def % May be an array of sources
+ /M exch def
+ /BPC exch def
+ /XX 1 index def
+ YY translate SX SY scale
+ 0 setlinewidth 0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto 0 0 lineto stroke
+ .5 .5 translate
+ IR rotate
+ -.5 -.5 translate
+ <<
+ /ImageType 4
+ /Width WD
+ /Height HD
+ /ImageMatrix M
+ /MultipleDataSources MS
+ /DataSource S
+ /BitsPerComponent BPC
+ /Decode D
+ /MaskColor MC
+ >>
+ image
+ grestore
+} bind def
+
+% YY, SX, SY, W, HD (Data) WM, HM (Mask) should be defined prior to invocation
+% (IT is InterleaveType)
+% X Y BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+%
+/DoImage3 {
+ gsave
+ CSpace setcolorspace
+ /IT exch def
+ /DD exch def
+ /DM exch def
+ /MS exch def
+ /S exch def % May be an array of sources - For InterleaveType 3
+ % S[0] is the Mask DataSource
+ /M exch def
+ /BPC exch def
+ /XX 1 index def
+ YY translate SX SY scale
+ 0 setlinewidth 0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto 0 0 lineto stroke
+ .5 .5 translate
+ IR rotate
+ -.5 -.5 translate
+ /DataImage
+ <<
+ /ImageType 1
+ /Width WD
+ /Height HD
+ /ImageMatrix M
+ /MultipleDataSources MS
+ /DataSource IT 3 ne { S } { S 1 get exec } ifelse
+ /BitsPerComponent BPC
+ /Decode DD
+ >>
+ def
+ /MaskImage
+ <<
+ /ImageType 1
+ /Width WM
+ /Height HM
+ /ImageMatrix % construct the mask matrix using signs from the DataImage matrix
+ /M0 M 0 get WD abs div cvi def
+ /M3 M 3 get HD abs div cvi def
+ /M4 M 4 get WD abs div cvi def
+ /M5 M 5 get HD abs div cvi def
+ [ WM M0 mul 0 0 HM M3 mul WM M4 mul HM M5 mul ]
+ IT 3 eq {
+ /DataSource S 0 get exec % DataSource only allowed for InterleaveType 3
+ } if
+ /BitsPerComponent IT 1 eq { BPC } { 1 } ifelse
+ /Decode DM
+ >>
+ def
+ <<
+ /ImageType 3
+ /DataDict DataImage
+ /MaskDict MaskImage
+ /InterleaveType IT
+ >>
+ image
+ grestore
+} bind def
+
+% -----------------------------------------------------------------------
+%
+/Helvetica-Bold findfont 20 scalefont /TitleFont exch def
+
+/FontSize 10 def
+/Helvetica-Narrow findfont FontSize scalefont /LegendFont exch def
+
+/blockshow { % like "show" but '\n' causes new-line
+ dup = flush %DEBUG
+ currentpoint /showY exch def /showX exch def
+ {
+ dup 10 ne
+ { 1 string dup 0 4 -1 roll put show }
+ { pop showX showY FontSize sub dup /showY exch def moveto }
+ ifelse
+ } forall
+} bind def
+
+/TX 013 def % Title left X
+/SX 036 def
+/XA 060 def
+/XB XA SX 1.5 mul add def
+/XC XA SX 3.0 mul add def
+/XD XA SX 4.5 mul add def
+/XE XA SX 6.0 mul add def
+/XF XA SX 7.5 mul add def
+/XG XA SX 9.0 mul add def
+/XH XA SX 10.5 mul add def
+/XI XA SX 12.0 mul add def
+/XJ XA SX 13.5 mul add def
+
+/BY 036 def % Bottom Title Top line
+/SY 037 def
+/YA 050 def
+/YB YA SY 1.8 mul add def
+/YC YA SY 3.6 mul add def
+/YD YA SY 5.4 mul add def
+/YE YA SY 7.2 mul add def
+/YF YA SY 9.0 mul add def
+/YG YA SY 10.8 mul add def
+/YH YA SY 12.6 mul add def
+/YI YA SY 14.4 mul add def
+/YJ YA SY 16.2 mul add def
+/YK YA SY 18.0 mul add def
+
+% -----------------------------------------------------------------------
+%
+% Utility procedures to support storing 4 and 12 bit elements in
+% strings.
+%
+% <string> <index> <value> put##bit -
+%
+% <index> will have a fractional part ( .5 ) if the element
+% starts on a 4-bit boundary.
+%
+% <value> is between 0 and 1 and is scaled 0 to 15 (4bit) or
+% 0 to 4095 (12 bit)
+
+/put4bit {
+ 15 mul cvi
+ exch dup cvi dup 3 1 roll eq 3 -1 roll exch
+ { % integer index means high nibble.
+ 16 mul put
+ }
+ { % low nibble -- combine with high nibble
+ 2 index 2 index get or put
+ }
+ ifelse
+} bind def
+
+/put12bit {
+ 1 index cvi /I exch def
+ 2 index /S exch def
+ 4095 mul cvi
+ exch dup dup cvi eq
+ { % integer index means high byte is aligned
+ cvi exch 3 copy 16 div cvi put
+ exch 1 add exch 15 and 16 mul put
+ }
+ { % low nibble -- combine with high nibble
+ cvi exch 3 copy 2 index 2 index get exch 256 div cvi or put
+ 255 and exch 1 add exch put
+ }
+ ifelse
+} bind def
+
+% -----------------------------------------------------------------------
+%
+% Procedures to use generated string data as procedure or files
+
+/WD WidthRGB def
+/HD HeightRGB def
+
+/sM WidthRGB 2 mul 1 sub string def % long enough to hold more than one mask line
+/sD WidthRGB 7 mul 1 sub string def % long enough to hold more than one 12 bit RGB line
+ % worst case is 12bit ImageType3 InterleaveType 1 == 48 bits
+
+/MaskDProc {
+ /FM MaskData dup length () /SubFileDecode filter def
+ { { FM sM readstring pop } }
+} bind def
+
+/FileTailString (12345) def % Marker string to check file data usage
+
+/AppendFileTail { % <string> AppendFileTail <string_with_tail> <original_length>
+ dup length FileTailString length add string
+ dup 0 3 index putinterval
+ dup 2 index length FileTailString putinterval
+ exch length
+} bind def
+
+/MaskDFile {
+ MaskData dup length () /SubFileDecode filter
+ /MDF 1 index def
+} bind def
+
+/RGBDProc {
+ /FD RGBData dup length () /SubFileDecode filter def
+ { { FD sD readstring pop } }
+} bind def
+
+/RGBDFile {
+ RGBData dup length () /SubFileDecode filter
+ /RGBDF 1 index def
+} bind def
+
+/sR WidthRGB 2 mul 1 sub string def % long enough to hold more than one line of 12 bit data
+/sG WidthRGB 2 mul 1 sub string def
+/sB WidthRGB 2 mul 1 sub string def
+
+/RDProc {
+ /FR RData dup length () /SubFileDecode filter def
+ { FR sR readstring pop }
+} bind def
+
+/GDProc {
+ /FG GData dup length () /SubFileDecode filter def
+ { FG sG readstring pop }
+} bind def
+
+/BDProc {
+ /FB BData dup length () /SubFileDecode filter def
+ { FB sB readstring pop }
+} bind def
+
+/RDFile {
+ RData dup length () /SubFileDecode filter
+ /RDF 1 index def
+} bind def
+
+/GDFile {
+ GData dup length () /SubFileDecode filter
+ /GDF 1 index def
+} bind def
+
+/BDFile {
+ BData dup length () /SubFileDecode filter
+ /BDF 1 index def
+} bind def
+
+% -----------------------------------------------------------------------
+%
+% Procedure to handle fileposition. Ghostscript has a private
+% operator .fileposition that works when fileposition does not
+%
+% <file> tryfilepos
+% Returns: fileposition true if successful
+% 0 false if not
+/tryfilepos {
+ /.fileposition where
+ { pop /.fileposition load } % most likely to succeed
+ { /fileposition load }
+ ifelse
+ stopped
+ { pop 0 false }
+ { true }
+ ifelse
+} bind def
+
+% -----------------------------------------------------------------------
+%
+% Procedure to provide =only operator if not present. Suggested
+% by Alex Cherepanov to use =print operator present on some Adobe
+% implementations.
+/=only where
+ { pop }
+ { /=print where { pop /=print load } { /print load } ifelse
+ /=only exch def
+ }
+ifelse
+
+% -----------------------------------------------------------------------
+%
+% Procedure to make sure that the file is at the EOF.
+% added above (string == FileTailString.
+%
+% If not, it will mark the image area with a red "F"
+%
+% <string> <title> <file> CheckFileTail - XX is the horizontal position
+% YY is the vertical position
+% SX,SY determine size of "F" if fail
+/CheckFileTail {
+ dup
+ status not dup % status false says no longer valid
+ { (Unexpected EOF: XX,YY=) print XX =only (,) print YY = false }
+ { 1 index tryfilepos not exch 5 index length ne or dup
+ { 3 index print ( fileposition = ) print
+ 2 index tryfilepos pop =only
+ ( doesn't match expected = ) print 4 index length = flush
+ }
+ if
+ }
+ ifelse
+ or
+ {
+ gsave .8 0 0 setrgbcolor
+ SX 4 div setlinewidth
+ XX YY moveto 0 SY rlineto SX 0 rlineto stroke
+ XX YY SY .5 mul add moveto SX .5 mul 0 rlineto stroke
+ grestore
+ }
+ if
+ pop pop pop
+} bind def
+
+/CSpaceName { % - CSpaceName <string>
+ CSpace dup type /arraytype eq { 0 get } if
+ 15 string cvs
+} bind def
+% -----------------------------------------------------------------------
+%
+% tests
+
+/CheckImage {
+
+ /IR 0 def
+ /CSpace /DeviceRGB def
+
+ % Use an unusual (unpleasant?) underlying color
+ .6 .95 .4 setrgbcolor clippath fill
+
+ 0 0 0 setrgbcolor
+ TitleFont setfont
+ 200 760 moveto (Image Type 3 Tests) show
+ 200 740 moveto (Rotation Angle = ) show IR 3 string cvs show
+ 170 720 moveto (Colorspace = ) show CSpaceName show
+ LegendFont setfont
+
+ .4 .1 .7 setrgbcolor % contrasting color for stencil masking
+ /SX SX 2 mul def /SY SY 2 mul def
+ /YY 780 SY sub def
+ MaskGen
+ TX IMLRTB MaskData [1 0] DoImageMask
+
+ /RGBData WD HD mul 3 mul string def
+ { X Y WD mul add 3 mul RGBData
+ dup 2 index R 255 mul cvi put
+ dup 2 index 1 add G 255 mul cvi put
+ exch 2 add B 255 mul cvi put
+ } ImageGen
+
+ % X BPC matrix source multi decode
+ XI 8 IMLRTB RGBData false [0 1 0 1 0 1] DoImage1
+ /SX SX 2 div def /SY SY 2 div def
+
+ showpage
+} def
+
+% -----------------------------------------------------------------------
+%
+% Type 1 and Type 4 Tests
+
+% /CSpace and /IR are defined in order to generate various pages
+/T1T4Tests { %
+
+ % Use an unusual (unpleasant?) underlying color
+ .6 .95 .4 setrgbcolor clippath fill
+ 0 0 0 setrgbcolor
+
+ TitleFont setfont
+ 120 760 moveto (Image Type 1 and ImageType 4 Tests) show
+ 200 740 moveto (Rotation Angle = ) show IR 3 string cvs show
+ 170 720 moveto (Colorspace = ) show CSpaceName show
+ LegendFont setfont
+
+ XA BY moveto (Decode\nInverted) blockshow
+ XB BY moveto ( IMLRTB\nDS=string) blockshow
+ XC BY moveto ( IMLRBT\nDS=string) blockshow
+ XD BY moveto ( IMRLTB\nDS=string) blockshow
+ XE BY moveto ( IMRLBT\nDS=string) blockshow
+ XF BY moveto (IMLRTB\nDS=proc) blockshow
+ XG BY moveto (IMLRTB\nDS=file) blockshow
+ XH BY moveto ( Multi\nDS=string) blockshow
+ XI BY moveto ( Multi\nDS=proc) blockshow
+ XJ BY moveto ( Multi\nDS=file) blockshow
+
+ .4 .1 .7 setrgbcolor % contrasting color for stencil masking
+
+ /WM WD def
+ /HM HD def
+ /SX SX 2 mul def /SY SY 2 mul def
+ /YY 780 SY sub def
+ MaskGen
+ TX IMLRTB MaskData [1 0] DoImageMask
+
+ /RGBData WD HD mul 3 mul string def
+ { X Y WD mul add 3 mul RGBData
+ dup 2 index R 255 mul cvi put
+ dup 2 index 1 add G 255 mul cvi put
+ exch 2 add B 255 mul cvi put
+ } ImageGen
+
+ % X BPC matrix source multi decode
+ XI 8 IMLRTB RGBData false [0 1 0 1 0 1] DoImage1
+ /SX SX 2 div def /SY SY 2 div def
+
+ % ----------------------------------------------------------------------
+ % Type 1 Stencil Mask Images
+
+ /YY YA def
+ TX YA SY add moveto (\nType 1\nStencil\nMask) blockshow
+
+ MaskGen
+
+ % X matrix source decode
+ XA IMLRTB MaskData [0 1] DoImageMask
+ XB IMLRTB MaskData [1 0] DoImageMask
+ XC IMLRBT MaskData [1 0] DoImageMask
+ XD IMRLTB MaskData [1 0] DoImageMask
+ XE IMRLBT MaskData [1 0] DoImageMask
+ XF IMLRTB MaskDProc [1 0] DoImageMask
+ XG IMLRTB MaskDFile [1 0] DoImageMask
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 1 RGB Single Data Sources, BPC==8
+
+ /YY YB def
+ TX YY SY add moveto (\nType 1\nRGB\nBPC=8) blockshow
+
+ /RGBData WD HD mul 3 mul string def
+ { X Y WD mul add 3 mul RGBData
+ dup 2 index R 255 mul cvi put
+ dup 2 index 1 add G 255 mul cvi put
+ exch 2 add B 255 mul cvi put
+ } ImageGen
+
+ % X BPC matrix source multi decode
+ XA 8 IMLRTB RGBData false [1 0 1 0 1 0] DoImage1
+ XB 8 IMLRTB RGBData false [0 1 0 1 0 1] DoImage1
+ XC 8 IMLRBT RGBData false [0 1 0 1 0 1] DoImage1
+ XD 8 IMRLTB RGBData false [0 1 0 1 0 1] DoImage1
+ XE 8 IMRLBT RGBData false [0 1 0 1 0 1] DoImage1
+ XF 8 IMLRTB RGBDProc false [0 1 0 1 0 1] DoImage1
+ XG 8 IMLRTB RGBDFile false [0 1 0 1 0 1] DoImage1
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 1 RGB Multiple Data Sources, BPC==8
+
+ WD HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ { X Y WD mul add
+ RData 1 index R 255 mul cvi put
+ GData 1 index G 255 mul cvi put
+ BData exch B 255 mul cvi put
+ } ImageGen
+
+ % X BPC matrix source multi decode
+ XH 8 IMLRTB [ RData GData BData ] true [0 1 0 1 0 1] DoImage1
+ XI 8 IMLRTB [ RDProc GDProc BDProc ] true [0 1 0 1 0 1] DoImage1
+ XJ 8 IMLRTB [ RDFile GDFile BDFile ] true [0 1 0 1 0 1] DoImage1
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Single Data Sources, BPC==8, mask black
+
+ /YY YE def
+ TX YY SY add moveto (\nType 4\nBPC=8\nmask=black) blockshow
+
+ % X BPC matrix source multi decode MaskColor
+ XA 8 IMLRTB RGBData false [1 0 1 0 1 0] [ 000 000 000 ] DoImage4
+ XB 8 IMLRTB RGBData false [0 1 0 1 0 1] [ 000 000 000 ] DoImage4
+ XC 8 IMLRBT RGBData false [0 1 0 1 0 1] [ 000 000 000 ] DoImage4
+ XD 8 IMRLTB RGBData false [0 1 0 1 0 1] [ 000 000 000 ] DoImage4
+ XE 8 IMRLBT RGBData false [0 1 0 1 0 1] [ 000 000 000 ] DoImage4
+ XF 8 IMLRTB RGBDProc false [0 1 0 1 0 1] [ 000 000 000 ] DoImage4
+ XG 8 IMLRTB RGBDFile false [0 1 0 1 0 1] [ 000 000 000 ] DoImage4
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Multiple Data Sources, BPC==8, mask black
+
+ % X BPC matrix source multi decode MaskColor
+ XH 8 IMLRTB [ RData GData BData ] true [0 1 0 1 0 1] [ 000 000 000 ] DoImage4
+ XI 8 IMLRTB [ RDProc GDProc BDProc ] true [0 1 0 1 0 1] [ 000 000 000 ] DoImage4
+ XJ 8 IMLRTB [ RDFile GDFile BDFile ] true [0 1 0 1 0 1] [ 000 000 000 ] DoImage4
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Single Data Sources, BPC==8, mask white
+
+ /YY YF def
+ TX YY SY add moveto (\nType 4\nBPC=8\nmask=white) blockshow
+
+ % X BPC matrix source multi decode MaskColor
+ XA 8 IMLRTB RGBData false [1 0 1 0 1 0] [ 255 255 255 ] DoImage4
+ gsave .5 .2 .2 setrgbcolor XB YY SX 13 mul SY rectfill grestore
+ XB 8 IMLRTB RGBData false [0 1 0 1 0 1] [ 255 255 255 ] DoImage4
+ XC 8 IMLRBT RGBData false [0 1 0 1 0 1] [ 255 255 255 ] DoImage4
+ XD 8 IMRLTB RGBData false [0 1 0 1 0 1] [ 255 255 255 ] DoImage4
+ XE 8 IMRLBT RGBData false [0 1 0 1 0 1] [ 255 255 255 ] DoImage4
+ XF 8 IMLRTB RGBDProc false [0 1 0 1 0 1] [ 255 255 255 ] DoImage4
+ XG 8 IMLRTB RGBDFile false [0 1 0 1 0 1] [ 255 255 255 ] DoImage4
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Multiple Data Sources, BPC==8, mask white
+
+ % X BPC matrix source multi decode MaskColor
+ XH 8 IMLRTB [ RData GData BData ] true [0 1 0 1 0 1] [ 255 255 255 ] DoImage4
+ XI 8 IMLRTB [ RDProc GDProc BDProc ] true [0 1 0 1 0 1] [ 255 255 255 ] DoImage4
+ XJ 8 IMLRTB [ RDFile GDFile BDFile ] true [0 1 0 1 0 1] [ 255 255 255 ] DoImage4
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Single Data Sources, BPC==8, mask gray
+
+ /YY YG def
+ TX YY SY add moveto (\nType 4\nBPC=8\nmask=gray) blockshow
+
+ % X BPC matrix source multi decode MaskColor
+ XA 8 IMLRTB RGBData false [1 0 1 0 1 0] [ 147 147 147 ] DoImage4
+ XB 8 IMLRTB RGBData false [0 1 0 1 0 1] [ 147 147 147 ] DoImage4
+ XC 8 IMLRBT RGBData false [0 1 0 1 0 1] [ 147 147 147 ] DoImage4
+ XD 8 IMRLTB RGBData false [0 1 0 1 0 1] [ 147 147 147 ] DoImage4
+ XE 8 IMRLBT RGBData false [0 1 0 1 0 1] [ 147 147 147 ] DoImage4
+ XF 8 IMLRTB RGBDProc false [0 1 0 1 0 1] [ 147 147 147 ] DoImage4
+ XG 8 IMLRTB RGBDFile false [0 1 0 1 0 1] [ 147 147 147 ] DoImage4
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Multiple Data Sources, BPC==8, mask gray
+
+ % X BPC matrix source multi decode MaskColor
+ XH 8 IMLRTB [ RData GData BData ] true [0 1 0 1 0 1] [ 147 147 147 ] DoImage4
+ XI 8 IMLRTB [ RDProc GDProc BDProc ] true [0 1 0 1 0 1] [ 147 147 147 ] DoImage4
+ XJ 8 IMLRTB [ RDFile GDFile BDFile ] true [0 1 0 1 0 1] [ 147 147 147 ] DoImage4
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Single Data Sources, BPC==8, mask range
+
+ /YY YH def
+ TX YY SY add moveto (\nType 4\nBPC=8\nmask range) blockshow
+
+ % X BPC matrix source multi decode MaskColor
+ XA 8 IMLRTB RGBData false [1 0 1 0 1 0] [ 020 200 020 200 020 200 ] DoImage4
+ XB 8 IMLRTB RGBData false [0 1 0 1 0 1] [ 020 200 020 200 020 200 ] DoImage4
+ XC 8 IMLRBT RGBData false [0 1 0 1 0 1] [ 020 200 020 200 020 200 ] DoImage4
+ XD 8 IMRLTB RGBData false [0 1 0 1 0 1] [ 020 200 020 200 020 200 ] DoImage4
+ XE 8 IMRLBT RGBData false [0 1 0 1 0 1] [ 020 200 020 200 020 200 ] DoImage4
+ XF 8 IMLRTB RGBDProc false [0 1 0 1 0 1] [ 020 200 020 200 020 200 ] DoImage4
+ XG 8 IMLRTB RGBDFile false [0 1 0 1 0 1] [ 020 200 020 200 020 200 ] DoImage4
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Multiple Data Sources, BPC==8, mask range
+
+ % X Y SX SY BPC matrix source multi decode MaskColor
+ XH 8 IMLRTB [ RData GData BData ] true [0 1 0 1 0 1] [ 020 200 020 200 020 200 ] DoImage4
+ XI 8 IMLRTB [ RDProc GDProc BDProc ] true [0 1 0 1 0 1] [ 020 200 020 200 020 200 ] DoImage4
+ XJ 8 IMLRTB [ RDFile GDFile BDFile ] true [0 1 0 1 0 1] [ 020 200 020 200 020 200 ] DoImage4
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 1 RGB Single Data Sources, BPC==12
+
+ /YY YC def
+ TX YY SY add moveto (\nType 1\nRGB\nBPC=12) blockshow
+
+ /RGBData WD 36 mul 7 add 8 div cvi HD mul string def
+ {
+ X 36 mul 8 div Y WD 36 mul 7 add 8 div cvi mul add
+ RGBData 1 index R put12bit
+ RGBData 1 index 1.5 add G put12bit
+ RGBData exch 3 add B put12bit
+ } ImageGen
+
+ % X BPC matrix source multi decode
+ XA 12 IMLRTB RGBData false [1 0 1 0 1 0] DoImage1
+ XB 12 IMLRTB RGBData false [0 1 0 1 0 1] DoImage1
+ XC 12 IMLRBT RGBData false [0 1 0 1 0 1] DoImage1
+ XD 12 IMRLTB RGBData false [0 1 0 1 0 1] DoImage1
+ XE 12 IMRLBT RGBData false [0 1 0 1 0 1] DoImage1
+ XF 12 IMLRTB RGBDProc false [0 1 0 1 0 1] DoImage1
+ XG 12 IMLRTB RGBDFile false [0 1 0 1 0 1] DoImage1
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 1 RGB Multiple Data Sources, BPC==12
+
+ WD 3 mul 1 add 2 div cvi HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ {
+ X 3 mul 2 div Y WD 3 mul 1 add 2 div cvi mul add
+ RData 1 index R put12bit
+ GData 1 index G put12bit
+ BData exch B put12bit
+ } ImageGen
+
+ % X BPC matrix source multi decode
+ XH 12 IMLRTB [ RData GData BData ] true [0 1 0 1 0 1] DoImage1
+ XI 12 IMLRTB [ RDProc GDProc BDProc ] true [0 1 0 1 0 1] DoImage1
+ XJ 12 IMLRTB [ RDFile GDFile BDFile ] true [0 1 0 1 0 1] DoImage1
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Single Data Sources, BPC==12, mask range
+
+ /YY YI def
+ TX YY SY add moveto (\nType 4\nBPC=12\nmask range) blockshow
+
+ % X BPC matrix source multi decode MaskColor
+ XA 12 IMLRTB RGBData false [1 0 1 0 1 0] [ 300 3000 300 3000 300 3000 ] DoImage4
+ XB 12 IMLRTB RGBData false [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ] DoImage4
+ XC 12 IMLRBT RGBData false [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ] DoImage4
+ XD 12 IMRLTB RGBData false [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ] DoImage4
+ XE 12 IMRLBT RGBData false [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ] DoImage4
+ XF 12 IMLRTB RGBDProc false [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ] DoImage4
+ XG 12 IMLRTB RGBDFile false [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ] DoImage4
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Multiple Data Sources, BPC==12, mask range
+
+ % X BPC matrix source multi decode MaskColor
+ XH 12 IMLRTB [ RData GData BData ] true [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ] DoImage4
+ XI 12 IMLRTB [ RDProc GDProc BDProc ] true [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ] DoImage4
+ XJ 12 IMLRTB [ RDFile GDFile BDFile ] true [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ] DoImage4
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 1 RGB Single Data Sources, BPC==4
+
+ /YY YD def
+ TX YY SY add moveto (\nType 1\nRGB\nBPC=4) blockshow
+
+ /RGBData WD 12 mul 7 add 8 div cvi HD mul string def
+ {
+ X 12 mul 8 div Y WD 12 mul 7 add 8 div cvi mul add
+ RGBData 1 index R put4bit
+ RGBData 1 index 0.5 add G put4bit
+ RGBData exch 1.0 add B put4bit
+ } ImageGen
+
+ % X BPC matrix source multi decode
+ XA 4 IMLRTB RGBData false [1 0 1 0 1 0] DoImage1
+ XB 4 IMLRTB RGBData false [0 1 0 1 0 1] DoImage1
+ XC 4 IMLRBT RGBData false [0 1 0 1 0 1] DoImage1
+ XD 4 IMRLTB RGBData false [0 1 0 1 0 1] DoImage1
+ XE 4 IMRLBT RGBData false [0 1 0 1 0 1] DoImage1
+ XF 4 IMLRTB RGBDProc false [0 1 0 1 0 1] DoImage1
+ XG 4 IMLRTB RGBDFile false [0 1 0 1 0 1] DoImage1
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 1 RGB Multiple Data Sources, BPC==4
+
+ WD 1 add 2 div cvi HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ {
+ X 2 div Y WD 1 add 2 div cvi mul add
+ RData 1 index R put4bit
+ GData 1 index G put4bit
+ BData exch B put4bit
+ } ImageGen
+
+ % X BPC matrix source multi decode
+ XH 4 IMLRTB [ RData GData BData ] true [0 1 0 1 0 1] DoImage1
+ XI 4 IMLRTB [ RDProc GDProc BDProc ] true [0 1 0 1 0 1] DoImage1
+ XJ 4 IMLRTB [ RDFile GDFile BDFile ] true [0 1 0 1 0 1] DoImage1
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Single Data Sources, BPC==4, mask range
+
+ /YY YJ def
+ TX YY SY add moveto (\nType 4\nBPC=4\nmask range) blockshow
+
+ % X BPC matrix source multi decode MaskColor
+ XA 4 IMLRTB RGBData false [1 0 1 0 1 0] [ 1 10 1 10 1 10 ] DoImage4
+ XB 4 IMLRTB RGBData false [0 1 0 1 0 1] [ 1 10 1 10 1 10 ] DoImage4
+ XC 4 IMLRBT RGBData false [0 1 0 1 0 1] [ 1 10 1 10 1 10 ] DoImage4
+ XD 4 IMRLTB RGBData false [0 1 0 1 0 1] [ 1 10 1 10 1 10 ] DoImage4
+ XE 4 IMRLBT RGBData false [0 1 0 1 0 1] [ 1 10 1 10 1 10 ] DoImage4
+ XF 4 IMLRTB RGBDProc false [0 1 0 1 0 1] [ 1 10 1 10 1 10 ] DoImage4
+ XG 4 IMLRTB RGBDFile false [0 1 0 1 0 1] [ 1 10 1 10 1 10 ] DoImage4
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ % ----------------------------------------------------------------------
+ % Type 4 RGB Multiple Data Sources, BPC==4, mask range
+
+ % X BPC matrix source multi decode MaskColor
+ XH 4 IMLRTB [ RData GData BData ] true [0 1 0 1 0 1] [ 1 10 1 10 1 10 ] DoImage4
+ XI 4 IMLRTB [ RDProc GDProc BDProc ] true [0 1 0 1 0 1] [ 1 10 1 10 1 10 ] DoImage4
+ XJ 4 IMLRTB [ RDFile GDFile BDFile ] true [0 1 0 1 0 1] [ 1 10 1 10 1 10 ] DoImage4
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+ showpage
+
+} bind def % T1T4Tests
+
+% -----------------------------------------------------------------------
+%
+% Type 3 Tests
+
+/T3Tests {
+ % Use an unusual (unpleasant?) underlying color
+ .6 .95 .4 setrgbcolor clippath fill
+
+ 0 0 0 setrgbcolor
+ TitleFont setfont
+ 200 760 moveto (Image Type 3 Tests) show
+ 200 740 moveto (Rotation Angle = ) show IR 3 string cvs show
+ 170 720 moveto (Colorspace = ) show CSpaceName show
+ LegendFont setfont
+
+ .4 .1 .7 setrgbcolor % contrasting color for stencil masking
+
+ /WM WD def
+ /HM HD def
+ /SX SX 2 mul def /SY SY 2 mul def
+ /YY 780 SY sub def
+ MaskGen
+ XA IMLRTB MaskData [1 0] DoImageMask
+
+ /RGBData WD HD mul 3 mul string def
+ { X Y WD mul add 3 mul RGBData
+ dup 2 index R 255 mul cvi put
+ dup 2 index 1 add G 255 mul cvi put
+ exch 2 add B 255 mul cvi put
+ } ImageGen
+
+ % X BPC matrix source multi decode
+ XH 8 IMLRTB RGBData false [0 1 0 1 0 1] DoImage1
+ /SX SX 2 div def /SY SY 2 div def
+
+% ----------------------------------------------------------------------
+% InterleaveType 1, BPC==8, WM=WD, HM=HD
+% IT 1 is what GS calls "chunky pixel"
+ /YY YA def
+ TX YY SY add moveto (\nIntType 1\nBPC=8) blockshow
+
+ % Generate the MaskData first
+ 8 MaskGenBPC
+
+ % Generate the Data Image (uses the MaskData)
+ /RGBData WD HD mul 4 mul string def
+ { X Y WD mul add 4 mul % 4 bytes Mask,Red,Green,Blue
+ RGBData
+ dup 2 index MaskData X Y WB mul add get put
+ dup 2 index 1 add R 255 mul cvi put
+ dup 2 index 2 add G 255 mul cvi put
+ exch 3 add B 255 mul cvi put
+ }
+ ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 8 IMLRTB RGBData false [0 1] [1 0 1 0 1 0] 1 DoImage3
+ XB 8 IMLRTB RGBData false [1 0] [1 0 1 0 1 0] 1 DoImage3
+ XC 8 IMLRTB RGBData false [0 1] [0 1 0 1 0 1] 1 DoImage3
+ XD 8 IMLRTB RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XE 8 IMLRBT RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XF 8 IMRLTB RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XG 8 IMRLBT RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XH 8 IMLRTB RGBDProc false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XI 8 IMLRTB RGBDFile false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 1, BPC==12, WM=WD, HM=HD
+% IT 1 is what GS calls "chunky pixel"
+ /YY YB def
+ TX YY SY add moveto (\nIntType 1\nBPC=12) blockshow
+
+ % Generate the MaskData first
+ 12 MaskGenBPC
+
+ % Generate the Data Image (uses the MaskData)
+ /RGBData WD HD mul 6 mul string def
+ { X Y WD mul add 6 mul % 6 bytes Mask,Red,Green,Blue
+ RGBData
+ dup 2 index
+ MaskData X 1.5 mul .5 add cvi
+ Y WB mul add get % get the aligned mask byte (hi or lo)
+ 0 eq { 0 } { 1 } ifelse
+ put12bit
+ dup 2 index 1.5 add R put12bit
+ dup 2 index 3.0 add G put12bit
+ exch 4.5 add B put12bit
+ }
+ ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 12 IMLRTB RGBData false [0 1] [1 0 1 0 1 0] 1 DoImage3
+ XB 12 IMLRTB RGBData false [1 0] [1 0 1 0 1 0] 1 DoImage3
+ XC 12 IMLRTB RGBData false [0 1] [0 1 0 1 0 1] 1 DoImage3
+ XD 12 IMLRTB RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XE 12 IMLRBT RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XF 12 IMRLTB RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XG 12 IMRLBT RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XH 12 IMLRTB RGBDProc false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XI 12 IMLRTB RGBDFile false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 1, BPC==4, WM=WD, HM=HD
+% IT 1 is what GS calls "chunky pixel"
+ /YY YC def
+ TX YY SY add moveto (\nIntType 1\nBPC=4) blockshow
+
+ % Generate the MaskData first
+ 4 MaskGenBPC
+
+ % Generate the Data Image (uses the MaskData)
+ /RGBData WD HD mul 2 mul string def
+ { X Y WD mul add 2 mul % 2 bytes Mask,Red,Green,Blue
+ RGBData
+ dup 2 index MaskData X 2 div cvi Y WB mul add get
+ X 1 and 0 eq { 128 div cvi } { 1 and } ifelse
+ put4bit
+ dup 2 index 0.5 add R put4bit
+ dup 2 index 1.0 add G put4bit
+ exch 1.5 add B put4bit
+ }
+ ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 4 IMLRTB RGBData false [0 1] [1 0 1 0 1 0] 1 DoImage3
+ XB 4 IMLRTB RGBData false [1 0] [1 0 1 0 1 0] 1 DoImage3
+ XC 4 IMLRTB RGBData false [0 1] [0 1 0 1 0 1] 1 DoImage3
+ XD 4 IMLRTB RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XE 4 IMLRBT RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XF 4 IMRLTB RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XG 4 IMRLBT RGBData false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XH 4 IMLRTB RGBDProc false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ XI 4 IMLRTB RGBDFile false [1 0] [0 1 0 1 0 1] 1 DoImage3
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 2, BPC==8, WM=WD, HM=HD
+% IT 2 is line interleave -- Mask line follwoed by Data line
+% RGB Image Data must be chunky (MultipleDatasources==false).
+ /YY YD def
+ TX YY SY add moveto (\nIntType 2\nBPC=8) blockshow
+
+ % Generate the MaskData first
+ MaskGen
+
+ % Generate the Data Image (uses the MaskData)
+ /BPL WD 3 mul WB add cvi def % BytesPerLine
+ /RGBData BPL HD mul string def
+ { X 3 mul Y BPL mul add WB add % 3 bytes Red,Green,Blue + Mask Bytes
+ X 0 eq {
+ RGBData 1 index WB sub
+ MaskData Y WB mul WB getinterval
+ putinterval
+ } if
+ RGBData
+ dup 2 index R 255 mul cvi put
+ dup 2 index 1 add G 255 mul cvi put
+ exch 2 add B 255 mul cvi put
+ }
+ ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 8 IMLRTB RGBData false [0 1] [1 0 1 0 1 0] 2 DoImage3
+ XB 8 IMLRTB RGBData false [1 0] [1 0 1 0 1 0] 2 DoImage3
+ XC 8 IMLRTB RGBData false [0 1] [0 1 0 1 0 1] 2 DoImage3
+ XD 8 IMLRTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XE 8 IMLRBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XF 8 IMRLTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XG 8 IMRLBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XH 8 IMLRTB RGBDProc false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XI 8 IMLRTB RGBDFile false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 2, BPC==12, WM=WD, HM=HD
+ /YY YE def
+ TX YY SY add moveto (\nIntType 2\nBPC=12) blockshow
+
+ % Generate the Data Image (uses the MaskData)
+ /BPL WD 36 mul 7 add 8 div cvi WB add def % BytesPerLine
+ /RGBData BPL HD mul string def
+ { X 36 mul 8 div Y BPL mul add WB add
+ X 0 eq {
+ RGBData 1 index WB sub cvi
+ MaskData Y WB mul WB getinterval
+ putinterval
+ } if
+ RGBData
+ dup 2 index R put12bit
+ dup 2 index 1.5 add G put12bit
+ exch 3.0 add B put12bit
+ }
+ ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 12 IMLRTB RGBData false [0 1] [1 0 1 0 1 0] 2 DoImage3
+ XB 12 IMLRTB RGBData false [1 0] [1 0 1 0 1 0] 2 DoImage3
+ XC 12 IMLRTB RGBData false [0 1] [0 1 0 1 0 1] 2 DoImage3
+ XD 12 IMLRTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XE 12 IMLRBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XF 12 IMRLTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XG 12 IMRLBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XH 12 IMLRTB RGBDProc false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XI 12 IMLRTB RGBDFile false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 2, BPC==4, WM=WD, HM=HD
+ /YY YF def
+ TX YY SY add moveto (\nIntType 2\nBPC=4) blockshow
+
+ % Generate the Data Image (uses the MaskData)
+ /BPL WD 12 mul 7 add 8 div cvi WB add def % BytesPerLine
+ /RGBData BPL HD mul string def
+ { X 12 mul 8 div Y BPL mul add WB add
+ X 0 eq {
+ RGBData 1 index WB sub cvi
+ MaskData Y WB mul WB getinterval
+ putinterval
+ } if
+ RGBData
+ dup 2 index R put4bit
+ dup 2 index 0.5 add G put4bit
+ exch 1.0 add B put4bit
+ }
+ ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 4 IMLRTB RGBData false [0 1] [1 0 1 0 1 0] 2 DoImage3
+ XB 4 IMLRTB RGBData false [1 0] [1 0 1 0 1 0] 2 DoImage3
+ XC 4 IMLRTB RGBData false [0 1] [0 1 0 1 0 1] 2 DoImage3
+ XD 4 IMLRTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XE 4 IMLRBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XF 4 IMRLTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XG 4 IMRLBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XH 4 IMLRTB RGBDProc false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XI 4 IMLRTB RGBDFile false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 2, BPC==8, WM=.6*WD, HM=HD/2
+% IT 2 is line interleave -- Mask line follwoed by Data line
+% RGB Image Data must be chunky (MultipleDatasources==false).
+ /YY YG def
+ TX YY SY add moveto (\nIntType 2\nBPC=8\nWM=.6*WD\nHM=HD/2) blockshow
+
+ % Generate the MaskData first
+ /WM WD .6 mul cvi def
+ /HM HD 2 div cvi def
+ /saveHD HD def
+ /HD HM 2 mul def % make HD even for this exercise
+ MaskGen
+
+ % Generate the Data Image (uses the MaskData)
+ /BPL WD 3 mul def % BytesPerLine RGB Data
+ /RGBData BPL HD mul WB HM mul add string def
+ { X 3 mul Y BPL mul add Y 2 div cvi 1 add WB mul add % 3 bytes Red,Green,Blue + Mask
+ X 0 eq Y 1 and 0 eq and { % Do one row of Mask every other image row
+ RGBData 1 index WB sub
+ MaskData Y 2 div cvi WB mul WB getinterval
+ putinterval
+ } if
+ RGBData
+ dup 2 index R 255 mul cvi put
+ dup 2 index 1 add G 255 mul cvi put
+ exch 2 add B 255 mul cvi put
+ }
+ ImageGen
+
+%DEBUG /xx (xx) (w) file def
+%DEBUG 0 1 HM 1 sub { MaskData exch WB mul WB getinterval xx exch writehexstring xx (\n) writestring } for
+%DEBUG xx (----------------------------------------------------------------\n) writestring
+%DEBUG 0 2 HD 1 sub {
+%DEBUG RGBData 1 index BPL mul 2 index 2 div cvi WB mul add
+%DEBUG WB getinterval xx exch writehexstring xx (\n) writestring
+%DEBUG RGBData 1 index BPL mul 2 index 2 div cvi 1 add WB mul add
+%DEBUG BPL getinterval xx exch writehexstring xx (\n) writestring
+%DEBUG RGBData 1 index 1 add BPL mul 2 index 2 div cvi 1 add WB mul add
+%DEBUG BPL getinterval xx exch writehexstring xx (\n) writestring
+%DEBUG pop
+%DEBUG } for
+%DEBUG xx closefile
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 8 IMLRTB RGBData false [0 1] [1 0 1 0 1 0] 2 DoImage3
+ XB 8 IMLRTB RGBData false [1 0] [1 0 1 0 1 0] 2 DoImage3
+ XC 8 IMLRTB RGBData false [0 1] [0 1 0 1 0 1] 2 DoImage3
+ XD 8 IMLRTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XE 8 IMLRBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XF 8 IMRLTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XG 8 IMRLBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XH 8 IMLRTB RGBDProc false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XI 8 IMLRTB RGBDFile false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ /HD saveHD def % put odd HD back
+
+% ----------------------------------------------------------------------
+% InterleaveType 2, BPC==8, WM=1.3*WD, HM=2*HD
+% IT 2 is line interleave -- Mask line follwoed by Data line
+% RGB Image Data must be chunky (MultipleDatasources==false).
+ /YY YH def
+ TX YY SY add moveto (\nIntType 2\nBPC=8\nWM=1.3*WD\nHM=2*HD) blockshow
+
+ % Generate the MaskData first
+ /WM WD 1.3 mul cvi def
+ /HM HD 2 mul def
+ MaskGen
+
+ % Generate the Data Image (uses the MaskData)
+ /HR HM HD div cvi def
+ /BPL WD 3 mul WB HR mul add cvi def % BytesPerLine
+ /RGBData BPL HD mul string def
+ { X 3 mul Y BPL mul add WB HR mul add % 3 bytes Red,Green,Blue + Mask Bytes
+ X 0 eq { % Do HM/HD rows of Mask
+ RGBData 1 index WB HR mul sub
+ MaskData Y WB HR mul mul WB HR mul getinterval
+ putinterval
+ } if
+ RGBData
+ dup 2 index R 255 mul cvi put
+ dup 2 index 1 add G 255 mul cvi put
+ exch 2 add B 255 mul cvi put
+ }
+ ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 8 IMLRTB RGBData false [0 1] [1 0 1 0 1 0] 2 DoImage3
+ XB 8 IMLRTB RGBData false [1 0] [1 0 1 0 1 0] 2 DoImage3
+ XC 8 IMLRTB RGBData false [0 1] [0 1 0 1 0 1] 2 DoImage3
+ XD 8 IMLRTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XE 8 IMLRBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XF 8 IMRLTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XG 8 IMRLBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XH 8 IMLRTB RGBDProc false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XI 8 IMLRTB RGBDFile false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+% ----------------------------------------------------------------------
+% InterleaveType 2, BPC==12, WM=1.3*WD, HM=2*HD
+ /YY YI def
+ TX YY SY add moveto (\nIntType 2\nBPC=12\nWM=1.3*WD\nHM=2*HD) blockshow
+
+ % Generate the Data Image (uses the MaskData)
+ /HR HM HD div cvi def
+ /BPL WD 36 mul 7 add 8 div cvi WB HR mul add def % BytesPerLine
+ /RGBData BPL HD mul string def
+ { X 36 mul 8 div Y BPL mul add WB HR mul add
+ X 0 eq {
+ RGBData 1 index WB HR mul sub cvi
+ MaskData Y WB HR mul mul WB HR mul getinterval
+ putinterval
+ } if
+ RGBData
+ dup 2 index R put12bit
+ dup 2 index 1.5 add G put12bit
+ exch 3.0 add B put12bit
+ }
+ ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 12 IMLRTB RGBData false [0 1] [1 0 1 0 1 0] 2 DoImage3
+ XB 12 IMLRTB RGBData false [1 0] [1 0 1 0 1 0] 2 DoImage3
+ XC 12 IMLRTB RGBData false [0 1] [0 1 0 1 0 1] 2 DoImage3
+ XD 12 IMLRTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XE 12 IMLRBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XF 12 IMRLTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XG 12 IMRLBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XH 12 IMLRTB RGBDProc false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XI 12 IMLRTB RGBDFile false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 2, BPC==4, WM=1.3*WD, HM=2*HD
+ /YY YJ def
+ TX YY SY add moveto (\nIntType 2\nBPC=4\nWM=1.3*WD\nHM=2*HD) blockshow
+
+ % Generate the Data Image (uses the MaskData)
+ /HR HM HD div cvi def
+ /BPL WD 12 mul 7 add 8 div cvi WB HR mul add def % BytesPerLine
+ /RGBData BPL HD mul string def
+ { X 12 mul 8 div Y BPL mul add WB HR mul add
+ X 0 eq {
+ RGBData 1 index WB HR mul sub cvi
+ MaskData Y WB HR mul mul WB HR mul getinterval
+ putinterval
+ } if
+ RGBData
+ dup 2 index R put4bit
+ dup 2 index 0.5 add G put4bit
+ exch 1.0 add B put4bit
+ }
+ ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 4 IMLRTB RGBData false [0 1] [1 0 1 0 1 0] 2 DoImage3
+ XB 4 IMLRTB RGBData false [1 0] [1 0 1 0 1 0] 2 DoImage3
+ XC 4 IMLRTB RGBData false [0 1] [0 1 0 1 0 1] 2 DoImage3
+ XD 4 IMLRTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XE 4 IMLRBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XF 4 IMRLTB RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XG 4 IMRLBT RGBData false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XH 4 IMLRTB RGBDProc false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ XI 4 IMLRTB RGBDFile false [1 0] [0 1 0 1 0 1] 2 DoImage3
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+ showpage
+% ----------------------------------------------------------------------
+
+ % Use an unusual (unpleasant?) underlying color
+ .6 .95 .4 setrgbcolor clippath fill
+
+ 0 0 0 setrgbcolor
+ TitleFont setfont
+ 200 760 moveto (Image Type 3 Tests) show
+ 200 740 moveto (Rotation Angle = ) show IR 3 string cvs show
+ 200 720 moveto (InterleaveType 3) show
+ 170 700 moveto (Colorspace = ) show CSpaceName show
+ LegendFont setfont
+
+ .4 .1 .7 setrgbcolor % contrasting color for stencil masking
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==8, WM=WD, HM=HD
+% IT 3 is line interleave -- Mask and Data in separate sources
+% RGB Image Data chunky (MultipleDatasources==false).
+ /YY YA def
+ TX YY SY add moveto (BPC=8\nMulti\nfalse) blockshow
+
+ % Generate the MaskData first
+ /WM WD def
+ /HM HD def
+ MaskGen
+
+ % Generate the Data Image
+ /RGBData WD HD mul 3 mul string def
+ { X Y WD mul add 3 mul RGBData
+ dup 2 index R 255 mul cvi put
+ dup 2 index 1 add G 255 mul cvi put
+ exch 2 add B 255 mul cvi put
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 8 IMLRTB [ MaskData RGBData ] false [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 8 IMLRTB [ MaskData RGBData ] false [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 8 IMLRTB [ MaskData RGBData ] false [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 8 IMLRTB [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 8 IMLRBT [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 8 IMRLTB [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 8 IMRLBT [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 8 IMLRTB [ MaskDProc RGBDProc ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 8 IMLRTB [ MaskDFile RGBDFile ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==12, WM=WD, HM=HD
+ /YY YB def
+ TX YY SY add moveto (BPC=12\nMulti\nfalse) blockshow
+
+ /RGBData WD 36 mul 7 add 8 div cvi HD mul string def
+ {
+ X 36 mul 8 div Y WD 36 mul 7 add 8 div cvi mul add
+ RGBData 1 index R put12bit
+ RGBData 1 index 1.5 add G put12bit
+ RGBData exch 3 add B put12bit
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 12 IMLRTB [ MaskData RGBData ] false [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 12 IMLRTB [ MaskData RGBData ] false [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 12 IMLRTB [ MaskData RGBData ] false [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 12 IMLRTB [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 12 IMLRBT [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 12 IMRLTB [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 12 IMRLBT [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 12 IMLRTB [ MaskDProc RGBDProc ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 12 IMLRTB [ MaskDFile RGBDFile ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==4, WM=WD, HM=HD
+ /YY YC def
+ TX YY SY add moveto (BPC=4\nMulti\nfalse) blockshow
+
+ /RGBData WD 12 mul 7 add 8 div cvi HD mul string def
+ {
+ X 12 mul 8 div Y WD 12 mul 7 add 8 div cvi mul add
+ RGBData 1 index R put4bit
+ RGBData 1 index 0.5 add G put4bit
+ RGBData exch 1.0 add B put4bit
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 4 IMLRTB [ MaskData RGBData ] false [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 4 IMLRTB [ MaskData RGBData ] false [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 4 IMLRTB [ MaskData RGBData ] false [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 4 IMLRTB [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 4 IMLRBT [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 4 IMRLTB [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 4 IMRLBT [ MaskData RGBData ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 4 IMLRTB [ MaskDProc RGBDProc ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 4 IMLRTB [ MaskDFile RGBDFile ] false [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==8, WM=WD, HM=HD
+% IT 3 is line interleave -- Mask and Data in separate sources
+% RGB Image Data seprate (MultipleDatasources==true).
+ /YY YA def
+ TX YY SY add moveto (BPC=8\nMulti\ntrue) blockshow
+
+ % Generate the MaskData first
+ MaskGen
+
+ % Generate the Data Image
+ WD HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ { X Y WD mul add
+ RData 1 index R 255 mul cvi put
+ GData 1 index G 255 mul cvi put
+ BData exch B 255 mul cvi put
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 8 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 8 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 8 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 8 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 8 IMLRBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 8 IMRLTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 8 IMRLBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 8 IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 8 IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==8, WM=WD, HM=HD
+% IT 3 is line interleave -- Mask and Data in separate sources
+% RGB Image Data seprate (MultipleDatasources==true).
+ /YY YD def
+ TX YY SY add moveto (BPC=8\nMulti\ntrue) blockshow
+
+ % Generate the MaskData first
+ MaskGen
+
+ % Generate the Data Image
+ WD HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ { X Y WD mul add
+ RData 1 index R 255 mul cvi put
+ GData 1 index G 255 mul cvi put
+ BData exch B 255 mul cvi put
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 8 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 8 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 8 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 8 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 8 IMLRBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 8 IMRLTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 8 IMRLBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 8 IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 8 IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==12, WM=WD, HM=HD
+ /YY YE def
+ TX YY SY add moveto (BPC=12\nMulti\ntrue) blockshow
+
+ WD 3 mul 1 add 2 div cvi HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ {
+ X 3 mul 2 div Y WD 3 mul 1 add 2 div cvi mul add
+ RData 1 index R put12bit
+ GData 1 index G put12bit
+ BData exch B put12bit
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 12 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 12 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 12 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 12 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 12 IMLRBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 12 IMRLTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 12 IMRLBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 12 IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 12 IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==4, WM=WD, HM=HD
+ /YY YF def
+ TX YY SY add moveto (BPC=4\nMulti\ntrue) blockshow
+
+ WD 1 add 2 div cvi HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ {
+ X 2 div Y WD 1 add 2 div cvi mul add
+ RData 1 index R put4bit
+ GData 1 index G put4bit
+ BData exch B put4bit
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 4 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 4 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 4 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 4 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 4 IMLRBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 4 IMRLTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 4 IMRLBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 4 IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 4 IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==8, WM=.9*WD, HM=1.1*HD
+% IT 3 is line interleave -- Mask and Data in separate sources
+% RGB Image Data seprate (MultipleDatasources==true).
+ /YY YG def
+ TX YY SY add moveto (BPC=8\nMulti\ntrue\nWM=.9*WD\nHM=1.1*HD) blockshow
+
+ /WM 0.9 WD mul cvi def
+ /HM 1.1 HD mul cvi def
+ % Generate the MaskData first
+ MaskGen
+
+ % Generate the Data Image
+ WD HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ { X Y WD mul add
+ RData 1 index R 255 mul cvi put
+ GData 1 index G 255 mul cvi put
+ BData exch B 255 mul cvi put
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 8 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 8 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 8 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 8 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 8 IMLRBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 8 IMRLTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 8 IMRLBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 8 IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 8 IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==12, WM=WD, HM=HD
+ /YY YI def
+ TX YY SY add moveto (BPC=12\nMulti\ntrue\nWM=.9*WD\nHM=1.1*HD) blockshow
+
+ WD 3 mul 1 add 2 div cvi HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ {
+ X 3 mul 2 div Y WD 3 mul 1 add 2 div cvi mul add
+ RData 1 index R put12bit
+ GData 1 index G put12bit
+ BData exch B put12bit
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 12 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 12 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 12 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 12 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 12 IMLRBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 12 IMRLTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 12 IMRLBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 12 IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 12 IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==4, WM=WD, HM=HD
+ /YY YJ def
+ TX YY SY add moveto (BPC=4\nMulti\ntrue\nWM=.9*WD\nHM=1.1*HD) blockshow
+
+ WD 1 add 2 div cvi HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ {
+ X 2 div Y WD 1 add 2 div cvi mul add
+ RData 1 index R put4bit
+ GData 1 index G put4bit
+ BData exch B put4bit
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 4 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 4 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 4 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 4 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 4 IMLRBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 4 IMRLTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 4 IMRLBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 4 IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 4 IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+% ----------------------------------------------------------------------
+% InterleaveType 3, BPC==8, WM=1.1*WD, HM=.9*HD
+% IT 3 is line interleave -- Mask and Data in separate sources
+% RGB Image Data seprate (MultipleDatasources==true).
+ /YY YH def
+ TX YY SY add moveto (BPC=8\nMulti\ntrue\nWM=1.1*WD\nHM=.9*HD) blockshow
+
+ /WM 1.1 WD mul cvi def
+ /HM 0.9 HD mul cvi def
+ % Generate the MaskData first
+ MaskGen
+
+ % Generate the Data Image
+ WD HD mul /RData 1 index string def
+ /GData 1 index string def
+ /BData exch string def
+ { X Y WD mul add
+ RData 1 index R 255 mul cvi put
+ GData 1 index G 255 mul cvi put
+ BData exch B 255 mul cvi put
+ } ImageGen
+
+ % X BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
+ XA 8 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [1 0 1 0 1 0] 3 DoImage3
+ XB 8 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [1 0 1 0 1 0] 3 DoImage3
+ XC 8 IMLRTB [ MaskData [RData GData BData] ] true [0 1] [0 1 0 1 0 1] 3 DoImage3
+ XD 8 IMLRTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XE 8 IMLRBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XF 8 IMRLTB [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XG 8 IMRLBT [ MaskData [RData GData BData] ] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XH 8 IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ XI 8 IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true [1 0] [0 1 0 1 0 1] 3 DoImage3
+ MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
+ RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
+ GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
+ BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
+
+ showpage
+} bind def % T3Tests
+
+% ----------------------------------------------------------------------
+% Do the various rotations
+%
+/CSpace /DeviceRGB def
+
+[ 0 10 -10 45 90 180 270 ]
+pop [ 0 ] % delete this line to enable tests
+{ /IR exch def T1T4Tests } forall
+
+[ 0 10 -10 45 90 180 270 ]
+pop [ 0 ] % delete this line to enable tests
+{ /IR exch def T3Tests } forall
+
+/CSpace [ /DeviceN [/Blue /Red /Green] /DeviceRGB { } ] def
+
+[ 0 10 -10 45 90 180 270 ]
+pop [ 0 ] % delete this line to enable tests
+{ /IR exch def T1T4Tests } forall
+
+[ 0 10 -10 45 90 180 270 ]
+pop [ 0 ] % delete this line to enable tests
+{ /IR exch def T3Tests } forall
diff --git a/lib/jispaper.ps b/lib/jispaper.ps
new file mode 100644
index 00000000..11d16fa8
--- /dev/null
+++ b/lib/jispaper.ps
@@ -0,0 +1,26 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Select JIS B paper sizes for b0...b6.
+
+userdict begin
+ /b0 /jisb0 load def
+ /b1 /jisb1 load def
+ /b2 /jisb2 load def
+ /b3 /jisb3 load def
+ /b4 /jisb4 load def
+ /b5 /jisb5 load def
+ /b6 /jisb6 load def
+end
diff --git a/lib/jobseparator.ps b/lib/jobseparator.ps
new file mode 100644
index 00000000..fbb69208
--- /dev/null
+++ b/lib/jobseparator.ps
@@ -0,0 +1,3 @@
+% Execute the "real" system version of the ^D to separate jobs
+% when -dJOBDSERVER is being used.
+<04> cvn .systemvar exec
diff --git a/lib/landscap.ps b/lib/landscap.ps
new file mode 100644
index 00000000..c4ee63e5
--- /dev/null
+++ b/lib/landscap.ps
@@ -0,0 +1,30 @@
+%!
+% landscap.ps
+%
+% This file can be prepended to most PostScript pages to force
+% rotation to "landscape" mode.
+%
+% There are (at least) four possible ways to reasonably position a
+% page after rotation. Any of the four old corners (llx,lly e.g.)
+% can be moved to match the corresonding new corner.
+% By uncommmenting the appropriate line below (i.e., remove the
+% leading '%'), any such positioning can be chosen for positive or
+% negative rotation. The comments at the end of each "rotate" line
+% indicate the ORIGINAL corner to be aligned. For example, as given
+% below, the lower left hand corner is aligned. When viewed, this
+% corner will have moved to the urx,lly corner.
+%
+% originally by James E. Burns, 3/8/93, burns@nova.bellcore.com
+%
+gsave clippath pathbbox grestore
+4 dict begin
+/ury exch def /urx exch def /lly exch def /llx exch def
+%90 rotate llx neg ury neg translate % llx,ury
+90 rotate llx neg llx urx sub lly sub translate % llx,lly
+%90 rotate ury lly sub urx sub ury neg translate % urx,ury
+%90 rotate ury lly sub urx sub llx urx sub lly sub translate % urx,lly
+%-90 rotate urx neg lly neg translate % urx,lly
+%-90 rotate urx neg urx llx sub ury sub translate % urx,ury
+%-90 rotate llx lly add ury sub urx llx sub ury sub translate % llx,ury
+%-90 rotate llx lly add ury sub lly neg translate % llx,lly
+end
diff --git a/lib/lines.ps b/lib/lines.ps
new file mode 100644
index 00000000..2b77d8e9
--- /dev/null
+++ b/lib/lines.ps
@@ -0,0 +1,164 @@
+%!
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Test line rendering (stroke).
+
+% Exercise the miter limit. The left column of lines should bevel at
+% 90 degrees, the right column at 60 degrees.
+
+gsave
+1.8 setlinewidth
+0 setgray
+15 15 scale
+-5 5 translate
+[1.415 2.0]
+ { setmiterlimit 12 0 translate 0 0 moveto
+ 10 30 360
+ { gsave 5 0 rlineto rotate 2.5 0 rlineto
+ gsave 0 setlinewidth 1 0 0 setrgbcolor stroke grestore
+ strokepath 0 setlinewidth stroke
+ grestore
+ 0 4 rmoveto
+ } for
+ } forall
+
+showpage
+grestore
+
+% Exercise all the combinations of cap and join styles
+% for one-line, two-line, and closed paths.
+
+gsave
+
+/drawlines {
+gsave
+2.0 setmiterlimit
+2.0 setlinewidth
+6 6 scale
+5 20 translate
+{0 1 2} % line cap
+ { setlinecap gsave
+ {0 1 2} % line join
+ { setlinejoin gsave
+ { {currentpoint lineto}
+ {3 7 lineto}
+ {3 7 lineto 5 1 lineto}
+ {3 7 lineto 6 3 lineto closepath}
+ }
+ { gsave 0 0 moveto exec
+ gsave stroke grestore
+ 0.5 setlinewidth 1 0 0 setrgbcolor stroke
+ grestore 8 0 translate
+ } forall
+ grestore 35 0 translate
+ } forall
+ grestore 0 20 translate
+ } forall
+grestore
+} def
+/xflip
+ { 8.5 72 mul 0 translate -1 1 scale
+ } def
+/rot90
+ { 90 rotate 0 -9.75 72 mul translate
+ } def
+/rot180
+ { rot90 rot90
+ } def
+/rot270
+ { rot180 rot90
+ } def
+
+drawlines showpage
+gsave xflip drawlines grestore showpage
+gsave rot90 drawlines grestore showpage
+gsave rot90 xflip drawlines grestore showpage
+gsave drawlines rot180 showpage
+gsave rot180 xflip drawlines grestore showpage
+gsave rot270 drawlines grestore showpage
+gsave rot270 xflip drawlines grestore showpage
+grestore
+
+% Here are some boundary conditions, contributed by Mark Rawling.
+
+gsave
+1 setlinecap
+2.6 setmiterlimit
+3.0 setlinewidth
+
+5 5 scale
+10 20 translate
+
+% [ 0.5 sqrt dup dup dup neg exch 0 0 ] concat % 45 rotate
+
+{0 1 2} % line join
+{
+ setlinejoin gsave
+ 0 0 moveto 0 10 lineto 10 0 lineto gsave stroke grestore
+ 15 0 translate
+ 0 0 moveto 0 10 lineto 10 20 lineto gsave stroke grestore
+ 15 0 translate
+ 10 0 moveto 10 10 lineto 0 20 lineto gsave stroke grestore
+ 15 0 translate
+ 10 0 moveto 10 10 lineto 0 0 lineto gsave stroke grestore
+ grestore
+ gsave
+ 0 20 translate
+ 0 20 moveto 0 10 lineto 10 20 lineto gsave stroke grestore
+ 15 0 translate
+ 0 20 moveto 0 10 lineto 10 0 lineto gsave stroke grestore
+ 15 0 translate
+ 10 20 moveto 10 10 lineto 0 0 lineto gsave stroke grestore
+ 15 0 translate
+ 10 20 moveto 10 10 lineto 0 20 lineto gsave stroke grestore
+ grestore 60 0 translate
+} forall
+
+showpage
+grestore
+
+% Test narrow lines at a variety of angles.
+
+gsave
+
+/rad 120 def
+/ray { gsave rotate 0 0 moveto rad 0 rlineto stroke grestore } def
+/star
+ { newpath gsave
+ gsave 0.5 setgray 0 0 rad 0 360 arc stroke grestore
+ 0 90 359
+ { rotate
+ 0 3 14 { ray } for
+ 15 15 89 { ray } for
+ } for
+ grestore
+ } def
+
+0 setgray
+150 150 translate
+[ [ 0 0.5 1 ] [ 1.5 2 2.5 ] [ 3 3.5 4 ] ]
+ { gsave
+ { setlinewidth star
+ 250 0 translate
+ } forall
+ grestore 0 250 translate
+ } forall
+
+grestore showpage
+
+% End
+
+quit
diff --git a/lib/lp386.bat b/lib/lp386.bat
new file mode 100755
index 00000000..0f247a2b
--- /dev/null
+++ b/lib/lp386.bat
@@ -0,0 +1 @@
+@gs386 -sDEVICE=djet500 -P- -dSAFER -dNOPAUSE -- gslp.ps -fCourier9 %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/lib/lp386r2.bat b/lib/lp386r2.bat
new file mode 100755
index 00000000..b1691b2c
--- /dev/null
+++ b/lib/lp386r2.bat
@@ -0,0 +1 @@
+@gs386 -sDEVICE=djet500 -P- -dSAFER -dNOPAUSE -- gslp.ps -2r %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/lib/lpgs.bat b/lib/lpgs.bat
new file mode 100755
index 00000000..cd700752
--- /dev/null
+++ b/lib/lpgs.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GSC% -sDEVICE#djet500 -P- -dSAFER -dNOPAUSE -sPROGNAME=lpgs -- gslp.ps -fCourier9 %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/lib/lpr2.bat b/lib/lpr2.bat
new file mode 100755
index 00000000..b5183d75
--- /dev/null
+++ b/lib/lpr2.bat
@@ -0,0 +1,4 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+%GSC% -sDEVICE#djet500 -P- -dSAFER -dNOPAUSE -sPROGNAME=lpr2 -- gslp.ps -2r %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/lib/lprsetup.sh b/lib/lprsetup.sh
new file mode 100755
index 00000000..673cba81
--- /dev/null
+++ b/lib/lprsetup.sh
@@ -0,0 +1,223 @@
+#!/bin/sh
+#
+# BSD PRINT FILTER SETUP utility for Ghostscript - used and tested on
+# SunOS 4.1.3, but I hope it will be useful on other BSD systems
+# See documentation for usage
+#
+
+GSPATH=
+while [ $# -gt 0 ]
+do
+ case "$1" in
+ -p) GSPATH="$2"/lib/ghostscript; shift;;
+ -h) echo >&2 \
+ "usage: $0 [-p <gs install prefix>]\n"\
+ "Where <gs install prefix> is the ""prefix""\n"\
+ "for the Ghostscript install - the default is\n"\
+ """/usr/local"""
+ exit 1;;
+ -*) echo >&2 \
+ "usage: $0 [-p <gs install prefix>]"
+ exit 1;;
+ *) break;; # terminate while loop
+ esac
+ shift
+done
+
+DEVICES="bjt600.32 bjc600.32 bjc600.24 bjc600.24.3 bjc600.16 bjc600.8 bjc600.8.1 bjc600.1 bjc600.dq"
+#FILTERS="if nf tf gf vf df cf rf"
+FILTERS="if"
+
+# The port your printer is on
+PRINTERDEV=/dev/lp1
+# The kind of printer (accepted values: 'parallel' and 'serial')
+PRINTERTYPE=parallel
+
+if [ "x$GSPATH"="x" ] ; then
+ GSDIR=`which gs | awk -F / 'sub(FS $NF,x)' | awk -F / 'sub(FS $NF,x)'`/lib/ghostscript
+else
+ GSDIR=$GSPATH
+fi
+
+GSFILTERDIR=$GSDIR/filt
+SPOOLDIR=/var/spool
+GSIF=unix-lpr.sh
+PCAP=printcap.insert
+
+if [ "x$GSPATH"="x" ] ; then
+ echo "Warning: Writing filters to $GSFILTERDIR"
+ echo "if you do not want this, you have 10 seconds to hit ^c to abort this script:"
+ for i in 10 09 08 07 06 05 04 03 02 01 continuing....; do
+ sleep 1
+ echo -n 
+ echo -n $i
+ done
+ echo
+fi
+
+PATH=/bin:/usr/bin:/usr/ucb
+export PATH
+
+if [ ! -w $GSDIR ]; then
+ echo "$GSDIR must be writable to create filter directory"
+ exit 1
+fi
+
+echo "
+Making links in the filter directory $GSFILTERDIR ...
+"
+
+#
+# Make the directory for holding the filter and links
+#
+if [ -d $GSFILTERDIR ]; then
+ echo "$GSFILTERDIR already exists - not created"
+else
+ mkdir $GSFILTERDIR
+fi
+rm -f $GSFILTERDIR/direct
+ln -s . $GSFILTERDIR/direct
+rm -f $GSFILTERDIR/indirect
+ln -s . $GSFILTERDIR/indirect
+
+#
+# Create a link from each filtertype to the real filter script
+#
+for filter in $FILTERS
+do
+ rm -f $GSFILTERDIR/gs$filter
+ ln -s ../$GSIF $GSFILTERDIR/gs$filter
+done
+
+#
+# Create a link from each device to the filter directory
+#
+for device in $DEVICES
+do
+ dualqueue=
+ case "$device" in
+ *.dq) device=`basename $device .dq` ; dualqueue=t ;;
+ esac
+ rm -f $GSFILTERDIR/$device
+ if [ $dualqueue ]; then
+ rm -f $GSFILTERDIR/indirect/$device
+ ln -s . $GSFILTERDIR/indirect/$device
+ else
+ rm -f $GSFILTERDIR/direct/$device
+ ln -s . $GSFILTERDIR/direct/$device
+ fi
+done
+
+#
+# Create a basic printcap insert - this is made in the CURRENT directory
+#
+rm -f $PCAP
+cat > $PCAP << EOF
+# This is an example printcap insert for Ghostscript printers
+# You will probably want either to change the names for each printer
+# below (first line for each device) to something more sensible, or
+# to add additional name entries (eg cdjcolor for cdj500.24)
+# The example is shown set up for $PRINTERTYPE printers - you will need
+# to alter the entries for different or networked remote printer,
+# eg. a remote network printer would have a line something like:
+# :lp=:rm=artemis:rp=LPT1:
+# for a PC called artemis, replacing the serial port settings
+#
+# NB/ This is only an example - it is unlikely to be complete or exactly
+# correct for your system, but is designed to illustrate filter names
+# corresponding to the accompanying bsd-if print filter
+#
+EOF
+
+(
+previous=undefined
+for device in $DEVICES
+do
+ dualqueue=
+ case "$device" in
+ *.dq) device=`basename $device .dq` ; dualqueue=t ;;
+ esac
+ base="`echo $device | sed 's/\.[0-9][0-9]*$//'`"
+ base="`echo $base | sed 's/\.[0-9][0-9]*$//'`"
+#
+# If device listed with '.dq' suffix, we set up a separate output queue
+#
+ if [ $dualqueue ]; then
+ if [ $base != $previous ]; then
+ previous=$base
+ echo "\
+# Entry for raw device $base.raw
+$base.raw|Raw output device $base:\\
+ :lp=$PRINTERDEV:\\"
+ if test "$PRINTERTYPE" = serial
+ then
+ echo "br#19200:xc#0177777:\\"
+ echo ":ms=-parity,ixon,-opost:\\"
+ fi
+ echo ":sd=$SPOOLDIR/$base/raw:\\
+ :mx#0:sf:sh:rs:"
+ fi
+ echo "\
+# Entry for device $device (output to $base.raw)
+$device|Ghostscript device $device:\\
+ :lp=/dev/null:\\"
+ else
+ echo "\
+# Entry for device $device
+$device|Ghostscript device $device:\\
+ :lp=$PRINTERDEV:\\"
+ if test "$PRINTERTYPE" = serial
+ then
+ echo "br#19200:xc#0177777:\\"
+ echo ":ms=-parity,ixon,-opost:\\"
+ fi
+ fi
+ echo "\
+ :sd=$SPOOLDIR/$base:\\
+ :lf=$SPOOLDIR/$base/logfile:\\
+ :af=$SPOOLDIR/$base/acct:\\"
+ for filter in $FILTERS
+ do
+ if [ $dualqueue ]; then
+ echo "\
+ :$filter=$GSFILTERDIR/indirect/$device/gs$filter:\\"
+ else
+ echo "\
+ :$filter=$GSFILTERDIR/direct/$device/gs$filter:\\"
+ fi
+ done
+ echo "\
+ :mx#0:sf:sh:rs:"
+done
+) >> $PCAP
+
+echo "
+Example printcap insert file \"$PCAP\" now created"
+
+#
+# Remind the user what's still to do
+#
+
+echo "
+NB/ You will need to create the following directories, with
+appropriate permissions, and do 'touch logfile' and 'touch acct'
+in the top level directories (ie. not the 'raw' ones):
+"
+(
+for device in $DEVICES
+do
+ dualqueue=
+ case "$device" in
+ *.dq) device=`basename $device .dq` ; dualqueue=t ;;
+ esac
+ base="`echo $device | sed 's/\.[0-9][0-9]*$//'`"
+ base="`echo $base | sed 's/\.[0-9][0-9]*$//'`"
+ echo " $SPOOLDIR/$base"
+ if [ $dualqueue ]; then
+ echo " $SPOOLDIR/$base/raw"
+ fi
+done
+) | sort -u
+
+echo "
+ + + + "
diff --git a/lib/mkcidfm.ps b/lib/mkcidfm.ps
new file mode 100644
index 00000000..bb6629ef
--- /dev/null
+++ b/lib/mkcidfm.ps
@@ -0,0 +1,771 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+
+% Generate a cidfmap file for substituting CID fonts with TrueType
+% fonts, based on fonts found in the directory FONTDIR.
+%
+% The directory FONTDIR is searched for fonts whose filename
+% matches a Path in the cidsubs dictionary.
+% Any matches are written out as a CID font substitution.
+%
+% For each fontname and alias in the fontaliases dictionary,
+% write out each alias that matches a substituted font.
+% Where multiple aliases are possible, use the first match.
+%
+% Note that the substitutions and aliases in this file were created
+% by someone who doesn't understand Chinese, Japanese or Korean.
+% The initial list contains only font files found in Windows XP.
+% Please submit corrections and additions.
+%
+% See the end of file for references and further information.
+%
+% Font filenames must match case.
+% All font filenames are currently lower case.
+%
+% Usage: gswin32c -q -dBATCH -sFONTDIR=c:/windows/fonts
+% -sCIDFMAP=c:/gs/cidfmap mkcidfm.ps
+
+systemdict /FONTDIR known not { /FONTDIR (c:/windows/fonts) def } if
+
+systemdict /CIDFMAP known { CIDFMAP } { (%stdout) } ifelse
+/cidfmap exch (w) file def
+
+% Directory separator as used by filenameforall
+/dirsep (/) def
+
+% This dictionary contains a list of font substitutions.
+% The first matching substitution in the array will be used.
+/fontaliases
+<<
+ % otf's /AdobeMingStd-Light /AdobeHeitiStd-Regular /AdobeSongStd-Light
+ % /KozMinPr6N-Regular /AdobeMyungjoStd-Medium came with Acroread 9 unix CJK pack.
+
+ % ArialUnicode and a common font are used as a last-resort catch-all
+ % in most cases.
+
+ % Traditional Chinese
+ % Mingliu and Kaiu are known to use patented TT instructions
+ /MSung-Light [ /MingLiU /ArialUnicodeMS-CNS ]
+ /MSung-Medium [ /MingLiU /ArialUnicodeMS-CNS ]
+ /MHei-Medium [ /MicrosoftJhengHeiRegular /ArialUnicodeMS-CNS /MingLiU ]
+ /MKai-Medium [ /DFKaiShu-SB-Estd-BF /Arial-Unicode-MS /MingLiU /ArialUnicodeMS-CNS ]
+ /AdobeMingStd-Light [ /MingLiU /ArialUnicodeMS-CNS ]
+
+ % Simplified Chinese
+ /STSong-Light [ /SimSun /SimSun-18030 /ArialUnicodeMS-GB ]
+ /STFangsong-Light [ /FangSong /SimSun /ArialUnicodeMS-GB ]
+ /STHeiti-Regular [ /MicrosoftYaHei /SimHei /ArialUnicodeMS-GB ]
+ /STKaiti-Regular [ /KaiTi /SimHei /ArialUnicodeMS-GB ]
+ /AdobeHeitiStd-Regular [ /MicrosoftYaHei /SimHei /ArialUnicodeMS-GB ]
+ /AdobeSongStd-Light [ /SimSun /ArialUnicodeMS-GB ]
+
+ % Japanese
+ /Ryumin-Light [ /MS-Mincho04 /MS-Mincho /ArialUnicodeMS-JP ]
+ /Ryumin-Medium [ /MS-Mincho04 /MS-Mincho /ArialUnicodeMS-JP ]
+ /GothicBBB-Medium [ /MS-Gothic04 /MS-Gothic /Meiryo /ArialUnicodeMS-JP ]
+ /HeiseiMin-W3 [ /MS-Mincho04 /MS-Mincho /ArialUnicodeMS-JP ]
+ /HeiseiKakuGo-W5 [ /MS-Gothic04 /MS-Gothic /Meiryo /ArialUnicodeMS-JP ]
+ /KozMinPr6N-Regular [ /MS-Mincho04 /MS-Mincho /ArialUnicodeMS-JP ]
+
+ % Korean
+ % Malgun seems to have a full set of Hangu but not much of Kanji glyphs
+ % "Gulim Old Hangul Jamo" has Hangu but no Kanji, and PMmy has Kanji but
+ % no Hangu. Neither are useful for Korean users.
+ /HYSMyeongJo-Medium [ /Batang /NewBatang /GulimChe /ArialUnicodeMS-KR /MalgunGothicRegular ]
+ /HYRGoThic-Medium [ /Gulim /NewGulim /GulimChe /ArialUnicodeMS-KR /MalgunGothicRegular ]
+ /HYGoThic-Medium [ /Dotum /NewGulim /GulimChe /ArialUnicodeMS-KR /MalgunGothicRegular ]
+ /AdobeMyungjoStd-Medium [ /Batang /NewBatang /GulimChe /ArialUnicodeMS-KR /MalgunGothicRegular ]
+>>
+def
+
+% This dictionary contains a list of CID substitutions
+% Many ttc's have an older ttf version - be sure to put the ttf entries later.
+/cidsubs
+<<
+ % Simplified Chinese
+ /SimHei
+ <<
+ /FileType /TrueType
+ /Path (simhei.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /SimSun
+ <<
+ /FileType /TrueType
+ /Path (simsun.ttc)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /NSimSun
+ <<
+ /FileType /TrueType
+ /Path (simsun.ttc)
+ /SubfontID 1
+ /CSI [(GB1) 2]
+ >>
+
+ /SimSun-oldttf
+ <<
+ /FileType /TrueType
+ /Path (simsun.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /KaiTi
+ <<
+ /FileType /TrueType
+ /Path (simkai.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /LiSu
+ <<
+ /FileType /TrueType
+ /Path (simli.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /SimSun-18030
+ <<
+ /FileType /TrueType
+ /Path (simsun18030.ttc)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /NSimSun-18030
+ <<
+ /FileType /TrueType
+ /Path (simsun18030.ttc)
+ /SubfontID 1
+ /CSI [(GB1) 2]
+ >>
+
+ /YouYuan
+ <<
+ /FileType /TrueType
+ /Path (simyou.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /FangSong
+ <<
+ /FileType /TrueType
+ /Path (simfang.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /MicrosoftYaHei
+ <<
+ /FileType /TrueType
+ /Path (msyh.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /MicrosoftYaHeiBold
+ <<
+ /FileType /TrueType
+ /Path (msyhbd.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /MS-Song
+ <<
+ /FileType /TrueType
+ /Path (mssong.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /MS-Hei
+ <<
+ /FileType /TrueType
+ /Path (mshei.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ /ArialUnicodeMS-GB
+ <<
+ /FileType /TrueType
+ /Path (arialuni.ttf)
+ /SubfontID 0
+ /CSI [(GB1) 2]
+ >>
+
+ % Traditional Chinese
+ /MingLiU
+ <<
+ /FileType /TrueType
+ /Path (mingliu.ttc)
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ >>
+
+ /PMingLiU
+ <<
+ /FileType /TrueType
+ /Path (mingliu.ttc)
+ /SubfontID 1
+ /CSI [(CNS1) 2]
+ >>
+
+ % It probably should be ttf (ttc a typo), but we'll keep this entry just in case.
+ /Arial-Unicode-MS
+ <<
+ /FileType /TrueType
+ /Path (arialuni.ttc)
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ >>
+
+ /MicrosoftJhengHeiRegular
+ <<
+ /FileType /TrueType
+ /Path (msjh.ttf)
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ >>
+
+ /MicrosoftJhengHeiBold
+ <<
+ /FileType /TrueType
+ /Path (msjhbd.ttf)
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ >>
+
+ /MingLiU-oldttf
+ <<
+ /FileType /TrueType
+ /Path (mingliu.ttf)
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ >>
+
+ /DFKaiShu-SB-Estd-BF
+ <<
+ /FileType /TrueType
+ /Path (kaiu.ttf)
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ >>
+
+ /ArialUnicodeMS-CNS
+ <<
+ /FileType /TrueType
+ /Path (arialuni.ttf)
+ /SubfontID 0
+ /CSI [(CNS1) 2]
+ >>
+
+ % Japanese
+ /MS-Gothic
+ <<
+ /FileType /TrueType
+ /Path (msgothic.ttc)
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ >>
+
+ /MS-PGothic
+ <<
+ /FileType /TrueType
+ /Path (msgothic.ttc)
+ /SubfontID 1
+ /CSI [(Japan1) 3]
+ >>
+
+ /MS-UI-Gothic
+ <<
+ /FileType /TrueType
+ /Path (msgothic.ttc)
+ /SubfontID 2
+ /CSI [(Japan1) 3]
+ >>
+
+ /MS-Mincho
+ <<
+ /FileType /TrueType
+ /Path (msmincho.ttc)
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ >>
+
+ /MS-PMincho
+ <<
+ /FileType /TrueType
+ /Path (msmincho.ttc)
+ /SubfontID 1
+ /CSI [(Japan1) 3]
+ >>
+
+ % An XP update ships the Vista (JIS2004) version of msgothic.ttc/msmincho.ttc renamed
+ /MS-Gothic04
+ <<
+ /FileType /TrueType
+ /Path (msgoth04.ttc)
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ >>
+
+ /MS-PGothic04
+ <<
+ /FileType /TrueType
+ /Path (msgoth04.ttc)
+ /SubfontID 1
+ /CSI [(Japan1) 3]
+ >>
+
+ /MS-UI-Gothic04
+ <<
+ /FileType /TrueType
+ /Path (msgoth04.ttc)
+ /SubfontID 2
+ /CSI [(Japan1) 3]
+ >>
+
+ /MS-Mincho04
+ <<
+ /FileType /TrueType
+ /Path (msmin04.ttc)
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ >>
+
+ /MS-PMincho04
+ <<
+ /FileType /TrueType
+ /Path (msmin04.ttc)
+ /SubfontID 1
+ /CSI [(Japan1) 3]
+ >>
+
+ /MS-Mincho-oldttf
+ <<
+ /FileType /TrueType
+ /Path (msmincho.ttf)
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ >>
+
+ /MS-Gothic-oldttf
+ <<
+ /FileType /TrueType
+ /Path (msgothic.ttf)
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ >>
+
+ % Newer meiryo.ttc and meiryob.ttc have subfont 2,3. Leave those out for the time being
+ /Meiryo
+ <<
+ /FileType /TrueType
+ /Path (meiryo.ttc)
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ >>
+
+ /Meiryo-Italic
+ <<
+ /FileType /TrueType
+ /Path (meiryo.ttc)
+ /SubfontID 1
+ /CSI [(Japan1) 3]
+ >>
+
+ /Meiryo-Bold
+ <<
+ /FileType /TrueType
+ /Path (meiryob.ttc)
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ >>
+
+ /Meiryo-BoldItalic
+ <<
+ /FileType /TrueType
+ /Path (meiryob.ttc)
+ /SubfontID 1
+ /CSI [(Japan1) 3]
+ >>
+
+ /ArialUnicodeMS-JP
+ <<
+ /FileType /TrueType
+ /Path (arialuni.ttf)
+ /SubfontID 0
+ /CSI [(Japan1) 3]
+ >>
+
+ % Korean
+ /Batang
+ <<
+ /FileType /TrueType
+ /Path (batang.ttc)
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ >>
+
+ /BatangChe
+ <<
+ /FileType /TrueType
+ /Path (batang.ttc)
+ /SubfontID 1
+ /CSI [(Korea1) 3]
+ >>
+
+ /Gungsuh
+ <<
+ /FileType /TrueType
+ /Path (batang.ttc)
+ /SubfontID 2
+ /CSI [(Korea1) 3]
+ >>
+
+ /GungsuhChe
+ <<
+ /FileType /TrueType
+ /Path (batang.ttc)
+ /SubfontID 3
+ /CSI [(Korea1) 3]
+ >>
+
+ /Gulim
+ <<
+ /FileType /TrueType
+ /Path (gulim.ttc)
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ >>
+
+ /GulimChe
+ <<
+ /FileType /TrueType
+ /Path (gulim.ttc)
+ /SubfontID 1
+ /CSI [(Korea1) 3]
+ >>
+
+ /Dotum
+ <<
+ /FileType /TrueType
+ /Path (gulim.ttc)
+ /SubfontID 2
+ /CSI [(Korea1) 3]
+ >>
+
+ /DotumChe
+ <<
+ /FileType /TrueType
+ /Path (gulim.ttc)
+ /SubfontID 3
+ /CSI [(Korea1) 3]
+ >>
+
+ /MalgunGothicRegular
+ <<
+ /FileType /TrueType
+ /Path (malgun.ttf)
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ >>
+
+ /MalgunGothicBold
+ <<
+ /FileType /TrueType
+ /Path (malgunbd.ttf)
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ >>
+
+ /NewBatang
+ <<
+ /FileType /TrueType
+ /Path (nbatang.ttf)
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ >>
+
+ /NewGulim
+ <<
+ /FileType /TrueType
+ /Path (ngulim.ttf)
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ >>
+
+ /GulimChe-oldttf
+ <<
+ /FileType /TrueType
+ /Path (gulimche.ttf)
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ >>
+
+ /ArialUnicodeMS-KR
+ <<
+ /FileType /TrueType
+ /Path (arialuni.ttf)
+ /SubfontID 0
+ /CSI [(Korea1) 3]
+ >>
+>>
+def
+
+% A dictionary for storing the names and paths of found fonts
+/foundfonts 50 dict def
+
+% Get the basename of a path
+% For example, (c:/windows/fonts/msmincho.ps) --> (msmincho.ps)
+/basename { % path -- subpath
+ { dirsep search
+ {pop pop}
+ {exit}
+ ifelse
+ } loop
+} def
+
+% Convert string (font file name) to lowercase, take care not to touch
+% non-upper case letters. There are a few similiar routines elsewhere
+% for reference:
+% /.ToLower in lib/pdf2dsc.ps
+% /toupper in lib/printafm.ps
+% /.lowerstring in Resource/Init/gs_fonts.ps
+/lowercase {
+ dup length 1 sub -1 0 {
+ 1 index exch 2 copy
+ get
+ dup dup 65 ge exch 90 le and {
+ 2#00100000 or
+ } if
+ put
+ } for
+} def
+
+% Check if a font basename matches one of the possible cid substitutions.
+% If it does, add the font and full path to the foundfonts dictionary
+/checkfont {
+ dup basename
+ lowercase
+ cidsubs
+ {
+ /Path get
+ 2 index eq % Match case only
+ {
+ foundfonts exch
+ 3 index dup length string copy put
+ }
+ {
+ pop
+ }
+ ifelse
+ }
+ forall
+ pop pop
+} def
+
+% Add all matching fonts to foundfonts dictionary
+/findfonts { % path --
+ dup length 2 add string dup 3 1 roll copy pop
+ dup dup length 2 sub dirsep 0 get put
+ dup dup length 1 sub (*) 0 get put
+ /checkfont load 256 string filenameforall
+} def
+
+% Write out a cid substition, using the full font path
+% name is the font name, e.g. /MS-Mincho
+% path is the full path to the font file, e.g. (c:\windows\fonts\msmincho.ttc)
+% subs is the dictionary for CID font substition, from cidsubs
+/emitsubs { % name path subs --
+ 3 -1 roll cidfmap exch write==only % name
+ cidfmap ( << ) writestring
+ % path subs
+ {
+ 1 index /Path eq {pop 1 index} if % use full path, not basename
+ exch cidfmap exch write==only cidfmap ( ) writestring
+ cidfmap exch write==only cidfmap ( ) writestring
+ } forall
+ cidfmap (>> ;\n) writestring
+ pop
+} def
+
+% Write out all known cid substitutions.
+/writesubs { % ---
+ cidfmap (% Substitutions\n) writestring
+ foundfonts
+ {
+ 1 index cidsubs exch known
+ {
+ 1 index cidsubs exch get % name path subs
+ emitsubs
+ }
+ {
+ pop pop
+ }
+ ifelse
+ }
+ forall
+} def
+
+% Write out aliases for which the cid substituted font exists.
+/writealiases { % --
+ cidfmap (\n% Aliases\n) writestring
+ fontaliases
+ {
+ % name aliasarray
+ {
+ % name alias
+ foundfonts 1 index known
+ {
+ 1 index cidfmap exch write==only cidfmap ( ) writestring
+ cidfmap exch write==only cidfmap ( ;\n) writestring
+ exit % after first match
+ }
+ {
+ pop % didn't find this name
+ }
+ ifelse
+ } forall
+ % name
+ pop
+ }
+ forall
+} def
+
+% Write out a new cidfmap file to stdout
+/writecidfmap { % path --
+ cidfmap (%!\n% cidfmap generated automatically by mkcidfm.ps from fonts found in\n) writestring
+ cidfmap (% ) writestring
+ dup cidfmap exch writestring cidfmap (\n\n) writestring
+ findfonts
+ writesubs
+ writealiases
+} def
+
+FONTDIR writecidfmap
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% For what fonts ship with which microsoft product, see:
+% http://www.microsoft.com/typography/Fonts/product.aspx
+%
+% A reasonably clean Vista box comes with:
+% ARIALUNI.TTF meiryob.ttc msjh.ttf simhei.ttf
+% batang.ttc meiryo.ttc msmincho.ttc simkai.ttf
+% gulim.ttc mingliub.ttc MSMINCHO.TTF simsunb.ttf
+% kaiu.ttf mingliu.ttc msyhbd.ttf simsun.ttc
+% malgunbd.ttf msgothic.ttc msyh.ttf
+% malgun.ttf msjhbd.ttf simfang.ttf
+%
+% Here is a non-exhaustive list of CJK fonts found on various MS systems for reference:
+% File Size Version Glyphs Charmaps Postscript Name Codepage
+% ======================================================================================================================
+% arialuni.ttf 24172892 0.86 51180 (1,0)(3,1) ArialUnicodeMS
+% arialuni.ttf 23275812 1.01 50377 (3,1) ArialUnicodeMS 932,936,949,950
+% batang.ttc 16258580 2.21 39680 (3,1) Batang/BatangChe/Gungsuh/GungsuhChe
+% batang.ttc 16265128 2.21 39680 (3,1) Batang/BatangChe/Gungsuh/GungsuhChe
+% batang.ttc 16264732 5.00 39680 (3,1) Batang/BatangChe/Gungsuh/GungsuhChe 949
+% gulimche.ttf 5512432 1.00 20792 (3,1) GulimChe
+% gulim.ttc 13518660 2.21 40194 (3,1) Gulim/GulimChe/Dotum/DotumChe
+% gulim.ttc 13525204 2.21 40194 (3,1) Gulim/GulimChe/Dotum/DotumChe
+% gulim.ttc 13524720 5.00 40194 (3,1) Gulim/GulimChe/Dotum/DotumChe 949
+% kaiu.ttf 4282984 2.00 18193 (1,0)(3,1) DFKaiShu-SB-Estd-BF
+% kaiu.ttf 4279576 2.10 18193 (1,0)(3,1) DFKaiShu-SB-Estd-BF
+% kaiu.ttf 5172084 3.00 22134 (1,0)(3,1) DFKaiShu-SB-Estd-BF
+% kaiu.ttf 5178844 5.00 22134 (1,0)(3,1) DFKaiShu-SB-Estd-BF 950
+% malgun.ttf 4337480 0.85 12747 (0,3)(3,1) MalgunGothicRegular
+% malgun.ttf 4337080 1.00 12747 (0,3)(3,1) MalgunGothicRegular
+% malgun.ttf 4337104 5.00 12747 (0,3)(3,1) MalgunGothicRegular
+% malgun.ttf 4337296 6.11 12747 (0,3)(3,1) MalgunGothicRegular 949
+% malgunbd.ttf 4514980 0.85 12740 (0,3)(3,1) MalgunGothicBold
+% malgunbd.ttf 4513504 1.00 12740 (0,3)(3,1) MalgunGothicBold
+% malgunbd.ttf 4513520 5.00 12740 (0,3)(3,1) MalgunGothicBold
+% malgunbd.ttf 4515044 6.00 12740 (0,3)(3,1) MalgunGothicBold
+% meiryo.ttc 7682568 0.97 20682 (0,3)(3,1)(3,10) Meiryo/Meiryo-Italic 932
+% meiryo.ttc 7815292 5.00 20684 (0,3)(3,1)(3,10) Meiryo/Meiryo-Italic
+% meiryo.ttc 9533888 6.02 23942 (0,3)(3,1)(3,10) Meiryo/Meiryo-Italic/MeiryoUI/MeiryoUI-Italic
+% meiryob.ttc 7924644 0.97 20682 (0,3)(3,1)(3,10) Meiryo-Bold/Meiryo-BoldItalic
+% meiryob.ttc 8054096 5.00 20684 (0,3)(3,1)(3,10) Meiryo-Bold/Meiryo-BoldItalic
+% meiryob.ttc 9749256 6.02 23942 (0,3)(3,1)(3,10) Meiryo-Bold/Meiryo-BoldItalic/MeiryoUI-Bold/MeiryoUI-BoldItalic
+% mingliu.ttf 6272080 2.00 18362 (1,0)(3,1) MingLiU
+% mingliu.ttc 8823308 3.21 22753 (1,0)(3,1) MingLiU/PMingLiU
+% mingliu.ttc 8829856 3.21 22753 (1,0)(3,1) MingLiU/PMingLiU
+% mingliu.ttc 27496184 6.02 33987 (3,1) MingLiU/PMingLiU/Ming-Lt-HKSCS-UNI-H
+% mingliu.ttc 32217124 7.00 34046 (3,1) MingLiU/PMingLiU/Ming-Lt-HKSCS-UNI-H 950
+% mingliub.ttc 33791880 5.00 44857 (3,1)(3,10) MingLiU-ExtB/PMingLiU-ExtB/Ming-Lt-HKSCS-ExtB
+% mingliub.ttc 33805700 7.00 44875 (3,1)(3,10) MingLiU-ExtB/PMingLiU-ExtB/Ming-Lt-HKSCS-ExtB
+% msgothic.ttf 4170144 2.00 13104 (1,0)(3,1) MS-Gothic
+% msgothic.ttc 8272028 2.30 20458 (1,0)(3,1) MS-Gothic/MS-PGothic/MS-UIGothic
+% msgothic.ttc 8278584 2.30 20458 (1,0)(3,1) MS-Gothic/MS-PGothic/MS-UIGothic
+% msgothic.ttc 9165480 5.00 22213 (3,1)(3,10) MS-Gothic/MS-PGothic/MS-UIGothic
+% msgothic.ttc 9176636 5.01 22213 (3,1)(3,10) MS-Gothic/MS-PGothic/MS-UIGothic 932
+% mshei.ttf 1902464 1.00 26272 (1,0)(3,1) MS Hei
+% mshei.ttf 1902556 1.00 26272 (1,0)(3,1) MS Hei
+% msjh.ttf 14698792 0.71 28969 (0,3)(3,1) MicrosoftJhengHeiRegular 950
+% msjh.ttf 14713712 0.75 28969 (0,3)(3,1) MicrosoftJhengHeiRegular
+% msjh.ttf 14713760 5.00 28969 (0,3)(3,1) MicrosoftJhengHeiRegular
+% msjh.ttf 21663376 6.02 29220 (0,3)(3,1) MicrosoftJhengHeiRegular
+% msjhbd.ttf 14498048 0.71 28961 (0,3)(3.1) MicrosoftJhengHeiBold
+% msjhbd.ttf 14509708 0.75 28961 (0,3)(3.1) MicrosoftJhengHeiBold
+% msjhbd.ttf 14509756 5.00 28961 (0,3)(3.1) MicrosoftJhengHeiBold
+% msmincho.ttf 5151192 2.00 13104 (1,0)(3,1) MS-Mincho
+% msmincho.ttc 9136456 2.30 17807 (1,0)(3,1) MS-Mincho/MS-PMincho
+% msmincho.ttc 9135960 2.31 17807 (1,0)(3,1) MS-Mincho/MS-PMincho
+% msmincho.ttc 9142516 2.31 17807 (1,0)(3,1) MS-Mincho/MS-PMincho
+% msmincho.ttc 10056872 5.00 19321 (3,1)(3,10) MS-Mincho/MS-PMincho
+% msmincho.ttc 10057108 5.01 19321 (3,1)(3,10) MS-Mincho/MS-PMincho 932
+% mssong.ttf 2569040 1.00 26304 (1,0)(3,1) MS Song
+% mssong.ttf 2569116 1.00 26304 (1,0)(3,1) MS Song
+% msyh.ttf 12263452 6.01 22562 (0,3)(3,1)(3,10) MSYH
+% msyh.ttf 15067744 0.71 29207 (0,3)(3,1)(3,10) MicrosoftYaHei
+% msyh.ttf 15043584 0.75 29126 (0,3)(3,1)(3,10) MicrosoftYaHei
+% msyh.ttf 15044440 5.00 29126 (0,3)(3,1)(3,10) MicrosoftYaHei
+% msyh.ttf 21767952 6.02 29354 (0,3)(3,1) MicrosoftYaHei 936
+% msyhbd.ttf 14707012 0.71 29240 (0,3)(3,1)(3,10) MicrosoftYaHei
+% msyhbd.ttf 14685876 5.00 29126 (0,3)(3,1)(3,10) MicrosoftYaHei
+% nbatang.ttf 32472240 3.00 49636 (3,1) New Batang
+% ngulim.ttf 8862844 2.00 23181 (3,1) New Gulim
+% ngulim.ttf 25719724 3.10 49284 (3,1) New Gulim
+% ogulim.ttf 830340 1.00 2921 (3,1) Gulim Old Hangul Jamo
+% palmm.ttf 13816928 001.003 27560 (3,1) PMmy
+% simfang.ttf 3996872 2.00 7580 (1,0)(3,1) FangSong_GB2312
+% simfang.ttf 10576012 5.01 28562 (3,1) FangSong 936
+% simhei.ttf 10044356 3.02 22021 (1,0)(3,1) SimHei
+% simhei.ttf 10050868 3.02 22021 (1,0)(3,1) SimHei
+% simhei.ttf 9751960 5.01 28562 (3,1) SimHei 936
+% simkai.ttf 4135804 2.00 7580 (1,0)(3,1) KaiTi_GB2312
+% simkai.ttf 11785184 5.01 28562 (3,1) KaiTi 936
+% simli.ttf 9317908 3.00 21992 (1,0)(3,1) LiSu
+% simsun.ttc 10500792 3.03 22141 (1,0)(3,1) SimSun/NSimSun
+% simsun.ttc 10507340 3.03 22141 (1,0)(3,1) SimSun/NSimSun
+% simsun.ttc 13747080 5.00 28762 (1,0)(3,1) SimSun/NSimSun
+% simsun.ttc 15323200 5.03 28762 (1,0)(3,1) SimSun/NSimSun 936
+% simsun18030.ttc 12642204 2.06 30533 (1,0)(3,1) SimSun-18030/NSimSun-18030
+% simsunb.ttf 15406216 0.90 42809 (1,0)(3,1)(3,10) SimSun-ExtB
+% simsunb.ttf 15406288 5.00 42809 (1,0)(3,1)(3,10) SimSun-ExtB
+% simyou.ttf 6794984 3.00 21991 (1,0)(3,1) YouYuan
+% simyou.ttf 6788204 3.00 21991 (1,0)(3,1) YouYuan
diff --git a/lib/necp2x.upp b/lib/necp2x.upp
new file mode 100644
index 00000000..762fddba
--- /dev/null
+++ b/lib/necp2x.upp
@@ -0,0 +1,35 @@
+-supModel="NEC Prinwriter 2X, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Epson
+-r360x360
+-dupMargins="{ 9.0 40.0 9.0 67.0}"
+-dupWhiteTransfer="{
+ 0.40000 0.36253 0.32747 0.29475
+ 0.26428 0.23599 0.20979 0.18561
+ 0.16336 0.14297 0.12435 0.10741
+ 0.09209 0.07831 0.06597 0.05500
+ 0.04532 0.03684 0.02950 0.02320
+ 0.01787 0.01343 0.00979 0.00687
+ 0.00461 0.00290 0.00168 0.00086
+ 0.00036 0.00011 0.00001 0.00000
+}"
+-dupWeaveXPasses=2
+-dupWeaveYPasses=2
+-dupOutputPins=24
+-dupWeaveYFeeds="{11 12 13 12}"
+-dupWeaveInitialYFeeds="{ 0 1 0 11}"
+-dupWeaveInitialPins="{ 6 24 16 5}"
+-dupFormatXabsolute
+-dupBeginPageCommand="<
+1b40 1b40 1b7401 1b5200 1b50 1b54 1b7200 1b32 1b4306 1b5500 0d 1c242000
+>"
+-dupAdjustPageLengthCommand
+-dupEndPageCommand="(\014)"
+-dupAbortCommand="(\034F\034\063\044\15\12\12\12 Printout-Aborted\15\014)"
+-dupXMoveCommand="(\015\034$)"
+-dupSetLineFeedCommand="(\034F\034\063)"
+-dupWriteComponentCommands="{(\033*\047)}"
diff --git a/lib/necp2x6.upp b/lib/necp2x6.upp
new file mode 100644
index 00000000..75660b46
--- /dev/null
+++ b/lib/necp2x6.upp
@@ -0,0 +1,35 @@
+-supModel="NEC Prinwriter 2X, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/Epson
+-r360x360
+-dupMargins="{ 9.0 9.0 9.0 67.0}"
+-dupWhiteTransfer="{
+ 0.40000 0.36253 0.32747 0.29475
+ 0.26428 0.23599 0.20979 0.18561
+ 0.16336 0.14297 0.12435 0.10741
+ 0.09209 0.07831 0.06597 0.05500
+ 0.04532 0.03684 0.02950 0.02320
+ 0.01787 0.01343 0.00979 0.00687
+ 0.00461 0.00290 0.00168 0.00086
+ 0.00036 0.00011 0.00001 0.00000
+}"
+-dupWeaveXPasses=3
+-dupWeaveYPasses=2
+-dupOutputPins=24
+-dupWeaveYFeeds="{ 7 9 7 9 7 9}"
+-dupWeaveInitialYFeeds="{ 0 0 1 0 0 9}"
+-dupWeaveInitialPins="{ 5 21 13 16 8 24}"
+-dupFormatXabsolute
+-dupBeginPageCommand="<
+1b40 1b40 1b7401 1b5200 1b50 1b54 1b7200 1b32 1b4306 1b5500 0d 1c242000
+>"
+-dupAdjustPageLengthCommand
+-dupEndPageCommand="(\014)"
+-dupAbortCommand="(\034F\034\063\044\15\12\12\12 Printout-Aborted\15\014)"
+-dupXMoveCommand="(\015\034$)"
+-dupSetLineFeedCommand="(\034F\034\063)"
+-dupWriteComponentCommands="{(\033*\041)}"
diff --git a/lib/pdf2dsc b/lib/pdf2dsc
new file mode 100755
index 00000000..b865b4e8
--- /dev/null
+++ b/lib/pdf2dsc
@@ -0,0 +1,34 @@
+#! /bin/sh
+
+# psf2dsc: generates an index of a PDF file.
+#
+# Yves Arrouye <arrouye@debian.org>, 1996.
+# 2000-05-18 lpd <ghost@aladdin.com> added -dSAFER
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+me=`basename $0`
+
+usage() {
+ >&2 echo usage: $me "pdffile [ dscfile ]"
+ exit 1
+}
+
+if [ $# -gt 2 ]
+then
+ usage
+fi
+
+pdffile=$1
+dscfile=$2
+: ${dscfile:=`echo $pdffile | sed 's,\.[^/.]*,,'`.dsc}
+
+exec "$GS_EXECUTABLE" -q -dNODISPLAY -P- -dSAFER -dDELAYSAFER\
+ -sPDFname="$pdffile" -sDSCname="$dscfile" pdf2dsc.ps -c quit
diff --git a/lib/pdf2dsc.bat b/lib/pdf2dsc.bat
new file mode 100755
index 00000000..288acdf5
--- /dev/null
+++ b/lib/pdf2dsc.bat
@@ -0,0 +1,17 @@
+@echo off
+@rem Convert PDF to DSC
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+call "%~dp0gssetgs.bat"
+
+rem Watcom C deletes = signs, so use # instead.
+%GSC% -q -dNODISPLAY -P- -dSAFER -dDELAYSAFER -sPDFname#%1 -sDSCname#%2 -sOutputFile#%2 pdf2dsc.ps
+goto end
+
+:usage
+echo "Usage: pdf2dsc input.pdf output.dsc"
+
+:end
+
+
diff --git a/lib/pdf2dsc.ps b/lib/pdf2dsc.ps
new file mode 100644
index 00000000..d836bf32
--- /dev/null
+++ b/lib/pdf2dsc.ps
@@ -0,0 +1,246 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% pdf2dsc.ps
+% read pdf file and produce DSC "index" file.
+%
+% Input file is named PDFname
+% Output file is named DSCname
+%
+% Run using:
+% gs -dNODISPLAY -sPDFname=pdffilename -sDSCname=tempfilename pdf2dsc.ps
+% Then display the PDF file with
+% gs tempfilename
+%
+% Modified by Jason McCarty, bug 688071
+% Add PageLabels support.
+% Modified by Geoff Keating <geoffk@ozemail.com.au> 21/12/98:
+% Add DocumentMedia, PageMedia comments
+% Use inherited BoundingBox and Orientation
+% Reformat, add new macro 'puts', generally clean up
+% Modified by Johannes Plass <plass@dipmza.physik.uni-mainz.de> 1996-11-05:
+% Adds BoundingBox and Orientation if available.
+% Modified by rjl/lpd 9/19/96
+% Updates for compatibility with modified pdf_*.ps code for handling
+% page ranges (i.e., partial files) better.
+% Modified by Geoff Keating <Geoff.Keating@anu.edu.au> 7/3/96:
+% include Title and CreationDate DSC comments (these are displayed by
+% Ghostview);
+% reduce the size of typical output files by a factor of about 3.
+% Modified by L. Peter Deutsch 3/18/96:
+% Removes unnecessary and error-prone code duplicated from pdf_main.ps
+% Modified by L. Peter Deutsch for GS 3.33
+% Originally by Russell Lang 1995-04-26
+
+/PDFfile PDFname (r) file def
+/DSCfile DSCname (w) file def
+systemdict /.setsafe known { .setsafe } if
+
+/puts { DSCfile exch writestring } bind def
+/DSCstring 255 string def
+/MediaTypes 10 dict def
+
+ PDFfile runpdfbegin
+ /FirstPage where { pop } { /FirstPage 1 def } ifelse
+ /LastPage where { pop } { /LastPage pdfpagecount def } ifelse
+
+% scan through for media sizes, keep them in the dictionary
+ FirstPage 1 LastPage {
+ pdfgetpage /MediaBox pget pop % MediaBox is a required attribute
+ aload pop
+ 3 -1 roll sub 3 1 roll exch sub exch
+ 2 array astore
+ aload 3 1 roll 10 string cvs exch 10 string cvs
+ (x) 3 -1 roll concatstrings concatstrings cvn
+ MediaTypes 3 1 roll exch put
+ } for
+
+% write header and prolog
+ (%!PS-Adobe-3.0\n) puts
+ Trailer /Info knownoget
+ {
+ dup /Title knownoget
+ {
+ (%%Title: ) puts
+ DSCfile exch write==
+ }
+ if
+ /CreationDate knownoget
+ {
+ (%%CreationDate: ) puts
+ DSCfile exch write==
+ }
+ if
+ }
+ if
+ % This is really supposed to be sorted by frequency of usage...
+ (%%DocumentMedia: )
+ MediaTypes {
+ exch pop
+ 1 index puts
+ (y) puts dup 1 get DSCstring cvs puts
+ (x) puts dup 0 get DSCstring cvs puts
+ ( ) puts dup 0 get DSCstring cvs puts
+ ( ) puts 1 get DSCstring cvs puts
+ ( 70 white ()\n) puts
+ pop (%%+ )
+ } forall
+ pop
+
+ (%%Pages: ) puts
+ LastPage FirstPage sub 1 add DSCstring cvs puts
+ (\n%%EndComments\n) puts
+ (%%BeginProlog\n) puts
+ (/Page null def\n/Page# 0 def\n/PDFSave null def\n) puts
+ (/DSCPageCount 0 def\n) puts
+ (/DoPDFPage {dup /Page# exch store dup dopdfpages } def\n) puts
+ (%%EndProlog\n) puts
+ (%%BeginSetup\n) puts
+ DSCfile PDFname write==only
+ ( \(r\) file { DELAYSAFER { .setsafe } if } stopped pop\n) puts
+ ( runpdfbegin\n) puts
+ ( process_trailer_attrs\n) puts
+ (%%EndSetup\n) puts
+
+ /.hasPageLabels false def % see "Page Labels" in the PDF Reference
+ Trailer /Root knownoget {
+ /PageLabels knownoget {
+ /PageLabels exch def
+ /.pageCounter 1 def
+ /.pageCounterType /D def
+ /.pagePrefix () def
+
+ % (TEXT) .ToLower (text) -- convert text to lowercase -- only letters!
+ /.ToLower {
+ dup length 1 sub -1 0 {
+ 1 index exch 2 copy get 2#00100000 or put
+ } for
+ } def
+
+ % int .CvAlpha (int in alphabetic base 26) -- convert a positive
+ % integer to base 26 in capital letters, with 1=A; i.e. A..Z, AA..AZ, ...
+ /.CvAlpha { % using cvrs seems futile since this isn't zero-based ...
+ [ exch % construct an array of ASCII values, in reverse
+ { % the remainder stays on the top of stack
+ dup 0 eq { pop exit } if % quit if the value is zero
+ dup 26 mod dup 0 eq { 26 add } if % so that the division is correct
+ dup 64 add 3 1 roll sub 26 idiv % save the ASCII value and iterate
+ } loop ]
+ dup length dup string 3 1 roll
+ dup -1 1 { % put the letters in a string
+ 4 copy sub exch 4 -1 roll 1 sub get put
+ } for pop pop
+ } def
+
+ % int .CvRoman (int in capital Roman numerals)
+ % convert a positive integer to capital Roman numerals
+ % return a decimal string if >= 4000
+ /.CvRoman {
+ dup DSCstring cvs % start with the decimal representation
+ exch 4000 lt { % convert only if Roman numerals can represent this
+ dup length
+ [ [ () (I) (II) (III) (IV) (V) (VI) (VII) (VIII) (IX) ]
+ [ () (X) (XX) (XXX) (XL) (L) (LX) (LXX) (LXXX) (XC) ]
+ [ () (C) (CC) (CCC) (CD) (D) (DC) (DCC) (DCCC) (CM) ]
+ [ () (M) (MM) (MMM) ] ] % Roman equivalents
+ () % append the Roman equivalent of each decimal digit to this string
+ 2 index -1 1 {
+ 2 index 1 index 1 sub get
+ 5 index 5 index 4 -1 roll sub get
+ 48 sub get concatstrings
+ } for
+ 4 1 roll pop pop pop
+ } if
+ } def
+
+ /PageToString <<
+ /D { DSCstring cvs }
+ /R { .CvRoman }
+ /r { .CvRoman .ToLower }
+ /A { .CvAlpha }
+ /a { .CvAlpha .ToLower }
+ >> def
+ /.hasPageLabels true def
+ } if
+ } if
+
+ % process each page
+ FirstPage 1 LastPage {
+ (%%Page: ) puts
+
+ .hasPageLabels {
+ dup 1 sub PageLabels exch numoget dup null ne {
+ % page labels changed at this page, reset the values
+ dup /S known { dup /S get } { null } ifelse
+ /.pageCounterType exch def
+
+ dup /P known { dup /P get } { () } ifelse
+ /.pagePrefix exch def
+
+ dup /St known { /St get } { pop 1 } ifelse
+ /.pageCounter exch def
+ } { pop } ifelse
+
+ % output the page label
+ (\() .pagePrefix
+ .pageCounterType //null ne dup {
+ PageToString .pageCounterType known and
+ } if { % format the page number
+ .pageCounter dup 0 gt { % don't try to format nonpositive numbers
+ PageToString .pageCounterType get exec
+ } {
+ DSCstring cvs
+ } ifelse
+ } { () } ifelse
+ (\)) concatstrings concatstrings concatstrings puts
+
+ /.pageCounter .pageCounter 1 add def
+ } {
+ dup DSCstring cvs puts
+ } ifelse
+ ( ) puts
+ dup DSCstring cvs puts
+ (\n) puts
+
+ dup pdfgetpage
+ dup /MediaBox pget pop
+ (%%PageMedia: y) puts
+ aload pop 3 -1 roll sub DSCstring cvs puts
+ (x) puts exch sub DSCstring cvs puts
+ (\n) puts
+ dup /CropBox pget {
+ (%%PageBoundingBox: ) puts
+ {DSCfile exch write=only ( ) puts} forall
+ (\n) puts
+ } if
+ /Rotate pget {
+ (%%PageOrientation: ) puts
+ 90 div cvi 4 mod dup 0 lt {4 add} if
+ [(Portrait) (Landscape) (UpsideDown) (Seascape)] exch get puts
+ (\n) puts
+ } if
+
+ DSCfile exch DSCstring cvs writestring
+ ( DoPDFPage\n) puts
+ } for
+ runpdfend
+% write trailer
+(%%Trailer\n) puts
+(runpdfend\n) puts
+(%%EOF\n) puts
+% close output file and exit
+DSCfile closefile
+quit
+% end of pdf2dsc.ps
diff --git a/lib/pdf2ps b/lib/pdf2ps
new file mode 100755
index 00000000..40b98723
--- /dev/null
+++ b/lib/pdf2ps
@@ -0,0 +1,37 @@
+#!/bin/sh
+# Convert PDF to PostScript.
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+OPTIONS=""
+while true
+do
+ case "$1" in
+ -?*) OPTIONS="$OPTIONS $1" ;;
+ *) break ;;
+ esac
+ shift
+done
+
+if [ $# -eq 2 ]
+then
+ outfile=$2
+elif [ $# -eq 1 ]
+then
+ outfile=`basename "$1" \.pdf`.ps
+else
+ echo "Usage: `basename \"$0\"` [-dASCII85EncodePages=false] [-dLanguageLevel=1|2|3] input.pdf [output.ps]" 1>&2
+ exit 1
+fi
+
+# Doing an initial 'save' helps keep fonts from being flushed between pages.
+# We have to include the options twice because -I only takes effect if it
+# appears before other options.
+exec "$GS_EXECUTABLE" $OPTIONS -q -dNOPAUSE -dBATCH -P- -dSAFER -sDEVICE=ps2write "-sOutputFile=$outfile" $OPTIONS -c save pop -f "$1"
diff --git a/lib/pdf2ps.bat b/lib/pdf2ps.bat
new file mode 100755
index 00000000..8bbb18cc
--- /dev/null
+++ b/lib/pdf2ps.bat
@@ -0,0 +1,23 @@
+@echo off
+@rem Convert PDF to PostScript.
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+call "%~dp0gssetgs.bat"
+echo -dNOPAUSE -dBATCH -P- -dSAFER -sDEVICE#ps2write >"%TEMP%\_.at"
+:cp
+if %3/==/ goto doit
+echo %1 >>"%TEMP%\_.at"
+shift
+goto cp
+
+:doit
+rem Watcom C deletes = signs, so use # instead.
+%GSC% -q -sOutputFile#%2 @"%TEMP%\_.at" %1
+if exist "%TEMP%\_.at" erase "%TEMP%\_.at"
+goto end
+
+:usage
+echo "Usage: pdf2ps [-dASCII85DecodePages=false] [-dLanguageLevel=n] input.pdf output.ps"
+
+:end
diff --git a/lib/pdf2ps.cmd b/lib/pdf2ps.cmd
new file mode 100755
index 00000000..ad7df593
--- /dev/null
+++ b/lib/pdf2ps.cmd
@@ -0,0 +1,40 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+/* Convert PDF to PostScript. */
+
+parse arg params
+
+gs='@gsos2'
+inext='.pdf'
+outext='.ps'
+
+if params='' then call usage
+
+options='-dNOPAUSE -dBATCH -P- -dSAFER -sDEVICE=ps2write'
+
+/* extract options from command line */
+i=1
+param=word(params,i)
+do while substr(param,1,1)='-'
+ options=options param
+ i=i+1
+ param=word(params,i)
+end
+
+infile=param
+if infile='' then call usage
+outfile=word(params,i+1)
+if outfile='' then do
+ outfile=infile''outext
+ infile=infile''inext
+end
+
+gs '-q -sOutputFile='outfile options infile
+exit
+
+usage:
+say 'Usage: pdf2ps [-dASCII85DecodePages=false] [-dLanguageLevel=n] input[.pdf output.ps]'
+exit
diff --git a/lib/pf2afm b/lib/pf2afm
new file mode 100755
index 00000000..8b39a46c
--- /dev/null
+++ b/lib/pf2afm
@@ -0,0 +1,16 @@
+#!/bin/sh
+# Make an AFM file from PFB / PFA and (optionally) PFM files. Usage:
+# pf2afm fontfilename
+# Output goes to fontfilename.afm, which must not already exist.
+# See pf2afm.ps for more details.
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+exec "$GS_EXECUTABLE" -q -dNODISPLAY -P- -dSAFER -dDELAYSAFER -- pf2afm.ps "$@"
diff --git a/lib/pf2afm.bat b/lib/pf2afm.bat
new file mode 100755
index 00000000..11d00f84
--- /dev/null
+++ b/lib/pf2afm.bat
@@ -0,0 +1,16 @@
+@echo off
+@rem Make an AFM file from PFB / PFA and (optionally) PFM files.
+
+if %1/==/ goto usage
+if not %2/==/ goto usage
+call "%~dp0gssetgs.bat"
+
+%GSC% -q -dNODISPLAY -P- -dSAFER -dDELAYSAFER -- pf2afm.ps %1
+goto end
+
+:usage
+echo "Usage: pf2afm disk_font_name"
+
+:end
+
+
diff --git a/lib/pf2afm.cmd b/lib/pf2afm.cmd
new file mode 100755
index 00000000..43e8c629
--- /dev/null
+++ b/lib/pf2afm.cmd
@@ -0,0 +1,6 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+@gsos2 -q -dNODISPLAY -P- -dSAFER -dDELAYSAFER -- pf2afm.ps %1
diff --git a/lib/pf2afm.ps b/lib/pf2afm.ps
new file mode 100644
index 00000000..57b1842f
--- /dev/null
+++ b/lib/pf2afm.ps
@@ -0,0 +1,535 @@
+%!
+% This is a PostScript program for making an AFM file from
+% PFB / PFA and (optionally) PFM files.
+%
+% Written in BOP s.c., Gda\'nsk, Poland
+% e-mail contact: B.Jackowski@GUST.ORG.PL
+% version 0.5 (18 XII 1997)
+% version 0.55 (11 III 1998) -- unlimited number of chars in a font
+% version 1.00 (27 III 1998) -- scanning PFM subdirectory added,
+% code improved; version sent to LPD
+% version 1.01 (1 II 2000) -- message changed
+
+% Usage:
+% gs [-dNODISPLAY] -- pf2afm.ps disk_font_name
+%
+% The result is written to the file disk_font_name.afm, provided such
+% a file does not exist; otherwise program quits.
+%
+% The font can be either *.pfa or *.pfb; if no extension is supplied,
+% first disk_font_name.pfb is examined, then disk_font_name.pfa.
+% Moreover, if there is a *.pfm file in the same directory or in the
+% subdirectory PFM, i.e., disk_font_name.pfm or PFM/disk_font_name.pfm,
+% kern pairs from it are extracted, as well as additional font
+% parameters, usually absent from Type 1 fonts.
+
+% Tribute:
+% The program is based on James Clark's <jjc@jclark.uucp> printafm.ps
+% (with alterations by d.love@dl.ac.uk and L. Peter Deutsch) from
+% Ghostscript 5.10 distribution.
+
+/onechar 1 string def
+/edef {exch def} def
+/WinAnsiEncoding dup /Encoding findresource def
+
+% charnumber print-charname -
+% prints the name of the encoded character
+/print-charname {
+ PFMCharSet 0 eq {
+ WinAnsiEncoding
+ } {
+ PFBencoding
+ } ifelse
+ exch get =string cvs dup
+ (.notdef) eq {
+ /was.notdef true def
+ } if
+ print.to.ofi ( ) print.to.ofi
+} def
+
+/printquit {print flush quit} def
+
+% redirecting GS output to ``ofi'' file
+/eolch (\r\n) def
+/=only.to.ofi {ofi exch write=only} def % replaces GS's `=only'
+/print.to.ofi {ofi exch writestring} def % replaces `print'
+/=to.ofi { =only.to.ofi eolch print.to.ofi } def % replaces `='
+
+% read and skip: byte, short, word, double and long
+/readb-p {currPFMfile read not {(Unexpected EOF\n) printquit} if} def
+/readw-p {readb-p readb-p 256 mul add} def
+/reads-p {readw-p dup 32768 ge {65536 sub} if} def
+/readd-p {readb-p readb-p readb-p readb-p 256 mul add 256 mul add 256 mul add} def
+/readl-p /readd-p load def % double word is, in fact, long integer in GS
+/skipb-p {readb-p pop} def
+/skipw-p {skipb-p skipb-p} def
+/skips-p /skipw-p load def
+/skipd-p {skipb-p skipb-p skipb-p skipb-p} def
+/skipl-p /skipd-p load def
+/skipa-p { {skipb-p} repeat} def
+
+% PFMfile readPFMheader -
+% defines currPFMfile, PFMExtMetricOffset, PFMPairKernTableOffset
+
+/readPFMheader {
+ currPFMfile bytesavailable
+ % ---------------
+ % PFM MAIN HEADER
+ % ---------------
+ skipw-p % PFM: version
+ readd-p % PFM: size (size is dword, not word as the documentation says)
+ ne {(Wrong file size\n) printquit} if
+ 60 skipa-p % PFM: copyright
+ skipw-p % PFM: Type
+ skipw-p % PFM: Points
+ skipw-p % PFM: VertRes
+ skipw-p % PFM: HorizRes
+ skipw-p % PFM: Ascent
+ skipw-p % PFM: InternalLeading
+ skipw-p % PFM: ExternalLeading
+ skipb-p % PFM: Italic
+ skipb-p % PFM: Underline
+ skipb-p % PFM: Stikeout
+ skipw-p % PFM: Weight
+ readb-p % PFM: CharSet
+ /PFMCharSet edef
+ skipw-p % PFM: PixWidth
+ skipw-p % PFM: PixHeight
+ skipb-p % PFM: PitchAndFamily
+ skipw-p % PFM: AvgWidth
+ skipw-p % PFM: MaxWidth
+ skipb-p % PFM: FirstChar
+ skipb-p % PFM: LastChar
+ skipb-p % PFM: DefaultChar
+ skipb-p % PFM: BreakChar
+ skipw-p % PFM: WidthBytes
+ skipd-p % PFM: Device
+ skipd-p % PFM: Face
+ skipd-p % PFM: BitsPointer
+ skipd-p % PFM: BitsOffset
+ % here we assume that it is a PostScript font, i.e., it always uses
+ % the extended width table, therefore the normal width table is empty
+ % -------------
+ % PFM EXTENSION
+ % -------------
+ skipw-p % PFMEX: SizeFields
+ readd-p % PFMEX: ExtMetricOffset
+ /PFMExtMetricOffset edef
+ skipd-p % PFMEX: ExtentTable
+ skipd-p % PFMEX: OriginTable
+ readd-p % PFMEX: PairKernTable
+ /PFMPairKernTableOffset edef
+ skipd-p % PFMEX: TrackKernTable
+ skipd-p % PFMEX: DriverInfo
+ skipd-p % PFMEX: Reserved
+} def
+
+% requires that currPFMfile, PFMExtMetricOffset are defined
+% readPFMExtMetric -
+% defines PFMNumberofKernPairs
+
+/readPFMExtMetric {
+ currPFMfile PFMExtMetricOffset setfileposition
+ skips-p % EXTT: Size
+ skips-p % EXTT: PointSize
+ skips-p % EXTT: Orientation
+ skips-p % EXTT: MasterHeight
+ skips-p % EXTT: MinScale
+ skips-p % EXTT: MaxScale
+ skips-p % EXTT: MasterUnit
+ reads-p % EXTT: CapHeight
+ /PFMCapHeight edef
+ reads-p % EXTT: XHeight
+ /PFMXHeight edef
+ reads-p % EXTT: LowerCaseAscent
+ /PFMLowerCaseAscent edef
+ reads-p % EXTT: LowerCaseDescent
+ neg /PFMLowerCaseDescent edef
+ skips-p % EXTT: Slant
+ skips-p % EXTT: SuperScript
+ skips-p % EXTT: SubScript
+ skips-p % EXTT: SuperScriptSize
+ skips-p % EXTT: SubScriptSize
+ skips-p % EXTT: UnderlineOffset
+ skips-p % EXTT: UnderlineWidth
+ skips-p % EXTT: DoubleUpperUnderlineOffset
+ skips-p % EXTT: DoubleLowerUnderlineOffset
+ skips-p % EXTT: DoubleUpperUnderlineWidth
+ skips-p % EXTT: DoubleLowerUnderlineWidth
+ skips-p % EXTT: StrikeOutOffset
+ skips-p % EXTT: StrikeOutWidth
+ readw-p % EXTT: KernPairs
+ /PFMNumberofKernPairs edef
+ skipw-p % EXTT: KernTracks
+} def
+
+% requires that currPFMfile, PFMPairKernTableOffset, PFMNumberofKernPairs are defined
+% readPFMExtMetric -
+% prints kern pairs table in the AFM format
+
+/readPFMKernPairs {
+ currPFMfile () ne {
+ PFMdict begin
+ PFMPairKernTableOffset 0 ne {
+ currPFMfile PFMPairKernTableOffset setfileposition
+ readw-p % undocumented kern count (although all remaining structures are
+ % explicitly preceded by their sizes); if it were a stable
+ % feature, EXTTEXTMETRICS could be skipped
+ PFMNumberofKernPairs
+% 2 copy = =
+ ne {
+ (Inconsistent number of kern pairs\n) printquit
+ } if
+ (StartKernData) =to.ofi
+ (StartKernPairs ) print.to.ofi
+ PFMNumberofKernPairs =to.ofi
+ % ---------
+ % MAIN LOOP
+ % ---------
+ /was.notdef false def
+ PFMNumberofKernPairs {
+ (KPX ) print.to.ofi
+ readb-p % first char
+ print-charname
+ readb-p % second char
+ print-charname
+ reads-p % kern amount
+ =to.ofi
+ } repeat
+ was.notdef {
+ (.notdef character ocurred among kern pairs) =
+ (you'd better check the resulting AFM file.) =
+ } if
+ (EndKernPairs) =to.ofi
+ (EndKernData) =to.ofi
+ } if
+ end
+ } if
+} def
+
+% alias (for ``compatibility'' with J. Clark):
+/printkernpairs /readPFMKernPairs load def
+
+% printcharmetrics -
+
+/printcharmetrics {
+ (StartCharMetrics ) print.to.ofi
+ /PFBencoding currfont /Encoding get dup length array copy def
+ /PFBcharstrings currfont /CharStrings get def
+ PFBcharstrings length
+ PFBcharstrings /.notdef known { 1 sub } if =to.ofi
+ currfont 1000 scalefont setfont
+ % checking Encoding array and CharStrings dictionary for
+ % the consistency of names
+ /was.inconsitent false def
+ 0 1 255 {
+ dup PFBencoding exch get
+ PFBcharstrings exch known {
+ pop
+ }{
+% dup PFBencoding exch get =
+ PFBencoding exch /.notdef put % fix Encoding array
+ /was.inconsitent true def
+ } ifelse
+ } for
+ was.inconsitent {
+ (Encoding array contains name(s) absent from CharStrings dictionary) =
+ } if
+ % print metric data for each character in PFB encoding vector
+ 0 1 255 {
+ dup PFBencoding exch get
+ dup /.notdef ne {
+ exch dup printmetric
+ }{
+ pop pop
+ } ifelse
+ } for
+ % xPFBencoding contains an entry for each name in the original
+ % encoding vector
+ /xPFBencoding PFBcharstrings length dict def
+ PFBencoding {
+ xPFBencoding exch true put
+ } forall
+
+ /fontiter 0 def
+ /TMPFontTemplate (TMP_FONT#000) def
+ {
+ % NewPFBencoding is the new encoding vector
+ /NewPFBencoding 256 array def
+ 0 1 255 {
+ NewPFBencoding exch /.notdef put
+ } for
+ % fill up NewPFBencoding with names from CharStrings dictionary that
+ % are not encoded so far
+ /i 0 def
+ PFBcharstrings {
+ pop
+ i 255 le {
+ dup xPFBencoding exch known not {
+ dup xPFBencoding exch true put
+ NewPFBencoding i 3 -1 roll put
+ /i i 1 add def
+ }{
+ pop
+ } ifelse
+ }{
+ pop exit
+ } ifelse
+ } forall
+ i 0 eq {exit} if
+ % define a new font with NewPFBencoding as its encoding vector
+ currfont maxlength dict /NewTMPfont edef
+ currfont {
+ exch dup dup /FID ne exch /Encoding ne and {
+ exch NewTMPfont 3 1 roll put
+ }{
+ pop pop
+ } ifelse
+ } forall
+ % compute a unique name for a font to be registered
+ /fontiter fontiter 1 add def
+ TMPFontTemplate fontiter (000) cvs
+ dup length TMPFontTemplate length exch sub exch putinterval
+ /TMPFontName TMPFontTemplate cvn def
+ NewTMPfont /FontName TMPFontName put
+ NewTMPfont /Encoding NewPFBencoding put
+ % make this new font the current font
+ TMPFontName NewTMPfont definefont 1000 scalefont setfont
+ % print metric data for each character in the newly created encoding vector
+ 0 1 255 {
+ dup NewPFBencoding exch get
+ dup /.notdef ne {
+ exch -1 printmetric
+ }{
+ pop pop exit
+ } ifelse
+ } for
+ i 255 lt {exit} if
+ } loop
+ (EndCharMetrics) =to.ofi
+} def
+
+% name actual_code normal_code printmetric -
+
+/printmetric {
+ (C ) print.to.ofi =only.to.ofi
+ ( ; WX ) print.to.ofi
+ onechar 0 3 -1 roll put
+ onechar stringwidth pop round cvi =only.to.ofi
+ ( ; N ) print.to.ofi =only.to.ofi
+ ( ; B ) print.to.ofi
+ newpath 0 0 moveto
+ onechar false charpath flattenpath pathbbox
+ newpath
+ round cvi /ury edef round cvi /urx edef
+ round cvi /lly edef round cvi /llx edef
+ ury lly eq {/ury 0 def /lly 0 def} if % normalize degenrated BB
+ urx llx eq {/urx 0 def /llx 0 def} if %
+ llx =only.to.ofi ( ) print.to.ofi lly =only.to.ofi ( ) print.to.ofi
+ urx =only.to.ofi ( ) print.to.ofi ury =only.to.ofi ( ) print.to.ofi
+ (;) =to.ofi
+} def
+
+/printinfoitem {
+ 3 1 roll 2 copy known {
+ get dup type /stringtype ne { =string cvs } if exch
+ print.to.ofi ( ) print.to.ofi =to.ofi
+ }{
+ pop pop pop
+ } ifelse
+} def
+
+/printfontinfo {
+ (Comment AFM Generated by Ghostscript/pf2afm) =to.ofi
+ currfont /FontName (FontName) printinfoitem
+ %
+ currfont /FontInfo get
+ dup /FullName (FullName) printinfoitem
+ dup /FamilyName (FamilyName) printinfoitem
+ dup /Weight (Weight) printinfoitem
+ dup /Notice (Notice) printinfoitem
+ dup /ItalicAngle (ItalicAngle) printinfoitem
+ dup /isFixedPitch (IsFixedPitch) printinfoitem
+ dup /UnderlinePosition (UnderlinePosition) printinfoitem
+ dup /UnderlineThickness (UnderlineThickness) printinfoitem
+ /version (Version) printinfoitem
+ %
+ (EncodingScheme FontSpecific) =to.ofi
+ %
+ (FontBBox) print.to.ofi
+ currfont /FontBBox get {
+ ( ) print.to.ofi round cvi =only.to.ofi
+ } forall
+ eolch print.to.ofi
+ %
+ currPFMfile () ne {
+ PFMdict
+ dup /PFMCapHeight (CapHeight) printinfoitem
+ dup /PFMXHeight (XHeight) printinfoitem
+ dup /PFMLowerCaseDescent (Descender) printinfoitem
+ /PFMLowerCaseAscent (Ascender) printinfoitem
+ } if
+} def
+
+/readPFBfile {
+ % make a shot of the actual font directory:
+ /oldFontDirectory FontDirectory dup length dict copy def
+ isPFB {% defined in `makeafm'
+ (r) file true /PFBDecode filter cvx % true is better (see gs_type1.ps)
+ mark exch exec
+ }{
+ (r) file mark exch run
+ } ifelse
+ cleartomark
+ % make a shot of the updated font directory:
+ /newFontDirectory FontDirectory dup length dict copy def
+ % spot the added font:
+ oldFontDirectory {pop newFontDirectory exch undef} forall
+ newFontDirectory length 1 ne {
+ newFontDirectory length =
+ (Weird PFB file?\n) printquit
+ } if
+ newFontDirectory {pop} forall
+ findfont /currfont edef
+} def
+
+/readPFMfile {
+ dup () ne {
+ (r) file /currPFMfile edef
+ 10 dict dup /PFMdict edef begin
+ readPFMheader
+ readPFMExtMetric
+ end
+ }{
+ pop /currPFMfile () def
+ } ifelse
+} def
+
+% pfmfilename pf[ba]filename filetype printafm -
+% where filetype=(a) or (b)
+
+/printafm {
+ readPFBfile
+ readPFMfile
+ (StartFontMetrics 2.0) =to.ofi
+ printfontinfo
+ printcharmetrics
+ printkernpairs
+ (EndFontMetrics) =to.ofi
+} def
+
+/pfa_pfb_dict <<
+ /.pfb /pfbn
+ /.pfB /pfbn
+ /.pFb /pfbn
+ /.pFB /pfbn
+ /.Pfb /pfbn
+ /.PfB /pfbn
+ /.PFb /pfbn
+ /.PFB /pfbn
+
+ /.pfa /pfan
+ /.pfA /pfan
+ /.pFa /pfan
+ /.pFA /pfan
+ /.Pfa /pfan
+ /.PfA /pfan
+ /.PFa /pfan
+ /.PFA /pfan
+>> readonly def
+
+% Check whether the file name has pfa or pfb extension.
+/pfa_or_pfb? { % s -> false | /name true
+ dup length 4 lt {
+ pop //false
+ } {
+ dup length 4 sub 4 getinterval //pfa_pfb_dict exch .knownget
+ } ifelse
+} bind def
+
+% pf[ba]filename makeafm -
+/makeafm {
+ count 0 eq {(Missing font file name\n) printquit} if
+ /ifn edef
+ ifn length 0 eq {(Empty font file name\n) printquit} if
+% the following piece of the code does, in fact, the job of a system shell,
+% i.e., it analyses the supplied names, appends extensions if needed,
+% and check files:
+ /pfbn () def /pfan () def /pfmn () def % initialisation
+ [ t1_glyph_equivalence { pop } forall ] { % disable glyph substitution
+ t1_glyph_equivalence exch undef
+ } forall
+ ifn pfa_or_pfb? {
+ ifn dup length string copy def
+ ifn dup length 4 sub 0 exch getinterval /ifn edef
+ } if
+ pfbn () eq pfan () eq and dup {% no extension was supplied, try ".pfb"
+ /pfbn ifn (.pfb) concatstrings def
+ } if
+ pfbn () ne {% check whether "filename.pfb" exists
+ pfbn status {pop pop pop pop /isPFB true def}{/pfbn () def} ifelse
+ } if
+ pfbn () eq and {% checking "filename.pfb" unsuccessful, try ".pfa"
+ /pfan ifn (.pfa) concatstrings def
+ } if
+ pfan () ne {% check whether "filename.pfa" exists
+ pfan status {pop pop pop pop /isPFB false def}{/pfan () def} ifelse
+ } if
+
+ pfbn () eq pfan () eq and {
+ (Neither pfa nor pfb found\n) printquit
+ } if
+
+ /ofn ifn (.afm) concatstrings def
+ ofn status {
+ pop pop pop pop (Resulting file exists\n) printquit
+ } if
+ /ofi ofn (w) file def
+
+ /pfmn ifn (.pfm) concatstrings def
+ pfmn status {
+ pop pop pop pop
+ }{
+ () pfmn {
+ (/) search dup not { pop (\\) search } if {
+ 4 -1 roll exch concatstrings exch concatstrings exch
+ }{
+ exit
+ } ifelse
+ } loop
+ (pfm/) exch concatstrings concatstrings
+ dup status {
+ pop pop pop pop /pfmn edef
+ }{
+ pop /pfmn () def (pfm file not found -- ignored\n) print
+ } ifelse
+ } ifelse
+ //systemdict /.setsafe known {
+ <<
+ /PermitFileReading
+ [ pfmn dup length 0 eq { pop } if
+ isPFB {pfbn}{pfan} ifelse
+ ]
+ /PermitFileWriting [ ]
+ /PermitFileControl [ ]
+ >> setuserparams
+ .locksafe
+ } if
+
+ pfmn
+ isPFB {pfbn}{pfan} ifelse
+ printafm
+
+} def
+
+% Check for command line arguments.
+[ .shellarguments
+ { ] dup length 1 eq {
+ 0 get makeafm
+ }{
+ (This is PF2AFM -- AFM generator \(ver. 1.00\)\n) print
+ (Usage: gs [-dNODISPLAY] -- pf2afm.ps disk_font_name\n) printquit
+ } ifelse
+ }
+ {pop}
+ifelse
diff --git a/lib/pfbtopfa b/lib/pfbtopfa
new file mode 100755
index 00000000..4640b8a7
--- /dev/null
+++ b/lib/pfbtopfa
@@ -0,0 +1,24 @@
+#!/bin/sh
+# Convert .pfb fonts to .pfa format
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+if [ $# -eq 2 ]
+then
+ outfile=$2
+elif [ $# -eq 1 ]
+then
+ outfile=`basename "$1" \.pfb`.pfa
+else
+ echo "Usage: `basename \"$0\"` input.pfb [output.pfa]" 1>&2
+ exit 1
+fi
+
+exec "$GS_EXECUTABLE" -q -P- -dNODISPLAY -- pfbtopfa.ps "$1" "$outfile"
diff --git a/lib/pfbtopfa.bat b/lib/pfbtopfa.bat
new file mode 100755
index 00000000..cb97ec45
--- /dev/null
+++ b/lib/pfbtopfa.bat
@@ -0,0 +1,15 @@
+@echo off
+@rem Convert .pfb fonts to .pfa format
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+if not %3/==/ goto usage
+call "%~dp0gssetgs.bat"
+
+%GSC% -P- -q -dNODISPLAY -- pfbtopfa.ps %1 %2
+goto end
+
+:usage
+echo "Usage: pfbtopfa input.pfb output.pfa"
+
+:end
diff --git a/lib/pfbtopfa.ps b/lib/pfbtopfa.ps
new file mode 100644
index 00000000..0e6301c2
--- /dev/null
+++ b/lib/pfbtopfa.ps
@@ -0,0 +1,33 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% pfbtopfa.ps
+% Convert a .pfb font to .pfa format.
+
+[ .shellarguments {
+ counttomark 2 eq {
+ /pfa exch def /pfb exch def pop
+ /in1 pfb (r) file def
+ /in in1 true /PFBDecode filter def
+ /out pfa (w) file def
+ { in read not { exit } if out exch write } loop
+ out closefile in closefile in1 closefile
+ quit
+ } {
+ cleartomark (Usage: pfbtopfa input.pfb output.pfa) = flush
+ } ifelse
+} {
+ pop
+} ifelse
diff --git a/lib/ppath.ps b/lib/ppath.ps
new file mode 100644
index 00000000..f37a9c5d
--- /dev/null
+++ b/lib/ppath.ps
@@ -0,0 +1,53 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Redefine pathforall for tracing.
+% Can't be used recursively.
+
+/# {( )print} def
+
+/-mat matrix def
+/-imat matrix def
+/-smat { //-mat currentmatrix pop //-imat setmatrix } bind def
+/-rmat { //-mat setmatrix } bind def
+/-pathforall /pathforall load def
+/-p2 { ( ) print exch =only ( ) print =only } bind def
+/-dp2 { 2 copy -p2 2 { exch 4096 mul dup cvi dup ( ) print =only sub dup 0 eq { pop } { (+) print =only } ifelse } repeat } bind def
+/-tp2 { //-mat itransform -p2 } bind def
+/-dict 5 dict def
+
+/pathforall
+ { -dict begin
+ /-close exch def /-curve exch def /-line exch def /-move exch def
+ end -smat -mat ==only ( setmatrix) =
+ {2 copy -tp2 ( moveto\t%)print
+ 2 copy -dp2 (\n)print
+ flush -dict /-move get -rmat exec -smat}
+ {2 copy -tp2 ( lineto\t%)print
+ 2 copy -dp2 (\n)print
+ flush -dict /-line get -rmat exec -smat}
+ {5 index 5 index -tp2 3 index 3 index -tp2 2 copy -tp2 ( curveto\t%)print
+ 5 index 5 index -dp2 3 index 3 index -dp2 2 copy -dp2 (\n)print
+ flush -dict /-curve get -rmat exec -smat}
+ {(closepath\n)print flush -dict /-close get -rmat exec -smat}
+ -pathforall -rmat
+ }
+def
+
+% Just print the current path
+
+/printpath {
+ {pop pop} {pop pop} {pop pop pop pop pop pop} {} pathforall
+} def
diff --git a/lib/pphs b/lib/pphs
new file mode 100755
index 00000000..b8997017
--- /dev/null
+++ b/lib/pphs
@@ -0,0 +1,15 @@
+#!/bin/sh
+# Print the Primary Hint Stream from a linearized PDF file. Usage:
+# pphs filename.pdf
+# Output goes to stdout.
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+exec "$GS_EXECUTABLE" -q -P- -dSAFER -dNODISPLAY -- pphs.ps "$@"
diff --git a/lib/pphs.ps b/lib/pphs.ps
new file mode 100644
index 00000000..84fd99f4
--- /dev/null
+++ b/lib/pphs.ps
@@ -0,0 +1,220 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Print Linearized PDF hint streams
+
+% Utilities
+/read1 { % <file> read1 <value>
+ read not {
+ (**** Unexpected EOF) = flush quit
+ } if
+} bind def
+/read2 { % <file> read2 <value>
+ dup read1 8 bitshift exch read1 add
+} bind def
+/read4 { % <file> read4 <value>
+ dup read2 16 bitshift exch read2 add
+} bind def
+% Free variables: Bits, Bitsleft
+/readninit { % - <readninit> -
+ /Bits 0 def
+ /Bitsleft 0 def
+} bind def
+
+/pdftoken { % <file> pdftoken <token>
+ dup token pop
+ dup type /nametype eq 1 index xcheck and {
+ dup dup (<<) cvn eq exch ([) eq or {
+ exec exch {
+ dup pdftoken dup dup (>>) cvn eq exch (]) eq or {
+ exch pop exec exit
+ } if exch
+ } loop
+ } {
+ exch pop
+ } ifelse
+ } {
+ exch pop
+ } ifelse
+} bind def
+/makemask { % <nbits> makemask <mask>
+ 1 exch bitshift 1 sub
+} bind def
+/readn { % <file> <nbits> readn <value>
+ dup Bitsleft le {
+ exch pop
+ /Bitsleft Bitsleft 2 index sub def
+ makemask Bits Bitsleft neg bitshift and
+ } {
+ Bitsleft makemask Bits and
+ exch Bitsleft sub exch 1 index bitshift 3 1 roll
+ /Bits 2 index read1 def /Bitsleft 8 def
+ readn add
+ } ifelse
+} bind def
+/sread { % <string> sread <file>
+ 0 () /SubFileDecode filter
+} bind def
+
+/ptag { % <pre-tag> <proc> <post-tag> ptag -
+ 3 -1 roll print (: ) print
+ exch exec
+ ( % ) print =
+} bind def
+
+% Print the linearization parameters dictionary.
+/plpkeys <<
+ /E (end of p. 1 objects)
+ /L (total file length)
+ /H (PHS start + length)
+ /N (# of pages)
+ /O (p. 1 object #)
+ /T (offset of first main xref entry)
+>> def
+/plpdict { % <dict> plpdict -
+ (<<) = plpkeys {
+ 2 index 2 index .knownget {
+ % Stack: dict key label value
+ ( ) print 3 -1 roll ===only ( ) print ===only
+ ( % ) print =
+ } {
+ pop pop
+ } ifelse
+ } forall {
+ plpkeys 2 index known {
+ pop pop
+ } {
+ ( ) print exch ===only ( ) print ===
+ } ifelse
+ } forall (>>) =
+} bind def
+
+% Print the Page Offset Hint Table.
+/ppoht { % <npages> <file> ppoht -
+
+ 20 dict begin
+ /f exch def
+ /npages exch def
+ readninit
+
+ (1) { f read4 =only } (least # objs/page) ptag
+ (2) { f read4 =only } (offset of p. 1 object (+PHS length if beyond PHS)) ptag
+ (3) { f read2 dup =only /nb3 exch def } (# bits for # objs/page delta) ptag
+ (4) { f read4 =only } (least # bytes/page) ptag
+ (5) { f read2 dup =only /nb5 exch def } (# bits for # bytes/page delta) ptag
+ (6) { f read4 =only } (least content stream offset-in-page) ptag
+ (7) { f read2 dup =only /nb7 exch def } (# bits for content stream offset delta) ptag
+ (8) { f read4 =only } (least content stream length) ptag
+ (9) { f read2 dup =only /nb9 exch def } (# bits for content stream length delta) ptag
+ (10) { f read2 dup =only /nb10 exch def } (# bits for # of shared obj refs) ptag
+ (11) { f read2 dup =only /nb11 exch def } (# bits for shared obj indices) ptag
+ (12) { f read2 dup =only /nb12 exch def } (# bits for shared obj ref pos numerators) ptag
+ (13) { f read2 =only } (shared obj ref pos denominator) ptag
+
+ (*1) { [ npages { f nb3 readn } repeat ] ==only } (# objs/page deltas (see 1,3)) ptag
+ (*2) { [ npages { f nb5 readn } repeat ] ==only } (# bytes/page deltas (see 4,5)) ptag
+ (*3) { [ npages { f nb10 readn } repeat ] dup ==only /nso exch def } (# of shared obj refs (see 10)) ptag
+ (*4) { [ nso { [ exch { f nb11 readn } repeat ] } forall ] ==only } (shared obj indices (see 11)) ptag
+ (*5) { [ nso { [ exch { f nb12 readn } repeat ] } forall ] ==only } (shared obj ref pos numerators (see 12)) ptag
+ (*6) { [ npages { f nb7 readn } repeat ] ==only } (content stream offset-in-page deltas (see 6,7)) ptag
+ (*7) { [ npages { f nb9 readn } repeat ] ==only } (content stream length deltas (see 8,9)) ptag
+
+ end % temp dict
+
+} bind def
+
+% Print the Shared Objects Hint Table.
+/psoht { % <file> psoht -
+
+ 20 dict begin
+ /f exch def
+ readninit
+
+ (1) { f read4 =only } (first shared obj #) ptag
+ (2) { f read4 =only } (first shared obj offset (+PHS length if beyond PHS)) ptag
+ (3) { f read4 dup =only /n3 exch def } (# of p. 1 shared objs) ptag
+ (4) { f read4 dup =only /n4 exch def } (total # of shared objs) ptag
+ (5) { f read2 dup =only /nb5 exch def } (# bits for # of shared objs/group) ptag
+ (6) { f read4 =only } (least shared obj group length) ptag
+ (7) { f read2 dup =only /nb7 exch def } (# bits for shared obj group length delta) ptag
+
+ /nse n4 def
+ (*1) { [ nse { f nb7 readn } repeat ] ==only } (shared obj group length deltas (see 6,7)) ptag
+ (*2) { [ nse { f 1 readn } repeat ] dup ==only /md5s exch def } (MD5 present?) ptag
+ (*3:) = md5s {
+ 0 ne {
+ ( ) print f 16 string readstring pop
+ (%stdout) (w) file dup 3 -1 roll writehexstring closefile () =
+ } if
+ } forall
+ (*4) { [ nse { f nb5 readn } repeat ] ==only } (# objs/group (see 5)) ptag
+
+ end % temp dict
+
+} bind def
+
+% Print the Primary Hint Stream of a PDF file.
+/pphs { % <file> pphs -
+ /pdf exch def
+
+ % Read the linearization parameter dictionary.
+ { pdf pdftoken /obj eq { exit } if } loop
+ pdf pdftoken /lpdict exch def
+ /lpdict type /dicttype eq { lpdict /Linearized known } { false } ifelse {
+ (Not a linearized PDF file.) = stop
+ } if
+
+ lpdict plpdict flush
+
+ % Read the primary hint stream.
+ null {
+ pdf pdftoken dup /stream eq { pop exit } if
+ exch pop
+ } loop
+ /phsdict exch def
+ % Remove Length if indirect reference.
+ phsdict 0 known {
+ phsdict 0 undef phsdict /Length undef
+ } if
+ (PHS: ) print phsdict === flush
+ pdf 0 (endstream) /SubFileDecode filter
+ dup 64000 string readstring pop exch closefile
+ sread /phsdata exch def
+
+ % Decode the hint stream data if necessary.
+ phsdict /Filter .knownget {
+ phsdata exch filter
+ dup 5000 string readstring pop exch closefile
+ sread /phsdata exch def
+ } if
+
+ % Adobe says we can assume /P = 0.
+ (Page Offset Hint Table:) =
+ lpdict /N get
+ phsdata phsdict /S get string readstring pop sread
+ ppoht
+ (Shared Objects Hint Table:) =
+ phsdata psoht
+} bind def
+
+% Check for command line arguments.
+[ .shellarguments
+ { ] dup length 1 eq
+ { 0 get (r) file dup pphs closefile }
+ { (Usage: pphs filename.pdf\n) print flush }
+ ifelse
+ }
+ { pop }
+ifelse
diff --git a/lib/prfont.ps b/lib/prfont.ps
new file mode 100644
index 00000000..a4456382
--- /dev/null
+++ b/lib/prfont.ps
@@ -0,0 +1,261 @@
+%!
+%%Creator: Eric Gisin <egisin@waterloo.csnet>
+%%Title: Print font catalog
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+% Copyright (c) 1986 Eric Gisin
+% Copyright (C) 1992 Aladdin Enterprises, Menlo Park, CA
+% Modified to print all 256 encoded characters.
+% Copyright (C) 1993 Aladdin Enterprises, Menlo Park, CA
+% Modified to print unencoded characters.
+% Copyright (C) 1994 Aladdin Enterprises, Menlo Park, CA
+% Modified to always create 256-element Encoding vectors.
+% Copyright (C) 1995 Aladdin Enterprises, Menlo Park, CA
+% Modified to print more than 128 unencoded characters.
+% Copyright (C) 1996 Aladdin Enterprises, Menlo Park, CA
+% Modified to leave a slightly wider left margin, because many H-P
+% printers can't print in the leftmost 1/4" of the page.
+% Modified to print unencoded characters in any font that has CharStrings.
+% Copyright (C) 1999 Aladdin Enterprises, Menlo Park, CA
+% Modified to sort unencoded characters.
+% Copyright (C) 2000 Aladdin Enterprises, Menlo Park, CA
+% Modified to print CIDFonts as well as fonts.
+% O(N^2) sorting replaced with O(N log N).
+% Copyright transferred 2000/09/15 to Artifex Software, Inc. Send any questions to
+% bug-gs@ghostscript.com.
+
+
+% Example usages at bottom of file
+
+/#copies 1 def
+/min { 2 copy gt { exch } if pop } bind def
+
+/T6 /Times-Roman findfont 6 scalefont def
+/Temp 64 string def
+/Inch {72 mul} def
+/Base 16 def % char code output base
+/TempEncoding [ 256 { /.notdef } repeat ] def
+
+% Sort an array. Code used by permission of the author, Aladdin Enterprises.
+/sort { % <array> <lt-proc> sort <array>
+ % Heapsort (algorithm 5.2.3H, Knuth vol. 2, p. 146),
+ % modified for 0-origin indexing. */
+ 10 dict begin
+ /LT exch def
+ /recs exch def
+ /N recs length def
+ N 1 gt {
+ /l N 2 idiv def
+ /r N 1 sub def {
+ l 0 gt {
+ /l l 1 sub def
+ /R recs l get def
+ } {
+ /R recs r get def
+ recs r recs 0 get put
+ /r r 1 sub def
+ r 0 eq { recs 0 R put exit } if
+ } ifelse
+ /j l def {
+ /i j def
+ /j j dup add 1 add def
+ j r lt {
+ recs j get recs j 1 add get LT { /j j 1 add def } if
+ } if
+ j r gt { recs i R put exit } if
+ R recs j get LT not { recs i R put exit } if
+ recs i recs j get put
+ } loop
+ } loop
+ } if recs end
+} def
+
+% do single character of page
+% output to rectangle ll=(0,-24) ur=(36,24)
+/DoGlyph { % C, N, W set
+
+ % print code name, width and char name
+ T6 setfont
+ N /.notdef ne {0 -20 moveto N Temp cvs show} if
+ 0 -12 moveto C Base Temp cvrs show ( ) show
+ W 0.0005 add Temp cvs 0 5 getinterval show
+
+ % print char with reference lines
+ N /.notdef ne {
+ 3 0 translate
+ 0 0 moveto F24 setfont N glyphshow
+ /W W 24 mul def
+ 0 -6 moveto 0 24 lineto
+ W -6 moveto W 24 lineto
+ -3 0 moveto W 3 add 0 lineto
+ 0 setlinewidth stroke
+ } if
+} def
+/DoChar {
+ /C exch def
+ /N F /Encoding get C get def
+ /S (_) dup 0 C put def
+ /W F setfont S stringwidth pop def
+ DoGlyph
+} def
+/CIDTemp 20 string def
+/DoCID {
+ /N exch def
+ /C N def
+ /W F setfont gsave
+ matrix currentmatrix nulldevice setmatrix
+ 0 0 moveto N glyphshow currentpoint pop
+ grestore def
+ DoGlyph
+} def
+
+% print page title
+/DoTitle {
+ /Times-Roman findfont 18 scalefont setfont
+ 36 10.5 Inch moveto FName Temp cvs show ( ) show ((24 point)) show
+} def
+
+% print one block of characters
+/DoBlock { % firstcode lastcode
+ /FirstCode 2 index def
+ 1 exch {
+ /I exch def
+ /Xn I FirstCode sub 16 mod def /Yn I FirstCode sub 16 idiv def
+ gsave
+ Xn 35 mul 24 add Yn -56 mul 9.5 Inch add translate
+ I DoCode
+ grestore
+ } for
+} def
+
+% print a line of character
+/DoCharLine { % firstcode lastcode
+ 1 exch { (_) dup 0 3 index put show pop } for
+} def
+/DoCIDLine { % firstcode lastcode
+ 1 exch { glyphshow } for
+} def
+
+% initialize variables
+/InitDoFont { % fontname font
+ /F exch def % font
+ /FName exch def % font name
+ /F24 F 24 scalefont def
+ /Line0 96 string def
+ /Line1 96 string def
+ /Namestring1 128 string def
+ /Namestring2 128 string def
+} def
+
+% print pages of unencoded characters
+/DoUnencoded { % glyphs
+ /Unencoded exch def
+ /Count Unencoded length def
+
+ % Print the unencoded characters in blocks of 128.
+
+ 0 128 Unencoded length 1 sub
+ { /BlockStart 1 index def
+ dup 128 add Unencoded length min 1 index sub
+ Unencoded 3 1 roll getinterval TempEncoding copy
+ /BlockEncoding exch def
+ /BlockCount BlockEncoding length def
+ save
+ F /Encoding known {
+ F length dict F
+ { 1 index /FID eq { pop pop } { 2 index 3 1 roll put } ifelse }
+ forall dup /Encoding TempEncoding put
+ /* exch definefont
+ /F exch def
+ /F24 F 24 scalefont def
+ /BlockStart 0 def
+ } if
+
+ DoTitle (, unencoded characters) show
+ BlockStart dup BlockCount 1 sub add DoBlock
+ F 10 scalefont setfont
+ 36 2.4 Inch moveto
+ 0 32 BlockCount 1 sub {
+ 0 -0.4 Inch rmoveto gsave
+ dup 31 add BlockCount 1 sub min
+ exch BlockStart add exch BlockStart add DoLine
+ grestore
+ } for
+ showpage
+ restore
+ } for
+
+} def
+
+% print font sample pages
+/DoFont {
+ dup findfont InitDoFont
+ /DoCode {DoChar} def
+ /DoLine {DoCharLine} def
+
+ % Display the first 128 encoded characters.
+
+ DoTitle (, characters 0-127) show
+ 0 127 DoBlock
+ F 10 scalefont setfont
+ 36 2.0 Inch moveto 0 31 DoLine
+ 36 1.6 Inch moveto 32 63 DoLine
+ 36 1.2 Inch moveto 64 95 DoLine
+ 36 0.8 Inch moveto 96 127 DoLine
+ showpage
+
+ % Display the second 128 encoded characters.
+
+ DoTitle (, characters 128-255) show
+ 128 255 DoBlock
+ F 10 scalefont setfont
+ 36 2.0 Inch moveto 128 159 DoLine
+ 36 1.6 Inch moveto 160 191 DoLine
+ 36 1.2 Inch moveto 192 223 DoLine
+ 36 0.8 Inch moveto 224 255 DoLine
+ showpage
+
+ F /CharStrings known
+ {
+ % Find and display the unencoded characters.
+
+ /Encoded F /Encoding get length dict def
+ F /Encoding get { true Encoded 3 1 roll put } forall
+ [ F /CharStrings get
+ { pop dup Encoded exch known { pop } if }
+ forall ] {
+ exch Namestring1 cvs exch Namestring2 cvs lt
+ } sort DoUnencoded
+
+ }
+ if
+
+} def
+
+% print CIDFont sample pages
+/DoCIDFont {
+ dup /CIDFont findresource InitDoFont
+ /DoCode {DoCID} def
+ /DoLine {DoCIDLine} def
+
+ [ 0 1 F /CIDCount get 1 sub { } for ] DoUnencoded
+} def
+
+% Do font samples
+% /Times-Roman DoFont % Test (less than a minute)
+% /Hershey-Gothic-English DoFont % Test (8 minutes)
+
+% Do a complete catalog
+% FontDirectory {pop DoFont} forall % All fonts (quite a long time)
diff --git a/lib/printafm b/lib/printafm
new file mode 100755
index 00000000..4f4ff028
--- /dev/null
+++ b/lib/printafm
@@ -0,0 +1,15 @@
+#!/bin/sh
+# Print the metrics from a font in AFM format. Usage:
+# printafm fontname
+# Output goes to stdout.
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+exec "$GS_EXECUTABLE" -q -P- -dSAFER -dNODISPLAY -- printafm.ps "$@"
diff --git a/lib/printafm.ps b/lib/printafm.ps
new file mode 100644
index 00000000..f69f2975
--- /dev/null
+++ b/lib/printafm.ps
@@ -0,0 +1,173 @@
+%!
+% written by James Clark <jjc@jclark.uucp>
+% print an afm file on the standard output
+% usage is `fontname printafm' eg `/Times-Roman printafm'
+
+% From the `dvitops' distribution, which included this notice:
+% dvitops is not copyrighted; you can do with it exactly as you please.
+% I would, however, ask that if you make improvements or modifications,
+% you ask me before distributing them to others.
+
+% Altered by d.love@dl.ac.uk to produce input for Rokicki's afm2tfm,
+% which groks the format of the Adobe AFMs.
+
+% Modified by L. Peter Deutsch 9/14/93:
+% uses Ghostscript's =only procedure to replace 'buf cvs print'.
+% Modified by L. Peter Deutsch 9/6/95:
+% uses Ghostscript's .shellarguments facility to accept the font name
+% on the command line.
+
+% Altered my master@iaas.msu.ru to work with fonts of more than 256 glyphs
+% and avoid FSType output. Also print a comment with UniqueID of the font.
+
+/onechar 1 string def
+
+% c toupper - c
+/toupper {
+ dup dup 8#141 ge exch 8#172 le and {
+ 8#40 sub
+ } if
+} bind def
+
+% print unencoded character metric data lines for glyphs in `v' array
+% and reset `v' -
+/printv {
+ % define a new font with v as its encoding vector
+ currentfont maxlength dict /f exch def
+ currentfont {
+ exch dup dup /FID ne exch /Encoding ne and {
+ exch f 3 1 roll put
+ } {
+ pop pop
+ } ifelse
+ } forall
+ f /Encoding v put
+ f /FontName /temp put
+ % make this new font the current font
+ /temp f definefont setfont
+ % print a entry for each character not in old vector
+ /e currentfont /Encoding get def
+ 0 1 255 {
+ dup e exch get
+ dup dup /.notdef ne exch s exch known not and {
+ exch -1 printmetric
+ } {
+ pop pop
+ } ifelse
+ } for
+ 0 1 255 {
+ v exch /.notdef put
+ } for
+} bind def
+
+% printcharmetrics -
+
+/printcharmetrics {
+ (StartCharMetrics ) print
+ currentfont /CharStrings get dup length exch /.notdef known { 1 sub } if =
+ currentfont 1000 scalefont setfont 0 0 moveto
+ /e currentfont /Encoding get def
+ 0 1 255 {
+ dup e exch get
+ dup /.notdef ne {
+ exch dup printmetric
+ } {
+ pop pop
+ } ifelse
+ } for
+ % s contains an entry for each name in the original encoding vector
+ /s 256 dict def
+ e {
+ s exch true put
+ } forall
+ % v is the new encoding vector
+ /v 256 array def
+ 0 1 255 {
+ v exch /.notdef put
+ } for
+ % fill up v with names in CharStrings
+ /i 0 def
+ currentfont /CharStrings get {
+ pop
+ i 255 le {
+ v i 3 -1 roll put
+ /i i 1 add def
+ } {
+ printv
+ v 0 3 -1 roll put
+ /i 1 def
+ } ifelse
+ } forall
+ printv
+ (EndCharMetrics) =
+} bind def
+
+% name actual_code normal_code printmetric -
+
+/printmetric {
+ /saved save def
+ (C ) print =only
+ ( ; WX ) print
+ onechar 0 3 -1 roll put
+ onechar stringwidth pop round cvi =only
+ ( ; N ) print =only
+ ( ; B ) print
+ onechar false charpath flattenpath mark pathbbox counttomark {
+ counttomark -1 roll
+ round cvi =only
+ ( ) print
+ } repeat pop
+ (;) =
+ saved restore
+} bind def
+
+% fontname printafm -
+
+/printafm {
+ findfont gsave setfont
+ (StartFontMetrics 2.0) =
+
+ % Print the UniqueID
+
+ currentfont /UniqueID known {
+ (Comment UniqueID ) print
+ currentfont /UniqueID get =only
+ (\n) print
+ } if
+
+ (FontName ) print currentfont /FontName get =
+
+ % Print the FontInfo
+
+ currentfont /FontInfo get {
+ exch
+ dup /FSType ne {
+ =string cvs dup dup 0 get 0 exch toupper put print
+ ( ) print =
+ } {
+ pop pop
+ } ifelse
+ } forall
+
+ % Print the FontBBox
+
+ (FontBBox) print
+ currentfont /FontBBox get {
+ ( ) print round cvi =only
+ } forall
+ (\n) print
+
+ printcharmetrics
+ (EndFontMetrics) =
+ grestore
+} bind def
+
+% Check for command line arguments.
+[ .shellarguments
+ { ] dup length 1 eq
+ { 0 get printafm }
+ { (Usage: printafm fontname\n) print flush }
+ ifelse
+ }
+ { pop }
+ifelse
diff --git a/lib/ps2ai.ps b/lib/ps2ai.ps
new file mode 100644
index 00000000..e82fc497
--- /dev/null
+++ b/lib/ps2ai.ps
@@ -0,0 +1,550 @@
+%!
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+%
+% ps2ai.ps - a postscript to editable adobe illustrator file filter
+%
+/vers {2.14} def % January 31, 1999
+
+% conditional def ( if the key is already defined before, don't
+% redefine it. This can be used by other programs to overwrite
+% some settings from externally
+%
+/cdef { 1 index where { pop pop pop } { def } ifelse } bind def
+%
+%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+%
+% needs a postscript level 2 interpreter, like gnu ghostscript, to work
+%
+% Usage: gs -q -dNODISPLAY ps2ai.ps file.ps > file.aips
+% or (see below)
+% gs -q -dNODISPLAY ps2ai.ps file.ps
+% or
+% cat ps2ai.ps file.ps | lpr (then look in log file)
+%
+% or from within gsview via:
+% Edit->Convert to vector format
+%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+% Options
+%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+% Output Options: directly to a file or standard out
+%
+/jout false cdef % true=file false=stdout (default=false)
+/joutput (ps2ai.out.aips) cdef % Name of Output file
+%
+%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+%
+% Other Options
+%
+/jtxt3 true cdef % output text in AI3 form (false=ai88)
+ % for coreldraw/photoshop readable output
+/joutln false cdef % use font outline instead of font
+/jerr false def % use error handling (ie die gracefully)
+/jbiterr false def % attempt to handle bitmap fonts (kludge)
+/jMacGS false def % true if using MacGS (not fully implemented yet)
+/jMacfix true def % convert filled boxes to lines (only usefull with
+ % laserwriter 8 postscript input)
+
+%
+%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+% No options below here
+%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+%
+% - Notes -
+% ai uses cmykcolor, so level 1 interpreters don't work
+% ai doesn't use image/imagemask - so bitmaps don't work correctly
+% the output file has a header so it is viewable/printable/reconvertable
+%
+% Comments, suggestions, bug-fixes, etc send to:
+%
+% Jason Olszewski (olszewsk@splash.princeton.edu)
+%
+% anonymous ftp: toby.princeton.edu /pub/olszewsk/ps2ai.ps
+% URL ftp://toby.princeton.edu/pub/olszewsk
+%
+% - Fix History -
+% 2.14 added cdef to allow overwriting of certain values from externally
+% 2.13 check for bitmap fonts, work better with TeX,WinPS,etc
+% 2.12 fixed initclip to US letter size page
+% 2.11 added header support for *u/*U compound paths
+% 2.1 option of font outline instead of text(gwhite@trevnx.bio.dfo.ca)
+% 2.0 major change to complex path handling
+% 1.9 fixed text leaking ascii (,),\
+% 1.85 added default font to handle no setfont (Courier)
+% 1.84 added even-odd fill/clip (D)
+% 1.83 undefined PPD PageSize printer specific info
+% 1.82 added kludge to save clipping status through a restore
+% 1.81 added custom color/gray support to header (x/X, g/G)
+% 1.8 added newpath if clippath is not consumed correctly(amiga)
+% 1.79 eliminated scientific notation of numbers less than 0.0001
+% 1.78 fixed transposed h & H
+% 1.77 made laserwriter 8 fixes optional
+% 1.76 added margin fix for unix AI (brown@wi.extrel.com)
+% 1.75 added kludge to handle bitmap font errors (TeX, Windows.ps)
+% 1.74 made grestore a little smarter
+% 1.73 included header handle encoded fontname (/_fontname)
+% 1.72 fixed problem with restore/clip info - (not enough Qs problem)
+% 1.71 filter font names to remove previous encoding (|,_,etc)
+% 1.7 change text format to AI3, works better with PS & CD
+% 1.67 deal with weird makefonts
+% 1.66 handle to many bad stroke/fills (s s s w/o paths)
+% 1.65 more useable with non-gs interpreters (defaultmatrix fix)
+% 1.64 fixed "smart grestore" repeat bug
+% 1.63 fixed ashow/awidthshow bug
+% 1.62 check if cmykcolor is understood otherwise rgb
+% 1.61 made grestore smarter (only print if different)
+% 1.6 add better compatibility to CorelDraw and PhotoShop
+% 1.53 make it more gs-backward compatible (clarke@lsl.co.uk)
+% 1.52 handle clipping paths a little better (Posted)
+% 1.51 improve mac lw8 output (lines instead of filled boxes)
+% 1.5 handle some level 2 stuff (mac lw8)
+% 1.4 fixed scaling of linewidth and dash
+% 1.31 made trailer more AI88 friendly
+% 1.3 add ablity to output to file directly
+% 1.21 print matrix cleaner
+% 1.2 fix rotated fonts, thanks to G.Cameron (g.cameron@biomed.abdn.ac.uk)
+% 1.1 fix stroke/fill color difference (k vs K)
+% 1.0 posted to comp.lang.postscript
+%
+% - To Do List -
+% find real %%BoundingBox: llx lly urx ury
+% make MacGS friendly (line-endings)
+% handle eps w/o showpage:(append to end)
+% write out image data to external file
+%
+%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+% Nothing of Interest below here
+%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+matrix identmatrix setmatrix % make ctm [1 0 0 1 0 0]
+/bdef {bind def} bind def
+/oldgsave {} def /oldgrestore {} def
+/initgraphics {} def /initmatrix {} def
+% undefine PPD PageSizes to be more printer independant
+/letter {} def /legal {} def /a4 {} def /b5 {} def /lettersmall {} def
+/setpagedevice { pop } bdef % for level 2 PPD PageSizes
+/Courier findfont 12 scalefont setfont % handle no setfont
+/initclip {0 0 moveto 0 792 lineto 612 792 lineto 612 0 lineto closepath
+ clip newpath } bdef
+/xdef {exch def} bdef
+/trx {transform exch} bdef
+/cbdef {cvx bind def} bdef
+/jltz {dup abs 0.0001 lt {pop 0} if} bdef % get rid of scientific notation bug
+/clstate false def % closepath state
+/dpth false def % destroy path (ie newpath)
+/fclp false def % first paint after clip
+/kscl {1.0} def % default current scale X-factor
+/gcnt {1} def % graphics state counter
+/spth {1} def % multiple paths on stack
+/jeol (\n) def % default end-of-line
+/jnump {0} def % number of paths on stack
+/jx {0} def /jy {0} def /j_ax {0} def
+/j3ftxt true def
+/clarry 10 array def
+0 1 9 {clarry exch false put} for % initilize no clipping path
+%
+% handle cmyk color on level 1 interpreters
+/setcmykcolor where {pop}
+ {/setcmykcolor {
+ /blk exch def /yel exch def /mag exch def /cyan exch def
+ /ccomp {add dup 1 gt {pop 1} if} def
+ /red {1 cyan blk ccomp sub} def
+ /green {1 mag blk ccomp sub} def
+ /blue {1 yel blk ccomp sub} def
+ red green blue setrgbcolor
+ } bdef
+} ifelse
+/currentcmykcolor where {pop}
+ {/currentcmykcolor {
+ currentrgbcolor /bval xdef /gval xdef /rval xdef
+ /rawC 1 rval sub def /rawM 1 gval sub def /rawY 1 bval sub def
+ rawC rawM ge { rawY rawM ge { /blk rawM def} if } if
+ rawC rawY ge { rawM rawY ge { /blk rawY def} if } if
+ rawY rawC ge { rawM rawC ge { /blk rawC def} if } if
+ rawY rawC eq { rawM rawC eq { /blk rawC def} if } if
+ /cyan rawC blk sub def
+ /mag rawM blk sub def
+ /yel rawY blk sub def
+ /blk blk def
+ cyan mag yel blk
+ } bdef
+} ifelse
+% If using Mac Ghostscript
+jMacGS {
+% /jeol {(\r) jp} def
+ /jout true def
+ (%%Note: Loading ps2ai.ps\n) print
+ } if
+/jstr 40 string def
+jout {joutput (w) file /joutput xdef} if
+%
+% Output
+%
+jout {/jp { joutput exch writestring } bdef }{/jp {print} bdef} ifelse
+/jpnum {jltz ( ) jp =string cvs jp } bdef
+/jpmat { (\[) jp { jpnum } forall (\]) jp } bdef
+%
+% Stack to Paths converters
+%
+/ckpnt { % check which paint and clipping to use
+ dpth { % if there are multiple paths on the stack
+ clarry gcnt get fclp and {clstate {(h W\n) jp }{(H W\n) jp } ifelse} if
+ spth 0 eq {clstate {(n\n) jp }{(N\n) jp } ifelse} if
+ spth 1 eq {clstate {(s\n) jp }{(S\n) jp } ifelse} if
+ spth 2 eq {clstate {(f\n) jp }{(F\n) jp } ifelse} if
+ } if
+} bdef
+/jpm {
+ ckpnt
+ /dpth true def
+ transform 2 copy /yst xdef /xst xdef exch jpnum jpnum ( m\n) jp } bdef
+/jpl { trx jpnum jpnum ( l\n) jp } bdef
+/jpc { 6 4 roll trx jpnum jpnum 4 2 roll trx jpnum jpnum trx
+ jpnum jpnum ( c\n) jp } bdef
+/jpp {xst jpnum yst jpnum ( l\n) jp /clstate true def} bdef
+/cntpaths { % count paths on stack
+ oldgsave
+ {pop pop /jnump jnump 1 add def} {pop pop} {6 {pop} repeat}{} pathforall
+ oldgrestore
+} bdef
+/ppforall {
+ cntpaths % find out how many paths are on the stack
+ jnump 1 gt { (*u\n) jp } if
+ {jpm}{jpl}{jpc}{jpp} pathforall
+ ckpnt
+ jnump 1 gt { (*U\n) jp } if
+ /jnump 0 def /clstate false def /dpth false def /fclp false def
+ oldnewpath
+} bdef
+%
+% Painting Operators
+%
+/oldnewpath [/newpath load] cbdef
+/newpath { (\n) jp /spth 0 def ppforall} bdef
+/stroke { (\n) jp /spth 1 def ppforall } bdef
+/fill {(\n) jp /spth 2 def ppforall } bdef
+/eofill {(1 D\n) jp fill (0 D\n) jp} bdef
+/clip {clarry gcnt get {(Q\nq\n) jp}{(q\n) jp} ifelse
+ /fclp true def clarry gcnt true put} bdef
+/eoclip {(1 D\n) jp clip (0 D\n) jp} bdef
+%
+% Text Operators
+%
+/oldshow [/show load] cbdef
+/curpt {stringwidth pop jx add jy} bdef
+/jNN {dup 0 eq {pop oldgsave currentfont /FontMatrix get setmatrix kscl
+ oldgrestore} if
+} bdef
+/curftmatrix {
+ currentfont /FontMatrix get dup 0 get jNN abs /norm exch def
+ dup 0 get norm div exch dup
+ 1 get norm div exch dup 2 get norm div exch dup 3 get norm div exch dup
+ 4 get exch 5 get 6 array astore matrix currentmatrix matrix concatmatrix
+} bdef
+% AI does not support negitive font sizes
+/curftsize {currentfont /FontMatrix get 0 get jNN abs 1000 mul} bdef
+/hstr (X) def
+/vbar (|) 0 get def /undsc (_) 0 get def
+/ftnamefix { % handle font names with |,_ (previously encoded)
+jstr cvs
+{ %forall
+ dup vbar eq {pop}{ %ifelse
+ dup undsc eq {pop}{ %ifelse
+ hstr exch 0 exch put hstr jp
+ } ifelse
+ } ifelse
+ } forall flush
+} bdef
+%/curftname {currentfont /FontName get ftnamefix} bdef
+/curftname { currentfont /FontName known {currentfont /FontName get}
+ { (Times-Roman)} ifelse ftnamefix } bdef
+/lftpar (\() 0 get def
+/rhtpar (\)) 0 get def
+/bckslsh (\\) 0 get def
+/handft { % handle strings with (,),\
+ (\() jp
+ { %forall
+ dup lftpar eq { (\\\() jp }{ %ifelse
+ dup rhtpar eq { (\\\)) jp }{ %ifelse
+ dup bckslsh eq { (\\\\) jp }{ %ifelse
+ hstr exch 0 exch put hstr jp
+ } ifelse
+ } ifelse
+ } ifelse
+ } forall (\)) jp flush
+} bdef
+% AI 3 text format pieces
+jtxt3 {
+/j3txt { j3ftxt {(0 Ts 100 Tz 0 Tt 0 TA 0 0 5 TC 100 100 200 TW 0 0 0 Ti\n) jp
+ (0 Ta 0 Tq 0 0 TI 0 Tc 0 Tw\n) jp} if } bdef
+/show {oldgsave (0 To\n) jp
+ currentpoint 2 copy /jy exch def /jx exch def translate
+ curftmatrix /jitm exch def
+ 0 1 5 {jitm exch get jpnum} for ( 0 Tp\n) jp (TP\n) jp
+ (0 Tr\n) jp (\/_) jp curftname curftsize jpnum ( Tf\n) jp
+ (0) jp j_ax curftsize div 100 mul jpnum ( 100 TC\n) jp % percent(?)
+ dup curpt moveto mark exch handft ( Tx\n) jp (TO\n) jp /j3ftxt false def
+ cleartomark currentpoint oldgrestore moveto
+} bdef
+/ashow {exch pop exch /j_ax exch def show /j_ax {0} def } bdef
+}
+ {
+/show {oldgsave (u\n) jp currentpoint 2 copy /jy exch def /jx exch def translate
+ (\/) jp curftname jstr cvs jp
+ curftsize dup jpnum jpnum ( 0 0 z\n) jp
+ curftmatrix jpmat ( e\n) jp
+ dup curpt moveto mark exch handft ( t T U\n) jp
+ cleartomark currentpoint oldgrestore moveto} bdef
+/ashow {oldgsave (u\n) jp currentpoint translate (\/) jp curftname jstr cvs jp
+ curftsize dup jpnum jpnum exch kscl mul jpnum ( 0 z\n) jp
+ curftmatrix jpmat ( e\n) jp dup curpt moveto mark exch handft
+ ( t T U\n) jp cleartomark currentpoint oldgrestore moveto} bdef
+} ifelse
+/widthshow { show pop pop pop} bdef
+/awidthshow {ashow pop pop pop} bdef
+/kshow {show pop} bdef
+%/show {true charpath fill} bdef % get outline of charactor
+joutln {/show { true charpath currentpoint
+ /jy exch def /jx exch def fill jx jy moveto} bdef} if
+%/show {oldshow} bdef % do nothing different
+%
+% Color Operators
+%
+/oldsetcmykcolor [/setcmykcolor load] cbdef
+/setcmykcolor {oldsetcmykcolor
+currentcmykcolor 4 -1 roll jpnum 3 -1 roll jpnum 2 -1 roll jpnum jpnum ( k\n) jp
+currentcmykcolor 4 -1 roll jpnum 3 -1 roll jpnum 2 -1 roll jpnum jpnum ( K\n) jp
+ } bdef
+/oldsetgray [/setgray load] cbdef
+/setgray {0 0 0 4 -1 roll 1 exch sub setcmykcolor} bdef
+/oldsethsbcolor [/sethsbcolor load] cbdef
+/sethsbcolor {oldsethsbcolor currentcmykcolor setcmykcolor} bdef
+/oldsetrgbcolor [/setrgbcolor load] cbdef
+/setrgbcolor {oldsetrgbcolor currentrgbcolor /bval xdef /gval xdef /rval xdef
+ /rawC 1 rval sub def /rawM 1 gval sub def /rawY 1 bval sub def
+ rawC rawM ge { rawY rawM ge { /blk rawM def} if } if
+ rawC rawY ge { rawM rawY ge { /blk rawY def} if } if
+ rawY rawC ge { rawM rawC ge { /blk rawC def} if } if
+ rawY rawC eq { rawM rawC eq { /blk rawC def} if } if
+ /cyan rawC blk sub def
+ /mag rawM blk sub def
+ /yel rawY blk sub def
+ /blk blk def
+ cyan mag yel blk setcmykcolor } bdef
+%
+% State Operators
+%
+/oldsetlinewidth [/setlinewidth load] cbdef
+/setlinewidth {kscl abs mul jltz oldsetlinewidth
+ currentlinewidth jpnum ( w\n) jp } bdef
+/oldsetlinecap [/setlinecap load] cbdef
+/setlinecap {dup oldsetlinecap jpnum ( J\n) jp} bdef
+/oldsetlinejoin [/setlinejoin load] cbdef
+/setlinejoin {dup oldsetlinejoin jpnum ( j\n) jp} bdef
+/oldsetmiterlimit [/setmiterlimit load] cbdef
+/setmiterlimit {dup oldsetmiterlimit jpnum ( M\n) jp}bdef
+/oldsetdash [/setdash load] cbdef
+/setdash {exch [ exch {kscl abs mul} forall ] exch kscl abs mul oldsetdash
+ currentdash exch jpmat jpnum ( d\n) jp } bdef
+/oldsetflat [/setflat load] cbdef
+/setflat {dup oldsetflat jpnum ( i\n) jp } bdef
+%
+% More State Operators
+%
+/kscl { % use just the x scale factor
+ oldgsave
+ matrix currentmatrix /jctm exch def
+ jctm 4 0 put jctm 5 0 put jctm setmatrix
+ 1 0 moveto currentpoint transform
+ dup mul exch dup mul add sqrt 10000 mul round 10000 div
+ oldgrestore
+} bdef
+/currentstate {currentcmykcolor setcmykcolor
+ currentflat jpnum ( i) jp currentlinecap jpnum ( J) jp
+ currentlinejoin jpnum ( j) jp currentlinewidth jpnum ( w) jp
+ currentmiterlimit jpnum ( M ) jp currentdash exch jpmat jpnum ( d\n) jp
+} bdef
+/jdifG {
+ currentcmykcolor /jok xdef /joy xdef /jom xdef /joc xdef
+ currentflat /jof xdef currentlinecap /jolc xdef currentlinejoin /jolj xdef
+ currentlinewidth /jolw xdef currentmiterlimit /joml xdef
+ currentdash /jood xdef /joad xdef
+ oldgrestore
+ currentcmykcolor /jnk xdef /jny xdef /jnm xdef /jnc xdef
+ currentflat /jnf xdef currentlinecap /jnlc xdef currentlinejoin /jnlj xdef
+ currentlinewidth /jnlw xdef currentmiterlimit /jnml xdef
+ currentdash /jnod xdef /jnad xdef
+ % compare old gstate to new gstate
+ joc jnc ne jom jnm ne joy jny ne jok jnk ne
+ jof jnf ne jolc jnlc ne jolj jnlj ne jolw jnlw ne joml jnml ne
+ false joad {true exit} forall {pop pop true}{false} ifelse
+ false jnad {true exit} forall {pop pop true}{false} ifelse ne
+ jood jnod ne 10 {or} repeat {currentstate} if
+} bdef
+/oldgsave [/gsave load] cbdef
+/gsave {oldgsave /gcnt gcnt 1 add def } bdef % clarry gcnt false put} bdef
+% (%%Note:gsave ) jp gcnt jpnum (\n) jp} bdef
+/oldgrestore [/grestore load] cbdef
+/grestore {dpth {newpath} if clarry gcnt get {(Q\n) jp clarry gcnt false put} if
+ jdifG /gcnt gcnt 1 sub def } bdef
+% oldgrestore currentstate } bdef
+% (%%Note:grestore ) jp gcnt 1 add jpnum (\n) jp} bdef
+/oldrestore [/restore load] cbdef
+% a kludgy way of saving the clipping path status information
+/restore {clarry aload pop 11 -1 roll oldrestore clarry astore pop} bdef
+/showpage { 0 1 9 {clarry exch get {(Q\n) jp} if } for
+ (%%Note: If Error, make sure there are matched pairs of 'q's and 'Q's\n) jp
+ (%%Note: in the file. Add 'Q's before '%%Trailer' until equal\n) jp
+ (%%Trailer\n) jp
+ jtxt3 {(Adobe_IllustratorA_AI3 /terminate get exec\n) jp
+ (Adobe_typography_AI3 /terminate get exec\n) jp
+ (Adobe_customcolor /terminate get exec\n) jp
+ (Adobe_cshow /terminate get exec\n) jp
+ (Adobe_cmykcolor /terminate get exec\n) jp
+ (Adobe_packedarray /terminate get exec\n) jp
+}{
+ (Adobe_Illustrator881 /terminate get exec\n) jp
+ (Adobe_customcolor /terminate get exec\n) jp
+ (Adobe_cshow /terminate get exec\n) jp
+ (Adobe_cmykcolor /terminate get exec\n) jp
+ (Adobe_packedarray /terminate get exec\n) jp
+ } ifelse
+( showpage\n%EOF\n%%EndDocument\n) jp
+ jout {joutput closefile} if jMacGS not {quit} if /j3ftxt true def } bdef
+%
+% Error handling
+%
+errordict begin
+% Attempt to handle the error caused by bitmap fonts (TeX,Windows.ps,etc)
+% this is a big-time kludge
+jbiterr {
+ /undefined {pop pop (Times-Roman)} bdef
+ /typecheck {pop pop} bdef
+} if
+jerr {
+ /handleerror {
+ (%%Note: ps2ai error, aborting rest of conversion\n) jp showpage
+ } bdef
+} if
+end
+%
+% Mac LW 8 improvements
+%
+/jmacimp { % stroked line instead of thin filled boxes
+ /@a { 3 -1 roll 2 div dup 3 -1 roll add exch 3 -1 roll add exch moveto
+ 3 -1 roll 2 div dup 3 -1 roll add exch 3 -1 roll exch sub exch lineto
+ abs setlinewidth stroke pop pop} bdef
+ /@b { 3 -1 roll 2 div dup 3 -1 roll add exch 3 -1 roll add exch moveto
+ pop
+ 3 -1 roll 2 div dup 3 -1 roll add exch 3 -1 roll add exch lineto
+ abs setlinewidth stroke} bdef
+ /endp {showpage pm restore} bdef % because the restore stops clean up
+} bdef
+%
+% Handle (some) PS Level 2
+%
+/rectstroke { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
+ closepath stroke} bdef
+/rectfill { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
+ fill } bdef
+/rectclip { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
+ closepath clip newpath jMacfix {jmacimp} if } bdef
+%
+% Add a header prolog to the output file so it is still view/print-able
+%
+(%!PS-Adobe-2.0 EPSF-1.2\n%%BoundingBox: 0 0 612 792\n) jp
+(%%Title: Adobe Illustator 3 Editable Document\n) jp
+(%%Creator: ps2ai.ps vers.) jp vers jpnum ( \(C\) 1993-94 Jason Olszewski\n) jp
+(%%TemplateBox: 0 0 612 792\n) jp
+jtxt3 {(%%AI3_Margin:0 0 0 0\n) jp } if
+(%%EndComments\n) jp
+(%%BeginProlog\n) jp
+(/m {moveto} def /l {lineto} def /c {curveto} def\n) jp
+(/S {stroke} def /F {fill} def\n) jp
+(/s {closepath S} def /f {closepath F} def\n) jp
+(/q {gsave} def /Q {grestore} def /W {clip} def /k {setcmykcolor} def\n) jp
+(/i {setflat} def /J {setlinecap} def /j {setlinejoin} def\n) jp
+(/w {setlinewidth} def /M {setmiterlimit} def /d {setdash} def\n) jp
+(/u {gsave} def /U {grestore} def /K {k} def\n) jp
+(/N {newpath} def /n {closepath N} def\n) jp
+(/g {setgray} def /G {g} def\n) jp
+(/x {pop pop k} def /X {x} def\n) jp
+(/H {} def /h {H closepath} def /D {pop} def\n) jp
+(/*u { /N {/spth 0 def}def /S{/spth 1 def}def /F {/spth 2 def} def} def\n) jp
+(/*U { spth 0 eq {newpath} if spth 1 eq {stroke} if spth 2 eq {fill} if\n) jp
+( /N {newpath} def /S {stroke} def /F {fill} def } def\n) jp
+%(\n) jp
+jtxt3 {
+ (/TC {pop pop pop} def /Tr {pop} def\n) jp
+ (/To {pop gsave} def /TO {grestore} def\n) jp
+ (/Tp {pop matrix astore concat} def /TP {0 0 moveto} def\n) jp
+ (/a_str 40 string def /cnt 0 def /h_str (X) def /undsc (_) 0 get def\n) jp
+ (/fntfix {a_str cvs dup length 1 sub /f_str exch string def\n) jp
+ ( {dup undsc eq {pop}{f_str cnt 3 -1 roll put /cnt cnt 1 add def\n) jp
+ ( } ifelse } forall flush /cnt 0 def f_str cvn } bind def\n) jp
+
+ (/Tf {exch fntfix findfont exch scalefont setfont} def /Tx {show} def\n) jp
+}{
+ (/z {pop pop pop exch findfont exch scalefont setfont} def\n) jp
+ (/e {concat 0 0 m} def /t {show} def /T {} def\n) jp
+} ifelse
+(\n) jp
+jtxt3 {
+ (userdict /Adobe_packedarray 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+ (userdict /Adobe_cmykcolor 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+ (userdict /Adobe_cshow 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+ (userdict /Adobe_customcolor 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+ (userdict /Adobe_typography_AI3 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+ (userdict /Adobe_IllustratorA_AI3 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+}{
+ (userdict /Adobe_packedarray 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+ (userdict /Adobe_cmykcolor 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+ (userdict /Adobe_cshow 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+ (userdict /Adobe_customcolor 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+ (userdict /Adobe_Illustrator881 2 dict dup begin put\n) jp
+ (/initialize {} def /terminate {} def\n) jp
+} ifelse
+(%%EndProlog\n) jp
+(%%BeginSetup\n) jp
+jtxt3 {
+ (Adobe_packedarray /initialize get exec\n) jp
+ (Adobe_cmykcolor /initialize get exec\n) jp
+ (Adobe_cshow /initialize get exec\n) jp
+ (Adobe_customcolor /initialize get exec\n) jp
+ (Adobe_typography_AI3 /initialize get exec\n) jp
+ (Adobe_IllustratorA_AI3 /initialize get exec\n) jp
+}{
+ (Adobe_packedarray /initialize get exec\n) jp
+ (Adobe_cmykcolor /initialize get exec\n) jp
+ (Adobe_cshow /initialize get exec\n) jp
+ (Adobe_customcolor /initialize get exec\n) jp
+ (Adobe_Illustrator881 /initialize get exec\n) jp
+} ifelse
+(%%EndSetup\n) jp
+0 0 0 1 oldsetcmykcolor
+currentstate
+
+jout {(%%Note: Load Postscript file to be converted now\n) print} if
diff --git a/lib/ps2ascii b/lib/ps2ascii
new file mode 100755
index 00000000..3711841b
--- /dev/null
+++ b/lib/ps2ascii
@@ -0,0 +1,21 @@
+#!/bin/sh
+# Extract ASCII text from a PostScript file. Usage:
+# ps2ascii [infile.ps [outfile.txt]]
+# If outfile is omitted, output goes to stdout.
+# If both infile and outfile are omitted, ps2ascii acts as a filter,
+# reading from stdin and writing on stdout.
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+
+trap "rm -f _temp_.err _temp_.out" 0 1 2 15
+
+OPTIONS="-q -dSAFER -sDEVICE=txtwrite"
+if ( test $# -eq 0 ) then
+ $GS_EXECUTABLE $OPTIONS -o - -
+elif ( test $# -eq 1 ) then
+ $GS_EXECUTABLE $OPTIONS -o - "$1"
+else
+ $GS_EXECUTABLE $OPTIONS -o "$2" "$1"
+fi
diff --git a/lib/ps2ascii.bat b/lib/ps2ascii.bat
new file mode 100755
index 00000000..553ab2dd
--- /dev/null
+++ b/lib/ps2ascii.bat
@@ -0,0 +1,14 @@
+@echo off
+
+call "%~dp0gssetgs.bat"
+if '%1'=='' goto a0
+if '%2'=='' goto a1
+%GSC% -dSAFER -sDEVICE=txtwrite -o %2 %1
+goto x
+:a0
+%GSC% -dSAFER -sDEVICE=txtwrite -o - -
+goto x
+:a1
+%GSC% -dSAFER -sDEVICE=txtwrite -o - %1
+goto x
+:x
diff --git a/lib/ps2ascii.cmd b/lib/ps2ascii.cmd
new file mode 100755
index 00000000..142d377b
--- /dev/null
+++ b/lib/ps2ascii.cmd
@@ -0,0 +1,17 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+@echo off
+if '%1'=='' goto a0
+if '%2'=='' goto a1
+gsos2 -q -dSAFER -sDEVICE=txtwrite -o %2 %1
+goto x
+:a0
+gsos2 -q -dSAFER -sDEVICE=txtwrite -o - -
+goto x
+:a1
+gsos2 -q -dSAFER -sDEVICE=txtwrite -o - %1
+goto x
+:x
diff --git a/lib/ps2epsi b/lib/ps2epsi
new file mode 100755
index 00000000..d992180f
--- /dev/null
+++ b/lib/ps2epsi
@@ -0,0 +1,118 @@
+#!/bin/sh
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+# try to create a temporary file securely
+if test -z "$TMPDIR"; then
+ TMPDIR=/tmp
+fi
+if which mktemp >/dev/null 2>/dev/null; then
+ tmpfile="`mktemp $TMPDIR/ps2epsi.XXXXXX`"
+else
+ tmpdir=$TMPDIR/ps2epsi.$$
+ (umask 077 && mkdir "$tmpdir")
+ if test ! -d "$tmpdir"; then
+ echo "failed: could not create temporary file"
+ exit 1
+ fi
+ tmpfile="$tmpdir"/ps2epsi$$
+fi
+trap "rm -rf \"$tmpfile\"" 0 1 2 3 7 13 15
+
+export outfile
+
+if [ $# -lt 1 -o $# -gt 2 ]; then
+ echo "Usage: `basename \"$0\"` file.ps [file.epsi]" 1>&2
+ exit 1
+fi
+
+infile=$1;
+
+if [ $# -eq 1 ]
+then
+ case "${infile}" in
+ *.ps) base=`basename "${infile}" .ps` ;;
+ *.cps) base=`basename "${infile}" .cps` ;;
+ *.eps) base=`basename "${infile}" .eps` ;;
+ *.epsf) base=`basename "${infile}" .epsf` ;;
+ *) base=`basename "${infile}"` ;;
+ esac
+ outfile=${base}.epsi
+else
+ outfile=$2
+fi
+
+"$GS_EXECUTABLE" -q -dBATCH -dNOPAUSE -P- -sDEVICE=bbox -sOutputFile=/dev/null "${infile}" 2>${outfile}
+
+ls -l "${infile}" |
+awk 'F==1 {
+ cd="%%CreationDate: " $6 " " $7 " " $8;
+ t="%%Title: " $9;
+ f="%%For:" U " " $3;
+ c="%%Creator: Ghostscript ps2epsi from " $9;
+ next;
+ }
+ /^%!/ {next;}
+ /^%%Title:/ {t=$0; next;}
+ /^%%Creator:/ {c=$0; next;}
+ /^%%CreationDate:/ {cd=$0; next;}
+ /^%%For:/ {f=$0; next;}
+ !/^%/ {
+ print "/ps2edict 30 dict def";
+ print "ps2edict begin";
+ print "/epsititle (" t "\\n) def";
+ print "/epsicreator (" c "\\n) def";
+ print "/epsicrdt (" cd "\\n) def";
+ print "/epsifor (" f "\\n) def";
+ exit(0);
+ }
+ ' U="$USERNAME$LOGNAME" F=1 - F=2 "${infile}" >"$tmpfile"
+
+ls -l "${outfile}" |
+awk 'F==1 {
+ b="%%BoundingBox: 0 0 0 0\\n";
+ }
+ /^%%BoundingBox:/ {b=$0; next;}
+ /^%%HiResBoundingBox:/ {
+ hb=$0;
+ print "ps2edict where {pop} {/ps2edict 30 dict def} ifelse";
+ print "ps2edict begin";
+ print "/BBoxString (" b "\\n) def";
+ print "/HiresBBoxString (" hb "\\n) def";
+ print "end";
+ exit(0);
+ }
+ ' F=1 - F=2 "${outfile}" >>"$tmpfile"
+
+"$GS_EXECUTABLE" -q -dNOPAUSE -P- -r72 -sDEVICE=bit -sOutputFile=/dev/null "$tmpfile" ps2epsi.ps "$tmpfile" <"${infile}" 1>&2
+rm -f "$tmpfile"
+rm -rf "$tmpdir"
+
+(
+cat << BEGINEPS
+save countdictstack mark newpath /showpage {} def /setpagedevice /pop load def
+%%EndProlog
+%%Page 1 1
+BEGINEPS
+
+cat "${infile}" |
+LC_ALL=C \
+sed -e '/^%%BeginPreview:/,/^%%EndPreview[^!-\~]*$/d' -e '/^%!PS-Adobe/d'\
+ -e '/^%%[A-Za-z][A-Za-z]*[^!-\~]*$/d' -e '/^%%[A-Za-z][A-Za-z]*: /d'
+
+cat << ENDEPS
+%%Trailer
+cleartomark countdictstack exch sub { end } repeat restore
+%%EOF
+ENDEPS
+
+) >> "${outfile}"
+
+exit 0
diff --git a/lib/ps2epsi.bat b/lib/ps2epsi.bat
new file mode 100755
index 00000000..f5e7b3e5
--- /dev/null
+++ b/lib/ps2epsi.bat
@@ -0,0 +1,37 @@
+@echo off
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+
+call "%~dp0gssetgs.bat"
+set infile=%~1
+set outfile=%~2
+
+rem First we need to determine the bounding box. ps2epsi.ps below will pick
+rem the result up from %outfile%
+%GSC% -q -dNOPAUSE -dBATCH -P- -sDEVICE=bbox -sOutputFile=NUL %1 2> %2
+
+rem Ghostscript uses %outfile% to define the output file
+%GSC% -q -dNOPAUSE -P- -sDEVICE=bit -sOutputFile=NUL ps2epsi.ps < %1
+
+rem We bracket the actual file with a few commands to help encapsulation
+echo %%%%Page: 1 1 >> %2
+echo %%%%BeginDocument: %2 >> %2
+echo /InitDictCount countdictstack def gsave save mark newpath >> %2
+echo userdict /setpagedevice /pop load put >> %2
+
+rem Append the original onto the preview header
+rem cat.ps uses the %infile% and %outfile% environment variables for the filenames
+%GSC% -q -dNOPAUSE -dBATCH -P- -sDEVICE=bit -sOutputFile=NUL cat.ps
+
+
+echo %%%%EndDocument >> %2
+echo countdictstack InitDictCount sub { end } repeat >> %2
+echo cleartomark restore grestore >> %2
+
+goto end
+
+:usage
+echo "Usage: ps2epsi <infile.ps> <outfile.epi>"
+
+:end
diff --git a/lib/ps2epsi.cmd b/lib/ps2epsi.cmd
new file mode 100755
index 00000000..9eafdbd8
--- /dev/null
+++ b/lib/ps2epsi.cmd
@@ -0,0 +1,38 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+@echo off
+if %1/==/ goto usage
+if %2/==/ goto usage
+
+set infile=%1
+set outfile=%2
+
+rem First we need to determine the bounding box. ps2epsi.ps below will pick
+rem the result up from %outfile%
+gsos2 -q -dNOPAUSE -dBATCH -P- -sDEVICE=bbox -sOutputFile=NUL %infile% 2> %outfile%
+
+rem Ghostscript uses %outfile% to define the output file
+gsos2 -q -dNOPAUSE -P- -sDEVICE=bit -sOutputFile=NUL ps2epsi.ps < %infile%
+
+rem We bracket the actual file with a few commands to help encapsulation
+echo %%%%Page: 1 1 >> %outfile%
+echo %%%%BeginDocument: %outfile% >> %outfile%
+echo /InitDictCount countdictstack def gsave save mark newpath >> %outfile%
+echo userdict /setpagedevice /pop load put >> %outfile%
+
+rem Append the original onto the preview header
+copy %outfile% + %infile%
+
+echo %%%%EndDocument >> %outfile%
+echo countdictstack InitDictCount sub { end } repeat >> %outfile%
+echo cleartomark restore grestore >> %outfile%
+
+goto end
+
+:usage
+echo "Usage: ps2epsi <infile.ps> <outfile.epi>"
+
+:end
diff --git a/lib/ps2epsi.ps b/lib/ps2epsi.ps
new file mode 100644
index 00000000..86f1d2ff
--- /dev/null
+++ b/lib/ps2epsi.ps
@@ -0,0 +1,244 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Convert an arbitrary PostScript file to an EPSI file.
+%
+% Please do not contact these users if you have questions. They no longer
+% have the time, interest, or current expertise to keep this code working.
+% If you find bugs, please send proposed fixes to bug-gs@ghostscript.com.
+%
+% Bug fix 2002-04-20 by rayjj: Bounding box was incorrect since it depended
+% on the dither pattern and gray shade at the boundary. Changed to use
+% 8-bit grayscale preview image to allow correct bounding box (at the
+% expense of a 8x larger preview image). Also moved .setsafe until after
+% the device and file operations are complete (but still before the input
+% file is processed.
+% Bug fix 2000-04-11 by lpd: if a font didn't have a FontName (which is the
+% case for bitmap fonts produced by recent versions of dvips), setfont
+% caused an error.
+% Bug fix 8/21/99 by lpd: many of the margin and width computations were
+% wrong (off by 1). The code only "worked" because the bugs were
+% (mostly) in conservative directions.
+% Modified 3/17/98 by lpd to make it possible to run this file without
+% running the ps2epsi script first, for debugging.
+% Bug fix 9/29/97 by lpd <ghost@aladdin.com>: if the page size wasn't an
+% exact multiple of 8 bits, an incorrect bounding box (or a rangecheck
+% error) could occur.
+% Patched 7/26/95 by
+% Greg P. Kochanski <gpk@bell-labs.com>
+% to add many new DSC comments and make the comments conforming.
+% Original version contributed by
+% George Cameron <george@bio-medical-physics.aberdeen.ac.uk>
+%
+
+% Initialize, and redefine copypage and showpage.
+
+% ps2edict is normally defined in the pre-loaded code created by the
+% ps2epsi script.
+/ps2edict where { pop } { /ps2edict 25 dict def } ifelse
+ps2edict begin
+
+ % The main procedure
+ /ps2epsi
+ {
+ % bbox written to outfile by bbox device from ps2epsi command file
+ outfile (r) file /epsifile exch def
+ /BBoxString epsifile 256 string readline pop def
+ /HiresBBoxString epsifile 256 string readline pop def
+ epsifile closefile
+ % Open the file
+ outfile (w) file /epsifile exch def
+ % Get the device parameters
+ currentdevice getdeviceprops .dicttomark
+ /HWSize get aload pop
+ /devheight exch def
+ /devwidth exch def
+ matrix defaultmatrix
+ /devmatrix exch def
+ % Make a corresponding 8-bit deep memory device
+ devmatrix devwidth devheight
+ 256 string 0 1 255 { 1 index exch dup 255 exch sub put } for
+ makeimagedevice
+ /arraydevice exch def
+ arraydevice
+ % Turn on anti-aliasing
+ mark /TextAlphaBits 4 /GraphicsAlphaBits 4 6 -1 roll
+ putdeviceprops
+ setdevice % (does an erasepage)
+ /rowwidth devwidth def
+ /row rowwidth string def
+ /zerorow rowwidth string def % all zero
+ % Replace the definition of showpage
+ userdict /showpage { ps2edict begin epsipage end } bind put
+ userdict /setfont { ps2edict begin epsisetfont end } bind put
+ userdict /setpagedevice /pop load put
+ } bind def
+
+ /epsifontdict 100 dict def
+
+ /epsisetfont
+ {
+ % code here keeps a list of font names in dictionary epsifontdict
+ /tmpfont exch def
+ tmpfont /FontName known {
+ /tmpfontname tmpfont /FontName get def
+ epsifontdict tmpfontname known not { epsifontdict tmpfontname 0 put } if
+ epsifontdict tmpfontname 2 copy get 1 add put
+ } if
+ tmpfont setfont
+ } bind def
+
+% Get a scan line from the memory device, zeroing any bits beyond
+% the device width.
+/getscanline { % <device> <y> <string> getscanline <string>
+ dup 4 1 roll copyscanlines pop
+ 16#ff00 devwidth 7 and neg bitshift 255 and
+ dup 0 ne {
+ 1 index dup length 1 sub 2 copy get 4 -1 roll and put
+ } {
+ pop
+ } ifelse
+} bind def
+
+/margintest { % <y-start> <step> <y-limit> margintest <y-non-blank>
+ % <y-start> <step> <y-limit> margintest -
+ { dup arraydevice exch row getscanline
+ zerorow ne { exit } if pop
+ } for
+} bind def
+
+ /epsiNameStr 200 string def
+ /epsiNpages 0 def
+ /epsiNpageStr 20 string def
+ /epsipage
+ {
+ /epsiNpages epsiNpages 1 add def
+ /loopcount devheight 1 sub def
+
+ % Find top margin -- minimum Y of non-blank scan line.
+ -1 0 1 loopcount margintest
+ dup -1 eq { (blank page!!\n) print quit }{ exch pop } ifelse
+ /tm exch def
+
+ % Find bottom margin -- maximum Y of non-blank scan line.
+ loopcount -1 0 margintest
+ /bm exch def
+
+ % Initialise limit variables
+ /loopcount rowwidth 1 sub def
+ /lm loopcount def
+ /rm 0 def
+
+ % Find left and right boundaries of image
+ tm 1 bm
+ { % Get more data
+ arraydevice exch row getscanline pop
+ % Scan from left to find first non-zero element
+ % We save first the element, then the index
+ -1 0 1 loopcount
+ { dup row exch get 0 ne { exch pop exit }{ pop } ifelse
+ } for
+ % If we found -1, row is blank ..
+ dup -1 ne
+ { % Find the leftmost index
+ dup lm lt
+ % If the new index is less, we save index and element
+ { /lm exch def } { pop } ifelse
+ % Now find the rightmost index
+ loopcount -1 0
+ { dup row exch get 0 ne { exit }{ pop } ifelse
+ } for
+ dup rm gt
+ % If the new index is greater, we save index and element
+ { /rm exch def } { pop } ifelse
+ } {
+ pop
+ } ifelse
+ } for
+
+ % Write out the magic string and bounding box information
+ epsifile (%!PS-Adobe-2.0 EPSF-1.2\n) writestring
+ /epsititle where { pop epsifile epsititle writestring } if
+ /epsicreator where { pop epsifile epsicreator writestring } if
+ /epsicrdt where { pop epsifile epsicrdt writestring } if
+ /epsifor where { pop epsifile epsifor writestring } if
+ epsifile flushfile
+
+ % Write out the page count:
+ epsifile (%%Pages: ) writestring
+ epsifile epsiNpages epsiNpageStr cvs writestring
+ epsifile (\n) writestring
+ epsifile flushfile
+
+ % Write out the list of used fonts:
+ epsifile (%%DocumentFonts:) writestring
+ epsifontdict {
+ epsifile ( ) writestring
+ pop epsiNameStr cvs epsifile exch writestring
+ } forall
+ epsifile (\n) writestring
+ epsifile flushfile
+
+ epsifile BBoxString writestring epsifile (\n) writestring
+ epsifile HiresBBoxString writestring epsifile (\n) writestring
+
+ % Define character and bit widths for the output line buffer:
+ /cwidth rm lm sub 1 add def
+ /out cwidth string def
+
+ epsifile (%%EndComments\n\n) writestring
+ epsifile (%%BeginProlog\n) writestring
+ epsifile (%%BeginPreview: ) writestring
+ epsifile cwidth write==only epsifile ( ) writestring
+ epsifile bm tm sub 1 add write==only epsifile ( 8 ) writestring
+ epsifile bm tm sub 1 add
+ cwidth 39 add 40 idiv mul write==
+ epsifile flushfile
+
+ gsave
+
+ tm 1 bm
+ { % Get a scan line interval from the array device
+ arraydevice exch row copyscanlines lm cwidth getinterval
+ % Write out the hex data as 40 bytes per line (82 chars)
+ 0 40 cwidth
+ { epsifile (% ) writestring
+ epsifile exch 2 index exch
+ dup cwidth exch sub 40 .min getinterval writehexstring
+ epsifile (\n) writestring
+ } for
+ pop
+ } for
+
+ epsifile (%%EndImage\n) writestring
+ epsifile (%%EndPreview\n) writestring
+ epsifile flushfile
+ grestore
+ erasepage initgraphics
+
+ DonePage 0 1 put
+ } bind def
+
+(outfile) getenv
+ { /outfile exch def
+ ps2epsi
+
+ /DonePage 1 string def
+ (%stdin) (r) file cvx execute0
+ DonePage 0 get 0 eq { showpage } if
+ } if
+
+end
+quit
diff --git a/lib/ps2pdf b/lib/ps2pdf
new file mode 100755
index 00000000..878474d9
--- /dev/null
+++ b/lib/ps2pdf
@@ -0,0 +1,12 @@
+#!/bin/sh
+# Convert PostScript to PDF.
+
+# Currently, we produce PDF 1.4 by default, but this is not guaranteed
+# not to change in the future.
+version=14
+
+ps2pdf="`dirname \"$0\"`/ps2pdf$version"
+if test ! -x "$ps2pdf"; then
+ ps2pdf="ps2pdf$version"
+fi
+exec "$ps2pdf" "$@"
diff --git a/lib/ps2pdf.bat b/lib/ps2pdf.bat
new file mode 100755
index 00000000..8a6207a4
--- /dev/null
+++ b/lib/ps2pdf.bat
@@ -0,0 +1,23 @@
+@echo off
+
+rem Convert PostScript to PDF 1.4 (Acrobat 5-and-later compatible).
+rem The default PDF compatibility level may change in the future:
+rem use ps2pdf12 or ps2pdf13 if you want a specific level.
+
+set LIBDIR=%~dp0
+
+rem The current default compatibility level is PDF 1.4.
+echo -dCompatibilityLevel#1.4 >"%TEMP%\_.at"
+goto bot
+
+rem Pass arguments through a file to avoid overflowing the command line.
+:top
+echo %1 >> "%TEMP%\_.at"
+shift
+:bot
+rem Search for leading '-'
+echo %1 | findstr /b /C:- >nul 2>&1
+if ERRORLEVEL 1 goto proc
+goto top
+:proc
+call "%LIBDIR%ps2pdfxx.bat" %1 %2
diff --git a/lib/ps2pdf.cmd b/lib/ps2pdf.cmd
new file mode 100755
index 00000000..a084a1be
--- /dev/null
+++ b/lib/ps2pdf.cmd
@@ -0,0 +1,42 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+/* Convert PostScript to PDF 1.4 (Acrobat 5-and-later compatible). */
+/* The PDF compatibility level may change in the future: */
+/* use ps2pdf12 or ps2pdf13 if you want a specific level. */
+
+parse arg params
+
+gs='@gsos2'
+inext='.ps'
+outext='.pdf'
+
+if params='' then call usage
+
+options=''
+
+/* extract options from command line */
+i=1
+param=word(params,i)
+do while substr(param,1,1)='-'
+ options=options param
+ i=i+1
+ param=word(params,i)
+end
+
+infile=param
+if infile='' then call usage
+outfile=word(params,i+1)
+if outfile='' then do
+ outfile=infile''outext
+ infile=infile''inext
+end
+
+gs options '-q -P- -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile='outfile options '-c save pop -f' infile
+exit
+
+usage:
+say 'Usage: ps2pdf [options...] input[.ps output.pdf]'
+exit
diff --git a/lib/ps2pdf12 b/lib/ps2pdf12
new file mode 100755
index 00000000..a3e4d6af
--- /dev/null
+++ b/lib/ps2pdf12
@@ -0,0 +1,7 @@
+#!/bin/sh
+# Convert PostScript to PDF 1.2 (Acrobat 3-and-later compatible).
+ps2pdfwr="`dirname \"$0\"`/ps2pdfwr"
+if test ! -x "$ps2pdfwr"; then
+ ps2pdfwr="ps2pdfwr"
+fi
+exec "$ps2pdfwr" -dCompatibilityLevel=1.2 "$@"
diff --git a/lib/ps2pdf12.bat b/lib/ps2pdf12.bat
new file mode 100755
index 00000000..67063943
--- /dev/null
+++ b/lib/ps2pdf12.bat
@@ -0,0 +1,20 @@
+@echo off
+
+rem Convert PostScript to PDF 1.2 (Acrobat 3-and-later compatible).
+
+set LIBDIR=%~dp0
+
+echo -dCompatibilityLevel#1.2 >"%TEMP%\_.at"
+goto bot
+
+rem Pass arguments through a file to avoid overflowing the command line.
+:top
+echo %1 >>"%TEMP%\_.at"
+shift
+:bot
+rem Search for leading '-'
+echo %1 | findstr /b /C:- >nul 2>&1
+if ERRORLEVEL 1 goto proc
+goto top
+:proc
+call "%LIBDIR%ps2pdfxx.bat" %1 %2
diff --git a/lib/ps2pdf12.cmd b/lib/ps2pdf12.cmd
new file mode 100755
index 00000000..a7df854e
--- /dev/null
+++ b/lib/ps2pdf12.cmd
@@ -0,0 +1,10 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+/* Convert PostScript to PDF 1.2 (Acrobat 3-and-later compatible). */
+
+parse arg params
+
+call 'ps2pdf' '-dCompatibilityLevel=1.2' params
diff --git a/lib/ps2pdf13 b/lib/ps2pdf13
new file mode 100755
index 00000000..4f4f9844
--- /dev/null
+++ b/lib/ps2pdf13
@@ -0,0 +1,7 @@
+#!/bin/sh
+# Convert PostScript to PDF 1.3 (Acrobat 4-and-later compatible).
+ps2pdfwr="`dirname \"$0\"`/ps2pdfwr"
+if test ! -x "$ps2pdfwr"; then
+ ps2pdfwr="ps2pdfwr"
+fi
+exec "$ps2pdfwr" -dCompatibilityLevel=1.3 "$@"
diff --git a/lib/ps2pdf13.bat b/lib/ps2pdf13.bat
new file mode 100755
index 00000000..6b4abac0
--- /dev/null
+++ b/lib/ps2pdf13.bat
@@ -0,0 +1,20 @@
+@echo off
+
+rem Convert PostScript to PDF 1.3 (Acrobat 4-and-later compatible).
+
+set LIBDIR=%~dp0
+
+echo -dCompatibilityLevel#1.3 >"%TEMP%\_.at"
+goto bot
+
+rem Pass arguments through a file to avoid overflowing the command line.
+:top
+echo %1 >>"%TEMP%\_.at"
+shift
+:bot
+rem Search for leading '-'
+echo %1 | findstr /b /C:- >nul 2>&1
+if ERRORLEVEL 1 goto proc
+goto top
+:proc
+call "%LIBDIR%ps2pdfxx.bat" %1 %2
diff --git a/lib/ps2pdf13.cmd b/lib/ps2pdf13.cmd
new file mode 100755
index 00000000..91d8a9df
--- /dev/null
+++ b/lib/ps2pdf13.cmd
@@ -0,0 +1,10 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+/* Convert PostScript to PDF 1.3 (Acrobat 4-and-later compatible). */
+
+parse arg params
+
+call 'ps2pdf' '-dCompatibilityLevel=1.3' params
diff --git a/lib/ps2pdf14 b/lib/ps2pdf14
new file mode 100755
index 00000000..689cc202
--- /dev/null
+++ b/lib/ps2pdf14
@@ -0,0 +1,7 @@
+#!/bin/sh
+# Convert PostScript to PDF 1.4 (Acrobat 5-and-later compatible).
+ps2pdfwr="`dirname \"$0\"`/ps2pdfwr"
+if test ! -x "$ps2pdfwr"; then
+ ps2pdfwr="ps2pdfwr"
+fi
+exec "$ps2pdfwr" -dCompatibilityLevel=1.4 "$@"
diff --git a/lib/ps2pdf14.bat b/lib/ps2pdf14.bat
new file mode 100644
index 00000000..b0dd43c0
--- /dev/null
+++ b/lib/ps2pdf14.bat
@@ -0,0 +1,20 @@
+@echo off
+
+rem Convert PostScript to PDF 1.4 (Acrobat 5-and-later compatible).
+
+set LIBDIR=%~dp0
+
+echo -dCompatibilityLevel#1.4 >"%TEMP%\_.at"
+goto bot
+
+rem Pass arguments through a file to avoid overflowing the command line.
+:top
+echo %1 >>"%TEMP%\_.at"
+shift
+:bot
+rem Search for leading '-'
+echo %1 | findstr /b /C:- >nul 2>&1
+if ERRORLEVEL 1 goto proc
+goto top
+:proc
+call "%LIBDIR%ps2pdfxx.bat" %1 %2
diff --git a/lib/ps2pdf14.cmd b/lib/ps2pdf14.cmd
new file mode 100644
index 00000000..32317ea2
--- /dev/null
+++ b/lib/ps2pdf14.cmd
@@ -0,0 +1,10 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+/* Convert PostScript to PDF 1.4 (Acrobat 5-and-later compatible). */
+
+parse arg params
+
+call 'ps2pdf' '-dCompatibilityLevel=1.4' params
diff --git a/lib/ps2pdfwr b/lib/ps2pdfwr
new file mode 100755
index 00000000..fe30f070
--- /dev/null
+++ b/lib/ps2pdfwr
@@ -0,0 +1,44 @@
+#!/bin/sh
+# Convert PostScript to PDF without specifying CompatibilityLevel.
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+OPTIONS="-P- -dSAFER"
+while true
+do
+ case "$1" in
+ -?*) OPTIONS="$OPTIONS $1" ;;
+ *) break ;;
+ esac
+ shift
+done
+
+if [ $# -lt 1 -o $# -gt 2 ]; then
+ echo "Usage: `basename \"$0\"` [options...] (input.[e]ps|-) [output.pdf|-]" 1>&2
+ exit 1
+fi
+
+infile="$1";
+
+if [ $# -eq 1 ]
+then
+ case "${infile}" in
+ -) outfile=- ;;
+ *.eps) base=`basename "${infile}" .eps`; outfile="${base}.pdf" ;;
+ *.ps) base=`basename "${infile}" .ps`; outfile="${base}.pdf" ;;
+ *) base=`basename "${infile}"`; outfile="${base}.pdf" ;;
+ esac
+else
+ outfile="$2"
+fi
+
+# We have to include the options twice because -I only takes effect if it
+# appears before other options.
+exec "$GS_EXECUTABLE" $OPTIONS -q -P- -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sstdout=%stderr "-sOutputFile=$outfile" $OPTIONS "$infile"
diff --git a/lib/ps2pdfxx.bat b/lib/ps2pdfxx.bat
new file mode 100644
index 00000000..be978111
--- /dev/null
+++ b/lib/ps2pdfxx.bat
@@ -0,0 +1,64 @@
+@echo off
+rem Internal batch file for calling pdfwrite driver.
+
+rem The files that call this one (ps2pdf*.bat) write the command-line
+rem options into _.at, and then pass the last 2 (or fewer) arguments
+rem to this file.
+
+call "%~dp0gssetgs.bat"
+echo -q -P- -dSAFER -dNOPAUSE -dBATCH -sDEVICE#pdfwrite >"%TEMP%\_.at"2
+
+if "%OS%"=="Windows_NT" goto nt
+
+rem Run ps2pdf on any Microsoft OS.
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+
+rem Watcom C deletes = signs, so use # instead.
+rem We have to include the options twice because -I only takes effect if it
+rem appears before other options.
+
+:run
+echo -sOutputFile#%2 >>"%TEMP%\_.at"2
+copy /b /y "%TEMP%\_.at"2+"%TEMP%\_.at" "%TEMP%\_.at"2 >NUL
+echo %1 >>"%TEMP%\_.at"2
+%GSC% @"%TEMP%\_.at" @"%TEMP%\_.at"2
+goto end
+
+:usage
+echo Usage: ps2pdf [options...] input.[e]ps output.pdf
+goto end
+
+rem Run ps2pdf on Windows NT.
+
+:nt
+if not CMDEXTVERSION 1 goto run
+if %1/==/ goto ntusage
+if %2/==/ goto nooutfile
+goto run
+
+:ntusage
+echo Usage: ps2pdf input.ps [output.pdf]
+echo or: ps2pdf [options...] input.[e]ps output.pdf
+goto end
+
+:nooutfile
+rem We don't know why the circumlocution with _1 is needed....
+set _1=%1
+set _outf=%_1:.PS=.pdf%
+if %_1%==%_outf% goto addsuff
+call "%~dp0ps2pdfxx" %1 %_outf%
+goto postsuff
+
+:addsuff
+call "%~dp0ps2pdfxx" %1 %1%.pdf
+
+:postsuff
+set _1=
+set _outf=
+
+:end
+rem Clean up.
+if exist "%TEMP%\_.at" erase "%TEMP%\_.at"
+if exist "%TEMP%\_.at"2 erase "%TEMP%\_.at"2
diff --git a/lib/ps2ps b/lib/ps2ps
new file mode 100755
index 00000000..4c7c5bff
--- /dev/null
+++ b/lib/ps2ps
@@ -0,0 +1,29 @@
+#!/bin/sh
+# "Distill" PostScript.
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+gs="`dirname \"$0\"`/$GS_EXECUTABLE"
+if test ! -x "$gs"; then
+ gs="$GS_EXECUTABLE"
+fi
+GS_EXECUTABLE="$gs"
+
+OPTIONS="-P- -dSAFER"
+while true
+do
+ case "$1" in
+ -?*) OPTIONS="$OPTIONS $1" ;;
+ *) break ;;
+ esac
+ shift
+done
+
+if [ $# -ne 2 ]; then
+ echo "Usage: `basename \"$0\"` [options] input.ps output.ps" 1>&2
+ echo " e.g. `basename \"$0\"` -sPAPERSIZE=a4 input.ps output.ps" 1>&2
+ exit 1
+fi
+
+exec "$GS_EXECUTABLE" -q -sDEVICE=ps2write -sstdout=%stderr "-sOutputFile=$2" -dNOPAUSE -dBATCH $OPTIONS "$1"
diff --git a/lib/ps2ps.bat b/lib/ps2ps.bat
new file mode 100755
index 00000000..524a3e1a
--- /dev/null
+++ b/lib/ps2ps.bat
@@ -0,0 +1,24 @@
+@echo off
+@rem "Distill" PostScript.
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+call "%~dp0gssetgs.bat"
+echo -dNOPAUSE -P- -dSAFER -dBATCH >"%TEMP%\_.at"
+:cp
+if %3/==/ goto doit
+echo %1 >>"%TEMP%\_.at"
+shift
+goto cp
+
+:doit
+rem Watcom C deletes = signs, so use # instead.
+%GSC% -q -sDEVICE#ps2write -sOutputFile#%2 @"%TEMP%\_.at" %1
+if exist "%TEMP%\_.at" erase "%TEMP%\_.at"
+goto end
+
+:usage
+echo "Usage: ps2ps [options] input.ps output.ps"
+echo " e.g. ps2ps -sPAPERSIZE=a4 input.ps output.ps
+
+:end
diff --git a/lib/ps2ps.cmd b/lib/ps2ps.cmd
new file mode 100755
index 00000000..f66e1cf2
--- /dev/null
+++ b/lib/ps2ps.cmd
@@ -0,0 +1,35 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+/* "Distill" PostScript. */
+
+parse arg params
+
+gs='@gsos2'
+
+if params='' then call usage
+
+options='-P- -dSAFER -dNOPAUSE -dBATCH'
+
+/* extract options from command line */
+i=1
+param=word(params,i)
+do while substr(param,1,1)='-'
+ options=options param
+ i=i+1
+ param=word(params,i)
+end
+
+infile=param
+if infile='' then call usage
+outfile=word(params,i+1)
+if outfile='' then call usage
+
+gs '-q -sDEVICE=ps2write -sOutputFile='outfile options infile
+exit
+
+usage:
+say 'Usage: ps2ps ...switches... input.ps output.ps'
+exit
diff --git a/lib/ps2ps2 b/lib/ps2ps2
new file mode 100755
index 00000000..26e520ae
--- /dev/null
+++ b/lib/ps2ps2
@@ -0,0 +1,26 @@
+#!/bin/sh
+# "Distill" PostScript with the Ghostscript 'ps2write' device
+# this generates a PDF-style stream with an attached
+# PostScript program to interpret it.
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+
+OPTIONS="-P- -dSAFER"
+while true
+do
+ case "$1" in
+ -?*) OPTIONS="$OPTIONS $1" ;;
+ *) break ;;
+ esac
+ shift
+done
+
+if [ $# -ne 2 ]; then
+ echo "Usage: `basename \"$0\"` [options] input.ps output.ps" 1>&2
+ echo " e.g. `basename \"$0\"` -sPAPERSIZE=a4 input.ps output.ps" 1>&2
+ exit 1
+fi
+
+exec $GS_EXECUTABLE -q -sDEVICE=ps2write -sstdout=%stderr "-sOutputFile=$2" -dNOPAUSE -dBATCH $OPTIONS "$1"
diff --git a/lib/ps2ps2.bat b/lib/ps2ps2.bat
new file mode 100755
index 00000000..c31924f5
--- /dev/null
+++ b/lib/ps2ps2.bat
@@ -0,0 +1,24 @@
+@echo off
+@rem Converting Postscript 3 or PDF into PostScript 2.
+
+if %1/==/ goto usage
+if %2/==/ goto usage
+call "%~dp0gssetgs.bat"
+echo -dNOPAUSE -P- -dSAFER -dBATCH >"%TEMP%\_.at"
+:cp
+if %3/==/ goto doit
+echo %1 >>"%TEMP%\_.at"
+shift
+goto cp
+
+:doit
+rem Watcom C deletes = signs, so use # instead.
+%GSC% -q -sDEVICE#ps2write -sOutputFile#%2 @"%TEMP%\_.at" %1
+if exist "%TEMP%\_.at" erase "%TEMP%\_.at"
+goto end
+
+:usage
+echo "Usage: ps2ps [options] input.ps output.ps"
+echo " e.g. ps2ps -sPAPERSIZE=a4 input.ps output.ps
+
+:end
diff --git a/lib/ps2ps2.cmd b/lib/ps2ps2.cmd
new file mode 100755
index 00000000..f66e1cf2
--- /dev/null
+++ b/lib/ps2ps2.cmd
@@ -0,0 +1,35 @@
+/*
+ * This file is maintained by a user: if you have any questions about it,
+ * please contact Mark Hale (mark.hale@physics.org).
+ */
+
+/* "Distill" PostScript. */
+
+parse arg params
+
+gs='@gsos2'
+
+if params='' then call usage
+
+options='-P- -dSAFER -dNOPAUSE -dBATCH'
+
+/* extract options from command line */
+i=1
+param=word(params,i)
+do while substr(param,1,1)='-'
+ options=options param
+ i=i+1
+ param=word(params,i)
+end
+
+infile=param
+if infile='' then call usage
+outfile=word(params,i+1)
+if outfile='' then call usage
+
+gs '-q -sDEVICE=ps2write -sOutputFile='outfile options infile
+exit
+
+usage:
+say 'Usage: ps2ps ...switches... input.ps output.ps'
+exit
diff --git a/lib/ras1.upp b/lib/ras1.upp
new file mode 100644
index 00000000..1af8febb
--- /dev/null
+++ b/lib/ras1.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 1 Bit, 2 Colors (Ghostscript-Rendering)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+-dupComponentBits={1}
diff --git a/lib/ras24.upp b/lib/ras24.upp
new file mode 100644
index 00000000..4f32ca26
--- /dev/null
+++ b/lib/ras24.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 24 Bit, 7 Colors (RGB-Error-Diffusion)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceRGB
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+-dupComponentBits="{8 8 8}"
diff --git a/lib/ras3.upp b/lib/ras3.upp
new file mode 100644
index 00000000..c7831e5f
--- /dev/null
+++ b/lib/ras3.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 3 Bit, 7 Colors (RGB-Ghostscript)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceRGB
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+-dupComponentBits="{1 1 1}"
diff --git a/lib/ras32.upp b/lib/ras32.upp
new file mode 100644
index 00000000..ece35b4b
--- /dev/null
+++ b/lib/ras32.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 32 Bit, 6+1 Colors (CMYK-Error-Diffusion)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+
diff --git a/lib/ras4.upp b/lib/ras4.upp
new file mode 100644
index 00000000..d3673802
--- /dev/null
+++ b/lib/ras4.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 4 Bit, 6+1 Colors (CMYK-Ghostscript)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+-dupComponentBits="{1 1 1 1}"
diff --git a/lib/ras8m.upp b/lib/ras8m.upp
new file mode 100644
index 00000000..88cccd93
--- /dev/null
+++ b/lib/ras8m.upp
@@ -0,0 +1,8 @@
+-supModel="SUN rasterfile, 8 Bit, 2 Colors (Error-Diffusion)"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/SunRaster
+-dupComponentBits={8}
diff --git a/lib/rinkj-2200-setup b/lib/rinkj-2200-setup
new file mode 100644
index 00000000..14d64c3f
--- /dev/null
+++ b/lib/rinkj-2200-setup
@@ -0,0 +1,222 @@
+Manufacturer: EPSON
+Model: Stylus Photo 2200
+Resolution: 1440x720
+Dither: 2
+Aspect: 2
+Microdot: 16
+Unidirectional: 0
+AddLut: K
+23
+0 0
+0.041667 0.072936
+0.083333 0.144825
+0.125000 0.193066
+0.166667 0.249716
+0.208333 0.302334
+0.250000 0.342984
+0.291667 0.386044
+0.333333 0.425084
+0.375000 0.458522
+0.416667 0.520504
+0.458333 0.577275
+0.500000 0.605041
+0.541667 0.652086
+0.583333 0.679372
+0.625000 0.703745
+0.666667 0.727044
+0.708333 0.750855
+0.750000 0.765267
+0.791667 0.920270
+0.833333 0.992157
+0.875000 0.996076
+0.916667 1.000000
+AddLut: K
+4
+0 0
+0 0.5
+0.15 0.75
+0.65 1
+AddLut: k
+23
+0 0
+0.041667 0.072936
+0.083333 0.144825
+0.125000 0.193066
+0.166667 0.249716
+0.208333 0.302334
+0.250000 0.342984
+0.291667 0.386044
+0.333333 0.425084
+0.375000 0.458522
+0.416667 0.520504
+0.458333 0.577275
+0.500000 0.605041
+0.541667 0.652086
+0.583333 0.679372
+0.625000 0.703745
+0.666667 0.727044
+0.708333 0.750855
+0.750000 0.765267
+0.791667 0.920270
+0.833333 0.992157
+0.875000 0.996076
+0.916667 1.000000
+AddLut: k
+5
+0 0
+0.2 0.375
+0.35 0.5
+0.1 0.75
+0 1
+AddLut: C
+22
+0 0
+0.041667 0.088977
+0.083333 0.167638
+0.125000 0.235395
+0.166667 0.296362
+0.208333 0.359009
+0.250000 0.407284
+0.291667 0.453199
+0.333333 0.493685
+0.375000 0.528351
+0.416667 0.592415
+0.458333 0.651623
+0.500000 0.681794
+0.541667 0.742354
+0.583333 0.784790
+0.625000 0.816796
+0.666667 0.850265
+0.708333 0.873510
+0.750000 0.884950
+0.791667 0.966983
+0.833333 0.998659
+0.875000 1.000000
+AddLut: C
+4
+0 0
+0 0.5
+0.15 0.75
+0.65 1
+AddLut: c
+22
+0 0
+0.041667 0.088977
+0.083333 0.167638
+0.125000 0.235395
+0.166667 0.296362
+0.208333 0.359009
+0.250000 0.407284
+0.291667 0.453199
+0.333333 0.493685
+0.375000 0.528351
+0.416667 0.592415
+0.458333 0.651623
+0.500000 0.681794
+0.541667 0.742354
+0.583333 0.784790
+0.625000 0.816796
+0.666667 0.850265
+0.708333 0.873510
+0.750000 0.884950
+0.791667 0.966983
+0.833333 0.998659
+0.875000 1.000000
+AddLut: c
+5
+0 0
+0.2 0.375
+0.35 0.5
+0.1 0.75
+0 1
+AddLut: M
+23
+0 0
+0.041667 0.066179
+0.083333 0.127506
+0.125000 0.171801
+0.166667 0.217173
+0.208333 0.263159
+0.250000 0.299030
+0.291667 0.335471
+0.333333 0.365411
+0.375000 0.389305
+0.416667 0.439855
+0.458333 0.485691
+0.500000 0.513796
+0.541667 0.597812
+0.583333 0.657433
+0.625000 0.706738
+0.666667 0.755192
+0.708333 0.795656
+0.750000 0.826408
+0.791667 0.948840
+0.833333 0.998498
+0.875000 0.999740
+0.916667 1.000000
+AddLut: M
+4
+0 0
+0 0.5
+0.15 0.75
+0.65 1
+AddLut: m
+23
+0 0
+0.041667 0.066179
+0.083333 0.127506
+0.125000 0.171801
+0.166667 0.217173
+0.208333 0.263159
+0.250000 0.299030
+0.291667 0.335471
+0.333333 0.365411
+0.375000 0.389305
+0.416667 0.439855
+0.458333 0.485691
+0.500000 0.513796
+0.541667 0.597812
+0.583333 0.657433
+0.625000 0.706738
+0.666667 0.755192
+0.708333 0.795656
+0.750000 0.826408
+0.791667 0.948840
+0.833333 0.998498
+0.875000 0.999740
+0.916667 1.000000
+AddLut: m
+5
+0 0
+0.2 0.375
+0.35 0.5
+0.1 0.75
+0 1
+AddLut: Y
+21
+0 0
+0.041667 0.082679
+0.083333 0.173423
+0.125000 0.251594
+0.166667 0.336706
+0.208333 0.407062
+0.250000 0.459290
+0.291667 0.522042
+0.333333 0.577070
+0.375000 0.636163
+0.416667 0.683434
+0.458333 0.726899
+0.500000 0.761784
+0.541667 0.789214
+0.583333 0.810356
+0.625000 0.852995
+0.666667 0.869116
+0.708333 0.900888
+0.750000 0.925593
+0.791667 0.989315
+0.833333 1.000000
+AddLut: Y
+3
+0 0
+0.2 0.5
+0.65 1
diff --git a/lib/rollconv.ps b/lib/rollconv.ps
new file mode 100644
index 00000000..031747f1
--- /dev/null
+++ b/lib/rollconv.ps
@@ -0,0 +1,383 @@
+%!
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Utility program for converting Japanese fonts produced by Macromedia's
+% Rollup program to Type 0 fonts suitable for use with Ghostscript.
+%
+% Rollup produces the following files, where xxx is the font name:
+% xxx-H, xxx-SA, xxx-SB, xxx-SK, xxx-SR, xxx-UG
+% JIS83-1_COD
+% JIS83-1_CSA
+% The _COD and _CSA files are large files containing the actual
+% character outline data; they may theoretically be shared between
+% multiple fonts.
+%
+% rollconv.ps converts the above to files named:
+% fff.ps
+% fff.COD
+% fff.CSA
+% fff.CSR
+% where fff is a font file name provided by the user at conversion time.
+% The fff.ps file is the actual font file to be loaded with `run'
+% or placed in a Fontmap or a directory named by [GS_]FONTPATH;
+% the other two files must be present at runtime in a directory that is
+% on Ghostscript's search path (-I, GS_LIB, GS_LIB_DEFAULT).
+%
+% The normal way to invoke this program is
+% gsnd -- rollconv.ps xxx fff InDir CDir OutDir
+% (assuming that gsnd is an alias for gs -dNODISPLAY), where:
+% xxx is the font name;
+% fff is the base part of the output file name;
+% InDir is the name of the directory containing the xxx-* input files;
+% CDir is the name of the directory containing the _COD and _CSA
+% input files (typically the same as InDir);
+% OutDir is the name of the directory where the output should be written
+% (OutDir must already exist).
+% For example:
+% gsnd -- rollconv.ps HGGothicBPRO gothic /gs/k/rufonts/Gothic \
+% /gs/k/rufonts/Gothic /gs/k/gsfonts
+% To suppress output messages, you may insert -q:
+% gsnd -q -- rollconv.ps ...
+%
+% This program assumes that the files have been FTP'ed from a Macintosh and
+% therefore have 128 bytes of garbage at the beginning. If you have
+% transferred them in some manner that avoids this, change true to false
+% in the following line.
+/fromMac true def
+% The FontName of the converted font is xxx-83pv-RKSJ-H. In order to
+% use a converted font with Ghostscript, you may either load it explicitly
+% at run time, e.g.,
+% (gothic.ps) run
+% or you may add an entry to the Fontmap file, in the form:
+% /HGGothicBPRO-83pv-RKSJ-H (gothic.ps) ;
+% which will allow the font to be loaded automatically. After
+% loading the font, by either method, you can select it in the usual way:
+% /HGGothicBPRO-83pv-RKSJ-H findfont 36 scalefont setfont
+% or
+% /HGGothicBPRO-83pv-RKSJ-H 36 selectfont
+
+/macrfile % <filename> macrfile <file>
+ { (r) file
+ fromMac
+ { % Get rid of the initial Mac garbage (128 characters).
+ % The garbage at the end is unpredictable,
+ % so we'll just have to hope that it's all nulls.
+ dup =string 0 128 getinterval readstring pop pop
+ }
+ if
+ } bind def
+
+/convert % <FName> <OutBase> <InDir> <CDir> <OutDir> convert -
+ { /OutDir exch def
+ /CDir exch def
+ /InDir exch def
+ /OutBase exch def
+ /FName exch def
+
+ /inprefix InDir (/) concatstrings FName concatstrings (-) concatstrings def
+ /inh inprefix (H) concatstrings def
+
+ % Open the output file.
+
+/OutDot OutDir (/) concatstrings OutBase concatstrings (.) concatstrings def
+/outname OutDot (ps) concatstrings def
+QUIET not { (Writing ) print outname = flush } if
+/cdfromstr (\(pgfonts/) FName concatstrings (-JIS83-1_) concatstrings def
+/cdstr (\() OutBase concatstrings (.) concatstrings def
+/out outname (w) file def
+/buffer 65000 string def
+
+ % Copy the initial comments from the input file.
+
+inh macrfile
+ { dup =string readline pop
+ out 1 index writestring out (\n) writestring
+ (%%EndComments) eq { exit } if
+ }
+loop
+
+ % Write out our preamble.
+
+out (
+currentpacking true setpacking
+userdict /AltsysCFD3 known { (%END) .skipeof } if
+userdict /AltsysCFD3 25 dict dup begin
+/beint { 0 exch { exch 8 bitshift add } forall } bind def
+/rfile { findlibfile { exch pop } { (r) file } ifelse } bind def
+/str 500 string def
+/AltRO { } def
+/BuildCh % <font> <ccode> <bias> BuildCh -
+ { /bias exch def /ccode exch def begin % font
+ ccode dup 255 and dup bias lt exch 252 gt or { pop 127 } if
+ dup -8 bitshift -67 mul add % subfonts have 189 chars, not 256
+ bias sub buildch1
+ } bind def
+/BuildChr % <font> <ccode> BuildChr -
+ { /ccode exch def begin % font
+ ccode buildch1
+ } bind def
+/buildch1
+ { 6 mul PGOffsets add
+ FileNames 0 get rfile dup dup 4 -1 roll setfileposition
+ (xxxxxx) readstring pop exch closefile
+ dup 1 3 getinterval beint % COD offset
+ exch 4 2 getinterval beint % length
+ dup 0 eq
+ { pop pop currentdict end
+ 1000 0 0 0 1 1 0 -1000 500 1000 setcachedevice2
+ }
+ { dup str length gt { /str 1 index string store } if
+ FileNames 1 get rfile dup dup % offset length file file file
+ 5 -1 roll setfileposition % length file file
+ str 0 5 -1 roll getinterval readstring pop pop closefile
+ currentdict end ccode str 1183615869 internaldict /CCRun get exec
+ }
+ ifelse
+ } bind def
+/privates 100 dict def
+/BuildPr % <stdhw> <stdvw> BuildPr <dict>
+ { 2 copy 1000 mul add privates 1 index known
+ { privates exch get 3 1 roll pop pop
+ }
+ { 7 dict begin
+ /MinFeature{16 16}executeonly def
+ /BlueValues BlueValues def
+ /StdVW 3 -1 roll 1 array astore def
+ /StdHW 3 -1 roll 1 array astore def
+ /password 5839 def
+ /LanguageGroup 1 def
+ /Subrs Subrs def
+ currentdict readonly end
+ privates 2 index 2 index put exch pop
+ }
+ ifelse
+ } bind def
+/FullEncoding
+ systemdict { pop } forall
+ systemdict length 512 sub 1 255 { (x) dup 0 4 -1 roll put cvn } for
+768 packedarray def
+/BlueValues[-250 -250 1100 1100]readonly def
+/BuildChar{AltsysCFD3 begin 64 BuildCh end}bind def
+/CharStrings 1 dict
+dup /.notdef (1py8) noaccess put
+readonly def
+/CDevProc
+ { pop pop pop pop 0 exch -1000 exch 2 div currentfont /FontBBox get 3 get
+ } bind def
+/FontMatrix[0.001 0.0 0.0 0.001 0.0 0.0]readonly def
+/Subrs [
+(1p|=-D\R) noaccess
+(1pyUz) noaccess
+(1pyĞi) noaccess
+(1p) noaccess
+(1p|35rI) noaccess
+] noaccess def
+end put
+%END
+) writestring
+
+ % Locate and copy the definition of NotDefFont.
+
+out (
+FontDirectory /NotDefFont known { (%END) .skipeof } if
+) writestring
+ { dup =string readline pop
+ dup (/NotDefFont) eq { exit } if pop
+ }
+loop out exch writestring out (\n) writestring
+ { dup =string readline pop
+ (definefont) search { pop pop pop exit } if
+ out exch writestring out (\n) writestring
+ }
+loop out (definefont pop
+%END
+) writestring
+
+ % Copy the definitions of the subfonts, moving the
+ % CharStrings of the Roman supplement to an external file.
+ % Stack for pattern procedures: infile line
+
+/CSRName OutDot (CSR) concatstrings def
+/csr CSRName (w) file def
+QUIET not { (Writing ) print CSRName = flush } if
+
+/encoding 256 array def
+
+/patterns [
+ % Patterns specific to the Roman supplement, in which
+ % the outlines are in an eexec section.
+ { (/Encoding 256 array) {
+ pop out (/Encoding ) writestring
+ { dup buffer readline pop
+ dup (dup) search { exit } if pop pop
+ }
+ loop
+ { % Stack: infile dupline postdup (dup) predup
+ pop pop exch pop
+ % The top element of the stack is a string beginning with
+ % an index and value to put into the Encoding.
+ token pop exch token pop exch pop encoding 3 1 roll put
+ dup buffer readline pop
+ dup (dup) search not { pop exit } if
+ }
+ loop
+ out encoding cvx write== out ( cvlit ) writestring
+ out exch writestring out (\n) writestring
+ } }
+ { (/FontType 1 def) {
+ pop out (/FontType 4 def\n) writestring
+ out (/BuildChar{AltsysCFD3 begin BuildChr end}bind def\n) writestring
+ out (/FileNames[) writestring
+ 2 { out OutBase (.CSR) concatstrings write==only } repeat
+ out (]def\n) writestring
+ } }
+ { (currentfile eexec) {
+ pop out (systemdict begin\n) writestring
+ dup //.eexec_param_dict /eexecDecode filter
+ } }
+ { (dup/CharStrings ) {
+ % Copy the individual CharStrings to the CSR file,
+ % recording the lengths and offsets.
+ pop out (dup/CharStrings AltsysCFD3 /CharStrings get put\n) writestring
+ /offsets 256 dict def
+ { dup token pop % char name
+ dup dup type /nametype eq exch xcheck not and not { pop exit } if
+ 1 index token pop % length of binary data
+ 2 index token pop pop % skip RD
+ 2 index buffer 0 3 index getinterval readstring pop % charstring
+ offsets 3 index csr fileposition 16 bitshift 4 index add put
+ csr exch writestring pop pop
+ dup buffer readline pop pop % skip ND
+ }
+ loop
+ % We skipped the 'end'; skip the 'readonly put' as well.
+ 2 { dup token pop pop } repeat
+ out (dup/PGOffsets ) writestring
+ out csr fileposition write=only
+ out ( put\n) writestring
+ encoding
+ { offsets exch .knownget not { 0 } if
+ 2 { csr 0 write } repeat
+ 4 { dup -24 bitshift csr exch write 8 bitshift } repeat pop
+ }
+ forall
+ } }
+ { (/OtherSubrs[) {
+ pop
+ { dup buffer readline pop
+ (]noaccess def) search { pop pop pop exit } if pop
+ }
+ loop
+ } }
+ { (/Subrs 5 array) {
+ pop out (/Subrs AltsysCFD3 /Subrs get def\n) writestring
+ 6 { dup buffer readline pop pop } repeat
+ } }
+ { (currentfile closefile) {
+ pop out (end % systemdict\n) writestring
+ closefile
+ } }
+ % Patterns for other supplements.
+ { (pgfonts/) {
+ { cdfromstr search not { exit } if
+ out exch writestring pop out cdstr writestring
+ }
+ loop out exch writestring out (\n) writestring
+ } }
+ { (/BuildChar{AltsysCFD3 begin 64 BuildCh end}bind def) {
+ pop out (\t/BuildChar AltsysCFD3 /BuildChar get def\n) writestring
+ } }
+ { (/CDevProc{pop pop pop pop 0 exch -1000 exch 2 div ) {
+ pop out (\t/CDevProc AltsysCFD3 /CDevProc get def\n) writestring
+ } }
+ { (/CharStrings 1 dict dup begin) {
+ pop out (\t/CharStrings AltsysCFD3 /CharStrings get def\n) writestring
+ 2 { dup buffer readline pop pop } repeat
+ } }
+ { (/FontMatrix[0.001 0.0 0.0 0.001 0.0 0.0]def) {
+ pop out (\t/FontMatrix AltsysCFD3 /FontMatrix get def\n) writestring
+ } }
+ { (/Private 14 dict dup begin) {
+ pop out (\t/Private) writestring
+ { dup buffer readline pop
+ (end def) search { pop pop pop exit } if
+ (/Std) search
+ { pop pop dup length 3 sub 3 exch getinterval
+ (]) search pop out ( ) writestring out exch writestring pop
+ }
+ if pop
+ }
+ loop out ( AltsysCFD3 begin BuildPr end def\n) writestring
+ } }
+ { (UniqueID) { pop } }
+ { () {
+ out exch writestring out (\n) writestring
+ } }
+] def
+[ (SR) (SA) (SK) (SB) (UG) ]
+ { 0 1 255 { encoding exch /.notdef put } for
+ inprefix exch concatstrings macrfile
+ { dup buffer readline not { pop exit } if
+ /patterns load
+ { 2 copy 0 get search { pop pop pop 1 get exec exit } if pop pop }
+ forall
+ }
+ loop closefile
+ }
+forall
+csr closefile
+
+ % Copy the definition of the root font.
+
+dup buffer readstring pop out exch writestring closefile
+out (
+setpacking
+) writestring
+out closefile
+
+ % Remove the Mac garbage from the outline files.
+
+[ (COD) (CSA) ]
+ { CDir (/) concatstrings (JIS83-1_) concatstrings
+ 1 index concatstrings macrfile
+ exch OutDot exch concatstrings
+ QUIET not { (Writing ) print dup = flush } if
+ (w) file
+ % Stack: infile outfile
+ { 1 index buffer readstring exch
+ % Stack: infile outfile noteof substring
+ 2 index exch writestring not { exit } if
+ }
+ loop closefile closefile
+ }
+forall
+
+ } bind def
+
+% If the program was invoked from the command line, run it now.
+[ .shellarguments
+ { counttomark 5 eq
+ { convert
+ QUIET not { (Done.\n) print flush } if
+ }
+ { cleartomark
+ (Usage: gsnd -- rollconv.ps FName OutBase InDir CDir OutDir\n) print
+ ( e.g.: gsnd -- rollconv.ps HGMinchoE mincho HGfonts/Mincho HGfonts/Mincho HGfonts/gs\n) print flush
+ mark
+ }
+ ifelse
+ }
+if pop
diff --git a/lib/st640ih.upp b/lib/st640ih.upp
new file mode 100644
index 00000000..8016042f
--- /dev/null
+++ b/lib/st640ih.upp
@@ -0,0 +1,60 @@
+-supModel="Epson Stylus Color 640, 1440x720DpI, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/FSCMYK32
+-dupOutputFormat=/EscP2XY
+-r1440x720
+-dupMargins="{ 9.0 24.0 9.0 9.0}"
+-dupBlackTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupCyanTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupMagentaTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupYellowTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveXPasses=2
+-dupOutputXStep=2
+-dupWeaveYPasses=8
+-dupOutputPins=30
+-dupWeaveYFeeds="{15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15}"
+-dupWeaveXStarts="{0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0}"
+-dupWeaveYOffset=38
+-dupWeaveInitialYFeeds="{ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 15}"
+-dupWeaveInitialXStarts="{0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0}"
+-dupWeaveInitialPins="{ 15 9 18 12 6 15 9 18 27 21 30 24 18 27 21 30}"
+-dupFormatYabsolute
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+ 1b5501
+ 1b2865 0200 0002
+ 1b284b 0200 0002
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupXStepCommand="<1b285c 0400 a005 0100 0000>"
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/st640ihg.upp b/lib/st640ihg.upp
new file mode 100644
index 00000000..f48b36d2
--- /dev/null
+++ b/lib/st640ihg.upp
@@ -0,0 +1,45 @@
+-supModel="Epson Stylus Color 640, 1440x720DpI, Grayscale, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2XY
+-r1440x720
+-dupMargins="{ 9.0 24.0 9.0 9.0}"
+-dupWhiteTransfer="{
+ 0.30000000 0.25411765 0.20862745 0.18509804 0.16313725 0.14588235 0.12862745
+ 0.11450980 0.10196078 0.09098039 0.08156863 0.07215686 0.06431373 0.05490196
+ 0.04549020 0.03764706 0.02980392 0.02196078 0.01254902 0.00627451 0.00000000
+}"
+-dupOutputComponentOrder="{ 0 }"
+-dupWeaveXPasses=2
+-dupOutputXStep=2
+-dupWeaveYPasses=8
+-dupOutputPins=30
+-dupWeaveYFeeds="{15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15}"
+-dupWeaveXStarts="{0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0}"
+-dupWeaveYOffset=38
+-dupWeaveInitialYFeeds="{ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 15}"
+-dupWeaveInitialXStarts="{0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0}"
+-dupWeaveInitialPins="{ 15 9 18 12 6 15 9 18 27 21 30 24 18 27 21 30}"
+-dupFormatYabsolute
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+ 1b5501
+ 1b2865 0200 0002
+ 1b284b 0200 0002
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupXStepCommand="<1b285c 0400 a005 0100 0000>"
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/st640p.upp b/lib/st640p.upp
new file mode 100644
index 00000000..75b0c716
--- /dev/null
+++ b/lib/st640p.upp
@@ -0,0 +1,52 @@
+-supModel="Epson Stylus Color 640, 720x720DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/FSCMYK32
+-dupOutputFormat=/EscP2
+-r720x720
+-dupMargins="{ 9.0 24.0 9.0 9.0}"
+-dupBlackTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupCyanTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupMagentaTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupYellowTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveYPasses=8
+-dupOutputPins=32
+-dupWeaveYFeeds="{31 31 31 31 37 33 33 29}"
+-dupWeaveInitialYFeeds="{1 1 1 1 1 1 1 25}"
+-dupWeaveInitialPins="{ 4 24 28 32 19 15 11 7}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b5501
+ 1b2865 0200 0002
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/st640pg.upp b/lib/st640pg.upp
new file mode 100644
index 00000000..ea67cc78
--- /dev/null
+++ b/lib/st640pg.upp
@@ -0,0 +1,37 @@
+-supModel="Epson Stylus Color 640, 720x720DpI, Grayscale, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r720x720
+-dupMargins="{ 9.0 24.0 9.0 9.0}"
+-dupWhiteTransfer="{
+ 0.30000000 0.25411765 0.20862745 0.18509804 0.16313725 0.14588235 0.12862745
+ 0.11450980 0.10196078 0.09098039 0.08156863 0.07215686 0.06431373 0.05490196
+ 0.04549020 0.03764706 0.02980392 0.02196078 0.01254902 0.00627451 0.00000000
+}"
+-dupOutputComponentOrder="{ 0 }"
+-dupWeaveYPasses=8
+-dupOutputPins=32
+-dupWeaveYFeeds="{31 31 31 31 37 33 33 29}"
+-dupWeaveInitialYFeeds="{1 1 1 1 1 1 1 25}"
+-dupWeaveInitialPins="{ 4 24 28 32 19 15 11 7}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b5501
+ 1b2865 0200 0002
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/st640pl.upp b/lib/st640pl.upp
new file mode 100644
index 00000000..afe83acc
--- /dev/null
+++ b/lib/st640pl.upp
@@ -0,0 +1,52 @@
+-supModel="Epson Stylus Color 640, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/FSCMYK32
+-dupOutputFormat=/EscP2
+-r360x360
+-dupMargins="{ 9.0 24.0 9.0 9.0}"
+-dupBlackTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupCyanTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupMagentaTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupYellowTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.30000000
+}"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveYPasses=4
+-dupOutputPins=32
+-dupWeaveYFeeds="{33 30 35 30}"
+-dupWeaveInitialYFeeds="{1 1 1 29}"
+-dupWeaveInitialPins="{ 8 16 32 23}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 0A
+ 1b5501
+ 1b2865 0200 0002
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/st640plg.upp b/lib/st640plg.upp
new file mode 100644
index 00000000..b5fb5bf4
--- /dev/null
+++ b/lib/st640plg.upp
@@ -0,0 +1,37 @@
+-supModel="Epson Stylus Color 640, 360x360DpI, Grayscale, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r360x360
+-dupMargins="{ 9.0 24.0 9.0 9.0}"
+-dupWhiteTransfer="{
+ 0.30000000 0.25411765 0.20862745 0.18509804 0.16313725 0.14588235 0.12862745
+ 0.11450980 0.10196078 0.09098039 0.08156863 0.07215686 0.06431373 0.05490196
+ 0.04549020 0.03764706 0.02980392 0.02196078 0.01254902 0.00627451 0.00000000
+}"
+-dupOutputComponentOrder="{ 0 }"
+-dupWeaveYPasses=4
+-dupOutputPins=32
+-dupWeaveYFeeds="{33 30 35 30}"
+-dupWeaveInitialYFeeds="{1 1 1 29}"
+-dupWeaveInitialPins="{ 8 16 32 23}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 0A
+ 1b5501
+ 1b2865 0200 0002
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/stc.upp b/lib/stc.upp
new file mode 100644
index 00000000..1264412b
--- /dev/null
+++ b/lib/stc.upp
@@ -0,0 +1,56 @@
+-supModel="Epson Stylus Color I (and PRO Series), 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r360x360
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupWeaveYPasses=4
+-dupOutputPins=15
+-dupWeaveYFeeds="{15 15 15 15}"
+-dupWeaveInitialYFeeds="{1 1 1 13}"
+-dupWeaveInitialPins="{ 4 15 11 7}"
+-dupBlackTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2869 0100 00
+ 1b2855 0100 0A
+ 1b5500
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc1520h.upp b/lib/stc1520h.upp
new file mode 100644
index 00000000..7dfa87d8
--- /dev/null
+++ b/lib/stc1520h.upp
@@ -0,0 +1,61 @@
+-supModel="Epson Stylus Color 1520, 1440x720DpI, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2XY
+-r1440x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupCyanTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupMagentaTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupYellowTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveXPasses=2
+-dupOutputXStep=2
+-dupWeaveYPasses=4
+-dupOutputPins=62
+-dupWeaveYFeeds="{31 31 31 31 31 31 31 31}"
+-dupWeaveXStarts="{0 1 0 1 1 0 1 0}"
+-dupWeaveYOffset=18
+-dupWeaveInitialYFeeds="{ 3 3 3 3 3 3 3 31}"
+-dupWeaveInitialXStarts="{0 1 0 1 1 0 1 0}"
+-dupWeaveInitialPins="{ 13 20 27 34 41 48 55 62}"
+-dupFormatYabsolute
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b2873 0100 02
+ 1b5501
+ 1b2865 0200 0001
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupXStepCommand="<1b285c 0400 a005 0100>"
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc2.upp b/lib/stc2.upp
new file mode 100644
index 00000000..4f7a32ee
--- /dev/null
+++ b/lib/stc2.upp
@@ -0,0 +1,56 @@
+-supModel="Epson Stylus Color II / IIs, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r360x360
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupWeaveYPasses=3
+-dupOutputPins=20
+-dupWeaveYFeeds="{20 20 20}"
+-dupWeaveInitialYFeeds="{1 1 19}"
+-dupWeaveInitialPins="{ 7 20 13}"
+-dupBlackTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2869 0100 00
+ 1b2855 0100 0A
+ 1b5500
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc200_h.upp b/lib/stc200_h.upp
new file mode 100644
index 00000000..ec093699
--- /dev/null
+++ b/lib/stc200_h.upp
@@ -0,0 +1,54 @@
+-supModel="Epson Stylus Color 200 , 360x720DpI"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2XY
+-r360x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupOutputPins=19
+-dupWeaveYPasses=6
+-dupWeaveXPasses=1
+-dupWeaveYFeeds="{19 19 19 19 19 19}"
+-dupBlackTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b5501
+ 1b2865 0200 0001
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/stc2_h.upp b/lib/stc2_h.upp
new file mode 100644
index 00000000..ddccb65e
--- /dev/null
+++ b/lib/stc2_h.upp
@@ -0,0 +1,56 @@
+-supModel="Epson Stylus Color II, 720x720DpI, Special Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r720x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupWeaveYPasses=6
+-dupOutputPins=20
+-dupWeaveYFeeds="{20 20 19 22 16 23}"
+-dupWeaveInitialYFeeds="{1 1 1 1 1 19}"
+-dupWeaveInitialPins="{ 4 20 7 17 10 13}"
+-dupBlackTransfer="{
+ 0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
+ 0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
+ 0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
+ 0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
+ 0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
+ 0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
+ 0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
+ 0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
+ 0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
+ 0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
+ 0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
+ 0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
+ 0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
+}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2869 0100 00
+ 1b2855 0100 05
+ 1b5500
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc2s_h.upp b/lib/stc2s_h.upp
new file mode 100644
index 00000000..81183dd6
--- /dev/null
+++ b/lib/stc2s_h.upp
@@ -0,0 +1,60 @@
+-supModel="Epson Stylus Color IIs, 720x720DpI, Special Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2XY
+-r720x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{
+ 0.0000 0.0003 0.0027 0.0056 0.0085 0.0120 0.0156 0.0196
+ 0.0227 0.0260 0.0292 0.0323 0.0354 0.0386 0.0416 0.0450
+ 0.0503 0.0564 0.0630 0.0711 0.0799 0.0905 0.1038 0.1169
+ 0.1321 0.1522 0.1761 0.2011 0.2285 0.2678 0.3102 0.3637
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0008 0.0055 0.0106 0.0152 0.0201 0.0248 0.0298
+ 0.0344 0.0393 0.0443 0.0490 0.0536 0.0585 0.0630 0.0683
+ 0.0738 0.0803 0.0870 0.0955 0.1042 0.1149 0.1283 0.1408
+ 0.1552 0.1744 0.1970 0.2197 0.2441 0.2797 0.3169 0.3637
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0008 0.0055 0.0106 0.0152 0.0201 0.0248 0.0298
+ 0.0344 0.0393 0.0443 0.0490 0.0536 0.0585 0.0630 0.0683
+ 0.0738 0.0803 0.0870 0.0955 0.1042 0.1149 0.1283 0.1408
+ 0.1552 0.1744 0.1970 0.2197 0.2441 0.2797 0.3169 0.3637
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0008 0.0055 0.0106 0.0152 0.0201 0.0248 0.0298
+ 0.0344 0.0393 0.0443 0.0490 0.0536 0.0585 0.0630 0.0683
+ 0.0738 0.0803 0.0870 0.0955 0.1042 0.1149 0.1283 0.1408
+ 0.1552 0.1744 0.1970 0.2197 0.2441 0.2797 0.3169 0.3637
+}"
+-dupFormatYabsolute
+-dupWeaveYPasses=6
+-dupWeaveXPasses=2
+-dupOutputPins=20
+-dupWeaveYFeeds="{10 10 10 10 10 11 10 10 10 10 10 9}"
+-dupWeaveXStarts="{0 1 0 1 0 1 0 1 0 1 0 1}"
+-dupWeaveInitialYFeeds="{ 1 1 1 1 1 1 1 1 1 1 1 1}"
+-dupWeaveInitialXStarts="{0 1 0 1 0 1 1 0 1 0 1 0}"
+-dupWeaveInitialPins="{ 2 17 5 20 8 13 6 11 9 14 2 17}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2869 0100 00
+ 1b2855 0100 05
+ 1b5500
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc300.upp b/lib/stc300.upp
new file mode 100644
index 00000000..90fcc58c
--- /dev/null
+++ b/lib/stc300.upp
@@ -0,0 +1,63 @@
+-supModel="Epson Stylus Color 300, 360x360 dpi, colour, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscNozzleMap
+-r360x360
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupWeaveYPasses=6
+-dupOutputPins=11
+-dupWeaveYFeeds="{11 11 11 11 11 11}"
+-dupWeaveInitialYFeeds="{1 1 1 1 1 7}"
+-dupWeaveInitialPins="{ 2 11 9 7 5 3}"
+-dupWeaveYOffset=0
+-dupNozzleMapRowsPerPass=64
+-dupNozzleMapPatternRepeat=6
+-dupNozzleMapRowMask="{ 2 4 1 3 0 0 }"
+-dupNozzleMapMaskScanOffset="{ 0 1 2 3 0 0 }"
+-dupBlackTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+}"
+
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b7c000900802a2c640316110524
+ 1b285208000052454d4f544531
+ 1b000000
+ 1b2847 0100 01
+ 1b2855 0100 0A
+ 1b2843 0200 7210
+ 1b5501
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc300bl.upp b/lib/stc300bl.upp
new file mode 100644
index 00000000..04024993
--- /dev/null
+++ b/lib/stc300bl.upp
@@ -0,0 +1,43 @@
+-supModel="Epson Stylus Color 300, 180x180 dpi, black only, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscNozzleMap
+-r360x180
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupWeaveYPasses=1
+-dupOutputPins=31
+-dupNozzleMapRowsPerPass=64
+-dupNozzleMapPatternRepeat=6
+-dupNozzleMapRowMask="{ 0 0 1 0 1 1}"
+-dupNozzleMapMaskScanOffset="{ 0 0 0 0 1 2 }"
+-dupWhiteTransfer="{
+1.0 0.921295345 0.846429467 0.775337517 0.707954228
+0.644212425 0.584044278 0.527380228 0.474149585 0.424279869
+0.377697408 0.334326446 0.294089675 0.256907612 0.222698912
+0.191379622 0.162863538 0.137061611 0.113881744 0.0932285339
+0.0750028 0.0591011234 0.0454152822 0.0338314585 0.0242292974
+0.0164806321 0.0104477014 0.00598061318 0.00291339168 0.00105723308
+0.000186894162 0.0
+}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b7c000900802a2c640316110524
+ 1b285208000052454d4f544531
+ 1b000000
+ 1b2847 0100 01
+ 1b2855 0100 14
+ 1b2843 0200 7210
+ 1b5501
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc300bm.upp b/lib/stc300bm.upp
new file mode 100644
index 00000000..f289610c
--- /dev/null
+++ b/lib/stc300bm.upp
@@ -0,0 +1,46 @@
+-supModel="Epson Stylus Color 300, 360x360 dpi, black only, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceGray
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscNozzleMap
+-r360x360
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupWeaveYPasses=2
+-dupOutputPins=31
+-dupWeaveYFeeds="{31 31}"
+-dupWeaveInitialYFeeds="{1 31}"
+-dupWeaveInitialPins="{16 31}"
+-dupNozzleMapRowsPerPass=64
+-dupNozzleMapPatternRepeat=6
+-dupNozzleMapRowMask="{ 0 0 1 0 1 1}"
+-dupNozzleMapMaskScanOffset="{ 0 0 0 0 2 4 }"
+-dupWhiteTransfer="{
+1.0 0.921295345 0.846429467 0.775337517 0.707954228
+0.644212425 0.584044278 0.527380228 0.474149585 0.424279869
+0.377697408 0.334326446 0.294089675 0.256907612 0.222698912
+0.191379622 0.162863538 0.137061611 0.113881744 0.0932285339
+0.0750028 0.0591011234 0.0454152822 0.0338314585 0.0242292974
+0.0164806321 0.0104477014 0.00598061318 0.00291339168 0.00105723308
+0.000186894162 0.0
+}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b7c000900802a2c640316110524
+ 1b285208000052454d4f544531
+ 1b000000
+ 1b2847 0100 01
+ 1b2855 0100 0a
+ 1b2843 0200 7210
+ 1b5501
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc500p.upp b/lib/stc500p.upp
new file mode 100644
index 00000000..c9d2f0b8
--- /dev/null
+++ b/lib/stc500p.upp
@@ -0,0 +1,51 @@
+-supModel="Epson Stylus Color 500, 360x360DpI, not Weaved, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r360x360
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{
+ 0.0000 0.0008 0.0075 0.0155 0.0235 0.0331 0.0430 0.0540
+ 0.0625 0.0714 0.0804 0.0889 0.0973 0.1061 0.1143 0.1239
+ 0.1382 0.1551 0.1732 0.1956 0.2196 0.2488 0.2854 0.3215
+ 0.3633 0.4185 0.4841 0.5529 0.6284 0.7365 0.8529 1.0000
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0021 0.0152 0.0291 0.0418 0.0552 0.0681 0.0818
+ 0.0947 0.1082 0.1218 0.1347 0.1474 0.1607 0.1732 0.1877
+ 0.2029 0.2208 0.2393 0.2626 0.2866 0.3159 0.3528 0.3873
+ 0.4268 0.4797 0.5417 0.6042 0.6712 0.7692 0.8714 1.0000
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0021 0.0152 0.0291 0.0418 0.0552 0.0681 0.0818
+ 0.0947 0.1082 0.1218 0.1347 0.1474 0.1607 0.1732 0.1877
+ 0.2029 0.2208 0.2393 0.2626 0.2866 0.3159 0.3528 0.3873
+ 0.4268 0.4797 0.5417 0.6042 0.6712 0.7692 0.8714 1.0000
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0021 0.0152 0.0291 0.0418 0.0552 0.0681 0.0818
+ 0.0947 0.1082 0.1218 0.1347 0.1474 0.1607 0.1732 0.1877
+ 0.2029 0.2208 0.2393 0.2626 0.2866 0.3159 0.3528 0.3873
+ 0.4268 0.4797 0.5417 0.6042 0.6712 0.7692 0.8714 1.0000
+}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2869 0100 01
+ 1b2855 0100 0A
+ 1b5500
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc500ph.upp b/lib/stc500ph.upp
new file mode 100644
index 00000000..59db83ca
--- /dev/null
+++ b/lib/stc500ph.upp
@@ -0,0 +1,51 @@
+-supModel="Epson Stylus Color 500, 720x720DpI, not Weaved, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r720x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{
+ 0.0000 0.0003 0.0027 0.0056 0.0085 0.0120 0.0156 0.0196
+ 0.0227 0.0260 0.0292 0.0323 0.0354 0.0386 0.0416 0.0450
+ 0.0503 0.0564 0.0630 0.0711 0.0799 0.0905 0.1038 0.1169
+ 0.1321 0.1522 0.1761 0.2011 0.2285 0.2678 0.3102 0.3637
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0008 0.0055 0.0106 0.0152 0.0201 0.0248 0.0298
+ 0.0344 0.0393 0.0443 0.0490 0.0536 0.0585 0.0630 0.0683
+ 0.0738 0.0803 0.0870 0.0955 0.1042 0.1149 0.1283 0.1408
+ 0.1552 0.1744 0.1970 0.2197 0.2441 0.2797 0.3169 0.3637
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0008 0.0055 0.0106 0.0152 0.0201 0.0248 0.0298
+ 0.0344 0.0393 0.0443 0.0490 0.0536 0.0585 0.0630 0.0683
+ 0.0738 0.0803 0.0870 0.0955 0.1042 0.1149 0.1283 0.1408
+ 0.1552 0.1744 0.1970 0.2197 0.2441 0.2797 0.3169 0.3637
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0008 0.0055 0.0106 0.0152 0.0201 0.0248 0.0298
+ 0.0344 0.0393 0.0443 0.0490 0.0536 0.0585 0.0630 0.0683
+ 0.0738 0.0803 0.0870 0.0955 0.1042 0.1149 0.1283 0.1408
+ 0.1552 0.1744 0.1970 0.2197 0.2441 0.2797 0.3169 0.3637
+}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2869 0100 01
+ 1b2855 0100 05
+ 1b5500
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc600ih.upp b/lib/stc600ih.upp
new file mode 100644
index 00000000..543959ab
--- /dev/null
+++ b/lib/stc600ih.upp
@@ -0,0 +1,61 @@
+-supModel="Epson Stylus Color 600, 1440x720DpI, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2XY
+-r1440x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupCyanTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupMagentaTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupYellowTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveXPasses=2
+-dupOutputXStep=2
+-dupWeaveYPasses=8
+-dupOutputPins=30
+-dupWeaveYFeeds="{15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15}"
+-dupWeaveXStarts="{0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0}"
+-dupWeaveYOffset=38
+-dupWeaveInitialYFeeds="{ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 15}"
+-dupWeaveInitialXStarts="{0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0}"
+-dupWeaveInitialPins="{ 15 9 18 12 6 15 9 18 27 21 30 24 18 27 21 30}"
+-dupFormatYabsolute
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+ 1b5501
+ 1b2865 0200 0002
+ 1b284b 0200 0002
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupXStepCommand="<1b285c 0400 a005 0100 0000>"
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc600p.upp b/lib/stc600p.upp
new file mode 100644
index 00000000..176dc2a1
--- /dev/null
+++ b/lib/stc600p.upp
@@ -0,0 +1,37 @@
+-supModel="Epson Stylus Color 600, 720x720DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r720x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{ 0.0000 0.0329 0.0706 0.1160 0.2392 0.7955 }"
+-dupCyanTransfer="{ 0.0000 0.0602 0.1133 0.1961 0.2945 0.3885 }"
+-dupMagentaTransfer="{ 0.0000 0.0452 0.0836 0.1215 0.1493 0.1749 }"
+-dupYellowTransfer="{ 0.0000 0.0350 0.0914 0.1567 0.2430 0.2934 }"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveYPasses=8
+-dupOutputPins=32
+-dupWeaveYFeeds="{31 31 31 31 37 33 33 29}"
+-dupWeaveInitialYFeeds="{1 1 1 1 1 1 1 25}"
+-dupWeaveInitialPins="{ 4 24 28 32 19 15 11 7}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b5501
+ 1b2865 0200 0002
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc600pl.upp b/lib/stc600pl.upp
new file mode 100644
index 00000000..808230d2
--- /dev/null
+++ b/lib/stc600pl.upp
@@ -0,0 +1,37 @@
+-supModel="Epson Stylus Color 600, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r360x360
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{ 0.0000 0.0553 0.1158 0.1998 0.4321 1.0000 }"
+-dupCyanTransfer="{ 0.0000 0.1188 0.2272 0.3745 0.5396 0.6145 }"
+-dupMagentaTransfer="{ 0.0000 0.0851 0.1512 0.2111 0.2606 0.2818 }"
+-dupYellowTransfer="{ 0.0000 0.0679 0.1742 0.3129 0.4587 0.5389 }"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveYPasses=4
+-dupOutputPins=32
+-dupWeaveYFeeds="{33 30 35 30}"
+-dupWeaveInitialYFeeds="{1 1 1 29}"
+-dupWeaveInitialPins="{ 8 16 32 23}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 0A
+ 1b5501
+ 1b2865 0200 0002
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc640p.upp b/lib/stc640p.upp
new file mode 100644
index 00000000..d68859a8
--- /dev/null
+++ b/lib/stc640p.upp
@@ -0,0 +1,36 @@
+-supModel="Epson Stylus Color 640, 720x720DpI, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r720x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{ 0.0 0.04 0.08 0.16 0.20 0.35}"
+-dupCyanTransfer="{ 0.0 0.06 0.12 0.18 0.24 0.45}"
+-dupMagentaTransfer="{ 0.0 0.05 0.10 0.15 0.20 0.42}"
+-dupYellowTransfer="{ 0.0 0.04 0.08 0.16 0.20 0.37}"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveYPasses=8
+-dupOutputPins=32
+-dupWeaveYFeeds="{31 31 31 31 37 33 33 29}"
+-dupWeaveInitialYFeeds="{1 1 1 1 1 1 1 25}"
+-dupWeaveInitialPins="{ 4 24 28 32 19 15 11 7}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b5501
+ 1b2865 0200 0002
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/stc800ih.upp b/lib/stc800ih.upp
new file mode 100644
index 00000000..e2e41570
--- /dev/null
+++ b/lib/stc800ih.upp
@@ -0,0 +1,61 @@
+-supModel="Epson Stylus Color 800, 1440x720DpI, Inkjet Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2XY
+-r1440x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupCyanTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupMagentaTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupYellowTransfer="{
+ 0.00000000 0.00627451 0.01254902 0.02196078 0.02980392 0.03764706 0.04549020
+ 0.05490196 0.06431373 0.07215686 0.08156863 0.09098039 0.10196078 0.11450980
+ 0.12862745 0.14588235 0.16313725 0.18509804 0.20862745 0.25411765 0.40000000
+}"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveXPasses=2
+-dupOutputXStep=2
+-dupWeaveYPasses=4
+-dupOutputPins=62
+-dupWeaveYFeeds="{31 31 31 31 31 31 31 31}"
+-dupWeaveXStarts="{0 1 0 1 1 0 1 0}"
+-dupWeaveYOffset=18
+-dupWeaveInitialYFeeds="{ 3 3 3 3 3 3 3 31}"
+-dupWeaveInitialXStarts="{0 1 0 1 1 0 1 0}"
+-dupWeaveInitialPins="{ 13 20 27 34 41 48 55 62}"
+-dupFormatYabsolute
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b2873 0100 02
+ 1b5501
+ 1b2865 0200 0001
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupXStepCommand="<1b285c 0400 a005 0100 0000>"
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc800p.upp b/lib/stc800p.upp
new file mode 100644
index 00000000..13a574ef
--- /dev/null
+++ b/lib/stc800p.upp
@@ -0,0 +1,37 @@
+-supModel="Epson Stylus Color 800, 720x720DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r720x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{ 0.0000 0.0329 0.0706 0.1160 0.2392 0.7955 }"
+-dupCyanTransfer="{ 0.0000 0.0602 0.1133 0.1961 0.2945 0.3885 }"
+-dupMagentaTransfer="{ 0.0000 0.0452 0.0836 0.1215 0.1493 0.1749 }"
+-dupYellowTransfer="{ 0.0000 0.0350 0.0914 0.1567 0.2430 0.2934 }"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveYPasses=4
+-dupOutputPins=64
+-dupWeaveYFeeds="{63 63 67 63}"
+-dupWeaveInitialYFeeds="{1 1 1 61}"
+-dupWeaveInitialPins="{ 16 64 47 31}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 05
+ 1b5501
+ 1b2865 0200 0002
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc800pl.upp b/lib/stc800pl.upp
new file mode 100644
index 00000000..f43ee9e1
--- /dev/null
+++ b/lib/stc800pl.upp
@@ -0,0 +1,37 @@
+-supModel="Epson Stylus Color 800, 360x360DpI, Plain Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r360x360
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupBlackTransfer="{ 0.0000 0.0553 0.1158 0.1998 0.4321 1.0000 }"
+-dupCyanTransfer="{ 0.0000 0.1188 0.2272 0.3745 0.5396 0.6145 }"
+-dupMagentaTransfer="{ 0.0000 0.0851 0.1512 0.2111 0.2606 0.2818 }"
+-dupYellowTransfer="{ 0.0000 0.0679 0.1742 0.3129 0.4587 0.5389 }"
+-dupOutputComponentOrder="{ 1 2 3 0 }"
+-dupWeaveYPasses=2
+-dupOutputPins=64
+-dupWeaveYFeeds="{63 65}"
+-dupWeaveInitialYFeeds="{1 65}"
+-dupWeaveInitialPins="{ 33 64}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2855 0100 0A
+ 1b5501
+ 1b2865 0200 0002
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc_h.upp b/lib/stc_h.upp
new file mode 100644
index 00000000..b52fedf3
--- /dev/null
+++ b/lib/stc_h.upp
@@ -0,0 +1,56 @@
+-supModel="Epson Stylus Color I (and PRO Series), 720x720DpI, Special Paper"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r720x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupWeaveYPasses=8
+-dupOutputPins=15
+-dupWeaveYFeeds="{15 15 15 15 15 15 15 15}"
+-dupWeaveInitialYFeeds="{1 1 1 1 1 1 1 8}"
+-dupWeaveInitialPins="{ 15 13 11 9 7 5 3 1}"
+-dupBlackTransfer="{
+ 0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
+ 0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
+ 0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
+ 0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
+}"
+-dupCyanTransfer="{
+ 0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
+ 0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
+ 0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
+ 0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
+}"
+-dupMagentaTransfer="{
+ 0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
+ 0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
+ 0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
+ 0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
+}"
+-dupYellowTransfer="{
+ 0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
+ 0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
+ 0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
+ 0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
+}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2869 0100 00
+ 1b2855 0100 05
+ 1b5500
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
+
diff --git a/lib/stc_l.upp b/lib/stc_l.upp
new file mode 100644
index 00000000..3f20fc7e
--- /dev/null
+++ b/lib/stc_l.upp
@@ -0,0 +1,29 @@
+-supModel="Epson Stylus Color I (and PRO Series), 360x360DpI, noWeave"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r360x360
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupComponentBits="{1 1 1 1}"
+-dupWeaveYPasses=4
+-dupOutputPins=15
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2869 0100 00
+ 1b2855 0100 0A
+ 1b5500
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/stcany.upp b/lib/stcany.upp
new file mode 100644
index 00000000..5eea38f3
--- /dev/null
+++ b/lib/stcany.upp
@@ -0,0 +1,27 @@
+-supModel="Any Epson Stylus Color, 360x360DpI"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYK
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r360x360
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupComponentBits="{1 1 1 1}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2869 0100 01
+ 1b2855 0100 0A
+ 1b5500
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/stcany_h.upp b/lib/stcany_h.upp
new file mode 100644
index 00000000..73e0ee75
--- /dev/null
+++ b/lib/stcany_h.upp
@@ -0,0 +1,27 @@
+-supModel="Any Epson Stylus Color, 720x720DpI"
+-sDEVICE=uniprint
+-dNOPAUSE
+-P- -dSAFER
+-dupColorModel=/DeviceCMYKgenerate
+-dupRendering=/ErrorDiffusion
+-dupOutputFormat=/EscP2
+-r720x720
+-dupMargins="{ 9.0 39.96 9.0 9.0}"
+-dupComponentBits="{1 1 1 1}"
+-dupBeginPageCommand="<
+ 00 00 00
+ 1b01 40 45 4a 4c 20 31 32 38 34 2e 34 0a
+ 40 45 4a 4c 20 20 20 20 20 0a
+ 1b40 1b40
+ 1b2847 0100 01
+ 1b2869 0100 01
+ 1b2855 0100 05
+ 1b5500
+ 1b2843 0200 0000
+ 1b2863 0400 0000 0000
+>"
+-dupAdjustPageLengthCommand
+-dupAdjustTopMarginCommand
+-dupAdjustBottomMarginCommand
+-dupEndPageCommand="(\033@\014)"
+-dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)"
diff --git a/lib/stcinfo.ps b/lib/stcinfo.ps
new file mode 100644
index 00000000..beda3a29
--- /dev/null
+++ b/lib/stcinfo.ps
@@ -0,0 +1,794 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% stcinfo.ps
+% Epson Stylus-Color Printer-Driver
+
+% The purpose of this file is to print & show Parameters of the
+% stcolor-driver. If not run on ghostscript/stcolor, it prints
+% something like a color-chart.
+
+% use either existing STCinfo-dictionary, retrieve new one or create dummy
+
+statusdict begin product end
+dup (Ghostscript) eq 1 index (Artifex Ghostscript) eq or
+exch (AFPL Ghostscript) eq or{
+
+ currentdevice getdeviceprops .dicttomark
+ dup /Name get (stcolor) eq /STCi_onstc exch def
+ /STCinfo where {/STCinfo get exch pop} if
+ /STCinfo exch def
+
+}{
+
+ /STCinfo 10 dict def
+ STCinfo begin /Name (unknown) def end
+ /STCi_onstc false def
+
+}ifelse
+
+% Next Block are procedures to generate the color-triangles.
+% you may wish to separate them, just look ahead for the name
+% given in the next line to achieve that.
+% Begin: colortri_procedures
+
+% Plot the CIE-XY-triangle (or something like that)
+
+% /colortri_mat Conversion matrix RGB -> XYZ
+% /colortri_bg procedure, that takes X/Y-Values and delivers the
+% "background color" as RGB-Values, default is:
+% {pop pop 0.85 dup dup}
+
+% The default matrix was taken from:
+% Color spaces FAQ - David Bourgin
+% Date: 15/6/94 (items 5.3 and 6 updated)
+% Last update: 29/6/94
+
+ /colortri_mat [ % RGB -> CIE XYZitu601-1 (D65)
+ 0.4306 0.3415 0.1784
+ 0.2220 0.7067 0.0713
+ 0.0202 0.1295 0.9394
+ ] def
+
+ /colortri_bg {pop pop 0.85 dup dup} bind def
+
+% +---------------------------------------------------------------------+
+% | Besides from fixing bugs, nothing should be changed below this line |
+% +---------------------------------------------------------------------+
+
+% Arbitrary operation on a pair of vectors, *CHANGES* 1st.
+% invoke: Vaccu Vop op vop
+ /vop {
+ bind 0 1 3 index length 1 sub {
+ 3 index 1 index get 3 index 2 index get 3 index exec 4 index 3 1 roll put
+ } for pop pop
+ } bind def
+
+ /vsub { {sub} vop } bind def % subtract two vectors
+ /vmul { {mul} vop } bind def % multiply two vectors
+
+% Compute sum of vectors elements
+ /vsum {0.0 exch{add}forall} bind def
+
+% Sum up products of elements
+ /veqn { [ 3 -1 roll {} forall ] exch vmul vsum } bind def
+
+% Find index of |maximum| in array
+ /imax {
+ dup 0 get abs 0 exch % array i v[i]
+ 1 1 4 index length 1 sub {
+ 3 index 1 index get abs dup 3 index gt {4 2 roll}if pop pop
+ } for
+ 3 -1 roll pop
+ } bind def
+
+% Procedure to *CHANGE* RGB-Values into XYZ-Values
+ /rgb2xyz {
+ 0 3 6 { colortri_mat exch 3 getinterval 1 index veqn exch } for astore
+ } bind def
+
+% Procedure to *CHANGE* transform rgb->xy
+ /rgb2xy {
+ rgb2xyz
+ dup 0 get 1 index 1 get 2 index vsum % XYZ X Y sum
+ dup 0 ne {
+ exch 1 index div 3 1 roll div % XYZ y x
+ 2 index exch 0 exch put % xYZ y
+ 1 index exch 1 exch put % xyZ
+ }{
+ pop pop pop dup 0 0 put dup 0 1 put
+ } ifelse
+ 0 2 getinterval
+ } bind def
+
+% So here we go with our procedure
+
+/colortri { %Usage: box #pixels
+ save
+ 1 index type /arraytype eq {exch 8}{3 1 roll} ifelse % Default scale
+ /colortri_scale exch def
+ /colortri_box exch def
+
+% Prepare some useful constants for xy -> RGB conversion
+
+ /colsum [ % Array with column-sums
+ 0 1 2{0 exch 3 1 index 6 add{colortri_mat exch get add}for}for
+ ] def
+
+ /Xrow colortri_mat 0 3 getinterval def % two rows from colortri_mat
+ /Yrow colortri_mat 3 3 getinterval def
+
+% Avoid allocating new arrays
+ /xcoeff 3 array def
+ /ycoeff 3 array def
+
+% Procedure to derive RGB-Values form X,Y
+ /xy2rgb{ aload pop
+ dup dup dup ycoeff astore colsum vmul Yrow vsub imax
+ 3 index dup dup xcoeff astore colsum vmul Xrow vsub imax
+ 3 -1 roll 1 index 1 index gt{
+ xcoeff ycoeff /xcoeff exch def /ycoeff exch def pop 3 -1 roll pop
+ }{
+ 3 1 roll pop pop
+ } ifelse
+ 1e-6 lt { % No Pivot ?
+ pop colortri_bg xcoeff astore pop
+ }{ % Have a Pivot
+ dup ycoeff exch get neg
+ 0 1 2 { dup ycoeff exch get 2 index div ycoeff 3 1 roll put} for
+ pop ycoeff 1 index 0 put
+
+ xcoeff 1 index get
+ 0 1 2 {
+ ycoeff 1 index get 2 index mul xcoeff 2 index get add
+ xcoeff 3 1 roll put
+ } for
+ pop xcoeff 1 index 0 put
+ xcoeff imax 1e-6 lt { % no Pivot ?
+ pop pop colortri_bg xcoeff astore pop
+ }{
+ dup 2 index or 3 exch sub
+ xcoeff 1 index get xcoeff 3 index get div neg
+ xcoeff exch 3 index exch put
+ xcoeff 1 index 1 put
+ ycoeff exch get ycoeff 2 index get xcoeff 4 -1 roll get mul add
+ xcoeff 3 1 roll put
+ 0 1 2 {
+ xcoeff exch get dup -0.0015 lt exch 1.0015 gt or {
+ colortri_bg xcoeff astore dup exit
+ } if
+ } for
+ pop pop xcoeff
+ } ifelse
+ } ifelse
+ } bind def
+
+% Compute the displayed range
+ [ 1 1 1 ] rgb2xy
+ dup 0 get /colortri_x0 exch def /colortri_dx colortri_x0 def
+ 1 get /colortri_y0 exch def /colortri_dy colortri_y0 def
+ [[0 0 1][0 1 0][0 1 1][1 0 0][1 0 1][1 1 0]] {
+ rgb2xy
+ dup 0 get
+ dup colortri_x0 lt {/colortri_x0 1 index def}if
+ dup colortri_dx gt {/colortri_dx 1 index def}if
+ pop 1 get
+ dup colortri_y0 lt {/colortri_y0 1 index def}if
+ dup colortri_dy gt {/colortri_dy 1 index def}if
+ pop
+ } forall
+ colortri_dx colortri_x0 sub /colortri_dx exch def
+ colortri_dy colortri_y0 sub /colortri_dy exch def
+%
+
+% determine the scale
+ colortri_box 2 get colortri_box 0 get sub colortri_dx div % fx
+ colortri_box 3 get colortri_box 1 get sub colortri_dy div % fx fy
+ gt { % fy limits
+ colortri_box 3 get colortri_box 1 get sub
+ dup colortri_dx mul colortri_dy div exch
+ }{ % fx limits
+ colortri_box 2 get colortri_box 0 get sub
+ dup colortri_dy mul colortri_dx div
+ } ifelse
+ dtransform abs colortri_scale div cvi /colortri_ny exch def
+ abs colortri_scale div cvi /colortri_nx exch def
+ colortri_nx colortri_scale mul colortri_ny colortri_scale mul
+ idtransform abs exch abs exch
+ colortri_box 0 get colortri_box 2 get 1 index sub 3 index sub 2 div add
+ colortri_box 1 get colortri_box 3 get 1 index sub 3 index sub 2 div add
+ transform .5 add cvi exch .5 add cvi exch itransform
+ translate scale
+
+% String & indices
+ /colortri_tmp colortri_nx 3 mul string def
+ /colortri_dx colortri_dx colortri_nx 1 sub div def
+ /colortri_dy colortri_dy colortri_ny 1 sub div def
+ /colortri_xy [ colortri_x0 colortri_y0 ] def
+ /colortri_ie colortri_tmp length 3 sub def
+
+ colortri_nx colortri_ny 8 [ colortri_nx 0 0 colortri_ny 0 0 ]
+ {
+ colortri_xy 0 colortri_x0 put
+ 0 3 colortri_ie {
+ colortri_tmp exch % buf ir
+ colortri_xy xy2rgb % buf ir rgb buf ib
+ 2 index 2 index 2 add 2 index 2 get 255 mul cvi put
+ 2 index 2 index 1 add 2 index 1 get 255 mul cvi put
+ 0 get 255 mul cvi put
+ colortri_xy dup 0 exch 0 get colortri_dx add put
+ }for
+ colortri_xy dup 1 exch 1 get colortri_dy add put
+ colortri_tmp
+ } bind
+ false 3 colorimage
+ restore
+} bind def
+
+% [ newpath clippath pathbbox ] colortri showpage % standalone usage
+
+% End: colortri_procedures
+
+% The next section is a group of procedures, that I for myself
+% do no more fully understand, but they do the Job.
+
+% Begin: stcinfo_procedures_1
+
+% fetch a parameter from the dictionary
+/STCiget { STCinfo exch get } bind def
+
+% action upon ProcessColorModel
+/STCimode {
+ /ProcessColorModel STCiget dup
+ /DeviceCMYK eq{pop 2}{/DeviceRGB eq{1}{0}ifelse}ifelse get exec
+} bind def
+
+% print given number of blanks
+/STCipspace {
+ dup 0 gt{ 1 exch 1 exch { pop ( ) print}for }{ pop } ifelse
+} bind def
+
+% print right or left-justified text
+/STCiprint {
+ dup 0 gt { dup 2 index length sub STCipspace } if
+ 1 index print
+ dup 0 lt { neg dup 2 index length sub STCipspace } if
+ pop pop
+} bind def
+
+% floating-point to fixed-length-string conversion
+
+/STCicvs { % number -> string
+
+% Prepare the result
+ 8 string dup 0 ( ) putinterval
+ exch
+
+% Make it unsigned
+ dup 0 lt {neg(-)}{( )}ifelse 0 get exch
+
+ dup 1000 lt 1 index 0 eq 2 index 0.001 ge or and { % floating point
+ (e+) 0
+ }{ % engineering
+ 0 {
+ 1 index 1000.0 ge
+ {3 add exch 1000 div exch}
+ {1 index 1 lt {3 sub exch 1000 mul exch}{exit}ifelse}
+ ifelse
+ }loop
+ dup 0 lt {neg(e-)}{(e+)}ifelse exch
+ }ifelse
+
+% string sign num esig e
+
+% always up to three Integer Digits plus sign
+ 2 index cvi 3 { % string sign num esig e int ind
+ 1 index 10 div cvi dup 10 mul 3 index exch sub cvi
+ (0123456789) exch get 8 index exch 3 index exch put
+ 3 -2 roll 1 sub exch pop dup 0 eq 2 index 0 eq or {exit} if
+ } loop exch pop % string sign num esig e ind
+ 5 index exch 6 -1 roll put % string num esig e
+
+% print either fraction or exponent
+ dup 0 eq { pop pop dup cvi sub % String fraction
+
+ dup 0.0 ne { % Fraction present
+ 0.0005 add 1 index 4 (.) putinterval
+ 5 1 7 { % string frac ind
+ exch 10 mul dup cvi exch 1 index sub % string ind ic nfrac
+ exch (0123456789) exch get 3 -1 roll % string nfrac chr ind
+ exch 3 index 3 1 roll put
+ } for
+ } if
+ pop
+
+ }{ 3 -1 roll pop % string esig e
+
+ exch 2 index exch 4 exch putinterval
+ 7 -1 6 { % string n i
+ 1 index 10 div cvi dup 10 mul 3 index exch sub cvi % string n i n/10
+ (0123456789) exch get 4 index exch 3 index exch put
+ exch pop exch pop
+ } for
+ pop
+ } ifelse
+
+} bind def
+
+% compute colorvalue-steps from transfer & coding
+/STCisteps { % xfer, coding => X-values, Y-Values
+% 2^nbits
+ 2 /BitsPerComponent STCiget dup 11 gt { pop 11 } if exp cvi
+
+% X & Y - Arrays (stack: xv:4 yv:3 xfer:2 coding:1 2^ni:0)
+ dup 1 add array 1 index array 5 2 roll
+
+% compute GS-Color-Value according to the coding-array
+
+ 1 index null eq { % no coding present
+
+ 0 1 2 index 1 sub {
+ dup 6 index exch dup 4 index div put
+ 4 index exch dup 3 index 1 sub div put
+ } for
+
+ }{ % coding-array given
+
+ 1.0 1 index 1 sub div % y step
+ 0 % current index
+ 0 1 4 index 1 sub { % over indices
+ dup 3 index mul
+ {
+ dup 3 index 1 add dup 8 index length ge {pop pop exit} if % i y
+ 7 index exch get le {exit} if
+ 2 index 1 add 3 1 roll 4 -1 roll pop
+ } loop
+ 5 index 3 index get sub
+ 5 index 3 index 1 add get 6 index 4 index get sub div
+ 2 index add 5 index length 1 sub div
+ 2 copy exch dup 0 eq {
+ 10 index exch 0.0 put pop
+ }{
+ dup 10 index exch 1 sub get 3 -1 roll add 2 div
+ 10 index 3 1 roll put
+ }ifelse
+ 7 index 3 1 roll put
+ } for % over indices
+ pop pop
+ } ifelse
+ 4 index 1 index 1.0 put
+
+% Replace the raw y-values by those computed from the transfer-array
+
+ 0 1 2 index 1 sub { % over indices, 2nd
+ dup 5 index exch get
+ dup 5 index length 1 sub mul cvi % -> iy
+ 5 index 1 index get
+ 1 index 1 add 7 index length lt {
+ dup 7 index 3 index 1 add get exch sub
+ 3 index 3 index 9 index length 1 sub div sub mul
+ 7 index length 1 sub mul add
+ } if
+ exch pop exch pop 5 index 3 1 roll put
+ } for % over indices, 2nd
+
+ pop pop pop
+} bind def
+
+/STCibar { % Window X-Values proc => Window
+ 0 1 3 index length 2 sub {
+ dup 3 index exch get exch
+ 1 add 3 index exch get
+ dup 2 index add 2 div 3 index exec % Color to average
+ 4 index 2 get 5 index 0 get sub exch 1 index mul 5 index 0 get add 3 1 roll
+ mul 4 index 0 get add 4 index 3 get 5 index 1 get
+ newpath
+ 2 index 1 index moveto
+ 3 index 1 index lineto
+ 3 index 2 index lineto
+ 2 index 2 index lineto
+ closepath fill
+ pop pop pop pop
+ } for
+ pop pop
+ 0 setgray
+ newpath
+ dup 0 get 1 index 1 get moveto
+ dup 2 get 1 index 1 get lineto
+ dup 2 get 1 index 3 get lineto
+ dup 0 get 1 index 3 get lineto
+ closepath stroke
+ pop
+} bind def
+
+% End: stcinfo_procedures_1
+
+% Begin: stcinfo_preparation
+
+% Compute used area from clippath
+
+/STCi_clip [
+ newpath clippath pathbbox
+ 2 sub 4 1 roll 2 sub 4 1 roll 2 add 4 1 roll 2 add 4 1 roll
+] def
+
+%
+% Perpare the texual messages, assume no stcolor if this fails
+%
+{
+ /STCi_stopped % A Special Mark
+
+% Textual Parameters (an array of pairs of strings)
+ /STCi_l1 0 def
+ /STCi_l2 0 def
+ /STCi_text [
+% Driver-Name & Version
+ (Parameters of)
+ /Name STCiget length /Version STCiget length add 1 add string
+ dup 0 /Name STCiget putinterval dup /Name STCiget length (-)putinterval
+ dup /Name STCiget length 1 add /Version STCiget putinterval
+% Dithering-Algorithm
+ (Dithering)
+ /Dithering STCiget
+ [{( \(Monochrome\))}{( \(RGB\))}{( \(CMYK\))}] STCimode
+ dup length 2 index length add string exch 1 index exch
+ 3 index length exch putinterval dup 3 1 roll exch 0 exch putinterval
+% Flags for the algorithm
+ (Flag4-0) 5 string
+ dup 0 /Flag4 STCiget {(T)}{(f)} ifelse putinterval
+ dup 1 /Flag3 STCiget {(T)}{(f)} ifelse putinterval
+ dup 2 /Flag2 STCiget {(T)}{(f)} ifelse putinterval
+ dup 3 /Flag1 STCiget {(T)}{(f)} ifelse putinterval
+ dup 4 /Flag0 STCiget {(T)}{(f)} ifelse putinterval
+
+% Bits Per Pixel & Bits Per Component
+ (BitsPerPixel) 10 string % (nn -> nxnn)
+ /BitsPerPixel STCiget 1 index cvs length % string used
+ dup 2 index exch ( -> ) putinterval 4 add dup 2 add exch 2 index exch
+ [{(1x)}{(3x)}{(4x)}] STCimode putinterval % String used
+ /BitsPerComponent STCiget 2 index 2 index 2 getinterval cvs length add
+ 0 exch getinterval
+
+ () ()
+% ColorAdjustMatrix
+ (ColorAdjustMatrix)
+ /ColorAdjustMatrix STCiget dup null eq {
+ pop (default)
+ }{
+ { STCicvs } forall
+ [{ % Monochrome
+ 26 string
+ dup 0 6 -1 roll putinterval dup 8 ( ) putinterval
+ dup 9 5 -1 roll putinterval dup 17 ( ) putinterval
+ dup 18 4 -1 roll putinterval
+ }{ % RGB
+ 26 string
+ dup 0 12 -1 roll putinterval dup 8 ( ) putinterval
+ dup 9 11 -1 roll putinterval dup 17 ( ) putinterval
+ dup 18 10 -1 roll putinterval
+
+ () 26 string
+ dup 0 11 -1 roll putinterval dup 8 ( ) putinterval
+ dup 9 10 -1 roll putinterval dup 17 ( ) putinterval
+ dup 18 9 -1 roll putinterval
+
+ () 26 string
+ dup 0 10 -1 roll putinterval dup 8 ( ) putinterval
+ dup 9 9 -1 roll putinterval dup 17 ( ) putinterval
+ dup 18 8 -1 roll putinterval
+ }{
+ 35 string
+ dup 0 19 -1 roll putinterval dup 8 ( ) putinterval
+ dup 9 18 -1 roll putinterval dup 17 ( ) putinterval
+ dup 18 17 -1 roll putinterval dup 26 ( ) putinterval
+ dup 27 16 -1 roll putinterval
+
+ () 35 string
+ dup 0 17 -1 roll putinterval dup 8 ( ) putinterval
+ dup 9 16 -1 roll putinterval dup 17 ( ) putinterval
+ dup 18 15 -1 roll putinterval dup 26 ( ) putinterval
+ dup 27 14 -1 roll putinterval
+
+ () 35 string
+ dup 0 15 -1 roll putinterval dup 8 ( ) putinterval
+ dup 9 14 -1 roll putinterval dup 17 ( ) putinterval
+ dup 18 13 -1 roll putinterval dup 26 ( ) putinterval
+ dup 27 12 -1 roll putinterval
+
+ () 35 string
+ dup 0 13 -1 roll putinterval dup 8 ( ) putinterval
+ dup 9 12 -1 roll putinterval dup 17 ( ) putinterval
+ dup 18 11 -1 roll putinterval dup 26 ( ) putinterval
+ dup 27 10 -1 roll putinterval
+
+ }
+ ] STCimode
+ } ifelse
+ () ()
+
+% Printer Model
+ (Printer-Model) /Model STCiget
+
+% Resolution
+ (Resolution) 15 string % (nnnnnxnnnnn DpI)
+ /HWResolution STCiget 0 get cvi 1 index cvs length
+ dup 2 index exch (x) putinterval 1 add dup 2 index exch 5 getinterval
+ /HWResolution STCiget 1 get cvi exch cvs length add dup 2 index
+ exch ( DpI) putinterval 4 add 0 exch getinterval
+
+% HWsize holds entire Page in Pixels,
+% .HWMargins is [left,bottom,right,top] in Points
+ (Printed Area) 18 string % (nnnnnxnnnnn Pixel)
+ /HWSize STCiget 0 get /.HWMargins STCiget dup 0 get exch 2 get add
+ /HWResolution STCiget 0 get mul 72.0 div sub cvi 1 index cvs length
+ dup 2 index exch (x) putinterval 1 add dup 2 index exch 5 getinterval
+ /HWSize STCiget 1 get /.HWMargins STCiget dup 1 get exch 3 get add
+ /HWResolution STCiget 1 get mul 72.0 div sub cvi exch cvs length add
+ dup 2 index exch ( Pixel) putinterval 6 add 0 exch getinterval
+
+ () ()
+% WeaveMode
+ (Weave-Mode)
+ /noWeave STCiget {
+ (noWeave)
+ }{
+ /Microweave STCiget {(Microweave)}{(Softweave)}ifelse
+ }ifelse
+% Unidirectional
+ (Unidirectional) /Unidirectional STCiget {(ON)}{(off)} ifelse
+% Output coding
+ (OutputCode) /OutputCode STCiget
+% number of heads
+ (escp_Band) /escp_Band STCiget 3 string cvs
+ (escp_Width) /escp_Width STCiget 5 string cvs
+ (escp_Height) /escp_Height STCiget 5 string cvs
+ (escp_Top) /escp_Top STCiget 5 string cvs
+ (escp_Bottom) /escp_Bottom STCiget 5 string cvs
+ ] def
+
+%
+% compute the Proper X & Y-Arrays
+%
+ [{ % Monochrome
+ /Ktransfer STCiget /Kcoding STCiget STCisteps
+ /STCi_yv [ 3 -1 roll ] def
+ /STCi_xv [ 3 -1 roll ] def
+ /STCi_col [[0 0 0]] def
+ /STCi_set [{1.0 exch sub setgray}] def
+ }{ % RGB
+ /Rtransfer STCiget /Rcoding STCiget STCisteps
+ /Gtransfer STCiget /Gcoding STCiget STCisteps
+ /Btransfer STCiget /Bcoding STCiget STCisteps
+ exch 4 -1 roll 6 -1 roll exch 3 -1 roll
+ /STCi_xv [ 5 2 roll ] def
+ /STCi_yv [ 5 2 roll ] def
+ /STCi_col [[1 0 0] [0 1 0] [0 0 1]] def
+ /STCi_set [
+ {1.0 exch sub 1 exch dup setrgbcolor}
+ {1.0 exch sub dup 1 exch setrgbcolor}
+ {1.0 exch sub dup 1 setrgbcolor}
+ ] def
+ }{ % CMYK
+ /Ctransfer STCiget /Ccoding STCiget STCisteps
+ /Mtransfer STCiget /Mcoding STCiget STCisteps exch 3 1 roll
+ /Ytransfer STCiget /Ycoding STCiget STCisteps exch 4 1 roll
+ /Ktransfer STCiget /Kcoding STCiget STCisteps exch 5 1 roll
+ /STCi_yv [ 6 2 roll ] def
+ /STCi_xv [ 6 2 roll ] def
+ /STCi_col [[0 1 1] [1 0 1] [1.0 0.5 0.0] [0 0 0]] def
+ /STCi_set [
+ { 0 0 0 setcmykcolor }
+ { 0 exch 0 0 setcmykcolor }
+ { 0 exch 0 exch 0 setcmykcolor }
+ { 0 exch 0 exch 0 exch setcmykcolor }
+ ] def
+ }
+ ]STCimode
+
+} stopped
+
+{ {/STCi_stopped eq {exit}if}loop true}
+{ {/STCi_stopped eq {exit}if}loop false} ifelse
+
+% End: stcinfo_preparation
+
+% The Next section does the real job
+
+% Begin: stcinfo_execution
+{
+ (%%[ stcinfo.ps: currentdevice is not supported -> colortri ]%%\n) print
+ STCi_clip colortri % The default action
+
+}{
+%
+% Print the text
+%
+ 0 2 STCi_text length 2 sub { dup 1 add exch
+ STCi_text exch get length dup STCi_l1 gt{/STCi_l1 exch def}{pop}ifelse
+ STCi_text exch get length dup STCi_l2 gt{/STCi_l2 exch def}{pop}ifelse
+ } for
+ /STCi_l2 STCi_l2 neg def
+ 0 2 STCi_text length 2 sub {
+ dup 1 add STCi_text exch get exch STCi_text exch get
+ 1 index length 0 gt {
+ dup STCi_l1 STCiprint length 0 gt {(: )}{( )}ifelse print print
+ }{
+ pop pop
+ } ifelse
+ (\n) print
+ } for
+%
+% Deactivate a present ColorAdjust Matrix, if any
+%
+ /ColorAdjustMatrix STCiget null ne STCi_onstc and {
+ mark
+ /ColorAdjustMatrix null
+ currentdevice putdeviceprops pop
+ } if
+%
+% "Show" the text
+%
+ /Times-Roman findfont 10 scalefont setfont
+ /STCi_l1 0 def
+ 0 2 STCi_text length 2 sub {
+ STCi_text exch get stringwidth pop dup STCi_l1 gt {
+ /STCi_l1 exch def
+ }{
+ pop
+ } ifelse
+ } for
+ STCi_l1 STCi_clip 0 get add /STCi_l1 exch def
+
+ STCi_clip 3 get 12 sub
+ 0 2 STCi_text length 2 sub {
+ STCi_text exch get dup length 0 gt {
+ dup stringwidth pop STCi_l1 exch sub 2 index moveto show
+ }{
+ pop
+ } ifelse
+ 12 sub
+ } for
+ pop
+
+ /Courier findfont 10 scalefont setfont
+ /STCi_l2 0 def
+ 1 2 STCi_text length 1 sub {
+ STCi_text exch get stringwidth pop dup STCi_l2 gt {
+ /STCi_l2 exch def
+ }{
+ pop
+ } ifelse
+ } for
+
+ STCi_clip 3 get 12 sub
+ 1 2 STCi_text length 1 sub {
+ STCi_text exch get dup length 0 gt {
+ STCi_l1 12 add 2 index moveto show
+ }{
+ pop
+ } ifelse
+ 12 sub
+ } for
+ pop
+
+%
+% compute the space for the graph-window
+%
+ STCi_l1 12 add STCi_l2 add 12 add dup STCi_clip 2 get exch sub % Extend
+ [ 3 -1 roll dup 3 index add STCi_clip 3 get dup 5 index sub 3 1 roll ]
+ /STCi_win exch def /STCi_l1 exch def
+
+% The "Axis"
+ newpath
+ STCi_win 0 get STCi_win 1 get 14 add moveto
+ STCi_win 2 get STCi_win 1 get 14 add lineto stroke
+
+ STCi_win 0 get 14 add STCi_win 1 get moveto
+ STCi_win 0 get 14 add STCi_win 3 get lineto stroke
+
+% The Labels
+ /Times-Roman findfont 10 scalefont setfont
+ (Postscript-color) dup stringwidth pop
+ STCi_win 2 get STCi_win 0 get sub 14 sub 1 index sub 2 div exch pop
+ STCi_win 0 get add 14 add STCi_win 1 get 4 add moveto show
+
+ gsave
+ STCi_win 0 get 10 add STCi_win 1 get 14 add translate 90 rotate
+ (Device-color) dup stringwidth pop
+ STCi_win 3 get STCi_win 1 get sub 14 sub 1 index sub 2 div exch pop
+ 0 moveto show
+ grestore
+
+% The Graphs
+ gsave
+ STCi_win 0 get 14 add STCi_win 1 get 14 add
+ STCi_win 2 get 2 index sub STCi_win 3 get 2 index sub
+ 4 2 roll translate
+ STCi_col 0 1 2 index length 1 sub {
+ 1 index 1 index get aload pop setrgbcolor
+ STCi_xv 1 index get STCi_yv 3 -1 roll get
+ newpath
+ 1 index 0 get 5 index mul 1 index 0 get 5 index mul moveto
+ 1 index 1 get 5 index mul 1 index 0 get 5 index mul lineto
+ 1 1 2 index length 1 sub {
+ 2 index 1 index get 6 index mul
+ 2 index 2 index get 6 index mul lineto
+ 2 index 1 index 1 add get 6 index mul
+ 2 index 2 index get 6 index mul lineto
+ pop
+ } for
+ stroke pop pop
+ } for
+ pop pop pop
+ grestore
+
+%
+% Find lowest Y from Text or graph
+%
+ STCi_win 1 get STCi_clip 3 get STCi_text length 2 div 12 mul sub
+ dup 2 index gt { pop } { exch pop } ifelse 12 sub
+
+%
+% compute the upper bar-window
+%
+ /STCi_win [
+ STCi_clip 0 get 4 -1 roll 36 sub STCi_clip 2 get 1 index 36 add
+ ] def
+
+%
+% Draw the required number of graphs
+%
+ [{ % Monochrome
+ STCi_win STCi_xv 0 get {setgray} STCibar
+ }{ % RGB
+ STCi_win STCi_xv 0 get {0 0 setrgbcolor} STCibar
+ STCi_win dup 1 exch 1 get 47 sub put
+ STCi_win dup 3 exch 3 get 47 sub put
+ STCi_win STCi_xv 1 get {0 0 3 1 roll setrgbcolor} STCibar
+ STCi_win dup 1 exch 1 get 47 sub put
+ STCi_win dup 3 exch 3 get 47 sub put
+ STCi_win STCi_xv 2 get {0 0 3 2 roll setrgbcolor} STCibar
+ }{ % CMYK
+ STCi_win STCi_xv 0 get {0 0 0 setcmykcolor} STCibar
+ STCi_win dup 1 exch 1 get 47 sub put
+ STCi_win dup 3 exch 3 get 47 sub put
+ STCi_win STCi_xv 1 get {0 0 0 4 1 roll setcmykcolor} STCibar
+ STCi_win dup 1 exch 1 get 47 sub put
+ STCi_win dup 3 exch 3 get 47 sub put
+ STCi_win STCi_xv 2 get {0 0 0 4 2 roll setcmykcolor} STCibar
+ STCi_win dup 1 exch 1 get 47 sub put
+ STCi_win dup 3 exch 3 get 47 sub put
+ STCi_win STCi_xv 3 get {0 0 0 4 3 roll setcmykcolor} STCibar
+ }
+ ] STCimode
+
+ STCi_win 1 STCi_clip 1 get put
+ STCi_win dup 3 exch 3 get 47 sub put
+
+%
+% Plot either one or two Color-Triangles
+%
+ /ColorAdjustMatrix STCiget null ne STCi_onstc and {
+ STCi_win 0 get STCi_win 2 get add 2 div
+ [STCi_win 0 get STCi_win 1 get 3 index STCi_win 3 get ] colortri
+ mark /ColorAdjustMatrix dup STCiget currentdevice putdeviceprops pop
+ [1 index STCi_win 1 get STCi_win 2 get STCi_win 3 get ] colortri
+ pop
+ }{
+ STCi_win colortri
+ } ifelse
+ newpath clippath stroke
+} ifelse
+showpage
diff --git a/lib/stcolor.ps b/lib/stcolor.ps
new file mode 100644
index 00000000..7f0ca3ab
--- /dev/null
+++ b/lib/stcolor.ps
@@ -0,0 +1,169 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% stcolor.ps
+% Epson Stylus-Color Printer-Driver
+
+% The purpose of this file is to configure the stcolor-printer driver
+
+%
+% It is useless and dangerous to interpret the following code with anything
+% else than Ghostscript, so this condition is verified first. If this fails
+% a message is send to the output. If this message bothers you, remove it,
+% but I prefer to know why the device-setup failed.
+
+statusdict begin product end
+dup (Ghostscript) eq 1 index (Artifex Ghostscript) eq or
+exch (AFPL Ghostscript) eq or{
+
+% fetch the current device-parameters this is specific for Ghostscript.
+
+ /STCold currentdevice getdeviceprops .dicttomark def
+
+% Any Ghostscript-Driver has a Name, verify that the selected device is
+% stcolor, otherwise nothing than another message will be produced.
+
+ STCold /Name get (stcolor) eq {
+
+%
+% The main thing this file does, is to establish transfer-functions.
+% Here are two predefined arrays for 360x360Dpi and for 720x720DpI.
+% If resolution is 360x720 or 720x360 the average is used. You may
+% want to define other arrays here.
+%
+
+ /STCdeftransfer [ 0.0 1.0 ] def
+
+ /STCKtransfer360 [
+ 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
+ 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
+ 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
+ 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
+ ] def
+
+ /STCKtransfer720 [
+ 0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
+ 0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
+ 0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
+ 0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
+ ] def
+
+% compute the resolution
+
+ STCold /HWResolution get dup
+ 0 get exch 1 get mul sqrt /STCdpi exch def
+
+% pick the colormodel
+ STCold /ProcessColorModel get /STCcolor exch def
+
+ mark % prepare stack for "putdeviceprops"
+
+% warn for BitsPerPixel=30 with fsrgb
+ STCcolor /DeviceRGB eq STCold /BitsPerPixel get 32 eq and
+ {
+ (%%[ stcolor.ps: inefficient RGB-setup, recommend BitsPerPixel=24 ]%%\n)
+ print
+ } if
+
+% if the Dithering-Method is default (gscmyk), change it to fscmyk
+% this is achieved by pushing a name/value-pair onto the stack
+% if the selected algorithm uses another ProcessColorModel, it is necessary
+% to change the Value of STCcolor according to the new algorithm.
+
+ STCold /Dithering get (gscmyk) eq
+ {
+ /Dithering (hscmyk) % preferred dithering-method
+ } if % might be necessary to change STCcolor too
+
+%
+% select the array according to the resolution
+%
+ STCdpi 359.0 lt
+ { STCdeftransfer }
+ { STCdpi 361.0 lt
+ { STCKtransfer360 }
+ { STCdpi 719.0 gt
+ { STCKtransfer720 }
+ {
+ STCKtransfer360 length STCKtransfer720 length eq
+ {
+ 0 1 STCKtransfer360 length 1 sub
+ {
+ dup dup
+ STCKtransfer360 exch get
+ exch STCKtransfer720 exch get
+ add 2.0 div
+ STCKtransfer360 3 1 roll put
+ } for
+ }if
+ STCKtransfer360
+ } ifelse
+ }ifelse
+ } ifelse
+ /STCtransfer exch def
+
+%
+% Add the arrays. With Version 1.17 and above, it seems to be
+% a good idea, to use the transfer-arrays as coding-arrays too.
+%
+
+%
+% RGB-Model requires inversion of the transfer-arrays
+%
+ STCcolor /DeviceRGB eq
+ {
+ /RGBtransfer STCtransfer length array def
+ 0 1 STCtransfer length 1 sub
+ {
+ dup RGBtransfer length 1 sub exch sub exch
+ STCtransfer exch get 1.0 exch sub
+ RGBtransfer 3 1 roll put
+ } for
+
+ /Rtransfer RGBtransfer
+ /Gtransfer RGBtransfer
+ /Btransfer RGBtransfer
+
+ /Rcoding RGBtransfer
+ /Gcoding RGBtransfer
+ /Bcoding RGBtransfer
+
+ }{
+
+ /Ctransfer STCtransfer
+ /Mtransfer STCtransfer
+ /Ytransfer STCtransfer
+ /Ktransfer STCtransfer
+
+ /Ccoding STCtransfer
+ /Mcoding STCtransfer
+ /Ycoding STCtransfer
+ /Kcoding STCtransfer
+
+ } ifelse
+
+ counttomark 0 ne
+ {currentdevice putdeviceprops pop}{cleartomark}ifelse
+
+% decativate predefined correction
+
+ {} dup dup currenttransfer setcolortransfer
+
+ }{
+ (%%[ stcolor.ps: currentdevice is not stcolor - ignored ]%%\n) print
+ } ifelse
+}{
+ (%%[ stcolor.ps: not interpreted by AFPL Ghostscript - ignored ]%%\n) print
+} ifelse
diff --git a/lib/stocht.ps b/lib/stocht.ps
new file mode 100644
index 00000000..dcfa5f7c
--- /dev/null
+++ b/lib/stocht.ps
@@ -0,0 +1,61 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% helper file to simplify use of Stochastic Halftone - uses ht_ccsto.ps
+
+% This file sets the /StochasticDefault /Halftone as the current
+% and the /Default halftoning, loading the Stochastic halftone
+% if required.
+
+% Stochastic halftoning is recommended for inkjet printers, and may
+% produce output as pleasing as the more computationally expensive
+% "error diffusion" that *some* device drivers provide.
+
+% For printing technologies other than inkjet, Stochastic halftoning
+% may not look better than standard screening. In particular, thermal
+% transfer and direct thermal tend to be better with standard ordered
+% screening methods. Some laser printers may produce "smoother"
+% looking gray shades with Stochastic halftoning. Try it, and if
+% you like it, use it.
+
+% Note that this /Default halftone can be overridden by PostScript
+% operators that set the screening or halftone (such as setscreen).
+
+% To make Stochastic Halftone be "sticky" so that other screening and
+% halftone setting in the subsequent PostScript will be ignored, use:
+% -c "<< /HalftoneMode 1 >> setuserparams"
+% on the command line prior to the file to be processed. For example,
+%
+% gs stocht.ps -c "<< /HalftoneMode 1 >> setuserparams" -f examples/tiger.eps
+
+% Alternatively, the command to set the /HalftoneMode userparam can be
+% concatenated to this file (see below).
+
+% =====================================================================
+% Try to get the previously defined resource
+{ /StochasticDefault /Halftone findresource } stopped
+{
+ pop pop
+ % Need to load the Stochastic Halftone using the lib file
+ (ht_ccsto.ps) runlibfile
+} if
+
+% If we didn't error out by now, then go ahead and define the /Default
+/StochasticDefault /Halftone findresource
+/Default exch /Halftone defineresource
+sethalftone % Use the halftone
+
+% Uncomment the next line to make the Stocahstic halftoning be "sticky"
+% << /HalftoneMode 1 >> setuserparams
diff --git a/lib/traceimg.ps b/lib/traceimg.ps
new file mode 100644
index 00000000..1bb256a1
--- /dev/null
+++ b/lib/traceimg.ps
@@ -0,0 +1,41 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% traceimg.ps
+% Trace the data supplied to the 'image' operator.
+
+% This code currently handles only the (Level 2) dictionary form of image,
+% with a single data source and 8-bit pixels.
+
+/traceimage % <dict> traceimage -
+ { currentcolorspace == (setcolorspace\n) print
+ (<<) print
+ dup { (\t) print exch ==only ( ) print == } forall
+ (>>\n) print flush
+ begin /i_left Width Height mul store /i_dict currentdict store end
+ { i_left 0 le { exit } if
+ i_dict /DataSource get exec
+ dup type /filetype eq
+ { i_buf 0 i_left 32 .min getinterval readstring pop
+ } if
+ dup (%stdout) (w) file exch writehexstring (\n) print flush
+ i_left exch length sub /i_left exch def
+ } loop
+ } bind odef
+
+/image /traceimage load def
+/i_left 0 def
+/i_dict null def
+/i_buf 32 string def
diff --git a/lib/traceop.ps b/lib/traceop.ps
new file mode 100644
index 00000000..7d98d4a0
--- /dev/null
+++ b/lib/traceop.ps
@@ -0,0 +1,82 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Trace individual operators or procedures.
+% <opref> is <opname> or <opname> <dict>
+% (dict defaults to dict where op is currently defined, if writable;
+% otherwise uses userdict)
+% <opref> traceop prints vmem usage before;
+% <opref> <numargs|preproc> prints arguments or runs proc before;
+% <opref> <numargs|preproc> <numresults|postproc>
+% also prints results or runs proc after.
+% If traceflush is true, flush the output after each printout.
+/traceflush true def
+
+currentpacking true setpacking
+currentglobal true setglobal
+
+% Define the default "before" action
+/tracebefore { vmstatus 3 traceprint pop pop pop } def
+
+% Define the default "after" action
+/traceafter { } def
+
+/traceprint {
+ dup type /integertype eq {
+ 1 sub -1 0 { ( ) print index ==only } for
+ } {
+ exec
+ } ifelse
+} bind def
+/traceend {
+ traceflush { flush } if
+} bind def
+/traceop {
+ userdict begin
+ dup type dup /nametype eq exch /dicttype eq or { { tracebefore } } if
+ 1 index type dup /nametype eq exch /dicttype eq or { { traceafter } } if
+ /.tpost exch def /.tpre exch def
+ dup type /dicttype ne {
+ dup where not { userdict 1 index {} put userdict } if
+ } if
+ dup dup wcheck not {
+ (Warning: substituting userdict for non-writable dictionary.) =
+ pop userdict
+ } if
+ /.tddict exch def /.tdict exch def /.tname exch cvlit def
+ currentglobal [
+ .tname /=only cvx ( ) /print cvx
+ /.tpre load /traceprint cvx /traceend cvx
+ .tdict .tname get /.tdef 1 index cvlit def
+ dup xcheck {
+ dup type dup /arraytype eq exch /packedarraytype eq or {
+ /exec cvx
+ } if
+ } if
+ /.tpost load /traceprint cvx () /= cvx /traceend cvx
+ .tdef gcheck /.tpre load gcheck and /.tpost load gcheck and setglobal
+ ] cvx
+ .tdef type /operatortype eq {
+ .tname exch .makeoperator
+ } if
+ exch setglobal
+ .tddict exch .tname exch put
+ end % userdict
+} bind def
+/tracebind /bind load def % in case someone wants to put it back
+/bind { } def % disable
+
+setglobal
+setpacking
diff --git a/lib/uninfo.ps b/lib/uninfo.ps
new file mode 100644
index 00000000..dc93b8e2
--- /dev/null
+++ b/lib/uninfo.ps
@@ -0,0 +1,219 @@
+%!
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% uninfo.ps: Utilities for "printing" PostScript items, especially dictionaries
+% Usage:
+% (prefix-string) dict unprint
+
+% Maximum Print-Width
+/HSpwidth 80 def
+
+% any HScvs string
+/HScvs {
+% Number-Syntax
+ dup type % stack: any /anytype
+ dup /integertype eq 1 index /realtype eq or { pop
+ 16 string cvs
+ }{
+% Logical-Type
+ dup /booleantype eq { pop
+ 5 string cvs
+ }{
+% Identifiers
+ dup /nametype eq { pop
+ dup length 1 add string
+ dup 0 (/) putinterval
+ exch 1 index 1 1 index length 1 sub getinterval cvs pop
+ }{
+% Strings
+ dup /stringtype eq { pop
+% ------- Compute Length
+ 2 1 index { % stack: str len item
+ dup 32 lt 1 index 126 gt or { % need 4
+ pop 4 add
+ }{
+ dup 40 eq 1 index 41 eq or 1 index 92 eq or {
+ pop 2 add
+ }{
+ pop 1 add
+ } ifelse
+ } ifelse
+ } forall
+% ------- Allocate & Fill String
+ string dup 0 (\() putinterval 1
+ 3 -1 roll { % outstr pos item
+ dup 32 lt 1 index 126 gt or {
+ dup 7 le {
+ 2 index 2 index (\\00) putinterval
+ 8 3 index 3 index 3 add 1 getinterval cvrs
+ }{
+ dup 63 le {
+ 2 index 2 index (\\0) putinterval
+ 8 3 index 3 index 2 add 2 getinterval cvrs
+ }{
+ 2 index 2 index (\\) putinterval
+ 8 3 index 3 index 1 add 3 getinterval cvrs
+ } ifelse
+ } ifelse
+ pop 4 add
+ }{
+ dup 40 eq 1 index 41 eq or 1 index 92 eq or {
+ 2 index 2 index (\\) putinterval
+ exch 1 add exch
+ } if
+ 2 index exch 2 index exch put
+ 1 add
+ } ifelse
+ } forall
+ 1 index exch (\)) putinterval
+ }{ exch pop
+ dup length 1 add string
+ dup 0 (-) putinterval
+ exch 1 index 1 1 index length 1 sub getinterval cvs pop
+ dup dup length 4 sub (-) putinterval
+ 0 1 index length 3 sub getinterval
+ } ifelse
+ } ifelse
+ } ifelse
+ } ifelse
+} bind def
+
+% int HSpindent - indent-spaces
+/HSpindent {
+ dup 0 gt {
+ 1 1 3 -1 roll { pop ( ) print } for
+ }{
+ pop
+ } ifelse
+} bind def
+
+% indent array HSaprint -> Print an Array
+/HSaprint {
+ dup type /arraytype eq {
+ ( [) print
+ exch 1 add dup 1 add
+ 3 -1 roll { % rind pos item
+ HScvs dup length % rind pos str len
+ dup 3 index add HSpwidth ge {
+ (\n) print
+ 3 index HSpindent
+ 3 -1 roll pop
+ 2 index add
+ exch
+ }{
+ ( ) print
+ 2 index add 1 add
+ 3 -1 roll pop
+ exch
+ } ifelse
+ print
+ } forall
+ ( ]) print
+ pop pop
+ }{
+ ( ) print
+ HScvs print pop
+ } ifelse
+ (\n) print
+} bind def
+
+% dict HSdnames dict names (creates sorted name-strings)
+/HSdnames {
+% Build namelist, stack: dic
+ dup length 0 eq {
+ []
+ }{
+ [ 1 index {
+ pop dup type /nametype eq {
+ dup length string cvs
+ }{
+ pop
+ } ifelse
+ } forall
+ ]
+% Sort the namelist, stack: dic nam
+ 0 1 2 index length 2 sub { % stack: dic nam I
+ 2 copy get % stack: pre dic nam I nam[I]
+ 1 index 1 add 1 4 index length 1 sub { % stack: dic nam I nam[I] J
+ 3 index 1 index get % dic nam I S[I] J S[J]
+ 2 index 1 index gt { % swap them
+ 4 index 2 index 4 index put
+ 4 index 4 index 2 index put
+ 3 1 roll
+ } if
+ pop pop
+ } for
+ pop pop
+ } for
+ } ifelse
+} bind def
+
+% string:prefix dict:which unprint
+/unprint {
+ HSdnames % pre dic nam
+% compute the maximum length
+ 0 1 index { % pre dic nam maxlen nam[I]
+ length 2 copy lt { exch } if pop
+ } forall
+% Print out all the items, stack: pre dic nam maxlen
+ (\n) print
+ exch { % pre dic maxlen nam[I]
+% no prefix yet, -> flush right
+ 3 index length 0 eq {
+ dup length 2 index exch sub HSpindent
+ }{
+ 3 index print (/) print
+ } ifelse
+% print the name
+ dup print
+% prefix: fill up with blanks
+ 3 index length 0 ne {
+ dup length 2 index exch sub HSpindent
+ } if
+% now print the item itself, stack: pre dic maxlen nam[I]
+ 2 index 1 index cvn get dup type % stack: pre dic maxlen nam[i] item typ
+% Dict-Syntax
+ dup /dicttype eq { pop % stack: pre dic maxlen nam[i] item
+ ( ) print dup HScvs print
+ 4 index length 0 eq { % brand new prefix
+ 2 index string 0 1 5 index 1 sub { 1 index exch 32 put } for
+ dup 4 index 4 index length sub 5 -1 roll putinterval
+ }{
+ 4 index length 1 add 2 index length add string
+ dup 0 7 index putinterval
+ dup 6 index length (/) putinterval
+ dup 6 index length 1 add 5 -1 roll putinterval
+ } ifelse
+ exch unprint
+ }{
+ 3 -1 roll pop % tack: pre dic maxlen item typ
+% Array-Syntax
+ dup /arraytype eq { pop % stack: pre dic maxlen item
+ 3 index length dup 0 ne { 1 add } if 2 index add
+ exch HSaprint
+ }{ pop
+ ( ) print
+ HScvs print
+ (\n) print
+ } ifelse
+ } ifelse
+ } forall
+ pop pop length -1 eq { (\n) print } if
+} bind def
+
+/currentpagedevice where { % check for currentpagedevice
+ /currentpagedevice get exec () exch unprint
+} if
diff --git a/lib/unix-lpr.sh b/lib/unix-lpr.sh
new file mode 100755
index 00000000..4d3a4fbf
--- /dev/null
+++ b/lib/unix-lpr.sh
@@ -0,0 +1,165 @@
+#!/bin/sh
+#
+# Unix lpr filter. The default setup sends output directly to a pipe,
+# which requires the Ghostscript process to fork, and thus may cause
+# small systems to run out of memory/swap space. An alternative strategy,
+# based on a suggestion by Andy Fyfe (andy@cs.caltech.edu), uses a named
+# pipe for output, which avoids the fork and can thus save a lot of memory.
+#
+# Unfortunately this approach can cause problems when a print job is aborted,
+# as the abort can cause one of the processes to die, leaving the process
+# at the other end of the pipe hanging forever.
+#
+# Because of this, the named pipe method has not been made the default,
+# but it may be restored by commenting out the lines referring to
+# 'gsoutput' and uncommenting the lines referring to 'gspipe'.
+#
+
+# This definition is changed on install to match the
+# executable name set in the makefile
+GS_EXECUTABLE=gs
+
+PBMPLUSPATH=/usr/local/bin
+PSFILTERPATH=/usr/local/lib/ghostscript
+LOCALPATH=/usr/local/bin
+X11HOME=/usr/X11R6
+
+PATH=/bin:/usr/bin:/usr/ucb:/usr/etc
+PATH=${PATH}\:${LOCALPATH}\:${PBMPLUSPATH}\:${PSFILTERPATH}
+LD_LIBRARY_PATH=${X11HOME}/lib
+
+export PATH LD_LIBRARY_PATH acctfile host user
+
+user= host= acctfile=/dev/null
+
+#
+# Redirect stdout to stderr (for the logfile) and open a new channel
+# connected to stdout for the raw data. This enables us to keep the
+# raw data separate from programmed postscript output and error messages.
+#
+exec 3>&1 1>&2
+
+#
+# Get username and hostname from filter parameters
+#
+while [ $# != 0 ]
+do case "$1" in
+ -n) user=$2 ; shift ;;
+ -h) host=$2 ; shift ;;
+ -*) ;;
+ *) acctfile=$1 ;;
+ esac
+ shift
+done
+
+#
+# Get the filter, printer device and queue type (direct/indirect)
+#
+filter=`basename $0`
+device=`dirname $0`
+type=`dirname ${device}`
+device=`basename ${device}`
+fdevname=$device
+type=`basename ${type}`
+
+#
+# Find the bpp and number of colors, if specified
+#
+
+colorspec="`echo ${device} | sed 's/.*\.[0-9][0-9]*\.\([0-9][0-9]*\)$/\1/'`"
+if test "$colorspec" = "${device}"
+then
+ colorspec=""
+else
+ device=`basename ${device} .$colorspec`
+ colorspec="-dColors=$colorspec"
+fi
+
+bpp="`echo ${device} | sed 's/.*\.\([0-9][0-9]*\)$/\1/'`"
+if test "$bpp" = "${device}"
+then
+ bpp=1
+else
+ device=`basename ${device} .$bpp`
+fi
+
+#
+# Information for the logfile
+#
+lock=`dirname ${acctfile}`/lock
+cf=`sed -n '$p' ${lock}`
+job=`sed -n 's/^J//p' ${cf}`
+
+echo "gsbanner: ${host}:${user} Job: ${job} Date: `date`"
+echo "gsif: ${host}:${user} ${fdevname} start - `date`"
+
+#
+# Set the direct or indirect output destinations
+#
+#gspipe=/tmp/gspipe.$$
+#mknod ${gspipe} p
+
+case "${type}" in
+ direct)
+ gsoutput="cat 1>&3" ;;
+# cat ${gspipe} 1>&3 & ;;
+ indirect)
+ gsoutput="lpr -P${device}.raw" ;;
+# cat ${gspipe} | lpr -P${device}.raw & ;;
+esac
+
+(
+#
+# Any setup required may be done here (eg. setting gamma for colour printing)
+#
+#echo "{0.333 exp} dup dup currenttransfer setcolortransfer"
+
+#
+# The input data is filtered here, before being passed on to Ghostscript
+#
+case "${filter}" in
+ gsif) cat ;;
+ gsnf) psdit ;;
+ gstf) pscat ;;
+ gsgf) psplot ;;
+ gsvf) rasttopnm | pnmtops ;;
+ gsdf) dvi2ps -sqlw ;;
+ gscf|gsrf) echo "${filter}: filter not available" 1>&2 ; exit 0 ;;
+esac
+
+#
+# This is the postlude which does the accounting
+#
+echo "\
+(acctfile) getenv
+ { currentdevice /PageCount gsgetdeviceprop dup cvi 0 gt
+ { exch (a) file /acctfile exch def
+ /string 20 string def
+ string cvs dup length dup
+ 4 lt
+ { 4 exch sub
+ { acctfile ( ) writestring } repeat
+ } { pop } ifelse
+ acctfile exch writestring
+ acctfile (.00 ) writestring
+ acctfile (host) getenv
+ { string cvs } { (NOHOST) } ifelse writestring
+ acctfile (:) writestring
+ acctfile (user) getenv
+ { string cvs } { (NOUSER) } ifelse writestring
+ acctfile (\n) writestring
+ acctfile closefile
+ } { pop } ifelse
+ } if
+quit"
+) | $GS_EXECUTABLE -q -P- -dSAFER -dNOPAUSE -sDEVICE=${device} \
+ -dBitsPerPixel=${bpp} $colorspec \
+ -sOutputFile=\|"${gsoutput}" -
+# -sOutputFile=${gspipe} -
+
+rm -f ${gspipe}
+#
+# End the logfile entry
+#
+echo "gsif: end - `date`"
+
diff --git a/lib/viewcmyk.ps b/lib/viewcmyk.ps
new file mode 100644
index 00000000..5cc76981
--- /dev/null
+++ b/lib/viewcmyk.ps
@@ -0,0 +1,62 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% viewcmyk.ps
+% Display a raw CMYK file.
+% Requires the colorimage operator.
+% If SCALE is defined, maps input pixels to output pixels with that scale;
+% if SCALE is undefined, scales the image to fit the page.
+% If BITS is defined, it is the number of bits per sample (1,2,4,8,12);
+% if BITS is undefined, its default value is 1.
+
+/viewcmyk { % <filename> <width> viewcmyk -
+ 20 dict begin
+ /w exch def
+ /fname exch def
+ /bpc /BITS where { pop BITS } { 1 } ifelse def
+ /f fname (r) file def
+ mark fname status pop pop pop /flen exch def cleartomark
+ /h flen w bpc 4 mul mul 7 add 8 idiv idiv def
+ (Dimensions: ) print [w h] == flush
+ % Set up scaling.
+ /SCALE where {
+ pop
+ % Map pixels SCALE-for-1. Assume orthogonal transformation.
+ SCALE 1 0 dtransform add abs div
+ SCALE 0 1 dtransform add abs div
+ } {
+ % Scale the image (uniformly) to fit the page.
+ clippath pathbbox pop pop translate
+ pathbbox 3 -1 roll sub h div
+ 3 1 roll exch sub w div .min dup
+ } ifelse scale
+ w h bpc [1 0 0 -1 0 h] f false 4 colorimage
+ showpage
+ f closefile
+ end
+} bind def
+
+% If the program was invoked from the command line, run it now.
+[ .shellarguments {
+ counttomark 2 eq {
+ cvi viewcmyk
+ } {
+ cleartomark
+ (Usage: gs -- viewcmyk.ps filename.cmyk width\n) print
+ ( e.g.: gs -- viewcmyk.ps my.cmyk 2550\n) print flush
+ } ifelse
+} {
+ pop
+} ifelse
diff --git a/lib/viewgif.ps b/lib/viewgif.ps
new file mode 100644
index 00000000..423bfff0
--- /dev/null
+++ b/lib/viewgif.ps
@@ -0,0 +1,178 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% viewgif.ps
+% Display a GIF file.
+
+/read1 % <file> read1 <int>
+ { read pop
+ } bind def
+/read2 % <file> read2 <int>
+ { dup read1 exch read1 8 bitshift add
+ } bind def
+
+/readGIFheader % <file> readGIFheader <dict>
+ { 20 dict begin
+ dup 6 string readstring pop
+ dup (GIF87a) eq exch (GIF89a) eq or not
+ { (Not a GIF file.\n) print cleartomark stop
+ } if
+ dup read2 /Width exch def
+ dup read2 /Height exch def
+ dup read1
+ dup 128 ge /GlobalColor exch def
+ dup -4 bitshift 7 and 1 add /BitsPerPixel exch def %***BOGUS?***
+ dup 8 and 0 ne /PaletteSorted exch def
+ 7 and 1 add dup /BitsPerPixel exch def
+ 1 exch bitshift /PaletteSize exch def
+ dup read1 /BackgroundIndex exch def
+ dup read1 15 add 64 div /AspectRatio exch def
+ GlobalColor
+ { PaletteSize 3 mul string readstring pop
+ /GlobalPalette exch def
+ } if
+ currentdict end
+ } bind def
+
+/readGIFimageHeader % <file> readGIFimageHeader <dict>
+ % Note: GIF header must be on dict stack
+ { 10 dict begin
+ { dup read1
+ dup (!) 0 get ne { exit } if pop % extension
+ dup read1 pop
+ { dup read1 dup 0 eq { pop exit } if { dup read1 pop } repeat
+ } loop
+ } loop
+ (,) 0 get ne
+ { (Not a GIF image.\n) print stop
+ } if
+ dup read2 /Left exch def
+ dup read2 /Top exch def
+ dup read2 /Width exch def
+ dup read2 /Height exch def
+ dup read1
+ dup 128 ge /LocalColor exch def
+ dup 64 and 0 ne /Interlaced exch def
+ LocalColor
+ { 7 and 1 add /BitsPerPixel exch def
+ 1 BitsPerPixel bitshift 3 mul string readstring pop
+ /Palette exch def
+ }
+ { pop pop /Palette GlobalPalette def
+ }
+ ifelse
+ currentdict end
+ } bind def
+
+/imageGIF % <imagedict> imageGIF
+ { /ImageOut where
+ { pop
+ % We know BitsPerComponent = 8, Decode = [0 255].
+ % and there is only a single data source which is
+ % either a filter or a string whose size is exactly
+ % the width of the row.
+ dup /DataSource get dup type /stringtype eq
+ { ImageOut exch writestring
+ }
+ { pop dup /Width get string
+ 1 index /Height get
+ { 1 index /DataSource get 1 index readstring pop
+ ImageOut exch writestring
+ }
+ repeat pop pop
+ }
+ ifelse
+ }
+ { image
+ }
+ ifelse
+ } bind def
+
+/viewGIF % <file|string> viewGIF -
+ { save 20 dict begin
+ /saved exch def
+ dup type /stringtype eq { (r) file } if
+ /F exch def
+ /ImageOutFile where { /ImageOut ImageOutFile (w) file def } if
+ F readGIFheader /Header exch def
+ currentdict Header end begin begin
+ VGIFDEBUG { Header { exch == == } forall (----------------\n) print flush } if
+ F readGIFimageHeader /ImageHeader exch def
+ currentdict ImageHeader end begin begin
+ VGIFDEBUG { ImageHeader { exch == == } forall (----------------\n) print flush } if
+ /D F
+ << /InitialCodeLength F read1
+ /FirstBitLowOrder true
+ /BlockData true
+ /EarlyChange 0
+ >> /LZWDecode filter def
+
+ [/Indexed /DeviceRGB 1 BitsPerPixel bitshift 1 sub Palette] setcolorspace
+ matrix currentmatrix
+ 0 1 3 { 2 copy get dup 0 ne { dup abs div } if 3 copy put pop pop } for
+ setmatrix
+ << /ImageType 1
+ /ImageMatrix [1 0 0 -1 0 Height]
+ /BitsPerComponent 8
+ /Decode [0 255]
+ Interlaced
+ { /Width Width /Height 1
+ /row Width string def
+ /DataSource row
+ >> /I exch def
+ /inter % <num> <denom> inter -
+ { /denom exch def /num exch def
+ gsave
+ /lines Height denom 1 sub add num sub denom idiv def
+ 0 1 lines 1 sub {
+ Height exch denom mul num add sub
+ I /ImageMatrix get 5 3 -1 roll put
+ D row readstring pop pop
+ I imageGIF
+ } for
+ grestore
+ }
+ bind def
+ 0 8 inter
+ 4 8 inter
+ 2 4 inter
+ 1 2 inter
+ }
+ { /Width Width /Height Height
+ /DataSource D
+ >> imageGIF
+ }
+ ifelse
+ saved end end end restore
+ } bind def
+
+% This lets you do stuff on the command line like:
+% gs -sDEVICE=pdfwrite -o stuff%03d.pdf viewgif.ps -c "(image.gif) << /PageSize 2 index viewGIFgetsize 2 array astore >> setpagedevice viewGIF"
+% so the output size is influenced by the original image.
+/viewGIFgetsize % <file|string> ==> [width height]
+{
+ save 20 dict begin
+ /saved exch def
+ dup type /stringtype eq { (r) file } if
+ /F exch def
+ F readGIFheader /Header exch def
+ currentdict Header end begin begin
+ VGIFDEBUG { Header { exch == == } forall (----------------\n) print flush } if
+ F readGIFimageHeader /ImageHeader exch def
+ currentdict ImageHeader end begin begin
+ F 0 setfileposition % reset file pointer
+ Width Height
+ saved end end end restore
+} bind def
diff --git a/lib/viewjpeg.ps b/lib/viewjpeg.ps
new file mode 100644
index 00000000..554048df
--- /dev/null
+++ b/lib/viewjpeg.ps
@@ -0,0 +1,173 @@
+%! viewjpeg.ps Copyright (C) 1994 Thomas Merz <tm@pdflib.com>
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% For more information about licensing, please refer to
+% http://www.ghostscript.com/licensing/. For information on
+% commercial licensing, go to http://www.artifex.com/licensing/ or
+% contact Artifex Software, Inc., 1305 Grant Avenue - Suite 200,
+% Novato, CA 94945, U.S.A., +1(415)492-9861.
+
+% View JPEG files with Ghostscript
+%
+% This PostScript code relies on level 2 features.
+%
+% Only JPEG baseline, extended sequential, and progressive files
+% are supported. Note that Adobe PostScript level 2 does not include
+% progressive-JPEG support. Ghostscript with IJG JPEG v6 or later
+% will decode progressive JPEG, but only if you edit gsjmorec.h to
+% enable that feature.
+%
+% Author's address:
+% ------------------------------+
+% {(pstack exec quit) = flush } | Thomas Merz, Munich
+% pstack exec quit | voice +49/89/29160728
+% ------------------------------+ tm@muc.de http://www.muc.de/~tm/
+%
+% Updated by L. Peter Deutsch 20-May-1997:
+% move the usage example to the beginning
+% Updates by Tom Lane 6-Sep-1995
+
+% Usage example:
+% (jpeg-6/testimg.jpg) viewJPEG
+
+/languagelevel where {pop languagelevel 2 lt}{true} ifelse {
+ (JPEG needs PostScript Level 2!\n) print flush stop
+} if
+
+/JPEGdict 20 dict def
+JPEGdict begin
+
+/NoParamMarkers [ % JPEG markers without additional parameters
+ 16#D0 16#D1 16#D2 16#D3 16#D4 16#D5 16#D6 16#D7 16#D8 16#01
+] def
+
+/NotSupportedMarkers [ % JPEG markers not supported by PostScript level 2
+ 16#C3 16#C5 16#C6 16#C7 16#C8 16#C9 16#CA 16#CB 16#CD 16#CE 16#CF
+] def
+
+% Names of color spaces
+/ColorSpaceNames << /1 /DeviceGray /3 /DeviceRGB /4 /DeviceCMYK >> def
+
+% read one byte from file F
+% - ==> int --or-- stop context
+/NextByte {
+ F read not { (Read error in ViewJPEG!\n) print flush stop } if
+} bind def
+
+/SkipSegment { % read two bytes and skip that much data
+ NextByte 8 bitshift NextByte add 2 sub { NextByte pop } repeat
+} bind def
+
+% read width, height, and # of components from JPEG markers
+% and store in dict
+/readJPEGmarkers { % - ==> dict --or-- stop context
+ 5 dict begin
+
+ { % loop: read JPEG marker segments until we find SOFn marker or EOF
+ NextByte
+ 16#FF eq { % found marker
+ /markertype NextByte def
+ % Is it S0F0=baseline, SOF1=extended sequential, SOF2=progressive ?
+ markertype dup 16#C0 ge exch 16#C2 le and {
+ NextByte pop NextByte pop % segment length
+ % Ghostscript and Adobe PS accept only data precision 8
+ NextByte 8 ne {
+ (Error: not 8 bits per component!\n) print flush stop
+ } if
+
+ % Read crucial image parameters
+ /height NextByte 8 bitshift NextByte add def
+ /width NextByte 8 bitshift NextByte add def
+ /colors NextByte def
+
+ VJPGDEBUG { currentdict { exch == == } forall flush } if
+ exit
+ } if
+
+ % detect several segment types which are not compatible with PS
+ NotSupportedMarkers {
+ markertype eq {
+ (Marker ) print markertype ==
+ (not supported!\n) print flush stop
+ } if
+ } forall
+
+ % Skip segment if marker has parameters associated with it
+ true NoParamMarkers { markertype eq {pop false exit} if } forall
+ { SkipSegment } if
+ } if
+ } loop
+
+ currentdict dup /markertype undef
+ end
+} bind def
+
+end % JPEGdict
+
+% read image parameters from JPEG file and display the image
+/viewJPEG { % <file|string> ==> -
+ save
+ JPEGdict begin
+ /saved exch def
+ /scratch 1 string def
+ dup type /stringtype eq { (r) file } if
+ /F exch def
+
+ readJPEGmarkers begin
+ F 0 setfileposition % reset file pointer
+
+ % We use the whole clipping area for the image (at least in one dimension)
+ gsave clippath pathbbox grestore
+ /ury exch def /urx exch def
+ /lly exch def /llx exch def
+
+ llx lly translate
+ width height scale
+
+ % use whole width or height, whichever is appropriate
+ urx llx sub width div ury lly sub height div
+ 2 copy gt { exch } if pop % min
+ dup scale
+ ColorSpaceNames colors scratch cvs get setcolorspace
+
+ % prepare image dictionary
+ << /ImageType 1
+ /Width width
+ /Height height
+ /ImageMatrix [ width 0 0 height neg 0 height ]
+ /BitsPerComponent 8
+ % If 4-component (CMYK), assume data is inverted per Adobe Photoshop
+ colors 4 eq {
+ /Decode [ colors { 1 0 } repeat ]
+ } {
+ /Decode [ colors { 0 1 } repeat ]
+ } ifelse
+ /DataSource F /DCTDecode filter
+ >> image
+
+ end % image parameter dictionary
+
+ saved end restore
+} bind def
+
+% This lets you do stuff on the command line like:
+% gs -sDEVICE=pdfwrite -o stuff%03d.pdf viewjpeg.ps -c "(image.jpg) << /PageSize 2 index viewJPEGgetsize 2 array astore >> setpagedevice viewJPEG"
+% so the output size matches the original image.
+/viewJPEGgetsize { % <file|string> ==> width height
+ save
+ JPEGdict begin
+ /saved exch def
+ /scratch 1 string def
+ dup type /stringtype eq { (r) file } if
+ /F exch def
+ readJPEGmarkers begin
+ F 0 setfileposition % reset file pointer
+ width height
+ saved end restore
+} bind def
diff --git a/lib/viewmiff.ps b/lib/viewmiff.ps
new file mode 100644
index 00000000..2b60ccd0
--- /dev/null
+++ b/lib/viewmiff.ps
@@ -0,0 +1,137 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% viewmiff.ps
+% Display a MIFF file. You would think the 'display' command would do this,
+% but many versions of 'display' either core-dump or require unacceptably
+% large amounts of memory.
+% FITPAGE is true, it fits the output page size to the image
+
+% Recognize MIFF keywords.
+/miffwords mark
+ /class { cvn /class exch def }
+ /colors { cvi /colors exch def }
+ /columns { cvi /Width exch def }
+ /compression { cvn /compression exch def }
+ /depth { cvi /depth exch def }
+ /packets { cvi /packets exch def }
+ /rows { cvi /Height exch def }
+.dicttomark readonly def
+
+% Recognize MIFF image classes.
+/miffclasses mark
+ /DirectClass {
+ /DeviceRGB setcolorspace
+ /BitsPerComponent depth def
+ /Decode [ 0 1 0 1 0 1 ] def
+ }
+ /PseudoClass {
+ [ /Indexed
+ % The MIFF documentation lies about the size of pixels
+ % for this case: the pixel size is determined only by
+ % the number of colors, and is not affected by the image
+ % depth. Specifically, if there are 256 or fewer colors
+ % but the depth (of color map entries) is 16, each pixel
+ % is still only 1 byte, not 2.
+ currentdict /colors known {
+ /DeviceRGB colors 1 sub
+ /BitsPerComponent colors 256 le { 8 } { 16 } ifelse def
+ colors 3 mul string depth 8 eq {
+ f exch readstring pop
+ } {
+ % 16-bit color map entries: take only the high-order byte.
+ 0 1 2 index length 1 sub {
+ f read pop 2 index 3 1 roll put f read pop pop
+ } for
+ } ifelse
+ } {
+ /colors 256 def
+ /DeviceGray 255
+ 256 string 0 1 255 { 1 index exch dup put } for
+ } ifelse
+ ] setcolorspace
+ /Decode [ 0 1 BitsPerComponent bitshift 1 sub ] def
+ }
+.dicttomark readonly def
+
+% Recognize MIFF compression methods.
+/rlstring 768 string def
+/rlread {
+ % packets is not reliable -- disregard it.
+ dup rlstring 0 3 getinterval readstring {
+ pop read pop 3 mul 3 3 2 index {
+ rlstring exch rlstring 0 3 getinterval putinterval
+ } for
+ rlstring 0 3 -1 roll 3 add getinterval
+ } {
+ pop pop ()
+ } ifelse
+} bind def
+/miffcompress mark
+ /Uncompressed { f }
+ /RunLengthEncoded { { f rlread } }
+ /Zip { [ f /FlateDecode filter cvlit /rlread cvx ] cvx }
+.dicttomark readonly def
+
+% Read a MIFF file and display the image.
+/viewmiff { % <filename> viewmiff -
+ 50 dict begin
+ /fname 1 index def
+ /f exch (r) file def
+ % Set defaults.
+ /ImageType 1 def
+ /class /DirectClass def
+ /compression /Uncompressed def
+ /depth 8 def
+ /packets 16#7fffffff def
+ % Read and parse the header.
+ { f token pop
+ dup (:) eq { pop exit } if
+ dup type /nametype eq {
+ 1024 string cvs (=) search {
+ exch pop miffwords exch .knownget { exec } { pop } ifelse
+ } {
+ pop % who knows?
+ } ifelse
+ } {
+ pop % probably a comment in braces
+ } ifelse
+ } loop
+ % Read and display the image.
+ miffclasses class get exec
+ /DataSource miffcompress compression get exec def
+ /FITPAGE where
+ {
+ /FITPAGE get
+ {
+ % we've already set the image color space, so
+ % push it on the stack, and set it again after
+ % setting the page size
+ currentcolorspace
+ <</PageSize [Width Height] >> setpagedevice
+ setcolorspace
+ } if
+ } if
+
+ /ImageMatrix [Width 0 0 Height neg 0 Height] def
+ currentpagedevice /PageSize get
+ dup 0 get exch 1 get scale
+ gsave 0.8 setgray 0 0 1 1 rectfill grestore % provide background
+ currentdict image
+ showpage
+ % Clean up.
+ f closefile
+ end
+} bind def
diff --git a/lib/viewpbm.ps b/lib/viewpbm.ps
new file mode 100644
index 00000000..ab4ede66
--- /dev/null
+++ b/lib/viewpbm.ps
@@ -0,0 +1,335 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% viewpbm.ps
+% Display a PBM/PGM/PPM file.
+% Requires the Level 2 `image' operator (to handle variable pixel widths).
+% If SCALE is defined, maps input pixels to output pixels with that scale;
+% if SCALE is undefined, scales the image to fit the page.
+% If FITPAGE true, it fits the output page size to the image, honouring SCALE
+% When the input is PAM (P7) RGBTAG from bitrgbtags device, -dTAG will show
+% the tags is pseudo color:
+% TEXT=1, IMAGE=2, PATH=4, UNTOUCHED=8
+% red green blue gray
+
+/s 100 string def
+/readmaxv { % <file> readmaxv -
+ 10 string readline pop cvx exec /maxv exch def
+} bind def
+/readrow { % <file> <row> readrow <row>
+ 0 1 2 index length 1 sub {
+ 1 index exch 3 index token pop put
+ } for exch pop
+} bind def
+/read01 { % <file> <count> read01 <byte>
+ 0 exch {
+ 1 index read pop 48 xor dup 1 le { exch dup add add } { pop } ifelse
+ } repeat
+} bind def
+/readrow01 { % <file> <row> readrow01 <row>
+ 0 1 w 8 idiv {
+ 1 index exch 3 index 8 read01 put
+ } for
+ wrem 0 ne {
+ dup rsize 1 sub wrem read01 8 wrem sub bitshift put
+ } if
+ exch pop
+} bind def
+/readwh { % <file> readwh <w> <h>
+ dup s readline pop % check for comment
+ (#) anchorsearch {
+ pop pop dup s readline pop
+ } if
+ cvx exec
+} bind def
+/pbmtypes mark
+% The procedures in this dictionary are called as
+% <file> Pn <w> <h> <readproc>
+/P1 { % ASCII 1-bit white/black
+ /bpc 1 def /maxv 1 def /rsize w 7 add 8 idiv def
+ /wrem w 8 mod def
+ /ncomp 1 def /invert true def /DeviceGray setcolorspace
+ readwh
+ { readrow01 }
+} bind
+/P2 { % ASCII 8-bit gray
+ readwh
+ /bpc 8 def 2 index readmaxv /rsize 2 index def
+ /ncomp 1 def /invert false def /DeviceGray setcolorspace
+ { readrow }
+} bind
+/P3 { % ASCII 8-bit RGB
+ readwh
+ /bpc 8 def 2 index readmaxv /rsize 2 index 3 mul def
+ /ncomp 3 def /invert false def /DeviceRGB setcolorspace
+ { readrow }
+} bind
+/P4 { % Binary 1-bit white/black
+ readwh
+ /bpc 1 def /maxv 1 def /rsize 2 index 7 add 8 idiv def
+ /ncomp 1 def /invert true def /DeviceGray setcolorspace
+ { readstring pop }
+} bind
+/P5 { % Binary 8-bit gray
+ readwh
+ /bpc 8 def 2 index readmaxv /rsize 2 index def
+ /ncomp 1 def /invert false def /DeviceGray setcolorspace
+ { readstring pop }
+} bind
+/P6 { % Binary 8-bit RGB
+ readwh
+ /bpc 8 def 2 index readmaxv /rsize 2 index 3 mul def
+ /ncomp 3 def /invert false def /DeviceRGB setcolorspace
+ { readstring pop }
+} bind
+/P7 { % Assume Binary 8-bit CMYK -- assumes 'pf' is the input file
+% P7
+% WIDTH 612 %% used to set rsize and w
+% HEIGHT 792 %% used to set h
+% DEPTH 4 %% if present and not 1 or 4, then bail
+% MAXVAL 255 %% used to set maxv
+% TUPLTYPE CMYK | RGB_TAG | RGB_ALPHA | GRAYSCALE %% if present and not one of these, then bail
+% ENDHDR %% skip everything else up to this
+ /P7KEYS <<
+ /WIDTH { /w pf token pop def }
+ /HEIGHT { /h pf token pop def }
+ /DEPTH { /d pf token pop def d 4 eq d 1 eq or not {
+ (*** Only DEPTH 1 or 4 PAM files supported at this time. ***) = quit
+ } if
+ }
+ /MAXVAL { /maxv pf token pop def }
+ /TUPLTYPE { pf token pop dup /CMYK eq 1 index /RGB_TAG eq or 1 index /RGB_ALPHA eq or 1 index /GRAYSCALE eq or not {
+ (*** Only CMYK, RGB_TAG, RGB_ALPHA and GRAYSCALE files supported at this time. ***) = quit
+ } if
+ /T exch def
+ }
+ /ENDHDR { exit }
+ (#) cvn { pf 255 string readline pop pop }
+ >> def
+ { pf token not { exit } if P7KEYS exch .knownget { exec } if } loop
+ /bpc 8 def
+ /rsize w 4 mul def % same bytes per line for CMYK or RGB_TAG
+ /T load /CMYK eq {
+ /ncomp 4 def /invert false def /DeviceCMYK setcolorspace
+ w h { readstring pop }
+ } if
+ /T load /RGB_ALPHA eq {
+ /ncomp 4 def /invert false def /DeviceCMYK setcolorspace
+ w h { readstring pop }
+ } if
+ /T load /GRAYSCALE eq {
+ /ncomp 1 def /invert false def /DeviceGray setcolorspace
+ w h { readstring pop }
+ } if
+ /T load /RGB_TAG eq {
+ % not CMYK, must be RGB_TAG since was checked above
+ /TAG where {
+ pop
+ % show the tags as pseudo-color image
+ /ncomp 1 def /invert false def /maxv 1 def
+ [ /Indexed /DeviceRGB 255
+ % UNTOUCHED=0, TEXT=1, IMAGE=2, PATH=4
+ % gray red green blue
+ 768 string
+ dup 0 <cccccc ff0000 00ff00 ffff00 0000ff ff00ff 00ffff ffffff 000000> putinterval
+ ] setcolorspace
+ w h {
+ readstring pop
+ % discard all but the tag
+ dup length 4 div cvi
+ string % destination string
+ 0 1 2 index length 1 sub {
+ 2 index 1 index 4 mul get
+ 2 index exch 2 index exch
+ put
+ pop % done with pixel#
+ } for
+ exch pop
+ }
+ } {
+ % show the image as RGB (ignore tags)
+ /ncomp 3 def /invert false def /DeviceRGB setcolorspace
+ w h {
+ readstring pop
+ % re-pack the RGB, discard the tag
+ dup length 4 div 3 mul cvi string % destination string
+ 0 1 2 index length 3 idiv 1 sub {
+ % stack: RGBTstring destRGBstring pixel#
+ 2 index 1 index 4 mul 4 getinterval
+ 1 3 getinterval % RGB values
+ % stack RGBTstring destRGBstring pixel# RGBstring
+ 2 index exch 2 index 3 mul exch
+ putinterval
+ pop % done with pixel#
+ } for
+ exch pop
+ }
+ } ifelse
+ } if
+} bind
+
+.dicttomark readonly def
+/pbmsetup { % <file> <w> <h> <readproc> pbmsetup <imagedict>
+ /readproc exch def
+ /h exch def
+ /w exch def
+ /f exch def
+ 20 dict begin % image dictionary
+ /ImageType 1 def
+ /Width w def
+ /Height h def
+ /ImageMatrix [w 0 0 h neg 0 h] def
+ /BitsPerComponent bpc def
+ /Decode [ 0 255 maxv div invert { exch } if ncomp 1 sub { 2 copy } repeat ] def
+ /DataSource [ f rsize string /readproc load /exec load ] cvx def
+ currentdict end
+} def
+/imagescale { % <imagedict> imagescale -
+ begin
+ /SCALE where {
+ pop
+ /FITPAGE where {/FITPAGE get}{false} ifelse
+ {
+ Width SCALE mul Height SCALE mul
+ }
+ {
+ % Map pixels SCALE-for-1. Assume orthogonal transformation.
+ Width 1 0 dtransform add abs div SCALE mul
+ Height 0 1 dtransform add abs div SCALE mul
+ } ifelse
+ } {
+ /FITPAGE where {/FITPAGE get}{false} ifelse
+ {
+ % Scale the image (uniformly) to fit the page.
+ clippath pathbbox pop pop translate % offset to the printable origin
+ pathbbox 3 -1 roll sub exch 3 -1 roll sub exch
+ % stack printable_width printable_height
+ 2 copy gt 3 1 roll .min exch
+ % stack: min(printable_w, printable_h) landscape?
+ {
+ % printable height is less than width (landscape)
+ dup Height Width gt {
+ Width mul Height div exch
+ } {
+ Height mul Width div
+ } ifelse
+ } {
+ % printable width is less than height (portrait)
+ dup Height Width lt {
+ Width mul Height div exch
+ } {
+ Height mul Width div
+ } ifelse
+ } ifelse
+ }
+ {
+ 0 0 translate
+ 612 792
+ }
+ ifelse
+ }
+ ifelse
+ scale
+ end
+} def
+
+% Image a PBM file page by page.
+/viewpbm { % <filename> viewpbm -
+ 20 dict begin
+ (r) file /pf exch def {
+ pf token not { exit } if
+ pbmtypes exch get pf exch exec pbmsetup
+ currentcolorspace % preserve colorspace around setpagedevice
+ /FITPAGE where
+ {
+ /FITPAGE get
+ {
+ /SCALE where
+ {
+ pop
+ << /PageSize [ 1 1 dtransform h SCALE mul exch abs div exch w SCALE mul exch abs div exch ] >>
+ }
+ {
+ << /PageSize [ 1 1 dtransform h exch abs div exch w exch abs div exch ] >>
+ } ifelse
+ setpagedevice
+ } if
+ } if
+ setcolorspace % restore colorspave in case we did setpagedevice
+ dup imagescale image showpage
+ } loop
+ end
+} def
+
+% Reassemble a composite PBM file from the CMYK separations.
+/viewpsm {
+ 20 dict begin
+ /fname exch def
+ /sources [ 0 1 3 {
+ /plane exch def
+ /pf fname (r) file def
+ pf pbmtypes pf token pop get exec
+ % Stack: pf w h readproc
+ plane {
+ /readproc exch def /h exch def /w exch def pop
+ /row rsize string def
+ h { pf row readproc pop } repeat
+ pf pbmtypes pf token pop get exec
+ } repeat
+ pbmsetup
+ } for ] def
+ /datas [ sources { /DataSource get 0 get } forall ] def
+ /decode sources 0 get /Decode get
+ dup 0 get exch 1 get add cvi 0 exch
+ 2 copy 4 copy 8 array astore def
+ sources 0 get
+ dup /MultipleDataSources true put
+ dup /DataSource datas put
+ dup /Decode decode put
+ /DeviceCMYK setcolorspace
+ /FITPAGE where
+ {
+ /FITPAGE get
+ {
+ /SCALE where
+ {
+ <</PageSize [w SCALE mul h SCALE mul]>>
+ }
+ {
+ <</PageSize [w h]>>
+ }ifelse
+ setpagedevice
+ } if
+ } if
+ dup imagescale image showpage
+ end
+} def
+
+% If the program was invoked from the command line, run it now.
+[ .shellarguments
+ { counttomark 1 ge
+ { ] { viewpbm } forall
+ }
+ { cleartomark
+ (Usage: gs [-dSCALE=#.#] [-dFITPAGE] [--] viewpbm.ps filename.p*m ...\n) print
+ ( e.g.: gs [-dSCALE=#.#] [-dFITPAGE] [--] viewpbm.ps my.ppm another.ppm\n) print flush
+ ( also -dTAG option can be used to show the pseudo-color tag image from a\n) print flush
+ ( P7 RGB_TAG PAM file created by the bitrgbtags device.\n) print flush
+ }
+ ifelse
+ }
+ { pop
+ }
+ifelse
diff --git a/lib/viewpcx.ps b/lib/viewpcx.ps
new file mode 100644
index 00000000..81531aff
--- /dev/null
+++ b/lib/viewpcx.ps
@@ -0,0 +1,191 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% viewpcx.ps
+% Display a PCX file.
+% Requires the Level 2 `image' operator (to handle variable pixel widths).
+% If SCALE is defined, maps input pixels to output pixels with that scale;
+% if SCALE is undefined, scales the image to fit the page.
+% If FITPAGE is true it fits the output page size to the image, honouring SCALE
+% ****NOTE: does not handle multi-plane images with palette.
+
+/pcxbytes [
+ 0 1 255 {
+ 64 string exch 0 1 63 {
+ 3 copy exch put pop
+ } for pop
+ } for
+] readonly def
+/readpcx { % - readpcx <str>
+ f % gets replaced
+ dup read not {
+ pop ()
+ } {
+ dup 192 lt {
+ ( ) dup 0 4 -1 roll put exch pop
+ } {
+ 192 sub //pcxbytes 3 -1 roll read pop get exch 0 exch getinterval
+ } ifelse
+ } ifelse
+} def
+/get2 % <string> <index> get2 <int>
+ { 2 copy get 3 1 roll 1 add get 8 bitshift add
+ } bind def
+/dsproc
+ { df s readstring pop % s gets filled in
+ s1 () ne { df s1 readstring pop pop } if % discard padding bytes
+ } def % don't bind, must be writable
+/viewpcx % <filename> viewpcx -
+ { 100 dict begin
+ /fname 1 index def
+ /f exch (r) file def
+ % Read and unpack the header.
+ /header f 128 string readstring pop def
+ /version header 1 get def
+ /bpp header 3 get def
+ /w header 8 get2 header 4 get2 sub 1 add def
+ /h header 10 get2 header 6 get2 sub 1 add def
+ /FITPAGE where
+ {
+ /FITPAGE get
+ {
+ 5 dict begin
+ /SCALE where
+ {
+ pop
+ /Width w SCALE mul def
+ /Height h SCALE mul def
+ }
+ {
+ /Width w def
+ /Height h def
+ } ifelse
+ % we've already set the image color space, so
+ % push it on the stack, and set it again after
+ % setting the page size
+ <</PageSize [Width Height] >> setpagedevice
+ end
+ } if
+ }
+ {
+ /FITPAGE false def
+ } ifelse
+ /nplanes header 65 get def
+ /bpl header 66 get2 def
+ /palinfo header 68 get2 def
+ /nbits bpp nplanes mul def
+ version 5 eq
+ { nbits 8 le
+ { /cspace
+ [/Indexed /DeviceRGB 1 bpp bitshift 1 sub
+ f fileposition
+ 1 nbits bitshift 3 mul string
+ fname status pop pop pop exch pop
+ 1 index length sub f exch setfileposition
+ f exch readstring pop
+ exch f exch setfileposition
+ ] def
+ /decode [0 cspace 2 get] def
+ }
+ { /cspace /DeviceRGB def
+ /decode [0 1 0 1 0 1] def
+ }
+ ifelse
+ }
+ { /cspace
+ [/Indexed /DeviceRGB 1 bpp bitshift 1 sub
+ header 16 1 nbits bitshift 16 .min 3 mul getinterval
+ ] def
+ /decode [0 cspace 2 get] def
+ }
+ ifelse
+ % Set up scaling.
+ /SCALE where
+ {
+ pop
+ FITPAGE
+ {
+ % Map pixels SCALE-for-1. Assume orthogonal transformation.
+ w SCALE mul
+ h SCALE mul
+ }
+ {
+ % Map pixels SCALE-for-1. Assume orthogonal transformation.
+ w 1 0 dtransform add abs div SCALE mul
+ h 0 1 dtransform add abs div SCALE mul
+ } ifelse
+ }
+ {
+ FITPAGE
+ {
+ w h
+ }
+ {
+ % Scale the image (uniformly) to fit the page.
+ clippath pathbbox pop pop translate
+ pathbbox .min exch pop exch pop ceiling
+ dup h w gt { w mul h div exch } { h mul w div } ifelse
+ } ifelse
+ }
+ ifelse scale
+ % Since the number of bytes per line is always even,
+ % it may not match the width specification.
+ /wbpl w bpp mul 7 add 8 idiv def
+ % Define the data source procedure.
+ /s1 bpl wbpl sub string def
+ /df /readpcx load copyarray dup 0 f put cvx bind readonly
+ 0 () /SubFileDecode filter def
+ /dsource [ nplanes
+ { /dsproc load copyarray
+ dup 1 wbpl string put
+ cvx bind readonly
+ }
+ repeat ] def
+ % Construct the image dictionary.
+ 20 dict begin % image dictionary
+ /ImageType 1 def
+ /Width w def
+ /Height h def
+ /ImageMatrix [w 0 0 h neg 0 h] def
+ /BitsPerComponent bpp def
+ /Decode decode def
+ /DataSource dsource dup length 1 gt
+ { /MultipleDataSources true def }
+ { 0 get }
+ ifelse def
+ currentdict end
+ % Finally, display the image.
+ cspace setcolorspace
+ image
+ showpage
+ df closefile
+ f closefile
+ end
+ } bind def
+
+% If the program was invoked from the command line, run it now.
+[ .shellarguments
+ { counttomark 1 ge
+ { ] { viewpcx } forall
+ }
+ { cleartomark
+ (Usage: gs -- viewpcx.ps filename.pcx ...\n) print
+ ( e.g.: gs -- viewpcx.ps my.pcx another.pcx\n) print flush
+ }
+ ifelse
+ }
+ { pop
+ }
+ifelse
diff --git a/lib/viewps2a.ps b/lib/viewps2a.ps
new file mode 100644
index 00000000..91e5894f
--- /dev/null
+++ b/lib/viewps2a.ps
@@ -0,0 +1,31 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% Display a file produced by ps2ascii with no switch or with -dCOMPLEX.
+% This is just a procset to read in before the file to display.
+
+/init { 0.1 0.1 scale } bind def
+init
+/next { currentfile token pop } bind def
+/F { next next pop next exch selectfont } bind def
+/P { showpage init } bind def
+/S
+ { next next moveto
+ next dup stringwidth pop next exch div
+ gsave 1 scale show grestore
+ } bind def
+/C { next next next setrgbcolor } bind def
+/I { next next next next gsave 0.75 setgray rectfill grestore } bind def
+/R { next next next next rectfill } bind def
diff --git a/lib/viewpwg.ps b/lib/viewpwg.ps
new file mode 100644
index 00000000..9abae63a
--- /dev/null
+++ b/lib/viewpwg.ps
@@ -0,0 +1,251 @@
+% Copyright (C) 2017-2018 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% viewpwg.ps
+% Display a PWG file.
+
+% VPWGDEBUG can be predefined to be true to get debugging.
+% /VPWGDEBUG false def
+/VPWGDEBUG where { pop } { /VPWGDEBUG false def } ifelse
+
+/read1 % <file> read1 <int>
+{ read pop
+} bind def
+/read2 % <file> read2 <int>
+{ dup read1 8 bitshift exch read1 add
+} bind def
+/read4 % <file> read4 <int>
+{ dup read2 16 bitshift exch read2 add
+} bind def
+/readString % <file> readString <string>
+{ 0 string
+ dup
+ 0 1 63
+ { % <file> <string> <string> <iteration>
+ 3 index read pop
+ % <file> <string> <string> <iteration> <char>
+ dup 0 eq {pop pop} {put dup} ifelse
+ }
+ for
+ pop
+ exch pop
+} bind def
+/readReserved % <file> readReserved -
+{ read4 0 ne
+ { (Reserved field not zero.\n) print cleartomark stop }
+ if
+} bind def
+/readBoolean % <file> readBoolean <bool>
+{ read4 dup 0 eq
+ { pop false }
+ { 1 eq
+ { 0 }
+ { (Boolean not a boolean.\n) print cleartomark stop }
+ ifelse
+ }
+ ifelse
+} bind def
+
+/readPWGheader % <file> readPWGheader <dict>
+{ 20 dict begin
+ dup 4 string readstring pop
+ <52615332> eq not
+ { (Not a PWG file.\n) print cleartomark stop
+ } if
+ pop
+ currentdict end
+} bind def
+
+/readPWGpageHeader % <file> readPWGpageHeader <dict>
+ % Note: PWG header must be on dict stack
+{ 10 dict begin
+ dup readString /PwgRaster exch def
+ dup readString /MediaColor exch def
+ dup readString /MediaType exch def
+ dup readString /PrintContentOptimize exch def
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup read4 /CutMedia exch def
+ dup readBoolean /Duplex exch def
+ dup read4 /HWResolutionX exch def
+ dup read4 /HWResolutionY exch def
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup readBoolean /InsertSheet exch def
+ dup read4 /Jog exch def
+ dup read4 /LeadingEdge exch def
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup read4 /MediaPosition exch def
+ dup read4 /MediaWeightMetric exch def
+ dup readReserved
+ dup readReserved
+ dup read4 /NumCopies exch def
+ dup read4 /Orientation exch def
+ dup readReserved
+ dup read4 /PageSizeX exch def
+ dup read4 /PageSizeY exch def
+ dup readReserved
+ dup readReserved
+ dup read4 /Tumble exch def
+ dup read4 /Width exch def
+ dup read4 /Height exch def
+ dup readReserved
+ dup read4 /BitsPerColor exch def
+ dup read4 /BitsPerPixel exch def
+ dup read4 /BytesPerLine exch def
+ dup read4 /ColorOrder exch def
+ dup read4 /ColorSpace exch def
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup read4 /NumColors exch def
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup read4 /TotalPageCount exch def
+ dup read4 /CrossFeedTransform exch def
+ dup read4 /FeedTransform exch def
+ dup read4 /ImageBoxLeft exch def
+ dup read4 /ImageBoxTop exch def
+ dup read4 /ImageBoxRight exch def
+ dup read4 /ImageBoxBottom exch def
+ dup read4 /AlternatePrimary exch def
+ dup read4 /PrintQuality exch def
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup readReserved
+ dup read4 /VendorIdentifier exch def
+ dup read4 /VendorLength exch def
+ % Skip 1088 bytes of VendorData
+ 1088 { dup read pop pop } repeat
+ % 64 Reserved bytes
+ dup readReserved dup readReserved dup readReserved dup readReserved
+ dup readReserved dup readReserved dup readReserved dup readReserved
+ dup readReserved dup readReserved dup readReserved dup readReserved
+ dup readReserved dup readReserved dup readReserved dup readReserved
+ dup readString /RenderingIntent exch def
+ dup readString /PageSizeName exch def
+ pop
+ currentdict end
+} bind def
+
+/viewPWG % <file|string> viewPWG -
+{ save 20 dict begin
+ /saved exch def
+ dup type /stringtype eq { (r) file } if
+ /F exch def
+ F readPWGheader /Header exch def
+
+ % We have a dictionary with /saved, /F and /Header on the stack.
+
+ % Debug dump Header fields.
+ VPWGDEBUG { Header { exch == == } forall (----------------\n) print flush } if
+
+ {
+ % If we have no bytes left, stop
+ F bytesavailable 0 le { exit } if
+
+ % Read the page header.
+ F readPWGpageHeader /PageHeader exch def
+
+ % Push PageHeader onto the dict stack.
+ PageHeader begin
+
+ % Debug dump the Page Header.
+ VPWGDEBUG { PageHeader { exch == == } forall (----------------\n) print flush } if
+
+ % Define D to be the decoded data from F.
+ /D F
+ <</Width Width
+ /BPP BitsPerPixel
+ >> /PWGDecode filter def
+
+ % Set the Colorspace appropriately.
+ ColorSpace dup dup 3 eq exch 18 eq or exch 48 eq or
+ { % Black or SGray or Device1
+ /DeviceGray setcolorspace
+ /NumComponents 1 def
+ }
+ { ColorSpace dup dup dup 1 eq exch 19 eq or exch 20 eq or exch 50 eq or
+ { % Rgb or sRGB or AdobeRGB or Device3
+ /DeviceRGB setcolorspace
+ /NumComponents 3 def
+ }
+ { ColorSpace dup 6 eq exch 51 eq or
+ { % DeviceCMYK or Device4
+ /DeviceCMYK setcolorspace
+ /NumComponents 4 def
+ }
+ { (Unsupported colorspace in PWG file.\n) print cleartomark stop
+ }
+ ifelse
+ }
+ ifelse
+ }
+ ifelse
+
+ % Do some matrixy stuff I don't understand.
+ matrix currentmatrix
+ 0 1 3 { 2 copy get dup 0 ne { dup abs div } if 3 copy put pop pop } for
+ setmatrix
+
+ <<
+ /ImageType 1
+ /ImageMatrix [1 0 0 -1 0 Height]
+ /BitsPerComponent BitsPerPixel NumComponents div
+ /Width Width
+ /Height Height
+ /DataSource D
+ >> image
+
+ % Bin the PageHeader dictionary
+ end
+
+ showpage
+ }
+ loop
+ saved end restore
+} bind def
+
+% This lets you do stuff on the command line like:
+% gs -sDEVICE=pdfwrite -o stuff%03d.pdf viewurf.ps -c "(image.urf) << /PageSize 2 index viewURFgetsize 2 array astore >> setpagedevice viewURF"
+% so the output size is influenced by the original image.
+%/viewURFgetsize % <file|string> ==> [width height]
+%{
+% save 20 dict begin
+% /saved exch def
+% dup type /stringtype eq { (r) file } if
+% /F exch def
+% F readURFheader /Header exch def
+% currentdict Header end begin begin
+% VPWGDEBUG { Header { exch == == } forall (----------------\n) print flush } if
+% F readURFimageHeader /ImageHeader exch def
+% currentdict ImageHeader end begin begin
+% F 0 setfileposition % reset file pointer
+% Width Height
+% saved end end end restore
+%} bind def
diff --git a/lib/viewraw.ps b/lib/viewraw.ps
new file mode 100644
index 00000000..ec1e1d7a
--- /dev/null
+++ b/lib/viewraw.ps
@@ -0,0 +1,187 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% viewcmyk.ps
+% Display a raw CMYK file.
+% Requires the colorimage operator.
+% If SCALE is defined, maps input pixels to output pixels with that scale;
+% if SCALE is undefined, scales the image to fit the page.
+% If BITS is defined, it is the number of bits per sample (1,2,4,8);
+% if BITS is undefined, its default value is 1.
+% Colorspace defaults to cmyk, but -dGray or -dRGB can change it
+
+/viewraw { % <filename> <ncomp> <width> viewraw -
+ 20 dict begin
+ % Default ncomp is 4 == CMYK
+ /w exch def
+ /fname exch def
+ /F fname (r) file def % the raw file
+ /f /F load def % the usual DataSource
+ /bpc /BITS where { pop BITS } { 1 } ifelse def
+ /ncomp
+ /Gray where
+ { pop 1 /CS /DeviceGray def } % DeviceGray is 1 component
+ { /RGB where
+ { pop 3 BITS 8 ge % DeviceRGB is 3 component, use Indexed for 1, 2, 4 BITS
+ { /CS /DeviceRGB def }
+ {
+ BITS 4 eq {
+ /P 4096 3 mul string def % the palette
+ 0 1 15 { /r exch def
+ 0 1 15 { /g exch def
+ 0 1 15 { /b exch def
+ r 256 mul g 16 mul add b add 3 mul % base of the triplet
+ P 1 index r 17 mul put
+ P 1 index 1 add g 17 mul put
+ P exch 2 add b 17 mul put
+ } for
+ } for
+ } for
+ /CS
+ [ /Indexed /DeviceRGB 4095 P ] def
+ /BITS 12 def % change to 4 bit indexed
+ % redefine the DataSource to pack the 16-bit values into 12-bit
+ % The 'proc' returns 2 12-bit pixels in 3 bytes
+ % This proc is needed for the output from -sDEVICE=bitrgb -dGrayValues=16
+ /S3 3 string def
+ /f {
+ F read
+ {
+ 256 mul F read
+ pop add 16 mul S3 0 2 index 256 div cvi put
+ 240 and F read
+ { add S3 exch 1 exch put S3 2 F read pop put }
+ { S3 exch 1 exch put S3 2 0 put }
+ ifelse
+ S3
+ }
+ { () }
+ ifelse
+ } bind def
+ } if
+ BITS 2 eq {
+ /CS
+ [ /Indexed /DeviceRGB 255 <
+ 000000 000055 0000AA 0000FF
+ 005500 005555 0055AA 0055FF
+ 00AA00 00AA55 00AAAA 00AAFF
+ 00FF00 00FF55 00FFAA 00FFFF
+ 550000 550055 5500AA 5500FF
+ 555500 555555 5555AA 5555FF
+ 55AA00 55AA55 55AAAA 55AAFF
+ 55FF00 55FF55 55FFAA 55FFFF
+ AA0000 AA0055 AA00AA AA00FF
+ AA5500 AA5555 AA55AA AA55FF
+ AAAA00 AAAA55 AAAAAA AAAAFF
+ AAFF00 AAFF55 AAFFAA AAFFFF
+ FF0000 FF0055 FF00AA FF00FF
+ FF5500 FF5555 FF55AA FF55FF
+ FFAA00 FFAA55 FFAAAA FFAAFF
+ FFFF00 FFFF55 FFFFAA FFFFFF
+
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ >
+ ] def
+ /BITS 8 def % change to 4 bit indexed
+ } if
+ BITS 1 eq {
+ /CS
+ [ /Indexed /DeviceRGB 15 <
+ 000000 0000FF 00FF00 00FFFF FF0000 FF00FF FFFF00 FFFFFF
+ 000000 0000FF 00FF00 00FFFF FF0000 FF00FF FFFF00 FFFFFF
+ >
+ ] def
+ /BITS 4 def % change to 4 bit indexed
+ } if
+ }
+ ifelse
+ }
+ { 4 /CS /DeviceCMYK def } % DeviceCMYK is 4 component
+ ifelse
+ }
+ ifelse
+ def
+
+ % Calculate Height from file length and width
+ mark fname status pop pop pop /flen exch def cleartomark
+ % NB: bitrgb writes 4 bits when BITS=1, 8 bits when BITS=2, 16 bits when BITS=4
+ % presumably to keep values on nice boundaries this takes some fudging
+ /h flen w bpc ncomp dup 3 eq bpc 8 lt and { 1 add } if mul mul 7 add 8 idiv idiv def
+ %% (Dimensions: ) print [w h] == flush
+ % Set up scaling.
+ /SCALE where {
+ pop
+ % Map pixels SCALE-for-1. Assume orthogonal transformation.
+ SCALE 1 0 dtransform add abs div
+ SCALE 0 1 dtransform add abs div
+ } {
+ % Scale the image (uniformly) to fit the page.
+ clippath pathbbox pop pop translate
+ pathbbox 3 -1 roll sub h div
+ 3 1 roll exch sub w div .min dup
+ } ifelse scale
+ %% w h bpc [1 0 0 -1 0 h] f false ncomp colorimage
+ CS setcolorspace
+ << /ImageType 1 /Width w /Height h /ImageMatrix [1 0 0 -1 0 h]
+ /MultipleDataSources false /DataSource /f load /BitsPerComponent BITS
+ /Decode
+ bpc 1 eq { % inverted sense for 1 bit per component
+ [ [0] [ 1 0 ] [0] [ 0 15 ] [ 0 1 0 1 0 1 0 1 ] ] ncomp get
+ } if
+ bpc 2 eq {
+ [ [0] [ 0 1 ] [0] [ 0 255 ] [ 0 1 0 1 0 1 0 1 ] ] ncomp get
+ } if
+ bpc 4 eq {
+ [ [0] [ 0 1 ] [0] [ 0 4095 ] [ 1 0 1 0 1 0 1 0 ] ] ncomp get
+ } if
+ bpc 8 ge {
+ [ [0] [ 0 1 ] [0] [ 0 1 0 1 0 1 ] [ 1 0 1 0 1 0 1 0 ] ] ncomp get
+ } if
+ >> image
+ showpage
+ F closefile
+ end
+} bind def
+
+% If the program was invoked from the command line, run it now.
+[ .shellarguments {
+ counttomark 2 eq {
+ cvi viewraw
+ } {
+ cleartomark
+ (Usage: gs -- viewraw filename.raw width\n) print
+ ( e.g.: gs -- viewraw my.raw 2550\n) print flush
+ } ifelse
+} {
+ pop
+} ifelse
diff --git a/lib/viewrgb.ps b/lib/viewrgb.ps
new file mode 100644
index 00000000..8b77dd2d
--- /dev/null
+++ b/lib/viewrgb.ps
@@ -0,0 +1,149 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+
+% viewrgb.ps
+% Display a raw RGB file created by -sDEVICE=bitrgb.
+% If SCALE is defined, maps input pixels to output pixels with that scale;
+% if SCALE is undefined, scales the image to fit the page.
+% If BITS is defined, it is the number of bits per sample (1,2,8,12).
+% NB: BITS=4 (corresponding to -dGrayValues=16) is not supported.
+% if BITS is undefined, its default value is 1.
+
+/viewrgb { % <filename> <width> viewrgb -
+ 20 dict begin
+ /w exch def
+ /fname exch def
+ /bpc /BITS where { pop BITS } { 1 } ifelse def
+ /f fname (r) file def
+ mark fname status pop pop pop /flen exch def cleartomark
+ /h flen
+ w [ 0 4 8 0 0 0 0 0 24 ] bpc get
+ dup 0 eq {
+ (*** -dBITS=) print bpc =print ( is not supported. ***) = flush
+ quit
+ } if
+ mul 7 add 8 idiv idiv def
+ QUIET not { (Dimensions: ) print [w h] == flush } if
+ % Set up scaling.
+ /SCALE where {
+ pop
+ % Map pixels SCALE-for-1. Assume orthogonal transformation.
+ SCALE 1 0 dtransform add abs div
+ SCALE 0 1 dtransform add abs div
+ } {
+ % Scale the image (uniformly) to fit the page.
+ clippath pathbbox pop pop translate
+ pathbbox 3 -1 roll sub h div
+ 3 1 roll exch sub w div .min dup
+ } ifelse scale
+ bpc 1 eq {
+ [ /Indexed /DeviceRGB 15 <
+ 000000
+ 0000FF
+ 00FF00
+ 00FFFF
+ FF0000
+ FF00FF
+ FFFF00
+ FFFFFF
+ 000000
+ 0000FF
+ 00FF00
+ 00FFFF
+ FF0000
+ FF00FF
+ FFFF00
+ FFFFFF
+ >
+ ] setcolorspace
+ /BPC 4 def % change to 4 bit indexed
+ } {
+ bpc 2 eq {
+ [ /Indexed /DeviceRGB 255 <
+ 000000 000055 0000AA 0000FF
+ 005500 005555 0055AA 0055FF
+ 00AA00 00AA55 00AAAA 00AAFF
+ 00FF00 00FF55 00FFAA 00FFFF
+ 550000 550055 5500AA 5500FF
+ 555500 555555 5555AA 5555FF
+ 55AA00 55AA55 55AAAA 55AAFF
+ 55FF00 55FF55 55FFAA 55FFFF
+ AA0000 AA0055 AA00AA AA00FF
+ AA5500 AA5555 AA55AA AA55FF
+ AAAA00 AAAA55 AAAAAA AAAAFF
+ AAFF00 AAFF55 AAFFAA AAFFFF
+ FF0000 FF0055 FF00AA FF00FF
+ FF5500 FF5555 FF55AA FF55FF
+ FFAA00 FFAA55 FFAAAA FFAAFF
+ FFFF00 FFFF55 FFFFAA FFFFFF
+
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+ >
+ ] setcolorspace
+ /BPC 8 def % change to 4 bit indexed
+ } {
+ /DeviceRGB setcolorspace
+ /BPC bpc def
+ }
+ ifelse
+ }
+ ifelse
+ << /ImageType 1
+ /Width w
+ /Height h
+ /BitsPerComponent BPC
+ /ImageMatrix [1 0 0 -1 0 h]
+ /DataSource f
+ /MultipleDataSources false
+ bpc 4 lt { /Decode [ 0 [ 0 15 255 ] bpc get ] } { /Decode [ 0 1 0 1 0 1 ] } ifelse
+ >> image
+ showpage
+ f closefile
+ end
+} bind def
+
+% If the program was invoked from the command line, run it now.
+[ .shellarguments {
+ counttomark 2 eq {
+ cvi viewrgb
+ } {
+ cleartomark
+ (\nUsage: gs -- viewrgb.ps filename.rgb width\n) print
+ ( e.g.: gs -- viewrgb.ps my.rgb 2550\n) print flush
+ ( -dSCALE=### sets specific scaling \(default = 1.0\)) = flush
+ ( -dBITS=# sets the BitsPerComponent \(1, 2, 8, 12] \(default = 1\)) = flush
+ } ifelse
+} {
+ pop
+} ifelse
diff --git a/lib/winmaps.ps b/lib/winmaps.ps
new file mode 100644
index 00000000..06da63aa
--- /dev/null
+++ b/lib/winmaps.ps
@@ -0,0 +1,105 @@
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% winmaps.ps - make maps between PostScript encodings and Windows
+% character sets.
+
+% Define the two Windows encodings.
+
+/ANSIEncoding
+ ISOLatin1Encoding 256 array copy
+ dup 16#90 /.notdef put
+ 16#93 1 16#9f { 2 copy /.notdef put pop } for
+def
+
+/OEMEncoding [
+ /.notdef /.notdef /.notdef /heart /diamond /club /spade /bullet
+ 8 { /.notdef } repeat
+ /.notdef /.notdef /.notdef /.notdef /paragraph /section /.notdef /.notdef
+ /arrowup /arrowdown /arrowright /arrowleft /.notdef /arrowboth /.notdef /.notdef
+ StandardEncoding 32 96 getinterval aload pop
+ /Ccedilla /udieresis /eacute /acircumflex /adieresis /agrave /aring /ccedilla
+ /ecircumflex /edieresis /egrave /idieresis /igrave /Adieresis /Aring
+ /Eacute /ae /AE /ocircumflex /odieresis /ograve /ucircumflex /ugrave
+ /ydieresis /Odieresis /Udieresis /cent /sterling /yen /.notdef /florin
+ /aacute /iacute /oacute /uacute /ntilde /Ntilde /ordfeminine /ordmasculine
+ /questiondown /.notdef /logicalnot /onehalf /onequarter /exclamdown /guillemotleft /guillemotright
+ 48 { /.notdef } repeat
+ /alpha /beta /Gamma /Pi /Sigma /sigma /mu /tau
+ /Phi /Theta /Omega /delta /infinity /phi /element /intersection
+ /equivalence /plusminus /greaterequal /lessequal /integraltp /integralbt /divide /.notdef
+ /degree /dotmath /periodcentered /radical /.notdef /twosuperior /.notdef /.notdef
+] def
+
+% Utility procedures
+
+/invertencoding % <array> invertencoding <dict>
+ { 256 dict exch dup length 1 sub -1 0
+ { % stack: dict array index
+ 2 copy get /.notdef ne
+ { 2 copy get exch 3 index 3 1 roll put }
+ { pop }
+ ifelse
+ } for
+ pop
+ } def
+
+/pmarray 256 array def
+/printmap % <chars> <decode> printmap -
+ { mark 3 1 roll exch
+ { 2 copy known { 1 index exch get } { pop 0 } ifelse exch
+ }
+ forall pop
+ pmarray 0 counttomark 2 sub getinterval astore
+ ([) print dup length =only 0 exch (] = {\n ) exch
+ { exch print =only
+ 1 add 15 and dup 0 eq { (,\n ) } { (, ) } ifelse
+ }
+ forall pop pop (\n};\n) print pop
+ } def
+
+/decodeStd StandardEncoding invertencoding def
+/decodeISO ISOLatin1Encoding
+ % Remove the redundant characters
+ dup length array copy
+ [8#222 8#225 8#230 8#233 8#240] { 2 copy /.notdef put pop } forall
+invertencoding def
+/decodeSym SymbolEncoding invertencoding def
+
+/decodeANSI ANSIEncoding invertencoding def
+/decodeOEM OEMEncoding invertencoding def
+
+% Construct the map from Symbol to OEM.
+
+(\nprivate const byte far_data gs_map_symbol_to_oem) print
+SymbolEncoding decodeOEM printmap
+
+% Construct the map from ISOLatin1 to OEM.
+
+(\nprivate const byte far_data gs_map_iso_to_oem) print
+ISOLatin1Encoding decodeOEM printmap
+
+% Construct the map from Standard to ISOLatin1.
+
+(\nprivate const byte far_data gs_map_std_to_iso) print
+StandardEncoding decodeISO printmap
+
+% Construct the map from ISOLatin1 to Standard.
+% The Windows driver doesn't need this, but the X11 driver does.
+
+(\nprivate const byte far_data gs_map_iso_to_std) print
+ISOLatin1Encoding decodeStd printmap
+
+quit
diff --git a/lib/wmakebat.bat b/lib/wmakebat.bat
new file mode 100755
index 00000000..c1af6fbb
--- /dev/null
+++ b/lib/wmakebat.bat
@@ -0,0 +1,3 @@
+@rem Execute this script with echo on, so we can see what's happening.
+wmakel -u -n -h %1 %2 %3 %4 %5 %6 %7 %8 %9 >_wm_temp.bat
+_wm_temp.bat
diff --git a/lib/zeroline.ps b/lib/zeroline.ps
new file mode 100644
index 00000000..521b1de0
--- /dev/null
+++ b/lib/zeroline.ps
@@ -0,0 +1,99 @@
+%!
+% Copyright (C) 2001-2019 Artifex Software, Inc.
+% All Rights Reserved.
+%
+% This software is provided AS-IS with no warranty, either express or
+% implied.
+%
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
+%
+% Refer to licensing information at http://www.artifex.com or contact
+% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+% CA 94945, U.S.A., +1(415)492-9861, for further information.
+%
+
+% zeroline.ps
+% Test file to determine how other PostScript implementations handle
+% filling zero-width lines under a variety of conditions.
+
+% Add a small "fan" of zero-width lines at different angles to the path.
+/fan
+ { currentpoint 100 0 rlineto
+ 2 copy moveto 100 20 rlineto
+ 2 copy moveto 100 100 rlineto
+ 2 copy moveto 20 100 rlineto
+ moveto 0 100 rlineto
+ } def
+
+% Append a rectangle to the current path.
+/rectappend
+ { 4 -2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath
+ } def
+% Fill a rectangle.
+/rectfill
+ { gsave newpath rectappend fill grestore
+ } def
+% Stroke a rectangle.
+/rectstroke
+ { gsave newpath rectappend stroke grestore
+ } def
+% Clip to a rectangle. Unlike the real rectclip,
+% this clear the current path.
+/rectclip
+ { newpath rectappend clip newpath
+ } def
+
+40 40 translate
+
+% Display fans of different colors on different backgrounds.
+gsave
+0 setgray
+0 0 120 120 rectstroke
+10 10 moveto fan fill
+140 0 translate
+0 setgray
+0 0 120 120 rectstroke
+0.8 setgray
+10 10 moveto fan fill
+140 0 translate
+0 setgray
+0 0 120 120 rectfill
+1 setgray
+10 10 moveto fan fill
+grestore
+0 140 translate
+
+% Display rectangles with two edges coincident.
+gsave
+newpath
+0 setgray
+0 0 40 40 rectappend
+0 0 20 20 rectappend
+eofill
+60 0 translate
+0 0 40 40 rectappend
+40 0 -20 20 rectappend
+fill
+grestore
+0 60 translate
+
+% Display superimposed lines.
+gsave
+/super
+ { currentpoint fan
+ 2 copy moveto 20 0 rmoveto 50 0 rlineto
+ 2 copy moveto 20 4 rmoveto 50 10 rlineto
+ 2 copy moveto 20 20 rmoveto 50 50 rlineto
+ 2 copy moveto 4 20 rmoveto 10 50 rlineto
+ moveto 0 20 rmoveto 0 50 rlineto
+ } def
+0 setgray
+0 0 moveto super fill
+140 0 translate 0 0 moveto super eofill
+grestore
+0 140 translate
+
+showpage